Skip to content

Commit

Permalink
dma: imx-sdma: keep the callbacks invoked in the tasklet
Browse files Browse the repository at this point in the history
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@freescale.com>
Signed-off-by: Vinod Koul <vinod.koul@linux.intel.com>
  • Loading branch information
Huang Shijie authored and Vinod Koul committed May 11, 2012
1 parent d3f797d commit abd9ccc
Showing 1 changed file with 7 additions and 2 deletions.
9 changes: 7 additions & 2 deletions drivers/dma/imx-sdma.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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 */
Expand All @@ -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);
}
Expand Down Expand Up @@ -1359,6 +1362,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
Expand Down

0 comments on commit abd9ccc

Please sign in to comment.