/* * Freescale STMP37XX/STMP378X platform devices * * Embedded Alley Solutions, Inc * * Copyright 2008 Freescale Semiconductor, Inc. All Rights Reserved. * Copyright 2008 Embedded Alley Solutions, Inc All Rights Reserved. */ /* * The code contained herein is licensed under the GNU General Public * License. You may obtain a copy of the GNU General Public License * Version 2 or later at the following locations: * * http://www.opensource.org/licenses/gpl-license.html * http://www.gnu.org/copyleft/gpl.html */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include static u64 common_dmamask = DMA_BIT_MASK(32); static struct resource appuart_resources[] = { { .start = IRQ_UARTAPP_INTERNAL, .end = IRQ_UARTAPP_INTERNAL, .flags = IORESOURCE_IRQ, }, { .start = IRQ_UARTAPP_RX_DMA, .end = IRQ_UARTAPP_RX_DMA, .flags = IORESOURCE_IRQ, }, { .start = IRQ_UARTAPP_TX_DMA, .end = IRQ_UARTAPP_TX_DMA, .flags = IORESOURCE_IRQ, }, { .start = REGS_UARTAPP1_PHYS, .end = REGS_UARTAPP1_PHYS + REGS_UARTAPP_SIZE, .flags = IORESOURCE_MEM, }, { /* Rx DMA channel */ .start = STMP3XXX_DMA(6, STMP3XXX_BUS_APBX), .end = STMP3XXX_DMA(6, STMP3XXX_BUS_APBX), .flags = IORESOURCE_DMA, }, { /* Tx DMA channel */ .start = STMP3XXX_DMA(7, STMP3XXX_BUS_APBX), .end = STMP3XXX_DMA(7, STMP3XXX_BUS_APBX), .flags = IORESOURCE_DMA, }, }; struct platform_device stmp3xxx_appuart = { .name = "stmp3xxx-appuart", .id = 0, .resource = appuart_resources, .num_resources = ARRAY_SIZE(appuart_resources), .dev = { .dma_mask = &common_dmamask, .coherent_dma_mask = DMA_BIT_MASK(32), }, }; struct platform_device stmp3xxx_watchdog = { .name = "stmp3xxx_wdt", .id = -1, }; static struct resource ts_resource[] = { { .flags = IORESOURCE_IRQ, .start = IRQ_TOUCH_DETECT, .end = IRQ_TOUCH_DETECT, }, { .flags = IORESOURCE_IRQ, .start = IRQ_LRADC_CH5, .end = IRQ_LRADC_CH5, }, }; struct platform_device stmp3xxx_touchscreen = { .name = "stmp3xxx_ts", .id = -1, .resource = ts_resource, .num_resources = ARRAY_SIZE(ts_resource), }; /* * Keypad device */ struct platform_device stmp3xxx_keyboard = { .name = "stmp3xxx-keyboard", .id = -1, }; static struct resource gpmi_resources[] = { { .flags = IORESOURCE_MEM, .start = REGS_GPMI_PHYS, .end = REGS_GPMI_PHYS + REGS_GPMI_SIZE, }, { .flags = IORESOURCE_IRQ, .start = IRQ_GPMI_DMA, .end = IRQ_GPMI_DMA, }, { .flags = IORESOURCE_DMA, .start = STMP3XXX_DMA(4, STMP3XXX_BUS_APBH), .end = STMP3XXX_DMA(8, STMP3XXX_BUS_APBH), }, }; struct platform_device stmp3xxx_gpmi = { .name = "gpmi", .id = -1, .dev = { .dma_mask = &common_dmamask, .coherent_dma_mask = DMA_BIT_MASK(32), }, .resource = gpmi_resources, .num_resources = ARRAY_SIZE(gpmi_resources), }; static struct resource mmc1_resource[] = { { .flags = IORESOURCE_MEM, .start = REGS_SSP1_PHYS, .end = REGS_SSP1_PHYS + REGS_SSP_SIZE, }, { .flags = IORESOURCE_DMA, .start = STMP3XXX_DMA(1, STMP3XXX_BUS_APBH), .end = STMP3XXX_DMA(1, STMP3XXX_BUS_APBH), }, { .flags = IORESOURCE_IRQ, .start = IRQ_SSP1_DMA, .end = IRQ_SSP1_DMA, }, { .flags = IORESOURCE_IRQ, .start = IRQ_SSP_ERROR, .end = IRQ_SSP_ERROR, }, }; struct platform_device stmp3xxx_mmc = { .name = "stmp3xxx-mmc", .id = 1, .dev = { .dma_mask = &common_dmamask, .coherent_dma_mask = DMA_BIT_MASK(32), }, .resource = mmc1_resource, .num_resources = ARRAY_SIZE(mmc1_resource), }; static struct resource usb_resources[] = { { .start = REGS_USBCTRL_PHYS, .end = REGS_USBCTRL_PHYS + SZ_4K, .flags = IORESOURCE_MEM, }, { .start = IRQ_USB_CTRL, .end = IRQ_USB_CTRL, .flags = IORESOURCE_IRQ, }, }; struct platform_device stmp3xxx_udc = { .name = "fsl-usb2-udc", .id = -1, .dev = { .dma_mask = &common_dmamask, .coherent_dma_mask = DMA_BIT_MASK(32), }, .resource = usb_resources, .num_resources = ARRAY_SIZE(usb_resources), }; struct platform_device stmp3xxx_ehci = { .name = "fsl-ehci", .id = -1, .dev = { .dma_mask = &common_dmamask, .coherent_dma_mask = DMA_BIT_MASK(32), }, .resource = usb_resources, .num_resources = ARRAY_SIZE(usb_resources), }; static struct resource rtc_resources[] = { { .start = REGS_RTC_PHYS, .end = REGS_RTC_PHYS + REGS_RTC_SIZE, .flags = IORESOURCE_MEM, }, { .start = IRQ_RTC_ALARM, .end = IRQ_RTC_ALARM, .flags = IORESOURCE_IRQ, }, { .start = IRQ_RTC_1MSEC, .end = IRQ_RTC_1MSEC, .flags = IORESOURCE_IRQ, }, }; struct platform_device stmp3xxx_rtc = { .name = "stmp3xxx-rtc", .id = -1, .resource = rtc_resources, .num_resources = ARRAY_SIZE(rtc_resources), }; static struct resource ssp1_resources[] = { { .start = REGS_SSP1_PHYS, .end = REGS_SSP1_PHYS + REGS_SSP_SIZE, .flags = IORESOURCE_MEM, }, { .start = IRQ_SSP1_DMA, .end = IRQ_SSP1_DMA, .flags = IORESOURCE_IRQ, }, { .start = STMP3XXX_DMA(1, STMP3XXX_BUS_APBH), .end = STMP3XXX_DMA(1, STMP3XXX_BUS_APBH), .flags = IORESOURCE_DMA, }, }; static struct resource ssp2_resources[] = { { .start = REGS_SSP2_PHYS, .end = REGS_SSP2_PHYS + REGS_SSP_SIZE, .flags = IORESOURCE_MEM, }, { .start = IRQ_SSP2_DMA, .end = IRQ_SSP2_DMA, .flags = IORESOURCE_IRQ, }, { .start = STMP3XXX_DMA(2, STMP3XXX_BUS_APBH), .end = STMP3XXX_DMA(2, STMP3XXX_BUS_APBH), .flags = IORESOURCE_DMA, }, }; struct platform_device stmp3xxx_spi1 = { .name = "stmp3xxx_ssp", .id = 1, .dev = { .dma_mask = &common_dmamask, .coherent_dma_mask = DMA_BIT_MASK(32), }, .resource = ssp1_resources, .num_resources = ARRAY_SIZE(ssp1_resources), }; struct platform_device stmp3xxx_spi2 = { .name = "stmp3xxx_ssp", .id = 2, .dev = { .dma_mask = &common_dmamask, .coherent_dma_mask = DMA_BIT_MASK(32), }, .resource = ssp2_resources, .num_resources = ARRAY_SIZE(ssp2_resources), }; static struct resource fb_resource[] = { { .flags = IORESOURCE_IRQ, .start = IRQ_LCDIF_DMA, .end = IRQ_LCDIF_DMA, }, { .flags = IORESOURCE_IRQ, .start = IRQ_LCDIF_ERROR, .end = IRQ_LCDIF_ERROR, }, { .flags = IORESOURCE_MEM, .start = REGS_LCDIF_PHYS, .end = REGS_LCDIF_PHYS + REGS_LCDIF_SIZE, }, }; struct platform_device stmp3xxx_framebuffer = { .name = "stmp3xxx-fb", .id = -1, .dev = { .dma_mask = &common_dmamask, .coherent_dma_mask = DMA_BIT_MASK(32), }, .num_resources = ARRAY_SIZE(fb_resource), .resource = fb_resource, }; #define CMDLINE_DEVICE_CHOOSE(name, dev1, dev2) \ static char *cmdline_device_##name; \ static int cmdline_device_##name##_setup(char *dev) \ { \ cmdline_device_##name = dev + 1; \ return 0; \ } \ __setup(#name, cmdline_device_##name##_setup); \ int stmp3xxx_##name##_device_register(void) \ { \ struct platform_device *d = NULL; \ if (!cmdline_device_##name || \ !strcmp(cmdline_device_##name, #dev1)) \ d = &stmp3xxx_##dev1; \ else if (!strcmp(cmdline_device_##name, #dev2)) \ d = &stmp3xxx_##dev2; \ else \ printk(KERN_ERR"Unknown %s assignment '%s'.\n", \ #name, cmdline_device_##name); \ return d ? platform_device_register(d) : -ENOENT; \ } CMDLINE_DEVICE_CHOOSE(ssp1, mmc, spi1) CMDLINE_DEVICE_CHOOSE(ssp2, gpmi, spi2) struct platform_device stmp3xxx_backlight = { .name = "stmp3xxx-bl", .id = -1, }; struct platform_device stmp3xxx_rotdec = { .name = "stmp3xxx-rotdec", .id = -1, }; struct platform_device stmp3xxx_persistent = { .name = "stmp3xxx-persistent", .id = -1, }; struct platform_device stmp3xxx_dcp_bootstream = { .name = "stmp3xxx-dcpboot", .id = -1, .dev = { .dma_mask = &common_dmamask, .coherent_dma_mask = DMA_BIT_MASK(32), }, }; static struct resource dcp_resources[] = { { .start = IRQ_DCP_VMI, .end = IRQ_DCP_VMI, .flags = IORESOURCE_IRQ, }, { .start = IRQ_DCP, .end = IRQ_DCP, .flags = IORESOURCE_IRQ, }, }; struct platform_device stmp3xxx_dcp = { .name = "stmp3xxx-dcp", .id = -1, .resource = dcp_resources, .num_resources = ARRAY_SIZE(dcp_resources), .dev = { .dma_mask = &common_dmamask, .coherent_dma_mask = DMA_BIT_MASK(32), }, }; static struct resource battery_resource[] = { { .flags = IORESOURCE_IRQ, .start = IRQ_VDD5V, .end = IRQ_VDD5V, }, }; struct platform_device stmp3xxx_battery = { .name = "stmp3xxx-battery", .resource = battery_resource, .num_resources = ARRAY_SIZE(battery_resource), };