diff options
Diffstat (limited to 'include/linux/dmaengine.h')
| -rw-r--r-- | include/linux/dmaengine.h | 36 | 
1 files changed, 35 insertions, 1 deletions
| diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h index 752dbde4cec1..b137fdb56093 100644 --- a/include/linux/dmaengine.h +++ b/include/linux/dmaengine.h @@ -161,6 +161,16 @@ struct dma_interleaved_template {  };  /** + * struct dma_vec - DMA vector + * @addr: Bus address of the start of the vector + * @len: Length in bytes of the DMA vector + */ +struct dma_vec { +	dma_addr_t addr; +	size_t len; +}; + +/**   * enum dma_ctrl_flags - DMA flags to augment operation preparation,   *  control completion, and communicate status.   * @DMA_PREP_INTERRUPT - trigger an interrupt (callback) upon completion of @@ -910,6 +920,10 @@ struct dma_device {  	struct dma_async_tx_descriptor *(*device_prep_dma_interrupt)(  		struct dma_chan *chan, unsigned long flags); +	struct dma_async_tx_descriptor *(*device_prep_peripheral_dma_vec)( +		struct dma_chan *chan, const struct dma_vec *vecs, +		size_t nents, enum dma_transfer_direction direction, +		unsigned long flags);  	struct dma_async_tx_descriptor *(*device_prep_slave_sg)(  		struct dma_chan *chan, struct scatterlist *sgl,  		unsigned int sg_len, enum dma_transfer_direction direction, @@ -973,6 +987,25 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_slave_single(  						  dir, flags, NULL);  } +/** + * dmaengine_prep_peripheral_dma_vec() - Prepare a DMA scatter-gather descriptor + * @chan: The channel to be used for this descriptor + * @vecs: The array of DMA vectors that should be transferred + * @nents: The number of DMA vectors in the array + * @dir: Specifies the direction of the data transfer + * @flags: DMA engine flags + */ +static inline struct dma_async_tx_descriptor *dmaengine_prep_peripheral_dma_vec( +	struct dma_chan *chan, const struct dma_vec *vecs, size_t nents, +	enum dma_transfer_direction dir, unsigned long flags) +{ +	if (!chan || !chan->device || !chan->device->device_prep_peripheral_dma_vec) +		return NULL; + +	return chan->device->device_prep_peripheral_dma_vec(chan, vecs, nents, +							    dir, flags); +} +  static inline struct dma_async_tx_descriptor *dmaengine_prep_slave_sg(  	struct dma_chan *chan, struct scatterlist *sgl,	unsigned int sg_len,  	enum dma_transfer_direction dir, unsigned long flags) @@ -1575,7 +1608,8 @@ int dma_async_device_register(struct dma_device *device);  int dmaenginem_async_device_register(struct dma_device *device);  void dma_async_device_unregister(struct dma_device *device);  int dma_async_device_channel_register(struct dma_device *device, -				      struct dma_chan *chan); +				      struct dma_chan *chan, +				      const char *name);  void dma_async_device_channel_unregister(struct dma_device *device,  					 struct dma_chan *chan);  void dma_run_dependencies(struct dma_async_tx_descriptor *tx); |