|
@@ -264,3 +264,182 @@ static struct platform_device smc911x_device = {
|
|
|
.resource = smc911x_resources,
|
|
|
.dev = {
|
|
|
.platform_data = &smsc911x_info,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+/*
|
|
|
+ * The card detect pin of the top SD/MMC slot (CN7) is active low and is
|
|
|
+ * connected to GPIO A22 of SH7372 (GPIO_PORT41).
|
|
|
+ */
|
|
|
+static int slot_cn7_get_cd(struct platform_device *pdev)
|
|
|
+{
|
|
|
+ return !gpio_get_value(GPIO_PORT41);
|
|
|
+}
|
|
|
+/* MERAM */
|
|
|
+static struct sh_mobile_meram_info meram_info = {
|
|
|
+ .addr_mode = SH_MOBILE_MERAM_MODE1,
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource meram_resources[] = {
|
|
|
+ [0] = {
|
|
|
+ .name = "regs",
|
|
|
+ .start = 0xe8000000,
|
|
|
+ .end = 0xe807ffff,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ [1] = {
|
|
|
+ .name = "meram",
|
|
|
+ .start = 0xe8080000,
|
|
|
+ .end = 0xe81fffff,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device meram_device = {
|
|
|
+ .name = "sh_mobile_meram",
|
|
|
+ .id = 0,
|
|
|
+ .num_resources = ARRAY_SIZE(meram_resources),
|
|
|
+ .resource = meram_resources,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &meram_info,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+/* SH_MMCIF */
|
|
|
+static struct resource sh_mmcif_resources[] = {
|
|
|
+ [0] = {
|
|
|
+ .name = "MMCIF",
|
|
|
+ .start = 0xE6BD0000,
|
|
|
+ .end = 0xE6BD00FF,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ [1] = {
|
|
|
+ /* MMC ERR */
|
|
|
+ .start = evt2irq(0x1ac0),
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+ [2] = {
|
|
|
+ /* MMC NOR */
|
|
|
+ .start = evt2irq(0x1ae0),
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct sh_mmcif_plat_data sh_mmcif_plat = {
|
|
|
+ .sup_pclk = 0,
|
|
|
+ .ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34,
|
|
|
+ .caps = MMC_CAP_4_BIT_DATA |
|
|
|
+ MMC_CAP_8_BIT_DATA |
|
|
|
+ MMC_CAP_NEEDS_POLL,
|
|
|
+ .get_cd = slot_cn7_get_cd,
|
|
|
+ .slave_id_tx = SHDMA_SLAVE_MMCIF_TX,
|
|
|
+ .slave_id_rx = SHDMA_SLAVE_MMCIF_RX,
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device sh_mmcif_device = {
|
|
|
+ .name = "sh_mmcif",
|
|
|
+ .id = 0,
|
|
|
+ .dev = {
|
|
|
+ .dma_mask = NULL,
|
|
|
+ .coherent_dma_mask = 0xffffffff,
|
|
|
+ .platform_data = &sh_mmcif_plat,
|
|
|
+ },
|
|
|
+ .num_resources = ARRAY_SIZE(sh_mmcif_resources),
|
|
|
+ .resource = sh_mmcif_resources,
|
|
|
+};
|
|
|
+
|
|
|
+/* SDHI0 */
|
|
|
+static struct sh_mobile_sdhi_info sdhi0_info = {
|
|
|
+ .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX,
|
|
|
+ .dma_slave_rx = SHDMA_SLAVE_SDHI0_RX,
|
|
|
+ .tmio_caps = MMC_CAP_SDIO_IRQ,
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource sdhi0_resources[] = {
|
|
|
+ [0] = {
|
|
|
+ .name = "SDHI0",
|
|
|
+ .start = 0xe6850000,
|
|
|
+ .end = 0xe68500ff,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ [1] = {
|
|
|
+ .start = evt2irq(0x0e00) /* SDHI0_SDHI0I0 */,
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+ [2] = {
|
|
|
+ .start = evt2irq(0x0e20) /* SDHI0_SDHI0I1 */,
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+ [3] = {
|
|
|
+ .start = evt2irq(0x0e40) /* SDHI0_SDHI0I2 */,
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device sdhi0_device = {
|
|
|
+ .name = "sh_mobile_sdhi",
|
|
|
+ .num_resources = ARRAY_SIZE(sdhi0_resources),
|
|
|
+ .resource = sdhi0_resources,
|
|
|
+ .id = 0,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &sdhi0_info,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+/* SDHI1 */
|
|
|
+static struct sh_mobile_sdhi_info sdhi1_info = {
|
|
|
+ .dma_slave_tx = SHDMA_SLAVE_SDHI1_TX,
|
|
|
+ .dma_slave_rx = SHDMA_SLAVE_SDHI1_RX,
|
|
|
+ .tmio_ocr_mask = MMC_VDD_165_195,
|
|
|
+ .tmio_flags = TMIO_MMC_WRPROTECT_DISABLE,
|
|
|
+ .tmio_caps = MMC_CAP_NEEDS_POLL | MMC_CAP_SDIO_IRQ,
|
|
|
+ .get_cd = slot_cn7_get_cd,
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource sdhi1_resources[] = {
|
|
|
+ [0] = {
|
|
|
+ .name = "SDHI1",
|
|
|
+ .start = 0xe6860000,
|
|
|
+ .end = 0xe68600ff,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ [1] = {
|
|
|
+ .start = evt2irq(0x0e80), /* SDHI1_SDHI1I0 */
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+ [2] = {
|
|
|
+ .start = evt2irq(0x0ea0), /* SDHI1_SDHI1I1 */
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+ [3] = {
|
|
|
+ .start = evt2irq(0x0ec0), /* SDHI1_SDHI1I2 */
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device sdhi1_device = {
|
|
|
+ .name = "sh_mobile_sdhi",
|
|
|
+ .num_resources = ARRAY_SIZE(sdhi1_resources),
|
|
|
+ .resource = sdhi1_resources,
|
|
|
+ .id = 1,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &sdhi1_info,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+/* USB1 */
|
|
|
+static void usb1_host_port_power(int port, int power)
|
|
|
+{
|
|
|
+ if (!power) /* only power-on supported for now */
|
|
|
+ return;
|
|
|
+
|
|
|
+ /* set VBOUT/PWEN and EXTLP1 in DVSTCTR */
|
|
|
+ __raw_writew(__raw_readw(IOMEM(0xE68B0008)) | 0x600, IOMEM(0xE68B0008));
|
|
|
+}
|
|
|
+
|
|
|
+static struct r8a66597_platdata usb1_host_data = {
|
|
|
+ .on_chip = 1,
|
|
|
+ .port_power = usb1_host_port_power,
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource usb1_host_resources[] = {
|