Merge remote-tracking branches 'asoc/topic/cygnus', 'asoc/topic/da7213', 'asoc/topic...
authorMark Brown <broonie@kernel.org>
Fri, 10 Nov 2017 21:31:10 +0000 (21:31 +0000)
committerMark Brown <broonie@kernel.org>
Fri, 10 Nov 2017 21:31:10 +0000 (21:31 +0000)
sound/soc/bcm/cygnus-ssp.c
sound/soc/codecs/da7213.c
sound/soc/codecs/da7213.h
sound/soc/davinci/davinci-mcasp.c
sound/soc/soc-core.c

index 15c438f0f22d2e3ca8d5c53aa79ab6bbded78f04..abafadc0b534b4fe7d87a02af3d92e5762227d21 100644 (file)
@@ -655,23 +655,10 @@ static int cygnus_ssp_hw_params(struct snd_pcm_substream *substream,
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
                value = readl(aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
                value &= ~BIT(BF_SRC_CFGX_BUFFER_PAIR_ENABLE);
-               /* Configure channels as mono or stereo/TDM */
-               if (params_channels(params) == 1)
-                       value |= BIT(BF_SRC_CFGX_SAMPLE_CH_MODE);
-               else
-                       value &= ~BIT(BF_SRC_CFGX_SAMPLE_CH_MODE);
+               value &= ~BIT(BF_SRC_CFGX_SAMPLE_CH_MODE);
                writel(value, aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
 
                switch (params_format(params)) {
-               case SNDRV_PCM_FORMAT_S8:
-                       if (aio->port_type == PORT_SPDIF) {
-                               dev_err(aio->cygaud->dev,
-                               "SPDIF does not support 8bit format\n");
-                               return -EINVAL;
-                       }
-                       bitres = 8;
-                       break;
-
                case SNDRV_PCM_FORMAT_S16_LE:
                        bitres = 16;
                        break;
@@ -842,6 +829,7 @@ int cygnus_ssp_set_custom_fsync_width(struct snd_soc_dai *cpu_dai, int len)
                return -EINVAL;
        }
 }
+EXPORT_SYMBOL_GPL(cygnus_ssp_set_custom_fsync_width);
 
 static int cygnus_ssp_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
 {
@@ -998,7 +986,7 @@ static int cygnus_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai,
 
        active_slots = hweight32(tx_mask);
 
-       if ((active_slots < 0) || (active_slots > 16))
+       if (active_slots > 16)
                return -EINVAL;
 
        /* Slot value must be even */
@@ -1136,15 +1124,21 @@ static const struct snd_soc_dai_ops cygnus_ssp_dai_ops = {
        .set_tdm_slot   = cygnus_set_dai_tdm_slot,
 };
 
+static const struct snd_soc_dai_ops cygnus_spdif_dai_ops = {
+       .startup        = cygnus_ssp_startup,
+       .shutdown       = cygnus_ssp_shutdown,
+       .trigger        = cygnus_ssp_trigger,
+       .hw_params      = cygnus_ssp_hw_params,
+       .set_sysclk     = cygnus_ssp_set_sysclk,
+};
 
 #define INIT_CPU_DAI(num) { \
        .name = "cygnus-ssp" #num, \
        .playback = { \
-               .channels_min = 1, \
+               .channels_min = 2, \
                .channels_max = 16, \
                .rates = SNDRV_PCM_RATE_KNOT, \
-               .formats = SNDRV_PCM_FMTBIT_S8 | \
-                               SNDRV_PCM_FMTBIT_S16_LE | \
+               .formats = SNDRV_PCM_FMTBIT_S16_LE | \
                                SNDRV_PCM_FMTBIT_S32_LE, \
        }, \
        .capture = { \
@@ -1152,7 +1146,7 @@ static const struct snd_soc_dai_ops cygnus_ssp_dai_ops = {
                .channels_max = 16, \
                .rates = SNDRV_PCM_RATE_KNOT, \
                .formats =  SNDRV_PCM_FMTBIT_S16_LE | \
-                                       SNDRV_PCM_FMTBIT_S32_LE, \
+                               SNDRV_PCM_FMTBIT_S32_LE, \
        }, \
        .ops = &cygnus_ssp_dai_ops, \
        .suspend = cygnus_ssp_suspend, \
@@ -1174,7 +1168,7 @@ static const struct snd_soc_dai_driver cygnus_spdif_dai_info = {
                .formats = SNDRV_PCM_FMTBIT_S16_LE |
                        SNDRV_PCM_FMTBIT_S32_LE,
        },
-       .ops = &cygnus_ssp_dai_ops,
+       .ops = &cygnus_spdif_dai_ops,
        .suspend = cygnus_ssp_suspend,
        .resume = cygnus_ssp_resume,
 };
index cc0b2d2eaf151cc9a6666badc829d1157875c016..41d9b1da27c221272b54ad20846fb5cde3ee76ca 100644 (file)
@@ -1220,6 +1220,7 @@ static int da7213_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
        struct snd_soc_codec *codec = codec_dai->codec;
        struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec);
        u8 dai_clk_mode = 0, dai_ctrl = 0;
+       u8 dai_offset = 0;
 
        /* Set master/slave mode */
        switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
@@ -1234,17 +1235,46 @@ static int da7213_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
        }
 
        /* Set clock normal/inverted */
-       switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
-       case SND_SOC_DAIFMT_NB_NF:
-               break;
-       case SND_SOC_DAIFMT_NB_IF:
-               dai_clk_mode |= DA7213_DAI_WCLK_POL_INV;
-               break;
-       case SND_SOC_DAIFMT_IB_NF:
-               dai_clk_mode |= DA7213_DAI_CLK_POL_INV;
+       switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
+       case SND_SOC_DAIFMT_I2S:
+       case SND_SOC_DAIFMT_LEFT_J:
+       case SND_SOC_DAIFMT_RIGHT_J:
+               switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
+               case SND_SOC_DAIFMT_NB_NF:
+                       break;
+               case SND_SOC_DAIFMT_NB_IF:
+                       dai_clk_mode |= DA7213_DAI_WCLK_POL_INV;
+                       break;
+               case SND_SOC_DAIFMT_IB_NF:
+                       dai_clk_mode |= DA7213_DAI_CLK_POL_INV;
+                       break;
+               case SND_SOC_DAIFMT_IB_IF:
+                       dai_clk_mode |= DA7213_DAI_WCLK_POL_INV |
+                                       DA7213_DAI_CLK_POL_INV;
+                       break;
+               default:
+                       return -EINVAL;
+               }
                break;
