DMA: Freescale: update driver to support 8-channel DMA engine
This patch adds support to 8-channel DMA engine, thus the driver works for both the new 8-channel and the legacy 4-channel DMA engines. Signed-off-by: Hongbo Zhang <hongbo.zhang@freescale.com> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
This commit is contained in:
Родитель
03aa254f1e
Коммит
8de7a7d950
|
@ -89,14 +89,15 @@ config AT_HDMAC
|
||||||
Support the Atmel AHB DMA controller.
|
Support the Atmel AHB DMA controller.
|
||||||
|
|
||||||
config FSL_DMA
|
config FSL_DMA
|
||||||
tristate "Freescale Elo and Elo Plus DMA support"
|
tristate "Freescale Elo series DMA support"
|
||||||
depends on FSL_SOC
|
depends on FSL_SOC
|
||||||
select DMA_ENGINE
|
select DMA_ENGINE
|
||||||
select ASYNC_TX_ENABLE_CHANNEL_SWITCH
|
select ASYNC_TX_ENABLE_CHANNEL_SWITCH
|
||||||
---help---
|
---help---
|
||||||
Enable support for the Freescale Elo and Elo Plus DMA controllers.
|
Enable support for the Freescale Elo series DMA controllers.
|
||||||
The Elo is the DMA controller on some 82xx and 83xx parts, and the
|
The Elo is the DMA controller on some mpc82xx and mpc83xx parts, the
|
||||||
Elo Plus is the DMA controller on 85xx and 86xx parts.
|
EloPlus is on mpc85xx and mpc86xx and Pxxx parts, and the Elo3 is on
|
||||||
|
some Txxx and Bxxx parts.
|
||||||
|
|
||||||
config MPC512X_DMA
|
config MPC512X_DMA
|
||||||
tristate "Freescale MPC512x built-in DMA engine support"
|
tristate "Freescale MPC512x built-in DMA engine support"
|
||||||
|
|
|
@ -1253,7 +1253,9 @@ static int fsl_dma_chan_probe(struct fsldma_device *fdev,
|
||||||
WARN_ON(fdev->feature != chan->feature);
|
WARN_ON(fdev->feature != chan->feature);
|
||||||
|
|
||||||
chan->dev = fdev->dev;
|
chan->dev = fdev->dev;
|
||||||
chan->id = ((res.start - 0x100) & 0xfff) >> 7;
|
chan->id = (res.start & 0xfff) < 0x300 ?
|
||||||
|
((res.start - 0x100) & 0xfff) >> 7 :
|
||||||
|
((res.start - 0x200) & 0xfff) >> 7;
|
||||||
if (chan->id >= FSL_DMA_MAX_CHANS_PER_DEVICE) {
|
if (chan->id >= FSL_DMA_MAX_CHANS_PER_DEVICE) {
|
||||||
dev_err(fdev->dev, "too many channels for device\n");
|
dev_err(fdev->dev, "too many channels for device\n");
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
|
@ -1426,6 +1428,7 @@ static int fsldma_of_remove(struct platform_device *op)
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct of_device_id fsldma_of_ids[] = {
|
static const struct of_device_id fsldma_of_ids[] = {
|
||||||
|
{ .compatible = "fsl,elo3-dma", },
|
||||||
{ .compatible = "fsl,eloplus-dma", },
|
{ .compatible = "fsl,eloplus-dma", },
|
||||||
{ .compatible = "fsl,elo-dma", },
|
{ .compatible = "fsl,elo-dma", },
|
||||||
{}
|
{}
|
||||||
|
@ -1447,7 +1450,7 @@ static struct platform_driver fsldma_of_driver = {
|
||||||
|
|
||||||
static __init int fsldma_init(void)
|
static __init int fsldma_init(void)
|
||||||
{
|
{
|
||||||
pr_info("Freescale Elo / Elo Plus DMA driver\n");
|
pr_info("Freescale Elo series DMA driver\n");
|
||||||
return platform_driver_register(&fsldma_of_driver);
|
return platform_driver_register(&fsldma_of_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1459,5 +1462,5 @@ static void __exit fsldma_exit(void)
|
||||||
subsys_initcall(fsldma_init);
|
subsys_initcall(fsldma_init);
|
||||||
module_exit(fsldma_exit);
|
module_exit(fsldma_exit);
|
||||||
|
|
||||||
MODULE_DESCRIPTION("Freescale Elo / Elo Plus DMA driver");
|
MODULE_DESCRIPTION("Freescale Elo series DMA driver");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
|
|
@ -112,7 +112,7 @@ struct fsldma_chan_regs {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct fsldma_chan;
|
struct fsldma_chan;
|
||||||
#define FSL_DMA_MAX_CHANS_PER_DEVICE 4
|
#define FSL_DMA_MAX_CHANS_PER_DEVICE 8
|
||||||
|
|
||||||
struct fsldma_device {
|
struct fsldma_device {
|
||||||
void __iomem *regs; /* DGSR register base */
|
void __iomem *regs; /* DGSR register base */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче