RK3368 es8316和hdmiin共用IIS

1.es8316与hdmiin共用iis的时候,播放声音会杂音,因此当8316使用的时候,需要disable hdmiin功能,可以通过pwdn脚禁止hdmiin芯片

2.当hdmiin使用的时候,需要关闭iis,这个时候就需要禁止主控的mclk和iis功能

以下是3368 8.1的补丁,仅供参考:


    close i2s & mclk when hdmiin open
    
    Change-Id: I6321157b65cd9d524877f0db78e621ca7c2bd308

diff --git a/arch/arm64/boot/dts/rockchip/rk3368.dtsi b/arch/arm64/boot/dts/rockchip/rk3368.dtsi
index 5affdd5..8bf488f 100755
--- a/arch/arm64/boot/dts/rockchip/rk3368.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3368.dtsi
@@ -1294,8 +1294,9 @@
         dma-names = "tx", "rx";
         clock-names = "i2s_clk", "i2s_hclk";
         clocks = <&cru SCLK_I2S_8CH>, <&cru HCLK_I2S_8CH>;
-        pinctrl-names = "default";
+        pinctrl-names = "default","sleep";
         pinctrl-0 = <&i2s_8ch_bus>;
+        pinctrl-1 = <&i2s_8ch_gpio>;
         status = "disabled";
     };
 
@@ -2008,7 +2009,17 @@
                         <2 18 RK_FUNC_1 &pcfg_pull_none>,
                         <2 19 RK_FUNC_1 &pcfg_pull_none>;
             };
-
+            
+            i2s_8ch_gpio: i2s-8ch-gpio {
+                rockchip,pins =<2 12 RK_FUNC_GPIO &pcfg_pull_none>,
+                        <2 13 RK_FUNC_GPIO &pcfg_pull_none>,
+                        <2 14 RK_FUNC_GPIO &pcfg_pull_none>,
+                        <2 15 RK_FUNC_GPIO &pcfg_pull_none>,
+                        <2 16 RK_FUNC_GPIO &pcfg_pull_none>,
+                        <2 17 RK_FUNC_GPIO &pcfg_pull_none>,
+                        <2 18 RK_FUNC_GPIO &pcfg_pull_none>,
+                        <2 19 RK_FUNC_GPIO &pcfg_pull_none>;
+            };
             i2s_8ch_mclk: i2s-8ch-mclk {
                 rockchip,pins = <2 20 RK_FUNC_1 &pcfg_pull_none>;
             };
diff --git a/drivers/media/video/rk_camsys/camsys_mipicsi_phy.c b/drivers/media/video/rk_camsys/camsys_mipicsi_phy.c
old mode 100644
new mode 100755
index 946f49c..ab971d1
--- a/drivers/media/video/rk_camsys/camsys_mipicsi_phy.c
+++ b/drivers/media/video/rk_camsys/camsys_mipicsi_phy.c
@@ -6,6 +6,10 @@ unsigned long rk_grf_base;
 unsigned long rk_cru_base;
 unsigned long rk_isp_base;
 
+int hdmiin_open = 0;
+extern void disable_i2s_pin(int on);
+extern void hdmiin_ctrl_io_stanby(int on);
+extern struct clk *Pmclk;
 static int camsys_mipiphy_clkin_cb(void *ptr, unsigned int on)
 {
     camsys_mipiphy_clk_t *clk;
@@ -33,12 +37,26 @@ static int camsys_mipiphy_clkin_cb(void *ptr, unsigned int on)
         }
     }
     if (on)
+    {
+        printk("hxl on ========================= \n");
+        disable_i2s_pin(1);// disable i2s pin 
+        hdmiin_ctrl_io_stanby(1);
+        clk_disable_unprepare(Pmclk);
+        hdmiin_open = 1;
         camsys_trace(2, "%s mipiphy clk turn on",
         dev_name(camsys_dev->miscdev.this_device));
+    }
     else
+    {
+        printk("hxl off ========================= \n");
+        hdmiin_open = 0;
+        disable_i2s_pin(0);/// enable i2s pin
+        hdmiin_ctrl_io_stanby(0);
+        clk_prepare_enable(Pmclk);
         camsys_trace(2, "%s mipiphy clk turn off",
         dev_name(camsys_dev->miscdev.this_device));
-
+    }
+    
     return 0;
 }
 
diff --git a/sound/soc/codecs/es8316.c b/sound/soc/codecs/es8316.c
index 49e3d67..52599be 100755
--- a/sound/soc/codecs/es8316.c
+++ b/sound/soc/codecs/es8316.c
@@ -44,6 +44,8 @@
 #define BIT_HEADSET_NO_MIC      (1 << 1)
 static struct snd_soc_codec *es8316_codec;
 
