Commit 757d12e5 authored by Vinod Koul's avatar Vinod Koul

dmaengine: ensure dmaengine helpers check valid callback

dmaengine has various device callbacks and exposes helper
functions to invoke these. These helpers should check if channel,
device and callback is valid or not before invoking them.
Reported-by: default avatarJon Hunter <jonathanh@nvidia.com>
Signed-off-by: default avatarVinod Koul <vinod.koul@intel.com>
parent b2d8984f
...@@ -804,6 +804,9 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_slave_single( ...@@ -804,6 +804,9 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_slave_single(
sg_dma_address(&sg) = buf; sg_dma_address(&sg) = buf;
sg_dma_len(&sg) = len; sg_dma_len(&sg) = len;
if (!chan || !chan->device || !chan->device->device_prep_slave_sg)
return NULL;
return chan->device->device_prep_slave_sg(chan, &sg, 1, return chan->device->device_prep_slave_sg(chan, &sg, 1,
dir, flags, NULL); dir, flags, NULL);
} }
...@@ -812,6 +815,9 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_slave_sg( ...@@ -812,6 +815,9 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_slave_sg(
struct dma_chan *chan, struct scatterlist *sgl, unsigned int sg_len, struct dma_chan *chan, struct scatterlist *sgl, unsigned int sg_len,
enum dma_transfer_direction dir, unsigned long flags) enum dma_transfer_direction dir, unsigned long flags)
{ {
if (!chan || !chan->device || !chan->device->device_prep_slave_sg)
return NULL;
return chan->device->device_prep_slave_sg(chan, sgl, sg_len, return chan->device->device_prep_slave_sg(chan, sgl, sg_len,
dir, flags, NULL); dir, flags, NULL);
} }
...@@ -823,6 +829,9 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_rio_sg( ...@@ -823,6 +829,9 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_rio_sg(
enum dma_transfer_direction dir, unsigned long flags, enum dma_transfer_direction dir, unsigned long flags,
struct rio_dma_ext *rio_ext) struct rio_dma_ext *rio_ext)
{ {
if (!chan || !chan->device || !chan->device->device_prep_slave_sg)
return NULL;
return chan->device->device_prep_slave_sg(chan, sgl, sg_len, return chan->device->device_prep_slave_sg(chan, sgl, sg_len,
dir, flags, rio_ext); dir, flags, rio_ext);
} }
...@@ -833,6 +842,9 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_cyclic( ...@@ -833,6 +842,9 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_cyclic(
size_t period_len, enum dma_transfer_direction dir, size_t period_len, enum dma_transfer_direction dir,
unsigned long flags) unsigned long flags)
{ {
if (!chan || !chan->device || !chan->device->device_prep_dma_cyclic)
return NULL;
return chan->device->device_prep_dma_cyclic(chan, buf_addr, buf_len, return chan->device->device_prep_dma_cyclic(chan, buf_addr, buf_len,
period_len, dir, flags); period_len, dir, flags);
} }
...@@ -841,6 +853,9 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_interleaved_dma( ...@@ -841,6 +853,9 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_interleaved_dma(
struct dma_chan *chan, struct dma_interleaved_template *xt, struct dma_chan *chan, struct dma_interleaved_template *xt,
unsigned long flags) unsigned long flags)
{ {
if (!chan || !chan->device || !chan->device->device_prep_interleaved_dma)
return NULL;
return chan->device->device_prep_interleaved_dma(chan, xt, flags); return chan->device->device_prep_interleaved_dma(chan, xt, flags);
} }
...@@ -848,7 +863,7 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_memset( ...@@ -848,7 +863,7 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_memset(
struct dma_chan *chan, dma_addr_t dest, int value, size_t len, struct dma_chan *chan, dma_addr_t dest, int value, size_t len,
unsigned long flags) unsigned long flags)
{ {
if (!chan || !chan->device) if (!chan || !chan->device || !chan->device->device_prep_dma_memset)
return NULL; return NULL;
return chan->device->device_prep_dma_memset(chan, dest, value, return chan->device->device_prep_dma_memset(chan, dest, value,
...@@ -861,6 +876,9 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_sg( ...@@ -861,6 +876,9 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_sg(
struct scatterlist *src_sg, unsigned int src_nents, struct scatterlist *src_sg, unsigned int src_nents,
unsigned long flags) unsigned long flags)
{ {
if (!chan || !chan->device || !chan->device->device_prep_dma_sg)
return NULL;
return chan->device->device_prep_dma_sg(chan, dst_sg, dst_nents, return chan->device->device_prep_dma_sg(chan, dst_sg, dst_nents,
src_sg, src_nents, flags); src_sg, src_nents, flags);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment