[PATCH] ARM: EXYNOS: Enable MDMA driver
Marek Szyprowski
m.szyprowski at samsung.com
Mon Jan 16 03:31:51 EST 2012
Hello,
On ay, December 02, 2011 10:00 AM Kukjin Kim wrote:
> > This patch adds MDMA platform data and enables MDMA for DMA memcpy
> > operation
> >
> > Signed-off-by: Boojin Kim <boojin.kim at samsung.com>
> > ---
> > arch/arm/mach-exynos/clock.c | 8 +++++
> > arch/arm/mach-exynos/dma.c | 35
> ++++++++++++++++++++++++
> > arch/arm/mach-exynos/include/mach/irqs.h | 2 +
> > arch/arm/mach-exynos/include/mach/map.h | 3 +-
> > arch/arm/plat-samsung/include/plat/dma-pl330.h | 8 +++++
> > 5 files changed, 55 insertions(+), 1 deletions(-)
> >
> > diff --git a/arch/arm/mach-exynos/clock.c b/arch/arm/mach-exynos/clock.c
> > index 5d8d483..28e2842 100644
> > --- a/arch/arm/mach-exynos/clock.c
> > +++ b/arch/arm/mach-exynos/clock.c
> > @@ -782,6 +782,13 @@ static struct clk clk_pdma1 = {
> > .ctrlbit = (1 << 1),
> > };
> >
> > +static struct clk clk_mdma1 = {
> > + .name = "dma",
> > + .devname = "dma-pl330.2",
> > + .enable = exynos4_clk_ip_image_ctrl,
> > + .ctrlbit = ((1 << 8) | (1 << 5) | (1 << 2)),
> > +};
> > +
> > struct clk *clkset_group_list[] = {
> > [0] = &clk_ext_xtal_mux,
> > [1] = &clk_xusbxti,
> > @@ -1294,6 +1301,7 @@ static struct clksrc_clk *sysclks[] = {
> > static struct clk *clk_cdev[] = {
> > &clk_pdma0,
> > &clk_pdma1,
> > + &clk_mdma1,
> > };
> >
> > static struct clksrc_clk *clksrc_cdev[] = {
> > diff --git a/arch/arm/mach-exynos/dma.c b/arch/arm/mach-exynos/dma.c
> > index b10fcd2..e89329e 100644
> > --- a/arch/arm/mach-exynos/dma.c
> > +++ b/arch/arm/mach-exynos/dma.c
> > @@ -139,6 +139,38 @@ struct amba_device exynos4_device_pdma1 = {
> > .periphid = 0x00041330,
> > };
> >
> > +u8 mdma_peri[] = {
> > + DMACH_MTOM_0,
> > + DMACH_MTOM_1,
> > + DMACH_MTOM_2,
> > + DMACH_MTOM_3,
> > + DMACH_MTOM_4,
> > + DMACH_MTOM_5,
> > + DMACH_MTOM_6,
> > + DMACH_MTOM_7,
> > +};
> > +
> > +struct dma_pl330_platdata exynos4_mdma_pdata = {
> > + .nr_valid_peri = ARRAY_SIZE(mdma_peri),
> > + .peri_id = mdma_peri,
> > +};
> > +
> > +struct amba_device exynos4_device_mdma = {
> > + .dev = {
> > + .init_name = "dma-pl330.2",
> > + .dma_mask = &dma_dmamask,
> > + .coherent_dma_mask = DMA_BIT_MASK(32),
> > + .platform_data = &exynos4_mdma_pdata,
> > + },
> > + .res = {
> > + .start = EXYNOS4_PA_MDMA1,
> > + .end = EXYNOS4_PA_MDMA1 + SZ_4K,
> > + .flags = IORESOURCE_MEM,
> > + },
> > + .irq = {IRQ_MDMA1, NO_IRQ},
> > + .periphid = 0x00041330,
> > +};
> > +
> > static int __init exynos4_dma_init(void)
> > {
> > if (of_have_populated_dt())
> > @@ -152,6 +184,9 @@ static int __init exynos4_dma_init(void)
> > dma_cap_set(DMA_CYCLIC, exynos4_pdma1_pdata.cap_mask);
> > amba_device_register(&exynos4_device_pdma1, &iomem_resource);
> >
> > + dma_cap_set(DMA_MEMCPY, exynos4_mdma_pdata.cap_mask);
> > + amba_device_register(&exynos4_device_mdma, &iomem_resource);
> > +
> > return 0;
> > }
> > arch_initcall(exynos4_dma_init);
> > diff --git a/arch/arm/mach-exynos/include/mach/irqs.h b/arch/arm/mach-
> > exynos/include/mach/irqs.h
> > index 713dd52..f7d73b1 100644
> > --- a/arch/arm/mach-exynos/include/mach/irqs.h
> > +++ b/arch/arm/mach-exynos/include/mach/irqs.h
> > @@ -43,6 +43,8 @@
> > #define IRQ_EINT15 IRQ_SPI(31)
> > #define IRQ_EINT16_31 IRQ_SPI(32)
> >
> > +#define IRQ_MDMA0 IRQ_SPI(33)
> > +#define IRQ_MDMA1 IRQ_SPI(34)
> > #define IRQ_PDMA0 IRQ_SPI(35)
> > #define IRQ_PDMA1 IRQ_SPI(36)
> > #define IRQ_TIMER0_VIC IRQ_SPI(37)
> > diff --git a/arch/arm/mach-exynos/include/mach/map.h b/arch/arm/mach-
> > exynos/include/mach/map.h
> > index 058541d..03e2c99 100644
> > --- a/arch/arm/mach-exynos/include/mach/map.h
> > +++ b/arch/arm/mach-exynos/include/mach/map.h
> > @@ -67,7 +67,8 @@
> > #define EXYNOS4_PA_TWD 0x10500600
> > #define EXYNOS4_PA_L2CC 0x10502000
> >
> > -#define EXYNOS4_PA_MDMA 0x10810000
> > +#define EXYNOS4_PA_MDMA0 0x10810000
> > +#define EXYNOS4_PA_MDMA1 0x12840000
> > #define EXYNOS4_PA_PDMA0 0x12680000
> > #define EXYNOS4_PA_PDMA1 0x12690000
> >
> > diff --git a/arch/arm/plat-samsung/include/plat/dma-pl330.h
> > b/arch/arm/plat-samsung/include/plat/dma-pl330.h
> > index c5eaad5..ecf23a8 100644
> > --- a/arch/arm/plat-samsung/include/plat/dma-pl330.h
> > +++ b/arch/arm/plat-samsung/include/plat/dma-pl330.h
> > @@ -82,6 +82,14 @@ enum dma_ch {
> > DMACH_SLIMBUS4_TX,
> > DMACH_SLIMBUS5_RX,
> > DMACH_SLIMBUS5_TX,
> > + DMACH_MTOM_0,
> > + DMACH_MTOM_1,
> > + DMACH_MTOM_2,
> > + DMACH_MTOM_3,
> > + DMACH_MTOM_4,
> > + DMACH_MTOM_5,
> > + DMACH_MTOM_6,
> > + DMACH_MTOM_7,
> > /* END Marker, also used to denote a reserved channel */
> > DMACH_MAX,
> > };
> > --
> > 1.7.1
>
> Looks ok, will apply.
> Thanks.
The code looks ok, but there is an issue. MDMA device belongs to LCD0 power domain but
the above code doesn't add the required relation between the device and powerdomain.
It assumes that the power domain is always enabled - if not the system hangs on boot,
so for some cases this patch causes regression.
Best regards
--
Marek Szyprowski
Samsung Poland R&D Center
More information about the linux-arm-kernel
mailing list