]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: amd: acp: Add I2S TDM support for acp6.3 platform
authorVenkata Prasad Potturu <venkataprasad.potturu@amd.com>
Tue, 3 Sep 2024 11:34:19 +0000 (17:04 +0530)
committerMark Brown <broonie@kernel.org>
Tue, 3 Sep 2024 11:57:42 +0000 (12:57 +0100)
Add slots selection and 32-channels TDM support for
acp6.3 platform.

Signed-off-by: Venkata Prasad Potturu <venkataprasad.potturu@amd.com>
Link: https://patch.msgid.link/20240903113427.182997-5-venkataprasad.potturu@amd.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/amd/acp/acp-i2s.c

index aca99020120a6fc8dd2aff8db747bb55e2c71a31..eceffc69bf3ef2389fb54890751d161310138c46 100644 (file)
@@ -133,6 +133,19 @@ static int acp_i2s_set_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask, u32 rx_mas
                        return -EINVAL;
                }
                break;
+       case ACP63_DEV:
+               switch (slots) {
+               case 1 ... 31:
+                       no_of_slots = slots;
+                       break;
+               case 32:
+                       no_of_slots = 0;
+                       break;
+               default:
+                       dev_err(dev, "Unsupported slots %d\n", slots);
+                       return -EINVAL;
+               }
+               break;
        default:
                dev_err(dev, "Unknown chip revision %d\n", chip->acp_rev);
                return -EINVAL;
@@ -152,6 +165,14 @@ static int acp_i2s_set_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask, u32 rx_mas
                                adata->tdm_rx_fmt[stream->dai_id - 1] =
                                        FRM_LEN | (slots << 15) | (slot_len << 18);
                        break;
+               case ACP63_DEV:
+                       if (tx_mask && stream->dir == SNDRV_PCM_STREAM_PLAYBACK)
+                               adata->tdm_tx_fmt[stream->dai_id - 1] =
+                                               FRM_LEN | (slots << 13) | (slot_len << 18);
+                       else if (rx_mask && stream->dir == SNDRV_PCM_STREAM_CAPTURE)
+                               adata->tdm_rx_fmt[stream->dai_id - 1] =
+                                               FRM_LEN | (slots << 13) | (slot_len << 18);
+                       break;
                default:
                        dev_err(dev, "Unknown chip revision %d\n", chip->acp_rev);
                        return -EINVAL;
@@ -314,6 +335,41 @@ static int acp_i2s_hwparams(struct snd_pcm_substream *substream, struct snd_pcm_
                default:
                        return -EINVAL;
                }
+
+               switch (params_rate(params)) {
+               case 8000:
+               case 16000:
+               case 24000:
+               case 48000:
+               case 96000:
+               case 192000:
+                       switch (params_channels(params)) {
+                       case 2:
+                               break;
+                       case 4:
+                               bclk_div_val = bclk_div_val >> 1;
+                               lrclk_div_val = lrclk_div_val << 1;
+                               break;
+                       case 8:
+                               bclk_div_val = bclk_div_val >> 2;
+                               lrclk_div_val = lrclk_div_val << 2;
+                               break;
+                       case 16:
+                               bclk_div_val = bclk_div_val >> 3;
+                               lrclk_div_val = lrclk_div_val << 3;
+                               break;
+                       case 32:
+                               bclk_div_val = bclk_div_val >> 4;
+                               lrclk_div_val = lrclk_div_val << 4;
+                               break;
+                       default:
+                               dev_err(dev, "Unsupported channels %#x\n",
+                                       params_channels(params));
+                       }
+                       break;
+               default:
+                       break;
+               }
                adata->lrclk_div = lrclk_div_val;
                adata->bclk_div = bclk_div_val;
        }