forked from Minki/linux
67eacc1583
This patch adds Device Tree support to the shdma driver. No special DT properties are used, only standard DMA DT bindings are implemented. Since shdma controllers reside on SoCs, their configuration is SoC-specific and shall be passed to the driver from the SoC platform data, using the auxdata procedure. Signed-off-by: Guennadi Liakhovetski <g.liakhovetski+renesas@gmail.com> Acked-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
83 lines
1.9 KiB
C
83 lines
1.9 KiB
C
/*
|
|
* SHDMA Device Tree glue
|
|
*
|
|
* Copyright (C) 2013 Renesas Electronics Inc.
|
|
* Author: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
|
|
*
|
|
* This is free software; you can redistribute it and/or modify
|
|
* it under the terms of version 2 of the GNU General Public License as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#include <linux/dmaengine.h>
|
|
#include <linux/module.h>
|
|
#include <linux/of.h>
|
|
#include <linux/of_dma.h>
|
|
#include <linux/of_platform.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/shdma-base.h>
|
|
|
|
#define to_shdma_chan(c) container_of(c, struct shdma_chan, dma_chan)
|
|
|
|
static struct dma_chan *shdma_of_xlate(struct of_phandle_args *dma_spec,
|
|
struct of_dma *ofdma)
|
|
{
|
|
u32 id = dma_spec->args[0];
|
|
dma_cap_mask_t mask;
|
|
struct dma_chan *chan;
|
|
|
|
if (dma_spec->args_count != 1)
|
|
return NULL;
|
|
|
|
dma_cap_zero(mask);
|
|
/* Only slave DMA channels can be allocated via DT */
|
|
dma_cap_set(DMA_SLAVE, mask);
|
|
|
|
chan = dma_request_channel(mask, shdma_chan_filter, (void *)id);
|
|
if (chan)
|
|
to_shdma_chan(chan)->hw_req = id;
|
|
|
|
return chan;
|
|
}
|
|
|
|
static int shdma_of_probe(struct platform_device *pdev)
|
|
{
|
|
const struct of_dev_auxdata *lookup = pdev->dev.platform_data;
|
|
int ret;
|
|
|
|
if (!lookup)
|
|
return -EINVAL;
|
|
|
|
ret = of_dma_controller_register(pdev->dev.of_node,
|
|
shdma_of_xlate, pdev);
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
ret = of_platform_populate(pdev->dev.of_node, NULL, lookup, &pdev->dev);
|
|
if (ret < 0)
|
|
of_dma_controller_free(pdev->dev.of_node);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static const struct of_device_id shdma_of_match[] = {
|
|
{ .compatible = "renesas,shdma-mux", },
|
|
{ }
|
|
};
|
|
MODULE_DEVICE_TABLE(of, sh_dmae_of_match);
|
|
|
|
static struct platform_driver shdma_of = {
|
|
.driver = {
|
|
.owner = THIS_MODULE,
|
|
.name = "shdma-of",
|
|
.of_match_table = shdma_of_match,
|
|
},
|
|
.probe = shdma_of_probe,
|
|
};
|
|
|
|
module_platform_driver(shdma_of);
|
|
|
|
MODULE_LICENSE("GPL v2");
|
|
MODULE_DESCRIPTION("SH-DMA driver DT glue");
|
|
MODULE_AUTHOR("Guennadi Liakhovetski <g.liakhovetski@gmx.de>");
|