dmaengine: imx-sdma: Save imx_dma_data into sdmac
The filter() function is currently called by xlate() while it transfers imx_dma_data as a local variable to the filter() but releases the data right after returning a DMA channel pointer, which results chan->private pointing an invalid memory space. So this patch just stores the imx_dma_data into sdmac to make usre the private pointer valid as long as the channel exists. Signed-off-by: Nicolin Chen <nicoleotsuka@gmail.com> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
This commit is contained in:
parent
b1e51d771f
commit
0b3518652c
|
@ -271,6 +271,7 @@ struct sdma_channel {
|
||||||
unsigned int chn_count;
|
unsigned int chn_count;
|
||||||
unsigned int chn_real_count;
|
unsigned int chn_real_count;
|
||||||
struct tasklet_struct tasklet;
|
struct tasklet_struct tasklet;
|
||||||
|
struct imx_dma_data data;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define IMX_DMA_SG_LOOP BIT(0)
|
#define IMX_DMA_SG_LOOP BIT(0)
|
||||||
|
@ -1413,12 +1414,14 @@ err_dma_alloc:
|
||||||
|
|
||||||
static bool sdma_filter_fn(struct dma_chan *chan, void *fn_param)
|
static bool sdma_filter_fn(struct dma_chan *chan, void *fn_param)
|
||||||
{
|
{
|
||||||
|
struct sdma_channel *sdmac = to_sdma_chan(chan);
|
||||||
struct imx_dma_data *data = fn_param;
|
struct imx_dma_data *data = fn_param;
|
||||||
|
|
||||||
if (!imx_dma_is_general_purpose(chan))
|
if (!imx_dma_is_general_purpose(chan))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
chan->private = data;
|
sdmac->data = *data;
|
||||||
|
chan->private = &sdmac->data;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue