Re: [PATCH v4 1/8] ASoC: qcom: sdm845: Demystify TDM masks a bit

From: Srinivas Kandagatla

Date: Fri Sep 25 2026 - 04:14:33 EST


On 9/24/26 2:24 PM, David Heidelberg via B4 Relay wrote:
> From: David Heidelberg <david@xxxxxxx>
>
> Describe the mask with the bits used for each RX/TX.
>
> Signed-off-by: David Heidelberg <david@xxxxxxx>

Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@xxxxxxxxxxxxxxxx>
> ---
> sound/soc/qcom/sdm845.c | 21 ++++++++++++++-------
> 1 file changed, 14 insertions(+), 7 deletions(-)
>
> diff --git a/sound/soc/qcom/sdm845.c b/sound/soc/qcom/sdm845.c
> index 6843ab8ba017e..0ce8265ab1c1f 100644
> --- a/sound/soc/qcom/sdm845.c
> +++ b/sound/soc/qcom/sdm845.c
> @@ -18,19 +18,24 @@
> #include "sdw.h"
> #include "../codecs/rt5663.h"
>
> #define DRIVER_NAME "sdm845"
> #define DEFAULT_SAMPLE_RATE_48K 48000
> #define DEFAULT_MCLK_RATE 24576000
> #define TDM_BCLK_RATE 6144000
> #define MI2S_BCLK_RATE 1536000
> -#define LEFT_SPK_TDM_TX_MASK 0x30
> -#define RIGHT_SPK_TDM_TX_MASK 0xC0
> -#define SPK_TDM_RX_MASK 0x03
> +#define LEFT_SPK_TDM_RX_MASK BIT(0)
> +#define RIGHT_SPK_TDM_RX_MASK BIT(1)
> +#define SPK_TDM_RX_MASK (LEFT_SPK_TDM_RX_MASK | RIGHT_SPK_TDM_RX_MASK)
> +#define MIC1_TDM_RX_MASK BIT(2)
> +#define MIC2_TDM_RX_MASK BIT(3)
> +#define MIC_TDM_RX_MASK (MIC1_TDM_RX_MASK | MIC2_TDM_RX_MASK)
> +#define LEFT_SPK_TDM_TX_MASK (BIT(4) | BIT(5))
> +#define RIGHT_SPK_TDM_TX_MASK (BIT(6) | BIT(7))
> #define NUM_TDM_SLOTS 8
> #define SLIM_MAX_TX_PORTS 16
> #define SLIM_MAX_RX_PORTS 13
> #define WCD934X_DEFAULT_MCLK_RATE 9600000
>
> struct sdm845_snd_data {
> struct snd_soc_jack jack;
> bool jack_setup;
> @@ -107,34 +112,36 @@ static int sdm845_tdm_snd_hw_params(struct snd_pcm_substream *substream,
> default:
> dev_err(rtd->dev, "%s: invalid param format 0x%x\n",
> __func__, params_format(params));
> return -EINVAL;
> }
>
> channels = params_channels(params);
> if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
> - ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, 0x3,
> - 8, slot_width);
> + ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, SPK_TDM_RX_MASK,
> + NUM_TDM_SLOTS, slot_width);
> if (ret < 0) {
> dev_err(rtd->dev, "%s: failed to set tdm slot, err:%d\n",
> __func__, ret);
> goto end;
> }
>
> ret = snd_soc_dai_set_channel_map(cpu_dai, 0, NULL,
> channels, tdm_slot_offset);
> if (ret < 0) {
> dev_err(rtd->dev, "%s: failed to set channel map, err:%d\n",
> __func__, ret);
> goto end;
> }
> } else {
> - ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0xf, 0,
> - 8, slot_width);
> + ret = snd_soc_dai_set_tdm_slot(cpu_dai,
> + SPK_TDM_RX_MASK |
> + MIC_TDM_RX_MASK, 0,
> + NUM_TDM_SLOTS, slot_width);
> if (ret < 0) {
> dev_err(rtd->dev, "%s: failed to set tdm slot, err:%d\n",
> __func__, ret);
> goto end;
> }
>
> ret = snd_soc_dai_set_channel_map(cpu_dai, channels,
> tdm_slot_offset, 0, NULL);
>