コード例 #1
0
static void mcasp_start_tx(struct davinci_audio_dev *dev)
{
	u8 offset = 0, i;
	u32 cnt;

	mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLX_REG, TXHCLKRST);
	mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLX_REG, TXCLKRST);
	mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLX_REG, TXSERCLR);
	mcasp_set_reg(dev->base + DAVINCI_MCASP_TXBUF_REG, 0);

	mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLX_REG, TXSMRST);
	mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLX_REG, TXFSRST);
	mcasp_set_reg(dev->base + DAVINCI_MCASP_TXBUF_REG, 0);
	for (i = 0; i < dev->num_serializer; i++) {
		if (dev->serial_dir[i] == TX_MODE) {
			offset = i;
			break;
		}
	}

	/* wait for TX ready */
	cnt = 0;
	while (!(mcasp_get_reg(dev->base + DAVINCI_MCASP_XRSRCTL_REG(offset)) &
		 TXSTATE) && (cnt < 100000))
		cnt++;

	mcasp_set_reg(dev->base + DAVINCI_MCASP_TXBUF_REG, 0);
}
コード例 #2
0
static void davinci_hw_common_param(struct davinci_audio_dev *dev, int stream)
{
	int i;
	u8 tx_ser = 0;
	u8 rx_ser = 0;

	/* Default configuration */
	mcasp_set_bits(dev->base + DAVINCI_MCASP_PWREMUMGT_REG, MCASP_SOFT);

	/* All PINS as McASP */
	mcasp_set_reg(dev->base + DAVINCI_MCASP_PFUNC_REG, 0x00000000);

	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
		mcasp_set_reg(dev->base + DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
		mcasp_clr_bits(dev->base + DAVINCI_MCASP_XEVTCTL_REG,
				TXDATADMADIS);
	} else {
		mcasp_set_reg(dev->base + DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF);
		mcasp_clr_bits(dev->base + DAVINCI_MCASP_REVTCTL_REG,
				RXDATADMADIS);
	}

	for (i = 0; i < dev->num_serializer; i++) {
		mcasp_set_bits(dev->base + DAVINCI_MCASP_XRSRCTL_REG(i),
					dev->serial_dir[i]);
		if (dev->serial_dir[i] == TX_MODE) {
			mcasp_set_bits(dev->base + DAVINCI_MCASP_PDIR_REG,
					AXR(i));
			tx_ser++;
		} else if (dev->serial_dir[i] == RX_MODE) {
			mcasp_clr_bits(dev->base + DAVINCI_MCASP_PDIR_REG,
					AXR(i));
			rx_ser++;
		}
	}

	if (dev->txnumevt && stream == SNDRV_PCM_STREAM_PLAYBACK) {
		if (dev->txnumevt * tx_ser > 64)
			dev->txnumevt = 1;

		mcasp_mod_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, tx_ser,
								NUMDMA_MASK);
		mcasp_mod_bits(dev->base + DAVINCI_MCASP_WFIFOCTL,
				((dev->txnumevt * tx_ser) << 8), NUMEVT_MASK);
		mcasp_set_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, FIFO_ENABLE);
	}

	if (dev->rxnumevt && stream == SNDRV_PCM_STREAM_CAPTURE) {
		if (dev->rxnumevt * rx_ser > 64)
			dev->rxnumevt = 1;

		mcasp_mod_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, rx_ser,
								NUMDMA_MASK);
		mcasp_mod_bits(dev->base + DAVINCI_MCASP_RFIFOCTL,
				((dev->rxnumevt * rx_ser) << 8), NUMEVT_MASK);
		mcasp_set_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, FIFO_ENABLE);
	}
}
コード例 #3
0
static int davinci_mcasp_suspend(struct platform_device *pdev,
							pm_message_t state)
{
	int ret = 0, idx;
	struct davinci_audio_dev *dev = dev_get_drvdata(&pdev->dev);

	if (dev->version == MCASP_VERSION_3) {
		dev->gblctlx = mcasp_get_reg(dev->base +
						DAVINCI_MCASP_GBLCTLX_REG);
		dev->txmask = mcasp_get_reg(dev->base +
						DAVINCI_MCASP_TXMASK_REG);
		dev->txfmt = mcasp_get_reg(dev->base + DAVINCI_MCASP_TXFMT_REG);
		dev->txfmctl = mcasp_get_reg(dev->base +
						DAVINCI_MCASP_TXFMCTL_REG);
		dev->aclkxctl = mcasp_get_reg(dev->base +
						DAVINCI_MCASP_ACLKXCTL_REG);
		dev->ahclkxctl = mcasp_get_reg(dev->base +
						DAVINCI_MCASP_AHCLKXCTL_REG);
		dev->txtdm = mcasp_get_reg(dev->base + DAVINCI_MCASP_TXTDM_REG);
		dev->wfifoctl = mcasp_get_reg(dev->base + MCASP_VER3_WFIFOCTL);

		dev->gblctlr = mcasp_get_reg(dev->base +
						DAVINCI_MCASP_GBLCTLR_REG);
		dev->rxmask = mcasp_get_reg(dev->base +
						DAVINCI_MCASP_RXMASK_REG);
		dev->rxfmt = mcasp_get_reg(dev->base + DAVINCI_MCASP_RXFMT_REG);
		dev->rxfmctl = mcasp_get_reg(dev->base +
						DAVINCI_MCASP_RXFMCTL_REG);
		dev->aclkrctl = mcasp_get_reg(dev->base +
						DAVINCI_MCASP_ACLKRCTL_REG);
		dev->ahclkrctl = mcasp_get_reg(dev->base +
						DAVINCI_MCASP_AHCLKRCTL_REG);
		dev->rxtdm = mcasp_get_reg(dev->base + DAVINCI_MCASP_RXTDM_REG);
		dev->rfifoctl = mcasp_get_reg(dev->base + MCASP_VER3_RFIFOCTL);

		for (idx = 0; idx < dev->num_serializer; idx++) {
			dev->xrsrctl[idx] = mcasp_get_reg(dev->base +
						DAVINCI_MCASP_XRSRCTL_REG(idx));
		}

		dev->pfunc = mcasp_get_reg(dev->base + DAVINCI_MCASP_PFUNC_REG);
		dev->pdir = mcasp_get_reg(dev->base + DAVINCI_MCASP_PDIR_REG);
	}

	ret = pm_runtime_put_sync(&pdev->dev);
	if (ret < 0)
		dev_err(&pdev->dev, "failed to get runtime pm\n");

	/* only values < 0 indicate errors */
	return IS_ERR_VALUE(ret) ? ret : 0;
}