@ -39,33 +39,9 @@
static const char msg_ld_oom [ ] = " No free memory for link descriptor \n " ;
static void dma_init ( struct fsldma_chan * chan )
{
/* Reset the channel */
DMA_OUT ( chan , & chan - > regs - > mr , 0 , 32 ) ;
switch ( chan - > feature & FSL_DMA_IP_MASK ) {
case FSL_DMA_IP_85XX :
/* Set the channel to below modes:
* EIE - Error interrupt enable
* EOSIE - End of segments interrupt enable ( basic mode )
* EOLNIE - End of links interrupt enable
* BWC - Bandwidth sharing among channels
*/
DMA_OUT ( chan , & chan - > regs - > mr , FSL_DMA_MR_BWC
| FSL_DMA_MR_EIE | FSL_DMA_MR_EOLNIE
| FSL_DMA_MR_EOSIE , 32 ) ;
break ;
case FSL_DMA_IP_83XX :
/* Set the channel to below modes:
* EOTIE - End - of - transfer interrupt enable
* PRC_RM - PCI read multiple
*/
DMA_OUT ( chan , & chan - > regs - > mr , FSL_DMA_MR_EOTIE
| FSL_DMA_MR_PRC_RM , 32 ) ;
break ;
}
}
/*
* Register Helpers
*/
static void set_sr ( struct fsldma_chan * chan , u32 val )
{
@ -77,6 +53,30 @@ static u32 get_sr(struct fsldma_chan *chan)
return DMA_IN ( chan , & chan - > regs - > sr , 32 ) ;
}
static void set_cdar ( struct fsldma_chan * chan , dma_addr_t addr )
{
DMA_OUT ( chan , & chan - > regs - > cdar , addr | FSL_DMA_SNEN , 64 ) ;
}
static dma_addr_t get_cdar ( struct fsldma_chan * chan )
{
return DMA_IN ( chan , & chan - > regs - > cdar , 64 ) & ~ FSL_DMA_SNEN ;
}
static dma_addr_t get_ndar ( struct fsldma_chan * chan )
{
return DMA_IN ( chan , & chan - > regs - > ndar , 64 ) ;
}
static u32 get_bcr ( struct fsldma_chan * chan )
{
return DMA_IN ( chan , & chan - > regs - > bcr , 32 ) ;
}
/*
* Descriptor Helpers
*/
static void set_desc_cnt ( struct fsldma_chan * chan ,
struct fsl_dma_ld_hw * hw , u32 count )
{
@ -113,24 +113,49 @@ static void set_desc_next(struct fsldma_chan *chan,
hw - > next_ln_addr = CPU_TO_DMA ( chan , snoop_bits | next , 64 ) ;
}
static void set_cdar ( struct fsldma_chan * chan , dma_addr_t addr )
static void set_ld_eol ( struct fsldma_chan * chan ,
struct fsl_desc_sw * desc )
{
DMA_OUT ( chan , & chan - > regs - > cdar , addr | FSL_DMA_SNEN , 64 ) ;
}
u64 snoop_bits ;
static dma_addr_t get_cdar ( struct fsldma_chan * chan )
{
return DMA_IN ( chan , & chan - > regs - > cdar , 64 ) & ~ FSL_DMA_SNEN ;
}
snoop_bits = ( ( chan - > feature & FSL_DMA_IP_MASK ) = = FSL_DMA_IP_83XX )
? FSL_DMA_SNEN : 0 ;
static dma_addr_t get_ndar ( struct fsldma_chan * chan )
{
return DMA_IN ( chan , & chan - > regs - > ndar , 64 ) ;
desc - > hw . next_ln_addr = CPU_TO_DMA ( chan ,
DMA_TO_CPU ( chan , desc - > hw . next_ln_addr , 64 ) | FSL_DMA_EOL
| snoop_bits , 64 ) ;
}
static u32 get_bcr ( struct fsldma_chan * chan )
/*
* DMA Engine Hardware Control Helpers
*/
static void dma_init ( struct fsldma_chan * chan )
{
return DMA_IN ( chan , & chan - > regs - > bcr , 32 ) ;
/* Reset the channel */
DMA_OUT ( chan , & chan - > regs - > mr , 0 , 32 ) ;
switch ( chan - > feature & FSL_DMA_IP_MASK ) {
case FSL_DMA_IP_85XX :
/* Set the channel to below modes:
* EIE - Error interrupt enable
* EOSIE - End of segments interrupt enable ( basic mode )
* EOLNIE - End of links interrupt enable
* BWC - Bandwidth sharing among channels
*/
DMA_OUT ( chan , & chan - > regs - > mr , FSL_DMA_MR_BWC
| FSL_DMA_MR_EIE | FSL_DMA_MR_EOLNIE
| FSL_DMA_MR_EOSIE , 32 ) ;
break ;
case FSL_DMA_IP_83XX :
/* Set the channel to below modes:
* EOTIE - End - of - transfer interrupt enable
* PRC_RM - PCI read multiple
*/
DMA_OUT ( chan , & chan - > regs - > mr , FSL_DMA_MR_EOTIE
| FSL_DMA_MR_PRC_RM , 32 ) ;
break ;
}
}
static int dma_is_idle ( struct fsldma_chan * chan )
@ -185,19 +210,6 @@ static void dma_halt(struct fsldma_chan *chan)
dev_err ( chan - > dev , " DMA halt timeout! \n " ) ;
}
static void set_ld_eol ( struct fsldma_chan * chan ,
struct fsl_desc_sw * desc )
{
u64 snoop_bits ;
snoop_bits = ( ( chan - > feature & FSL_DMA_IP_MASK ) = = FSL_DMA_IP_83XX )
? FSL_DMA_SNEN : 0 ;
desc - > hw . next_ln_addr = CPU_TO_DMA ( chan ,
DMA_TO_CPU ( chan , desc - > hw . next_ln_addr , 64 ) | FSL_DMA_EOL
| snoop_bits , 64 ) ;
}
/**
* fsl_chan_set_src_loop_size - Set source address hold transfer size
* @ chan : Freescale DMA channel