pr_err("imx1 clk %d: register failed with %ld\n",
                                i, PTR_ERR(clk[i]));
 
-       clk_register_clkdev(clk[dma_gate], "ahb", "imx-dma");
+       clk_register_clkdev(clk[dma_gate], "ahb", "imx1-dma");
+       clk_register_clkdev(clk[hclk], "ipg", "imx1-dma");
        clk_register_clkdev(clk[csi_gate], NULL, "mx1-camera.0");
        clk_register_clkdev(clk[mma_gate], "mma", NULL);
        clk_register_clkdev(clk[usbd_gate], NULL, "imx_udc.0");
 
        clk_register_clkdev(clk[usb_gate], "per", "imx21-hcd.0");
        clk_register_clkdev(clk[usb_hclk_gate], "ahb", "imx21-hcd.0");
        clk_register_clkdev(clk[nfc_gate], NULL, "imx21-nand.0");
-       clk_register_clkdev(clk[dma_hclk_gate], "ahb", "imx-dma");
-       clk_register_clkdev(clk[dma_gate], "ipg", "imx-dma");
+       clk_register_clkdev(clk[dma_hclk_gate], "ahb", "imx21-dma");
+       clk_register_clkdev(clk[dma_gate], "ipg", "imx21-dma");
        clk_register_clkdev(clk[wdog_gate], NULL, "imx2-wdt.0");
        clk_register_clkdev(clk[i2c_gate], NULL, "imx21-i2c.0");
        clk_register_clkdev(clk[kpp_gate], NULL, "mxc-keypad");
 
        clk_register_clkdev(clk[nfc_baud_gate], NULL, "imx27-nand.0");
        clk_register_clkdev(clk[vpu_baud_gate], "per", "coda-imx27.0");
        clk_register_clkdev(clk[vpu_ahb_gate], "ahb", "coda-imx27.0");
-       clk_register_clkdev(clk[dma_ahb_gate], "ahb", "imx-dma");
-       clk_register_clkdev(clk[dma_ipg_gate], "ipg", "imx-dma");
+       clk_register_clkdev(clk[dma_ahb_gate], "ahb", "imx27-dma");
+       clk_register_clkdev(clk[dma_ipg_gate], "ipg", "imx27-dma");
        clk_register_clkdev(clk[fec_ipg_gate], "ipg", "imx27-fec.0");
        clk_register_clkdev(clk[fec_ahb_gate], "ahb", "imx27-fec.0");
        clk_register_clkdev(clk[wdog_ipg_gate], NULL, "imx2-wdt.0");
 
                const struct imx_spi_imx_data *data,
                const struct spi_imx_master *pdata);
 
-struct platform_device *imx_add_imx_dma(resource_size_t iobase,
+struct platform_device *imx_add_imx_dma(char *name, resource_size_t iobase,
                                        int irq, int irq_err);
 struct platform_device *imx_add_imx_sdma(char *name,
        resource_size_t iobase, int irq, struct sdma_platform_data *pdata);
 
  */
 #include "devices-common.h"
 
-struct platform_device __init __maybe_unused *imx_add_imx_dma(
+struct platform_device __init __maybe_unused *imx_add_imx_dma(char *name,
        resource_size_t iobase, int irq, int irq_err)
 {
        struct resource res[] = {
        };
 
        return platform_device_register_resndata(&mxc_ahb_bus,
-                       "imx-dma", -1, res, ARRAY_SIZE(res), NULL, 0);
+                       name, -1, res, ARRAY_SIZE(res), NULL, 0);
 }
 
 struct platform_device __init __maybe_unused *imx_add_imx_sdma(char *name,
 
                                                MX1_GPIO_INT_PORTC, 0);
        mxc_register_gpio("imx1-gpio", 3, MX1_GPIO4_BASE_ADDR, SZ_256,
                                                MX1_GPIO_INT_PORTD, 0);
-       imx_add_imx_dma(MX1_DMA_BASE_ADDR, MX1_DMA_INT, MX1_DMA_ERR);
+       imx_add_imx_dma("imx1-dma", MX1_DMA_BASE_ADDR,
+                       MX1_DMA_INT, MX1_DMA_ERR);
        pinctrl_provide_dummies();
 }
 
        mxc_register_gpio("imx21-gpio", 5, MX21_GPIO6_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
 
        pinctrl_provide_dummies();
-       imx_add_imx_dma(MX21_DMA_BASE_ADDR, MX21_INT_DMACH0, 0); /* No ERR irq */
+       imx_add_imx_dma("imx21-dma", MX21_DMA_BASE_ADDR,
+                       MX21_INT_DMACH0, 0); /* No ERR irq */
        platform_device_register_simple("imx21-audmux", 0, imx21_audmux_res,
                                        ARRAY_SIZE(imx21_audmux_res));
 }
 
        mxc_register_gpio("imx21-gpio", 5, MX27_GPIO6_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
 
        pinctrl_provide_dummies();
-       imx_add_imx_dma(MX27_DMA_BASE_ADDR, MX27_INT_DMACH0, 0); /* No ERR irq */
+       imx_add_imx_dma("imx27-dma", MX27_DMA_BASE_ADDR,
+                       MX27_INT_DMACH0, 0); /* No ERR irq */
        /* imx27 has the imx21 type audmux */
        platform_device_register_simple("imx21-audmux", 0, imx27_audmux_res,
                                        ARRAY_SIZE(imx27_audmux_res));
 
 
 #include <asm/irq.h>
 #include <linux/platform_data/dma-imx.h>
-#include <mach/hardware.h>
 
 #include "dmaengine.h"
 #define IMXDMA_MAX_CHAN_DESCRIPTORS    16
        int                             slot_2d;
 };
 
