/* * * arch/arm/mach-u300/core.c * * * Copyright (C) 2007-2012 ST-Ericsson SA * License terms: GNU General Public License (GPL) version 2 * Core platform support, IRQ handling and device definitions. * Author: Linus Walleij */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "timer.h" #include "spi.h" #include "i2c.h" #include "u300-gpio.h" #include "dma_channels.h" /* * Static I/O mappings that are needed for booting the U300 platforms. The * only things we need are the areas where we find the timer, syscon and * intcon, since the remaining device drivers will map their own memory * physical to virtual as the need arise. */ static struct map_desc u300_io_desc[] __initdata = { { .virtual = U300_SLOW_PER_VIRT_BASE, .pfn = __phys_to_pfn(U300_SLOW_PER_PHYS_BASE), .length = SZ_64K, .type = MT_DEVICE, }, { .virtual = U300_AHB_PER_VIRT_BASE, .pfn = __phys_to_pfn(U300_AHB_PER_PHYS_BASE), .length = SZ_32K, .type = MT_DEVICE, }, { .virtual = U300_FAST_PER_VIRT_BASE, .pfn = __phys_to_pfn(U300_FAST_PER_PHYS_BASE), .length = SZ_32K, .type = MT_DEVICE, }, }; static void __init u300_map_io(void) { iotable_init(u300_io_desc, ARRAY_SIZE(u300_io_desc)); } /* * Declaration of devices found on the U300 board and * their respective memory locations. */ static struct amba_pl011_data uart0_plat_data = { #ifdef CONFIG_COH901318 .dma_filter = coh901318_filter_id, .dma_rx_param = (void *) U300_DMA_UART0_RX, .dma_tx_param = (void *) U300_DMA_UART0_TX, #endif }; /* Slow device at 0x3000 offset */ static AMBA_APB_DEVICE(uart0, "uart0", 0, U300_UART0_BASE, { IRQ_U300_UART0 }, &uart0_plat_data); /* The U335 have an additional UART1 on the APP CPU */ static struct amba_pl011_data uart1_plat_data = { #ifdef CONFIG_COH901318 .dma_filter = coh901318_filter_id, .dma_rx_param = (void *) U300_DMA_UART1_RX, .dma_tx_param = (void *) U300_DMA_UART1_TX, #endif }; /* Fast device at 0x7000 offset */ static AMBA_APB_DEVICE(uart1, "uart1", 0, U300_UART1_BASE, { IRQ_U300_UART1 }, &uart1_plat_data); /* AHB device at 0x4000 offset */ static AMBA_APB_DEVICE(pl172, "pl172", 0, U300_EMIF_CFG_BASE, { }, NULL); /* Fast device at 0x6000 offset */ static AMBA_APB_DEVICE(pl022, "pl022", 0, U300_SPI_BASE, { IRQ_U300_SPI }, NULL); /* Fast device at 0x1000 offset */ #define U300_MMCSD_IRQS { IRQ_U300_MMCSD_MCIINTR0, IRQ_U300_MMCSD_MCIINTR1 } static struct mmci_platform_data mmcsd_platform_data = { /* * Do not set ocr_mask or voltage translation function, * we have a regulator we can control instead. */ .f_max = 24000000, .gpio_wp = -1, .gpio_cd = U300_GPIO_PIN_MMC_CD, .cd_invert = true, .capabilities = MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED | MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, #ifdef CONFIG_COH901318 .dma_filter = coh901318_filter_id, .dma_rx_param = (void *) U300_DMA_MMCSD_RX_TX, /* Don't specify a TX channel, this RX channel is bidirectional */ #endif }; static AMBA_APB_DEVICE(mmcsd, "mmci", 0, U300_MMCSD_BASE, U300_MMCSD_IRQS, &mmcsd_platform_data); /* * The order of device declaration may be important, since some devices * have dependencies on other devices being initialized first. */ static struct amba_device *amba_devs[] __initdata = { &uart0_device, &uart1_device, &pl022_device, &pl172_device, &mmcsd_device, }; /* Here follows a list of all hw resources that the platform devices * allocate. Note, clock dependencies are not included */ static struct resource gpio_resources[] = { { .start = U300_GPIO_BASE, .end = (U300_GPIO_BASE + SZ_4K - 1), .flags = IORESOURCE_MEM, }, { .name = "gpio0", .start = IRQ_U300_GPIO_PORT0, .end = IRQ_U300_GPIO_PORT0, .flags = IORESOURCE_IRQ, }, { .name = "gpio1", .start = IRQ_U300_GPIO_PORT1, .end = IRQ_U300_GPIO_PORT1, .flags = IORESOURCE_IRQ, }, { .name = "gpio2", .start = IRQ_U300_GPIO_PORT2, .end = IRQ_U300_GPIO_PORT2, .flags = IORESOURCE_IRQ, }, { .name = "gpio3", .start = IRQ_U300_GPIO_PORT3, .end = IRQ_U300_GPIO_PORT3, .flags = IORESOURCE_IRQ, }, {