-       case SND_SOC_DAIFMT_IB_IF:
-               dai_clk_mode |= DA7213_DAI_WCLK_POL_INV | DA7213_DAI_CLK_POL_INV;
+       case SND_SOC_DAI_FORMAT_DSP_A:
+       case SND_SOC_DAI_FORMAT_DSP_B:
+               /* The bclk is inverted wrt ASoC conventions */
+               switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
+               case SND_SOC_DAIFMT_NB_NF:
+                       dai_clk_mode |= DA7213_DAI_CLK_POL_INV;
+                       break;
+               case SND_SOC_DAIFMT_NB_IF:
+                       dai_clk_mode |= DA7213_DAI_WCLK_POL_INV |
+                                       DA7213_DAI_CLK_POL_INV;
+                       break;
+               case SND_SOC_DAIFMT_IB_NF:
+                       break;
+               case SND_SOC_DAIFMT_IB_IF:
+                       dai_clk_mode |= DA7213_DAI_WCLK_POL_INV;
+                       break;
+               default:
+                       return -EINVAL;
+               }
                break;
        default:
                return -EINVAL;
@@ -1261,6 +1291,13 @@ static int da7213_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
        case SND_SOC_DAIFMT_RIGHT_J:
                dai_ctrl |= DA7213_DAI_FORMAT_RIGHT_J;
                break;
