static int __init mp_init(void) { MV_PHONE *mp; int i; printk("%s, %s\n", MP_NAME, MP_VER); TRC_INIT(); TRC_REC("->%s\n",__FUNCTION__); /* General TDM and SLIC init */ TRC_REC("tdm init\n"); mvTdmInit(); mvTdmShowProperties(); /* per channel init */ for(i=0; i<MV_TDM_MAX_CHANNELS; i++) { printk("Initializing channel %d\n",i); TRC_REC("ch%d init\n",i); mp = get_mp(i); mp->p.board = mp->ch = i; mp->p.f_op = &mp_fops; mp->p.open = mp_open; mp->irq = MP_IRQ; init_waitqueue_head(&mp->poll_q); if(mvTdmChInit(&mp->p, i, &(mp->ch_info)) == MV_OK) { /*mvTdmChShowProperties(mp->ch_info);*/ phone_register_device(&mp->p, PHONE_UNIT_ANY); printk("phone%d registered\n",i); } else { printk("%s: error, failed to init ch%d\n",__FUNCTION__,i); } } TRC_REC("<-%s\n",__FUNCTION__); return 0; }
MV_STATUS mvTdmInit(mv_tdm_params_t* tdmParams) { MV_U8 ch, sample; MV_U32 pcmCtrlReg; MV_TRC_REC("->%s\n",__FUNCTION__); mvTdmShowProperties(); /* Init TDM windows address decoding */ if (mvTdmWinInit() != MV_OK) { return MV_ERROR; } /* Init globals */ rxInt = txInt = 0; tdmEnable = 0; spiMode = mvBoardTdmSpiModeGet(); tdmBandMode = tdmParams->bandMode; pcmFormat = tdmParams->pcmFormat; if((tdmParams->samplePeriod < MV_TDM_BASE_SAMPLE_PERIOD) || (tdmParams->samplePeriod > MV_TDM_MAX_SAMPLE_PERIOD)) { factor = 1; /* use base sample period(10ms) */ } else { factor = (tdmParams->samplePeriod / MV_TDM_BASE_SAMPLE_PERIOD); } /* Set sample size for further TDM configuration */ sample = (pcmFormat == MV_PCM_FORMAT_LINEAR ? 2 : 1); /* Allocate aggregated buffers for data transport */ MV_TRC_REC("allocate %d bytes for aggregated buffer\n", MV_TDM_AGGR_BUFF_SIZE(pcmFormat, tdmBandMode, factor)); rxAggrBuffVirt = (MV_U8*)mvOsIoCachedMalloc(NULL, MV_TDM_AGGR_BUFF_SIZE(pcmFormat, tdmBandMode, factor), &rxAggrBuffPhys,NULL); txAggrBuffVirt = (MV_U8*)mvOsIoCachedMalloc(NULL, MV_TDM_AGGR_BUFF_SIZE(pcmFormat, tdmBandMode, factor), &txAggrBuffPhys,NULL); if(!rxAggrBuffVirt || !txAggrBuffVirt) { mvOsPrintf("%s: error malloc failed\n",__FUNCTION__); return MV_NO_RESOURCE; } /* Config TDM */ MV_REG_BIT_RESET(TDM_SPI_MUX_REG, 1); /* enable TDM/SPI interface */ MV_REG_BIT_SET(TDM_MISC_REG, BIT0); /* sw reset to TDM for 5181L-A1 & up */ MV_REG_WRITE(INT_RESET_SELECT_REG,CLEAR_ON_ZERO); /* int cause is not clear on read */ MV_REG_WRITE(INT_EVENT_MASK_REG,0x3ffff); /* all interrupt bits latched in status */ MV_REG_WRITE(INT_STATUS_MASK_REG,0); /* disable interrupts */ MV_REG_WRITE(INT_STATUS_REG,0); /* clear int status register */ MV_REG_WRITE(PCM_CLK_RATE_DIV_REG, PCM_8192KHZ); /* PCM PCLK freq */ MV_REG_WRITE(DUMMY_RX_WRITE_DATA_REG,0); /* Padding on Rx completion */ MV_REG_BYTE_WRITE(SPI_GLOBAL_CTRL_REG, MV_REG_READ(SPI_GLOBAL_CTRL_REG) | SPI_GLOBAL_ENABLE); MV_REG_BYTE_WRITE(SPI_CLK_PRESCALAR_REG, SPI_CLK_8MHZ); /* SPI SCLK freq */ MV_REG_WRITE(FRAME_TIMESLOT_REG, TIMESLOTS128_8192KHZ); /* Number of timeslots (PCLK) */ if(tdmBandMode == MV_NARROW_BAND) { pcmCtrlReg = (CONFIG_PCM_CRTL | ((sample-1)<<PCM_SAMPLE_SIZE_OFFS)); MV_REG_WRITE(PCM_CTRL_REG, pcmCtrlReg); /* PCM configuration */ MV_REG_WRITE(TIMESLOT_CTRL_REG, CONFIG_TIMESLOT_CTRL); /* channels rx/tx timeslots */ } else /* MV_WIDE_BAND */ { pcmCtrlReg = (CONFIG_WB_PCM_CRTL | ((sample-1)<<PCM_SAMPLE_SIZE_OFFS)); MV_REG_WRITE(PCM_CTRL_REG, pcmCtrlReg); /* PCM configuration - WB support */ MV_REG_WRITE(CH_DELAY_CTRL_REG(0), CONFIG_CH0_DELAY_CTRL_CONFIG); /* CH0 delay control register */ MV_REG_WRITE(CH_DELAY_CTRL_REG(1), CONFIG_CH1_DELAY_CTRL_CONFIG); /* CH1 delay control register */ MV_REG_WRITE(CH_WB_DELAY_CTRL_REG(0), CONFIG_CH0_WB_DELAY_CTRL_CONFIG); /* CH0 WB delay control register */ MV_REG_WRITE(CH_WB_DELAY_CTRL_REG(1), CONFIG_CH1_WB_DELAY_CTRL_CONFIG); /* CH1 WB delay control register */ } /* Issue reset to codec(s) */ MV_TRC_REC("reseting voice unit(s)\n"); MV_REG_WRITE(MISC_CTRL_REG,0); mvOsDelay(1); MV_REG_WRITE(MISC_CTRL_REG,1); if(spiMode) { /* Configure TDM to work in daisy chain mode */ mvTdmDaisyChainModeSet(); } /* Initialize all HW units */ for(ch = 0 ; ch < MV_TDM_TOTAL_CHANNELS; ch++) { if(mvTdmChInit(ch) != MV_OK) { mvOsPrintf("mvTdmChInit(%d) failed !\n", ch); return MV_ERROR; } } /* Enable SLIC/DAA interrupt detection(before pcm is active) */ MV_REG_WRITE(INT_STATUS_MASK_REG, (MV_REG_READ(INT_STATUS_MASK_REG) | TDM_INT_SLIC)); MV_TRC_REC("<-%s\n",__FUNCTION__); return MV_OK; }