Loading arch/arm/boot/dts/qcom/apq8096-v3-pmi8996-mdm9x55-i2s-mtp.dts +150 −0 Original line number Diff line number Diff line Loading @@ -111,3 +111,153 @@ status = "okay"; }; }; &soc { sound { status = "disabled"; }; sound-9335 { status = "disabled"; }; slim_msm: slim@91c0000 { status = "disabled"; }; clock_audio: audio_ext_clk { compatible = "qcom,audio-ref-clk"; qcom,codec-mclk-clk-freq = <12288000>; pinctrl-names = "sleep", "active"; pinctrl-0 = <&spkr_i2s_clk_sleep &ap_mclk_sleep &mdm_mclk_sleep>; pinctrl-1 = <&spkr_i2s_clk_active &ap_mclk_active &mdm_mclk_sleep>; }; i2c_7: i2c@75b5000 { wcd9xxx_codec@d { compatible = "qcom,tasha-i2c-pgd"; reg = <0x0d>; interrupt-parent = <&wcd9xxx_intc>; interrupts = <0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30>; qcom,cdc-reset-gpio = <&tlmm 64 0>; clock-names = "wcd_clk"; clocks = <&clock_audio clk_audio_lpass_mclk2>; cdc-vdd-buck-supply = <&pm8994_s4>; qcom,cdc-vdd-buck-voltage = <1800000 1800000>; qcom,cdc-vdd-buck-current = <650000>; cdc-buck-sido-supply = <&pm8994_s4>; qcom,cdc-buck-sido-voltage = <1800000 1800000>; qcom,cdc-buck-sido-current = <250000>; cdc-vdd-tx-h-supply = <&pm8994_s4>; qcom,cdc-vdd-tx-h-voltage = <1800000 1800000>; qcom,cdc-vdd-tx-h-current = <25000>; cdc-vdd-rx-h-supply = <&pm8994_s4>; qcom,cdc-vdd-rx-h-voltage = <1800000 1800000>; qcom,cdc-vdd-rx-h-current = <25000>; cdc-vddpx-1-supply = <&pm8994_s4>; qcom,cdc-vddpx-1-voltage = <1800000 1800000>; qcom,cdc-vddpx-1-current = <10000>; qcom,cdc-static-supplies = "cdc-vdd-buck", "cdc-buck-sido", "cdc-vdd-tx-h", "cdc-vdd-rx-h", "cdc-vddpx-1"; qcom,cdc-micbias1-mv = <1800>; qcom,cdc-micbias2-mv = <1800>; qcom,cdc-micbias3-mv = <1800>; qcom,cdc-micbias4-mv = <1800>; qcom,cdc-mclk-clk-rate = <12288000>; qcom,cdc-dmic-sample-rate = <4800000>; }; }; sound-9335-i2c { compatible = "qcom,apq8096-asoc-snd-tasha-i2c"; qcom,model = "apq8096-tasha-i2c-snd-card"; qcom,audio-routing = "AIF4 VI", "MCLK", "RX_BIAS", "MCLK", "MADINPUT", "MCLK", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Headset Mic", "AMIC3", "MIC BIAS2", "MIC BIAS2", "ANCRight Headset Mic", "AMIC4", "MIC BIAS2", "MIC BIAS2", "ANCLeft Headset Mic", "AMIC5", "MIC BIAS3", "MIC BIAS3", "Handset Mic", "AMIC6", "MIC BIAS4", "MIC BIAS4", "Analog Mic6", "DMIC0", "MIC BIAS1", "MIC BIAS1", "Digital Mic0", "DMIC1", "MIC BIAS1", "MIC BIAS1", "Digital Mic1", "DMIC2", "MIC BIAS3", "MIC BIAS3", "Digital Mic2", "DMIC3", "MIC BIAS3", "MIC BIAS3", "Digital Mic3", "DMIC4", "MIC BIAS4", "MIC BIAS4", "Digital Mic4", "DMIC5", "MIC BIAS4", "MIC BIAS4", "Digital Mic5", "SpkrLeft IN", "SPK1 OUT", "SpkrRight IN", "SPK2 OUT"; qcom,msm-mbhc-hphl-swh = <0>; qcom,msm-mbhc-gnd-swh = <0>; asoc-platform = <&pcm0>, <&pcm1>, <&pcm2>, <&voip>, <&voice>, <&loopback>, <&compress>, <&hostless>, <&afe>, <&lsm>, <&routing>, <&cpe>, <&compr>; asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", "msm-pcm-dsp.2", "msm-voip-dsp", "msm-pcm-voice", "msm-pcm-loopback", "msm-compress-dsp", "msm-pcm-hostless", "msm-pcm-afe", "msm-lsm-client", "msm-pcm-routing", "msm-cpe-lsm", "msm-compr-dsp"; asoc-cpu = <&dai_pri_auxpcm>, <&dai_sec_auxpcm>, <&dai_hdmi>, <&dai_mi2s>, <&dai_mi2s_quat>, <&afe_pcm_rx>, <&afe_pcm_tx>, <&afe_proxy_rx>, <&afe_proxy_tx>, <&incall_record_rx>, <&incall_record_tx>, <&incall_music_rx>, <&incall_music2_rx>; asoc-cpu-names = "msm-dai-q6-auxpcm.1", "msm-dai-q6-auxpcm.2", "msm-dai-q6-hdmi.8", "msm-dai-q6-mi2s.2", "msm-dai-q6-mi2s.3", "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.32770"; qcom,tasha-mclk-clk-freq = <12288000>; asoc-codec = <&stub_codec>; asoc-codec-names = "msm-stub-codec.1"; }; qcom,msm-dai-mi2s { dai_mi2s_quat: qcom,msm-dai-q6-mi2s-quat { compatible = "qcom,msm-dai-q6-mi2s"; qcom,msm-dai-q6-mi2s-dev-id = <3>; qcom,msm-mi2s-rx-lines = <2>; qcom,msm-mi2s-tx-lines = <1>; pinctrl-names = "default", "sleep"; pinctrl-0 = <&quat_mi2s_active &quat_mi2s_sd0_active>; pinctrl-1 = <&quat_mi2s_sleep &quat_mi2s_sd0_sleep>; }; }; }; arch/arm/boot/dts/qcom/msm8996-pinctrl.dtsi +66 −8 Original line number Diff line number Diff line Loading @@ -1533,24 +1533,24 @@ tert_mi2s { tert_mi2s_sleep: tert_mi2s_sleep { mux { pins = "gpio75", "gpio76"; pins = "gpio75", "gpio76", "gpio78"; function = "ter_mi2s"; }; config { pins = "gpio75", "gpio76"; pins = "gpio75", "gpio76", "gpio78"; drive-strength = <2>; /* 2 mA */ bias-pull-down; /* PULL DOWN */ }; }; tert_mi2s_active: tert_mi2s_active { mux { pins = "gpio75", "gpio76"; pins = "gpio75", "gpio76", "gpio78"; function = "ter_mi2s"; }; config { pins = "gpio75", "gpio76"; pins = "gpio75", "gpio76", "gpio78"; drive-strength = <8>; /* 8 mA */ bias-disable; /* NO PULL */ output-high; Loading Loading @@ -1588,24 +1588,24 @@ quat_mi2s { quat_mi2s_sleep: quat_mi2s_sleep { mux { pins = "gpio58", "gpio59"; pins = "gpio58", "gpio59", "gpio61"; function = "qua_mi2s"; }; config { pins = "gpio58", "gpio59"; pins = "gpio58", "gpio59", "gpio61"; drive-strength = <2>; /* 2 mA */ bias-pull-down; /* PULL DOWN */ }; }; quat_mi2s_active: quat_mi2s_active { mux { pins = "gpio58", "gpio59"; pins = "gpio58", "gpio59", "gpio61"; function = "qua_mi2s"; }; config { pins = "gpio58", "gpio59"; pins = "gpio58", "gpio59", "gpio61"; drive-strength = <8>; /* 8 mA */ bias-disable; /* NO PULL */ output-high; Loading Loading @@ -1804,6 +1804,64 @@ }; }; ap_mclk_en { ap_mclk_active: ap_mclk_active { mux { pins = "gpio133"; function = "gpio"; }; config { pins = "gpio133"; drive-strength = <2>; bias-disable; output-high; }; }; ap_mclk_sleep: ap_mclk_sleep { mux { pins = "gpio133"; function = "gpio"; }; config { pins = "gpio133"; drive-strength = <2>; bias-pull-down; output-low; }; }; }; mdm_mclk_en { mdm_mclk_active: mdm_mclk_active { mux { pins = "gpio134"; function = "gpio"; }; config { pins = "gpio134"; drive-strength = <2>; bias-disable; output-high; }; }; mdm_mclk_sleep: mdm_mclk_sleep { mux { pins = "gpio134"; function = "gpio"; }; config { pins = "gpio134"; drive-strength = <2>; bias-pull-down; output-low; }; }; }; cci0_active: cci0_active { mux { /* CLK, DATA */ Loading include/dt-bindings/clock/msm-clocks-8996.h +2 −1 Original line number Diff line number Diff line /* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. /* Copyright (c) 2014-2016, 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 Loading Loading @@ -542,4 +542,5 @@ #define clk_audio_ap_clk 0x312ac429 #define clk_audio_pmi_clk 0xb7ba2274 #define clk_audio_ap_clk2 0xf0fbaf5b #define clk_audio_lpass_mclk2 0x0122abee #endif sound/soc/codecs/audio-ext-clk.c +86 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ enum clk_mux { AP_CLK2, LPASS_MCLK, LPASS_MCLK2, }; struct pinctrl_info { Loading Loading @@ -77,6 +78,15 @@ static const struct afe_clk_cfg lpass_default = { 0, }; static struct afe_clk_set lpass_default2 = { Q6AFE_LPASS_CLK_CONFIG_API_VERSION, Q6AFE_LPASS_CLK_ID_SPEAKER_I2S_OSR, Q6AFE_LPASS_IBIT_CLK_12_P288_MHZ, Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, Q6AFE_LPASS_CLK_ROOT_DEFAULT, 0, }; static inline struct audio_ext_ap_clk *to_audio_ap_clk(struct clk *clk) { return container_of(clk, struct audio_ext_ap_clk, c); Loading Loading @@ -224,6 +234,54 @@ err: kfree(lpass_clk); } static int audio_ext_lpass_mclk2_prepare(struct clk *clk) { struct audio_ext_lpass_mclk *audio_lpass_mclk2; struct pinctrl_info *pnctrl_info; int ret; audio_lpass_mclk2 = container_of(clk, struct audio_ext_lpass_mclk, c); pnctrl_info = &audio_lpass_mclk2->pnctrl_info; ret = pinctrl_select_state(pnctrl_info->pinctrl, pnctrl_info->active); if (ret) { pr_err("%s: active state select failed with %d\n", __func__, ret); return -EIO; } lpass_default2.enable = 1; ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &lpass_default2); if (ret < 0) { pr_err("%s: failed to set clock, ret = %d\n", __func__, ret); return -EINVAL; } return 0; } static void audio_ext_lpass_mclk2_unprepare(struct clk *clk) { struct audio_ext_lpass_mclk *audio_lpass_mclk2; struct pinctrl_info *pnctrl_info; int ret; audio_lpass_mclk2 = container_of(clk, struct audio_ext_lpass_mclk, c); pnctrl_info = &audio_lpass_mclk2->pnctrl_info; ret = pinctrl_select_state(pnctrl_info->pinctrl, pnctrl_info->sleep); if (ret) pr_err("%s: sleep state select failed with %d\n", __func__, ret); lpass_default2.enable = 0; ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &lpass_default2); if (ret < 0) pr_err("%s: failed to reset clock, ret = %d\n", __func__, ret); } static struct clk_ops audio_ext_ap_clk_ops = { .prepare = audio_ext_clk_prepare, .unprepare = audio_ext_clk_unprepare, Loading @@ -239,6 +297,11 @@ static struct clk_ops audio_ext_lpass_mclk_ops = { .unprepare = audio_ext_lpass_mclk_unprepare, }; static struct clk_ops audio_ext_lpass_mclk2_ops = { .prepare = audio_ext_lpass_mclk2_prepare, .unprepare = audio_ext_lpass_mclk2_unprepare, }; static struct audio_ext_pmi_clk audio_pmi_clk = { .gpio = -EINVAL, .c = { Loading Loading @@ -273,11 +336,20 @@ static struct audio_ext_lpass_mclk audio_lpass_mclk = { }, }; static struct audio_ext_lpass_mclk audio_lpass_mclk2 = { .c = { .dbg_name = "audio_ext_lpass_mclk2", .ops = &audio_ext_lpass_mclk2_ops, CLK_INIT(audio_lpass_mclk2.c), }, }; static struct clk_lookup audio_ref_clock[] = { CLK_LIST(audio_ap_clk), CLK_LIST(audio_pmi_clk), CLK_LIST(audio_ap_clk2), CLK_LIST(audio_lpass_mclk), CLK_LIST(audio_lpass_mclk2), }; static int audio_get_pinctrl(struct platform_device *pdev, enum clk_mux mux) Loading @@ -293,6 +365,9 @@ static int audio_get_pinctrl(struct platform_device *pdev, enum clk_mux mux) case LPASS_MCLK: pnctrl_info = &audio_lpass_mclk.pnctrl_info; break; case LPASS_MCLK2: pnctrl_info = &audio_lpass_mclk2.pnctrl_info; break; default: dev_err(&pdev->dev, "%s Not a valid MUX ID: %d\n", __func__, mux); Loading Loading @@ -368,6 +443,11 @@ static int audio_ref_clk_probe(struct platform_device *pdev) dev_err(&pdev->dev, "%s: Parsing pinctrl %s failed\n", __func__, "LPASS_MCLK"); ret = audio_get_pinctrl(pdev, LPASS_MCLK2); if (ret) dev_dbg(&pdev->dev, "%s: Parsing pinctrl %s failed\n", __func__, "LPASS_MCLK2"); ret = of_msm_clock_register(pdev->dev.of_node, audio_ref_clock, ARRAY_SIZE(audio_ref_clock)); if (ret) Loading Loading @@ -458,6 +538,12 @@ static int audio_ref_clk_remove(struct platform_device *pdev) pnctrl_info->pinctrl = NULL; } pnctrl_info = &audio_lpass_mclk2.pnctrl_info; if (pnctrl_info->pinctrl) { devm_pinctrl_put(pnctrl_info->pinctrl); pnctrl_info->pinctrl = NULL; } return 0; } Loading Loading
arch/arm/boot/dts/qcom/apq8096-v3-pmi8996-mdm9x55-i2s-mtp.dts +150 −0 Original line number Diff line number Diff line Loading @@ -111,3 +111,153 @@ status = "okay"; }; }; &soc { sound { status = "disabled"; }; sound-9335 { status = "disabled"; }; slim_msm: slim@91c0000 { status = "disabled"; }; clock_audio: audio_ext_clk { compatible = "qcom,audio-ref-clk"; qcom,codec-mclk-clk-freq = <12288000>; pinctrl-names = "sleep", "active"; pinctrl-0 = <&spkr_i2s_clk_sleep &ap_mclk_sleep &mdm_mclk_sleep>; pinctrl-1 = <&spkr_i2s_clk_active &ap_mclk_active &mdm_mclk_sleep>; }; i2c_7: i2c@75b5000 { wcd9xxx_codec@d { compatible = "qcom,tasha-i2c-pgd"; reg = <0x0d>; interrupt-parent = <&wcd9xxx_intc>; interrupts = <0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30>; qcom,cdc-reset-gpio = <&tlmm 64 0>; clock-names = "wcd_clk"; clocks = <&clock_audio clk_audio_lpass_mclk2>; cdc-vdd-buck-supply = <&pm8994_s4>; qcom,cdc-vdd-buck-voltage = <1800000 1800000>; qcom,cdc-vdd-buck-current = <650000>; cdc-buck-sido-supply = <&pm8994_s4>; qcom,cdc-buck-sido-voltage = <1800000 1800000>; qcom,cdc-buck-sido-current = <250000>; cdc-vdd-tx-h-supply = <&pm8994_s4>; qcom,cdc-vdd-tx-h-voltage = <1800000 1800000>; qcom,cdc-vdd-tx-h-current = <25000>; cdc-vdd-rx-h-supply = <&pm8994_s4>; qcom,cdc-vdd-rx-h-voltage = <1800000 1800000>; qcom,cdc-vdd-rx-h-current = <25000>; cdc-vddpx-1-supply = <&pm8994_s4>; qcom,cdc-vddpx-1-voltage = <1800000 1800000>; qcom,cdc-vddpx-1-current = <10000>; qcom,cdc-static-supplies = "cdc-vdd-buck", "cdc-buck-sido", "cdc-vdd-tx-h", "cdc-vdd-rx-h", "cdc-vddpx-1"; qcom,cdc-micbias1-mv = <1800>; qcom,cdc-micbias2-mv = <1800>; qcom,cdc-micbias3-mv = <1800>; qcom,cdc-micbias4-mv = <1800>; qcom,cdc-mclk-clk-rate = <12288000>; qcom,cdc-dmic-sample-rate = <4800000>; }; }; sound-9335-i2c { compatible = "qcom,apq8096-asoc-snd-tasha-i2c"; qcom,model = "apq8096-tasha-i2c-snd-card"; qcom,audio-routing = "AIF4 VI", "MCLK", "RX_BIAS", "MCLK", "MADINPUT", "MCLK", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Headset Mic", "AMIC3", "MIC BIAS2", "MIC BIAS2", "ANCRight Headset Mic", "AMIC4", "MIC BIAS2", "MIC BIAS2", "ANCLeft Headset Mic", "AMIC5", "MIC BIAS3", "MIC BIAS3", "Handset Mic", "AMIC6", "MIC BIAS4", "MIC BIAS4", "Analog Mic6", "DMIC0", "MIC BIAS1", "MIC BIAS1", "Digital Mic0", "DMIC1", "MIC BIAS1", "MIC BIAS1", "Digital Mic1", "DMIC2", "MIC BIAS3", "MIC BIAS3", "Digital Mic2", "DMIC3", "MIC BIAS3", "MIC BIAS3", "Digital Mic3", "DMIC4", "MIC BIAS4", "MIC BIAS4", "Digital Mic4", "DMIC5", "MIC BIAS4", "MIC BIAS4", "Digital Mic5", "SpkrLeft IN", "SPK1 OUT", "SpkrRight IN", "SPK2 OUT"; qcom,msm-mbhc-hphl-swh = <0>; qcom,msm-mbhc-gnd-swh = <0>; asoc-platform = <&pcm0>, <&pcm1>, <&pcm2>, <&voip>, <&voice>, <&loopback>, <&compress>, <&hostless>, <&afe>, <&lsm>, <&routing>, <&cpe>, <&compr>; asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", "msm-pcm-dsp.2", "msm-voip-dsp", "msm-pcm-voice", "msm-pcm-loopback", "msm-compress-dsp", "msm-pcm-hostless", "msm-pcm-afe", "msm-lsm-client", "msm-pcm-routing", "msm-cpe-lsm", "msm-compr-dsp"; asoc-cpu = <&dai_pri_auxpcm>, <&dai_sec_auxpcm>, <&dai_hdmi>, <&dai_mi2s>, <&dai_mi2s_quat>, <&afe_pcm_rx>, <&afe_pcm_tx>, <&afe_proxy_rx>, <&afe_proxy_tx>, <&incall_record_rx>, <&incall_record_tx>, <&incall_music_rx>, <&incall_music2_rx>; asoc-cpu-names = "msm-dai-q6-auxpcm.1", "msm-dai-q6-auxpcm.2", "msm-dai-q6-hdmi.8", "msm-dai-q6-mi2s.2", "msm-dai-q6-mi2s.3", "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.32770"; qcom,tasha-mclk-clk-freq = <12288000>; asoc-codec = <&stub_codec>; asoc-codec-names = "msm-stub-codec.1"; }; qcom,msm-dai-mi2s { dai_mi2s_quat: qcom,msm-dai-q6-mi2s-quat { compatible = "qcom,msm-dai-q6-mi2s"; qcom,msm-dai-q6-mi2s-dev-id = <3>; qcom,msm-mi2s-rx-lines = <2>; qcom,msm-mi2s-tx-lines = <1>; pinctrl-names = "default", "sleep"; pinctrl-0 = <&quat_mi2s_active &quat_mi2s_sd0_active>; pinctrl-1 = <&quat_mi2s_sleep &quat_mi2s_sd0_sleep>; }; }; };
arch/arm/boot/dts/qcom/msm8996-pinctrl.dtsi +66 −8 Original line number Diff line number Diff line Loading @@ -1533,24 +1533,24 @@ tert_mi2s { tert_mi2s_sleep: tert_mi2s_sleep { mux { pins = "gpio75", "gpio76"; pins = "gpio75", "gpio76", "gpio78"; function = "ter_mi2s"; }; config { pins = "gpio75", "gpio76"; pins = "gpio75", "gpio76", "gpio78"; drive-strength = <2>; /* 2 mA */ bias-pull-down; /* PULL DOWN */ }; }; tert_mi2s_active: tert_mi2s_active { mux { pins = "gpio75", "gpio76"; pins = "gpio75", "gpio76", "gpio78"; function = "ter_mi2s"; }; config { pins = "gpio75", "gpio76"; pins = "gpio75", "gpio76", "gpio78"; drive-strength = <8>; /* 8 mA */ bias-disable; /* NO PULL */ output-high; Loading Loading @@ -1588,24 +1588,24 @@ quat_mi2s { quat_mi2s_sleep: quat_mi2s_sleep { mux { pins = "gpio58", "gpio59"; pins = "gpio58", "gpio59", "gpio61"; function = "qua_mi2s"; }; config { pins = "gpio58", "gpio59"; pins = "gpio58", "gpio59", "gpio61"; drive-strength = <2>; /* 2 mA */ bias-pull-down; /* PULL DOWN */ }; }; quat_mi2s_active: quat_mi2s_active { mux { pins = "gpio58", "gpio59"; pins = "gpio58", "gpio59", "gpio61"; function = "qua_mi2s"; }; config { pins = "gpio58", "gpio59"; pins = "gpio58", "gpio59", "gpio61"; drive-strength = <8>; /* 8 mA */ bias-disable; /* NO PULL */ output-high; Loading Loading @@ -1804,6 +1804,64 @@ }; }; ap_mclk_en { ap_mclk_active: ap_mclk_active { mux { pins = "gpio133"; function = "gpio"; }; config { pins = "gpio133"; drive-strength = <2>; bias-disable; output-high; }; }; ap_mclk_sleep: ap_mclk_sleep { mux { pins = "gpio133"; function = "gpio"; }; config { pins = "gpio133"; drive-strength = <2>; bias-pull-down; output-low; }; }; }; mdm_mclk_en { mdm_mclk_active: mdm_mclk_active { mux { pins = "gpio134"; function = "gpio"; }; config { pins = "gpio134"; drive-strength = <2>; bias-disable; output-high; }; }; mdm_mclk_sleep: mdm_mclk_sleep { mux { pins = "gpio134"; function = "gpio"; }; config { pins = "gpio134"; drive-strength = <2>; bias-pull-down; output-low; }; }; }; cci0_active: cci0_active { mux { /* CLK, DATA */ Loading
include/dt-bindings/clock/msm-clocks-8996.h +2 −1 Original line number Diff line number Diff line /* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. /* Copyright (c) 2014-2016, 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 Loading Loading @@ -542,4 +542,5 @@ #define clk_audio_ap_clk 0x312ac429 #define clk_audio_pmi_clk 0xb7ba2274 #define clk_audio_ap_clk2 0xf0fbaf5b #define clk_audio_lpass_mclk2 0x0122abee #endif
sound/soc/codecs/audio-ext-clk.c +86 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ enum clk_mux { AP_CLK2, LPASS_MCLK, LPASS_MCLK2, }; struct pinctrl_info { Loading Loading @@ -77,6 +78,15 @@ static const struct afe_clk_cfg lpass_default = { 0, }; static struct afe_clk_set lpass_default2 = { Q6AFE_LPASS_CLK_CONFIG_API_VERSION, Q6AFE_LPASS_CLK_ID_SPEAKER_I2S_OSR, Q6AFE_LPASS_IBIT_CLK_12_P288_MHZ, Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO, Q6AFE_LPASS_CLK_ROOT_DEFAULT, 0, }; static inline struct audio_ext_ap_clk *to_audio_ap_clk(struct clk *clk) { return container_of(clk, struct audio_ext_ap_clk, c); Loading Loading @@ -224,6 +234,54 @@ err: kfree(lpass_clk); } static int audio_ext_lpass_mclk2_prepare(struct clk *clk) { struct audio_ext_lpass_mclk *audio_lpass_mclk2; struct pinctrl_info *pnctrl_info; int ret; audio_lpass_mclk2 = container_of(clk, struct audio_ext_lpass_mclk, c); pnctrl_info = &audio_lpass_mclk2->pnctrl_info; ret = pinctrl_select_state(pnctrl_info->pinctrl, pnctrl_info->active); if (ret) { pr_err("%s: active state select failed with %d\n", __func__, ret); return -EIO; } lpass_default2.enable = 1; ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &lpass_default2); if (ret < 0) { pr_err("%s: failed to set clock, ret = %d\n", __func__, ret); return -EINVAL; } return 0; } static void audio_ext_lpass_mclk2_unprepare(struct clk *clk) { struct audio_ext_lpass_mclk *audio_lpass_mclk2; struct pinctrl_info *pnctrl_info; int ret; audio_lpass_mclk2 = container_of(clk, struct audio_ext_lpass_mclk, c); pnctrl_info = &audio_lpass_mclk2->pnctrl_info; ret = pinctrl_select_state(pnctrl_info->pinctrl, pnctrl_info->sleep); if (ret) pr_err("%s: sleep state select failed with %d\n", __func__, ret); lpass_default2.enable = 0; ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &lpass_default2); if (ret < 0) pr_err("%s: failed to reset clock, ret = %d\n", __func__, ret); } static struct clk_ops audio_ext_ap_clk_ops = { .prepare = audio_ext_clk_prepare, .unprepare = audio_ext_clk_unprepare, Loading @@ -239,6 +297,11 @@ static struct clk_ops audio_ext_lpass_mclk_ops = { .unprepare = audio_ext_lpass_mclk_unprepare, }; static struct clk_ops audio_ext_lpass_mclk2_ops = { .prepare = audio_ext_lpass_mclk2_prepare, .unprepare = audio_ext_lpass_mclk2_unprepare, }; static struct audio_ext_pmi_clk audio_pmi_clk = { .gpio = -EINVAL, .c = { Loading Loading @@ -273,11 +336,20 @@ static struct audio_ext_lpass_mclk audio_lpass_mclk = { }, }; static struct audio_ext_lpass_mclk audio_lpass_mclk2 = { .c = { .dbg_name = "audio_ext_lpass_mclk2", .ops = &audio_ext_lpass_mclk2_ops, CLK_INIT(audio_lpass_mclk2.c), }, }; static struct clk_lookup audio_ref_clock[] = { CLK_LIST(audio_ap_clk), CLK_LIST(audio_pmi_clk), CLK_LIST(audio_ap_clk2), CLK_LIST(audio_lpass_mclk), CLK_LIST(audio_lpass_mclk2), }; static int audio_get_pinctrl(struct platform_device *pdev, enum clk_mux mux) Loading @@ -293,6 +365,9 @@ static int audio_get_pinctrl(struct platform_device *pdev, enum clk_mux mux) case LPASS_MCLK: pnctrl_info = &audio_lpass_mclk.pnctrl_info; break; case LPASS_MCLK2: pnctrl_info = &audio_lpass_mclk2.pnctrl_info; break; default: dev_err(&pdev->dev, "%s Not a valid MUX ID: %d\n", __func__, mux); Loading Loading @@ -368,6 +443,11 @@ static int audio_ref_clk_probe(struct platform_device *pdev) dev_err(&pdev->dev, "%s: Parsing pinctrl %s failed\n", __func__, "LPASS_MCLK"); ret = audio_get_pinctrl(pdev, LPASS_MCLK2); if (ret) dev_dbg(&pdev->dev, "%s: Parsing pinctrl %s failed\n", __func__, "LPASS_MCLK2"); ret = of_msm_clock_register(pdev->dev.of_node, audio_ref_clock, ARRAY_SIZE(audio_ref_clock)); if (ret) Loading Loading @@ -458,6 +538,12 @@ static int audio_ref_clk_remove(struct platform_device *pdev) pnctrl_info->pinctrl = NULL; } pnctrl_info = &audio_lpass_mclk2.pnctrl_info; if (pnctrl_info->pinctrl) { devm_pinctrl_put(pnctrl_info->pinctrl); pnctrl_info->pinctrl = NULL; } return 0; } Loading