RK系列SDK -- I2S MCLK 一直保持开启状态

说明:本文适用于基于 linux 4.4 内核版本开发系列SDK。针对部分需要开机后就一直提供 I2S MCLK 才能正常工作的codec,软件端加下述patch即可。

代码路径:kernel/sound/soc/rockchip/rockchip_i2s.c

diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c
index e48b8b1..b3f388c 100644
--- a/sound/soc/rockchip/rockchip_i2s.c
+++ b/sound/soc/rockchip/rockchip_i2s.c
@@ -67,7 +67,7 @@ static int i2s_runtime_suspend(struct device *dev)
        struct rk_i2s_dev *i2s = dev_get_drvdata(dev);
 
        regcache_cache_only(i2s->regmap, true);
-       clk_disable_unprepare(i2s->mclk);
+//     clk_disable_unprepare(i2s->mclk);
 
        return 0;
 }
@@ -83,6 +83,12 @@ static int i2s_runtime_resume(struct device *dev)
                return ret;
        }
 
+       ret = clk_set_rate(i2s->mclk, 12288000 );
+       if (ret)
+               dev_err(i2s->dev, "Fail to set mclk %d\n", ret);
+       regmap_update_bits(i2s->regmap, I2S_XFER,
+                          I2S_XFER_TXS_START | I2S_XFER_RXS_START,
+                          I2S_XFER_TXS_START | I2S_XFER_RXS_START);
        regcache_cache_only(i2s->regmap, false);
        regcache_mark_dirty(i2s->regmap);

注:上述patch设置的 i2s mclk 频率为12.288MHz,如果需要设置其他频率,修改 clk_set_rate(i2s->mclk, 12288000 ); 中参数2的频率设置值即可。另外,对应codec端驱动如果有 clk_disable_unprepare(…) 的操作也需要//注释掉。

你可能感兴趣的:(RockChip,音频,Linux基础)