diff options
Diffstat (limited to 'sound/soc/davinci/davinci-mcasp.c')
-rw-r--r-- | sound/soc/davinci/davinci-mcasp.c | 93 |
1 files changed, 83 insertions, 10 deletions
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c index 9afb14629a17..c28508da34cf 100644 --- a/sound/soc/davinci/davinci-mcasp.c +++ b/sound/soc/davinci/davinci-mcasp.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/of_platform.h> | 27 | #include <linux/of_platform.h> |
28 | #include <linux/of_device.h> | 28 | #include <linux/of_device.h> |
29 | 29 | ||
30 | #include <sound/asoundef.h> | ||
30 | #include <sound/core.h> | 31 | #include <sound/core.h> |
31 | #include <sound/pcm.h> | 32 | #include <sound/pcm.h> |
32 | #include <sound/pcm_params.h> | 33 | #include <sound/pcm_params.h> |
@@ -36,6 +37,7 @@ | |||
36 | #include <sound/omap-pcm.h> | 37 | #include <sound/omap-pcm.h> |
37 | 38 | ||
38 | #include "davinci-pcm.h" | 39 | #include "davinci-pcm.h" |
40 | #include "edma-pcm.h" | ||
39 | #include "davinci-mcasp.h" | 41 | #include "davinci-mcasp.h" |
40 | 42 | ||
41 | #define MCASP_MAX_AFIFO_DEPTH 64 | 43 | #define MCASP_MAX_AFIFO_DEPTH 64 |
@@ -63,6 +65,7 @@ struct davinci_mcasp { | |||
63 | u8 num_serializer; | 65 | u8 num_serializer; |
64 | u8 *serial_dir; | 66 | u8 *serial_dir; |
65 | u8 version; | 67 | u8 version; |
68 | u8 bclk_div; | ||
66 | u16 bclk_lrclk_ratio; | 69 | u16 bclk_lrclk_ratio; |
67 | int streams; | 70 | int streams; |
68 | 71 | ||
@@ -417,6 +420,7 @@ static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div | |||
417 | ACLKXDIV(div - 1), ACLKXDIV_MASK); | 420 | ACLKXDIV(div - 1), ACLKXDIV_MASK); |
418 | mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, | 421 | mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, |
419 | ACLKRDIV(div - 1), ACLKRDIV_MASK); | 422 | ACLKRDIV(div - 1), ACLKRDIV_MASK); |
423 | mcasp->bclk_div = div; | ||
420 | break; | 424 | break; |
421 | 425 | ||
422 | case 2: /* BCLK/LRCLK ratio */ | 426 | case 2: /* BCLK/LRCLK ratio */ |
@@ -637,8 +641,12 @@ static int mcasp_i2s_hw_param(struct davinci_mcasp *mcasp, int stream) | |||
637 | } | 641 | } |
638 | 642 | ||
639 | /* S/PDIF */ | 643 | /* S/PDIF */ |
640 | static int mcasp_dit_hw_param(struct davinci_mcasp *mcasp) | 644 | static int mcasp_dit_hw_param(struct davinci_mcasp *mcasp, |
645 | unsigned int rate) | ||
641 | { | 646 | { |
647 | u32 cs_value = 0; | ||
648 | u8 *cs_bytes = (u8*) &cs_value; | ||
649 | |||
642 | /* Set the TX format : 24 bit right rotation, 32 bit slot, Pad 0 | 650 | /* Set the TX format : 24 bit right rotation, 32 bit slot, Pad 0 |
643 | and LSB first */ | 651 | and LSB first */ |
644 | mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXROT(6) | TXSSZ(15)); | 652 | mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXROT(6) | TXSSZ(15)); |
@@ -660,6 +668,46 @@ static int mcasp_dit_hw_param(struct davinci_mcasp *mcasp) | |||
660 | /* Enable the DIT */ | 668 | /* Enable the DIT */ |
661 | mcasp_set_bits(mcasp, DAVINCI_MCASP_TXDITCTL_REG, DITEN); | 669 | mcasp_set_bits(mcasp, DAVINCI_MCASP_TXDITCTL_REG, DITEN); |
662 | 670 | ||
671 | /* Set S/PDIF channel status bits */ | ||
672 | cs_bytes[0] = IEC958_AES0_CON_NOT_COPYRIGHT; | ||
673 | cs_bytes[1] = IEC958_AES1_CON_PCM_CODER; | ||
674 | |||
675 | switch (rate) { | ||
676 | case 22050: | ||
677 | cs_bytes[3] |= IEC958_AES3_CON_FS_22050; | ||
678 | break; | ||
679 | case 24000: | ||
680 | cs_bytes[3] |= IEC958_AES3_CON_FS_24000; | ||
681 | break; | ||
682 | case 32000: | ||
683 | cs_bytes[3] |= IEC958_AES3_CON_FS_32000; | ||
684 | break; | ||
685 | case 44100: | ||
686 | cs_bytes[3] |= IEC958_AES3_CON_FS_44100; | ||
687 | break; | ||
688 | case 48000: | ||
689 | cs_bytes[3] |= IEC958_AES3_CON_FS_48000; | ||
690 | break; | ||
691 | case 88200: | ||
692 | cs_bytes[3] |= IEC958_AES3_CON_FS_88200; | ||
693 | break; | ||
694 | case 96000: | ||
695 | cs_bytes[3] |= IEC958_AES3_CON_FS_96000; | ||
696 | break; | ||
697 | case 176400: | ||
698 | cs_bytes[3] |= IEC958_AES3_CON_FS_176400; | ||
699 | break; | ||
700 | case 192000: | ||
701 | cs_bytes[3] |= IEC958_AES3_CON_FS_192000; | ||
702 | break; | ||
703 | default: | ||
704 | printk(KERN_WARNING "unsupported sampling rate: %d\n", rate); | ||
705 | return -EINVAL; | ||
706 | } | ||
707 | |||
708 | mcasp_set_reg(mcasp, DAVINCI_MCASP_DITCSRA_REG, cs_value); | ||
709 | mcasp_set_reg(mcasp, DAVINCI_MCASP_DITCSRB_REG, cs_value); | ||
710 | |||
663 | return 0; | 711 | return 0; |
664 | } | 712 | } |
665 | 713 | ||
@@ -675,15 +723,22 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream, | |||
675 | int period_size = params_period_size(params); | 723 | int period_size = params_period_size(params); |
676 | int ret; | 724 | int ret; |
677 | 725 | ||
678 | /* If mcasp is BCLK master we need to set BCLK divider */ | 726 | /* |
679 | if (mcasp->bclk_master) { | 727 | * If mcasp is BCLK master, and a BCLK divider was not provided by |
728 | * the machine driver, we need to calculate the ratio. | ||
729 | */ | ||
730 | if (mcasp->bclk_master && mcasp->bclk_div == 0 && mcasp->sysclk_freq) { | ||
680 | unsigned int bclk_freq = snd_soc_params_to_bclk(params); | 731 | unsigned int bclk_freq = snd_soc_params_to_bclk(params); |
732 | unsigned int div = mcasp->sysclk_freq / bclk_freq; | ||
681 | if (mcasp->sysclk_freq % bclk_freq != 0) { | 733 | if (mcasp->sysclk_freq % bclk_freq != 0) { |
682 | dev_err(mcasp->dev, "Can't produce required BCLK\n"); | 734 | if (((mcasp->sysclk_freq / div) - bclk_freq) > |
683 | return -EINVAL; | 735 | (bclk_freq - (mcasp->sysclk_freq / (div+1)))) |
736 | div++; | ||
737 | dev_warn(mcasp->dev, | ||
738 | "Inaccurate BCLK: %u Hz / %u != %u Hz\n", | ||
739 | mcasp->sysclk_freq, div, bclk_freq); | ||
684 | } | 740 | } |
685 | davinci_mcasp_set_clkdiv( | 741 | davinci_mcasp_set_clkdiv(cpu_dai, 1, div); |
686 | cpu_dai, 1, mcasp->sysclk_freq / bclk_freq); | ||
687 | } | 742 | } |
688 | 743 | ||
689 | ret = mcasp_common_hw_param(mcasp, substream->stream, | 744 | ret = mcasp_common_hw_param(mcasp, substream->stream, |
@@ -692,7 +747,7 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream, | |||
692 | return ret; | 747 | return ret; |
693 | 748 | ||
694 | if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE) | 749 | if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE) |
695 | ret = mcasp_dit_hw_param(mcasp); | 750 | ret = mcasp_dit_hw_param(mcasp, params_rate(params)); |
696 | else | 751 | else |
697 | ret = mcasp_i2s_hw_param(mcasp, substream->stream); | 752 | ret = mcasp_i2s_hw_param(mcasp, substream->stream); |
698 | 753 | ||
@@ -720,6 +775,10 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream, | |||
720 | 775 | ||
721 | case SNDRV_PCM_FORMAT_U24_LE: | 776 | case SNDRV_PCM_FORMAT_U24_LE: |
722 | case SNDRV_PCM_FORMAT_S24_LE: | 777 | case SNDRV_PCM_FORMAT_S24_LE: |
778 | dma_params->data_type = 4; | ||
779 | word_length = 24; | ||
780 | break; | ||
781 | |||
723 | case SNDRV_PCM_FORMAT_U32_LE: | 782 | case SNDRV_PCM_FORMAT_U32_LE: |
724 | case SNDRV_PCM_FORMAT_S32_LE: | 783 | case SNDRV_PCM_FORMAT_S32_LE: |
725 | dma_params->data_type = 4; | 784 | dma_params->data_type = 4; |
@@ -778,7 +837,7 @@ static int davinci_mcasp_dai_probe(struct snd_soc_dai *dai) | |||
778 | { | 837 | { |
779 | struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai); | 838 | struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai); |
780 | 839 | ||
781 | if (mcasp->version == MCASP_VERSION_4) { | 840 | if (mcasp->version >= MCASP_VERSION_3) { |
782 | /* Using dmaengine PCM */ | 841 | /* Using dmaengine PCM */ |
783 | dai->playback_dma_data = | 842 | dai->playback_dma_data = |
784 | &mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK]; | 843 | &mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK]; |
@@ -1223,14 +1282,28 @@ static int davinci_mcasp_probe(struct platform_device *pdev) | |||
1223 | goto err; | 1282 | goto err; |
1224 | 1283 | ||
1225 | switch (mcasp->version) { | 1284 | switch (mcasp->version) { |
1285 | #if IS_BUILTIN(CONFIG_SND_DAVINCI_SOC) || \ | ||
1286 | (IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \ | ||
1287 | IS_MODULE(CONFIG_SND_DAVINCI_SOC)) | ||
1226 | case MCASP_VERSION_1: | 1288 | case MCASP_VERSION_1: |
1227 | case MCASP_VERSION_2: | 1289 | case MCASP_VERSION_2: |
1228 | case MCASP_VERSION_3: | ||
1229 | ret = davinci_soc_platform_register(&pdev->dev); | 1290 | ret = davinci_soc_platform_register(&pdev->dev); |
1230 | break; | 1291 | break; |
1292 | #endif | ||
1293 | #if IS_BUILTIN(CONFIG_SND_EDMA_SOC) || \ | ||
1294 | (IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \ | ||
1295 | IS_MODULE(CONFIG_SND_EDMA_SOC)) | ||
1296 | case MCASP_VERSION_3: | ||
1297 | ret = edma_pcm_platform_register(&pdev->dev); | ||
1298 | break; | ||
1299 | #endif | ||
1300 | #if IS_BUILTIN(CONFIG_SND_OMAP_SOC) || \ | ||
1301 | (IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \ | ||
1302 | IS_MODULE(CONFIG_SND_OMAP_SOC)) | ||
1231 | case MCASP_VERSION_4: | 1303 | case MCASP_VERSION_4: |
1232 | ret = omap_pcm_platform_register(&pdev->dev); | 1304 | ret = omap_pcm_platform_register(&pdev->dev); |
1233 | break; | 1305 | break; |
1306 | #endif | ||
1234 | default: | 1307 | default: |
1235 | dev_err(&pdev->dev, "Invalid McASP version: %d\n", | 1308 | dev_err(&pdev->dev, "Invalid McASP version: %d\n", |
1236 | mcasp->version); | 1309 | mcasp->version); |