[PATCH] dma: imx-sdma: keep the callbacks invoked in the tasklet

Vinod Koul vinod.koul at linux.intel.com
Fri May 11 01:38:39 EDT 2012


On Sat, 2012-04-28 at 18:15 +0800, Huang Shijie wrote:
> The current code keeps the callbacks invoked from interrupt context, this
> does not conform to the Documentation/dmaengine.txt.
> 
> So add tasklet support to fix this issue.
> 
> Signed-off-by: Huang Shijie <b32955 at freescale.com>
Applied Thanks
> ---
>  drivers/dma/imx-sdma.c |    9 +++++++--
>  1 files changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c
> index a894482..c492079 100644
> --- a/drivers/dma/imx-sdma.c
> +++ b/drivers/dma/imx-sdma.c
> @@ -271,6 +271,7 @@ struct sdma_channel {
>  	enum dma_status			status;
>  	unsigned int			chn_count;
>  	unsigned int			chn_real_count;
> +	struct tasklet_struct		tasklet;
>  };
>  
>  #define IMX_DMA_SG_LOOP		BIT(0)
> @@ -534,8 +535,10 @@ static void mxc_sdma_handle_channel_normal(struct sdma_channel *sdmac)
>  		sdmac->desc.callback(sdmac->desc.callback_param);
>  }
>  
> -static void mxc_sdma_handle_channel(struct sdma_channel *sdmac)
> +static void sdma_tasklet(unsigned long data)
>  {
> +	struct sdma_channel *sdmac = (struct sdma_channel *) data;
> +
>  	complete(&sdmac->done);
>  
>  	/* not interested in channel 0 interrupts */
> @@ -560,7 +563,7 @@ static irqreturn_t sdma_int_handler(int irq, void *dev_id)
>  		int channel = fls(stat) - 1;
>  		struct sdma_channel *sdmac = &sdma->channel[channel];
>  
> -		mxc_sdma_handle_channel(sdmac);
> +		tasklet_schedule(&sdmac->tasklet);
>  
>  		__clear_bit(channel, &stat);
>  	}
> @@ -1361,6 +1364,8 @@ static int __init sdma_probe(struct platform_device *pdev)
>  		dma_cookie_init(&sdmac->chan);
>  		sdmac->channel = i;
>  
> +		tasklet_init(&sdmac->tasklet, sdma_tasklet,
> +			     (unsigned long) sdmac);
>  		/*
>  		 * Add the channel to the DMAC list. Do not add channel 0 though
>  		 * because we need it internally in the SDMA driver. This also means


-- 
~Vinod




More information about the linux-arm-kernel mailing list