Skip to content

Commit c43ec50

Browse files
Sugar Zhangbroonie
authored andcommitted
ASoC: rockchip: spdif: Add support for format S32_LE
Treat 32 bit sample width as if it was 24 bits using only the 24 most significant bits. [I've merged the channel-swapping fix from Zohn Ni into Sugar Zhang's patch introducing the problem in the first place] Co-developed-by: Zohn Ni <zohn.ni@rock-chips.com> Signed-off-by: Zohn Ni <zohn.ni@rock-chips.com> Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com> Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com> Link: https://patch.msgid.link/20260203-rockchip-spdif-cleanup-and-bsp-sync-v2-8-4412016cf577@collabora.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 2980827 commit c43ec50

2 files changed

Lines changed: 28 additions & 2 deletions

File tree

sound/soc/rockchip/rockchip_spdif.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,21 +99,38 @@ static int rk_spdif_hw_params(struct snd_pcm_substream *substream,
9999
switch (params_format(params)) {
100100
case SNDRV_PCM_FORMAT_S16_LE:
101101
val |= SPDIF_CFGR_VDW_16;
102+
val |= SPDIF_CFGR_ADJ_RIGHT_J;
102103
break;
103104
case SNDRV_PCM_FORMAT_S20_3LE:
104105
val |= SPDIF_CFGR_VDW_20;
106+
val |= SPDIF_CFGR_ADJ_RIGHT_J;
105107
break;
106108
case SNDRV_PCM_FORMAT_S24_LE:
107109
val |= SPDIF_CFGR_VDW_24;
110+
val |= SPDIF_CFGR_ADJ_RIGHT_J;
111+
break;
112+
case SNDRV_PCM_FORMAT_S32_LE:
113+
val |= SPDIF_CFGR_VDW_24;
114+
val |= SPDIF_CFGR_ADJ_LEFT_J;
108115
break;
109116
default:
110117
return -EINVAL;
111118
}
112119

120+
/*
121+
* clear MCLK domain logic before setting Fmclk and Fsdo to ensure
122+
* that switching between S16_LE and S32_LE audio does not result
123+
* in accidential channels swap.
124+
*/
125+
regmap_update_bits(spdif->regmap, SPDIF_CFGR, SPDIF_CFGR_CLR_MASK,
126+
SPDIF_CFGR_CLR_EN);
127+
udelay(1);
128+
113129
ret = regmap_update_bits(spdif->regmap, SPDIF_CFGR,
114130
SPDIF_CFGR_CLK_DIV_MASK |
115131
SPDIF_CFGR_HALFWORD_ENABLE |
116-
SDPIF_CFGR_VDW_MASK, val);
132+
SDPIF_CFGR_VDW_MASK |
133+
SPDIF_CFGR_ADJ_MASK, val);
117134

118135
return ret;
119136
}
@@ -203,7 +220,8 @@ static struct snd_soc_dai_driver rk_spdif_dai = {
203220
.rates = SNDRV_PCM_RATE_8000_192000,
204221
.formats = (SNDRV_PCM_FMTBIT_S16_LE |
205222
SNDRV_PCM_FMTBIT_S20_3LE |
206-
SNDRV_PCM_FMTBIT_S24_LE),
223+
SNDRV_PCM_FMTBIT_S24_LE |
224+
SNDRV_PCM_FMTBIT_S32_LE),
207225
},
208226
.ops = &rk_spdif_dai_ops,
209227
};

sound/soc/rockchip/rockchip_spdif.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@
1717
#define SPDIF_CFGR_CLK_DIV_MASK (0xff << SPDIF_CFGR_CLK_DIV_SHIFT)
1818
#define SPDIF_CFGR_CLK_DIV(x) ((x-1) << SPDIF_CFGR_CLK_DIV_SHIFT)
1919

20+
#define SPDIF_CFGR_CLR_MASK BIT(7)
21+
#define SPDIF_CFGR_CLR_EN BIT(7)
22+
#define SPDIF_CFGR_CLR_DIS 0
23+
24+
#define SPDIF_CFGR_ADJ_MASK BIT(3)
25+
#define SPDIF_CFGR_ADJ_LEFT_J BIT(3)
26+
#define SPDIF_CFGR_ADJ_RIGHT_J 0
27+
2028
#define SPDIF_CFGR_HALFWORD_SHIFT 2
2129
#define SPDIF_CFGR_HALFWORD_DISABLE (0 << SPDIF_CFGR_HALFWORD_SHIFT)
2230
#define SPDIF_CFGR_HALFWORD_ENABLE (1 << SPDIF_CFGR_HALFWORD_SHIFT)

0 commit comments

Comments
 (0)