[RFC PATCH] DMA: PL330: Update PL330 DMAC to support runtime PM

Jassi Brar jassisinghbrar at gmail.com
Wed Jul 27 03:31:20 EDT 2011


On Wed, Jul 27, 2011 at 11:44 AM, Chanwoo Choi <cw00.choi at samsung.com> wrote:
> This patch update runtime PM for PL330 DMAC to reduce power consumption.
>
> Signed-off-by: Chanwoo Choi <cw00.choi at samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park at samsung.com>
> ---
> The following patch support runtime PM for PL330 DMAC, but the clock
> of PL330 is always on. If the clock of PL330 is always on, additional power
> (10mA) is consumed.

Yes, we need to do this, but please do it in drivers/dma/pl330.c so that
every platform benefits.

> diff --git a/include/linux/amba/pl330.h b/include/linux/amba/pl330.h
> index 17b0ada..d9a63fd 100644
> --- a/include/linux/amba/pl330.h
> +++ b/include/linux/amba/pl330.h
> @@ -12,6 +12,9 @@
>  #ifndef        __AMBA_PL330_H_
>  #define        __AMBA_PL330_H_
>
> +#include <linux/dmaengine.h>
> +#include <linux/interrupt.h>
> +
>  #include <asm/hardware/pl330.h>
>
>  struct dma_pl330_peri {
> @@ -42,4 +45,55 @@ struct dma_pl330_platdata {
>        unsigned mcbuf_sz;
>  };
>
> +struct dma_pl330_chan {
> +       /* Schedule desc completion */
> +       struct tasklet_struct task;
> +
> +       /* DMA-Engine Channel */
> +       struct dma_chan chan;
> +
> +       /* Last completed cookie */
> +       dma_cookie_t completed;
> +
> +       /* List of to be xfered descriptors */
> +       struct list_head work_list;
> +
> +       /* Pointer to the DMAC that manages this channel,
> +        * NULL if the channel is available to be acquired.
> +        * As the parent, this DMAC also provides descriptors
> +        * to the channel.
> +        */
> +       struct dma_pl330_dmac *dmac;
> +
> +       /* To protect channel manipulation */
> +       spinlock_t lock;
> +
> +       /* Token of a hardware channel thread of PL330 DMAC
> +        * NULL if the channel is available to be acquired.
> +        */
> +       void *pl330_chid;
> +
> +       /* taks for cyclic capability */
> +       struct tasklet_struct *cyclic_task;
> +
> +       bool cyclic;
> +};
> +
> +struct dma_pl330_dmac {
> +       struct pl330_info pif;
> +
> +       /* DMA-Engine Device */
> +       struct dma_device ddma;
> +
> +       /* Pool of descriptors available for the DMAC's channels */
> +       struct list_head desc_pool;
> +       /* To protect desc_pool manipulation */
> +       spinlock_t pool_lock;
> +
> +       /* Peripheral channels connected to this DMAC */
> +       struct dma_pl330_chan peripherals[0]; /* keep at end */
> +
> +       struct clk *clk;
> +};
> +
>  #endif /* __AMBA_PL330_H_ */

struct dma_pl330_dmac and struct dma_pl330_chan are internal to the
pl330 dmac driver. Nobody from outside should ever need them.

Thanks,
Jassi



More information about the linux-arm-kernel mailing list