]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
msm: dma: use a platform device for msm_dmov
authorJeff Ohlstein <johlstei@codeaurora.org>
Wed, 2 Feb 2011 20:12:22 +0000 (12:12 -0800)
committerDavid Brown <davidb@codeaurora.org>
Fri, 1 Apr 2011 23:38:44 +0000 (16:38 -0700)
Switching to a platform device allows us to add hooks for power
management, along with providing a way to do per-SoC configuration of
the device.

Signed-off-by: Jeff Ohlstein <johlstei@codeaurora.org>
Signed-off-by: David Brown <davidb@codeaurora.org>
14 files changed:
arch/arm/mach-msm/board-halibut.c
arch/arm/mach-msm/board-mahimahi.c
arch/arm/mach-msm/board-msm7x30.c
arch/arm/mach-msm/board-qsd8x50.c
arch/arm/mach-msm/board-trout.c
arch/arm/mach-msm/devices-msm7x00.c
arch/arm/mach-msm/devices-msm7x30.c
arch/arm/mach-msm/devices-qsd8x50.c
arch/arm/mach-msm/devices.h
arch/arm/mach-msm/dma.c
arch/arm/mach-msm/include/mach/msm_iomap-7x00.h
arch/arm/mach-msm/include/mach/msm_iomap-7x30.h
arch/arm/mach-msm/include/mach/msm_iomap-8x50.h
arch/arm/mach-msm/io.c

