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;