diff options
author | John Crispin <blogic@openwrt.org> | 2012-04-12 15:12:19 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2012-05-21 09:31:51 -0400 |
commit | ddd4eeca961cc6b1d57e0ca2f264403d690b6882 (patch) | |
tree | 5b27e9bbedf3d1baf74950e658056f84aeebc61f /arch/mips/lantiq | |
parent | 287e3f3f4e68ca881e3faa413e7aa114fee609d3 (diff) |
MIPS: lantiq: convert dma to platform driver
Add code to make the dma driver load as a platform device from the devicetree.
Signed-off-by: John Crispin <blogic@openwrt.org>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/3824/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/lantiq')
-rw-r--r-- | arch/mips/lantiq/xway/dma.c | 61 |
1 files changed, 39 insertions, 22 deletions
diff --git a/arch/mips/lantiq/xway/dma.c b/arch/mips/lantiq/xway/dma.c index b210e936c7c3..55d2c4fa4714 100644 --- a/arch/mips/lantiq/xway/dma.c +++ b/arch/mips/lantiq/xway/dma.c | |||
@@ -19,7 +19,8 @@ | |||
19 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
20 | #include <linux/io.h> | 20 | #include <linux/io.h> |
21 | #include <linux/dma-mapping.h> | 21 | #include <linux/dma-mapping.h> |
22 | #include <linux/export.h> | 22 | #include <linux/module.h> |
23 | #include <linux/clk.h> | ||
23 | 24 | ||
24 | #include <lantiq_soc.h> | 25 | #include <lantiq_soc.h> |
25 | #include <xway_dma.h> | 26 | #include <xway_dma.h> |
@@ -55,13 +56,6 @@ | |||
55 | #define ltq_dma_w32_mask(x, y, z) ltq_w32_mask(x, y, \ | 56 | #define ltq_dma_w32_mask(x, y, z) ltq_w32_mask(x, y, \ |
56 | ltq_dma_membase + (z)) | 57 | ltq_dma_membase + (z)) |
57 | 58 | ||
58 | static struct resource ltq_dma_resource = { | ||
59 | .name = "dma", | ||
60 | .start = LTQ_DMA_BASE_ADDR, | ||
61 | .end = LTQ_DMA_BASE_ADDR + LTQ_DMA_SIZE - 1, | ||
62 | .flags = IORESOURCE_MEM, | ||
63 | }; | ||
64 | |||
65 | static void __iomem *ltq_dma_membase; | 59 | static void __iomem *ltq_dma_membase; |
66 | 60 | ||
67 | void | 61 | void |
@@ -215,27 +209,28 @@ ltq_dma_init_port(int p) | |||
215 | } | 209 | } |
216 | EXPORT_SYMBOL_GPL(ltq_dma_init_port); | 210 | EXPORT_SYMBOL_GPL(ltq_dma_init_port); |
217 | 211 | ||
218 | int __init | 212 | static int __devinit |
219 | ltq_dma_init(void) | 213 | ltq_dma_init(struct platform_device *pdev) |
220 | { | 214 | { |
215 | struct clk *clk; | ||
216 | struct resource *res; | ||
221 | int i; | 217 | int i; |
222 | 218 | ||
223 | /* insert and request the memory region */ | 219 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
224 | if (insert_resource(&iomem_resource, <q_dma_resource) < 0) | 220 | if (!res) |
225 | panic("Failed to insert dma memory"); | 221 | panic("Failed to get dma resource"); |
226 | |||
227 | if (request_mem_region(ltq_dma_resource.start, | ||
228 | resource_size(<q_dma_resource), "dma") < 0) | ||
229 | panic("Failed to request dma memory"); | ||
230 | 222 | ||
231 | /* remap dma register range */ | 223 | /* remap dma register range */ |
232 | ltq_dma_membase = ioremap_nocache(ltq_dma_resource.start, | 224 | ltq_dma_membase = devm_request_and_ioremap(&pdev->dev, res); |
233 | resource_size(<q_dma_resource)); | ||
234 | if (!ltq_dma_membase) | 225 | if (!ltq_dma_membase) |
235 | panic("Failed to remap dma memory"); | 226 | panic("Failed to remap dma resource"); |
236 | 227 | ||
237 | /* power up and reset the dma engine */ | 228 | /* power up and reset the dma engine */ |
238 | ltq_pmu_enable(PMU_DMA); | 229 | clk = clk_get(&pdev->dev, NULL); |
230 | if (IS_ERR(clk)) | ||
231 | panic("Failed to get dma clock"); | ||
232 | |||
233 | clk_enable(clk); | ||
239 | ltq_dma_w32_mask(0, DMA_RESET, LTQ_DMA_CTRL); | 234 | ltq_dma_w32_mask(0, DMA_RESET, LTQ_DMA_CTRL); |
240 | 235 | ||
241 | /* disable all interrupts */ | 236 | /* disable all interrupts */ |
@@ -248,7 +243,29 @@ ltq_dma_init(void) | |||
248 | ltq_dma_w32(DMA_POLL | DMA_CLK_DIV4, LTQ_DMA_CPOLL); | 243 | ltq_dma_w32(DMA_POLL | DMA_CLK_DIV4, LTQ_DMA_CPOLL); |
249 | ltq_dma_w32_mask(DMA_CHAN_ON, 0, LTQ_DMA_CCTRL); | 244 | ltq_dma_w32_mask(DMA_CHAN_ON, 0, LTQ_DMA_CCTRL); |
250 | } | 245 | } |
246 | dev_info(&pdev->dev, "init done\n"); | ||
251 | return 0; | 247 | return 0; |
252 | } | 248 | } |
253 | 249 | ||
254 | postcore_initcall(ltq_dma_init); | 250 | static const struct of_device_id dma_match[] = { |
251 | { .compatible = "lantiq,dma-xway" }, | ||
252 | {}, | ||
253 | }; | ||
254 | MODULE_DEVICE_TABLE(of, dma_match); | ||
255 | |||
256 | static struct platform_driver dma_driver = { | ||
257 | .probe = ltq_dma_init, | ||
258 | .driver = { | ||
259 | .name = "dma-xway", | ||
260 | .owner = THIS_MODULE, | ||
261 | .of_match_table = dma_match, | ||
262 | }, | ||
263 | }; | ||
264 | |||
265 | int __init | ||
266 | dma_init(void) | ||
267 | { | ||
268 | return platform_driver_register(&dma_driver); | ||
269 | } | ||
270 | |||
271 | postcore_initcall(dma_init); | ||