|
@@ -135,3 +135,146 @@ static inline void omap1_mmc_mux(struct omap_mmc_platform_data *mmc_controller,
|
|
}
|
|
}
|
|
|
|
|
|
/* These are needed for the level shifter */
|
|
/* These are needed for the level shifter */
|
|
|
|
+ omap_cfg_reg(V9_1610_MMC2_CMDDIR);
|
|
|
|
+ omap_cfg_reg(V5_1610_MMC2_DATDIR0);
|
|
|
|
+ omap_cfg_reg(W19_1610_MMC2_DATDIR1);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* Feedback clock must be set on OMAP-1710 MMC2 */
|
|
|
|
+ if (cpu_is_omap1710())
|
|
|
|
+ omap_writel(omap_readl(MOD_CONF_CTRL_1) | (1 << 24),
|
|
|
|
+ MOD_CONF_CTRL_1);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#define OMAP_MMC_NR_RES 4
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Register MMC devices.
|
|
|
|
+ */
|
|
|
|
+static int __init omap_mmc_add(const char *name, int id, unsigned long base,
|
|
|
|
+ unsigned long size, unsigned int irq,
|
|
|
|
+ unsigned rx_req, unsigned tx_req,
|
|
|
|
+ struct omap_mmc_platform_data *data)
|
|
|
|
+{
|
|
|
|
+ struct platform_device *pdev;
|
|
|
|
+ struct resource res[OMAP_MMC_NR_RES];
|
|
|
|
+ int ret;
|
|
|
|
+
|
|
|
|
+ pdev = platform_device_alloc(name, id);
|
|
|
|
+ if (!pdev)
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+
|
|
|
|
+ memset(res, 0, OMAP_MMC_NR_RES * sizeof(struct resource));
|
|
|
|
+ res[0].start = base;
|
|
|
|
+ res[0].end = base + size - 1;
|
|
|
|
+ res[0].flags = IORESOURCE_MEM;
|
|
|
|
+ res[1].start = res[1].end = irq;
|
|
|
|
+ res[1].flags = IORESOURCE_IRQ;
|
|
|
|
+ res[2].start = rx_req;
|
|
|
|
+ res[2].name = "rx";
|
|
|
|
+ res[2].flags = IORESOURCE_DMA;
|
|
|
|
+ res[3].start = tx_req;
|
|
|
|
+ res[3].name = "tx";
|
|
|
|
+ res[3].flags = IORESOURCE_DMA;
|
|
|
|
+
|
|
|
|
+ if (cpu_is_omap7xx())
|
|
|
|
+ data->slots[0].features = MMC_OMAP7XX;
|
|
|
|
+ if (cpu_is_omap15xx())
|
|
|
|
+ data->slots[0].features = MMC_OMAP15XX;
|
|
|
|
+ if (cpu_is_omap16xx())
|
|
|
|
+ data->slots[0].features = MMC_OMAP16XX;
|
|
|
|
+
|
|
|
|
+ ret = platform_device_add_resources(pdev, res, ARRAY_SIZE(res));
|
|
|
|
+ if (ret == 0)
|
|
|
|
+ ret = platform_device_add_data(pdev, data, sizeof(*data));
|
|
|
|
+ if (ret)
|
|
|
|
+ goto fail;
|
|
|
|
+
|
|
|
|
+ ret = platform_device_add(pdev);
|
|
|
|
+ if (ret)
|
|
|
|
+ goto fail;
|
|
|
|
+
|
|
|
|
+ /* return device handle to board setup code */
|
|
|
|
+ data->dev = &pdev->dev;
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+fail:
|
|
|
|
+ platform_device_put(pdev);
|
|
|
|
+ return ret;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void __init omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,
|
|
|
|
+ int nr_controllers)
|
|
|
|
+{
|
|
|
|
+ int i;
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < nr_controllers; i++) {
|
|
|
|
+ unsigned long base, size;
|
|
|
|
+ unsigned rx_req, tx_req;
|
|
|
|
+ unsigned int irq = 0;
|
|
|
|
+
|
|
|
|
+ if (!mmc_data[i])
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ omap1_mmc_mux(mmc_data[i], i);
|
|
|
|
+
|
|
|
|
+ switch (i) {
|
|
|
|
+ case 0:
|
|
|
|
+ base = OMAP1_MMC1_BASE;
|
|
|
|
+ irq = INT_MMC;
|
|
|
|
+ rx_req = OMAP_DMA_MMC_RX;
|
|
|
|
+ tx_req = OMAP_DMA_MMC_TX;
|
|
|
|
+ break;
|
|
|
|
+ case 1:
|
|
|
|
+ if (!cpu_is_omap16xx())
|
|
|
|
+ return;
|
|
|
|
+ base = OMAP1_MMC2_BASE;
|
|
|
|
+ irq = INT_1610_MMC2;
|
|
|
|
+ rx_req = OMAP_DMA_MMC2_RX;
|
|
|
|
+ tx_req = OMAP_DMA_MMC2_TX;
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ size = OMAP1_MMC_SIZE;
|
|
|
|
+
|
|
|
|
+ omap_mmc_add("mmci-omap", i, base, size, irq,
|
|
|
|
+ rx_req, tx_req, mmc_data[i]);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+/*-------------------------------------------------------------------------*/
|
|
|
|
+
|
|
|
|
+/* OMAP7xx SPI support */
|
|
|
|
+#if defined(CONFIG_SPI_OMAP_100K) || defined(CONFIG_SPI_OMAP_100K_MODULE)
|
|
|
|
+
|
|
|
|
+struct platform_device omap_spi1 = {
|
|
|
|
+ .name = "omap1_spi100k",
|
|
|
|
+ .id = 1,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+struct platform_device omap_spi2 = {
|
|
|
|
+ .name = "omap1_spi100k",
|
|
|
|
+ .id = 2,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static void omap_init_spi100k(void)
|
|
|
|
+{
|
|
|
|
+ omap_spi1.dev.platform_data = ioremap(OMAP7XX_SPI1_BASE, 0x7ff);
|
|
|
|
+ if (omap_spi1.dev.platform_data)
|
|
|
|
+ platform_device_register(&omap_spi1);
|
|
|
|
+
|
|
|
|
+ omap_spi2.dev.platform_data = ioremap(OMAP7XX_SPI2_BASE, 0x7ff);
|
|
|
|
+ if (omap_spi2.dev.platform_data)
|
|
|
|
+ platform_device_register(&omap_spi2);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#else
|
|
|
|
+static inline void omap_init_spi100k(void)
|
|
|
|
+{
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|