Commit e51d0f0a authored by Shawn Guo's avatar Shawn Guo

dma: imx-dma: remove cpu_is_xxx by using platform_device_id

It changes the driver to use platform_device_id rather than cpu_is_xxx
to determine the controller type, and updates the platform code
accordingly.

As the result, mach/hardware.h inclusion gets removed from the driver.
Signed-off-by: default avatarShawn Guo <shawn.guo@linaro.org>
Signed-off-by: default avatarSascha Hauer <s.hauer@pengutronix.de>
Acked-by: default avatarArnd Bergmann <arnd@arndb.de>
Tested-by: default avatarJavier Martin <javier.martin@vista-silicon.com>
Cc: Vinod Koul <vinod.koul@linux.intel.com>
parent 73930eb3
...@@ -83,7 +83,8 @@ int __init mx1_clocks_init(unsigned long fref) ...@@ -83,7 +83,8 @@ int __init mx1_clocks_init(unsigned long fref)
pr_err("imx1 clk %d: register failed with %ld\n", pr_err("imx1 clk %d: register failed with %ld\n",
i, PTR_ERR(clk[i])); 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[csi_gate], NULL, "mx1-camera.0");
clk_register_clkdev(clk[mma_gate], "mma", NULL); clk_register_clkdev(clk[mma_gate], "mma", NULL);
clk_register_clkdev(clk[usbd_gate], NULL, "imx_udc.0"); clk_register_clkdev(clk[usbd_gate], NULL, "imx_udc.0");
......
...@@ -163,8 +163,8 @@ int __init mx21_clocks_init(unsigned long lref, unsigned long href) ...@@ -163,8 +163,8 @@ int __init mx21_clocks_init(unsigned long lref, unsigned long href)
clk_register_clkdev(clk[usb_gate], "per", "imx21-hcd.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[usb_hclk_gate], "ahb", "imx21-hcd.0");
clk_register_clkdev(clk[nfc_gate], NULL, "imx21-nand.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_hclk_gate], "ahb", "imx21-dma");
clk_register_clkdev(clk[dma_gate], "ipg", "imx-dma"); clk_register_clkdev(clk[dma_gate], "ipg", "imx21-dma");
clk_register_clkdev(clk[wdog_gate], NULL, "imx2-wdt.0"); clk_register_clkdev(clk[wdog_gate], NULL, "imx2-wdt.0");
clk_register_clkdev(clk[i2c_gate], NULL, "imx21-i2c.0"); clk_register_clkdev(clk[i2c_gate], NULL, "imx21-i2c.0");
clk_register_clkdev(clk[kpp_gate], NULL, "mxc-keypad"); clk_register_clkdev(clk[kpp_gate], NULL, "mxc-keypad");
......
...@@ -242,8 +242,8 @@ int __init mx27_clocks_init(unsigned long fref) ...@@ -242,8 +242,8 @@ int __init mx27_clocks_init(unsigned long fref)
clk_register_clkdev(clk[nfc_baud_gate], NULL, "imx27-nand.0"); 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_baud_gate], "per", "coda-imx27.0");
clk_register_clkdev(clk[vpu_ahb_gate], "ahb", "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_ahb_gate], "ahb", "imx27-dma");
clk_register_clkdev(clk[dma_ipg_gate], "ipg", "imx-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_ipg_gate], "ipg", "imx27-fec.0");
clk_register_clkdev(clk[fec_ahb_gate], "ahb", "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"); clk_register_clkdev(clk[wdog_ipg_gate], NULL, "imx2-wdt.0");
......
...@@ -329,7 +329,7 @@ struct platform_device *__init imx_add_spi_imx( ...@@ -329,7 +329,7 @@ struct platform_device *__init imx_add_spi_imx(
const struct imx_spi_imx_data *data, const struct imx_spi_imx_data *data,
const struct spi_imx_master *pdata); 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); int irq, int irq_err);
struct platform_device *imx_add_imx_sdma(char *name, struct platform_device *imx_add_imx_sdma(char *name,
resource_size_t iobase, int irq, struct sdma_platform_data *pdata); resource_size_t iobase, int irq, struct sdma_platform_data *pdata);
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
*/ */
#include "devices-common.h" #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) resource_size_t iobase, int irq, int irq_err)
{ {
struct resource res[] = { struct resource res[] = {
...@@ -28,7 +28,7 @@ struct platform_device __init __maybe_unused *imx_add_imx_dma( ...@@ -28,7 +28,7 @@ struct platform_device __init __maybe_unused *imx_add_imx_dma(
}; };
return platform_device_register_resndata(&mxc_ahb_bus, 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, struct platform_device __init __maybe_unused *imx_add_imx_sdma(char *name,
......
...@@ -60,6 +60,7 @@ void __init imx1_soc_init(void) ...@@ -60,6 +60,7 @@ void __init imx1_soc_init(void)
MX1_GPIO_INT_PORTC, 0); MX1_GPIO_INT_PORTC, 0);
mxc_register_gpio("imx1-gpio", 3, MX1_GPIO4_BASE_ADDR, SZ_256, mxc_register_gpio("imx1-gpio", 3, MX1_GPIO4_BASE_ADDR, SZ_256,
MX1_GPIO_INT_PORTD, 0); 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(); pinctrl_provide_dummies();
} }
...@@ -90,7 +90,8 @@ void __init imx21_soc_init(void) ...@@ -90,7 +90,8 @@ void __init imx21_soc_init(void)
mxc_register_gpio("imx21-gpio", 5, MX21_GPIO6_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0); mxc_register_gpio("imx21-gpio", 5, MX21_GPIO6_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
pinctrl_provide_dummies(); 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, platform_device_register_simple("imx21-audmux", 0, imx21_audmux_res,
ARRAY_SIZE(imx21_audmux_res)); ARRAY_SIZE(imx21_audmux_res));
} }
...@@ -91,7 +91,8 @@ void __init imx27_soc_init(void) ...@@ -91,7 +91,8 @@ void __init imx27_soc_init(void)
mxc_register_gpio("imx21-gpio", 5, MX27_GPIO6_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0); mxc_register_gpio("imx21-gpio", 5, MX27_GPIO6_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
pinctrl_provide_dummies(); 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 */ /* imx27 has the imx21 type audmux */
platform_device_register_simple("imx21-audmux", 0, imx27_audmux_res, platform_device_register_simple("imx21-audmux", 0, imx27_audmux_res,
ARRAY_SIZE(imx27_audmux_res)); ARRAY_SIZE(imx27_audmux_res));
......
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
#include <asm/irq.h> #include <asm/irq.h>
#include <linux/platform_data/dma-imx.h> #include <linux/platform_data/dma-imx.h>
#include <mach/hardware.h>
#include "dmaengine.h" #include "dmaengine.h"
#define IMXDMA_MAX_CHAN_DESCRIPTORS 16 #define IMXDMA_MAX_CHAN_DESCRIPTORS 16
...@@ -167,6 +166,12 @@ struct imxdma_channel { ...@@ -167,6 +166,12 @@ struct imxdma_channel {
int slot_2d; int slot_2d;
}; };
enum imx_dma_type {
IMX1_DMA,
IMX21_DMA,
IMX27_DMA,
};
struct imxdma_engine { struct imxdma_engine {
struct device *dev; struct device *dev;
struct device_dma_parameters dma_parms; struct device_dma_parameters dma_parms;
...@@ -177,8 +182,40 @@ struct imxdma_engine { ...@@ -177,8 +182,40 @@ struct imxdma_engine {
spinlock_t lock; spinlock_t lock;
struct imx_dma_2d_config slots_2d[IMX_DMA_2D_SLOTS]; struct imx_dma_2d_config slots_2d[IMX_DMA_2D_SLOTS];
struct imxdma_channel channel[IMX_DMA_CHANNELS]; 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) static struct imxdma_channel *to_imxdma_chan(struct dma_chan *chan)
{ {
return container_of(chan, struct imxdma_channel, chan); return container_of(chan, struct imxdma_channel, chan);
...@@ -212,7 +249,9 @@ static unsigned imx_dmav1_readl(struct imxdma_engine *imxdma, unsigned offset) ...@@ -212,7 +249,9 @@ static unsigned imx_dmav1_readl(struct imxdma_engine *imxdma, unsigned offset)
static int imxdma_hw_chain(struct imxdma_channel *imxdmac) 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; return imxdmac->hw_chaining;
else else
return 0; return 0;
...@@ -267,7 +306,7 @@ static void imxdma_enable_hw(struct imxdma_desc *d) ...@@ -267,7 +306,7 @@ static void imxdma_enable_hw(struct imxdma_desc *d)
imx_dmav1_writel(imxdma, imx_dmav1_readl(imxdma, DMA_CCR(channel)) | imx_dmav1_writel(imxdma, imx_dmav1_readl(imxdma, DMA_CCR(channel)) |
CCR_CEN | CCR_ACRPT, 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 && imxdma_hw_chain(imxdmac)) {
d->sg = sg_next(d->sg); d->sg = sg_next(d->sg);
if (d->sg) { if (d->sg) {
...@@ -436,7 +475,7 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id) ...@@ -436,7 +475,7 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id)
struct imxdma_engine *imxdma = dev_id; struct imxdma_engine *imxdma = dev_id;
int i, disr; int i, disr;
if (cpu_is_mx21() || cpu_is_mx27()) if (!is_imx1_dma(imxdma))
imxdma_err_handler(irq, dev_id); imxdma_err_handler(irq, dev_id);
disr = imx_dmav1_readl(imxdma, DMA_DISR); disr = imx_dmav1_readl(imxdma, DMA_DISR);
...@@ -967,6 +1006,8 @@ static int __init imxdma_probe(struct platform_device *pdev) ...@@ -967,6 +1006,8 @@ static int __init imxdma_probe(struct platform_device *pdev)
if (!imxdma) if (!imxdma)
return -ENOMEM; return -ENOMEM;
imxdma->devtype = pdev->id_entry->driver_data;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
imxdma->base = devm_request_and_ioremap(&pdev->dev, res); imxdma->base = devm_request_and_ioremap(&pdev->dev, res);
if (!imxdma->base) if (!imxdma->base)
...@@ -990,7 +1031,7 @@ static int __init imxdma_probe(struct platform_device *pdev) ...@@ -990,7 +1031,7 @@ static int __init imxdma_probe(struct platform_device *pdev)
/* reset DMA module */ /* reset DMA module */
imx_dmav1_writel(imxdma, DCR_DRST, DMA_DCR); imx_dmav1_writel(imxdma, DCR_DRST, DMA_DCR);
if (cpu_is_mx1()) { if (is_imx1_dma(imxdma)) {
ret = devm_request_irq(&pdev->dev, irq, ret = devm_request_irq(&pdev->dev, irq,
dma_irq_handler, 0, "DMA", imxdma); dma_irq_handler, 0, "DMA", imxdma);
if (ret) { if (ret) {
...@@ -1038,7 +1079,7 @@ static int __init imxdma_probe(struct platform_device *pdev) ...@@ -1038,7 +1079,7 @@ static int __init imxdma_probe(struct platform_device *pdev)
for (i = 0; i < IMX_DMA_CHANNELS; i++) { for (i = 0; i < IMX_DMA_CHANNELS; i++) {
struct imxdma_channel *imxdmac = &imxdma->channel[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, ret = devm_request_irq(&pdev->dev, irq + i,
dma_irq_handler, 0, "DMA", imxdma); dma_irq_handler, 0, "DMA", imxdma);
if (ret) { if (ret) {
...@@ -1118,6 +1159,7 @@ static struct platform_driver imxdma_driver = { ...@@ -1118,6 +1159,7 @@ static struct platform_driver imxdma_driver = {
.driver = { .driver = {
.name = "imx-dma", .name = "imx-dma",
}, },
.id_table = imx_dma_devtype,
.remove = __exit_p(imxdma_remove), .remove = __exit_p(imxdma_remove),
}; };
......
...@@ -61,7 +61,9 @@ static inline int imx_dma_is_ipu(struct dma_chan *chan) ...@@ -61,7 +61,9 @@ static inline int imx_dma_is_ipu(struct dma_chan *chan)
static inline int imx_dma_is_general_purpose(struct dma_chan *chan) static inline int imx_dma_is_general_purpose(struct dma_chan *chan)
{ {
return strstr(dev_name(chan->device->dev), "sdma") || 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 #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment