Skip to content

Commit 2980827

Browse files
Sugar Zhangbroonie
authored andcommitted
ASoC: rockchip: spdif: Add support for set mclk rate
Allow setting the mclk rate from the machine driver. 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-7-4412016cf577@collabora.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 7bdde9a commit 2980827

2 files changed

Lines changed: 24 additions & 12 deletions

File tree

sound/soc/rockchip/rockchip_spdif.c

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,15 @@ static int rk_spdif_hw_params(struct snd_pcm_substream *substream,
8686
struct snd_soc_dai *dai)
8787
{
8888
struct rk_spdif_dev *spdif = snd_soc_dai_get_drvdata(dai);
89+
unsigned int mclk_rate = clk_get_rate(spdif->mclk);
8990
unsigned int val = SPDIF_CFGR_HALFWORD_ENABLE;
90-
int srate, mclk;
91+
int bmc, div;
9192
int ret;
9293

93-
srate = params_rate(params);
94-
mclk = srate * 128;
94+
/* bmc = 128fs */
95+
bmc = 128 * params_rate(params);
96+
div = DIV_ROUND_CLOSEST(mclk_rate, bmc);
97+
val |= SPDIF_CFGR_CLK_DIV(div);
9598

9699
switch (params_format(params)) {
97100
case SNDRV_PCM_FORMAT_S16_LE:
@@ -107,14 +110,6 @@ static int rk_spdif_hw_params(struct snd_pcm_substream *substream,
107110
return -EINVAL;
108111
}
109112

110-
/* Set clock and calculate divider */
111-
ret = clk_set_rate(spdif->mclk, mclk);
112-
if (ret != 0) {
113-
dev_err(spdif->dev, "Failed to set module clock rate: %d\n",
114-
ret);
115-
return ret;
116-
}
117-
118113
ret = regmap_update_bits(spdif->regmap, SPDIF_CFGR,
119114
SPDIF_CFGR_CLK_DIV_MASK |
120115
SPDIF_CFGR_HALFWORD_ENABLE |
@@ -177,7 +172,24 @@ static int rk_spdif_dai_probe(struct snd_soc_dai *dai)
177172
return 0;
178173
}
179174

175+
static int rk_spdif_set_sysclk(struct snd_soc_dai *dai,
176+
int clk_id, unsigned int freq, int dir)
177+
{
178+
struct rk_spdif_dev *spdif = snd_soc_dai_get_drvdata(dai);
179+
int ret;
180+
181+
if (!freq)
182+
return 0;
183+
184+
ret = clk_set_rate(spdif->mclk, freq);
185+
if (ret)
186+
dev_err(spdif->dev, "Failed to set mclk: %d\n", ret);
187+
188+
return ret;
189+
}
190+
180191
static const struct snd_soc_dai_ops rk_spdif_dai_ops = {
192+
.set_sysclk = rk_spdif_set_sysclk,
181193
.probe = rk_spdif_dai_probe,
182194
.hw_params = rk_spdif_hw_params,
183195
.trigger = rk_spdif_trigger,

sound/soc/rockchip/rockchip_spdif.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
#define SPDIF_CFGR_CLK_DIV_SHIFT (16)
1717
#define SPDIF_CFGR_CLK_DIV_MASK (0xff << SPDIF_CFGR_CLK_DIV_SHIFT)
18-
#define SPDIF_CFGR_CLK_DIV(x) (x << SPDIF_CFGR_CLK_DIV_SHIFT)
18+
#define SPDIF_CFGR_CLK_DIV(x) ((x-1) << SPDIF_CFGR_CLK_DIV_SHIFT)
1919

2020
#define SPDIF_CFGR_HALFWORD_SHIFT 2
2121
#define SPDIF_CFGR_HALFWORD_DISABLE (0 << SPDIF_CFGR_HALFWORD_SHIFT)

0 commit comments

Comments
 (0)