index 18a3c97bc8632b6d781c940be2fedb6bd8e1eba3..4d264eb9a3b19d54cbd8dce2507a2b293484c2c7 100644 (file)
@@ -59,6 +59,7 @@ static struct platform_device smc91x_device = {
 
 static struct platform_device *devices[] __initdata = {
        &msm_device_uart3,
+       &msm_device_dmov,
        &msm_device_smd,
        &msm_device_nand,
        &msm_device_hsusb,
index 7a9a03eb189cb578db9f20c992ead2105650ef39..db3201ad8652acff21d8652faf42910e70b01755 100644 (file)
@@ -44,6 +44,7 @@ static struct platform_device *devices[] __initdata = {
 #if !defined(CONFIG_MSM_SERIAL_DEBUGGER)
        &msm_device_uart1,
 #endif
+       &msm_device_dmov,
        &msm_device_uart_dm1,
        &msm_device_nand,
 };
index b7a84966b711bcc9658595ecfdcc789bd9e1fe70..8d21769d288e793d1f156b851f2b5fa9d5bc53d9 100644 (file)
@@ -79,6 +79,7 @@ static struct platform_device *devices[] __initdata = {
 #if defined(CONFIG_SERIAL_MSM) || defined(CONFIG_MSM_SERIAL_DEBUGGER)
         &msm_device_uart2,
 #endif
+       &msm_device_dmov,
        &msm_device_smd,
        &msm_device_otg,
        &msm_device_hsusb,
index 7f568611547e94d5343db7d174712dc732ea0f2c..65f92b7eb7685fea8dbf3cd4efbcbda17f758859 100644 (file)
@@ -93,6 +93,7 @@ static struct msm_otg_platform_data msm_otg_pdata = {
 
 static struct platform_device *devices[] __initdata = {
        &msm_device_uart3,
+       &msm_device_dmov,
        &msm_device_smd,
        &msm_device_otg,
        &msm_device_hsusb,
index 814386772c663d16ea9c314a23788e9dba706745..5831ce5737399149dcb2dc1b4a805d106b0af091 100644 (file)
@@ -35,6 +35,7 @@ extern int trout_init_mmc(unsigned int);
 
 static struct platform_device *devices[] __initdata = {
        &msm_device_uart3,
+       &msm_device_dmov,
        &msm_device_smd,
        &msm_device_nand,
        &msm_device_hsusb,
index c4f5e26feb4dc4d274a1b721b90fce08e6fffd96..3ef38a53c508d5b99429acaef679135175034409 100644 (file)
@@ -418,8 +418,27 @@ struct platform_device msm_device_mdp = {
        .resource = resources_mdp,
 };
 
+static struct resource resources_dmov[] = {
+       {
+               .start = MSM7X00_DMOV_PHYS,
+               .end = MSM7X00_DMOV_PHYS + MSM7X00_DMOV_SIZE - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       {
+               .start = INT_ADM_AARM,
+               .flags = IORESOURCE_IRQ,
+       },
+};
+
+struct platform_device msm_device_dmov = {
+       .name   = "msm_dmov",
+       .id     = -1,
+       .num_resources = ARRAY_SIZE(resources_dmov),
+       .resource = resources_dmov,
+};
+
 struct clk_lookup msm_clocks_7x01a[] = {
-       CLK_PCOM("adm_clk",     ADM_CLK,        NULL, 0),
+       CLK_PCOM("adm_clk",     ADM_CLK,        "msm_dmov", 0),
        CLK_PCOM("adsp_clk",    ADSP_CLK,       NULL, 0),
        CLK_PCOM("ebi1_clk",    EBI1_CLK,       NULL, 0),
        CLK_PCOM("ebi2_clk",    EBI2_CLK,       NULL, 0),
index 09b4f14038246f6004aa4e9ef5d2721baba285c8..f803fcd380d068c50fcd449ef3b6683d505741d2 100644 (file)
@@ -130,8 +130,27 @@ struct platform_device msm_device_hsusb_host = {
        },
 };
 
+static struct resource resources_dmov[] = {
+       {
+               .start = MSM7X30_DMOV_PHYS,
+               .end = MSM7X30_DMOV_PHYS + MSM7X30_DMOV_SIZE - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       {
+               .start = INT_ADM_AARM,
+               .flags = IORESOURCE_IRQ,
+       },
+};
+
+struct platform_device msm_device_dmov = {
+       .name   = "msm_dmov",
+       .id     = -1,
+       .num_resources = ARRAY_SIZE(resources_dmov),
+       .resource = resources_dmov,
+};
+
 struct clk_lookup msm_clocks_7x30[] = {
-       CLK_PCOM("adm_clk",     ADM_CLK,        NULL, 0),
+       CLK_PCOM("adm_clk",     ADM_CLK,        "msm_dmov", 0),
        CLK_PCOM("adsp_clk",    ADSP_CLK,       NULL, 0),
        CLK_PCOM("cam_m_clk",   CAM_M_CLK,      NULL, 0),
        CLK_PCOM("camif_pad_pclk",      CAMIF_PAD_P_CLK,        NULL, OFF),
index 12d8deb78d9ca37b6a9bbe8fa6804301f3b1bae6..730982fe5902bd7df59eed913085cff3f459d127 100644 (file)
@@ -315,8 +315,27 @@ int __init msm_add_sdcc(unsigned int controller,
        return platform_device_register(pdev);
 }
 
+static struct resource resources_dmov[] = {
+       {
+               .start = QSD8X50_DMOV_PHYS,
+               .end = QSD8X50_DMOV_PHYS + QSD8X50_DMOV_SIZE - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       {
+               .start = INT_ADM_AARM,
+               .flags = IORESOURCE_IRQ,
+       },
+};
+
+struct platform_device msm_device_dmov = {
+       .name   = "msm_dmov",
+       .id     = -1,
+       .num_resources = ARRAY_SIZE(resources_dmov),
+       .resource = resources_dmov,
+};
+
 struct clk_lookup msm_clocks_8x50[] = {
-       CLK_PCOM("adm_clk",     ADM_CLK,        NULL, 0),
+       CLK_PCOM("adm_clk",     ADM_CLK,        "msm_dmov", 0),
        CLK_PCOM("ce_clk",      CE_CLK,         NULL, 0),
        CLK_PCOM("ebi1_clk",    EBI1_CLK,       NULL, CLK_MIN),
        CLK_PCOM("ebi2_clk",    EBI2_CLK,       NULL, 0),
index e7a0cb0b3d93b9ac9b287f8eec46a3c34df76f95..54ebfeee2f5389a3fbc2714bc70364af38747cf1 100644 (file)
@@ -40,6 +40,8 @@ extern struct platform_device msm_device_i2c;
 
 extern struct platform_device msm_device_smd;
 
+extern struct platform_device msm_device_dmov;
+
 extern struct platform_device msm_device_nand;
 
 extern struct platform_device msm_device_mddi0;
index 3ff31f9493a4f4c0a1f8b6a48c6f0301272521e3..3bafee955d80d44833c065472e95e7aa9e5a71f3 100644 (file)
 #include <linux/interrupt.h>
 #include <linux/completion.h>
 #include <linux/module.h>
+#include <linux/platform_device.h>
 #include <mach/dma.h>
 
 #define MSM_DMOV_CHANNEL_COUNT 16
 
+#define MODULE_NAME "msm_dmov"
+
 enum {
        MSM_DMOV_PRINT_ERRORS = 1,
        MSM_DMOV_PRINT_IO = 2,
@@ -37,11 +40,13 @@ static unsigned int channel_active;
 static struct list_head ready_commands[MSM_DMOV_CHANNEL_COUNT];
 static struct list_head active_commands[MSM_DMOV_CHANNEL_COUNT];
 unsigned int msm_dmov_print_mask = MSM_DMOV_PRINT_ERRORS;
+static void __iomem *msm_dmov_base;
+static unsigned msm_dmov_irq;
 
-#define DMOV_SD0(off, ch) (MSM_DMOV_BASE + 0x0000 + (off) + ((ch) << 2))
-#define DMOV_SD1(off, ch) (MSM_DMOV_BASE + 0x0400 + (off) + ((ch) << 2))
-#define DMOV_SD2(off, ch) (MSM_DMOV_BASE + 0x0800 + (off) + ((ch) << 2))
-#define DMOV_SD3(off, ch) (MSM_DMOV_BASE + 0x0C00 + (off) + ((ch) << 2))
+#define DMOV_SD0(off, ch) (msm_dmov_base + 0x0000 + (off) + ((ch) << 2))
+#define DMOV_SD1(off, ch) (msm_dmov_base + 0x0400 + (off) + ((ch) << 2))
+#define DMOV_SD2(off, ch) (msm_dmov_base + 0x0800 + (off) + ((ch) << 2))
+#define DMOV_SD3(off, ch) (msm_dmov_base + 0x0C00 + (off) + ((ch) << 2))
 
 #if defined(CONFIG_ARCH_MSM7X30)
 #define DMOV_SD_AARM DMOV_SD2
@@ -127,7 +132,7 @@ void msm_dmov_enqueue_cmd(unsigned id, struct msm_dmov_cmd *cmd)
                PRINT_IO("msm_dmov_enqueue_cmd(%d), start command, status %x\n", id, status);
                list_add_tail(&cmd->list, &active_commands[id]);
                if (!channel_active)
-                       enable_irq(INT_ADM_AARM);
+                       enable_irq(msm_dmov_irq);
                channel_active |= 1U << id;
                writel(cmd->cmdptr, DMOV_CMD_PTR(id));
        } else {
@@ -303,7 +308,7 @@ static irqreturn_t msm_datamover_irq_handler(int irq, void *dev_id)
        }
 
        if (!channel_active) {
-               disable_irq_nosync(INT_ADM_AARM);
+               disable_irq_nosync(msm_dmov_irq);
                msm_dmov_clocks_off();
        }
 
@@ -319,46 +324,79 @@ static void __init msm_dmov_deinit_clocks(void)
                clk_put(msm_dmov_pclk);
 }
 
-static int __init msm_dmov_init_clocks(void)
+static int __devinit msm_dmov_init_clocks(struct platform_device *pdev)
 {
        int ret = 0;
 
-       msm_dmov_clk = clk_get(NULL, "adm_clk");
+       msm_dmov_clk = clk_get(&pdev->dev, "adm_clk");
        if (IS_ERR(msm_dmov_clk)) {
                PRINT_ERROR("%s: Error getting adm_clk\n", __func__);
                ret = PTR_ERR(msm_dmov_clk);
        }
 
-       msm_dmov_pclk = clk_get(NULL, "adm_pclk");
+       msm_dmov_pclk = clk_get(&pdev->dev, "adm_pclk");
        /* pclk not present on all SoCs, don't return error on failure */
 
        return ret;
 }
 
-static int __init msm_init_datamover(void)
+static int __devinit msm_dmov_probe(struct platform_device *pdev)
 {
        int i;
        int ret;
+       struct resource *res;
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res)
+               return -ENXIO;
+
+       msm_dmov_base = ioremap_nocache(res->start, resource_size(res));
+       if (!msm_dmov_base)
+               return -ENOMEM;
 
        for (i = 0; i < MSM_DMOV_CHANNEL_COUNT; i++) {
                INIT_LIST_HEAD(&ready_commands[i]);
                INIT_LIST_HEAD(&active_commands[i]);
-               writel(DMOV_CONFIG_IRQ_EN | DMOV_CONFIG_FORCE_TOP_PTR_RSLT | DMOV_CONFIG_FORCE_FLUSH_RSLT, DMOV_CONFIG(i));
+               writel(DMOV_CONFIG_IRQ_EN | DMOV_CONFIG_FORCE_TOP_PTR_RSLT |
+                      DMOV_CONFIG_FORCE_FLUSH_RSLT, DMOV_CONFIG(i));
        }
 
-       ret = msm_dmov_init_clocks();
+       ret = msm_dmov_init_clocks(pdev);
        if (ret)
-               return ret;
+               goto out_map;
 
-       ret = request_irq(INT_ADM_AARM, msm_datamover_irq_handler, 0,
-                         "msmdatamover", NULL);
-       if (ret) {
-               msm_dmov_deinit_clocks();
-               return ret;
+       res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+       if (!res) {
+               ret = -EINVAL;
+               goto out_clock;
        }
-       disable_irq(INT_ADM_AARM);
+
+       msm_dmov_irq = res->start;
+       ret = request_irq(msm_dmov_irq, msm_datamover_irq_handler, 0,
+                         "msmdatamover", NULL);
+       if (ret)
+               goto out_clock;
+       disable_irq(msm_dmov_irq);
+
        return 0;
+out_clock:
+       msm_dmov_deinit_clocks();
+out_map:
+       iounmap(msm_dmov_base);
+       return ret;
 }
 
-arch_initcall(msm_init_datamover);
+static struct platform_driver msm_dmov_driver = {
+       .probe = msm_dmov_probe,
+       .driver = {
+               .name = MODULE_NAME,
+               .owner = THIS_MODULE,
+       },
+};
+
+static int __init msm_init_datamover(void)
+{
+       return platform_driver_register(&msm_dmov_driver);
+}
 
+arch_initcall(msm_init_datamover);
index 8f99d97615a0b25f9c3636e3313af016b38d4648..d6540e1192eb746a1f254cc960df1b82dc6008bd 100644 (file)
@@ -51,9 +51,8 @@
 #define MSM7X00_CSR_PHYS      0xC0100000
 #define MSM7X00_CSR_SIZE      SZ_4K
 
-#define MSM_DMOV_BASE         IOMEM(0xE0002000)
-#define MSM_DMOV_PHYS         0xA9700000
-#define MSM_DMOV_SIZE         SZ_4K
+#define MSM7X00_DMOV_PHYS     0xA9700000
+#define MSM7X00_DMOV_SIZE     SZ_4K
 
 #define MSM_GPIO1_BASE        IOMEM(0xE0003000)
 #define MSM_GPIO1_PHYS        0xA9200000
index 4d84be15955ea6856829af2e16be5ccf3aac9162..23912e541cdb98458bab44bc11cf78cb791d9fb2 100644 (file)
@@ -42,9 +42,8 @@
 #define MSM7X30_CSR_PHYS      0xC0100000
 #define MSM7X30_CSR_SIZE      SZ_4K
 
-#define MSM_DMOV_BASE         IOMEM(0xE0002000)
-#define MSM_DMOV_PHYS         0xAC400000
-#define MSM_DMOV_SIZE         SZ_4K
+#define MSM7X30_DMOV_PHYS     0xAC400000
+#define MSM7X30_DMOV_SIZE     SZ_4K
 
 #define MSM_GPIO1_BASE        IOMEM(0xE0003000)
 #define MSM_GPIO1_PHYS        0xAC001000
index d4143201999f2d8675e29a142d4290f2fef75f2e..fc36b82d41b314da7f1166f4596cd4bdb6b02820 100644 (file)
@@ -42,9 +42,8 @@
 #define QSD8X50_CSR_PHYS      0xAC100000
 #define QSD8X50_CSR_SIZE      SZ_4K
 
-#define MSM_DMOV_BASE         IOMEM(0xE0002000)
-#define MSM_DMOV_PHYS         0xA9700000
-#define MSM_DMOV_SIZE         SZ_4K
+#define QSD8X50_DMOV_PHYS     0xA9700000
+#define QSD8X50_DMOV_SIZE     SZ_4K
 
 #define MSM_GPIO1_BASE        IOMEM(0xE0003000)
 #define MSM_GPIO1_PHYS        0xA9000000
index cec6ed1c91d3ed602733d93127d8b5fc2340275d..1c86cda45d3b894be0d15f4d92fc5b72555a94f9 100644 (file)
@@ -42,7 +42,6 @@
 static struct map_desc msm_io_desc[] __initdata = {
        MSM_DEVICE(VIC),
        MSM_CHIP_DEVICE(CSR, MSM7X00),
-       MSM_DEVICE(DMOV),
        MSM_DEVICE(GPIO1),
        MSM_DEVICE(GPIO2),
        MSM_DEVICE(CLK_CTL),
@@ -75,7 +74,6 @@ void __init msm_map_common_io(void)
 static struct map_desc qsd8x50_io_desc[] __initdata = {
        MSM_DEVICE(VIC),
        MSM_CHIP_DEVICE(CSR, QSD8X50),
-       MSM_DEVICE(DMOV),
        MSM_DEVICE(GPIO1),
        MSM_DEVICE(GPIO2),
        MSM_DEVICE(CLK_CTL),
@@ -134,7 +132,6 @@ void __init msm_map_msm8960_io(void)
 static struct map_desc msm7x30_io_desc[] __initdata = {
        MSM_DEVICE(VIC),
        MSM_CHIP_DEVICE(CSR, MSM7X30),
-       MSM_DEVICE(DMOV),
        MSM_DEVICE(GPIO1),
        MSM_DEVICE(GPIO2),
        MSM_DEVICE(CLK_CTL),