|
@@ -1443,3 +1443,177 @@ static struct platform_device i2c1_device = {
|
|
|
static struct platform_device pinctrl_device = {
|
|
|
.name = "pinctrl-u300",
|
|
|
.id = -1,
|
|
|
+ .num_resources = ARRAY_SIZE(pinctrl_resources),
|
|
|
+ .resource = pinctrl_resources,
|
|
|
+};
|
|
|
+
|
|
|
+/*
|
|
|
+ * The different variants have a few different versions of the
|
|
|
+ * GPIO block, with different number of ports.
|
|
|
+ */
|
|
|
+static struct u300_gpio_platform u300_gpio_plat = {
|
|
|
+ .ports = 7,
|
|
|
+ .gpio_base = 0,
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device gpio_device = {
|
|
|
+ .name = "u300-gpio",
|
|
|
+ .id = -1,
|
|
|
+ .num_resources = ARRAY_SIZE(gpio_resources),
|
|
|
+ .resource = gpio_resources,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &u300_gpio_plat,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device keypad_device = {
|
|
|
+ .name = "keypad",
|
|
|
+ .id = -1,
|
|
|
+ .num_resources = ARRAY_SIZE(keypad_resources),
|
|
|
+ .resource = keypad_resources,
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device rtc_device = {
|
|
|
+ .name = "rtc-coh901331",
|
|
|
+ .id = -1,
|
|
|
+ .num_resources = ARRAY_SIZE(rtc_resources),
|
|
|
+ .resource = rtc_resources,
|
|
|
+};
|
|
|
+
|
|
|
+static struct mtd_partition u300_partitions[] = {
|
|
|
+ {
|
|
|
+ .name = "bootrecords",
|
|
|
+ .offset = 0,
|
|
|
+ .size = SZ_128K,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .name = "free",
|
|
|
+ .offset = SZ_128K,
|
|
|
+ .size = 8064 * SZ_1K,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .name = "platform",
|
|
|
+ .offset = 8192 * SZ_1K,
|
|
|
+ .size = 253952 * SZ_1K,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct fsmc_nand_platform_data nand_platform_data = {
|
|
|
+ .partitions = u300_partitions,
|
|
|
+ .nr_partitions = ARRAY_SIZE(u300_partitions),
|
|
|
+ .options = NAND_SKIP_BBTSCAN,
|
|
|
+ .width = FSMC_NAND_BW8,
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device nand_device = {
|
|
|
+ .name = "fsmc-nand",
|
|
|
+ .id = -1,
|
|
|
+ .resource = fsmc_resources,
|
|
|
+ .num_resources = ARRAY_SIZE(fsmc_resources),
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &nand_platform_data,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device dma_device = {
|
|
|
+ .name = "coh901318",
|
|
|
+ .id = -1,
|
|
|
+ .resource = dma_resource,
|
|
|
+ .num_resources = ARRAY_SIZE(dma_resource),
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &coh901318_platform,
|
|
|
+ .coherent_dma_mask = ~0,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static unsigned long pin_pullup_conf[] = {
|
|
|
+ PIN_CONF_PACKED(PIN_CONFIG_BIAS_PULL_UP, 1),
|
|
|
+};
|
|
|
+
|
|
|
+static unsigned long pin_highz_conf[] = {
|
|
|
+ PIN_CONF_PACKED(PIN_CONFIG_BIAS_HIGH_IMPEDANCE, 0),
|
|
|
+};
|
|
|
+
|
|
|
+/* Pin control settings */
|
|
|
+static struct pinctrl_map __initdata u300_pinmux_map[] = {
|
|
|
+ /* anonymous maps for chip power and EMIFs */
|
|
|
+ PIN_MAP_MUX_GROUP_HOG_DEFAULT("pinctrl-u300", NULL, "power"),
|
|
|
+ PIN_MAP_MUX_GROUP_HOG_DEFAULT("pinctrl-u300", NULL, "emif0"),
|
|
|
+ PIN_MAP_MUX_GROUP_HOG_DEFAULT("pinctrl-u300", NULL, "emif1"),
|
|
|
+ /* per-device maps for MMC/SD, SPI and UART */
|
|
|
+ PIN_MAP_MUX_GROUP_DEFAULT("mmci", "pinctrl-u300", NULL, "mmc0"),
|
|
|
+ PIN_MAP_MUX_GROUP_DEFAULT("pl022", "pinctrl-u300", NULL, "spi0"),
|
|
|
+ PIN_MAP_MUX_GROUP_DEFAULT("uart0", "pinctrl-u300", NULL, "uart0"),
|
|
|
+ /* This pin is used for clock return rather than GPIO */
|
|
|
+ PIN_MAP_CONFIGS_PIN_DEFAULT("mmci", "pinctrl-u300", "PIO APP GPIO 11",
|
|
|
+ pin_pullup_conf),
|
|
|
+ /* This pin is used for card detect */
|
|
|
+ PIN_MAP_CONFIGS_PIN_DEFAULT("mmci", "pinctrl-u300", "PIO MS INS",
|
|
|
+ pin_highz_conf),
|
|
|
+};
|
|
|
+
|
|
|
+/*
|
|
|
+ * Notice that AMBA devices are initialized before platform devices.
|
|
|
+ *
|
|
|
+ */
|
|
|
+static struct platform_device *platform_devs[] __initdata = {
|
|
|
+ &dma_device,
|
|
|
+ &i2c0_device,
|
|
|
+ &i2c1_device,
|
|
|
+ &keypad_device,
|
|
|
+ &rtc_device,
|
|
|
+ &pinctrl_device,
|
|
|
+ &gpio_device,
|
|
|
+ &nand_device,
|
|
|
+ &wdog_device,
|
|
|
+};
|
|
|
+
|
|
|
+/*
|
|
|
+ * Interrupts: the U300 platforms have two pl190 ARM PrimeCells connected
|
|
|
+ * together so some interrupts are connected to the first one and some
|
|
|
+ * to the second one.
|
|
|
+ */
|
|
|
+static void __init u300_init_irq(void)
|
|
|
+{
|
|
|
+ u32 mask[2] = {0, 0};
|
|
|
+ struct clk *clk;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ /* initialize clocking early, we want to clock the INTCON */
|
|
|
+ u300_clk_init(U300_SYSCON_VBASE);
|
|
|
+
|
|
|
+ /* Bootstrap EMIF and SEMI clocks */
|
|
|
+ clk = clk_get_sys("pl172", NULL);
|
|
|
+ BUG_ON(IS_ERR(clk));
|
|
|
+ clk_prepare_enable(clk);
|
|
|
+ clk = clk_get_sys("semi", NULL);
|
|
|
+ BUG_ON(IS_ERR(clk));
|
|
|
+ clk_prepare_enable(clk);
|
|
|
+
|
|
|
+ /* Clock the interrupt controller */
|
|
|
+ clk = clk_get_sys("intcon", NULL);
|
|
|
+ BUG_ON(IS_ERR(clk));
|
|
|
+ clk_prepare_enable(clk);
|
|
|
+
|
|
|
+ for (i = 0; i < U300_VIC_IRQS_END; i++)
|
|
|
+ set_bit(i, (unsigned long *) &mask[0]);
|
|
|
+ vic_init((void __iomem *) U300_INTCON0_VBASE, IRQ_U300_INTCON0_START,
|
|
|
+ mask[0], mask[0]);
|
|
|
+ vic_init((void __iomem *) U300_INTCON1_VBASE, IRQ_U300_INTCON1_START,
|
|
|
+ mask[1], mask[1]);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * U300 platforms peripheral handling
|
|
|
+ */
|
|
|
+struct db_chip {
|
|
|
+ u16 chipid;
|
|
|
+ const char *name;
|
|
|
+};
|
|
|
+
|
|
|
+/*
|
|
|
+ * This is a list of the Digital Baseband chips used in the U300 platform.
|
|
|
+ */
|
|
|
+static struct db_chip db_chips[] __initdata = {
|
|
|
+ {
|