2019-04-23 10:26:22 +08:00
// SPDX-License-Identifier: GPL-2.0
# ifndef __SPRD_MCDT_H
# define __SPRD_MCDT_H
enum sprd_mcdt_channel_type {
SPRD_MCDT_DAC_CHAN ,
SPRD_MCDT_ADC_CHAN ,
SPRD_MCDT_UNKNOWN_CHAN ,
} ;
enum sprd_mcdt_dma_chan {
SPRD_MCDT_DMA_CH0 ,
SPRD_MCDT_DMA_CH1 ,
SPRD_MCDT_DMA_CH2 ,
SPRD_MCDT_DMA_CH3 ,
SPRD_MCDT_DMA_CH4 ,
} ;
struct sprd_mcdt_chan_callback {
void ( * notify ) ( void * data ) ;
void * data ;
} ;
/**
* struct sprd_mcdt_chan - this struct represents a single channel instance
* @ mcdt : the mcdt controller
* @ id : channel id
* @ fifo_phys : channel fifo physical address which is used for DMA transfer
* @ type : channel type
* @ cb : channel fifo interrupt ' s callback interface to notify the fifo events
* @ dma_enable : indicate if use DMA mode to transfer data
* @ int_enable : indicate if use interrupt mode to notify users to read or
* write data manually
* @ list : used to link into the global list
*
* Note : users should not modify any members of this structure .
*/
struct sprd_mcdt_chan {
struct sprd_mcdt_dev * mcdt ;
u8 id ;
unsigned long fifo_phys ;
enum sprd_mcdt_channel_type type ;
enum sprd_mcdt_dma_chan dma_chan ;
struct sprd_mcdt_chan_callback * cb ;
bool dma_enable ;
bool int_enable ;
struct list_head list ;
} ;
2020-03-05 14:00:53 +08:00
# if IS_ENABLED(CONFIG_SND_SOC_SPRD_MCDT)
2019-04-23 10:26:22 +08:00
struct sprd_mcdt_chan * sprd_mcdt_request_chan ( u8 channel ,
enum sprd_mcdt_channel_type type ) ;
void sprd_mcdt_free_chan ( struct sprd_mcdt_chan * chan ) ;
int sprd_mcdt_chan_write ( struct sprd_mcdt_chan * chan , char * tx_buf , u32 size ) ;
int sprd_mcdt_chan_read ( struct sprd_mcdt_chan * chan , char * rx_buf , u32 size ) ;
int sprd_mcdt_chan_int_enable ( struct sprd_mcdt_chan * chan , u32 water_mark ,
struct sprd_mcdt_chan_callback * cb ) ;
void sprd_mcdt_chan_int_disable ( struct sprd_mcdt_chan * chan ) ;
int sprd_mcdt_chan_dma_enable ( struct sprd_mcdt_chan * chan ,
enum sprd_mcdt_dma_chan dma_chan , u32 water_mark ) ;
void sprd_mcdt_chan_dma_disable ( struct sprd_mcdt_chan * chan ) ;
# else
struct sprd_mcdt_chan * sprd_mcdt_request_chan ( u8 channel ,
enum sprd_mcdt_channel_type type )
{
return NULL ;
}
void sprd_mcdt_free_chan ( struct sprd_mcdt_chan * chan )
{ }
int sprd_mcdt_chan_write ( struct sprd_mcdt_chan * chan , char * tx_buf , u32 size )
{
return - EINVAL ;
}
int sprd_mcdt_chan_read ( struct sprd_mcdt_chan * chan , char * rx_buf , u32 size )
{
return 0 ;
}
int sprd_mcdt_chan_int_enable ( struct sprd_mcdt_chan * chan , u32 water_mark ,
struct sprd_mcdt_chan_callback * cb )
{
return - EINVAL ;
}
void sprd_mcdt_chan_int_disable ( struct sprd_mcdt_chan * chan )
{ }
int sprd_mcdt_chan_dma_enable ( struct sprd_mcdt_chan * chan ,
enum sprd_mcdt_dma_chan dma_chan , u32 water_mark )
{
return - EINVAL ;
}
void sprd_mcdt_chan_dma_disable ( struct sprd_mcdt_chan * chan )
{ }
# endif
# endif /* __SPRD_MCDT_H */