• Home
  • Raw
  • Download

Lines Matching +full:frame +full:- +full:master

8  *		based on davinci-mcasp.c DT support
34 #include "edma-pcm.h"
35 #include "davinci-i2s.h"
37 #define DRV_NAME "davinci-i2s"
42 * - This driver supports the "Audio Serial Port" (ASP),
45 * - But it labels it a "Multi-channel Buffered Serial Port"
47 * backward-compatible, possibly explaining that confusion.
49 * - OMAP chips have a controller called McBSP, which is
52 * - Newer DaVinci chips have a controller called McASP,
151 * if the codec is master and is using an unnecessarily fast bit clock
153 * entire frame at once means it can be serviced at the sample rate
172 __raw_writel(val, dev->base + reg); in davinci_mcbsp_write_reg()
177 return __raw_readl(dev->base + reg); in davinci_mcbsp_read_reg()
186 davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_PCR_REG, dev->pcr ^ m); in toggle_clock()
187 davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_PCR_REG, dev->pcr); in toggle_clock()
193 struct snd_soc_pcm_runtime *rtd = substream->private_data; in davinci_mcbsp_start()
195 int playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); in davinci_mcbsp_start()
205 if (dev->pcr & (DAVINCI_MCBSP_PCR_FSXM | DAVINCI_MCBSP_PCR_FSRM | in davinci_mcbsp_start()
215 if (component->driver->ops->trigger) { in davinci_mcbsp_start()
216 int ret = component->driver->ops->trigger(substream, in davinci_mcbsp_start()
227 /* wait for any unexpected frame sync error to occur */ in davinci_mcbsp_start()
237 if (component->driver->ops->trigger) { in davinci_mcbsp_start()
238 int ret = component->driver->ops->trigger(substream, in davinci_mcbsp_start()
249 if (dev->pcr & (DAVINCI_MCBSP_PCR_FSXM | DAVINCI_MCBSP_PCR_FSRM)) { in davinci_mcbsp_start()
250 /* Start frame sync */ in davinci_mcbsp_start()
260 /* Reset transmitter/receiver and sample rate/frame sync generators */ in davinci_mcbsp_stop()
279 DAVINCI_MCBSP_SRGR_FPER(DEFAULT_BITPERSAMPLE * 2 - 1) | in davinci_i2s_set_dai_fmt()
280 DAVINCI_MCBSP_SRGR_FWID(DEFAULT_BITPERSAMPLE - 1); in davinci_i2s_set_dai_fmt()
282 dev->fmt = fmt; in davinci_i2s_set_dai_fmt()
283 /* set master/slave audio interface */ in davinci_i2s_set_dai_fmt()
286 /* cpu is master */ in davinci_i2s_set_dai_fmt()
300 switch (dev->clk_input_pin) { in davinci_i2s_set_dai_fmt()
309 dev_err(dev->dev, "bad clk_input_pin\n"); in davinci_i2s_set_dai_fmt()
310 return -EINVAL; in davinci_i2s_set_dai_fmt()
315 /* codec is master */ in davinci_i2s_set_dai_fmt()
319 printk(KERN_ERR "%s:bad master\n", __func__); in davinci_i2s_set_dai_fmt()
320 return -EINVAL; in davinci_i2s_set_dai_fmt()
328 * dsp_a mode to be used with an inverted normal frame clk. in davinci_i2s_set_dai_fmt()
329 * If your codec is master and does not have contiguous in davinci_i2s_set_dai_fmt()
345 dev->mode = MOD_DSP_A; in davinci_i2s_set_dai_fmt()
348 dev->mode = MOD_DSP_B; in davinci_i2s_set_dai_fmt()
352 return -EINVAL; in davinci_i2s_set_dai_fmt()
358 * 1 - sampled on rising edge of CLKR in davinci_i2s_set_dai_fmt()
361 * 1 - clocked on falling edge of CLKX in davinci_i2s_set_dai_fmt()
363 * FSRP Receive frame sync pol, 0 - active high in davinci_i2s_set_dai_fmt()
364 * FSXP Transmit frame sync pol, 0 - active high in davinci_i2s_set_dai_fmt()
370 * 0 - sampled on falling edge of CLKR in davinci_i2s_set_dai_fmt()
373 * 0 - clocked on rising edge of CLKX in davinci_i2s_set_dai_fmt()
375 * FSRP Receive frame sync pol, 1 - active low in davinci_i2s_set_dai_fmt()
376 * FSXP Transmit frame sync pol, 1 - active low in davinci_i2s_set_dai_fmt()
382 * 1 - sampled on rising edge of CLKR in davinci_i2s_set_dai_fmt()
385 * 1 - clocked on falling edge of CLKX in davinci_i2s_set_dai_fmt()
387 * FSRP Receive frame sync pol, 1 - active low in davinci_i2s_set_dai_fmt()
388 * FSXP Transmit frame sync pol, 1 - active low in davinci_i2s_set_dai_fmt()
395 * 0 - sampled on falling edge of CLKR in davinci_i2s_set_dai_fmt()
398 * 0 - clocked on rising edge of CLKX in davinci_i2s_set_dai_fmt()
400 * FSRP Receive frame sync pol, 0 - active high in davinci_i2s_set_dai_fmt()
401 * FSXP Transmit frame sync pol, 0 - active high in davinci_i2s_set_dai_fmt()
405 return -EINVAL; in davinci_i2s_set_dai_fmt()
410 dev->pcr = pcr; in davinci_i2s_set_dai_fmt()
421 return -ENODEV; in davinci_i2s_dai_set_clkdiv()
423 dev->clk_div = div; in davinci_i2s_dai_set_clkdiv()
433 int mcbsp_word_length, master; in davinci_i2s_hw_params() local
441 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { in davinci_i2s_hw_params()
449 master = dev->fmt & SND_SOC_DAIFMT_MASTER_MASK; in davinci_i2s_hw_params()
453 switch (master) { in davinci_i2s_hw_params()
455 freq = clk_get_rate(dev->clk); in davinci_i2s_hw_params()
459 8 - 1); in davinci_i2s_hw_params()
460 if (dev->i2s_accurate_sck) { in davinci_i2s_hw_params()
463 framesize = (freq / (--clk_div)) / in davinci_i2s_hw_params()
464 params->rate_num * in davinci_i2s_hw_params()
465 params->rate_den; in davinci_i2s_hw_params()
468 clk_div--; in davinci_i2s_hw_params()
469 srgr |= DAVINCI_MCBSP_SRGR_FPER(framesize - 1); in davinci_i2s_hw_params()
473 params->rate_num * params->rate_den; in davinci_i2s_hw_params()
475 16 - 1); in davinci_i2s_hw_params()
482 clk_div = dev->clk_div - 1; in davinci_i2s_hw_params()
483 srgr |= DAVINCI_MCBSP_SRGR_FWID(mcbsp_word_length * 8 - 1); in davinci_i2s_hw_params()
484 srgr |= DAVINCI_MCBSP_SRGR_FPER(mcbsp_word_length * 16 - 1); in davinci_i2s_hw_params()
489 /* Clock and frame sync given from external sources */ in davinci_i2s_hw_params()
492 srgr |= DAVINCI_MCBSP_SRGR_FWID(snd_interval_value(i) - 1); in davinci_i2s_hw_params()
493 pr_debug("%s - %d FWID set: re-read srgr = %X\n", in davinci_i2s_hw_params()
494 __func__, __LINE__, snd_interval_value(i) - 1); in davinci_i2s_hw_params()
497 srgr |= DAVINCI_MCBSP_SRGR_FPER(snd_interval_value(i) - 1); in davinci_i2s_hw_params()
500 return -EINVAL; in davinci_i2s_hw_params()
506 if (dev->mode == MOD_DSP_B) { in davinci_i2s_hw_params()
516 printk(KERN_WARNING "davinci-i2s: unsupported PCM format\n"); in davinci_i2s_hw_params()
517 return -EINVAL; in davinci_i2s_hw_params()
522 if (double_fmt[fmt] && dev->enable_channel_combine) { in davinci_i2s_hw_params()
526 switch (master) { in davinci_i2s_hw_params()
536 rcr |= DAVINCI_MCBSP_RCR_RFRLEN2(element_cnt - 1); in davinci_i2s_hw_params()
537 xcr |= DAVINCI_MCBSP_XCR_XFRLEN2(element_cnt - 1); in davinci_i2s_hw_params()
540 return -EINVAL; in davinci_i2s_hw_params()
545 switch (master) { in davinci_i2s_hw_params()
553 rcr |= DAVINCI_MCBSP_RCR_RFRLEN1(element_cnt - 1); in davinci_i2s_hw_params()
554 xcr |= DAVINCI_MCBSP_XCR_XFRLEN1(element_cnt - 1); in davinci_i2s_hw_params()
557 return -EINVAL; in davinci_i2s_hw_params()
565 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in davinci_i2s_hw_params()
570 pr_debug("%s - %d srgr=%X\n", __func__, __LINE__, srgr); in davinci_i2s_hw_params()
571 pr_debug("%s - %d xcr=%X\n", __func__, __LINE__, xcr); in davinci_i2s_hw_params()
572 pr_debug("%s - %d rcr=%X\n", __func__, __LINE__, rcr); in davinci_i2s_hw_params()
580 int playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); in davinci_i2s_prepare()
590 int playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); in davinci_i2s_trigger()
604 ret = -EINVAL; in davinci_i2s_trigger()
613 int playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); in davinci_i2s_shutdown()
633 dai->playback_dma_data = &dev->dma_data[SNDRV_PCM_STREAM_PLAYBACK]; in davinci_i2s_dai_probe()
634 dai->capture_dma_data = &dev->dma_data[SNDRV_PCM_STREAM_CAPTURE]; in davinci_i2s_dai_probe()
670 dev_warn(&pdev->dev, in davinci_i2s_probe()
674 dev_err(&pdev->dev, "no mem resource?\n"); in davinci_i2s_probe()
675 return -ENODEV; in davinci_i2s_probe()
679 io_base = devm_ioremap_resource(&pdev->dev, mem); in davinci_i2s_probe()
683 dev = devm_kzalloc(&pdev->dev, sizeof(struct davinci_mcbsp_dev), in davinci_i2s_probe()
686 return -ENOMEM; in davinci_i2s_probe()
688 dev->base = io_base; in davinci_i2s_probe()
691 dma_data = &dev->dma_data[SNDRV_PCM_STREAM_PLAYBACK]; in davinci_i2s_probe()
692 dma_data->addr = (dma_addr_t)(mem->start + DAVINCI_MCBSP_DXR_REG); in davinci_i2s_probe()
696 dma = &dev->dma_request[SNDRV_PCM_STREAM_PLAYBACK]; in davinci_i2s_probe()
697 *dma = res->start; in davinci_i2s_probe()
698 dma_data->filter_data = dma; in davinci_i2s_probe()
699 } else if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node) { in davinci_i2s_probe()
700 dma_data->filter_data = "tx"; in davinci_i2s_probe()
702 dev_err(&pdev->dev, "Missing DMA tx resource\n"); in davinci_i2s_probe()
703 return -ENODEV; in davinci_i2s_probe()
706 dma_data = &dev->dma_data[SNDRV_PCM_STREAM_CAPTURE]; in davinci_i2s_probe()
707 dma_data->addr = (dma_addr_t)(mem->start + DAVINCI_MCBSP_DRR_REG); in davinci_i2s_probe()
711 dma = &dev->dma_request[SNDRV_PCM_STREAM_CAPTURE]; in davinci_i2s_probe()
712 *dma = res->start; in davinci_i2s_probe()
713 dma_data->filter_data = dma; in davinci_i2s_probe()
714 } else if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node) { in davinci_i2s_probe()
715 dma_data->filter_data = "rx"; in davinci_i2s_probe()
717 dev_err(&pdev->dev, "Missing DMA rx resource\n"); in davinci_i2s_probe()
718 return -ENODEV; in davinci_i2s_probe()
721 dev->clk = clk_get(&pdev->dev, NULL); in davinci_i2s_probe()
722 if (IS_ERR(dev->clk)) in davinci_i2s_probe()
723 return -ENODEV; in davinci_i2s_probe()
724 clk_enable(dev->clk); in davinci_i2s_probe()
726 dev->dev = &pdev->dev; in davinci_i2s_probe()
727 dev_set_drvdata(&pdev->dev, dev); in davinci_i2s_probe()
729 ret = snd_soc_register_component(&pdev->dev, &davinci_i2s_component, in davinci_i2s_probe()
734 ret = edma_pcm_platform_register(&pdev->dev); in davinci_i2s_probe()
736 dev_err(&pdev->dev, "register PCM failed: %d\n", ret); in davinci_i2s_probe()
743 snd_soc_unregister_component(&pdev->dev); in davinci_i2s_probe()
745 clk_disable(dev->clk); in davinci_i2s_probe()
746 clk_put(dev->clk); in davinci_i2s_probe()
752 struct davinci_mcbsp_dev *dev = dev_get_drvdata(&pdev->dev); in davinci_i2s_remove()
754 snd_soc_unregister_component(&pdev->dev); in davinci_i2s_remove()
756 clk_disable(dev->clk); in davinci_i2s_remove()
757 clk_put(dev->clk); in davinci_i2s_remove()
758 dev->clk = NULL; in davinci_i2s_remove()
764 { .compatible = "ti,da850-mcbsp" },
773 .name = "davinci-mcbsp",