+struct clk *Pmclk;
+    
 static const struct reg_default es8316_reg_defaults[] = {
     {0x00, 0x03}, {0x01, 0x03}, {0x02, 0x00}, {0x03, 0x20},
     {0x04, 0x11}, {0x05, 0x00}, {0x06, 0x11}, {0x07, 0x00},
@@ -800,6 +802,8 @@ static int es8316_pcm_hw_params(struct snd_pcm_substream *substream,
     return 0;
 }
 
+extern int hdmiin_open;
+
 static int es8316_mute(struct snd_soc_dai *dai, int mute)
 {
     struct snd_soc_codec *codec = dai->codec;
@@ -807,9 +811,13 @@ static int es8316_mute(struct snd_soc_dai *dai, int mute)
 
     es8316->muted = mute;
     if (mute) {
-        es8316_enable_spk(es8316, false);
-        msleep(100);
-        snd_soc_write(codec, ES8316_DAC_SET1_REG30, 0x20);
+        //hxl
+        if(hdmiin_open == 0)
+        {
+            es8316_enable_spk(es8316, false);
+            msleep(100);
+            snd_soc_write(codec, ES8316_DAC_SET1_REG30, 0x20);
+        }
     } else if (dai->playback_active) {
         snd_soc_write(codec, ES8316_DAC_SET1_REG30, 0x00);
         msleep(130);
@@ -833,13 +841,13 @@ static int es8316_set_bias_level(struct snd_soc_codec *codec,
         if (IS_ERR(es8316->mclk))
             break;
 
-        if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_ON) {
+        /*if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_ON) {
             clk_disable_unprepare(es8316->mclk);
         } else {
             ret = clk_prepare_enable(es8316->mclk);
             if (ret)
                 return ret;
-        }
+        }*/
         break;
 
     case SND_SOC_BIAS_STANDBY:
@@ -1066,6 +1074,7 @@ static void hp_work(struct work_struct *work)
       }
     
 }
+EXPORT_SYMBOL(Pmclk);
 
 static int es8316_probe(struct snd_soc_codec *codec)
 {
@@ -1080,6 +1089,7 @@ static int es8316_probe(struct snd_soc_codec *codec)
     ret = clk_prepare_enable(es8316->mclk);
     if (ret)
         return ret;
+    Pmclk = es8316->mclk;
     ret = snd_soc_read(codec, ES8316_CLKMGR_ADCDIV2_REG05);
     if (!ret) {
         es8316_reset(codec); /* UPDATED BY DAVID,15-3-5 */
diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c
old mode 100644
new mode 100755
index 619e384..0aee8f9
--- a/sound/soc/rockchip/rockchip_i2s.c
+++ b/sound/soc/rockchip/rockchip_i2s.c
@@ -24,6 +24,7 @@
 #include "rockchip_i2s.h"
 
 #define DRV_NAME "rockchip-i2s"
+extern int hdmiin_open;
 
 struct rk_i2s_pins {
     u32 reg_offset;
@@ -54,6 +55,8 @@ struct rk_i2s_dev {
     unsigned int bclk_fs;
 };
 
+struct rk_i2s_dev *hdmiin_i2s;
+
 static int i2s_runtime_suspend(struct device *dev)
 {
     struct rk_i2s_dev *i2s = dev_get_drvdata(dev);
@@ -385,16 +388,36 @@ static int rockchip_i2s_hw_params(struct snd_pcm_substream *substream,
     return 0;
 }
 
+
+void disable_i2s_pin(int on)
+{
+       if(on == 1)
+       pinctrl_pm_select_sleep_state(hdmiin_i2s->dev);
+       else
+       pinctrl_pm_select_default_state(hdmiin_i2s->dev);       
+}
+EXPORT_SYMBOL(disable_i2s_pin);
+
 static int rockchip_i2s_trigger(struct snd_pcm_substream *substream,
                 int cmd, struct snd_soc_dai *dai)
 {
     struct rk_i2s_dev *i2s = to_info(dai);
     int ret = 0;
 
+    //pinctrl_pm_select_sleep_state(i2s->dev);
+    printk("hxl =========== rockchip_i2s_trigger \n");
     switch (cmd) {
     case SNDRV_PCM_TRIGGER_START:
     case SNDRV_PCM_TRIGGER_RESUME:
     case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+        if(hdmiin_open == 1)
+        {
+             pinctrl_pm_select_sleep_state(i2s->dev);
+        }
+        else
+        {
+            pinctrl_pm_select_default_state(i2s->dev);   
+        }  
         if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
             rockchip_snd_rxctrl(i2s, 1);
         else
@@ -403,6 +426,15 @@ static int rockchip_i2s_trigger(struct snd_pcm_substream *substream,
     case SNDRV_PCM_TRIGGER_SUSPEND:
     case SNDRV_PCM_TRIGGER_STOP:
     case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+        
+        if(hdmiin_open == 1)
+        {
+             pinctrl_pm_select_sleep_state(i2s->dev);
+        }
+        else
+        {
+            pinctrl_pm_select_default_state(i2s->dev);   
+        }
         if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
             rockchip_snd_rxctrl(i2s, 0);
         else
@@ -680,6 +712,8 @@ static int rockchip_i2s_probe(struct platform_device *pdev)
         dev_err(&pdev->dev, "Could not register PCM\n");
         return ret;
     }
+    
+    hdmiin_i2s = i2s;
 
     return 0;
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值