From b87d415824a11d1d3c574b0ad6b4c4846f1c5335 Mon Sep 17 00:00:00 2001 From: Sugar Zhang Date: Wed, 15 Mar 2023 10:18:35 +0800 Subject: [PATCH] ASoC: rockchip: i2s-tdm: Simplify clk reparent on TRCM mode This patch do reparent CLK_TX/RX to the same parent on TRCM mode in driver instead of assign parent from DT. Now, the assigned-parent from DT can be removed. -assigned-clocks = <&cru SCLK_I2S0_8CH_RX>; -assigned-clock-parents = <&cru SCLK_I2S0_8CH_TX_MUX>; Signed-off-by: Sugar Zhang Change-Id: I0abda09a1348d05306e4026f61f7daa2850ae323 --- sound/soc/rockchip/rockchip_i2s_tdm.c | 43 +++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.c b/sound/soc/rockchip/rockchip_i2s_tdm.c index d15b777d5b70..f1043607ec1c 100644 --- a/sound/soc/rockchip/rockchip_i2s_tdm.c +++ b/sound/soc/rockchip/rockchip_i2s_tdm.c @@ -916,6 +916,41 @@ static int rockchip_i2s_tdm_calibrate_mclk(struct rk_i2s_tdm_dev *i2s_tdm, return ret; } +static int rockchip_i2s_tdm_mclk_reparent(struct rk_i2s_tdm_dev *i2s_tdm) +{ + struct clk *parent; + int ret = 0; + + /* reparent to the same clk on TRCM mode */ + switch (i2s_tdm->clk_trcm) { + case I2S_CKR_TRCM_TXONLY: + parent = clk_get_parent(i2s_tdm->mclk_tx); + /* + * API clk_has_parent is not available yet on GKI, so we + * use clk_set_parent directly and ignore the ret value. + * if the API has addressed on GKI, should remove it. + */ +#ifdef CONFIG_NO_GKI + if (clk_has_parent(i2s_tdm->mclk_rx, parent)) + ret = clk_set_parent(i2s_tdm->mclk_rx, parent); +#else + clk_set_parent(i2s_tdm->mclk_rx, parent); +#endif + break; + case I2S_CKR_TRCM_RXONLY: + parent = clk_get_parent(i2s_tdm->mclk_rx); +#ifdef CONFIG_NO_GKI + if (clk_has_parent(i2s_tdm->mclk_tx, parent)) + ret = clk_set_parent(i2s_tdm->mclk_tx, parent); +#else + clk_set_parent(i2s_tdm->mclk_tx, parent); +#endif + break; + } + + return ret; +} + static int rockchip_i2s_tdm_set_mclk(struct rk_i2s_tdm_dev *i2s_tdm, struct snd_pcm_substream *substream, struct clk **mclk) @@ -941,6 +976,10 @@ static int rockchip_i2s_tdm_set_mclk(struct rk_i2s_tdm_dev *i2s_tdm, if (ret) goto err; + ret = rockchip_i2s_tdm_mclk_reparent(i2s_tdm); + if (ret) + goto err; + /* mclk_rx is also ok. */ *mclk = i2s_tdm->mclk_tx; } else { @@ -2224,6 +2263,10 @@ static int rockchip_i2s_tdm_probe(struct platform_device *pdev) clk_set_rate(i2s_tdm->mclk_rx, rate); clk_set_rate(i2s_tdm->mclk_tx, rate); + ret = rockchip_i2s_tdm_mclk_reparent(i2s_tdm); + if (ret) + goto err_pm_disable; + regmap_update_bits(i2s_tdm->regmap, I2S_CLKDIV, I2S_CLKDIV_RXM_MASK | I2S_CLKDIV_TXM_MASK, I2S_CLKDIV_RXM(div_bclk) | I2S_CLKDIV_TXM(div_bclk));