diff --git a/arch/arm/boot/dts/qcom/mdm9607-mtp.dtsi b/arch/arm/boot/dts/qcom/mdm9607-mtp.dtsi index b1c60c8ce..8e22fcd68 100644 --- a/arch/arm/boot/dts/qcom/mdm9607-mtp.dtsi +++ b/arch/arm/boot/dts/qcom/mdm9607-mtp.dtsi @@ -32,7 +32,7 @@ &blsp1_uart5 { status = "ok"; pinctrl-names = "default"; - pinctrl-0 = <&blsp1_uart5_sleep>; + pinctrl-0 = <&blsp1_uart5_active>; }; &blsp1_uart3 { diff --git a/arch/arm/boot/dts/qcom/mdm9607-pinctrl.dtsi b/arch/arm/boot/dts/qcom/mdm9607-pinctrl.dtsi index e2b732a91..2d47bf7b8 100644 --- a/arch/arm/boot/dts/qcom/mdm9607-pinctrl.dtsi +++ b/arch/arm/boot/dts/qcom/mdm9607-pinctrl.dtsi @@ -383,12 +383,13 @@ }; - pmx_pri_mi2s { - pri_mi2s_ws_active: pri_mi2s_ws_active { + pmx_pri_mi2s_aux { + pri_ws_active_master: pri_ws_active_master { mux { pins = "gpio20"; function = "pri_mi2s_ws_a"; }; + config { pins = "gpio20"; drive-strength = <8>; /* 8 MA */ @@ -397,7 +398,7 @@ }; }; - pri_mi2s_sck_active: pri_mi2s_sck_active { + pri_sck_active_master: pri_sck_active_master { mux { pins = "gpio23"; function = "pri_mi2s_sck_a"; @@ -411,44 +412,33 @@ }; }; - pri_mi2s_dout_active: pri_mi2s_dout_active { - mux { - pins = "gpio22"; - function = "pri_mi2s_data1_a"; - }; - config { - pins = "gpio22"; - drive-strength = <8>; /* 8 MA */ - bias-disable; /* No PULL */ - output-high; - }; - }; - - pri_mi2s_ws_sleep: pri_mi2s_ws_sleep { + pri_ws_active_slave: pri_ws_active_slave { mux { pins = "gpio20"; function = "pri_mi2s_ws_a"; }; + config { pins = "gpio20"; - drive-strength = <2>; /* 2 MA */ - bias-pull-down; /* PULL DOWN */ + drive-strength = <8>; /* 8 MA */ + bias-disable; /* No PULL */ }; }; - pri_mi2s_sck_sleep: pri_mi2s_sck_sleep { + pri_sck_active_slave: pri_sck_active_slave { mux { pins = "gpio23"; function = "pri_mi2s_sck_a"; }; + config { pins = "gpio23"; - drive-strength = <2>; /* 2 MA */ - bias-pull-down; /* PULL DOWN */ + drive-strength = <8>; /* 8 MA */ + bias-disable; /* No PULL */ }; }; - pri_mi2s_dout_sleep: pri_mi2s_dout_sleep { + pri_dout_active: pri_dout_active { mux { pins = "gpio22"; function = "pri_mi2s_data1_a"; @@ -456,149 +446,87 @@ config { pins = "gpio22"; - drive-strength = <2>; /* 2 MA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - pmx_pri_mi2s_din { - pri_mi2s_din_active: pri_mi2s_din_active { - mux { - pins = "gpio21"; - function = "pri_mi2s_data0_a"; - }; - config { - pins = "gpio21"; - drive-strength = <8>; /* 8 MA */ - bias-disable; /* No PULL */ - }; - }; - - pri_mi2s_din_sleep: pri_mi2s_din_sleep { - mux { - pins = "gpio21"; - function = "pri_mi2s_data0_a"; - }; - config { - pins = "gpio21"; - drive-strength = <2>; /* 2 MA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - pmx_sec_mi2s { - sec_mi2s_ws_active: sec_mi2s_ws_active { - mux { - pins = "gpio79"; - function = "sec_mi2s"; - }; - config { - pins = "gpio79"; - drive-strength = <8>; /* 8 MA */ - bias-disable; /* No PULL */ - output-high; - }; - }; - - sec_mi2s_sck_active: sec_mi2s_sck_active { - mux { - pins = "gpio78"; - function = "sec_mi2s"; - }; - - config { - pins = "gpio78"; drive-strength = <8>; /* 8 MA */ bias-disable; /* No PULL */ output-high; }; }; - sec_mi2s_dout_active: sec_mi2s_dout_active { + pri_ws_sleep: pri_ws_sleep { mux { - pins = "gpio77"; - function = "sec_mi2s"; - }; - config { - pins = "gpio77"; - drive-strength = <8>; /* 8 MA */ - bias-disable; /* No PULL */ - output-high; + pins = "gpio20"; + function = "pri_mi2s_ws_a"; }; - }; - sec_mi2s_ws_sleep: sec_mi2s_ws_sleep { - mux { - pins = "gpio79"; - function = "sec_mi2s"; - }; config { - pins = "gpio79"; + pins = "gpio20"; drive-strength = <2>; /* 2 MA */ bias-pull-down; /* PULL DOWN */ }; }; - sec_mi2s_sck_sleep: sec_mi2s_sck_sleep { + pri_sck_sleep: pri_sck_sleep { mux { - pins = "gpio78"; - function = "sec_mi2s"; + pins = "gpio23"; + function = "pri_mi2s_sck_a"; }; + config { - pins = "gpio78"; + pins = "gpio23"; drive-strength = <2>; /* 2 MA */ bias-pull-down; /* PULL DOWN */ }; }; - sec_mi2s_dout_sleep: sec_mi2s_dout_sleep { + pri_dout_sleep: pri_dout_sleep { mux { - pins = "gpio77"; - function = "sec_mi2s"; + pins = "gpio22"; + function = "pri_mi2s_data1_a"; }; config { - pins = "gpio77"; + pins = "gpio22"; drive-strength = <2>; /* 2 MA */ bias-pull-down; /* PULL DOWN */ }; }; }; - pmx_sec_mi2s_din { - sec_mi2s_din_active: sec_mi2s_din_active { + pmx_pri_mi2s_aux_din { + pri_din_active: pri_din_active { mux { - pins = "gpio76"; - function = "sec_mi2s"; + pins = "gpio21"; + function = "pri_mi2s_data0_a"; }; + config { - pins = "gpio76"; + pins = "gpio21"; drive-strength = <8>; /* 8 MA */ bias-disable; /* No PULL */ }; }; - sec_mi2s_din_sleep: sec_mi2s_din_sleep { + pri_din_sleep: pri_din_sleep { mux { - pins = "gpio76"; - function = "sec_mi2s"; + pins = "gpio21"; + function = "pri_mi2s_data0_a"; }; + config { - pins = "gpio76"; + pins = "gpio21"; drive-strength = <2>; /* 2 MA */ bias-pull-down; /* PULL DOWN */ }; }; }; - pmx_pri_auxpcm { - pri_auxpcm_ws_active: pri_auxpcm_ws_active { + pmx_sec_mi2s_aux { + sec_ws_active_master: sec_ws_active_master { mux { pins = "gpio79"; function = "sec_mi2s"; }; + config { pins = "gpio79"; drive-strength = <8>; /* 8 MA */ @@ -607,7 +535,7 @@ }; }; - pri_auxpcm_sck_active: pri_auxpcm_sck_active { + sec_sck_active_master: sec_sck_active_master { mux { pins = "gpio78"; function = "sec_mi2s"; @@ -621,98 +549,20 @@ }; }; - pri_auxpcm_dout_active: pri_auxpcm_dout_active { - mux { - pins = "gpio77"; - function = "sec_mi2s"; - }; - config { - pins = "gpio77"; - drive-strength = <8>; /* 8 MA */ - bias-disable; /* No PULL */ - output-high; - }; - }; - - pri_auxpcm_ws_sleep: pri_auxpcm_ws_sleep { + sec_ws_active_slave: sec_ws_active_slave { mux { pins = "gpio79"; function = "sec_mi2s"; }; - config { - pins = "gpio79"; - drive-strength = <2>; /* 2 MA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - - pri_auxpcm_sck_sleep: pri_auxpcm_sck_sleep { - mux { - pins = "gpio78"; - function = "sec_mi2s"; - }; - config { - pins = "gpio78"; - drive-strength = <2>; /* 2 MA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - - pri_auxpcm_dout_sleep: pri_auxpcm_dout_sleep { - mux { - pins = "gpio77"; - function = "sec_mi2s"; - }; - - config { - pins = "gpio77"; - drive-strength = <2>; /* 2 MA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - pmx_pri_auxpcm_din { - pri_auxpcm_din_active: pri_auxpcm_din_active { - mux { - pins = "gpio76"; - function = "sec_mi2s"; - }; - config { - pins = "gpio76"; - drive-strength = <8>; /* 8 MA */ - bias-disable; /* No PULL */ - }; - }; - - pri_auxpcm_din_sleep: pri_auxpcm_din_sleep { - mux { - pins = "gpio76"; - function = "sec_mi2s"; - }; - config { - pins = "gpio76"; - drive-strength = <2>; /* 2 MA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - pmx_sec_auxpcm { - sec_auxpcm_ws_active: sec_auxpcm_ws_active { - mux { - pins = "gpio79"; - function = "sec_mi2s"; - }; config { pins = "gpio79"; drive-strength = <8>; /* 8 MA */ bias-disable; /* No PULL */ - output-high; }; }; - sec_auxpcm_sck_active: sec_auxpcm_sck_active { + sec_sck_active_slave: sec_sck_active_slave { mux { pins = "gpio78"; function = "sec_mi2s"; @@ -722,15 +572,15 @@ pins = "gpio78"; drive-strength = <8>; /* 8 MA */ bias-disable; /* No PULL */ - output-high; }; }; - sec_auxpcm_dout_active: sec_auxpcm_dout_active { + sec_dout_active: sec_dout_active { mux { pins = "gpio77"; function = "sec_mi2s"; }; + config { pins = "gpio77"; drive-strength = <8>; /* 8 MA */ @@ -739,11 +589,12 @@ }; }; - sec_auxpcm_ws_sleep: sec_auxpcm_ws_sleep { + sec_ws_sleep: sec_ws_sleep { mux { pins = "gpio79"; function = "sec_mi2s"; }; + config { pins = "gpio79"; drive-strength = <2>; /* 2 MA */ @@ -751,11 +602,12 @@ }; }; - sec_auxpcm_sck_sleep: sec_auxpcm_sck_sleep { + sec_sck_sleep: sec_sck_sleep { mux { pins = "gpio78"; function = "sec_mi2s"; }; + config { pins = "gpio78"; drive-strength = <2>; /* 2 MA */ @@ -763,7 +615,7 @@ }; }; - sec_auxpcm_dout_sleep: sec_auxpcm_dout_sleep { + sec_dout_sleep: sec_dout_sleep { mux { pins = "gpio77"; function = "sec_mi2s"; @@ -777,12 +629,13 @@ }; }; - pmx_sec_auxpcm_din { - sec_auxpcm_din_active: sec_auxpcm_din_active { + pmx_sec_mi2s_aux_din { + sec_din_active: sec_din_active { mux { pins = "gpio76"; function = "sec_mi2s"; }; + config { pins = "gpio76"; drive-strength = <8>; /* 8 MA */ @@ -790,11 +643,12 @@ }; }; - sec_auxpcm_din_sleep: sec_auxpcm_din_sleep { + sec_din_sleep: sec_din_sleep { mux { pins = "gpio76"; function = "sec_mi2s"; }; + config { pins = "gpio76"; drive-strength = <2>; /* 2 MA */ @@ -802,7 +656,6 @@ }; }; }; - pmx_qdsd_clk { qdsd_clk_sdcard: clk_sdcard { config { diff --git a/arch/arm/boot/dts/qcom/mdm9607.dtsi b/arch/arm/boot/dts/qcom/mdm9607.dtsi index 9e8c96ccb..c34e648be 100644 --- a/arch/arm/boot/dts/qcom/mdm9607.dtsi +++ b/arch/arm/boot/dts/qcom/mdm9607.dtsi @@ -799,29 +799,51 @@ qcom,temp2-offset = <1 (-2) 8 (-5) (-4)>; }; - sound{ + sound { compatible = "qcom,mdm9607-audio-tomtom"; qcom,model = "mdm9607-tomtom-i2s-snd-card"; + qcom,audio-routing = + "RX_BIAS", "MCLK", + "LDO_H", "MCLK", + "AMIC2", "MIC BIAS2 External", + "MIC BIAS2 External", "Headset Mic", + "AMIC3", "MIC BIAS2 External", + "MIC BIAS2 External", "ANCRight Headset Mic", + "AMIC4", "MIC BIAS2 External", + "MIC BIAS2 External", "ANCLeft Headset Mic", + "AMIC5", "MIC BIAS1 External", + "MIC BIAS1 External", "Handset Mic", + "AMIC6", "MIC BIAS1 External", + "MIC BIAS1 External", "Handset Mic", + "DMIC1", "MIC BIAS1 External", + "MIC BIAS1 External", "Digital Mic1", + "DMIC3", "MIC BIAS3 External", + "MIC BIAS3 External", "Digital Mic3"; + qcom,codec-mclk-clk-freq = <12288000>; - qcom,mi2s-interface-mode = "pri_mi2s_master", "sec_mi2s_master"; - qcom,auxpcm-interface-mode = "pri_pcm_master", "sec_pcm_master"; + qcom,prim_mi2s_aux_master = <&prim_master>; + qcom,prim_mi2s_aux_slave = <&prim_slave>; + qcom,sec_mi2s_aux_master = <&sec_master>; + qcom,sec_mi2s_aux_slave = <&sec_slave>; asoc-platform = <&pcm0>, <&pcm1>, <&voip>, <&voice>, <&loopback>, <&hostless>, <&afe>, <&routing>, - <&pcm_dtmf>, <&pcm_dsp_dtmf>, <&host_pcm>, <&compress>; + <&pcm_dtmf>, <&host_pcm>, <&compress>; asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", "msm-voip-dsp", "msm-pcm-voice", "msm-pcm-loopback", "msm-pcm-hostless", "msm-pcm-afe", "msm-pcm-routing", - "msm-pcm-dtmf", "msm-pcm-dsp-dtmf", - "msm-voice-host-pcm", "msm-compress-dsp"; + "msm-pcm-dtmf", "msm-voice-host-pcm", + "msm-compress-dsp"; asoc-cpu = <&dai_pri_auxpcm>, <&dai_sec_auxpcm>, <&mi2s_prim>, <&mi2s_sec>, <&dtmf_tx>, <&rx_capture_tx>, <&rx_playback_rx>, <&tx_capture_tx>, <&tx_playback_rx>, <&afe_pcm_rx>, <&afe_pcm_tx>, <&afe_proxy_rx>, <&afe_proxy_tx>, <&incall_record_rx>, - <&incall_record_tx>, <&incall_music_rx>; + <&incall_record_tx>, <&incall_music_rx>, + <&dai_pri_tdm_rx_0>, <&dai_pri_tdm_tx_0>, + <&dai_sec_tdm_rx_0>, <&dai_sec_tdm_tx_0>; asoc-cpu-names = "msm-dai-q6-auxpcm.1", "msm-dai-q6-auxpcm.2", "msm-dai-q6-mi2s.0", "msm-dai-q6-mi2s.1", "msm-dai-stub-dev.4", "msm-dai-stub-dev.5", @@ -829,7 +851,9 @@ "msm-dai-stub-dev.8", "msm-dai-q6-dev.224", "msm-dai-q6-dev.225", "msm-dai-q6-dev.241", "msm-dai-q6-dev.240", "msm-dai-q6-dev.32771", - "msm-dai-q6-dev.32772", "msm-dai-q6-dev.32773"; + "msm-dai-q6-dev.32772", "msm-dai-q6-dev.32773", + "msm-dai-q6-tdm.36864", "msm-dai-q6-tdm.36865", + "msm-dai-q6-tdm.36880", "msm-dai-q6-tdm.36881"; asoc-codec = <&stub_codec>; asoc-codec-names = "msm-stub-codec.1"; }; @@ -861,17 +885,19 @@ "MIC BIAS3 External", "Digital Mic4"; qcom,codec-mclk-clk-freq = <12288000>; - qcom,mi2s-interface-mode = "pri_mi2s_master", "sec_mi2s_master"; - qcom,auxpcm-interface-mode = "pri_pcm_master", "sec_pcm_master"; + qcom,prim_mi2s_aux_master = <&prim_master>; + qcom,prim_mi2s_aux_slave = <&prim_slave>; + qcom,sec_mi2s_aux_master = <&sec_master>; + qcom,sec_mi2s_aux_slave = <&sec_slave>; asoc-platform = <&pcm0>, <&pcm1>, <&voip>, <&voice>, <&loopback>, <&hostless>, <&afe>, <&routing>, - <&pcm_dtmf>, <&pcm_dsp_dtmf>, <&host_pcm>, <&compress>; + <&pcm_dtmf>, <&host_pcm>, <&compress>; asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", "msm-voip-dsp", "msm-pcm-voice", "msm-pcm-loopback", "msm-pcm-hostless", "msm-pcm-afe", "msm-pcm-routing", - "msm-pcm-dtmf", "msm-pcm-dsp-dtmf", - "msm-voice-host-pcm", "msm-compress-dsp"; + "msm-pcm-dtmf", "msm-voice-host-pcm", + "msm-compress-dsp"; asoc-cpu = <&dai_pri_auxpcm>, <&dai_sec_auxpcm>, <&mi2s_prim>, <&mi2s_sec>, <&dtmf_tx>, <&rx_capture_tx>, <&rx_playback_rx>, @@ -1031,57 +1057,32 @@ compatible = "qcom,msm-pcm-dtmf"; }; - pcm_dsp_dtmf: qcom,msm-pcm-dsp-dtmf { - compatible = "qcom,msm-pcm-dsp-dtmf"; - }; - - pcm_dtmf_detect: qcom,msm-dtmf-detect { - compatible = "qcom,msm-dtmf-detect"; - }; - dai_pri_auxpcm: qcom,msm-pri-auxpcm { compatible = "qcom,msm-auxpcm-dev"; - qcom,msm-cpudai-auxpcm-mode = <0>, <0>, <0>; - qcom,msm-cpudai-auxpcm-sync = <1>, <1>, <1>; - qcom,msm-cpudai-auxpcm-frame = <5>, <4>, <4>; - qcom,msm-cpudai-auxpcm-quant = <2>, <2>, <2>; - qcom,msm-cpudai-auxpcm-num-slots = <1>, <1>, <1>; - qcom,msm-cpudai-auxpcm-slot-mapping = <1>, <1>, <1>; - qcom,msm-cpudai-auxpcm-data = <0>, <0>, <0>; // One per each sampling rate - qcom,msm-cpudai-auxpcm-pcm-clk-rate = <2048000>, <4096000>, <4096000>; //for pcm 16k, clock rate nede 4096000 + qcom,msm-cpudai-auxpcm-mode = <0>, <0>; + qcom,msm-cpudai-auxpcm-sync = <1>, <1>; + qcom,msm-cpudai-auxpcm-frame = <5>, <4>; + qcom,msm-cpudai-auxpcm-quant = <2>, <2>; + qcom,msm-cpudai-auxpcm-num-slots = <1>, <1>; + qcom,msm-cpudai-auxpcm-slot-mapping = <1>, <1>; + qcom,msm-cpudai-auxpcm-data = <0>, <0>; + qcom,msm-cpudai-auxpcm-pcm-clk-rate = <2048000>, <2048000>; qcom,msm-auxpcm-interface = "primary"; - /*pinctrl-names = "default", "idle"; - pinctrl-0 = <&pri_auxpcm_ws_active - &pri_auxpcm_sck_active - &pri_auxpcm_dout_active - &pri_auxpcm_din_active>; - pinctrl-1 = <&pri_auxpcm_ws_sleep - &pri_auxpcm_sck_sleep - &pri_auxpcm_dout_sleep - &sec_auxpcm_din_sleep>;*/ + qcom,msm-cpudai-afe-clk-ver = <2>; }; dai_sec_auxpcm: qcom,msm-sec-auxpcm { compatible = "qcom,msm-auxpcm-dev"; - qcom,msm-cpudai-auxpcm-mode = <0>, <0>, <0>; - qcom,msm-cpudai-auxpcm-sync = <1>, <1>, <1>; - qcom,msm-cpudai-auxpcm-frame = <5>, <5>, <5>; - qcom,msm-cpudai-auxpcm-quant = <2>, <2>, <2>; - qcom,msm-cpudai-auxpcm-num-slots = <1>, <1>, <1>; - qcom,msm-cpudai-auxpcm-slot-mapping = <1>, <1>, <1>; - qcom,msm-cpudai-auxpcm-data = <0>, <0>, <0>; - qcom,msm-cpudai-auxpcm-pcm-clk-rate = <2048000>, <4096000>, <4096000>; - qcom,msm-cpudai-afe-clk-ver = <2>; + qcom,msm-cpudai-auxpcm-mode = <0>, <0>; + qcom,msm-cpudai-auxpcm-sync = <0>, <1>; + qcom,msm-cpudai-auxpcm-frame = <2>, <4>; + qcom,msm-cpudai-auxpcm-quant = <2>, <2>; + qcom,msm-cpudai-auxpcm-num-slots = <1>, <1>; + qcom,msm-cpudai-auxpcm-slot-mapping = <1>, <1>; + qcom,msm-cpudai-auxpcm-data = <1>, <0>; + qcom,msm-cpudai-auxpcm-pcm-clk-rate = <2048000>, <2048000>; qcom,msm-auxpcm-interface = "secondary"; - pinctrl-names = "default", "idle"; - pinctrl-0 = <&sec_auxpcm_ws_active - &sec_auxpcm_sck_active - &sec_auxpcm_dout_active - &sec_auxpcm_din_active>; - pinctrl-1 = <&sec_auxpcm_ws_sleep - &sec_auxpcm_sck_sleep - &sec_auxpcm_dout_sleep - &sec_auxpcm_din_sleep>; + qcom,msm-cpudai-afe-clk-ver = <2>; }; qcom,msm-dai-mi2s { @@ -1091,9 +1092,7 @@ qcom,msm-dai-q6-mi2s-dev-id = <0>; qcom,msm-mi2s-rx-lines = <2>; qcom,msm-mi2s-tx-lines = <1>; - pinctrl-names = "default", "idle"; }; - mi2s_sec: qcom,msm-dai-q6-mi2s-sec { compatible = "qcom,msm-dai-q6-mi2s"; qcom,msm-dai-q6-mi2s-dev-id = <1>; @@ -1102,6 +1101,62 @@ }; }; + prim_master: prim_master_pinctrl { + compatible = "qcom,wcd-gpio-ctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <&pri_ws_active_master + &pri_sck_active_master + &pri_dout_active + &pri_din_active>; + pinctrl-1 = <&pri_ws_sleep + &pri_sck_sleep + &pri_dout_sleep + &pri_din_sleep>; + qcom,mi2s-auxpcm-cdc-gpios; + }; + + prim_slave: prim_slave_pinctrl { + compatible = "qcom,wcd-gpio-ctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <&pri_ws_active_slave + &pri_sck_active_slave + &pri_dout_active + &pri_din_active>; + pinctrl-1 = <&pri_ws_sleep + &pri_sck_sleep + &pri_dout_sleep + &pri_din_sleep>; + qcom,mi2s-auxpcm-cdc-gpios; + }; + + sec_master: sec_master_pinctrl { + compatible = "qcom,wcd-gpio-ctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <&sec_ws_active_master + &sec_sck_active_master + &sec_dout_active + &sec_din_active>; + pinctrl-1 = <&sec_ws_sleep + &sec_sck_sleep + &sec_dout_sleep + &sec_din_sleep>; + qcom,mi2s-auxpcm-cdc-gpios; + }; + + sec_slave: sec_slave_pinctrl { + compatible = "qcom,wcd-gpio-ctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <&sec_ws_active_slave + &sec_sck_active_slave + &sec_dout_active + &sec_din_active>; + pinctrl-1 = <&sec_ws_sleep + &sec_sck_sleep + &sec_dout_sleep + &sec_din_sleep>; + qcom,mi2s-auxpcm-cdc-gpios; + }; + qcom,msm-thermal { compatible = "qcom,msm-thermal"; qcom,sensor-id = <4>; @@ -1556,7 +1611,81 @@ gpios = <&tlmm_pinmux 53 0>; status = "okay"; }; + qcom,msm-dai-tdm-pri-rx { + compatible = "qcom,msm-dai-tdm"; + qcom,msm-cpudai-tdm-group-id = <37120>; + qcom,msm-cpudai-tdm-group-num-ports = <1>; + qcom,msm-cpudai-tdm-group-port-id = <36864>; + qcom,msm-cpudai-tdm-clk-rate = <12288000>; + qcom,msm-cpudai-tdm-clk-attribute = /bits/ 16 <1>; + dai_pri_tdm_rx_0: qcom,msm-dai-q6-tdm-pri-rx-0 { + compatible = "qcom,msm-dai-q6-tdm"; + qcom,msm-cpudai-tdm-dev-id = <36864>; + qcom,msm-cpudai-tdm-sync-mode = <0>; + qcom,msm-cpudai-tdm-sync-src = <1>; + qcom,msm-cpudai-tdm-data-out = <0>; + qcom,msm-cpudai-tdm-invert-sync = <0>; + qcom,msm-cpudai-tdm-data-delay = <1>; + qcom,msm-cpudai-tdm-data-align = <0>; + }; + }; + qcom,msm-dai-tdm-pri-tx { + compatible = "qcom,msm-dai-tdm"; + qcom,msm-cpudai-tdm-group-id = <37121>; + qcom,msm-cpudai-tdm-group-num-ports = <1>; + qcom,msm-cpudai-tdm-group-port-id = <36865>; + qcom,msm-cpudai-tdm-clk-rate = <12288000>; + qcom,msm-cpudai-tdm-clk-attribute = /bits/ 16 <1>; + dai_pri_tdm_tx_0: qcom,msm-dai-q6-tdm-pri-tx-0 { + compatible = "qcom,msm-dai-q6-tdm"; + qcom,msm-cpudai-tdm-dev-id = <36865>; + qcom,msm-cpudai-tdm-sync-mode = <0>; + qcom,msm-cpudai-tdm-sync-src = <1>; + qcom,msm-cpudai-tdm-data-out = <0>; + qcom,msm-cpudai-tdm-invert-sync = <0>; + qcom,msm-cpudai-tdm-data-delay = <1>; + qcom,msm-cpudai-tdm-data-align = <0>; + }; + }; + + qcom,msm-dai-tdm-sec-rx { + compatible = "qcom,msm-dai-tdm"; + qcom,msm-cpudai-tdm-group-id = <37136>; + qcom,msm-cpudai-tdm-group-num-ports = <1>; + qcom,msm-cpudai-tdm-group-port-id = <36880>; + qcom,msm-cpudai-tdm-clk-rate = <12288000>; + qcom,msm-cpudai-tdm-clk-attribute = /bits/ 16 <1>; + dai_sec_tdm_rx_0: qcom,msm-dai-q6-tdm-sec-rx-0 { + compatible = "qcom,msm-dai-q6-tdm"; + qcom,msm-cpudai-tdm-dev-id = <36880>; + qcom,msm-cpudai-tdm-sync-mode = <0>; + qcom,msm-cpudai-tdm-sync-src = <1>; + qcom,msm-cpudai-tdm-data-out = <0>; + qcom,msm-cpudai-tdm-invert-sync = <0>; + qcom,msm-cpudai-tdm-data-delay = <1>; + qcom,msm-cpudai-tdm-data-align = <0>; + }; + }; + + qcom,msm-dai-tdm-sec-tx { + compatible = "qcom,msm-dai-tdm"; + qcom,msm-cpudai-tdm-group-id = <37137>; + qcom,msm-cpudai-tdm-group-num-ports = <1>; + qcom,msm-cpudai-tdm-group-port-id = <36881>; + qcom,msm-cpudai-tdm-clk-rate = <12288000>; + qcom,msm-cpudai-tdm-clk-attribute = /bits/ 16 <1>; + dai_sec_tdm_tx_0: qcom,msm-dai-q6-tdm-sec-tx-0 { + compatible = "qcom,msm-dai-q6-tdm"; + qcom,msm-cpudai-tdm-dev-id = <36881>; + qcom,msm-cpudai-tdm-sync-mode = <0>; + qcom,msm-cpudai-tdm-sync-src = <1>; + qcom,msm-cpudai-tdm-data-out = <0>; + qcom,msm-cpudai-tdm-invert-sync = <0>; + qcom,msm-cpudai-tdm-data-delay = <1>; + qcom,msm-cpudai-tdm-data-align = <0>; + }; + }; usb_detect { compatible = "qcom,gpio-usbdetect"; interrupt-parent = <&spmi_bus>; diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c index 954402cc2..e50fc729f 100644 --- a/drivers/usb/phy/phy-msm-usb.c +++ b/drivers/usb/phy/phy-msm-usb.c @@ -828,8 +828,8 @@ static int msm_otg_set_suspend(struct usb_phy *phy, int suspend) if (suspend && phy->state == OTG_STATE_B_SUSPEND) { - pr_debug("%s: Trying to suspend when not finished waking up\n ", __func__); - return -EBUSY; + pr_info("%s: Trying to suspend when not finished waking up\n ", __func__); + // return -EBUSY; } if (suspend) { /* called in suspend interrupt context */ diff --git a/include/Makefile b/include/Makefile deleted file mode 100755 index 0c5bc5f57..000000000 --- a/include/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -library_includedir = $(pkgincludedir) -library_include_HEADERS = quectel-buildconfig-gen.h \ - quectel-features-config.h \ - ql_custom_config.h \ - ql_product_config.h \ - ql_funcs_config.h \ - ql_branch_config.h \ - ql_leagcy_config.h - -library_includedir = $(pkgincludedir) \ No newline at end of file diff --git a/include/configure.ac b/include/configure.ac deleted file mode 100755 index 47de2b631..000000000 --- a/include/configure.ac +++ /dev/null @@ -1,23 +0,0 @@ -AC_PREREQ(2.61) -AC_INIT([quectel-features-config], 1.0.0) -AM_INIT_AUTOMAKE([foreign]) -AM_MAINTAINER_MODE -AC_CONFIG_SRCDIR([quectel-buildconfig-gen.h]) -AC_CONFIG_HEADER([config.h]) -AC_CONFIG_MACRO_DIR([m4]) - -# Checks for programs. -#AC_PROG_CC -#AM_PROG_CC_C_O -#AC_PROG_LIBTOOL -#AC_PROG_AWK -#AC_PROG_CPP -#AC_PROG_CXX -#AC_PROG_INSTALL -#AC_PROG_LN_S -#AC_PROG_MAKE_SET -#PKG_PROG_PKG_CONFIG - -AC_CONFIG_FILES([Makefile]) - -AC_OUTPUT diff --git a/sound/soc/codecs/rt5616.c b/sound/soc/codecs/rt5616.c index ccdb7201b..a171a1dea 100755 --- a/sound/soc/codecs/rt5616.c +++ b/sound/soc/codecs/rt5616.c @@ -1159,7 +1159,7 @@ static int rt5616_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, return 0; if (!freq_in || !freq_out) { - dev_dbg(codec->dev, "PLL disabled\n"); + dev_info(codec->dev, "PLL disabled\n"); rt5616->pll_in = 0; rt5616->pll_out = 0; @@ -1206,7 +1206,8 @@ static int rt5616_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, rt5616->pll_in = freq_in; rt5616->pll_out = freq_out; rt5616->pll_src = source; - + mdelay(10); + return 0; } @@ -1229,8 +1230,6 @@ static int rt5616_set_bias_level(struct snd_soc_codec *codec, * away from ON. Disable the clock in that case, otherwise * enable it. */ - regcache_cache_only(rt5616->regmap, false); - regcache_sync(rt5616->regmap); if (IS_ERR(rt5616->mclk)) break; @@ -1238,13 +1237,19 @@ static int rt5616_set_bias_level(struct snd_soc_codec *codec, clk_disable_unprepare(rt5616->mclk); } else { ret = clk_prepare_enable(rt5616->mclk); - if (ret) + if (ret) { + pr_info("%s: Couldnt prepare the clock\n", __func__); return ret; + } } break; case SND_SOC_BIAS_STANDBY: if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) { + regmap_multi_reg_write(rt5616->regmap, init_reg, ARRAY_SIZE(init_reg)); + regcache_cache_only(rt5616->regmap, false); + regcache_sync(rt5616->regmap); + mdelay(10); snd_soc_update_bits(codec, RT5616_PWR_ANLG1, RT5616_PWR_VREF1 | RT5616_PWR_MB | RT5616_PWR_BG | RT5616_PWR_VREF2, @@ -1268,6 +1273,8 @@ static int rt5616_set_bias_level(struct snd_soc_codec *codec, snd_soc_write(codec, RT5616_PWR_MIXER, 0x0000); snd_soc_write(codec, RT5616_PWR_ANLG1, RT5616_PWR_LDO_DVO_1_2V); //0x0000 in 4.14 snd_soc_write(codec, RT5616_PWR_ANLG2, 0x0000); + regcache_cache_only(rt5616->regmap, true); + regcache_mark_dirty(rt5616->regmap); break; default: @@ -1284,11 +1291,11 @@ static int rt5616_probe(struct snd_soc_codec *codec) int ret; /* Check if MCLK provided */ - #if 0 rt5616->mclk = devm_clk_get(codec->dev, "mclk"); - if (PTR_ERR(rt5616->mclk) == -EPROBE_DEFER) + if (PTR_ERR(rt5616->mclk) == -EPROBE_DEFER) { + pr_info("%s: MCLK is not available, deferring\n", __func__); return -EPROBE_DEFER; - #endif + } regmap_multi_reg_write(rt5616->regmap, init_reg, ARRAY_SIZE(init_reg)); diff --git a/sound/soc/msm/mdm9607.c b/sound/soc/msm/mdm9607.c index b50c904b2..533aba8bd 100644 --- a/sound/soc/msm/mdm9607.c +++ b/sound/soc/msm/mdm9607.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -20,17 +20,18 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include "../codecs/wcd9xxx-common.h" #include "../codecs/wcd9330.h" #include "../codecs/wcd9306.h" -#define CONFIG_QUECTEL_AUDIO_DRIVER 1 -#define CONFIG_QUECTEL_PCM16K_SUPPORT 1 + /* Spk control */ #define MDM_SPK_ON 1 @@ -90,6 +91,9 @@ /* Bik: RT5616 */ extern bool is_rt5616_codec_available(void); +static char stub_codec_name[32] = "msm-stub-codec.1"; +static char stub_codec_rx_dai_name[32] = "msm-stub-rx"; +static char stub_codec_tx_dai_name[32] = "msm-stub-tx"; enum mi2s_pcm_mux { PRI_MI2S_PCM, @@ -109,13 +113,17 @@ struct mdm_machine_data { atomic_t prim_clk_usrs; u16 prim_mi2s_mode; u16 prim_auxpcm_mode; + struct device_node *prim_master_p; + struct device_node *prim_slave_p; atomic_t sec_clk_usrs; u16 sec_mi2s_mode; u16 sec_auxpcm_mode; + struct device_node *sec_master_p; + struct device_node *sec_slave_p; void *lpaif_pri_muxsel_virt_addr; - void *lpaif_sec_muxsel_virt_addr; + void __iomem *lpaif_sec_muxsel_virt_addr; void *lpass_mux_spkr_ctl_virt_addr; - void *lpass_mux_mic_ctl_virt_addr; + void __iomem *lpass_mux_mic_ctl_virt_addr; void *gcc_debug_clk_ctl_virt_addr; void *gcc_plltest_pad_cfg_virt_addr; struct mdm9607_codec mdm9607_codec_fn; @@ -138,6 +146,10 @@ static int mdm_mi2s_rate = SAMPLE_RATE_48KHZ; static int mdm_sec_mi2s_rx_ch = 1; static int mdm_sec_mi2s_tx_ch = 1; static int mdm_sec_mi2s_rate = SAMPLE_RATE_48KHZ; +static int mdm_mi2s_mode = I2S_PCM_MASTER_MODE; +static int mdm_sec_mi2s_mode = I2S_PCM_MASTER_MODE; +static int mdm_auxpcm_mode = I2S_PCM_MASTER_MODE; +static int mdm_sec_auxpcm_mode = I2S_PCM_MASTER_MODE; static int mdm_spk_control; static atomic_t aux_ref_count; @@ -147,55 +159,9 @@ static atomic_t sec_mi2s_ref_count; static int clk_users; -static inline int param_is_mask(int p) -{ - return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) && - (p <= SNDRV_PCM_HW_PARAM_LAST_MASK); -} - -static inline struct snd_mask *param_to_mask(struct snd_pcm_hw_params *p, int n) -{ - return &(p->masks[n - SNDRV_PCM_HW_PARAM_FIRST_MASK]); -} - -static void param_set_mask(struct snd_pcm_hw_params *p, int n, unsigned bit) -{ - if (bit >= SNDRV_MASK_MAX) - return; - if (param_is_mask(n)) { - struct snd_mask *m = param_to_mask(p, n); - - m->bits[0] = 0; - m->bits[1] = 0; - m->bits[bit >> 5] |= (1 << (bit & 31)); - } -} - static int mdm_enable_codec_ext_clk(struct snd_soc_codec *codec, int enable, bool dapm); -static void *def_codec_mbhc_cal(void); - -static struct wcd9xxx_mbhc_config mbhc_cfg = { - .read_fw_bin = false, - .calibration = NULL, - .micbias = MBHC_MICBIAS2, - .mclk_cb_fn = mdm_enable_codec_ext_clk, - .mclk_rate = MDM_MCLK_CLK_12P288MHZ, - .gpio_level_insert = 1, - .detect_extn_cable = false, - .micbias_enable_flags = 1 << MBHC_MICBIAS_ENABLE_THRESHOLD_HEADSET, - .insert_detect = true, - .swap_gnd_mic = NULL, - .cs_enable_flags = (1 << MBHC_CS_ENABLE_POLLING | - 1 << MBHC_CS_ENABLE_INSERTION | - 1 << MBHC_CS_ENABLE_REMOVAL | - 1 << MBHC_CS_ENABLE_DET_ANC), - .do_recalibration = true, - .use_vddio_meas = true, - .enable_anc_mic_detect = false, - .hw_jack_type = FOUR_POLE_JACK, -}; static void mdm_gpio_set_mux_ctl(struct mdm_machine_data *dt) { @@ -214,195 +180,8 @@ static void mdm_gpio_set_mux_ctl(struct mdm_machine_data *dt) __func__); } -static int mdm_mi2s_clk_ctl(struct snd_soc_pcm_runtime *rtd, bool enable, - int rate) -{ - struct snd_soc_card *card = rtd->card; - struct mdm_machine_data *pdata = snd_soc_card_get_drvdata(card); - struct afe_clk_set *lpass_clk = NULL; - int ret = 0; - int bit_clk_freq = (rate * 2 * NO_OF_BITS_PER_SAMPLE); - - if (pdata == NULL) { - pr_err("%s:platform data is null\n", __func__); - - ret = -ENOMEM; - goto done; - } - lpass_clk = kzalloc(sizeof(struct afe_clk_cfg), GFP_KERNEL); - if (!lpass_clk) { - ret = -ENOMEM; - goto done; - } - memcpy(lpass_clk, &lpass_default, sizeof(struct afe_clk_cfg)); - pr_debug("%s enable = %x\n", __func__, enable); - - if (enable) { - if (atomic_read(&pdata->prim_clk_usrs) == 0) { - lpass_clk->clk_id = Q6AFE_LPASS_CLK_ID_MCLK_3; - lpass_clk->clk_freq_in_hz = pdata->mclk_freq; - lpass_clk->enable = 1; - ret = afe_set_lpass_clock_v2( - AFE_PORT_ID_PRIMARY_MI2S_RX, lpass_clk); - if (ret < 0) - pr_err("%s:afe set mclk failed\n", __func__); - else - atomic_inc(&pdata->prim_clk_usrs); - } else { - lpass_clk->enable = 1; - } - lpass_clk->clk_id = Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT; - lpass_clk->clk_freq_in_hz = bit_clk_freq; - ret = afe_set_lpass_clock_v2(AFE_PORT_ID_PRIMARY_MI2S_RX, - lpass_clk); - if (ret < 0) - pr_err("%s:afe_set_lpass_clock_v2 failed\n", __func__); - } else { - if (atomic_read(&pdata->prim_clk_usrs) > 0) - atomic_dec(&pdata->prim_clk_usrs); - - if (atomic_read(&pdata->prim_clk_usrs) == 0) { - lpass_clk->clk_id = Q6AFE_LPASS_CLK_ID_MCLK_3; - lpass_clk->enable = 0; - ret = afe_set_lpass_clock_v2( - AFE_PORT_ID_PRIMARY_MI2S_RX, lpass_clk); - } else { - lpass_clk->enable = 0; - } - lpass_clk->clk_id = Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT; - ret = afe_set_lpass_clock_v2(AFE_PORT_ID_PRIMARY_MI2S_RX, - lpass_clk); - if (ret < 0) - pr_err("%s:afe_set_lpass_clock_v2 failed\n", __func__); - } - pr_debug("%s:bit_clk = %x clk2 = %x\n", - __func__, bit_clk_freq, pdata->mclk_freq); - - kfree(lpass_clk); - clk_users = atomic_read(&pdata->prim_clk_usrs); -done: - return ret; -} - -static void mdm_mi2s_shutdown(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - int ret; - - if (atomic_dec_return(&mi2s_ref_count) == 0) { - ret = mdm_mi2s_clk_ctl(rtd, false, 0); - if (ret < 0) - pr_err("%s Clock disable failed\n", __func__); - } -} - -static int mdm_mi2s_startup(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_card *card = rtd->card; - struct mdm_machine_data *pdata = snd_soc_card_get_drvdata(card); - int ret = 0; - - if (atomic_inc_return(&mi2s_ref_count) == 1) { - if (pdata->lpaif_pri_muxsel_virt_addr != NULL) { - ret = afe_enable_lpass_core_shared_clock(MI2S_RX, - CLOCK_ON); - if (ret < 0) { - ret = -EINVAL; - goto done; - } - iowrite32(I2S_SEL << I2S_PCM_SEL_OFFSET, - pdata->lpaif_pri_muxsel_virt_addr); - - if (pdata->lpass_mux_spkr_ctl_virt_addr != NULL) { - if (pdata->prim_mi2s_mode == 1) { - iowrite32(PRI_TLMM_CLKS_EN_MASTER, - pdata->lpass_mux_spkr_ctl_virt_addr); - } else if (pdata->prim_mi2s_mode == 0) { - iowrite32(PRI_TLMM_CLKS_EN_SLAVE, - pdata->lpass_mux_spkr_ctl_virt_addr); - } else { - pr_err("%s Invalid primary mi2s mode\n", - __func__); - atomic_dec(&mi2s_ref_count); - ret = -EINVAL; - goto err; - } - } else { - pr_err("%s: mux spkr ctl virt addr is NULL\n", - __func__); - ret = -EINVAL; - goto err; - } - mdm_gpio_set_mux_ctl(pdata); - } else { - pr_err("%s lpaif_pri_muxsel_virt_addr is NULL\n", - __func__); - ret = -EINVAL; - goto done; - } - - /* - * This sets the CONFIG PARAMETER WS_SRC. - * 1 means internal clock master mode. - * 0 means external clock slave mode. - */ - if (pdata->prim_mi2s_mode == 1) { - ret = mdm_mi2s_clk_ctl(rtd, true, mdm_mi2s_rate); - if (ret < 0) { - pr_err("%s clock enable failed\n", __func__); - goto err; - } - ret = snd_soc_dai_set_fmt(cpu_dai, - SND_SOC_DAIFMT_CBS_CFS); - if (ret < 0) { - pr_err("%s Set fmt for cpu dai failed\n", - __func__); - goto err; - } - ret = snd_soc_dai_set_fmt(codec_dai, - SND_SOC_DAIFMT_CBS_CFS); - if (ret < 0) - pr_err("%s Set fmt for codec dai failed\n", - __func__); - } else if (pdata->prim_mi2s_mode == 0) { - /* - * Disable bit clk in slave mode for QC codec. - * Enable only mclk. - */ - ret = mdm_mi2s_clk_ctl(rtd, true, 0); - if (ret < 0) { - pr_err("%s clock enable failed\n", __func__); - goto err; - } - ret = snd_soc_dai_set_fmt(cpu_dai, - SND_SOC_DAIFMT_CBM_CFM); - if (ret < 0) { - pr_err("%s Set fmt for cpu dai failed\n", - __func__); - goto err; - } - ret = snd_soc_dai_set_fmt(codec_dai, - SND_SOC_DAIFMT_CBM_CFM); - if (ret < 0) - pr_err("%s Set fmt for codec dai failed\n", - __func__); - } else { - pr_err("%s Invalid primary mi2s mode\n", __func__); - atomic_dec(&mi2s_ref_count); - ret = -EINVAL; - } - } -err: - afe_enable_lpass_core_shared_clock(MI2S_RX, CLOCK_OFF); -done: - return ret; -} - static int mdm_sec_mi2s_clk_ctl(struct snd_soc_pcm_runtime *rtd, bool enable, - int rate) + int rate, u16 mode) { struct snd_soc_card *card = rtd->card; struct mdm_machine_data *pdata = snd_soc_card_get_drvdata(card); @@ -422,7 +201,7 @@ static int mdm_sec_mi2s_clk_ctl(struct snd_soc_pcm_runtime *rtd, bool enable, goto done; } memcpy(lpass_clk, &lpass_default, sizeof(struct afe_clk_cfg)); - pr_debug("%s enable = %x\n", __func__, enable); + pr_info("%s enable = %x\n", __func__, enable); if (enable) { if (atomic_read(&pdata->sec_clk_usrs) == 0) { @@ -438,12 +217,7 @@ static int mdm_sec_mi2s_clk_ctl(struct snd_soc_pcm_runtime *rtd, bool enable, } else { lpass_clk->enable = 1; } - lpass_clk->clk_id = Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT; lpass_clk->clk_freq_in_hz = bit_clk_freq; - ret = afe_set_lpass_clock_v2(AFE_PORT_ID_SECONDARY_MI2S_RX, - lpass_clk); - if (ret < 0) - pr_err("%s:afe_set_lpass_clock_v2 failed\n", __func__); } else { if (atomic_read(&pdata->sec_clk_usrs) > 0) atomic_dec(&pdata->sec_clk_usrs); @@ -456,14 +230,17 @@ static int mdm_sec_mi2s_clk_ctl(struct snd_soc_pcm_runtime *rtd, bool enable, } else { lpass_clk->enable = 0; } + } + if (mode) { lpass_clk->clk_id = Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT; ret = afe_set_lpass_clock_v2(AFE_PORT_ID_SECONDARY_MI2S_RX, lpass_clk); if (ret < 0) pr_err("%s:afe_set_lpass_clock_v2 failed\n", __func__); } - pr_debug("%s bit_clk = %x clk2 = %x\n", - __func__, bit_clk_freq, pdata->mclk_freq); + + pr_info("%s:enable = %d mode = %u bit_clk = %x mclk = %x\n", + __func__, enable, mode, bit_clk_freq, pdata->mclk_freq); kfree(lpass_clk); done: @@ -473,12 +250,24 @@ static int mdm_sec_mi2s_clk_ctl(struct snd_soc_pcm_runtime *rtd, bool enable, static void mdm_sec_mi2s_shutdown(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_card *card = rtd->card; + struct mdm_machine_data *pdata = snd_soc_card_get_drvdata(card); int ret; if (atomic_dec_return(&sec_mi2s_ref_count) == 0) { - ret = mdm_sec_mi2s_clk_ctl(rtd, false, 0); + ret = mdm_sec_mi2s_clk_ctl(rtd, false, 0, pdata->sec_mi2s_mode); if (ret < 0) pr_err("%s Clock disable failed\n", __func__); + + if (pdata->sec_mi2s_mode == 1) + ret = wcd_gpio_ctrl_select_sleep_state + (pdata->sec_master_p); + else + ret = wcd_gpio_ctrl_select_sleep_state + (pdata->sec_slave_p); + if (ret) + pr_err("%s: failed to set sec gpios to sleep: %d\n", + __func__, ret); } } @@ -490,6 +279,7 @@ static int mdm_sec_mi2s_startup(struct snd_pcm_substream *substream) struct mdm_machine_data *pdata = snd_soc_card_get_drvdata(card); int ret = 0; + pdata->sec_mi2s_mode = mdm_sec_mi2s_mode; if (atomic_inc_return(&sec_mi2s_ref_count) == 1) { if (pdata->lpaif_sec_muxsel_virt_addr != NULL) { ret = afe_enable_lpass_core_shared_clock( @@ -502,19 +292,12 @@ static int mdm_sec_mi2s_startup(struct snd_pcm_substream *substream) pdata->lpaif_sec_muxsel_virt_addr); if (pdata->lpass_mux_mic_ctl_virt_addr != NULL) { - if (pdata->sec_mi2s_mode == 1) { + if (pdata->sec_mi2s_mode == 1) iowrite32(SEC_TLMM_CLKS_EN_MASTER, pdata->lpass_mux_mic_ctl_virt_addr); - } else if (pdata->sec_mi2s_mode == 0) { + else iowrite32(SEC_TLMM_CLKS_EN_SLAVE, pdata->lpass_mux_mic_ctl_virt_addr); - } else { - pr_err("%s Invalid secondary mi2s mode\n", - __func__); - atomic_dec(&sec_mi2s_ref_count); - ret = -EINVAL; - goto err; - } } else { pr_err("%s: mux spkr ctl virt addr is NULL\n", __func__); @@ -528,15 +311,20 @@ static int mdm_sec_mi2s_startup(struct snd_pcm_substream *substream) ret = -EINVAL; goto done; } - /* * This sets the CONFIG PARAMETER WS_SRC. * 1 means internal clock master mode. * 0 means external clock slave mode. */ if (pdata->sec_mi2s_mode == 1) { + ret = wcd_gpio_ctrl_select_active_state + (pdata->sec_master_p); + if (ret < 0) { + pr_err("%s pinctrl set failed\n", __func__); + goto err; + } ret = mdm_sec_mi2s_clk_ctl(rtd, true, - mdm_sec_mi2s_rate); + mdm_sec_mi2s_rate, pdata->sec_mi2s_mode); if (ret < 0) { pr_err("%s clock enable failed\n", __func__); goto err; @@ -546,34 +334,38 @@ static int mdm_sec_mi2s_startup(struct snd_pcm_substream *substream) if (ret < 0) pr_err("%s Set fmt for cpu dai failed\n", __func__); - } else if (pdata->sec_mi2s_mode == 0) { + } else { /* - * Enable mclk here, if needed for external codecs. - * Optional. Refer primary mi2s slave interface. + * Disable bit clk in slave mode for QC codec. + * Enable only mclk. */ + ret = wcd_gpio_ctrl_select_active_state + (pdata->sec_slave_p); + if (ret < 0) { + pr_err("%s pinctrl set failed\n", __func__); + goto err; + } + ret = mdm_sec_mi2s_clk_ctl(rtd, true, + 0, pdata->sec_mi2s_mode); + if (ret < 0) { + pr_err("%s clock enable failed\n", __func__); + goto err; + } ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_CBM_CFM); if (ret < 0) pr_err("%s Set fmt for cpu dai failed\n", __func__); - } else { - pr_err("%s Invalid secondary mi2s mode\n", __func__); - atomic_dec(&sec_mi2s_ref_count); - ret = -EINVAL; } - } err: afe_enable_lpass_core_shared_clock(SECONDARY_I2S_RX, CLOCK_OFF); done: + if (ret < 0) + atomic_dec(&sec_mi2s_ref_count); return ret; } -static struct snd_soc_ops mdm_mi2s_be_ops = { - .startup = mdm_mi2s_startup, - .shutdown = mdm_mi2s_shutdown, -}; - static struct snd_soc_ops mdm_sec_mi2s_be_ops = { .startup = mdm_sec_mi2s_startup, .shutdown = mdm_sec_mi2s_shutdown, @@ -582,7 +374,7 @@ static struct snd_soc_ops mdm_sec_mi2s_be_ops = { static int mdm_mi2s_rate_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - pr_debug("%s: mdm_i2s_rate = %d", __func__, + pr_info("%s: mdm_i2s_rate = %d", __func__, mdm_mi2s_rate); ucontrol->value.integer.value[0] = mdm_mi2s_rate; return 0; @@ -603,43 +395,16 @@ static int mdm_mi2s_rate_put(struct snd_kcontrol *kcontrol, mdm_mi2s_rate = SAMPLE_RATE_48KHZ; break; } - pr_debug("%s: mdm_mi2s_rate = %d ucontrol->value = %d\n", + pr_info("%s: mdm_mi2s_rate = %d ucontrol->value = %d\n", __func__, mdm_mi2s_rate, (int)ucontrol->value.integer.value[0]); return 0; } -static int mdm_mi2s_rx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rt, - struct snd_pcm_hw_params *params) -{ - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - rate->min = rate->max = mdm_mi2s_rate; - channels->min = channels->max = mdm_mi2s_rx_ch; - param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, - SNDRV_PCM_FORMAT_S16_LE); - return 0; -} - -static int mdm_mi2s_tx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rt, - struct snd_pcm_hw_params *params) -{ - struct snd_interval *rate = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - rate->min = rate->max = mdm_mi2s_rate; - channels->min = channels->max = mdm_mi2s_tx_ch; - return 0; -} - - static int mdm_sec_mi2s_rate_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - pr_debug("%s: mdm_sec_mi2s_rate = %d", __func__, + pr_info("%s: mdm_sec_mi2s_rate = %d", __func__, mdm_sec_mi2s_rate); ucontrol->value.integer.value[0] = mdm_sec_mi2s_rate; return 0; @@ -660,7 +425,7 @@ static int mdm_sec_mi2s_rate_put(struct snd_kcontrol *kcontrol, mdm_sec_mi2s_rate = SAMPLE_RATE_48KHZ; break; } - pr_debug("%s: mdm_sec_mi2s_rate = %d ucontrol->value = %d\n", + pr_info("%s: mdm_sec_mi2s_rate = %d ucontrol->value = %d\n", __func__, mdm_sec_mi2s_rate, (int)ucontrol->value.integer.value[0]); return 0; @@ -702,7 +467,7 @@ static int mdm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rt, static int mdm_mi2s_rx_ch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - pr_debug("%s mdm_mi2s_rx_ch %d\n", __func__, + pr_info("%s mdm_mi2s_rx_ch %d\n", __func__, mdm_mi2s_rx_ch); ucontrol->value.integer.value[0] = mdm_mi2s_rx_ch - 1; @@ -713,7 +478,7 @@ static int mdm_mi2s_rx_ch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { mdm_mi2s_rx_ch = ucontrol->value.integer.value[0] + 1; - pr_debug("%s mdm_mi2s_rx_ch %d\n", __func__, + pr_info("%s mdm_mi2s_rx_ch %d\n", __func__, mdm_mi2s_rx_ch); return 1; @@ -722,7 +487,7 @@ static int mdm_mi2s_rx_ch_put(struct snd_kcontrol *kcontrol, static int mdm_mi2s_tx_ch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - pr_debug("%s mdm_mi2s_tx_ch %d\n", __func__, + pr_info("%s mdm_mi2s_tx_ch %d\n", __func__, mdm_mi2s_tx_ch); ucontrol->value.integer.value[0] = mdm_mi2s_tx_ch - 1; @@ -733,7 +498,7 @@ static int mdm_mi2s_tx_ch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { mdm_mi2s_tx_ch = ucontrol->value.integer.value[0] + 1; - pr_debug("%s mdm_mi2s_tx_ch %d\n", __func__, + pr_info("%s mdm_mi2s_tx_ch %d\n", __func__, mdm_mi2s_tx_ch); return 1; @@ -742,7 +507,7 @@ static int mdm_mi2s_tx_ch_put(struct snd_kcontrol *kcontrol, static int mdm_sec_mi2s_rx_ch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - pr_debug("%s mdm_sec_mi2s_rx_ch %d\n", __func__, + pr_info("%s mdm_sec_mi2s_rx_ch %d\n", __func__, mdm_sec_mi2s_rx_ch); ucontrol->value.integer.value[0] = mdm_sec_mi2s_rx_ch - 1; @@ -753,7 +518,7 @@ static int mdm_sec_mi2s_rx_ch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { mdm_sec_mi2s_rx_ch = ucontrol->value.integer.value[0] + 1; - pr_debug("%s mdm_sec_mi2s_rx_ch %d\n", __func__, + pr_info("%s mdm_sec_mi2s_rx_ch %d\n", __func__, mdm_sec_mi2s_rx_ch); return 1; @@ -762,7 +527,7 @@ static int mdm_sec_mi2s_rx_ch_put(struct snd_kcontrol *kcontrol, static int mdm_sec_mi2s_tx_ch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - pr_debug("%s mdm_sec_mi2s_tx_ch %d\n", __func__, + pr_info("%s mdm_sec_mi2s_tx_ch %d\n", __func__, mdm_sec_mi2s_tx_ch); ucontrol->value.integer.value[0] = mdm_sec_mi2s_tx_ch - 1; @@ -773,49 +538,169 @@ static int mdm_sec_mi2s_tx_ch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { mdm_sec_mi2s_tx_ch = ucontrol->value.integer.value[0] + 1; - pr_debug("%s mdm_sec_mi2s_tx_ch %d\n", __func__, + pr_info("%s mdm_sec_mi2s_tx_ch %d\n", __func__, mdm_sec_mi2s_tx_ch); return 1; } -static int mdm_mi2s_get_spk(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) +static int mdm_mi2s_mode_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { - pr_debug("%s mdm_spk_control %d", __func__, mdm_spk_control); + pr_info("%s mdm_mi2s_mode %d\n", __func__, + mdm_mi2s_mode); - ucontrol->value.integer.value[0] = mdm_spk_control; + ucontrol->value.integer.value[0] = mdm_mi2s_mode; return 0; } -static void mdm_ext_control(struct snd_soc_codec *codec) +static int mdm_mi2s_mode_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_dapm_context *dapm = &codec->dapm; - - pr_debug("%s mdm_spk_control %d", __func__, mdm_spk_control); - - mutex_lock(&codec->mutex); - if (mdm_spk_control == MDM_SPK_ON) { - snd_soc_dapm_enable_pin(dapm, "Ext Spk Bottom Pos"); - snd_soc_dapm_enable_pin(dapm, "Ext Spk Bottom Neg"); - snd_soc_dapm_enable_pin(dapm, "Ext Spk Top Pos"); - snd_soc_dapm_enable_pin(dapm, "Ext Spk Top Neg"); - } else { - snd_soc_dapm_disable_pin(dapm, "Ext Spk Bottom Pos"); - snd_soc_dapm_disable_pin(dapm, "Ext Spk Bottom Neg"); - snd_soc_dapm_disable_pin(dapm, "Ext Spk Top Pos"); - snd_soc_dapm_disable_pin(dapm, "Ext Spk Top Neg"); + switch (ucontrol->value.integer.value[0]) { + case 0: + mdm_mi2s_mode = I2S_PCM_MASTER_MODE; + break; + case 1: + mdm_mi2s_mode = I2S_PCM_SLAVE_MODE; + break; + default: + mdm_mi2s_mode = I2S_PCM_MASTER_MODE; + break; } - snd_soc_dapm_sync(dapm); - mutex_unlock(&codec->mutex); + pr_info("%s: mdm_mi2s_mode = %d ucontrol->value = %d\n", + __func__, mdm_mi2s_mode, + (int)ucontrol->value.integer.value[0]); + return 0; } -static int mdm_mi2s_set_spk(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) +static int mdm_sec_mi2s_mode_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + pr_info("%s mdm_sec_mi2s_mode %d\n", __func__, + mdm_sec_mi2s_mode); - pr_debug("%s()\n", __func__); + ucontrol->value.integer.value[0] = mdm_sec_mi2s_mode; + return 0; +} + +static int mdm_sec_mi2s_mode_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + switch (ucontrol->value.integer.value[0]) { + case 0: + mdm_sec_mi2s_mode = I2S_PCM_MASTER_MODE; + break; + case 1: + mdm_sec_mi2s_mode = I2S_PCM_SLAVE_MODE; + break; + default: + mdm_sec_mi2s_mode = I2S_PCM_MASTER_MODE; + break; + } + pr_info("%s: mdm_sec_mi2s_mode = %d ucontrol->value = %d\n", + __func__, mdm_sec_mi2s_mode, + (int)ucontrol->value.integer.value[0]); + return 0; +} + +static int mdm_auxpcm_mode_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + pr_info("%s mdm_auxpcm_mode %d\n", __func__, + mdm_auxpcm_mode); + + ucontrol->value.integer.value[0] = mdm_auxpcm_mode; + return 0; +} + +static int mdm_auxpcm_mode_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + switch (ucontrol->value.integer.value[0]) { + case 0: + mdm_auxpcm_mode = I2S_PCM_MASTER_MODE; + break; + case 1: + mdm_auxpcm_mode = I2S_PCM_SLAVE_MODE; + break; + default: + mdm_auxpcm_mode = I2S_PCM_MASTER_MODE; + break; + } + pr_info("%s: mdm_auxpcm_mode = %d ucontrol->value = %d\n", + __func__, mdm_auxpcm_mode, + (int)ucontrol->value.integer.value[0]); + return 0; +} + +static int mdm_sec_auxpcm_mode_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + pr_info("%s mdm_sec_auxpcm_mode %d\n", __func__, + mdm_sec_auxpcm_mode); + + ucontrol->value.integer.value[0] = mdm_sec_auxpcm_mode; + return 0; +} + +static int mdm_sec_auxpcm_mode_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + switch (ucontrol->value.integer.value[0]) { + case 0: + mdm_sec_auxpcm_mode = I2S_PCM_MASTER_MODE; + break; + case 1: + mdm_sec_auxpcm_mode = I2S_PCM_SLAVE_MODE; + break; + default: + mdm_sec_auxpcm_mode = I2S_PCM_MASTER_MODE; + break; + } + pr_info("%s: mdm_sec_auxpcm_mode = %d ucontrol->value = %d\n", + __func__, mdm_sec_auxpcm_mode, + (int)ucontrol->value.integer.value[0]); + return 0; +} + +static int mdm_mi2s_get_spk(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + pr_info("%s mdm_spk_control %d", __func__, mdm_spk_control); + + ucontrol->value.integer.value[0] = mdm_spk_control; + return 0; +} + +static void mdm_ext_control(struct snd_soc_codec *codec) +{ + struct snd_soc_dapm_context *dapm = &codec->dapm; + + pr_info("%s mdm_spk_control %d", __func__, mdm_spk_control); + + mutex_lock(&codec->mutex); + if (mdm_spk_control == MDM_SPK_ON) { + snd_soc_dapm_enable_pin(dapm, "Ext Spk Bottom Pos"); + snd_soc_dapm_enable_pin(dapm, "Ext Spk Bottom Neg"); + snd_soc_dapm_enable_pin(dapm, "Ext Spk Top Pos"); + snd_soc_dapm_enable_pin(dapm, "Ext Spk Top Neg"); + } else { + snd_soc_dapm_disable_pin(dapm, "Ext Spk Bottom Pos"); + snd_soc_dapm_disable_pin(dapm, "Ext Spk Bottom Neg"); + snd_soc_dapm_disable_pin(dapm, "Ext Spk Top Pos"); + snd_soc_dapm_disable_pin(dapm, "Ext Spk Top Neg"); + } + snd_soc_dapm_sync(dapm); + mutex_unlock(&codec->mutex); +} + +static int mdm_mi2s_set_spk(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + + pr_info("%s()\n", __func__); if (mdm_spk_control == ucontrol->value.integer.value[0]) return 0; @@ -833,7 +718,7 @@ static int mdm_enable_codec_ext_clk(struct snd_soc_codec *codec, snd_soc_card_get_drvdata(card); struct afe_clk_set *lpass_clk = NULL; - pr_debug("%s enable %d codec name %s\n", + pr_info("%s enable %d codec name %s\n", __func__, enable, codec->component.name); lpass_clk = kzalloc(sizeof(struct afe_clk_set), GFP_KERNEL); @@ -875,7 +760,7 @@ static int mdm_enable_codec_ext_clk(struct snd_soc_codec *codec, } pdata->mdm9607_codec_fn.mclk_enable_fn(codec, 0, dapm); } - pr_debug("%s clk %x\n", __func__, pdata->mclk_freq); + pr_info("%s clk %x\n", __func__, pdata->mclk_freq); err: mutex_unlock(&cdc_mclk_mutex); kfree(lpass_clk); @@ -886,7 +771,7 @@ static int mdm_enable_codec_ext_clk(struct snd_soc_codec *codec, static int mdm_mclk_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - pr_debug("%s event %d\n", __func__, event); + pr_info("%s event %d\n", __func__, event); switch (event) { case SND_SOC_DAPM_PRE_PMU: @@ -897,6 +782,26 @@ static int mdm_mclk_event(struct snd_soc_dapm_widget *w, return 0; } +static void mdm_auxpcm_shutdown(struct snd_pcm_substream *substream) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + int ret; + struct snd_soc_card *card = rtd->card; + struct mdm_machine_data *pdata = snd_soc_card_get_drvdata(card); + + if (atomic_dec_return(&aux_ref_count) == 0) { + if (pdata->prim_auxpcm_mode == 1) + ret = wcd_gpio_ctrl_select_sleep_state + (pdata->prim_master_p); + else + ret = wcd_gpio_ctrl_select_sleep_state + (pdata->prim_slave_p); + if (ret) + pr_err("%s: failed to set pri gpios to sleep: %d\n", + __func__, ret); + } +} + static int mdm_auxpcm_startup(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; @@ -904,6 +809,7 @@ static int mdm_auxpcm_startup(struct snd_pcm_substream *substream) struct mdm_machine_data *pdata = snd_soc_card_get_drvdata(card); int ret = 0; + pdata->prim_auxpcm_mode = mdm_auxpcm_mode; if (atomic_inc_return(&aux_ref_count) == 1) { if (pdata->lpaif_pri_muxsel_virt_addr != NULL) { ret = afe_enable_lpass_core_shared_clock(MI2S_RX, @@ -916,19 +822,12 @@ static int mdm_auxpcm_startup(struct snd_pcm_substream *substream) pdata->lpaif_pri_muxsel_virt_addr); if (pdata->lpass_mux_spkr_ctl_virt_addr != NULL) { - if (pdata->prim_auxpcm_mode == 1) { + if (pdata->prim_auxpcm_mode == 1) iowrite32(PRI_TLMM_CLKS_EN_MASTER, pdata->lpass_mux_spkr_ctl_virt_addr); - } else if (pdata->prim_auxpcm_mode == 0) { + else iowrite32(PRI_TLMM_CLKS_EN_SLAVE, pdata->lpass_mux_spkr_ctl_virt_addr); - } else { - pr_err("%s Invalid primary auxpcm mode\n", - __func__); - atomic_dec(&aux_ref_count); - ret = -EINVAL; - goto err; - } } else { pr_err("%s lpass_mux_spkr_ctl_virt_addr is NULL\n", __func__); @@ -941,22 +840,49 @@ static int mdm_auxpcm_startup(struct snd_pcm_substream *substream) ret = -EINVAL; goto done; } + if (pdata->prim_auxpcm_mode == 1) { + ret = wcd_gpio_ctrl_select_active_state + (pdata->prim_master_p); + if (ret < 0) { + pr_err("%s pinctrl set failed\n", __func__); + goto err; + } + } else { + ret = wcd_gpio_ctrl_select_active_state + (pdata->prim_slave_p); + if (ret < 0) { + pr_err("%s pinctrl set failed\n", __func__); + goto err; + } + } } err: afe_enable_lpass_core_shared_clock(MI2S_RX, CLOCK_OFF); done: + if (ret < 0) + atomic_dec(&aux_ref_count); return ret; } -#ifdef CONFIG_QUECTEL_AUDIO_DRIVER -void mdm_soc_reset_ref(void) +static void mdm_sec_auxpcm_shutdown(struct snd_pcm_substream *substream) { - atomic_set(&aux_ref_count, 0); - atomic_set(&sec_aux_ref_count, 0); - atomic_set(&mi2s_ref_count, 0); - atomic_set(&sec_mi2s_ref_count, 0); + struct snd_soc_pcm_runtime *rtd = substream->private_data; + int ret; + struct snd_soc_card *card = rtd->card; + struct mdm_machine_data *pdata = snd_soc_card_get_drvdata(card); + + if (atomic_dec_return(&sec_aux_ref_count) == 0) { + if (pdata->sec_auxpcm_mode == 1) + ret = wcd_gpio_ctrl_select_sleep_state + (pdata->sec_master_p); + else + ret = wcd_gpio_ctrl_select_sleep_state + (pdata->sec_slave_p); + if (ret) + pr_err("%s: failed to set sec gpios to sleep: %d\n", + __func__, ret); + } } -#endif static int mdm_sec_auxpcm_startup(struct snd_pcm_substream *substream) { @@ -965,7 +891,7 @@ static int mdm_sec_auxpcm_startup(struct snd_pcm_substream *substream) struct mdm_machine_data *pdata = snd_soc_card_get_drvdata(card); int ret = 0; - + pdata->sec_auxpcm_mode = mdm_sec_auxpcm_mode; if (atomic_inc_return(&sec_aux_ref_count) == 1) { if (pdata->lpaif_sec_muxsel_virt_addr != NULL) { ret = afe_enable_lpass_core_shared_clock( @@ -979,19 +905,12 @@ static int mdm_sec_auxpcm_startup(struct snd_pcm_substream *substream) pdata->lpaif_sec_muxsel_virt_addr); if (pdata->lpass_mux_mic_ctl_virt_addr != NULL) { - if (pdata->sec_auxpcm_mode == 1) { + if (pdata->sec_auxpcm_mode == 1) iowrite32(SEC_TLMM_CLKS_EN_MASTER, pdata->lpass_mux_mic_ctl_virt_addr); - } else if (pdata->sec_auxpcm_mode == 0) { + else iowrite32(SEC_TLMM_CLKS_EN_SLAVE, pdata->lpass_mux_mic_ctl_virt_addr); - } else { - pr_err("%s Invalid secondary auxpcm mode\n", - __func__); - atomic_dec(&sec_aux_ref_count); - ret = -EINVAL; - goto err; - } } else { pr_err("%s lpass_mux_mic_ctl_virt_addr is NULL\n", __func__); @@ -1004,15 +923,30 @@ static int mdm_sec_auxpcm_startup(struct snd_pcm_substream *substream) ret = -EINVAL; goto done; } + if (pdata->sec_auxpcm_mode == 1) { + ret = wcd_gpio_ctrl_select_active_state + (pdata->sec_master_p); + if (ret < 0) { + pr_err("%s pinctrl set failed\n", __func__); + goto err; + } + } else { + ret = wcd_gpio_ctrl_select_active_state + (pdata->sec_slave_p); + if (ret < 0) { + pr_err("%s pinctrl set failed\n", __func__); + goto err; + } + } } err: afe_enable_lpass_core_shared_clock(SECONDARY_I2S_RX, CLOCK_OFF); done: + if (ret < 0) + atomic_dec(&sec_aux_ref_count); return ret; } - - static int mdm_sec_auxpcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) @@ -1023,7 +957,6 @@ static int mdm_sec_auxpcm_hw_params(struct snd_pcm_substream *substream, struct mdm_machine_data *pdata = snd_soc_card_get_drvdata(card); unsigned int fmt; int ret = 0; - if (is_rt5616_codec_available()) { if (pdata->sec_auxpcm_mode == 1) { fmt = SND_SOC_DAIFMT_CBS_CFS|SND_SOC_DAIFMT_IB_NF|SND_SOC_DAIFMT_DSP_A; @@ -1035,30 +968,33 @@ static int mdm_sec_auxpcm_hw_params(struct snd_pcm_substream *substream, return ret; /* set the codec FLL */ - ret = snd_soc_dai_set_pll(codec_dai, 0, 1, params_rate(params) * 256, - params_rate(params) * 256); + ret = snd_soc_dai_set_pll(codec_dai, 0, 1, 2048000, params_rate(params) * 256); if (ret < 0) return ret; /* set the codec system clock */ ret = snd_soc_dai_set_sysclk(codec_dai, 1, params_rate(params) * 256, SND_SOC_CLOCK_IN); - if (ret < 0) + if (ret < 0) { + pr_info("%s: Failed to set sys clk\n", __func__); return ret; + } } return 0; } - static struct snd_soc_ops mdm_auxpcm_be_ops = { .startup = mdm_auxpcm_startup, + .shutdown = mdm_auxpcm_shutdown, + .hw_params = mdm_sec_auxpcm_hw_params, + }; static struct snd_soc_ops mdm_sec_auxpcm_be_ops = { .startup = mdm_sec_auxpcm_startup, -#ifdef CONFIG_QUECTEL_AUDIO_DRIVER + .shutdown = mdm_sec_auxpcm_shutdown, .hw_params = mdm_sec_auxpcm_hw_params, -#endif + }; static int mdm_auxpcm_rate_get(struct snd_kcontrol *kcontrol, @@ -1078,9 +1014,6 @@ static int mdm_auxpcm_rate_put(struct snd_kcontrol *kcontrol, case 1: mdm_auxpcm_rate = SAMPLE_RATE_16KHZ; break; - case 2: - mdm_auxpcm_rate = SAMPLE_RATE_48KHZ; - break; default: mdm_auxpcm_rate = SAMPLE_RATE_8KHZ; break; @@ -1132,789 +1065,134 @@ static const struct snd_soc_dapm_widget mdm9607_dapm_widgets[] = { static const char *const spk_function[] = {"Off", "On"}; static const char *const mi2s_rx_ch_text[] = {"One", "Two"}; static const char *const mi2s_tx_ch_text[] = {"One", "Two"}; - -static const char *const auxpcm_rate_text[] = {"rate_8000", "rate_16000", "rate_48000"}; -static const char *const mi2s_rate_text[] = {"rate_8000", - "rate_16000", "rate_48000"}; - -static const struct soc_enum mdm_enum[] = { - SOC_ENUM_SINGLE_EXT(2, spk_function), - SOC_ENUM_SINGLE_EXT(2, mi2s_rx_ch_text), - SOC_ENUM_SINGLE_EXT(2, mi2s_tx_ch_text), - SOC_ENUM_SINGLE_EXT(2, auxpcm_rate_text), - SOC_ENUM_SINGLE_EXT(3, mi2s_rate_text), -}; - -static const struct snd_kcontrol_new mdm_snd_controls[] = { - SOC_ENUM_EXT("Speaker Function", mdm_enum[0], - mdm_mi2s_get_spk, - mdm_mi2s_set_spk), - SOC_ENUM_EXT("MI2S_RX Channels", mdm_enum[1], - mdm_mi2s_rx_ch_get, - mdm_mi2s_rx_ch_put), - SOC_ENUM_EXT("MI2S_TX Channels", mdm_enum[2], - mdm_mi2s_tx_ch_get, - mdm_mi2s_tx_ch_put), - SOC_ENUM_EXT("AUX PCM SampleRate", mdm_enum[3], - mdm_auxpcm_rate_get, - mdm_auxpcm_rate_put), - SOC_ENUM_EXT("MI2S SampleRate", mdm_enum[4], - mdm_mi2s_rate_get, - mdm_mi2s_rate_put), - SOC_ENUM_EXT("SEC_MI2S_RX Channels", mdm_enum[1], - mdm_sec_mi2s_rx_ch_get, - mdm_sec_mi2s_rx_ch_put), - SOC_ENUM_EXT("SEC_MI2S_TX Channels", mdm_enum[2], - mdm_sec_mi2s_tx_ch_get, - mdm_sec_mi2s_tx_ch_put), - SOC_ENUM_EXT("SEC_MI2S SampleRate", mdm_enum[4], - mdm_sec_mi2s_rate_get, - mdm_sec_mi2s_rate_put), -}; - -static int msm_snd_get_ext_clk_cnt(void) -{ - return clk_users; -} - -static int mdm_mi2s_audrx_init(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - struct snd_soc_codec *codec = rtd->codec; - struct snd_soc_dapm_context *dapm = &codec->dapm; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_card *card = rtd->card; - struct mdm_machine_data *pdata = snd_soc_card_get_drvdata(card); - - pr_debug("%s dev_name %s\n", __func__, dev_name(cpu_dai->dev)); - - rtd->pmdown_time = 0; - ret = snd_soc_add_codec_controls(codec, mdm_snd_controls, - ARRAY_SIZE(mdm_snd_controls)); - if (ret < 0) - goto done; - - snd_soc_dapm_new_controls(dapm, mdm9607_dapm_widgets, - ARRAY_SIZE(mdm9607_dapm_widgets)); - - /* - * After DAPM Enable pins always - * DAPM SYNC needs to be called. - */ - snd_soc_dapm_enable_pin(dapm, "Lineout_1 amp"); - snd_soc_dapm_enable_pin(dapm, "Lineout_3 amp"); - snd_soc_dapm_enable_pin(dapm, "Lineout_2 amp"); - snd_soc_dapm_enable_pin(dapm, "Lineout_4 amp"); - - snd_soc_dapm_ignore_suspend(dapm, "Lineout_1 amp"); - snd_soc_dapm_ignore_suspend(dapm, "Lineout_3 amp"); - snd_soc_dapm_ignore_suspend(dapm, "Lineout_2 amp"); - snd_soc_dapm_ignore_suspend(dapm, "Lineout_4 amp"); - snd_soc_dapm_ignore_suspend(dapm, "ultrasound amp"); - snd_soc_dapm_ignore_suspend(dapm, "Handset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "ANCRight Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "ANCLeft Headset Mic"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic5"); - snd_soc_dapm_ignore_suspend(dapm, "Digital Mic6"); - - snd_soc_dapm_ignore_suspend(dapm, "MADINPUT"); - snd_soc_dapm_ignore_suspend(dapm, "EAR"); - snd_soc_dapm_ignore_suspend(dapm, "HEADPHONE"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT1"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT2"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT3"); - snd_soc_dapm_ignore_suspend(dapm, "LINEOUT4"); - snd_soc_dapm_ignore_suspend(dapm, "SPK_OUT"); - snd_soc_dapm_ignore_suspend(dapm, "ANC HEADPHONE"); - snd_soc_dapm_ignore_suspend(dapm, "ANC EAR"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC1"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC2"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC3"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC4"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC5"); - snd_soc_dapm_ignore_suspend(dapm, "AMIC6"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC1"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC2"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC3"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC4"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC5"); - snd_soc_dapm_ignore_suspend(dapm, "DMIC6"); - - snd_soc_dapm_sync(dapm); - - ret = afe_enable_lpass_core_shared_clock(MI2S_RX, CLOCK_ON); - if (ret < 0) { - ret = -EINVAL; - goto done; - } - - mdm_gpio_set_mux_ctl(pdata); - - ret = afe_enable_lpass_core_shared_clock(MI2S_RX, CLOCK_OFF); - - mbhc_cfg.calibration = def_codec_mbhc_cal(); - if (mbhc_cfg.calibration) { - ret = pdata->mdm9607_codec_fn.mbhc_hs_detect(codec, &mbhc_cfg); - if (ret < 0) { - pr_err("%s: Failed to intialise mbhc %d\n", - __func__, ret); - kfree(mbhc_cfg.calibration); - } - } else { - ret = -ENOMEM; - } - - if (!strcmp(card->name, "mdm9607-tomtom-i2s-snd-card")) { - tomtom_register_ext_clk_cb(mdm_enable_codec_ext_clk, - msm_snd_get_ext_clk_cnt, - rtd->codec); - - ret = mdm_enable_codec_ext_clk(rtd->codec, 1, false); - if (IS_ERR_VALUE(ret)) { - pr_err("%s: Failed to enable mclk, err = 0x%x\n", - __func__, ret); - goto done; - } - - tomtom_enable_qfuse_sensing(rtd->codec); - - ret = mdm_enable_codec_ext_clk(rtd->codec, 0, false); - if (IS_ERR_VALUE(ret)) { - pr_err("%s: Failed to disable mclk, err = 0x%x\n", - __func__, ret); - } - } -done: - return ret; -} - -void *def_codec_mbhc_cal(void) -{ - void *tomtom_cal; - struct wcd9xxx_mbhc_btn_detect_cfg *btn_cfg; - u16 *btn_low, *btn_high; - u8 *n_ready, *n_cic, *gain; - - tomtom_cal = kzalloc(WCD9XXX_MBHC_CAL_SIZE(WCD9XXX_MBHC_DEF_BUTTONS, - WCD9XXX_MBHC_DEF_RLOADS), - GFP_KERNEL); - if (!tomtom_cal) { - pr_err("%s Out of memory\n", __func__); - - return NULL; - } - -#define S(X, Y) ((WCD9XXX_MBHC_CAL_GENERAL_PTR(tomtom_cal)->X) = (Y)) - S(t_ldoh, 100); - S(t_bg_fast_settle, 100); - S(t_shutdown_plug_rem, 255); - S(mbhc_nsa, 4); - S(mbhc_navg, 4); -#undef S -#define S(X, Y) ((WCD9XXX_MBHC_CAL_PLUG_DET_PTR(tomtom_cal)->X) = (Y)) - S(mic_current, TOMTOM_PID_MIC_5_UA); - S(hph_current, TOMTOM_PID_MIC_5_UA); - S(t_mic_pid, 100); - S(t_ins_complete, 250); - S(t_ins_retry, 200); -#undef S -#define S(X, Y) ((WCD9XXX_MBHC_CAL_PLUG_TYPE_PTR(tomtom_cal)->X) = (Y)) - S(v_no_mic, 30); - S(v_hs_max, 2400); -#undef S -#define S(X, Y) ((WCD9XXX_MBHC_CAL_BTN_DET_PTR(tomtom_cal)->X) = (Y)) - S(c[0], 62); - S(c[1], 124); - S(nc, 1); - S(n_meas, 3); - S(mbhc_nsc, 11); - S(n_btn_meas, 1); - S(n_btn_con, 2); - S(num_btn, WCD9XXX_MBHC_DEF_BUTTONS); - S(v_btn_press_delta_sta, 100); - S(v_btn_press_delta_cic, 50); -#undef S - btn_cfg = WCD9XXX_MBHC_CAL_BTN_DET_PTR(tomtom_cal); - btn_low = wcd9xxx_mbhc_cal_btn_det_mp(btn_cfg, MBHC_BTN_DET_V_BTN_LOW); - btn_high = wcd9xxx_mbhc_cal_btn_det_mp(btn_cfg, - MBHC_BTN_DET_V_BTN_HIGH); - btn_low[0] = -50; - btn_high[0] = 20; - btn_low[1] = 21; - btn_high[1] = 61; - btn_low[2] = 62; - btn_high[2] = 104; - btn_low[3] = 105; - btn_high[3] = 148; - btn_low[4] = 149; - btn_high[4] = 189; - btn_low[5] = 190; - btn_high[5] = 228; - btn_low[6] = 229; - btn_high[6] = 269; - btn_low[7] = 270; - btn_high[7] = 500; - n_ready = wcd9xxx_mbhc_cal_btn_det_mp(btn_cfg, MBHC_BTN_DET_N_READY); - n_ready[0] = 80; - n_ready[1] = 68; - n_cic = wcd9xxx_mbhc_cal_btn_det_mp(btn_cfg, MBHC_BTN_DET_N_CIC); - n_cic[0] = 60; - n_cic[1] = 47; - gain = wcd9xxx_mbhc_cal_btn_det_mp(btn_cfg, MBHC_BTN_DET_GAIN); - gain[0] = 11; - gain[1] = 9; - - return tomtom_cal; -} - -/* Digital audio interface connects codec <---> CPU */ -static struct snd_soc_dai_link mdm_dai[] = { - /* FrontEnd DAI Links */ - { - .name = "MDM Media1", - .stream_name = "MultiMedia1", - .cpu_dai_name = "MultiMedia1", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* This dainlink has playback support */ - .ignore_pmdown_time = 1, - .be_id = MSM_FRONTEND_DAI_MULTIMEDIA1 - }, - { - .name = "MSM VoIP", - .stream_name = "VoIP", - .cpu_dai_name = "VoIP", - .platform_name = "msm-voip-dsp", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - /* This dainlink has VOIP support */ - .ignore_pmdown_time = 1, - .be_id = MSM_FRONTEND_DAI_VOIP, - }, - { - .name = "Circuit-Switch Voice", - .stream_name = "CS-Voice", - .cpu_dai_name = "CS-VOICE", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* This dainlink has Voice support */ - .ignore_pmdown_time = 1, - .be_id = MSM_FRONTEND_DAI_CS_VOICE, - }, - { - .name = "Primary MI2S RX Hostless", - .stream_name = "Primary MI2S_RX Hostless Playback", - .cpu_dai_name = "PRI_MI2S_RX_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "VoLTE", - .stream_name = "VoLTE", - .cpu_dai_name = "VoLTE", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .be_id = MSM_FRONTEND_DAI_VOLTE, - }, - { .name = "MSM AFE-PCM RX", - .stream_name = "AFE-PROXY RX", - .cpu_dai_name = "msm-dai-q6-dev.241", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .platform_name = "msm-pcm-afe", - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - }, - { - .name = "MSM AFE-PCM TX", - .stream_name = "AFE-PROXY TX", - .cpu_dai_name = "msm-dai-q6-dev.240", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .platform_name = "msm-pcm-afe", - .ignore_suspend = 1, - }, - { - .name = "DTMF RX Hostless", - .stream_name = "DTMF RX Hostless", - .cpu_dai_name = "DTMF_RX_HOSTLESS", - .platform_name = "msm-pcm-dtmf", - .dynamic = 1, - .dpcm_playback = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .be_id = MSM_FRONTEND_DAI_DTMF_RX, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - }, - { - .name = "DTMF TX", - .stream_name = "DTMF TX", - .cpu_dai_name = "msm-dai-stub-dev.4", - .platform_name = "msm-pcm-dtmf", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .ignore_suspend = 1, - }, - { - .name = "CS-VOICE HOST RX CAPTURE", - .stream_name = "CS-VOICE HOST RX CAPTURE", - .cpu_dai_name = "msm-dai-stub-dev.5", - .platform_name = "msm-voice-host-pcm", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .ignore_suspend = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - }, - { - .name = "CS-VOICE HOST RX PLAYBACK", - .stream_name = "CS-VOICE HOST RX PLAYBACK", - .cpu_dai_name = "msm-dai-stub-dev.6", - .platform_name = "msm-voice-host-pcm", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = "CS-VOICE HOST TX CAPTURE", - .stream_name = "CS-VOICE HOST TX CAPTURE", - .cpu_dai_name = "msm-dai-stub-dev.7", - .platform_name = "msm-voice-host-pcm", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .ignore_suspend = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - }, - { - .name = "CS-VOICE HOST TX PLAYBACK", - .stream_name = "CS-VOICE HOST TX PLAYBACK", - .cpu_dai_name = "msm-dai-stub-dev.8", - .platform_name = "msm-voice-host-pcm", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = "MDM Media2", - .stream_name = "MultiMedia2", - .cpu_dai_name = "MultiMedia2", - .platform_name = "msm-pcm-dsp.0", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - /* this dainlink has playback support */ - .be_id = MSM_FRONTEND_DAI_MULTIMEDIA2, - }, - { - .name = "MDM Media6", - .stream_name = "MultiMedia6", - .cpu_dai_name = "MultiMedia6", - .platform_name = "msm-pcm-loopback", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - /* this dainlink has playback support */ - .be_id = MSM_FRONTEND_DAI_MULTIMEDIA6, - }, - { - .name = "Primary MI2S TX Hostless", - .stream_name = "Primary MI2S_TX Hostless Playback", - .cpu_dai_name = "PRI_MI2S_TX_HOSTLESS", - .platform_name = "msm-pcm-hostless", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - }, - { - .name = "MDM LowLatency", - .stream_name = "MultiMedia5", - .cpu_dai_name = "MultiMedia5", - .platform_name = "msm-pcm-dsp.1", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .ignore_suspend = 1, - /* this dainlink has playback support */ - .ignore_pmdown_time = 1, - .be_id = MSM_FRONTEND_DAI_MULTIMEDIA5, - }, - { - .name = "MDM VoiceMMode1", - .stream_name = "VoiceMMode1", - .cpu_dai_name = "VoiceMMode1", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* This dainlink has Voice support */ - .ignore_pmdown_time = 1, - .be_id = MSM_FRONTEND_DAI_VOICEMMODE1, - }, - { - .name = "MDM VoiceMMode2", - .stream_name = "VoiceMMode2", - .cpu_dai_name = "VoiceMMode2", - .platform_name = "msm-pcm-voice", - .dynamic = 1, - .dpcm_playback = 1, - .dpcm_capture = 1, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, - .ignore_suspend = 1, - /* This dainlink has Voice support */ - .ignore_pmdown_time = 1, - .be_id = MSM_FRONTEND_DAI_VOICEMMODE2, - }, - { - .name = "VoiceMMode1 HOST RX CAPTURE", - .stream_name = "VoiceMMode1 HOST RX CAPTURE", - .cpu_dai_name = "msm-dai-stub-dev.5", - .platform_name = "msm-voice-host-pcm", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .ignore_suspend = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - }, - { - .name = "VoiceMMode1 HOST RX PLAYBACK", - .stream_name = "VoiceMMode1 HOST RX PLAYBACK", - .cpu_dai_name = "msm-dai-stub-dev.6", - .platform_name = "msm-voice-host-pcm", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = "VoiceMMode1 HOST TX CAPTURE", - .stream_name = "VoiceMMode1 HOST TX CAPTURE", - .cpu_dai_name = "msm-dai-stub-dev.7", - .platform_name = "msm-voice-host-pcm", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .ignore_suspend = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - }, - { - .name = "VoiceMMode1 HOST TX PLAYBACK", - .stream_name = "VoiceMMode1 HOST TX PLAYBACK", - .cpu_dai_name = "msm-dai-stub-dev.8", - .platform_name = "msm-voice-host-pcm", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = "VoiceMMode2 HOST RX CAPTURE", - .stream_name = "VoiceMMode2 HOST RX CAPTURE", - .cpu_dai_name = "msm-dai-stub-dev.5", - .platform_name = "msm-voice-host-pcm", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .ignore_suspend = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - }, - { - .name = "VoiceMMode2 HOST RX PLAYBACK", - .stream_name = "VOiceMMode2 HOST RX PLAYBACK", - .cpu_dai_name = "msm-dai-stub-dev.6", - .platform_name = "msm-voice-host-pcm", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - { - .name = "VoiceMMode2 HOST TX CAPTURE", - .stream_name = "VoiceMMode2 HOST TX CAPTURE", - .cpu_dai_name = "msm-dai-stub-dev.7", - .platform_name = "msm-voice-host-pcm", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .ignore_suspend = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - }, - { - .name = "VoiceMMode2 HOST TX PLAYBACK", - .stream_name = "VOiceMMode2 HOST TX PLAYBACK", - .cpu_dai_name = "msm-dai-stub-dev.8", - .platform_name = "msm-voice-host-pcm", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - }, - //2016-02-26, comment out by jun.wu -#ifndef CONFIG_QUECTEL_AUDIO_DRIVER - { - .name = "DTMF Detection", - .stream_name = "DTMF_Detection", - .cpu_dai_name = "DTMF_Detection", - .platform_name = "msm-pcm-dsp-dtmf", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .be_id = MSM_FRONTEND_DAI_DTMF_DETECTION - }, -#endif -//end jun.wu - /* Backend DAI Links */ - { - .name = LPASS_BE_AFE_PCM_RX, - .stream_name = "AFE Playback", - .cpu_dai_name = "msm-dai-q6-dev.224", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .be_id = MSM_BACKEND_DAI_AFE_PCM_RX, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AFE_PCM_TX, - .stream_name = "AFE Capture", - .cpu_dai_name = "msm-dai-q6-dev.225", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .be_id = MSM_BACKEND_DAI_AFE_PCM_TX, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AUXPCM_RX, - .stream_name = "AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .be_id = MSM_BACKEND_DAI_AUXPCM_RX, - .be_hw_params_fixup = mdm_auxpcm_be_params_fixup, - .ops = &mdm_auxpcm_be_ops, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_AUXPCM_TX, - .stream_name = "AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_capture = 1, - .be_id = MSM_BACKEND_DAI_AUXPCM_TX, - .be_hw_params_fixup = mdm_auxpcm_be_params_fixup, - .ops = &mdm_auxpcm_be_ops, - .ignore_suspend = 1, - }, - /* Incall Record Uplink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_TX, - .stream_name = "Voice Uplink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32772", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .be_id = MSM_BACKEND_DAI_INCALL_RECORD_TX, - .be_hw_params_fixup = mdm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Record Downlink BACK END DAI Link */ - { - .name = LPASS_BE_INCALL_RECORD_RX, - .stream_name = "Voice Downlink Capture", - .cpu_dai_name = "msm-dai-q6-dev.32771", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .be_id = MSM_BACKEND_DAI_INCALL_RECORD_RX, - .be_hw_params_fixup = mdm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - /* Incall Music BACK END DAI Link */ - { - .name = LPASS_BE_VOICE_PLAYBACK_TX, - .stream_name = "Voice Farend Playback", - .cpu_dai_name = "msm-dai-q6-dev.32773", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .be_id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX, - .be_hw_params_fixup = mdm_be_hw_params_fixup, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_RX, - .stream_name = "Secondary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - .no_pcm = 1, - .dpcm_playback = 1, - .be_id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - .be_hw_params_fixup = &mdm_sec_mi2s_rx_be_hw_params_fixup, - .ops = &mdm_sec_mi2s_be_ops, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_MI2S_TX, - .stream_name = "Secondary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.1", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .be_id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX, - .be_hw_params_fixup = &mdm_sec_mi2s_tx_be_hw_params_fixup, - .ops = &mdm_sec_mi2s_be_ops, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_AUXPCM_RX, - .stream_name = "Sec AUX PCM Playback", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", - - .no_pcm = 1, - .dpcm_playback = 1, - .be_id = MSM_BACKEND_DAI_SEC_AUXPCM_RX, - .be_hw_params_fixup = mdm_auxpcm_be_params_fixup, - .ops = &mdm_sec_auxpcm_be_ops, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_SEC_AUXPCM_TX, - .stream_name = "Sec AUX PCM Capture", - .cpu_dai_name = "msm-dai-q6-auxpcm.2", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .be_id = MSM_BACKEND_DAI_SEC_AUXPCM_TX, - .be_hw_params_fixup = mdm_auxpcm_be_params_fixup, - .ops = &mdm_sec_auxpcm_be_ops, - .ignore_suspend = 1, - }, + +static const char *const auxpcm_rate_text[] = {"rate_8000", "rate_16000"}; +static const char *const mi2s_rate_text[] = {"rate_8000", + "rate_16000", "rate_48000"}; +static const char *const mode_text[] = {"master", "slave"}; + +static const struct soc_enum mdm_enum[] = { + SOC_ENUM_SINGLE_EXT(2, spk_function), + SOC_ENUM_SINGLE_EXT(2, mi2s_rx_ch_text), + SOC_ENUM_SINGLE_EXT(2, mi2s_tx_ch_text), + SOC_ENUM_SINGLE_EXT(2, auxpcm_rate_text), + SOC_ENUM_SINGLE_EXT(3, mi2s_rate_text), + SOC_ENUM_SINGLE_EXT(2, mode_text), +}; + +static const struct snd_kcontrol_new mdm_snd_controls[] = { + SOC_ENUM_EXT("Speaker Function", mdm_enum[0], + mdm_mi2s_get_spk, + mdm_mi2s_set_spk), + SOC_ENUM_EXT("MI2S_RX Channels", mdm_enum[1], + mdm_mi2s_rx_ch_get, + mdm_mi2s_rx_ch_put), + SOC_ENUM_EXT("MI2S_TX Channels", mdm_enum[2], + mdm_mi2s_tx_ch_get, + mdm_mi2s_tx_ch_put), + SOC_ENUM_EXT("AUX PCM SampleRate", mdm_enum[3], + mdm_auxpcm_rate_get, + mdm_auxpcm_rate_put), + SOC_ENUM_EXT("MI2S SampleRate", mdm_enum[4], + mdm_mi2s_rate_get, + mdm_mi2s_rate_put), + SOC_ENUM_EXT("SEC_MI2S_RX Channels", mdm_enum[1], + mdm_sec_mi2s_rx_ch_get, + mdm_sec_mi2s_rx_ch_put), + SOC_ENUM_EXT("SEC_MI2S_TX Channels", mdm_enum[2], + mdm_sec_mi2s_tx_ch_get, + mdm_sec_mi2s_tx_ch_put), + SOC_ENUM_EXT("SEC_MI2S SampleRate", mdm_enum[4], + mdm_sec_mi2s_rate_get, + mdm_sec_mi2s_rate_put), + SOC_ENUM_EXT("MI2S Mode", mdm_enum[5], + mdm_mi2s_mode_get, + mdm_mi2s_mode_put), + SOC_ENUM_EXT("SEC_MI2S Mode", mdm_enum[5], + mdm_sec_mi2s_mode_get, + mdm_sec_mi2s_mode_put), + SOC_ENUM_EXT("AUXPCM Mode", mdm_enum[5], + mdm_auxpcm_mode_get, + mdm_auxpcm_mode_put), + SOC_ENUM_EXT("SEC_AUXPCM Mode", mdm_enum[5], + mdm_sec_auxpcm_mode_get, + mdm_sec_auxpcm_mode_put), }; +static int mdm_auxpcm_init(struct snd_soc_pcm_runtime *rtd) +{ + int ret = 0; + struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_dapm_context *dapm = &codec->dapm; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + + pr_info("%s dev_name %s\n", __func__, dev_name(cpu_dai->dev)); + + rtd->pmdown_time = 0; + ret = snd_soc_add_codec_controls(codec, mdm_snd_controls, + ARRAY_SIZE(mdm_snd_controls)); + if (ret < 0) + goto done; + + snd_soc_dapm_new_controls(dapm, mdm9607_dapm_widgets, + ARRAY_SIZE(mdm9607_dapm_widgets)); + + /* + * After DAPM Enable pins always + * DAPM SYNC needs to be called. + */ + snd_soc_dapm_enable_pin(dapm, "Lineout_1 amp"); + snd_soc_dapm_enable_pin(dapm, "Lineout_3 amp"); + snd_soc_dapm_enable_pin(dapm, "Lineout_2 amp"); + snd_soc_dapm_enable_pin(dapm, "Lineout_4 amp"); + + snd_soc_dapm_ignore_suspend(dapm, "Lineout_1 amp"); + snd_soc_dapm_ignore_suspend(dapm, "Lineout_3 amp"); + snd_soc_dapm_ignore_suspend(dapm, "Lineout_2 amp"); + snd_soc_dapm_ignore_suspend(dapm, "Lineout_4 amp"); + snd_soc_dapm_ignore_suspend(dapm, "ultrasound amp"); + snd_soc_dapm_ignore_suspend(dapm, "Handset Mic"); + snd_soc_dapm_ignore_suspend(dapm, "Headset Mic"); + snd_soc_dapm_ignore_suspend(dapm, "ANCRight Headset Mic"); + snd_soc_dapm_ignore_suspend(dapm, "ANCLeft Headset Mic"); + snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1"); + snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2"); + snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3"); + snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4"); + snd_soc_dapm_ignore_suspend(dapm, "Digital Mic5"); + snd_soc_dapm_ignore_suspend(dapm, "Digital Mic6"); + + snd_soc_dapm_ignore_suspend(dapm, "MADINPUT"); + snd_soc_dapm_ignore_suspend(dapm, "EAR"); + snd_soc_dapm_ignore_suspend(dapm, "HEADPHONE"); + snd_soc_dapm_ignore_suspend(dapm, "LINEOUT1"); + snd_soc_dapm_ignore_suspend(dapm, "LINEOUT2"); + snd_soc_dapm_ignore_suspend(dapm, "LINEOUT3"); + snd_soc_dapm_ignore_suspend(dapm, "LINEOUT4"); + snd_soc_dapm_ignore_suspend(dapm, "SPK_OUT"); + snd_soc_dapm_ignore_suspend(dapm, "ANC HEADPHONE"); + snd_soc_dapm_ignore_suspend(dapm, "ANC EAR"); + snd_soc_dapm_ignore_suspend(dapm, "AMIC1"); + snd_soc_dapm_ignore_suspend(dapm, "AMIC2"); + snd_soc_dapm_ignore_suspend(dapm, "AMIC3"); + snd_soc_dapm_ignore_suspend(dapm, "AMIC4"); + snd_soc_dapm_ignore_suspend(dapm, "AMIC5"); + snd_soc_dapm_ignore_suspend(dapm, "AMIC6"); + snd_soc_dapm_ignore_suspend(dapm, "DMIC1"); + snd_soc_dapm_ignore_suspend(dapm, "DMIC2"); + snd_soc_dapm_ignore_suspend(dapm, "DMIC3"); + snd_soc_dapm_ignore_suspend(dapm, "DMIC4"); + snd_soc_dapm_ignore_suspend(dapm, "DMIC5"); + snd_soc_dapm_ignore_suspend(dapm, "DMIC6"); + + snd_soc_dapm_sync(dapm); +done: + return ret; +} /* Digital audio interface connects codec <---> CPU */ -static struct snd_soc_dai_link mdm_dai_rt5616[] = { +static struct snd_soc_dai_link mdm_dai[] = { /* FrontEnd DAI Links */ { .name = "MDM Media1", @@ -2274,26 +1552,42 @@ static struct snd_soc_dai_link mdm_dai_rt5616[] = { .codec_dai_name = "msm-stub-rx", .ignore_suspend = 1, .ignore_pmdown_time = 1, - }, -//2016-02-26, comment out by jun.wu -#ifndef CONFIG_QUECTEL_AUDIO_DRIVER - { - .name = "DTMF Detection", - .stream_name = "DTMF_Detection", - .cpu_dai_name = "DTMF_Detection", - .platform_name = "msm-pcm-dsp-dtmf", - .dynamic = 1, - .dpcm_capture = 1, - .trigger = {SND_SOC_DPCM_TRIGGER_POST, - SND_SOC_DPCM_TRIGGER_POST}, - .codec_dai_name = "snd-soc-dummy-dai", - .codec_name = "snd-soc-dummy", - .ignore_suspend = 1, - .ignore_pmdown_time = 1, - .be_id = MSM_FRONTEND_DAI_DTMF_DETECTION - }, -#endif -//end jun.wu + }, + { + .name = "MDM Compress1", + .stream_name = "MultiMedia4", + .cpu_dai_name = "MultiMedia4", + .platform_name = "msm-compress-dsp", + .dynamic = 1, + .dpcm_playback = 1, + .dpcm_capture = 1, + .trigger = {SND_SOC_DPCM_TRIGGER_POST, + SND_SOC_DPCM_TRIGGER_POST}, + .codec_dai_name = "snd-soc-dummy-dai", + .codec_name = "snd-soc-dummy", + .ignore_suspend = 1, + .ignore_pmdown_time = 1, + /* this dainlink has playback support */ + .be_id = MSM_FRONTEND_DAI_MULTIMEDIA4, + }, + { + .name = "QCHAT", + .stream_name = "QCHAT", + .cpu_dai_name = "QCHAT", + .platform_name = "msm-pcm-voice", + .dynamic = 1, + .dpcm_capture = 1, + .dpcm_playback = 1, + .trigger = {SND_SOC_DPCM_TRIGGER_POST, + SND_SOC_DPCM_TRIGGER_POST}, + .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, + .ignore_suspend = 1, + /* this dainlink has playback support */ + .ignore_pmdown_time = 1, + .codec_dai_name = "snd-soc-dummy-dai", + .codec_name = "snd-soc-dummy", + .be_id = MSM_FRONTEND_DAI_QCHAT, + }, /* Backend DAI Links */ { .name = LPASS_BE_AFE_PCM_RX, @@ -2324,13 +1618,9 @@ static struct snd_soc_dai_link mdm_dai_rt5616[] = { .stream_name = "AUX PCM Playback", .cpu_dai_name = "msm-dai-q6-auxpcm.1", .platform_name = "msm-pcm-routing", -#ifndef CONFIG_QUECTEL_AUDIO_DRIVER - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", -#else - .codec_name = "rt5616.2-001b", - .codec_dai_name = "rt5616-aif1", -#endif + .codec_name = stub_codec_name, // "msm-stub-codec.1", + .codec_dai_name = stub_codec_rx_dai_name, //"msm-stub-rx", + .init = &mdm_auxpcm_init, .no_pcm = 1, .dpcm_playback = 1, .be_id = MSM_BACKEND_DAI_AUXPCM_RX, @@ -2344,13 +1634,9 @@ static struct snd_soc_dai_link mdm_dai_rt5616[] = { .stream_name = "AUX PCM Capture", .cpu_dai_name = "msm-dai-q6-auxpcm.1", .platform_name = "msm-pcm-routing", -#ifndef CONFIG_QUECTEL_AUDIO_DRIVER - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", -#else - .codec_name = "rt5616.2-001b", - .codec_dai_name = "rt5616-aif1", -#endif + .codec_name = stub_codec_name, //"msm-stub-codec.1", + .codec_dai_name = stub_codec_tx_dai_name, //"msm-stub-tx", + // .init = &mdm_auxpcm_init, .no_pcm = 1, .dpcm_capture = 1, .be_id = MSM_BACKEND_DAI_AUXPCM_TX, @@ -2435,15 +1721,8 @@ static struct snd_soc_dai_link mdm_dai_rt5616[] = { .stream_name = "Sec AUX PCM Playback", .cpu_dai_name = "msm-dai-q6-auxpcm.2", .platform_name = "msm-pcm-routing", - //2014-10-20 add by scott.hu -#ifndef CONFIG_QUECTEL_AUDIO_DRIVER - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-rx", -#else - .codec_name = "rt5616.2-001b", - .codec_dai_name = "rt5616-aif1", -#endif - + .codec_name = stub_codec_name, // "msm-stub-codec.1", + .codec_dai_name = stub_codec_rx_dai_name, // "msm-stub-rx", .no_pcm = 1, .dpcm_playback = 1, .be_id = MSM_BACKEND_DAI_SEC_AUXPCM_RX, @@ -2457,15 +1736,8 @@ static struct snd_soc_dai_link mdm_dai_rt5616[] = { .stream_name = "Sec AUX PCM Capture", .cpu_dai_name = "msm-dai-q6-auxpcm.2", .platform_name = "msm-pcm-routing", - //2014-10-20 add by scott.hu -#ifndef CONFIG_QUECTEL_AUDIO_DRIVER - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", -#else - .codec_name = "rt5616.2-001b", - .codec_dai_name = "rt5616-aif1", -#endif - + .codec_name = stub_codec_name, // "msm-stub-codec.1", + .codec_dai_name = stub_codec_tx_dai_name, //"msm-stub-tx", .no_pcm = 1, .dpcm_capture = 1, .be_id = MSM_BACKEND_DAI_SEC_AUXPCM_TX, @@ -2474,239 +1746,21 @@ static struct snd_soc_dai_link mdm_dai_rt5616[] = { .ignore_suspend = 1, }, }; -#ifndef CONFIG_QUECTEL_AUDIO_DRIVER -// Not used in quectel -static struct snd_soc_dai_link mdm_9330_dai[] = { - /* Backend DAI Links */ - { - .name = LPASS_BE_PRI_MI2S_RX, - .stream_name = "Primary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_playback = 1, - .be_id = MSM_BACKEND_DAI_PRI_MI2S_RX, - //.init = &mdm_mi2s_audrx_init, - .be_hw_params_fixup = &mdm_mi2s_rx_be_hw_params_fixup, - .ops = &mdm_mi2s_be_ops, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_PRI_MI2S_TX, - .stream_name = "Primary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "msm-stub-codec.1", - .codec_dai_name = "msm-stub-tx", - .no_pcm = 1, - .dpcm_capture = 1, - .be_id = MSM_BACKEND_DAI_PRI_MI2S_TX, - .be_hw_params_fixup = &mdm_mi2s_tx_be_hw_params_fixup, - .ops = &mdm_mi2s_be_ops, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, -}; -#endif -static struct snd_soc_dai_link mdm_9306_dai[] = { - /* Backend DAI Links */ - { - .name = LPASS_BE_PRI_MI2S_RX, - .stream_name = "Primary MI2S Playback", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "tapan_codec", - .codec_dai_name = "tapan_i2s_rx1", - .no_pcm = 1, - .dpcm_playback = 1, - .be_id = MSM_BACKEND_DAI_PRI_MI2S_RX, - .init = &mdm_mi2s_audrx_init, - .be_hw_params_fixup = &mdm_mi2s_rx_be_hw_params_fixup, - .ops = &mdm_mi2s_be_ops, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, - { - .name = LPASS_BE_PRI_MI2S_TX, - .stream_name = "Primary MI2S Capture", - .cpu_dai_name = "msm-dai-q6-mi2s.0", - .platform_name = "msm-pcm-routing", - .codec_name = "tapan_codec", - .codec_dai_name = "tapan_i2s_tx1", - .no_pcm = 1, - .dpcm_capture = 1, - .be_id = MSM_BACKEND_DAI_PRI_MI2S_TX, - .be_hw_params_fixup = &mdm_mi2s_tx_be_hw_params_fixup, - .ops = &mdm_mi2s_be_ops, - .ignore_pmdown_time = 1, - .ignore_suspend = 1, - }, -}; -#ifndef CONFIG_QUECTEL_AUDIO_DRIVER -static struct snd_soc_dai_link mdm_tomtom_dai_links[ - ARRAY_SIZE(mdm_dai) + - ARRAY_SIZE(mdm_9330_dai)]; -#endif -static struct snd_soc_dai_link mdm_tapan_dai_links[ - ARRAY_SIZE(mdm_dai) + - ARRAY_SIZE(mdm_9306_dai)]; +static struct snd_soc_dai_link mdm_tomtom_dai_links[ARRAY_SIZE(mdm_dai)]; -#ifdef CONFIG_QUECTEL_AUDIO_DRIVER -static struct snd_soc_card snd_soc_card_mdm_9330 = { - .name = "mdm9607-tomtom-i2s-snd-card", - .dai_link = mdm_dai, - .num_links = ARRAY_SIZE(mdm_dai), -}; -static struct snd_soc_card snd_soc_card_mdm_9330_rt5616 = { - .name = "mdm9607-tomtom-i2s-snd-card", - .dai_link = mdm_dai_rt5616, - .num_links = ARRAY_SIZE(mdm_dai), -}; -#else static struct snd_soc_card snd_soc_card_mdm_9330 = { - .name = "mdm9607-tomtom-i2s-snd-card", - .dai_link = mdm_tomtom_dai_links, - .num_links = ARRAY_SIZE(mdm_tomtom_dai_links), -}; -#endif - -static struct snd_soc_card snd_soc_card_mdm_9306 = { - .name = "mdm9607-tapan-i2s-snd-card", - .dai_link = mdm_tapan_dai_links, - .num_links = ARRAY_SIZE(mdm_tapan_dai_links), + .name = "mdm9607-tomtom-i2s-snd-card", + .dai_link = mdm_tomtom_dai_links, + .num_links = ARRAY_SIZE(mdm_tomtom_dai_links), }; static const struct of_device_id mdm_asoc_machine_of_match[] = { { .compatible = "qcom,mdm9607-audio-tomtom", .data = "tomtom_codec"}, - { .compatible = "qcom,mdm9607-audio-tapan", - .data = "tapan_codec"}, {}, }; -//2014-11-24 add by scott.hu -#ifdef CONFIG_QUECTEL_AUDIO_DRIVER - -static ssize_t quec_pcm_mode_select_show -( - struct device *pdev, - struct device_attribute *attr, - char *buf -) -{ - struct mdm_machine_data *pdata = NULL; - - if (is_rt5616_codec_available()) { - pdata = (struct mdm_machine_data*)snd_soc_card_get_drvdata(&snd_soc_card_mdm_9330_rt5616); - } else { - pdata = (struct mdm_machine_data*)snd_soc_card_get_drvdata(&snd_soc_card_mdm_9330); - } - - return snprintf(buf, PAGE_SIZE, "%d\n", pdata->sec_auxpcm_mode); -} - -static ssize_t quec_pcm_mode_select_store -( - struct device *pdev, - struct device_attribute *attr, - const char *buff, size_t size -) -{ - int mode = 0; - - struct mdm_machine_data *pdata = NULL; - - if (is_rt5616_codec_available()) { - pdata = (struct mdm_machine_data*)snd_soc_card_get_drvdata(&snd_soc_card_mdm_9330_rt5616); - } else { - pdata = (struct mdm_machine_data*)snd_soc_card_get_drvdata(&snd_soc_card_mdm_9330); - } - - sscanf(buff, "%d", &mode); - - pr_err("%s: PCM mode: %d\n",__func__, mode); - if(mode == I2S_PCM_SLAVE_MODE || mode == I2S_PCM_MASTER_MODE) - { - pdata->sec_auxpcm_mode = (u16)mode; - } - else - { - pr_err("mode error"); - } - - return size; -} - -#ifdef CONFIG_QUECTEL_PCM16K_SUPPORT //add attribe, for usespace change pcm sync -static ssize_t quec_quec_auxpcm_rate_show -( - struct device *pdev, - struct device_attribute *attr, - char *buf -) -{ - return snprintf(buf, PAGE_SIZE, "%d\n", mdm_auxpcm_rate); -} - -static ssize_t quec_quec_auxpcm_rate_store -( - struct device *pdev, - struct device_attribute *attr, - const char *buff, size_t size -) -{ - sscanf(buff, "%d", &mdm_auxpcm_rate); - pr_err("%s: PCM Rate set: %d\n", __FUNCTION__, mdm_auxpcm_rate); - return size; -} -#endif - -static DEVICE_ATTR(pcm_mode_select, S_IRUGO | S_IWUSR, quec_pcm_mode_select_show, quec_pcm_mode_select_store); - -#ifdef CONFIG_QUECTEL_PCM16K_SUPPORT //add attribe, for usespace change pcm sync -static DEVICE_ATTR(quec_auxpcm_rate, S_IRUGO | S_IWUSR, quec_quec_auxpcm_rate_show, quec_quec_auxpcm_rate_store); -#endif - -static struct device_attribute *quec_codec_attributes[] = { - &dev_attr_pcm_mode_select, -#ifdef CONFIG_QUECTEL_PCM16K_SUPPORT //add attribe, for usespace change pcm sync - &dev_attr_quec_auxpcm_rate, -#endif - NULL -}; -static int quectel_create_codec_interface(struct device *dev) -{ - int err; - static bool created = 0; - struct device_attribute **attrs = quec_codec_attributes; - struct device_attribute *attr; - - if(created) - { - return 0; - } - - while((attr = *attrs++)) - { - err = device_create_file(dev, attr); - if (err) - { - pr_err("create codec interface error: %d", err); - return err; - } - } - - created = 1; - - return 0; -} -#endif -//end scott.hu - static int mdm_populate_dai_link_component_of_node( struct snd_soc_card *card) { @@ -2731,7 +1785,7 @@ static int mdm_populate_dai_link_component_of_node( "asoc-platform-names", dai_link[i].platform_name); if (index < 0) { - pr_debug("%s: No match found for platform name: %s\n", + pr_info("%s: No match found for platform name: %s\n", __func__, dai_link[i].platform_name); ret = index; goto err; @@ -2793,99 +1847,12 @@ static int mdm_populate_dai_link_component_of_node( return ret; } -static int mdm_populate_mi2s_interface_mode( - struct snd_soc_card *card) -{ - int size, ret = 0; - struct device *cdev = card->dev; - struct mdm_machine_data *pdata = snd_soc_card_get_drvdata(card); - const char *val_array[MI2S_PCM_MAX_INTF]; - - size = of_property_read_string_array(cdev->of_node, - "qcom,mi2s-interface-mode", - val_array, MI2S_PCM_MAX_INTF); - if (size < 0) { - dev_err(cdev, "%s: Looking up %s property in node %s failed", - __func__, "qcom,mi2s-interface-mode", - cdev->of_node->full_name); - pdata->prim_mi2s_mode = I2S_PCM_MASTER_MODE; - pdata->sec_mi2s_mode = I2S_PCM_MASTER_MODE; - } else { - if (!strcmp(val_array[PRI_MI2S_PCM], "pri_mi2s_master")) { - pdata->prim_mi2s_mode = I2S_PCM_MASTER_MODE; - } else if (!strcmp(val_array[PRI_MI2S_PCM], "pri_mi2s_slave")) { - pdata->prim_mi2s_mode = I2S_PCM_SLAVE_MODE; - } else { - dev_err(cdev, "%s: invalid DT intf mode\n", - __func__); - ret = -EINVAL; - goto err; - } - - if (!strcmp(val_array[SEC_MI2S_PCM], "sec_mi2s_master")) { - pdata->sec_mi2s_mode = I2S_PCM_MASTER_MODE; - } else if (!strcmp(val_array[SEC_MI2S_PCM], "sec_mi2s_slave")) { - pdata->sec_mi2s_mode = I2S_PCM_SLAVE_MODE; - } else { - dev_err(cdev, "%s: invalid DT intf mode\n", - __func__); - ret = -EINVAL; - goto err; - } - } -err: - return ret; -} - -static int mdm_populate_auxpcm_interface_mode( - struct snd_soc_card *card) -{ - int size, ret = 0; - struct device *cdev = card->dev; - struct mdm_machine_data *pdata = snd_soc_card_get_drvdata(card); - const char *val_array[MI2S_PCM_MAX_INTF]; - - size = of_property_read_string_array(cdev->of_node, - "qcom,auxpcm-interface-mode", - val_array, MI2S_PCM_MAX_INTF); - if (size < 0) { - dev_err(cdev, "%s: Looking up %s property in node %s failed", - __func__, "qcom,auxpcm-interface-mode", - cdev->of_node->full_name); - pdata->prim_auxpcm_mode = I2S_PCM_MASTER_MODE; - pdata->sec_auxpcm_mode = I2S_PCM_MASTER_MODE; - } else { - if (!strcmp(val_array[PRI_MI2S_PCM], "pri_pcm_master")) { - pdata->prim_auxpcm_mode = I2S_PCM_MASTER_MODE; - } else if (!strcmp(val_array[PRI_MI2S_PCM], "pri_pcm_slave")) { - pdata->prim_auxpcm_mode = I2S_PCM_SLAVE_MODE; - } else { - dev_err(cdev, "%s: invalid DT intf mode\n", - __func__); - ret = -EINVAL; - goto err; - } - if (!strcmp(val_array[SEC_MI2S_PCM], "sec_pcm_master")) { - pdata->sec_auxpcm_mode = I2S_PCM_MASTER_MODE; - } else if (!strcmp(val_array[SEC_MI2S_PCM], "sec_pcm_slave")) { - pdata->sec_auxpcm_mode = I2S_PCM_SLAVE_MODE; - } else { - dev_err(cdev, "%s: invalid DT intf mode\n", - __func__); - ret = -EINVAL; - goto err; - } - } -err: - return ret; -} - static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) { struct snd_soc_card *card = NULL; struct snd_soc_dai_link *dailink; const struct of_device_id *match; - int len_1, len_2; + int len; match = of_match_node(mdm_asoc_machine_of_match, dev->of_node); if (!match) { @@ -2895,44 +1862,32 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) } if (!strcmp(match->data, "tomtom_codec")) { -#ifdef CONFIG_QUECTEL_AUDIO_DRIVER if (is_rt5616_codec_available()) { - pr_info("%s: Setting up with rt5616\n", __func__); - card = &snd_soc_card_mdm_9330_rt5616; - dailink = mdm_dai_rt5616, - len_2 = ARRAY_SIZE(mdm_dai_rt5616); + pr_info("%s: RT5616 was detected, using it! \n", __func__); + strlcpy(stub_codec_name, "rt5616.2-001b", sizeof("rt5616.2-001b")); + strlcpy(stub_codec_rx_dai_name, "rt5616-aif1", sizeof("rt5616-aif1")); + strlcpy(stub_codec_tx_dai_name, "rt5616-aif1", sizeof("rt5616-aif1")); + mdm_auxpcm_rate = SAMPLE_RATE_16KHZ; } else { - pr_info("%s: Setting up with no external codec\n", __func__); - card = &snd_soc_card_mdm_9330; - dailink = mdm_dai, - len_2 = ARRAY_SIZE(mdm_dai); + pr_info("%s: RT5616 Was *NOT* detected, using i2s directly \n", __func__); + mdm_auxpcm_mode = I2S_PCM_SLAVE_MODE; + mdm_sec_auxpcm_mode = I2S_PCM_SLAVE_MODE; + mdm_auxpcm_rate = SAMPLE_RATE_8KHZ; + } -#else - card = &snd_soc_card_mdm_9330; - len_1 = ARRAY_SIZE(mdm_dai); - len_2 = len_1 + ARRAY_SIZE(mdm_9330_dai); - - memcpy(mdm_tomtom_dai_links, mdm_dai, - sizeof(mdm_dai)); - memcpy(mdm_tomtom_dai_links + len_1, mdm_9330_dai, - sizeof(mdm_9330_dai)); - dailink = mdm_tomtom_dai_links; -#endif - } else if (!strcmp(match->data, "tapan_codec")) { - card = &snd_soc_card_mdm_9306; - len_1 = ARRAY_SIZE(mdm_dai); - len_2 = len_1 + ARRAY_SIZE(mdm_9306_dai); - - memcpy(mdm_tapan_dai_links, mdm_dai, + card = &snd_soc_card_mdm_9330; + len = ARRAY_SIZE(mdm_dai); + + memcpy(mdm_tomtom_dai_links, mdm_dai, sizeof(mdm_dai)); - memcpy(mdm_tapan_dai_links + len_1, mdm_9306_dai, - sizeof(mdm_9306_dai)); - dailink = mdm_tapan_dai_links; + + dailink = mdm_tomtom_dai_links; + } if (card) { card->dai_link = dailink; - card->num_links = len_2; + card->num_links = len; } return card; @@ -2956,7 +1911,8 @@ static int mdm_asoc_machine_probe(struct platform_device *pdev) __func__, q6_state); return -EPROBE_DEFER; } - if (!pdev->dev.of_node) { + + if (!pdev->dev.of_node) { dev_err(&pdev->dev, "%s No platform supplied from device tree\n", __func__); @@ -2987,6 +1943,16 @@ static int mdm_asoc_machine_probe(struct platform_device *pdev) ret = -EINVAL; goto err; } + + pdata->prim_master_p = of_parse_phandle(pdev->dev.of_node, + "qcom,prim_mi2s_aux_master", 0); + pdata->prim_slave_p = of_parse_phandle(pdev->dev.of_node, + "qcom,prim_mi2s_aux_slave", 0); + pdata->sec_master_p = of_parse_phandle(pdev->dev.of_node, + "qcom,sec_mi2s_aux_master", 0); + pdata->sec_slave_p = of_parse_phandle(pdev->dev.of_node, + "qcom,sec_mi2s_aux_slave", 0); + mutex_init(&cdc_mclk_mutex); atomic_set(&aux_ref_count, 0); atomic_set(&sec_aux_ref_count, 0); @@ -3001,10 +1967,7 @@ static int mdm_asoc_machine_probe(struct platform_device *pdev) ret = -EINVAL; goto err; } - if (!strcmp(card->name, "mdm9607-tapan-i2s-snd-card")) { - pdata->mdm9607_codec_fn.mclk_enable_fn = tapan_mclk_enable; - pdata->mdm9607_codec_fn.mbhc_hs_detect = tapan_hs_detect; - } else if (!strcmp(card->name, "mdm9607-tomtom-i2s-snd-card")) { + if (!strcmp(card->name, "mdm9607-tomtom-i2s-snd-card")) { pdata->mdm9607_codec_fn.mclk_enable_fn = tomtom_mclk_enable; pdata->mdm9607_codec_fn.mbhc_hs_detect = tomtom_hs_detect; } @@ -3016,24 +1979,9 @@ static int mdm_asoc_machine_probe(struct platform_device *pdev) ret = snd_soc_of_parse_card_name(card, "qcom,model"); if (ret) goto err; - //2014-11-24 add by scott.hu -#ifdef CONFIG_QUECTEL_AUDIO_DRIVER - quectel_create_codec_interface(card->dev); -#else - ret = snd_soc_of_parse_audio_routing(card, "qcom,audio-routing"); - if (ret) - goto err; -#endif - //end scott.hu - - ret = mdm_populate_mi2s_interface_mode(card); + ret = snd_soc_of_parse_audio_routing(card, "qcom,audio-routing"); if (ret) goto err; - - ret = mdm_populate_auxpcm_interface_mode(card); - if (ret) - goto err; - ret = mdm_populate_dai_link_component_of_node(card); if (ret) { ret = -EPROBE_DEFER; diff --git a/sound/soc/msm/qdsp6v2/audio_cal_utils.c b/sound/soc/msm/qdsp6v2/audio_cal_utils.c index d2c2a7566..04e2679f6 100644 --- a/sound/soc/msm/qdsp6v2/audio_cal_utils.c +++ b/sound/soc/msm/qdsp6v2/audio_cal_utils.c @@ -554,6 +554,7 @@ static struct cal_block_data *get_matching_cal_block( static int cal_block_ion_alloc(struct cal_block_data *cal_block) { int ret = 0; + if (cal_block == NULL) { pr_err("%s: cal_block is NULL!\n", __func__); ret = -EINVAL; diff --git a/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c index 032fba169..d8b3f8793 100644 --- a/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c @@ -36,8 +36,7 @@ #define CHANNEL_STATUS_MASK_INIT 0x0 #define CHANNEL_STATUS_MASK 0x4 #define AFE_API_VERSION_CLOCK_SET 1 -#define CONFIG_QUECTEL_AUDIO_DRIVER 1 -#define CONFIG_QUECTEL_PCM16K_SUPPORT 1 + static const struct afe_clk_set lpass_clk_set_default = { AFE_API_VERSION_CLOCK_SET, Q6AFE_LPASS_CLK_ID_PRI_PCM_IBIT, @@ -68,7 +67,6 @@ enum { enum { RATE_8KHZ, RATE_16KHZ, - RATE_48KHZ, RATE_MAX_NUM_OF_AUX_PCM_RATES, }; @@ -587,8 +585,7 @@ static int msm_dai_q6_auxpcm_hw_params( int rc = 0, slot_mapping_copy_len = 0; if (params_channels(params) != 1 || (params_rate(params) != 8000 && - params_rate(params) != 16000 && - params_rate(params) != 48000)) { + params_rate(params) != 16000)) { dev_err(dai->dev, "%s: invalid param chan %d rate %d\n", __func__, params_channels(params), params_rate(params)); return -EINVAL; @@ -645,42 +642,6 @@ static int msm_dai_q6_auxpcm_hw_params( mutex_unlock(&aux_dai_data->rlock); return -EINVAL; } - } else if (dai_data->rate == 48000) { - dai_data->port_config.pcm.pcm_cfg_minor_version = - AFE_API_VERSION_PCM_CONFIG; - dai_data->port_config.pcm.aux_mode = - auxpcm_pdata->mode_48k.mode; - dai_data->port_config.pcm.sync_src = - auxpcm_pdata->mode_48k.sync; - dai_data->port_config.pcm.frame_setting = - auxpcm_pdata->mode_48k.frame; - dai_data->port_config.pcm.quantype = - auxpcm_pdata->mode_48k.quant; - dai_data->port_config.pcm.ctrl_data_out_enable = - auxpcm_pdata->mode_48k.data; - dai_data->port_config.pcm.sample_rate = dai_data->rate; - dai_data->port_config.pcm.num_channels = dai_data->channels; - dai_data->port_config.pcm.bit_width = 16; - if (ARRAY_SIZE(dai_data->port_config.pcm.slot_number_mapping) <= - auxpcm_pdata->mode_48k.num_slots) - slot_mapping_copy_len = - ARRAY_SIZE( - dai_data->port_config.pcm.slot_number_mapping) - * sizeof(uint16_t); - else - slot_mapping_copy_len = auxpcm_pdata->mode_48k.num_slots - * sizeof(uint16_t); - - if (auxpcm_pdata->mode_48k.slot_mapping) { - memcpy(dai_data->port_config.pcm.slot_number_mapping, - auxpcm_pdata->mode_48k.slot_mapping, - slot_mapping_copy_len); - } else { - dev_err(dai->dev, "%s 48khz slot mapping is NULL\n", - __func__); - mutex_unlock(&aux_dai_data->rlock); - return -EINVAL; - } } else { dai_data->port_config.pcm.pcm_cfg_minor_version = AFE_API_VERSION_PCM_CONFIG; @@ -757,12 +718,6 @@ static int msm_dai_q6_auxpcm_set_clk( return rc; } -//jun20160814 -#ifdef CONFIG_QUECTEL_AUDIO_DRIVER -static u16 quectel_enable_pcm_clk = 0; -#endif -//endif - static void msm_dai_q6_auxpcm_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { @@ -772,11 +727,6 @@ static void msm_dai_q6_auxpcm_shutdown(struct snd_pcm_substream *substream, mutex_lock(&aux_dai_data->rlock); -//jun20160814 - if(quectel_enable_pcm_clk) - goto exit; -//endif - if (!(test_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status) || test_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status))) { dev_dbg(dai->dev, "%s(): dai->id %d PCM ports already closed\n", @@ -891,8 +841,6 @@ static int msm_dai_q6_auxpcm_prepare(struct snd_pcm_substream *substream, pcm_clk_rate = auxpcm_pdata->mode_8k.pcm_clk_rate; } else if (dai_data->rate == 16000) { pcm_clk_rate = (auxpcm_pdata->mode_16k.pcm_clk_rate); - } else if (dai_data->rate == 48000) { - pcm_clk_rate = (auxpcm_pdata->mode_48k.pcm_clk_rate); } else { dev_err(dai->dev, "%s: Invalid AUX PCM rate %d\n", __func__, dai_data->rate); @@ -2278,449 +2226,6 @@ static struct snd_soc_dai_driver msm_dai_q6_incall_record_dai[] = { }, }; -//2014-11-24 add by scott.hu -#ifdef CONFIG_QUECTEL_AUDIO_DRIVER -static ssize_t auxpcm_mode_show -( - struct device *pdev, - struct device_attribute *attr, - char *buf -) -{ - struct msm_dai_auxpcm_pdata *auxpcm_pdata = (struct msm_dai_auxpcm_pdata *)pdev->platform_data; - - return snprintf(buf, PAGE_SIZE, "%d\n", auxpcm_pdata->mode_8k.mode); -} - -static ssize_t auxpcm_mode_store -( - struct device *pdev, - struct device_attribute *attr, - const char *buff, size_t size -) -{ - int mode; - struct msm_dai_auxpcm_pdata *auxpcm_pdata = (struct msm_dai_auxpcm_pdata *)pdev->platform_data; - - sscanf(buff, "%d", &mode); - - if(mode <= AFE_PORT_PCM_AUX_MODE_AUX) - { - auxpcm_pdata->mode_8k.mode = (u16)mode; - #ifdef CONFIG_QUECTEL_PCM16K_SUPPORT - auxpcm_pdata->mode_16k.mode = (u16)mode;//16k - auxpcm_pdata->mode_48k.mode = (u16)mode;//16k - #endif - } - else - { - pr_err("auxpcm mode out of range.\n"); - } - - return size; -} - -static ssize_t auxpcm_sync_show -( - struct device *pdev, - struct device_attribute *attr, - char *buf -) -{ - struct msm_dai_auxpcm_pdata *auxpcm_pdata = (struct msm_dai_auxpcm_pdata *)pdev->platform_data; - - return snprintf(buf, PAGE_SIZE, "%d\n", auxpcm_pdata->mode_8k.sync); -} - -static ssize_t auxpcm_sync_store -( - struct device *pdev, - struct device_attribute *attr, - const char *buff, size_t size -) -{ - int sync; - struct msm_dai_auxpcm_pdata *auxpcm_pdata = (struct msm_dai_auxpcm_pdata *)pdev->platform_data; - - sscanf(buff, "%d", &sync); - - if(sync <= AFE_PORT_PCM_SYNC_SRC_INTERNAL) - { - auxpcm_pdata->mode_8k.sync = (u16)sync; - #ifdef CONFIG_QUECTEL_PCM16K_SUPPORT - auxpcm_pdata->mode_16k.sync = (u16)sync; //16k - auxpcm_pdata->mode_48k.sync = (u16)sync; //16k - #endif - } - else - { - pr_err("auxpcm sync out of range.\n"); - } - - return size; -} - -static ssize_t auxpcm_frame_show -( - struct device *pdev, - struct device_attribute *attr, - char *buf -) -{ - struct msm_dai_auxpcm_pdata *auxpcm_pdata = (struct msm_dai_auxpcm_pdata *)pdev->platform_data; - - return snprintf(buf, PAGE_SIZE, "%d\n", auxpcm_pdata->mode_8k.frame); -} - -static ssize_t auxpcm_frame_store -( - struct device *pdev, - struct device_attribute *attr, - const char *buff, size_t size -) -{ - int frame; - struct msm_dai_auxpcm_pdata *auxpcm_pdata = (struct msm_dai_auxpcm_pdata *)pdev->platform_data; - - sscanf(buff, "%d", &frame); - - if(frame <= AFE_PORT_PCM_BITS_PER_FRAME_256) - { - auxpcm_pdata->mode_8k.frame = (u16)frame; - #ifdef CONFIG_QUECTEL_PCM16K_SUPPORT - auxpcm_pdata->mode_16k.frame = (u16)frame; //16k - auxpcm_pdata->mode_48k.frame = (u16)frame; //16k - #endif - } - else - { - pr_err("auxpcm frame out of range.\n"); - } - - return size; -} - -static ssize_t auxpcm_quant_show -( - struct device *pdev, - struct device_attribute *attr, - char *buf -) -{ - struct msm_dai_auxpcm_pdata *auxpcm_pdata = (struct msm_dai_auxpcm_pdata *)pdev->platform_data; - return snprintf(buf, PAGE_SIZE, "%d\n", auxpcm_pdata->mode_8k.quant); -} - -static ssize_t auxpcm_quant_store -( - struct device *pdev, - struct device_attribute *attr, - const char *buff, size_t size -) -{ - int quant; - struct msm_dai_auxpcm_pdata *auxpcm_pdata = (struct msm_dai_auxpcm_pdata *)pdev->platform_data; - - sscanf(buff, "%d", &quant); - - if(quant <= AFE_PORT_PCM_LINEAR_PADDING) - { - auxpcm_pdata->mode_8k.quant = (u16)quant; - #ifdef CONFIG_QUECTEL_PCM16K_SUPPORT - auxpcm_pdata->mode_16k.quant = (u16)quant;//16k - auxpcm_pdata->mode_48k.quant = (u16)quant;//16k - #endif - } - else - { - pr_err("auxpcm quant out of range.\n"); - } - - return size; -} - -static ssize_t auxpcm_data_show -( - struct device *pdev, - struct device_attribute *attr, - char *buf -) -{ - struct msm_dai_auxpcm_pdata *auxpcm_pdata = (struct msm_dai_auxpcm_pdata *)pdev->platform_data; - - return snprintf(buf, PAGE_SIZE, "%d\n", auxpcm_pdata->mode_8k.data); -} - -static ssize_t auxpcm_data_store -( - struct device *pdev, - struct device_attribute *attr, - const char *buff, size_t size -) -{ - int data; - struct msm_dai_auxpcm_pdata *auxpcm_pdata = (struct msm_dai_auxpcm_pdata *)pdev->platform_data; - - sscanf(buff, "%d", &data); - - if(data <= AFE_PORT_PCM_CTRL_DATA_OE_ENABLE) - { - auxpcm_pdata->mode_8k.data = (u16)data; - #ifdef CONFIG_QUECTEL_PCM16K_SUPPORT - auxpcm_pdata->mode_16k.data = (u16)data;//16k - auxpcm_pdata->mode_48k.data = (u16)data;//16k - #endif - } - else - { - pr_err("auxpcm data out of range.\n"); - } - - return size; -} - -static ssize_t auxpcm_rate_show -( - struct device *pdev, - struct device_attribute *attr, - char *buf -) -{ - struct msm_dai_auxpcm_pdata *auxpcm_pdata = (struct msm_dai_auxpcm_pdata *)pdev->platform_data; - - return snprintf(buf, PAGE_SIZE, "%d\n", auxpcm_pdata->mode_8k.pcm_clk_rate); -} - -static ssize_t auxpcm_rate_store -( - struct device *pdev, - struct device_attribute *attr, - const char *buff, size_t size -) -{ - int rate; - struct msm_dai_auxpcm_pdata *auxpcm_pdata = (struct msm_dai_auxpcm_pdata *)pdev->platform_data; - - sscanf(buff, "%d", &rate); - - if(rate <= 12288000) - { - auxpcm_pdata->mode_8k.pcm_clk_rate = rate; - #ifdef CONFIG_QUECTEL_PCM16K_SUPPORT - auxpcm_pdata->mode_16k.pcm_clk_rate = rate;//16k - auxpcm_pdata->mode_48k.pcm_clk_rate = rate;//16k - #endif - } - else - { - pr_err("auxpcm pcm_clk_rate out of range.\n"); - } - - return size; -} - -//jun20160811 - -static ssize_t auxpcm_enable_clk_show -( - struct device *pdev, - struct device_attribute *attr, - char *buf -) -{ - return snprintf(buf, PAGE_SIZE, "%d\n", quectel_enable_pcm_clk); -} - -static ssize_t auxpcm_enable_clk_store -( - struct device *pdev, - struct device_attribute *attr, - const char *buff, size_t size -) -{ - struct msm_dai_q6_auxpcm_dai_data *aux_dai_data = - dev_get_drvdata(pdev); - struct msm_dai_q6_dai_data *dai_data = &aux_dai_data->bdai_data; - struct msm_dai_auxpcm_pdata *auxpcm_pdata = NULL; - int rc = 0, enable, slot_mapping_copy_len = 0; - u32 pcm_clk_rate; - - sscanf(buff, "%d", &enable); - - auxpcm_pdata = pdev->platform_data; - mutex_lock(&aux_dai_data->rlock); - - dev_dbg(pdev, "%s: opening afe ports\n", - __func__); - - rc = afe_q6_interface_prepare(); - if (IS_ERR_VALUE(rc)) { - dev_err(pdev, "fail to open AFE APR\n"); - goto fail; - } - - /* - * For AUX PCM Interface the below sequence of clk - * settings and afe_open is a strict requirement. - * - * Also using afe_open instead of afe_port_start_nowait - * to make sure the port is open before deasserting the - * clock line. This is required because pcm register is - * not written before clock deassert. Hence the hw does - * not get updated with new setting if the below clock - * assert/deasset and afe_open sequence is not followed. - */ - - if (dai_data->rate == 8000) { - pcm_clk_rate = auxpcm_pdata->mode_8k.pcm_clk_rate; - } else if (dai_data->rate == 16000) { - pcm_clk_rate = (auxpcm_pdata->mode_16k.pcm_clk_rate); - } else if (dai_data->rate == 48000) { - pcm_clk_rate = (auxpcm_pdata->mode_48k.pcm_clk_rate); - } else { - dev_err(pdev, "%s: Invalid AUX PCM rate %d\n", __func__, - dai_data->rate); - - dai_data->channels = 1; - dai_data->rate = 8000; - - dai_data->port_config.pcm.pcm_cfg_minor_version = - AFE_API_VERSION_PCM_CONFIG; - dai_data->port_config.pcm.aux_mode = auxpcm_pdata->mode_8k.mode; - dai_data->port_config.pcm.sync_src = auxpcm_pdata->mode_8k.sync; - dai_data->port_config.pcm.frame_setting = - auxpcm_pdata->mode_8k.frame; - dai_data->port_config.pcm.quantype = - auxpcm_pdata->mode_8k.quant; - dai_data->port_config.pcm.ctrl_data_out_enable = - auxpcm_pdata->mode_8k.data; - dai_data->port_config.pcm.sample_rate = dai_data->rate; - dai_data->port_config.pcm.num_channels = dai_data->channels; - dai_data->port_config.pcm.bit_width = 16; - - if (ARRAY_SIZE(dai_data->port_config.pcm.slot_number_mapping) <= - auxpcm_pdata->mode_8k.num_slots) - slot_mapping_copy_len = - ARRAY_SIZE( - dai_data->port_config.pcm.slot_number_mapping) - * sizeof(uint16_t); - else - slot_mapping_copy_len = auxpcm_pdata->mode_8k.num_slots - * sizeof(uint16_t); - - if (auxpcm_pdata->mode_8k.slot_mapping) { - memcpy(dai_data->port_config.pcm.slot_number_mapping, - auxpcm_pdata->mode_8k.slot_mapping, - slot_mapping_copy_len); - } else { - dev_err(pdev, "%s 8khz slot mapping is NULL\n", - __func__); - mutex_unlock(&aux_dai_data->rlock); - return -EINVAL; - } - - pcm_clk_rate = auxpcm_pdata->mode_8k.pcm_clk_rate; - } - - memcpy(&aux_dai_data->clk_cfg, &lpass_clk_cfg_default, - sizeof(struct afe_clk_cfg)); - aux_dai_data->clk_cfg.clk_val1 = pcm_clk_rate; - - if(enable) - { - dev_err(pdev,"%s: enable pcm clk \n",__func__); - - rc = msm_dai_q6_auxpcm_set_clk(aux_dai_data, - aux_dai_data->tx_pid, true); - if (rc < 0) { - dev_err(pdev,"%s: set tx pcm clk err\n", __func__); - goto fail; - } - - rc = msm_dai_q6_auxpcm_set_clk(aux_dai_data, - aux_dai_data->rx_pid, true); - if (rc < 0) { - dev_err(pdev, - "%s:set rx pcm clk err\n",__func__); - goto fail; - } - - set_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status); - set_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status); - - afe_open(aux_dai_data->tx_pid, &dai_data->port_config, dai_data->rate); - afe_open(aux_dai_data->rx_pid, &dai_data->port_config, dai_data->rate); - } - else - { - if (test_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status) - || test_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status) - ) - { - rc = afe_close(aux_dai_data->rx_pid); /* can block */ - if (IS_ERR_VALUE(rc)) - dev_err(pdev, "fail to close AUXPCM RX AFE port\n"); - - rc = afe_close(aux_dai_data->tx_pid); - if (IS_ERR_VALUE(rc)) - dev_err(pdev, "fail to close AUXPCM TX AFE port\n"); - - clear_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status); - clear_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status); - } - - msm_dai_q6_auxpcm_set_clk(aux_dai_data, aux_dai_data->rx_pid, false); - msm_dai_q6_auxpcm_set_clk(aux_dai_data, aux_dai_data->tx_pid, false); - } - - quectel_enable_pcm_clk = enable; - -fail: - mutex_unlock(&aux_dai_data->rlock); - return size; -} -//end jun - -static DEVICE_ATTR(mode, S_IRUGO | S_IWUSR, auxpcm_mode_show, auxpcm_mode_store); -static DEVICE_ATTR(sync, S_IRUGO | S_IWUSR, auxpcm_sync_show, auxpcm_sync_store); -static DEVICE_ATTR(frame, S_IRUGO | S_IWUSR, auxpcm_frame_show, auxpcm_frame_store); -static DEVICE_ATTR(quant, S_IRUGO | S_IWUSR, auxpcm_quant_show, auxpcm_quant_store); -static DEVICE_ATTR(data, S_IRUGO | S_IWUSR, auxpcm_data_show, auxpcm_data_store); -static DEVICE_ATTR(rate, S_IRUGO | S_IWUSR, auxpcm_rate_show, auxpcm_rate_store); -static DEVICE_ATTR(enable_clk, S_IRUGO | S_IWUSR, auxpcm_enable_clk_show, auxpcm_enable_clk_store); - -static struct device_attribute *aux_pcm_attributes[] = { - &dev_attr_mode, - &dev_attr_sync, - &dev_attr_frame, - &dev_attr_quant, - &dev_attr_data, - &dev_attr_rate, - &dev_attr_enable_clk, - NULL -}; - -int quectel_create_auxpcm_interface(struct device *dev) -{ - int err; - struct device_attribute **attrs = aux_pcm_attributes; - struct device_attribute *attr; - - while((attr = *attrs++)) - { - err = device_create_file(dev, attr); - if (err) - { - pr_err("create auxpcm interface error: %d", err); - return err; - } - } - - return 0; -} -#endif /* CONFIG_QUECTEL_AUDIO_DRIVER */ -//end scott.hu - static int msm_auxpcm_dev_probe(struct platform_device *pdev) { struct msm_dai_q6_auxpcm_dai_data *dai_data; @@ -2761,7 +2266,6 @@ static int msm_auxpcm_dev_probe(struct platform_device *pdev) } auxpcm_pdata->mode_8k.mode = (u16)val_array[RATE_8KHZ]; auxpcm_pdata->mode_16k.mode = (u16)val_array[RATE_16KHZ]; - auxpcm_pdata->mode_48k.mode = (u16)val_array[RATE_48KHZ]; rc = of_property_read_u32_array(pdev->dev.of_node, "qcom,msm-cpudai-auxpcm-sync", @@ -2773,7 +2277,6 @@ static int msm_auxpcm_dev_probe(struct platform_device *pdev) } auxpcm_pdata->mode_8k.sync = (u16)val_array[RATE_8KHZ]; auxpcm_pdata->mode_16k.sync = (u16)val_array[RATE_16KHZ]; - auxpcm_pdata->mode_48k.sync = (u16)val_array[RATE_48KHZ]; rc = of_property_read_u32_array(pdev->dev.of_node, "qcom,msm-cpudai-auxpcm-frame", @@ -2786,7 +2289,6 @@ static int msm_auxpcm_dev_probe(struct platform_device *pdev) } auxpcm_pdata->mode_8k.frame = (u16)val_array[RATE_8KHZ]; auxpcm_pdata->mode_16k.frame = (u16)val_array[RATE_16KHZ]; - auxpcm_pdata->mode_48k.frame = (u16)val_array[RATE_48KHZ]; rc = of_property_read_u32_array(pdev->dev.of_node, "qcom,msm-cpudai-auxpcm-quant", @@ -2798,7 +2300,6 @@ static int msm_auxpcm_dev_probe(struct platform_device *pdev) } auxpcm_pdata->mode_8k.quant = (u16)val_array[RATE_8KHZ]; auxpcm_pdata->mode_16k.quant = (u16)val_array[RATE_16KHZ]; - auxpcm_pdata->mode_48k.quant = (u16)val_array[RATE_48KHZ]; rc = of_property_read_u32_array(pdev->dev.of_node, "qcom,msm-cpudai-auxpcm-num-slots", @@ -2820,7 +2321,6 @@ static int msm_auxpcm_dev_probe(struct platform_device *pdev) goto fail_invalid_dt; } auxpcm_pdata->mode_16k.num_slots = (u16)val_array[RATE_16KHZ]; - auxpcm_pdata->mode_48k.num_slots = (u16)val_array[RATE_48KHZ]; if (auxpcm_pdata->mode_16k.num_slots > msm_dai_q6_max_num_slot(auxpcm_pdata->mode_16k.frame)) { @@ -2831,15 +2331,6 @@ static int msm_auxpcm_dev_probe(struct platform_device *pdev) rc = -EINVAL; goto fail_invalid_dt; } - if (auxpcm_pdata->mode_48k.num_slots > - msm_dai_q6_max_num_slot(auxpcm_pdata->mode_48k.frame)) { - dev_err(&pdev->dev, "%s Max slots %d greater than DT node %d\n", - __func__, - msm_dai_q6_max_num_slot(auxpcm_pdata->mode_48k.frame), - auxpcm_pdata->mode_48k.num_slots); - rc = -EINVAL; - goto fail_invalid_dt; - } slot_mapping_array = of_get_property(pdev->dev.of_node, "qcom,msm-cpudai-auxpcm-slot-mapping", &len); @@ -2852,8 +2343,7 @@ static int msm_auxpcm_dev_probe(struct platform_device *pdev) } array_length = auxpcm_pdata->mode_8k.num_slots + - auxpcm_pdata->mode_16k.num_slots + - auxpcm_pdata->mode_48k.num_slots; + auxpcm_pdata->mode_16k.num_slots; if (len != sizeof(uint32_t) * array_length) { dev_err(&pdev->dev, "%s Length is %d and expected is %zd\n", @@ -2861,7 +2351,7 @@ static int msm_auxpcm_dev_probe(struct platform_device *pdev) rc = -EINVAL; goto fail_invalid_dt; } - // RATE 8k + auxpcm_pdata->mode_8k.slot_mapping = kzalloc(sizeof(uint16_t) * auxpcm_pdata->mode_8k.num_slots, @@ -2877,7 +2367,6 @@ static int msm_auxpcm_dev_probe(struct platform_device *pdev) auxpcm_pdata->mode_8k.slot_mapping[i] = (u16)be32_to_cpu(slot_mapping_array[i]); - // RATE 16K auxpcm_pdata->mode_16k.slot_mapping = kzalloc(sizeof(uint16_t) * auxpcm_pdata->mode_16k.num_slots, @@ -2895,24 +2384,6 @@ static int msm_auxpcm_dev_probe(struct platform_device *pdev) (u16)be32_to_cpu(slot_mapping_array[i + auxpcm_pdata->mode_8k.num_slots]); - // RATE 48K - auxpcm_pdata->mode_48k.slot_mapping = - kzalloc(sizeof(uint16_t) * - auxpcm_pdata->mode_48k.num_slots, - GFP_KERNEL); - - if (!auxpcm_pdata->mode_48k.slot_mapping) { - dev_err(&pdev->dev, "%s No mem for mode_48k slot mapping\n", - __func__); - rc = -ENOMEM; - goto fail_invalid_16k_slot_mapping; - } - - for (i = 0; i < auxpcm_pdata->mode_48k.num_slots; i++) - auxpcm_pdata->mode_48k.slot_mapping[i] = - (u16)be32_to_cpu(slot_mapping_array[i + - auxpcm_pdata->mode_8k.num_slots]); - rc = of_property_read_u32_array(pdev->dev.of_node, "qcom,msm-cpudai-auxpcm-data", val_array, RATE_MAX_NUM_OF_AUX_PCM_RATES); @@ -2923,7 +2394,6 @@ static int msm_auxpcm_dev_probe(struct platform_device *pdev) } auxpcm_pdata->mode_8k.data = (u16)val_array[RATE_8KHZ]; auxpcm_pdata->mode_16k.data = (u16)val_array[RATE_16KHZ]; - auxpcm_pdata->mode_48k.data = (u16)val_array[RATE_48KHZ]; rc = of_property_read_u32_array(pdev->dev.of_node, "qcom,msm-cpudai-auxpcm-pcm-clk-rate", @@ -2936,7 +2406,6 @@ static int msm_auxpcm_dev_probe(struct platform_device *pdev) } auxpcm_pdata->mode_8k.pcm_clk_rate = (int)val_array[RATE_8KHZ]; auxpcm_pdata->mode_16k.pcm_clk_rate = (int)val_array[RATE_16KHZ]; - auxpcm_pdata->mode_48k.pcm_clk_rate = (int)val_array[RATE_48KHZ]; rc = of_property_read_string(pdev->dev.of_node, "qcom,msm-auxpcm-interface", &intf_name); @@ -2975,12 +2444,6 @@ static int msm_auxpcm_dev_probe(struct platform_device *pdev) dev_set_drvdata(&pdev->dev, dai_data); pdev->dev.platform_data = (void *) auxpcm_pdata; -//2014-11-24 add by scott.hu -#ifdef CONFIG_QUECTEL_AUDIO_DRIVER - quectel_create_auxpcm_interface(&(pdev->dev)); -#endif -//end scott.hu - rc = snd_soc_register_component(&pdev->dev, &msm_dai_q6_aux_pcm_dai_component, &msm_dai_q6_aux_pcm_dai[i], 1); @@ -2996,7 +2459,6 @@ static int msm_auxpcm_dev_probe(struct platform_device *pdev) fail_invalid_intf: fail_nodev_intf: fail_invalid_dt1: - kfree(auxpcm_pdata->mode_48k.slot_mapping); kfree(auxpcm_pdata->mode_16k.slot_mapping); fail_invalid_16k_slot_mapping: kfree(auxpcm_pdata->mode_8k.slot_mapping); diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c index f3af4d298..ed7d4edaa 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c @@ -45,8 +45,6 @@ #include "q6voice.h" #include "sound/q6lsm.h" -#define QUECTEL_UAC_FEATURE - static int get_cal_path(int path_type); static struct mutex routing_lock; @@ -1805,28 +1803,6 @@ static int msm_routing_get_voice_mixer(struct snd_kcontrol *kcontrol, return 0; } -#ifdef QUECTEL_UAC_FEATURE -static void disable_mixer(struct snd_soc_dapm_context *dapm, char* name) { - struct snd_ctl_elem_id id = {0}; - struct snd_kcontrol* kctl; - struct snd_card *card = dapm->card->snd_card; - - id.iface = SNDRV_CTL_ELEM_IFACE_MIXER; - strncpy(id.name,name, sizeof(id.name)); - - kctl = snd_ctl_find_id(card, &id); - - if (kctl) { - struct soc_mixer_control *mc = - (struct soc_mixer_control *)kctl->private_value; - - if (test_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions)) { - msm_pcm_routing_process_voice(mc->reg, mc->shift, 0); - snd_soc_dapm_mixer_update_power(dapm, kctl, 0, NULL); - } - } -} -#endif static int msm_routing_put_voice_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { @@ -1836,22 +1812,7 @@ static int msm_routing_put_voice_mixer(struct snd_kcontrol *kcontrol, struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; struct snd_soc_dapm_update *update = NULL; -#ifdef QUECTEL_UAC_FEATURE - if (ucontrol->value.integer.value[0] - && (mc->shift == MSM_FRONTEND_DAI_CS_VOICE || mc->shift == MSM_FRONTEND_DAI_VOLTE)) { - if (mc->reg == MSM_BACKEND_DAI_SEC_AUXPCM_RX || mc->reg == MSM_BACKEND_DAI_SEC_AUXPCM_TX) { - disable_mixer(widget->dapm, "AFE_PCM_RX_Voice Mixer CSVoice"); - disable_mixer(widget->dapm, "Voice_Tx Mixer AFE_PCM_TX_Voice"); - disable_mixer(widget->dapm, "AFE_PCM_RX_Voice Mixer VoLTE"); - disable_mixer(widget->dapm, "VoLTE_Tx Mixer AFE_PCM_TX_VoLTE"); - } else if (mc->reg == MSM_BACKEND_DAI_AFE_PCM_RX || mc->reg == MSM_BACKEND_DAI_AFE_PCM_TX) { - disable_mixer(widget->dapm, "SEC_AUX_PCM_RX_Voice Mixer CSVoice"); - disable_mixer(widget->dapm, "Voice_Tx Mixer SEC_AUX_PCM_TX_Voice"); - disable_mixer(widget->dapm, "SEC_AUX_PCM_RX_Voice Mixer VoLTE"); - disable_mixer(widget->dapm, "VoLTE_Tx Mixer SEC_AUX_PCM_TX_VoLTE"); - } - } -#endif + if (ucontrol->value.integer.value[0]) { msm_pcm_routing_process_voice(mc->reg, mc->shift, 1); snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1, update); @@ -4071,15 +4032,6 @@ static const struct snd_kcontrol_new secondary_mi2s_rx_mixer_controls[] = { msm_routing_put_audio_mixer), }; -static const struct snd_kcontrol_new mi2s_hl_mixer_controls[] = { - SOC_SINGLE_EXT("PRI_MI2S_TX", MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), - SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_SECONDARY_MI2S_RX, - MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer, - msm_routing_put_port_mixer), -}; - static const struct snd_kcontrol_new primary_mi2s_rx_mixer_controls[] = { SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_PRI_MI2S_RX , MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, @@ -10912,8 +10864,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = { &hfp_aux_switch_mixer_controls), SND_SOC_DAPM_SWITCH("HFP_INT_UL_HL", SND_SOC_NOPM, 0, 0, &hfp_int_switch_mixer_controls), - SND_SOC_DAPM_MUX("SLIM_0_RX AANC MUX", SND_SOC_NOPM, 0, 0, - aanc_slim_0_rx_mux), + /* Mixer definitions */ SND_SOC_DAPM_MIXER("PRI_RX Audio Mixer", SND_SOC_NOPM, 0, 0, pri_i2s_rx_mixer_controls, ARRAY_SIZE(pri_i2s_rx_mixer_controls)), @@ -10941,9 +10892,6 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = { SND_SOC_DAPM_MIXER("SEC_MI2S_RX_SD1 Audio Mixer", SND_SOC_NOPM, 0, 0, secondary_mi2s_rx2_mixer_controls, ARRAY_SIZE(secondary_mi2s_rx2_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0, - mi2s_hl_mixer_controls, - ARRAY_SIZE(mi2s_hl_mixer_controls)), SND_SOC_DAPM_MIXER("PRI_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, primary_mi2s_rx_mixer_controls, ARRAY_SIZE(primary_mi2s_rx_mixer_controls)), @@ -11595,9 +11543,6 @@ static const struct snd_soc_dapm_route intercon[] = { {"SEC_MI2S_RX_SD1 Audio Mixer", "MultiMedia6", "MM_DL6"}, {"SEC_MI2S_RX_SD1", NULL, "SEC_MI2S_RX_SD1 Audio Mixer"}, - {"SEC_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, - {"SEC_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"}, - {"PRI_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"}, {"PRI_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"}, {"PRI_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"}, @@ -13344,8 +13289,6 @@ static const struct snd_soc_dapm_route intercon[] = { {"SLIMBUS_1_RX Mixer", "Voice2 Stub", "VOICE2_STUB_DL"}, {"SLIMBUS_1_RX Mixer", "VoLTE Stub", "VOLTE_STUB_DL"}, {"SLIMBUS_1_RX", NULL, "SLIMBUS_1_RX Mixer"}, - {"INTERNAL_BT_SCO_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"}, - {"INTERNAL_BT_SCO_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"}, {"AFE_PCM_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"}, {"AFE_PCM_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"}, {"AFE_PCM_RX_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"}, @@ -14024,7 +13967,6 @@ static int msm_routing_probe(struct snd_soc_platform *platform) snd_soc_add_platform_controls(platform, aptx_dec_license_controls, ARRAY_SIZE(aptx_dec_license_controls)); - return 0; } diff --git a/sound/soc/msm/qdsp6v2/q6afe.c b/sound/soc/msm/qdsp6v2/q6afe.c index 7d182e5b2..bde15a3b8 100644 --- a/sound/soc/msm/qdsp6v2/q6afe.c +++ b/sound/soc/msm/qdsp6v2/q6afe.c @@ -145,8 +145,6 @@ static int afe_get_cal_hw_delay(int32_t path, struct audio_cal_hw_delay_entry *entry); static int remap_cal_data(struct cal_block_data *cal_block, int cal_index); -void mdm_soc_reset_ref(void); - int afe_get_topology(int port_id) { int topology; @@ -280,7 +278,7 @@ static int32_t afe_callback(struct apr_client_data *data, void *priv) pr_debug("%s: reset event = %d %d apr[%pK]\n", __func__, data->reset_event, data->reset_proc, this_afe.apr); - mdm_soc_reset_ref(); + cal_utils_clear_cal_block_q6maps(MAX_AFE_CAL_TYPES, this_afe.cal_data); diff --git a/sound/soc/msm/qdsp6v2/q6asm.c b/sound/soc/msm/qdsp6v2/q6asm.c index 30bf46420..bbee2ab56 100644 --- a/sound/soc/msm/qdsp6v2/q6asm.c +++ b/sound/soc/msm/qdsp6v2/q6asm.c @@ -1894,7 +1894,7 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv) data->payload_size); } } else { - pr_err("%s: !! payload size of %x is less than expected.\n", + pr_debug("%s: payload size of %x is less than expected.\n", __func__, data->payload_size); } break; @@ -8370,7 +8370,7 @@ int q6asm_send_cal(struct audio_client *ac) mutex_lock(&cal_data[ASM_AUDSTRM_CAL]->lock); cal_block = cal_utils_get_only_cal_block(cal_data[ASM_AUDSTRM_CAL]); if (cal_block == NULL) { - pr_debug("%s: cal_block is NULL\n", + pr_err("%s: cal_block is NULL\n", __func__); goto unlock; }