123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- --- a/arch/arm/mach-gemini/include/mach/global_reg.h
- +++ b/arch/arm/mach-gemini/include/mach/global_reg.h
- @@ -227,7 +227,13 @@
- #define USB0_PLUG_MINIB (1 << 29)
- #define GMAC_GMII (1 << 28)
- #define GMAC_1_ENABLE (1 << 27)
- -/* TODO: define ATA/SATA bits */
- +/* 011 - ata0 <-> sata0, sata1; bring out ata1
- + * 010 - ata1 <-> sata1, sata0; bring out ata0
- + * 001 - ata0 <-> sata0, ata1 <-> sata1; bring out ata1
- + * 000 - ata0 <-> sata0, ata1 <-> sata1; bring out ata0 */
- +#define IDE_IOMUX_MASK (7 << 24)
- +#define IDE_IOMUX_SATA1_SATA0 (2 << 24)
- +#define IDE_IOMUX_SATA0_SATA1 (3 << 24)
- #define USB1_VBUS_ON (1 << 23)
- #define USB0_VBUS_ON (1 << 22)
- #define APB_CLKOUT_ENABLE (1 << 21)
- --- a/arch/arm/mach-gemini/irq.c
- +++ b/arch/arm/mach-gemini/irq.c
- @@ -89,6 +89,9 @@ void __init gemini_init_irq(void)
- irq_set_handler(i, handle_edge_irq);
- mode |= 1 << i;
- level |= 1 << i;
- + } else if (i >= IRQ_IDE0 && i <= IRQ_IDE1) {
- + irq_set_handler(i, handle_edge_irq);
- + mode |= 1 << i;
- } else {
- irq_set_handler(i, handle_level_irq);
- }
- --- a/arch/arm/mach-gemini/common.h
- +++ b/arch/arm/mach-gemini/common.h
- @@ -31,6 +31,7 @@ extern int platform_register_pflash(unsi
- extern int platform_register_watchdog(void);
- extern int platform_register_ethernet(struct gemini_gmac_platform_data *pdata);
- extern int platform_register_usb(unsigned int id);
- +extern int platform_register_pata(unsigned int id);
-
- extern void gemini_restart(enum reboot_mode mode, const char *cmd);
-
- --- a/arch/arm/mach-gemini/devices.c
- +++ b/arch/arm/mach-gemini/devices.c
- @@ -248,3 +248,67 @@ int __init platform_register_usb(unsigne
- return platform_device_register(&usb_device[id]);
- }
-
- +static u64 pata_gemini_dmamask0 = 0xffffffffUL;
- +static u64 pata_gemini_dmamask1 = 0xffffffffUL;
- +
- +static struct resource pata_gemini_resources0[] =
- +{
- + [0] = {
- + .start = GEMINI_IDE0_BASE,
- + .end = GEMINI_IDE0_BASE + 0x40,
- + .flags = IORESOURCE_MEM,
- + },
- + [1] = {
- + .start = IRQ_IDE0,
- + .end = IRQ_IDE0,
- + .flags = IORESOURCE_IRQ,
- + },
- +};
- +
- +static struct resource pata_gemini_resources1[] =
- +{
- + [0] = {
- + .start = GEMINI_IDE1_BASE,
- + .end = GEMINI_IDE1_BASE + 0x40,
- + .flags = IORESOURCE_MEM,
- + },
- + [1] = {
- + .start = IRQ_IDE1,
- + .end = IRQ_IDE1,
- + .flags = IORESOURCE_IRQ,
- + },
- +};
- +
- +static struct platform_device pata_gemini_devices[] =
- +{
- + {
- + .name = "pata-gemini",
- + .id = 0,
- + .dev =
- + {
- + .dma_mask = &pata_gemini_dmamask0,
- + .coherent_dma_mask = 0xffffffff,
- + },
- + .num_resources = ARRAY_SIZE(pata_gemini_resources0),
- + .resource = pata_gemini_resources0,
- + },
- + {
- + .name = "pata-gemini",
- + .id = 1,
- + .dev =
- + {
- + .dma_mask = &pata_gemini_dmamask1,
- + .coherent_dma_mask = 0xffffffff,
- + },
- + .num_resources = ARRAY_SIZE(pata_gemini_resources1),
- + .resource = pata_gemini_resources1,
- + },
- +};
- +
- +int __init platform_register_pata(unsigned int id)
- +{
- + if (id > 1)
- + return -EINVAL;
- +
- + return platform_device_register(&pata_gemini_devices[id]);
- +}
- --- a/arch/arm/mach-gemini/mm.c
- +++ b/arch/arm/mach-gemini/mm.c
- @@ -24,6 +24,11 @@ static struct map_desc gemini_io_desc[]
- .length = SZ_512K,
- .type = MT_DEVICE,
- }, {
- + .virtual = (unsigned long)IO_ADDRESS(GEMINI_SATA_BASE),
- + .pfn = __phys_to_pfn(GEMINI_SATA_BASE),
- + .length = SZ_512K,
- + .type = MT_DEVICE,
- + }, {
- .virtual = (unsigned long)IO_ADDRESS(GEMINI_UART_BASE),
- .pfn = __phys_to_pfn(GEMINI_UART_BASE),
- .length = SZ_512K,
- --- a/drivers/ata/Kconfig
- +++ b/drivers/ata/Kconfig
- @@ -567,6 +567,16 @@ config PATA_EP93XX
-
- If unsure, say N.
-
- +config PATA_GEMINI
- + tristate "Gemini PATA support (Experimental)"
- + depends on ARCH_GEMINI
- + help
- + This option enables support for the Gemini PATA-Controller.
- + Note that the Gemini SoC has no native SATA-Controller but an
- + onboard PATA-SATA bridge.
- +
- + If unsure, say N.
- +
- config PATA_HPT366
- tristate "HPT 366/368 PATA support"
- depends on PCI
- --- a/drivers/ata/Makefile
- +++ b/drivers/ata/Makefile
- @@ -56,6 +56,7 @@ obj-$(CONFIG_PATA_CS5536) += pata_cs5536
- obj-$(CONFIG_PATA_CYPRESS) += pata_cypress.o
- obj-$(CONFIG_PATA_EFAR) += pata_efar.o
- obj-$(CONFIG_PATA_EP93XX) += pata_ep93xx.o
- +obj-$(CONFIG_PATA_GEMINI) += pata_gemini.o
- obj-$(CONFIG_PATA_HPT366) += pata_hpt366.o
- obj-$(CONFIG_PATA_HPT37X) += pata_hpt37x.o
- obj-$(CONFIG_PATA_HPT3X2N) += pata_hpt3x2n.o
- --- a/arch/arm/mach-gemini/board-nas4220b.c
- +++ b/arch/arm/mach-gemini/board-nas4220b.c
- @@ -146,11 +146,28 @@ static void __init usb_ib4220b_init(void
- GLOBAL_MISC_CTRL));
- }
-
- +static void __init sata_ib4220b_init(void)
- +{
- + unsigned val;
- +
- + val = readl((void __iomem*)(IO_ADDRESS(GEMINI_GLOBAL_BASE) +
- + GLOBAL_MISC_CTRL));
- + val &= ~(IDE_IOMUX_MASK | PFLASH_PADS_DISABLE);
- + val |= IDE_PADS_ENABLE;
- + writel(val, (void __iomem*)(IO_ADDRESS(GEMINI_GLOBAL_BASE) +
- + GLOBAL_MISC_CTRL));
- +
- + /* enabling ports for presence detection, master only */
- + writel(0x00000001, (void __iomem*)(IO_ADDRESS(GEMINI_SATA_BASE) + 0x18));
- + writel(0x00000001, (void __iomem*)(IO_ADDRESS(GEMINI_SATA_BASE) + 0x1c));
- +}
- +
- static void __init ib4220b_init(void)
- {
- gemini_gpio_init();
- ib4220b_gmac_init();
- usb_ib4220b_init();
- + sata_ib4220b_init();
- platform_register_uart();
- platform_register_pflash(SZ_16M, NULL, 0);
- platform_device_register(&ib4220b_led_device);
- @@ -161,6 +178,8 @@ static void __init ib4220b_init(void)
- platform_register_ethernet(&ib4220b_gmac_data);
- platform_register_usb(0);
- platform_register_usb(1);
- + platform_register_pata(0);
- + platform_register_pata(1);
- }
-
- MACHINE_START(NAS4220B, "Raidsonic NAS IB-4220-B")
|