|
@@ -124,6 +124,194 @@ struct platform_device msm_device_hsusb_host = {
|
|
|
},
|
|
|
};
|
|
|
|
|
|
+static struct resource resources_sdc1[] = {
|
|
|
+ {
|
|
|
+ .start = MSM_SDC1_PHYS,
|
|
|
+ .end = MSM_SDC1_PHYS + MSM_SDC1_SIZE - 1,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .start = INT_SDC1_0,
|
|
|
+ .end = INT_SDC1_0,
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ .name = "cmd_irq",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .start = INT_SDC1_1,
|
|
|
+ .end = INT_SDC1_1,
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ .name = "pio_irq",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .flags = IORESOURCE_IRQ | IORESOURCE_DISABLED,
|
|
|
+ .name = "status_irq"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .start = 8,
|
|
|
+ .end = 8,
|
|
|
+ .flags = IORESOURCE_DMA,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource resources_sdc2[] = {
|
|
|
+ {
|
|
|
+ .start = MSM_SDC2_PHYS,
|
|
|
+ .end = MSM_SDC2_PHYS + MSM_SDC2_SIZE - 1,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .start = INT_SDC2_0,
|
|
|
+ .end = INT_SDC2_0,
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ .name = "cmd_irq",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .start = INT_SDC2_1,
|
|
|
+ .end = INT_SDC2_1,
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ .name = "pio_irq",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .flags = IORESOURCE_IRQ | IORESOURCE_DISABLED,
|
|
|
+ .name = "status_irq"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .start = 8,
|
|
|
+ .end = 8,
|
|
|
+ .flags = IORESOURCE_DMA,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource resources_sdc3[] = {
|
|
|
+ {
|
|
|
+ .start = MSM_SDC3_PHYS,
|
|
|
+ .end = MSM_SDC3_PHYS + MSM_SDC3_SIZE - 1,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .start = INT_SDC3_0,
|
|
|
+ .end = INT_SDC3_0,
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ .name = "cmd_irq",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .start = INT_SDC3_1,
|
|
|
+ .end = INT_SDC3_1,
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ .name = "pio_irq",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .flags = IORESOURCE_IRQ | IORESOURCE_DISABLED,
|
|
|
+ .name = "status_irq"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .start = 8,
|
|
|
+ .end = 8,
|
|
|
+ .flags = IORESOURCE_DMA,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource resources_sdc4[] = {
|
|
|
+ {
|
|
|
+ .start = MSM_SDC4_PHYS,
|
|
|
+ .end = MSM_SDC4_PHYS + MSM_SDC4_SIZE - 1,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .start = INT_SDC4_0,
|
|
|
+ .end = INT_SDC4_0,
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ .name = "cmd_irq",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .start = INT_SDC4_1,
|
|
|
+ .end = INT_SDC4_1,
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ .name = "pio_irq",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .flags = IORESOURCE_IRQ | IORESOURCE_DISABLED,
|
|
|
+ .name = "status_irq"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .start = 8,
|
|
|
+ .end = 8,
|
|
|
+ .flags = IORESOURCE_DMA,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+struct platform_device msm_device_sdc1 = {
|
|
|
+ .name = "msm_sdcc",
|
|
|
+ .id = 1,
|
|
|
+ .num_resources = ARRAY_SIZE(resources_sdc1),
|
|
|
+ .resource = resources_sdc1,
|
|
|
+ .dev = {
|
|
|
+ .coherent_dma_mask = 0xffffffff,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+struct platform_device msm_device_sdc2 = {
|
|
|
+ .name = "msm_sdcc",
|
|
|
+ .id = 2,
|
|
|
+ .num_resources = ARRAY_SIZE(resources_sdc2),
|
|
|
+ .resource = resources_sdc2,
|
|
|
+ .dev = {
|
|
|
+ .coherent_dma_mask = 0xffffffff,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+struct platform_device msm_device_sdc3 = {
|
|
|
+ .name = "msm_sdcc",
|
|
|
+ .id = 3,
|
|
|
+ .num_resources = ARRAY_SIZE(resources_sdc3),
|
|
|
+ .resource = resources_sdc3,
|
|
|
+ .dev = {
|
|
|
+ .coherent_dma_mask = 0xffffffff,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+struct platform_device msm_device_sdc4 = {
|
|
|
+ .name = "msm_sdcc",
|
|
|
+ .id = 4,
|
|
|
+ .num_resources = ARRAY_SIZE(resources_sdc4),
|
|
|
+ .resource = resources_sdc4,
|
|
|
+ .dev = {
|
|
|
+ .coherent_dma_mask = 0xffffffff,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device *msm_sdcc_devices[] __initdata = {
|
|
|
+ &msm_device_sdc1,
|
|
|
+ &msm_device_sdc2,
|
|
|
+ &msm_device_sdc3,
|
|
|
+ &msm_device_sdc4,
|
|
|
+};
|
|
|
+
|
|
|
+int __init msm_add_sdcc(unsigned int controller,
|
|
|
+ struct msm_mmc_platform_data *plat,
|
|
|
+ unsigned int stat_irq, unsigned long stat_irq_flags)
|
|
|
+{
|
|
|
+ struct platform_device *pdev;
|
|
|
+ struct resource *res;
|
|
|
+
|
|
|
+ if (controller < 1 || controller > 4)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ pdev = msm_sdcc_devices[controller-1];
|
|
|
+ pdev->dev.platform_data = plat;
|
|
|
+
|
|
|
+ res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "status_irq");
|
|
|
+ if (!res)
|
|
|
+ return -EINVAL;
|
|
|
+ else if (stat_irq) {
|
|
|
+ res->start = res->end = stat_irq;
|
|
|
+ res->flags &= ~IORESOURCE_DISABLED;
|
|
|
+ res->flags |= stat_irq_flags;
|
|
|
+ }
|
|
|
+
|
|
|
+ return platform_device_register(pdev);
|
|
|
+}
|
|
|
+
|
|
|
struct clk msm_clocks_8x50[] = {
|
|
|
CLK_PCOM("adm_clk", ADM_CLK, NULL, 0),
|
|
|
CLK_PCOM("ebi1_clk", EBI1_CLK, NULL, CLK_MIN),
|
|
@@ -144,6 +332,14 @@ struct clk msm_clocks_8x50[] = {
|
|
|
CLK_PCOM("pbus_clk", PBUS_CLK, NULL, CLK_MIN),
|
|
|
CLK_PCOM("pcm_clk", PCM_CLK, NULL, 0),
|
|
|
CLK_PCOM("sdac_clk", SDAC_CLK, NULL, OFF),
|
|
|
+ CLK_PCOM("sdc_clk", SDC1_CLK, &msm_device_sdc1.dev, OFF),
|
|
|
+ CLK_PCOM("sdc_pclk", SDC1_P_CLK, &msm_device_sdc1.dev, OFF),
|
|
|
+ CLK_PCOM("sdc_clk", SDC2_CLK, &msm_device_sdc2.dev, OFF),
|
|
|
+ CLK_PCOM("sdc_pclk", SDC2_P_CLK, &msm_device_sdc2.dev, OFF),
|
|
|
+ CLK_PCOM("sdc_clk", SDC3_CLK, &msm_device_sdc3.dev, OFF),
|
|
|
+ CLK_PCOM("sdc_pclk", SDC3_P_CLK, &msm_device_sdc3.dev, OFF),
|
|
|
+ CLK_PCOM("sdc_clk", SDC4_CLK, &msm_device_sdc4.dev, OFF),
|
|
|
+ CLK_PCOM("sdc_pclk", SDC4_P_CLK, &msm_device_sdc4.dev, OFF),
|
|
|
CLK_PCOM("spi_clk", SPI_CLK, NULL, 0),
|
|
|
CLK_PCOM("tsif_clk", TSIF_CLK, NULL, 0),
|
|
|
CLK_PCOM("tsif_ref_clk", TSIF_REF_CLK, NULL, 0),
|