Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d6271e7 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "arm: dts: msm: Add audio DT changes for APQ8096 I2C mode"

parents 8cba9fa0 4a6aaae2
Loading
Loading
Loading
Loading
+150 −0
Original line number Diff line number Diff line
@@ -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>;
		};
	};
};
+66 −8
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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 */
+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
@@ -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
+86 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
enum clk_mux {
	AP_CLK2,
	LPASS_MCLK,
	LPASS_MCLK2,
};

struct pinctrl_info {
@@ -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);
@@ -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,
@@ -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 = {
@@ -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)
@@ -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);
@@ -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)
@@ -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;
}