|
@@ -0,0 +1,193 @@
|
|
|
|
+/*
|
|
|
|
+ *
|
|
|
|
+ * 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 <linus.walleij@stericsson.com>
|
|
|
|
+ */
|
|
|
|
+#include <linux/kernel.h>
|
|
|
|
+#include <linux/init.h>
|
|
|
|
+#include <linux/spinlock.h>
|
|
|
|
+#include <linux/interrupt.h>
|
|
|
|
+#include <linux/bitops.h>
|
|
|
|
+#include <linux/device.h>
|
|
|
|
+#include <linux/mm.h>
|
|
|
|
+#include <linux/termios.h>
|
|
|
|
+#include <linux/dmaengine.h>
|
|
|
|
+#include <linux/amba/bus.h>
|
|
|
|
+#include <linux/amba/mmci.h>
|
|
|
|
+#include <linux/amba/serial.h>
|
|
|
|
+#include <linux/platform_device.h>
|
|
|
|
+#include <linux/gpio.h>
|
|
|
|
+#include <linux/clk.h>
|
|
|
|
+#include <linux/err.h>
|
|
|
|
+#include <linux/mtd/nand.h>
|
|
|
|
+#include <linux/mtd/fsmc.h>
|
|
|
|
+#include <linux/pinctrl/machine.h>
|
|
|
|
+#include <linux/pinctrl/pinconf-generic.h>
|
|
|
|
+#include <linux/dma-mapping.h>
|
|
|
|
+#include <linux/platform_data/clk-u300.h>
|
|
|
|
+#include <linux/platform_data/pinctrl-coh901.h>
|
|
|
|
+
|
|
|
|
+#include <asm/types.h>
|
|
|
|
+#include <asm/setup.h>
|
|
|
|
+#include <asm/memory.h>
|
|
|
|
+#include <asm/hardware/vic.h>
|
|
|
|
+#include <asm/mach/map.h>
|
|
|
|
+#include <asm/mach-types.h>
|
|
|
|
+#include <asm/mach/arch.h>
|
|
|
|
+
|
|
|
|
+#include <mach/coh901318.h>
|
|
|
|
+#include <mach/hardware.h>
|
|
|
|
+#include <mach/syscon.h>
|
|
|
|
+#include <mach/irqs.h>
|
|
|
|
+
|
|
|
|
+#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,
|
|
|
|
+ },
|
|
|
|
+ {
|