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); }
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); } }
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; }