]>
Commit | Line | Data |
---|---|---|
67eacc15 GL |
1 | /* |
2 | * SHDMA Device Tree glue | |
3 | * | |
4 | * Copyright (C) 2013 Renesas Electronics Inc. | |
5 | * Author: Guennadi Liakhovetski <g.liakhovetski@gmx.de> | |
6 | * | |
7 | * This is free software; you can redistribute it and/or modify | |
8 | * it under the terms of version 2 of the GNU General Public License as | |
9 | * published by the Free Software Foundation. | |
10 | */ | |
11 | ||
12 | #include <linux/dmaengine.h> | |
13 | #include <linux/module.h> | |
14 | #include <linux/of.h> | |
15 | #include <linux/of_dma.h> | |
16 | #include <linux/of_platform.h> | |
17 | #include <linux/platform_device.h> | |
18 | #include <linux/shdma-base.h> | |
19 | ||
20 | #define to_shdma_chan(c) container_of(c, struct shdma_chan, dma_chan) | |
21 | ||
22 | static struct dma_chan *shdma_of_xlate(struct of_phandle_args *dma_spec, | |
23 | struct of_dma *ofdma) | |
24 | { | |
25 | u32 id = dma_spec->args[0]; | |
26 | dma_cap_mask_t mask; | |
27 | struct dma_chan *chan; | |
28 | ||
29 | if (dma_spec->args_count != 1) | |
30 | return NULL; | |
31 | ||
32 | dma_cap_zero(mask); | |
33 | /* Only slave DMA channels can be allocated via DT */ | |
34 | dma_cap_set(DMA_SLAVE, mask); | |
35 | ||
42e4a12a LP |
36 | chan = dma_request_channel(mask, shdma_chan_filter, |
37 | (void *)(uintptr_t)id); | |
67eacc15 GL |
38 | if (chan) |
39 | to_shdma_chan(chan)->hw_req = id; | |
40 | ||
41 | return chan; | |
42 | } | |
43 | ||
44 | static int shdma_of_probe(struct platform_device *pdev) | |
45 | { | |
d4adcc01 | 46 | const struct of_dev_auxdata *lookup = dev_get_platdata(&pdev->dev); |
67eacc15 GL |
47 | int ret; |
48 | ||
67eacc15 GL |
49 | ret = of_dma_controller_register(pdev->dev.of_node, |
50 | shdma_of_xlate, pdev); | |
51 | if (ret < 0) | |
52 | return ret; | |
53 | ||
54 | ret = of_platform_populate(pdev->dev.of_node, NULL, lookup, &pdev->dev); | |
55 | if (ret < 0) | |
56 | of_dma_controller_free(pdev->dev.of_node); | |
57 | ||
58 | return ret; | |
59 | } | |
60 | ||
61 | static const struct of_device_id shdma_of_match[] = { | |
62 | { .compatible = "renesas,shdma-mux", }, | |
63 | { } | |
64 | }; | |
65 | MODULE_DEVICE_TABLE(of, sh_dmae_of_match); | |
66 | ||
67 | static struct platform_driver shdma_of = { | |
68 | .driver = { | |
67eacc15 GL |
69 | .name = "shdma-of", |
70 | .of_match_table = shdma_of_match, | |
71 | }, | |
72 | .probe = shdma_of_probe, | |
73 | }; | |
74 | ||
75 | module_platform_driver(shdma_of); | |
76 | ||
77 | MODULE_LICENSE("GPL v2"); | |
78 | MODULE_DESCRIPTION("SH-DMA driver DT glue"); | |
79 | MODULE_AUTHOR("Guennadi Liakhovetski <g.liakhovetski@gmx.de>"); |