dma: imx-sdma: move to generic device tree bindings
Update imx-sdma driver to adopt generic DMA device tree bindings. It calls of_dma_controller_register() with imx-sdma specific of_dma_xlate to get the generic DMA device tree helper support. The #dma-cells for imx-sdma must be 3, which includes request ID, peripheral type and priority. The existing way of requesting channel, clients directly call dma_request_channel(), still work there, and will be removed after all imx-sdma clients get converted to generic DMA device tree helper. Signed-off-by: Shawn Guo <shawn.guo@linaro.org> Signed-off-by: Vinod Koul <vinod.koul@intel.com> Acked-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
@@ -4,14 +4,70 @@ Required properties:
|
|||||||
- compatible : Should be "fsl,<chip>-sdma"
|
- compatible : Should be "fsl,<chip>-sdma"
|
||||||
- reg : Should contain SDMA registers location and length
|
- reg : Should contain SDMA registers location and length
|
||||||
- interrupts : Should contain SDMA interrupt
|
- interrupts : Should contain SDMA interrupt
|
||||||
|
- #dma-cells : Must be <3>.
|
||||||
|
The first cell specifies the DMA request/event ID. See details below
|
||||||
|
about the second and third cell.
|
||||||
- fsl,sdma-ram-script-name : Should contain the full path of SDMA RAM
|
- fsl,sdma-ram-script-name : Should contain the full path of SDMA RAM
|
||||||
scripts firmware
|
scripts firmware
|
||||||
|
|
||||||
|
The second cell of dma phandle specifies the peripheral type of DMA transfer.
|
||||||
|
The full ID of peripheral types can be found below.
|
||||||
|
|
||||||
|
ID transfer type
|
||||||
|
---------------------
|
||||||
|
0 MCU domain SSI
|
||||||
|
1 Shared SSI
|
||||||
|
2 MMC
|
||||||
|
3 SDHC
|
||||||
|
4 MCU domain UART
|
||||||
|
5 Shared UART
|
||||||
|
6 FIRI
|
||||||
|
7 MCU domain CSPI
|
||||||
|
8 Shared CSPI
|
||||||
|
9 SIM
|
||||||
|
10 ATA
|
||||||
|
11 CCM
|
||||||
|
12 External peripheral
|
||||||
|
13 Memory Stick Host Controller
|
||||||
|
14 Shared Memory Stick Host Controller
|
||||||
|
15 DSP
|
||||||
|
16 Memory
|
||||||
|
17 FIFO type Memory
|
||||||
|
18 SPDIF
|
||||||
|
19 IPU Memory
|
||||||
|
20 ASRC
|
||||||
|
21 ESAI
|
||||||
|
|
||||||
|
The third cell specifies the transfer priority as below.
|
||||||
|
|
||||||
|
ID transfer priority
|
||||||
|
-------------------------
|
||||||
|
0 High
|
||||||
|
1 Medium
|
||||||
|
2 Low
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
sdma@83fb0000 {
|
sdma@83fb0000 {
|
||||||
compatible = "fsl,imx51-sdma", "fsl,imx35-sdma";
|
compatible = "fsl,imx51-sdma", "fsl,imx35-sdma";
|
||||||
reg = <0x83fb0000 0x4000>;
|
reg = <0x83fb0000 0x4000>;
|
||||||
interrupts = <6>;
|
interrupts = <6>;
|
||||||
|
#dma-cells = <3>;
|
||||||
fsl,sdma-ram-script-name = "sdma-imx51.bin";
|
fsl,sdma-ram-script-name = "sdma-imx51.bin";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
DMA clients connected to the i.MX SDMA controller must use the format
|
||||||
|
described in the dma.txt file.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
ssi2: ssi@70014000 {
|
||||||
|
compatible = "fsl,imx51-ssi", "fsl,imx21-ssi";
|
||||||
|
reg = <0x70014000 0x4000>;
|
||||||
|
interrupts = <30>;
|
||||||
|
clocks = <&clks 49>;
|
||||||
|
dmas = <&sdma 24 1 0>,
|
||||||
|
<&sdma 25 1 0>;
|
||||||
|
dma-names = "rx", "tx";
|
||||||
|
fsl,fifo-depth = <15>;
|
||||||
|
};
|
||||||
|
@@ -36,6 +36,7 @@
|
|||||||
#include <linux/dmaengine.h>
|
#include <linux/dmaengine.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_device.h>
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/of_dma.h>
|
||||||
|
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <linux/platform_data/dma-imx-sdma.h>
|
#include <linux/platform_data/dma-imx-sdma.h>
|
||||||
@@ -1296,6 +1297,35 @@ err_dma_alloc:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool sdma_filter_fn(struct dma_chan *chan, void *fn_param)
|
||||||
|
{
|
||||||
|
struct imx_dma_data *data = fn_param;
|
||||||
|
|
||||||
|
if (!imx_dma_is_general_purpose(chan))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
chan->private = data;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct dma_chan *sdma_xlate(struct of_phandle_args *dma_spec,
|
||||||
|
struct of_dma *ofdma)
|
||||||
|
{
|
||||||
|
struct sdma_engine *sdma = ofdma->of_dma_data;
|
||||||
|
dma_cap_mask_t mask = sdma->dma_device.cap_mask;
|
||||||
|
struct imx_dma_data data;
|
||||||
|
|
||||||
|
if (dma_spec->args_count != 3)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
data.dma_request = dma_spec->args[0];
|
||||||
|
data.peripheral_type = dma_spec->args[1];
|
||||||
|
data.priority = dma_spec->args[2];
|
||||||
|
|
||||||
|
return dma_request_channel(mask, sdma_filter_fn, &data);
|
||||||
|
}
|
||||||
|
|
||||||
static int __init sdma_probe(struct platform_device *pdev)
|
static int __init sdma_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
const struct of_device_id *of_id =
|
const struct of_device_id *of_id =
|
||||||
@@ -1443,10 +1473,20 @@ static int __init sdma_probe(struct platform_device *pdev)
|
|||||||
goto err_init;
|
goto err_init;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (np) {
|
||||||
|
ret = of_dma_controller_register(np, sdma_xlate, sdma);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(&pdev->dev, "failed to register controller\n");
|
||||||
|
goto err_register;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dev_info(sdma->dev, "initialized\n");
|
dev_info(sdma->dev, "initialized\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_register:
|
||||||
|
dma_async_device_unregister(&sdma->dma_device);
|
||||||
err_init:
|
err_init:
|
||||||
kfree(sdma->script_addrs);
|
kfree(sdma->script_addrs);
|
||||||
err_alloc:
|
err_alloc:
|
||||||
|
Reference in New Issue
Block a user