+       case SND_SOC_DAI_FORMAT_DSP_A: /* L data MSB after FRM LRC */
+               dai_ctrl |= DA7213_DAI_FORMAT_DSP;
+               dai_offset = 1;
+               break;
+       case SND_SOC_DAI_FORMAT_DSP_B: /* L data MSB during FRM LRC */
+               dai_ctrl |= DA7213_DAI_FORMAT_DSP;
+               break;
        default:
                return -EINVAL;
        }
@@ -1271,6 +1308,7 @@ static int da7213_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
        snd_soc_write(codec, DA7213_DAI_CLK_MODE, dai_clk_mode);
        snd_soc_update_bits(codec, DA7213_DAI_CTRL, DA7213_DAI_FORMAT_MASK,
                            dai_ctrl);
+       snd_soc_write(codec, DA7213_DAI_OFFSET, dai_offset);
 
        return 0;
 }
index 16ef56f77cd48c36e1dbab0a862652f44faecb52..5a78dba1dcb58bcdccdc7693a3eec43beaba44b6 100644 (file)
 #define DA7213_DAI_FORMAT_I2S_MODE                             (0x0 << 0)
 #define DA7213_DAI_FORMAT_LEFT_J                               (0x1 << 0)
 #define DA7213_DAI_FORMAT_RIGHT_J                              (0x2 << 0)
+#define DA7213_DAI_FORMAT_DSP                                  (0x3 << 0)
 #define DA7213_DAI_FORMAT_MASK                                 (0x3 << 0)
 #define DA7213_DAI_WORD_LENGTH_S16_LE                          (0x0 << 2)
 #define DA7213_DAI_WORD_LENGTH_S20_LE                          (0x1 << 2)
index 23b0da7df1f28a0a71b948f50a665869ae378969..804c6f2bcf218a61b492e1a67e24d6d3491b8229 100644 (file)
@@ -1721,7 +1721,8 @@ static int davinci_mcasp_get_dma_type(struct davinci_mcasp *mcasp)
                                PTR_ERR(chan));
                return PTR_ERR(chan);
        }
-       BUG_ON(!chan->device || !chan->device->dev);
+       if (WARN_ON(!chan->device || !chan->device->dev))
+               return -EINVAL;
 
        if (chan->device->dev->of_node)
                ret = of_property_read_string(chan->device->dev->of_node,
@@ -1867,6 +1868,10 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
        if (irq >= 0) {
                irq_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_common",
                                          dev_name(&pdev->dev));
+               if (!irq_name) {
+                       ret = -ENOMEM;
+                       goto err;
+               }
                ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
                                                davinci_mcasp_common_irq_handler,
                                                IRQF_ONESHOT | IRQF_SHARED,
@@ -1884,6 +1889,10 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
        if (irq >= 0) {
                irq_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_rx",
                                          dev_name(&pdev->dev));
+               if (!irq_name) {
+                       ret = -ENOMEM;
+                       goto err;
+               }
                ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
                                                davinci_mcasp_rx_irq_handler,
                                                IRQF_ONESHOT, irq_name, mcasp);
@@ -1899,6 +1908,10 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
        if (irq >= 0) {
                irq_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_tx",
                                          dev_name(&pdev->dev));
+               if (!irq_name) {
+                       ret = -ENOMEM;
+                       goto err;
+               }
                ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
                                                davinci_mcasp_tx_irq_handler,
                                                IRQF_ONESHOT, irq_name, mcasp);
index 533c822ca6e6feb08afc194f05b52bd3c8084f41..c0edac80df34e683291cff5fb86c560ee8e22ffd 100644 (file)
@@ -2800,7 +2800,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_bclk_ratio);
 /**
  * snd_soc_dai_set_fmt - configure DAI hardware audio format.
  * @dai: DAI
- * @fmt: SND_SOC_DAIFMT_ format value.
+ * @fmt: SND_SOC_DAIFMT_* format value.
  *
  * Configures the DAI hardware format and clocking.
  */