| /* | 
 |  * The contents of this file are private to DMA engine drivers, and is not | 
 |  * part of the API to be used by DMA engine users. | 
 |  */ | 
 | #ifndef DMAENGINE_H | 
 | #define DMAENGINE_H | 
 |  | 
 | #include <linux/bug.h> | 
 | #include <linux/dmaengine.h> | 
 |  | 
 | /** | 
 |  * dma_cookie_init - initialize the cookies for a DMA channel | 
 |  * @chan: dma channel to initialize | 
 |  */ | 
 | static inline void dma_cookie_init(struct dma_chan *chan) | 
 | { | 
 | 	chan->cookie = DMA_MIN_COOKIE; | 
 | 	chan->completed_cookie = DMA_MIN_COOKIE; | 
 | } | 
 |  | 
 | /** | 
 |  * dma_cookie_assign - assign a DMA engine cookie to the descriptor | 
 |  * @tx: descriptor needing cookie | 
 |  * | 
 |  * Assign a unique non-zero per-channel cookie to the descriptor. | 
 |  * Note: caller is expected to hold a lock to prevent concurrency. | 
 |  */ | 
 | static inline dma_cookie_t dma_cookie_assign(struct dma_async_tx_descriptor *tx) | 
 | { | 
 | 	struct dma_chan *chan = tx->chan; | 
 | 	dma_cookie_t cookie; | 
 |  | 
 | 	cookie = chan->cookie + 1; | 
 | 	if (cookie < DMA_MIN_COOKIE) | 
 | 		cookie = DMA_MIN_COOKIE; | 
 | 	tx->cookie = chan->cookie = cookie; | 
 |  | 
 | 	return cookie; | 
 | } | 
 |  | 
 | /** | 
 |  * dma_cookie_complete - complete a descriptor | 
 |  * @tx: descriptor to complete | 
 |  * | 
 |  * Mark this descriptor complete by updating the channels completed | 
 |  * cookie marker.  Zero the descriptors cookie to prevent accidental | 
 |  * repeated completions. | 
 |  * | 
 |  * Note: caller is expected to hold a lock to prevent concurrency. | 
 |  */ | 
 | static inline void dma_cookie_complete(struct dma_async_tx_descriptor *tx) | 
 | { | 
 | 	BUG_ON(tx->cookie < DMA_MIN_COOKIE); | 
 | 	tx->chan->completed_cookie = tx->cookie; | 
 | 	tx->cookie = 0; | 
 | } | 
 |  | 
 | /** | 
 |  * dma_cookie_status - report cookie status | 
 |  * @chan: dma channel | 
 |  * @cookie: cookie we are interested in | 
 |  * @state: dma_tx_state structure to return last/used cookies | 
 |  * | 
 |  * Report the status of the cookie, filling in the state structure if | 
 |  * non-NULL.  No locking is required. | 
 |  */ | 
 | static inline enum dma_status dma_cookie_status(struct dma_chan *chan, | 
 | 	dma_cookie_t cookie, struct dma_tx_state *state) | 
 | { | 
 | 	dma_cookie_t used, complete; | 
 |  | 
 | 	used = chan->cookie; | 
 | 	complete = chan->completed_cookie; | 
 | 	barrier(); | 
 | 	if (state) { | 
 | 		state->last = complete; | 
 | 		state->used = used; | 
 | 		state->residue = 0; | 
 | 	} | 
 | 	return dma_async_is_complete(cookie, complete, used); | 
 | } | 
 |  | 
 | static inline void dma_set_residue(struct dma_tx_state *state, u32 residue) | 
 | { | 
 | 	if (state) | 
 | 		state->residue = residue; | 
 | } | 
 |  | 
 | #endif |