193 lines
5.3 KiB
Diff
193 lines
5.3 KiB
Diff
--- 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 2013-02-19 13:38:13.263948000 +0100
|
|
+++ b/arch/arm/mach-gemini/irq.c 2013-02-19 18:24:02.912997292 +0100
|
|
@@ -88,6 +88,9 @@
|
|
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
|
|
@@ -29,6 +29,7 @@
|
|
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(char mode, const char *cmd);
|
|
|
|
--- a/arch/arm/mach-gemini/devices.c
|
|
+++ b/arch/arm/mach-gemini/devices.c
|
|
@@ -249,3 +249,67 @@
|
|
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 @@
|
|
.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
|
|
@@ -433,6 +433,16 @@ config PATA_EFAR
|
|
|
|
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
|
|
@@ -45,6 +45,7 @@
|
|
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 @@
|
|
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 @@
|
|
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")
|