+enum imx_dma_type {
+       IMX1_DMA,
+       IMX21_DMA,
+       IMX27_DMA,
+};
+
 struct imxdma_engine {
        struct device                   *dev;
        struct device_dma_parameters    dma_parms;
        spinlock_t                      lock;
        struct imx_dma_2d_config        slots_2d[IMX_DMA_2D_SLOTS];
        struct imxdma_channel           channel[IMX_DMA_CHANNELS];
+       enum imx_dma_type               devtype;
 };
 
+static struct platform_device_id imx_dma_devtype[] = {
+       {
+               .name = "imx1-dma",
+               .driver_data = IMX1_DMA,
+       }, {
+               .name = "imx21-dma",
+               .driver_data = IMX21_DMA,
+       }, {
+               .name = "imx27-dma",
+               .driver_data = IMX27_DMA,
+       }, {
+               /* sentinel */
+       }
+};
+MODULE_DEVICE_TABLE(platform, imx_dma_devtype);
+
+static inline int is_imx1_dma(struct imxdma_engine *imxdma)
+{
+       return imxdma->devtype == IMX1_DMA;
+}
+
+static inline int is_imx21_dma(struct imxdma_engine *imxdma)
+{
+       return imxdma->devtype == IMX21_DMA;
+}
+
+static inline int is_imx27_dma(struct imxdma_engine *imxdma)
+{
+       return imxdma->devtype == IMX27_DMA;
+}
+
 static struct imxdma_channel *to_imxdma_chan(struct dma_chan *chan)
 {
        return container_of(chan, struct imxdma_channel, chan);
 
 static int imxdma_hw_chain(struct imxdma_channel *imxdmac)
 {
-       if (cpu_is_mx27())
+       struct imxdma_engine *imxdma = imxdmac->imxdma;
+
+       if (is_imx27_dma(imxdma))
                return imxdmac->hw_chaining;
        else
                return 0;
        imx_dmav1_writel(imxdma, imx_dmav1_readl(imxdma, DMA_CCR(channel)) |
                         CCR_CEN | CCR_ACRPT, DMA_CCR(channel));
 
-       if ((cpu_is_mx21() || cpu_is_mx27()) &&
+       if (!is_imx1_dma(imxdma) &&
                        d->sg && imxdma_hw_chain(imxdmac)) {
                d->sg = sg_next(d->sg);
                if (d->sg) {
        struct imxdma_engine *imxdma = dev_id;
        int i, disr;
 
-       if (cpu_is_mx21() || cpu_is_mx27())
+       if (!is_imx1_dma(imxdma))
                imxdma_err_handler(irq, dev_id);
 
        disr = imx_dmav1_readl(imxdma, DMA_DISR);
        if (!imxdma)
                return -ENOMEM;
 
+       imxdma->devtype = pdev->id_entry->driver_data;
+
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        imxdma->base = devm_request_and_ioremap(&pdev->dev, res);
        if (!imxdma->base)
        /* reset DMA module */
        imx_dmav1_writel(imxdma, DCR_DRST, DMA_DCR);
 
-       if (cpu_is_mx1()) {
+       if (is_imx1_dma(imxdma)) {
                ret = devm_request_irq(&pdev->dev, irq,
                                       dma_irq_handler, 0, "DMA", imxdma);
                if (ret) {
        for (i = 0; i < IMX_DMA_CHANNELS; i++) {
                struct imxdma_channel *imxdmac = &imxdma->channel[i];
 
-               if (cpu_is_mx21() || cpu_is_mx27()) {
+               if (!is_imx1_dma(imxdma)) {
                        ret = devm_request_irq(&pdev->dev, irq + i,
                                        dma_irq_handler, 0, "DMA", imxdma);
                        if (ret) {
        .driver         = {
                .name   = "imx-dma",
        },
+       .id_table       = imx_dma_devtype,
        .remove         = __exit_p(imxdma_remove),
 };
 
 
 static inline int imx_dma_is_general_purpose(struct dma_chan *chan)
 {
        return strstr(dev_name(chan->device->dev), "sdma") ||
-               !strcmp(dev_name(chan->device->dev), "imx-dma");
+               !strcmp(dev_name(chan->device->dev), "imx1-dma") ||
+               !strcmp(dev_name(chan->device->dev), "imx21-dma") ||
+               !strcmp(dev_name(chan->device->dev), "imx27-dma");
 }
 
 #endif