Beispiel #1
0
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;
}
Beispiel #2
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;
}