/*------------------------------------------------------------------------------------------*\ * * $Id$ * * $Log$ * \*------------------------------------------------------------------------------------------*/ #include #include #include "sangam_atm/dsl_hal_api.h" #include "sangam_atm/dsl_hal_register.h" #include "sangam_atm/dsl_hal_support.h" #include "dev_host_mcsp.h" #include "mcbsp.h" #if MCSP_API != 1 #error MCSP muss auf 1 definiert sein !! #endif /*-------------------------------------------------------------------------------------*\ \*-------------------------------------------------------------------------------------*/ void (*mcsp_rx_handler)(unsigned char *); void (*mcsp_tx_handler)(unsigned char **); unsigned int mscp_buffsize; unsigned int mcsp_disable_value; unsigned int mcsp_buffer_index[2]; unsigned int mcsp_dsp_buffer[2][2]; #define MCSP_TX 0 #define MCSP_RX 1 #define MCSP1_BASE 0x02020000 /*-------------------------------------------------------------------------------------*\ \*-------------------------------------------------------------------------------------*/ void mcsp_handle_rx_interrupt(void) { unsigned int dsl_addr; if(mcsp_rx_handler == 0) { mcsp_exit(); return; } dsl_addr = dslhal_support_hostDspAddressTranslate(mcsp_dsp_buffer[MCSP_RX][mcsp_buffer_index[MCSP_RX]]); (*mcsp_rx_handler)((unsigned char *)dsl_addr); /*---------------------------------------------------------------------------------*\ * Tx DMA aufsetzen \*---------------------------------------------------------------------------------*/ dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x614); /*--- tx dest reload adresss ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return; } DSLHAL_REG32(dsl_addr) = mcsp_dsp_buffer[MCSP_RX][mcsp_buffer_index[MCSP_RX]]; dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x618); /*--- rx reload length ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return; } DSLHAL_REG32(dsl_addr) = mscp_buffsize >> 2; dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x61C); /*--- rx reload control ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return; } DSLHAL_REG32(dsl_addr) = (1U << 31) | (2 << 0); /*---------------------------------------------------------------------------------*\ \*---------------------------------------------------------------------------------*/ mcsp_buffer_index[MCSP_RX] = !mcsp_buffer_index[MCSP_RX]; } /*-------------------------------------------------------------------------------------*\ \*-------------------------------------------------------------------------------------*/ void mcsp_handle_tx_interrupt(void) { unsigned int dsl_addr; unsigned char *tx_data; if(mcsp_tx_handler == 0) { mcsp_exit(); return; } (*mcsp_tx_handler)(&tx_data); memcpy((void *)mcsp_dsp_buffer[MCSP_TX][mcsp_buffer_index[MCSP_TX]], tx_data, mscp_buffsize); /*---------------------------------------------------------------------------------*\ * Tx DMA aufsetzen \*---------------------------------------------------------------------------------*/ dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x410); /*--- tx source reload adresss ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return; } DSLHAL_REG32(dsl_addr) = mcsp_dsp_buffer[MCSP_TX][mcsp_buffer_index[MCSP_TX]]; dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x418); /*--- tx reload length ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return; } DSLHAL_REG32(dsl_addr) = mscp_buffsize >> 2; dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x41C); /*--- tx reload control ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return; } DSLHAL_REG32(dsl_addr) = (1U << 31) | (2 << 0); /*---------------------------------------------------------------------------------*\ \*---------------------------------------------------------------------------------*/ mcsp_buffer_index[MCSP_TX] = !mcsp_buffer_index[MCSP_TX]; } /*-------------------------------------------------------------------------------------*\ \*-------------------------------------------------------------------------------------*/ void mcsp_init(tidsl_t *ptidsl) { unsigned dsl_addr; DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface; DEV_HOST_spStructure_t mcsp_Structure; /*---------------------------------------------------------------------------------*\ * Buffer adressen auf dem DSP \*---------------------------------------------------------------------------------*/ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr; dsl_addr = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface, sizeof(DEV_HOST_dspOamSharedInterface_t)); dsl_addr = dslhal_support_blockRead(dspOamSharedInterface.sp1Structure_p, &mcsp_Structure, sizeof(mcsp_Structure)); mcsp_dsp_buffer[MCSP_TX][0] = (unsigned int)mcsp_Structure.dmaBuffer_p + (0 * (mcsp_Structure.dmaBufferSize >> 2)); mcsp_dsp_buffer[MCSP_TX][1] = (unsigned int)mcsp_Structure.dmaBuffer_p + (1 * (mcsp_Structure.dmaBufferSize >> 2)); mcsp_dsp_buffer[MCSP_RX][0] = (unsigned int)mcsp_Structure.dmaBuffer_p + (2 * (mcsp_Structure.dmaBufferSize >> 2)); mcsp_dsp_buffer[MCSP_RX][1] = (unsigned int)mcsp_Structure.dmaBuffer_p + (3 * (mcsp_Structure.dmaBufferSize >> 2)); } /*-------------------------------------------------------------------------------------*\ \*-------------------------------------------------------------------------------------*/ unsigned int mcsp_activate(unsigned int Buffsize, void (*from_mcsp_handler)(unsigned char *), void (*to_mcsb_handler)(unsigned char **)) { unsigned dsl_addr; if(Buffsize > (DEV_HOST_TOTAL_SP1_BUFFER_SIZE / 4)) { printk("Buffer size too large ...\n"); return 1; } mcsp_rx_handler = from_mcsp_handler; mcsp_tx_handler = to_mcsb_handler; mscp_buffsize = Buffsize; /*---------------------------------------------------------------------------------*\ * McSP auf DSP initialisieren \*---------------------------------------------------------------------------------*/ dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + (_MCBSP_SPCR_OFFSET << 2)); if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } mcsp_disable_value = ( (( /*--- MCBSP_SPCR_FRST_YES | ---*/ MCBSP_SPCR_FRST_NO | 0 ) << _MCBSP_SPCR_FRST_SHIFT) | (( MCBSP_SPCR_GRST_YES | /*--- MCBSP_SPCR_GRST_NO | ---*/ 0 ) << _MCBSP_SPCR_GRST_SHIFT) | (( MCBSP_SPCR_XINTM_XRDY | /*--- MCBSP_SPCR_XINTM_EOS | ---*/ /*--- MCBSP_SPCR_XINTM_FRM | ---*/ /*--- MCBSP_SPCR_XINTM_XSYNCERR | ---*/ 0 ) << _MCBSP_SPCR_XINTM_SHIFT) | (( MCBSP_SPCR_XSYNCERR_NO | /*--- MCBSP_SPCR_XSYNCERR_YES | ---*/ 0 ) << _MCBSP_SPCR_XSYNCERR_SHIFT) | (( MCBSP_SPCR_XEMPTY_YES | /*--- MCBSP_SPCR_XEMPTY_NO | ---*/ 0 ) << _MCBSP_SPCR_XEMPTY_SHIFT) | (( /*--- MCBSP_SPCR_XRDY_NO | ---*/ MCBSP_SPCR_XRDY_YES | 0 ) << _MCBSP_SPCR_XRDY_SHIFT) | (( MCBSP_SPCR_XRST_YES | /*--- MCBSP_SPCR_XRST_NO | ---*/ 0 ) << _MCBSP_SPCR_XRST_SHIFT) | (( MCBSP_SPCR_DLB_OFF | /*--- MCBSP_SPCR_DLB_ON | ---*/ 0 ) << _MCBSP_SPCR_DLB_SHIFT) | (( MCBSP_SPCR_RJUST_RZF | /*--- MCBSP_SPCR_RJUST_RSE | ---*/ /*--- MCBSP_SPCR_RJUST_LZF | ---*/ 0 ) << _MCBSP_SPCR_RJUST_SHIFT) | (( MCBSP_SPCR_CLKSTP_DISABLE | /*--- MCBSP_SPCR_CLKSTP_NODELAY | ---*/ /*--- MCBSP_SPCR_CLKSTP_DELAY | ---*/ 0 ) << _MCBSP_SPCR_CLKSTP_SHIFT) | (( MCBSP_SPCR_RINTM_RRDY | /*--- MCBSP_SPCR_RINTM_EOS | ---*/ /*--- MCBSP_SPCR_RINTM_FRM | ---*/ /*--- MCBSP_SPCR_RINTM_RSYNCERR | ---*/ 0 ) << _MCBSP_SPCR_RINTM_SHIFT) | (( MCBSP_SPCR_RSYNCERR_NO | /*--- MCBSP_SPCR_RSYNCERR_YES | ---*/ 0 ) << _MCBSP_SPCR_RSYNCERR_SHIFT) | (( MCBSP_SPCR_RFULL_NO | /*--- MCBSP_SPCR_RFULL_YES | ---*/ 0 ) << _MCBSP_SPCR_RFULL_SHIFT) | (( /*--- MCBSP_SPCR_RRDY_NO | ---*/ MCBSP_SPCR_RRDY_YES | 0 ) << _MCBSP_SPCR_RRDY_SHIFT) | (( MCBSP_SPCR_RRST_YES | /*--- MCBSP_SPCR_RRST_NO | ---*/ 0 ) << _MCBSP_SPCR_RRST_SHIFT) | 0); DSLHAL_REG32(dsl_addr) = mcsp_disable_value; /*---------------------------------------------------------------------------------*\ \*---------------------------------------------------------------------------------*/ dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + (_MCBSP_PCR_OFFSET << 2)); if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } DSLHAL_REG32(dsl_addr) = ( (( MCBSP_PCR_XIOEN_SP | /*--- MCBSP_PCR_XIOEN_GPIO | ---*/ 0 ) << _MCBSP_PCR_XIOEN_SHIFT) | (( MCBSP_PCR_RIOEN_SP | /*--- MCBSP_PCR_RIOEN_GPIO | ---*/ 0 ) << _MCBSP_PCR_RIOEN_SHIFT) | (( MCBSP_PCR_FSXM_EXTERNAL | /*--- MCBSP_PCR_FSXM_INTERNAL | ---*/ 0 ) << _MCBSP_PCR_FSXM_SHIFT) | (( MCBSP_PCR_FSRM_EXTERNAL | /*--- MCBSP_PCR_FSRM_INTERNAL | ---*/ 0 ) << _MCBSP_PCR_FSRM_SHIFT) | (( /*--- MCBSP_PCR_CLKXM_INPUT | ---*/ MCBSP_PCR_CLKXM_OUTPUT | 0 ) << _MCBSP_PCR_CLKXM_SHIFT) | (( /*--- MCBSP_PCR_CLKRM_INPUT | ---*/ MCBSP_PCR_CLKRM_OUTPUT | 0 ) << _MCBSP_PCR_CLKRM_SHIFT) | (( MCBSP_PCR_CLKSSTAT_0 | /*--- MCBSP_PCR_CLKSSTAT_1 | ---*/ 0 ) << _MCBSP_PCR_CLKSSTAT_SHIFT) | (( MCBSP_PCR_DXSTAT_0 | /*--- MCBSP_PCR_DXSTAT_1 | ---*/ 0 ) << _MCBSP_PCR_DXSTAT_SHIFT) | (( MCBSP_PCR_DRSTAT_0 | /*--- MCBSP_PCR_DRSTAT_1 | ---*/ 0 ) << _MCBSP_PCR_DRSTAT_SHIFT) | (( MCBSP_PCR_FSXP_ACTIVEHIGH | /*--- MCBSP_PCR_FSXP_ACTIVELOW | ---*/ 0 ) << _MCBSP_PCR_FSXP_SHIFT) | (( MCBSP_PCR_FSRP_ACTIVEHIGH | /*--- MCBSP_PCR_FSRP_ACTIVELOW | ---*/ 0 ) << _MCBSP_PCR_FSRP_SHIFT) | (( MCBSP_PCR_CLKXP_RISING | /*--- MCBSP_PCR_CLKXP_FALLING | ---*/ 0 ) << _MCBSP_PCR_CLKXP_SHIFT) | (( MCBSP_PCR_CLKRP_FALLING | /*--- MCBSP_PCR_CLKRP_RISING | ---*/ 0 ) << _MCBSP_PCR_CLKRP_SHIFT) | 0); /*---------------------------------------------------------------------------------*\ \*---------------------------------------------------------------------------------*/ dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + (_MCBSP_SRGR_OFFSET << 2)); if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } DSLHAL_REG32(dsl_addr) = ( (( /*--- MCBSP_SRGR_GSYNC_FREE | ---*/ MCBSP_SRGR_GSYNC_SYNC | 0 ) << _MCBSP_SRGR_GSYNC_SHIFT) | (( /*--- MCBSP_SRGR_CLKSP_RISING | ---*/ MCBSP_SRGR_CLKSP_FALLING | 0 ) << _MCBSP_SRGR_CLKSP_SHIFT) | (( MCBSP_SRGR_CLKSM_CLKS | /*--- MCBSP_SRGR_CLKSM_INTERNAL | ---*/ 0 ) << _MCBSP_SRGR_CLKSM_SHIFT) | (( MCBSP_SRGR_FSGM_DXR2XSR | /*--- MCBSP_SRGR_FSGM_FSG | ---*/ 0 ) << _MCBSP_SRGR_FSGM_SHIFT) | (( 0 | 0 ) << _MCBSP_SRGR_FPER_SHIFT) | (( 0 | 0 ) << _MCBSP_SRGR_FWID_SHIFT) | (( 1 | 0 ) << _MCBSP_SRGR_CLKGDV_SHIFT) | 0); /*---------------------------------------------------------------------------------*\ \*---------------------------------------------------------------------------------*/ dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + (_MCBSP_XCR_OFFSET << 2)); if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } DSLHAL_REG32(dsl_addr) = ( (( MCBSP_XCR_XPHASE_SINGLE | /*--- MCBSP_XCR_XPHASE_DUAL | ---*/ 0 ) << _MCBSP_XCR_XPHASE_SHIFT) | (( 0 | /*--- Transmit Frame Length in phase 2 ---*/ 0 ) << _MCBSP_XCR_XFRLEN2_SHIFT) | (( MCBSP_XCR_XWDLEN2_8BIT | /*--- MCBSP_XCR_XWDLEN2_12BIT | ---*/ /*--- MCBSP_XCR_XWDLEN2_16BIT | ---*/ /*--- MCBSP_XCR_XWDLEN2_20BIT | ---*/ /*--- MCBSP_XCR_XWDLEN2_24BIT | ---*/ /*--- MCBSP_XCR_XWDLEN2_32BIT | ---*/ 0 ) << _MCBSP_XCR_XWDLEN2_SHIFT) | (( MCBSP_XCR_XCOMPAND_MSB | /*--- MCBSP_XCR_XCOMPAND_8BITLSB | ---*/ /*--- MCBSP_XCR_XCOMPAND_ULAW | ---*/ /*--- MCBSP_XCR_XCOMPAND_ALAW | ---*/ 0 ) << _MCBSP_XCR_XCOMPAND_SHIFT) | (( /*--- MCBSP_XCR_XFIG_NO | ---*/ MCBSP_XCR_XFIG_YES | 0 ) << _MCBSP_XCR_XFIG_SHIFT) | (( MCBSP_XCR_XDATDLY_0BIT | /*--- MCBSP_XCR_XDATDLY_1BIT | ---*/ /*--- MCBSP_XCR_XDATDLY_2BIT | ---*/ 0 ) << _MCBSP_XCR_XDATDLY_SHIFT) | (( 0 | 0 ) << _MCBSP_XCR_XFRLEN1_SHIFT) | (( /*--- MCBSP_XCR_XWDLEN1_8BIT | ---*/ /*--- MCBSP_XCR_XWDLEN1_12BIT | ---*/ /*--- MCBSP_XCR_XWDLEN1_16BIT | ---*/ /*--- MCBSP_XCR_XWDLEN1_20BIT | ---*/ /*--- MCBSP_XCR_XWDLEN1_24BIT | ---*/ MCBSP_XCR_XWDLEN1_32BIT | 0 ) << _MCBSP_XCR_XWDLEN1_SHIFT) | 0); /*---------------------------------------------------------------------------------*\ \*---------------------------------------------------------------------------------*/ dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + (_MCBSP_RCR_OFFSET << 2)); if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } DSLHAL_REG32(dsl_addr) = ( (( MCBSP_RCR_RPHASE_SINGLE | /*--- MCBSP_RCR_RPHASE_DUAL | ---*/ 0 ) << _MCBSP_RCR_RPHASE_SHIFT) | (( 0 | /*--- Transmit Frame Length in phase 2 ---*/ 0 ) << _MCBSP_RCR_RFRLEN2_SHIFT) | (( MCBSP_RCR_RWDLEN2_8BIT | /*--- MCBSP_RCR_RWDLEN2_12BIT | ---*/ /*--- MCBSP_RCR_RWDLEN2_16BIT | ---*/ /*--- MCBSP_RCR_RWDLEN2_20BIT | ---*/ /*--- MCBSP_RCR_RWDLEN2_24BIT | ---*/ /*--- MCBSP_RCR_RWDLEN2_32BIT | ---*/ 0 ) << _MCBSP_RCR_RWDLEN2_SHIFT) | (( MCBSP_RCR_RCOMPAND_MSB | /*--- MCBSP_RCR_RCOMPAND_8BITLSB | ---*/ /*--- MCBSP_RCR_RCOMPAND_ULAW | ---*/ /*--- MCBSP_RCR_RCOMPAND_ALAW | ---*/ 0 ) << _MCBSP_RCR_RCOMPAND_SHIFT) | (( /*--- MCBSP_RCR_RFIG_NO | ---*/ MCBSP_RCR_RFIG_YES | 0 ) << _MCBSP_RCR_RFIG_SHIFT) | (( MCBSP_RCR_RDATDLY_0BIT | /*--- MCBSP_RCR_RDATDLY_1BIT | ---*/ /*--- MCBSP_RCR_RDATDLY_2BIT | ---*/ 0 ) << _MCBSP_RCR_RDATDLY_SHIFT) | (( 0 | 0 ) << _MCBSP_RCR_RFRLEN1_SHIFT) | (( /*--- MCBSP_RCR_RWDLEN1_12BIT | ---*/ /*--- MCBSP_RCR_RWDLEN1_16BIT | ---*/ /*--- MCBSP_RCR_RWDLEN1_20BIT | ---*/ /*--- MCBSP_RCR_RWDLEN1_24BIT | ---*/ MCBSP_RCR_RWDLEN1_32BIT | 0 ) << _MCBSP_RCR_RWDLEN1_SHIFT) | 0); /*---------------------------------------------------------------------------------*\ * DMA aufsetzen \*---------------------------------------------------------------------------------*/ dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x400); /*--- tx source adresss ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } DSLHAL_REG32(dsl_addr) = mcsp_dsp_buffer[MCSP_TX][0]; dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x410); /*--- tx source reload adresss ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } DSLHAL_REG32(dsl_addr) = mcsp_dsp_buffer[MCSP_TX][1]; dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x408); /*--- tx length ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } DSLHAL_REG32(dsl_addr) = Buffsize >> 2; dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x418); /*--- tx reload length ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } DSLHAL_REG32(dsl_addr) = Buffsize >> 2; dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x40C); /*--- tx control ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } DSLHAL_REG32(dsl_addr) = (1U << 31) | (2 << 0); dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x41C); /*--- tx reload control ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } DSLHAL_REG32(dsl_addr) = (1U << 31) | (2 << 0); /*---------------------------------------------------------------------------------*\ \*---------------------------------------------------------------------------------*/ dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x604); /*--- rx dest adresss ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } DSLHAL_REG32(dsl_addr) = mcsp_dsp_buffer[MCSP_RX][0]; dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x614); /*--- rx dest reload adresss ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } DSLHAL_REG32(dsl_addr) = mcsp_dsp_buffer[MCSP_RX][1]; dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x608); /*--- rx length ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } DSLHAL_REG32(dsl_addr) = Buffsize >> 2; dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x618); /*--- rx reload length ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } DSLHAL_REG32(dsl_addr) = Buffsize >> 2; dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x60C); /*--- rx control ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } DSLHAL_REG32(dsl_addr) = (1U << 31) | (2 << 0); dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x61C); /*--- rx reload control ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } DSLHAL_REG32(dsl_addr) = (1U << 31) | (2 << 0); /*---------------------------------------------------------------------------------*\ Take the sample rate generator out of reset by setting /GRST=1 in SPCR. \*---------------------------------------------------------------------------------*/ dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + (_MCBSP_SPCR_OFFSET << 2)); if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } DSLHAL_REG32(dsl_addr) = (mcsp_disable_value & ~(_MCBSP_SPCR_GRST_MASK | _MCBSP_SPCR_XRST_MASK | _MCBSP_SPCR_RRST_MASK)) | (( /*--- MCBSP_SPCR_XRST_YES | ---*/ MCBSP_SPCR_XRST_NO | 0 ) << _MCBSP_SPCR_XRST_SHIFT) | (( /*--- MCBSP_SPCR_RRST_YES | ---*/ MCBSP_SPCR_RRST_NO | 0 ) << _MCBSP_SPCR_RRST_SHIFT) | (( /*--- MCBSP_SPCR_GRST_YES | ---*/ MCBSP_SPCR_GRST_NO | 0 ) << _MCBSP_SPCR_GRST_SHIFT); return 0; } /*-------------------------------------------------------------------------------------*\ \*-------------------------------------------------------------------------------------*/ void mcsp_deactivate(void) { mcsp_exit(); } /*-------------------------------------------------------------------------------------*\ \*-------------------------------------------------------------------------------------*/ void mcsp_exit(void) { unsigned int dsl_addr; dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + (_MCBSP_SPCR_OFFSET << 2)); if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return; } DSLHAL_REG32(dsl_addr) = mcsp_disable_value; dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x40C); /*--- tx control ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return; } DSLHAL_REG32(dsl_addr) = (0U << 31) | (2 << 0); dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x60C); /*--- rx control ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return; } DSLHAL_REG32(dsl_addr) = (0U << 31) | (2 << 0); dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x41C); /*--- tx reload control ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return; } DSLHAL_REG32(dsl_addr) = (0U << 31) | (2 << 0); dsl_addr = dslhal_support_hostDspAddressTranslate((unsigned int)MCSP1_BASE + 0x61C); /*--- rx reload control ---*/ if(dsl_addr == DSLHAL_ERROR_ADDRESS_TRANSLATE) { printk("dslhal_support_hostDspAddressTranslate failed\n"); return; } DSLHAL_REG32(dsl_addr) = (0U << 31) | (2 << 0); mcsp_rx_handler = 0; mcsp_tx_handler = 0; } /*-------------------------------------------------------------------------------------*\ \*-------------------------------------------------------------------------------------*/ EXPORT_SYMBOL(mcsp_activate); EXPORT_SYMBOL(mcsp_deactivate);