2012-03-07 02:34:26 +04:00
/*
* 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
2012-03-07 02:35:07 +04:00
# include <linux/bug.h>
2012-03-07 02:34:26 +04:00
# include <linux/dmaengine.h>
2012-03-07 02:35:47 +04:00
/**
* 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 ;
}
2012-03-07 02:34:46 +04:00
/**
* 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 ;
}
2012-03-07 02:35:07 +04:00
/**
* 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 ;
}
2012-03-07 02:35:27 +04:00
/**
* 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 ;
}
2012-03-07 02:34:26 +04:00
# endif