aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/davinci/davinci-mcasp.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/davinci/davinci-mcasp.c')
-rw-r--r--sound/soc/davinci/davinci-mcasp.c93
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 */
640static int mcasp_dit_hw_param(struct davinci_mcasp *mcasp) 644static 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);