summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaxminath Kasam <lkasam@codeaurora.org>2017-01-24 18:05:32 +0530
committerLaxminath Kasam <lkasam@codeaurora.org>2017-01-25 17:42:05 +0530
commit01a680eb49c5044b92bca299bd3d86ec1bdbabcc (patch)
tree5dd546053a00b70bbcc2a8dba246514a37c92a5c
parent9335a12bb020a88365919c6f44850a5b1c4b94b9 (diff)
ARM: dts: msm: Add audio fixes for SDM660
Update internal codec settings for RX/TX devices. Disable lpass notifier in analog codec driver. Handle 44.1K support in machine driver to disable MCLK before request for change in MCLK frequency. Change-Id: I5f78f07da46dee0c66e4e374da600e2e5c5d8e21 Signed-off-by: Laxminath Kasam <lkasam@codeaurora.org>
-rw-r--r--arch/arm/boot/dts/qcom/msm-audio.dtsi2
-rw-r--r--arch/arm/boot/dts/qcom/sdm660-audio.dtsi4
-rw-r--r--arch/arm/boot/dts/qcom/sdm660-internal-codec-cdp.dts6
-rw-r--r--arch/arm/boot/dts/qcom/sdm660-internal-codec-mtp.dts1
-rw-r--r--arch/arm/boot/dts/qcom/sdm660-internal-codec-pm660a-cdp.dts6
-rw-r--r--arch/arm/boot/dts/qcom/sdm660-internal-codec-pm660a-rcm.dts6
-rw-r--r--arch/arm/boot/dts/qcom/sdm660-internal-codec-rcm.dts6
-rw-r--r--arch/arm/boot/dts/qcom/sdm660-internal-codec.dtsi4
-rw-r--r--arch/arm/boot/dts/qcom/sdm660-lpi.dtsi22
-rw-r--r--sound/soc/codecs/sdm660_cdc/msm-analog-cdc.c21
-rw-r--r--sound/soc/codecs/sdm660_cdc/msm-digital-cdc.c41
-rw-r--r--sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c3
-rw-r--r--sound/soc/msm/qdsp6v2/q6afe.c14
-rw-r--r--sound/soc/msm/sdm660-internal.c9
14 files changed, 66 insertions, 79 deletions
diff --git a/arch/arm/boot/dts/qcom/msm-audio.dtsi b/arch/arm/boot/dts/qcom/msm-audio.dtsi
index e4903a821bc1..bc960093fcea 100644
--- a/arch/arm/boot/dts/qcom/msm-audio.dtsi
+++ b/arch/arm/boot/dts/qcom/msm-audio.dtsi
@@ -827,6 +827,7 @@
qcom,msm-mclk-freq = <9600000>;
qcom,msm-mbhc-hphl-swh = <1>;
qcom,msm-mbhc-gnd-swh = <1>;
+ qcom,msm-micbias2-ext-cap;
qcom,msm-hs-micbias-type = "external";
qcom,us-euro-gpios = <&us_euro_gpio>;
qcom,cdc-pdm-gpios = <&cdc_pdm_gpios>;
@@ -928,7 +929,6 @@
};
clock_audio: audio_ext_clk {
- status = "disabled";
compatible = "qcom,audio-ref-clk";
qcom,audio-ref-clk-gpio = <&pm660_gpios 3 0>;
clock-names = "osr_clk";
diff --git a/arch/arm/boot/dts/qcom/sdm660-audio.dtsi b/arch/arm/boot/dts/qcom/sdm660-audio.dtsi
index 766642dced6a..6f9a6f9ee946 100644
--- a/arch/arm/boot/dts/qcom/sdm660-audio.dtsi
+++ b/arch/arm/boot/dts/qcom/sdm660-audio.dtsi
@@ -167,8 +167,8 @@
cdc_pdm_gpios: cdc_pdm_pinctrl {
compatible = "qcom,msm-cdc-pinctrl";
pinctrl-names = "aud_active", "aud_sleep";
- pinctrl-0 = <&cdc_pdm_gpios_active>;
- pinctrl-1 = <&cdc_pdm_gpios_sleep>;
+ pinctrl-0 = <&cdc_pdm_gpios_active &cdc_pdm_2_gpios_active>;
+ pinctrl-1 = <&cdc_pdm_gpios_sleep &cdc_pdm_2_gpios_sleep>;
qcom,lpi-gpios;
};
diff --git a/arch/arm/boot/dts/qcom/sdm660-internal-codec-cdp.dts b/arch/arm/boot/dts/qcom/sdm660-internal-codec-cdp.dts
index c5d4504fd97e..6755385313b1 100644
--- a/arch/arm/boot/dts/qcom/sdm660-internal-codec-cdp.dts
+++ b/arch/arm/boot/dts/qcom/sdm660-internal-codec-cdp.dts
@@ -24,9 +24,3 @@
qcom,pmic-id = <0x0001001b 0x0101011a 0x0 0x0>,
<0x0001001b 0x0201011a 0x0 0x0>;
};
-
-&int_codec {
- status = "okay";
- qcom,msm-hs-micbias-type = "internal";
- qcom,msm-micbias2-ext-cap;
-};
diff --git a/arch/arm/boot/dts/qcom/sdm660-internal-codec-mtp.dts b/arch/arm/boot/dts/qcom/sdm660-internal-codec-mtp.dts
index 9d5453240ef9..39da13e7565b 100644
--- a/arch/arm/boot/dts/qcom/sdm660-internal-codec-mtp.dts
+++ b/arch/arm/boot/dts/qcom/sdm660-internal-codec-mtp.dts
@@ -27,5 +27,4 @@
&int_codec {
qcom,model = "sdm660-snd-card-mtp";
- status = "okay";
};
diff --git a/arch/arm/boot/dts/qcom/sdm660-internal-codec-pm660a-cdp.dts b/arch/arm/boot/dts/qcom/sdm660-internal-codec-pm660a-cdp.dts
index 6990c299d4e2..caf8af514237 100644
--- a/arch/arm/boot/dts/qcom/sdm660-internal-codec-pm660a-cdp.dts
+++ b/arch/arm/boot/dts/qcom/sdm660-internal-codec-pm660a-cdp.dts
@@ -24,9 +24,3 @@
qcom,board-id = <1 1>;
qcom,pmic-id = <0x0001001b 0x0001011a 0x0 0x0>;
};
-
-&int_codec {
- status = "okay";
- qcom,msm-hs-micbias-type = "internal";
- qcom,msm-micbias2-ext-cap;
-};
diff --git a/arch/arm/boot/dts/qcom/sdm660-internal-codec-pm660a-rcm.dts b/arch/arm/boot/dts/qcom/sdm660-internal-codec-pm660a-rcm.dts
index 03b0e029a569..462362211f5b 100644
--- a/arch/arm/boot/dts/qcom/sdm660-internal-codec-pm660a-rcm.dts
+++ b/arch/arm/boot/dts/qcom/sdm660-internal-codec-pm660a-rcm.dts
@@ -24,9 +24,3 @@
qcom,board-id = <21 1>;
qcom,pmic-id = <0x0001001b 0x0001011a 0x0 0x0>;
};
-
-&int_codec {
- status = "okay";
- qcom,msm-hs-micbias-type = "internal";
- qcom,msm-micbias2-ext-cap;
-};
diff --git a/arch/arm/boot/dts/qcom/sdm660-internal-codec-rcm.dts b/arch/arm/boot/dts/qcom/sdm660-internal-codec-rcm.dts
index fc79dc9a36ee..8d95f8c422f9 100644
--- a/arch/arm/boot/dts/qcom/sdm660-internal-codec-rcm.dts
+++ b/arch/arm/boot/dts/qcom/sdm660-internal-codec-rcm.dts
@@ -24,9 +24,3 @@
qcom,pmic-id = <0x0001001b 0x0101011a 0x0 0x0>,
<0x0001001b 0x0201011a 0x0 0x0>;
};
-
-&int_codec {
- status = "okay";
- qcom,msm-hs-micbias-type = "internal";
- qcom,msm-micbias2-ext-cap;
-};
diff --git a/arch/arm/boot/dts/qcom/sdm660-internal-codec.dtsi b/arch/arm/boot/dts/qcom/sdm660-internal-codec.dtsi
index 512918966f6d..5f36e76c910d 100644
--- a/arch/arm/boot/dts/qcom/sdm660-internal-codec.dtsi
+++ b/arch/arm/boot/dts/qcom/sdm660-internal-codec.dtsi
@@ -70,6 +70,10 @@
status = "disabled";
};
+&int_codec {
+ status = "okay";
+};
+
&pmic_analog_codec {
status = "okay";
};
diff --git a/arch/arm/boot/dts/qcom/sdm660-lpi.dtsi b/arch/arm/boot/dts/qcom/sdm660-lpi.dtsi
index 195128f3ad43..1fcf0993c4b3 100644
--- a/arch/arm/boot/dts/qcom/sdm660-lpi.dtsi
+++ b/arch/arm/boot/dts/qcom/sdm660-lpi.dtsi
@@ -157,51 +157,55 @@
cdc_dmic12_gpios_active: dmic12_gpios_active {
mux {
- pins = "gpio26", "gpio27";
+ pins = "gpio26", "gpio28";
function = "func1";
};
config {
- pins = "gpio26", "gpio27";
+ pins = "gpio26", "gpio28";
drive-strength = <8>;
+ output-high;
};
};
cdc_dmic12_gpios_sleep: dmic12_gpios_sleep {
mux {
- pins = "gpio26", "gpio27";
+ pins = "gpio26", "gpio28";
function = "func1";
};
config {
- pins = "gpio26", "gpio27";
+ pins = "gpio26", "gpio28";
drive-strength = <2>;
bias-disable;
+ output-low;
};
};
cdc_dmic34_gpios_active: dmic34_gpios_active {
mux {
- pins = "gpio28", "gpio29";
+ pins = "gpio27", "gpio29";
function = "func1";
};
config {
- pins = "gpio28", "gpio29";
+ pins = "gpio27", "gpio29";
drive-strength = <8>;
+ input-enable;
};
};
cdc_dmic34_gpios_sleep: dmic34_gpios_sleep {
mux {
- pins = "gpio28", "gpio29";
+ pins = "gpio27", "gpio29";
function = "func1";
};
config {
- pins = "gpio28", "gpio29";
+ pins = "gpio27", "gpio29";
drive-strength = <2>;
- bias-disable;
+ pull-down;
+ input-enable;
};
};
};
diff --git a/sound/soc/codecs/sdm660_cdc/msm-analog-cdc.c b/sound/soc/codecs/sdm660_cdc/msm-analog-cdc.c
index b94001d8a6eb..85cf0eb48ee0 100644
--- a/sound/soc/codecs/sdm660_cdc/msm-analog-cdc.c
+++ b/sound/soc/codecs/sdm660_cdc/msm-analog-cdc.c
@@ -94,6 +94,7 @@ static struct snd_soc_dai_driver msm_anlg_cdc_i2s_dai[];
/* By default enable the internal speaker boost */
static bool spkr_boost_en = true;
static bool initial_boot = true;
+static bool is_ssr_en;
static char on_demand_supply_name[][MAX_ON_DEMAND_SUPPLY_NAME_LENGTH] = {
"cdc-vdd-mic-bias",
@@ -4052,15 +4053,17 @@ int msm_anlg_codec_info_create_codec_entry(struct snd_info_entry *codec_root,
return -ENOMEM;
}
sdm660_cdc_priv->version_entry = version_entry;
- sdm660_cdc_priv->audio_ssr_nb.notifier_call =
- sdm660_cdc_notifier_service_cb;
- ret = audio_notifier_register("pmic_analog_cdc",
- AUDIO_NOTIFIER_ADSP_DOMAIN,
- &sdm660_cdc_priv->audio_ssr_nb);
- if (ret < 0) {
- pr_err("%s: Audio notifier register failed ret = %d\n",
- __func__, ret);
- return ret;
+ if (is_ssr_en) {
+ sdm660_cdc_priv->audio_ssr_nb.notifier_call =
+ sdm660_cdc_notifier_service_cb;
+ ret = audio_notifier_register("pmic_analog_cdc",
+ AUDIO_NOTIFIER_ADSP_DOMAIN,
+ &sdm660_cdc_priv->audio_ssr_nb);
+ if (ret < 0) {
+ pr_err("%s: Audio notifier register failed ret = %d\n",
+ __func__, ret);
+ return ret;
+ }
}
return 0;
}
diff --git a/sound/soc/codecs/sdm660_cdc/msm-digital-cdc.c b/sound/soc/codecs/sdm660_cdc/msm-digital-cdc.c
index c39b6d57f908..5c210dc2176e 100644
--- a/sound/soc/codecs/sdm660_cdc/msm-digital-cdc.c
+++ b/sound/soc/codecs/sdm660_cdc/msm-digital-cdc.c
@@ -333,21 +333,6 @@ static int msm_dig_cdc_codec_enable_interpolator(struct snd_soc_dapm_widget *w,
return 0;
}
-static int msm_dig_cdc_codec_enable_rx_chain(struct snd_soc_dapm_widget *w,
- struct snd_kcontrol *kcontrol,
- int event)
-{
- struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
-
- switch (event) {
- case SND_SOC_DAPM_POST_PMD:
- snd_soc_update_bits(codec, w->reg,
- 1 << w->shift, 0x00);
- break;
- }
- return 0;
-}
-
static int msm_dig_cdc_get_iir_enable_audio_mixer(
struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
@@ -809,13 +794,18 @@ static int msm_dig_cdc_codec_enable_dmic(struct snd_soc_dapm_widget *w,
(*dmic_clk_cnt)++;
if (*dmic_clk_cnt == 1) {
snd_soc_update_bits(codec, dmic_clk_reg,
- 0x0E, 0x02);
+ 0x0E, 0x04);
snd_soc_update_bits(codec, dmic_clk_reg,
dmic_clk_en, dmic_clk_en);
}
snd_soc_update_bits(codec,
- MSM89XX_CDC_CORE_TX1_DMIC_CTL + (dmic - 1) * 0x20,
- 0x07, 0x02);
+ MSM89XX_CDC_CORE_TX1_DMIC_CTL, 0x07, 0x02);
+ snd_soc_update_bits(codec,
+ MSM89XX_CDC_CORE_TX2_DMIC_CTL, 0x07, 0x02);
+ snd_soc_update_bits(codec,
+ MSM89XX_CDC_CORE_TX3_DMIC_CTL, 0x07, 0x02);
+ snd_soc_update_bits(codec,
+ MSM89XX_CDC_CORE_TX4_DMIC_CTL, 0x07, 0x02);
break;
case SND_SOC_DAPM_POST_PMD:
(*dmic_clk_cnt)--;
@@ -1556,18 +1546,9 @@ static const struct snd_soc_dapm_widget msm_dig_dapm_widgets[] = {
SND_SOC_DAPM_MIXER("RX1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
SND_SOC_DAPM_MIXER("RX2 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
- SND_SOC_DAPM_MIXER_E("RX1 CHAIN", SND_SOC_NOPM,
- 0, 0, NULL, 0,
- msm_dig_cdc_codec_enable_rx_chain,
- SND_SOC_DAPM_POST_PMD),
- SND_SOC_DAPM_MIXER_E("RX2 CHAIN", SND_SOC_NOPM,
- 0, 0, NULL, 0,
- msm_dig_cdc_codec_enable_rx_chain,
- SND_SOC_DAPM_POST_PMD),
- SND_SOC_DAPM_MIXER_E("RX3 CHAIN", SND_SOC_NOPM,
- 0, 0, NULL, 0,
- msm_dig_cdc_codec_enable_rx_chain,
- SND_SOC_DAPM_POST_PMD),
+ SND_SOC_DAPM_MIXER("RX1 CHAIN", SND_SOC_NOPM, 0, 0, NULL, 0),
+ SND_SOC_DAPM_MIXER("RX2 CHAIN", SND_SOC_NOPM, 0, 0, NULL, 0),
+ SND_SOC_DAPM_MIXER("RX3 CHAIN", SND_SOC_NOPM, 0, 0, NULL, 0),
SND_SOC_DAPM_MUX("RX1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
&rx_mix1_inp1_mux),
diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c
index 485ffa06f5bd..63132d112496 100644
--- a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c
+++ b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c
@@ -7806,7 +7806,8 @@ static int msm_routing_put_stereo_to_custom_stereo_control(
continue;
if ((port_id != SLIMBUS_0_RX) &&
(port_id != RT_PROXY_PORT_001_RX) &&
- (port_id != AFE_PORT_ID_PRIMARY_MI2S_RX))
+ (port_id != AFE_PORT_ID_PRIMARY_MI2S_RX) &&
+ (port_id != AFE_PORT_ID_INT4_MI2S_RX))
continue;
for_each_set_bit(i, &msm_bedais[be_index].fe_sessions,
diff --git a/sound/soc/msm/qdsp6v2/q6afe.c b/sound/soc/msm/qdsp6v2/q6afe.c
index 4ceaa452f14b..7ccb9f066e35 100644
--- a/sound/soc/msm/qdsp6v2/q6afe.c
+++ b/sound/soc/msm/qdsp6v2/q6afe.c
@@ -5033,6 +5033,20 @@ int afe_validate_port(u16 port_id)
case AFE_PORT_ID_QUATERNARY_TDM_TX_6:
case AFE_PORT_ID_QUATERNARY_TDM_RX_7:
case AFE_PORT_ID_QUATERNARY_TDM_TX_7:
+ case AFE_PORT_ID_INT0_MI2S_RX:
+ case AFE_PORT_ID_INT1_MI2S_RX:
+ case AFE_PORT_ID_INT2_MI2S_RX:
+ case AFE_PORT_ID_INT3_MI2S_RX:
+ case AFE_PORT_ID_INT4_MI2S_RX:
+ case AFE_PORT_ID_INT5_MI2S_RX:
+ case AFE_PORT_ID_INT6_MI2S_RX:
+ case AFE_PORT_ID_INT0_MI2S_TX:
+ case AFE_PORT_ID_INT1_MI2S_TX:
+ case AFE_PORT_ID_INT2_MI2S_TX:
+ case AFE_PORT_ID_INT3_MI2S_TX:
+ case AFE_PORT_ID_INT4_MI2S_TX:
+ case AFE_PORT_ID_INT5_MI2S_TX:
+ case AFE_PORT_ID_INT6_MI2S_TX:
{
ret = 0;
break;
diff --git a/sound/soc/msm/sdm660-internal.c b/sound/soc/msm/sdm660-internal.c
index 4ca579694a05..c002399beb6b 100644
--- a/sound/soc/msm/sdm660-internal.c
+++ b/sound/soc/msm/sdm660-internal.c
@@ -730,6 +730,12 @@ static int msm_int_enable_dig_cdc_clk(struct snd_soc_codec *codec,
mutex_lock(&pdata->cdc_int_mclk0_mutex);
if (atomic_read(&pdata->int_mclk0_enabled) == false ||
int_mclk0_freq_chg) {
+ if (atomic_read(&pdata->int_mclk0_enabled)) {
+ pdata->digital_cdc_core_clk.enable = 0;
+ afe_set_lpass_clock_v2(
+ AFE_PORT_ID_INT0_MI2S_RX,
+ &pdata->digital_cdc_core_clk);
+ }
pdata->digital_cdc_core_clk.clk_freq_in_hz =
clk_freq_in_hz;
pdata->digital_cdc_core_clk.enable = 1;
@@ -1089,8 +1095,7 @@ static void update_int_mi2s_clk_val(int idx, int stream)
bit_per_sample =
get_int_mi2s_bits_per_sample(int_mi2s_cfg[idx].bit_format);
int_mi2s_clk[idx].clk_freq_in_hz =
- (int_mi2s_cfg[idx].sample_rate * int_mi2s_cfg[idx].channels
- * bit_per_sample);
+ (int_mi2s_cfg[idx].sample_rate * 2 * bit_per_sample);
}
static int int_mi2s_set_sclk(struct snd_pcm_substream *substream, bool enable)