--- a/arch/arm/mach-gemini/common.h +++ b/arch/arm/mach-gemini/common.h @@ -15,6 +15,7 @@ #include struct mtd_partition; +struct gemini_gmac_platform_data; extern void gemini_map_io(void); extern void gemini_init_irq(void); @@ -28,6 +29,7 @@ extern int platform_register_pflash(unsi struct mtd_partition *parts, unsigned int nr_parts); extern int platform_register_watchdog(void); +extern int platform_register_ethernet(struct gemini_gmac_platform_data *pdata); 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 @@ -17,6 +17,7 @@ #include #include #include +#include static struct plat_serial8250_port serial_platform_data[] = { { @@ -133,3 +134,56 @@ int __init platform_register_watchdog(vo { return platform_device_register(&wdt_device); } + +static struct resource gmac_resources[] = { + { + .start = GEMINI_TOE_BASE, + .end = GEMINI_TOE_BASE + 0xffff, + .flags = IORESOURCE_MEM, + }, + { + .start = IRQ_GMAC0, + .end = IRQ_GMAC0, + .flags = IORESOURCE_IRQ, + }, + { + .start = IRQ_GMAC1, + .end = IRQ_GMAC1, + .flags = IORESOURCE_IRQ, + }, +}; + +static u64 gmac_dmamask = 0xffffffffUL; + +static struct platform_device ethernet_device = { + .name = "gmac-gemini", + .id = 0, + .dev = { + .dma_mask = &gmac_dmamask, + .coherent_dma_mask = 0xffffffff, + }, + .num_resources = ARRAY_SIZE(gmac_resources), + .resource = gmac_resources, +}; + +int platform_register_ethernet(struct gemini_gmac_platform_data *pdata) +{ + unsigned int reg; + + reg = readl((void __iomem*)(IO_ADDRESS(GEMINI_GLOBAL_BASE) + + GLOBAL_MISC_CTRL)); + + reg &= ~(GMAC_GMII | GMAC_1_ENABLE); + + if (pdata->bus_id[1]) + reg |= GMAC_1_ENABLE; + else if (pdata->interface[0] == PHY_INTERFACE_MODE_GMII) + reg |= GMAC_GMII; + + writel(reg, (void __iomem*)(IO_ADDRESS(GEMINI_GLOBAL_BASE) + + GLOBAL_MISC_CTRL)); + + ethernet_device.dev.platform_data = pdata; + + return platform_device_register(ðernet_device); +}