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

Commit 79f0f739 authored by Karthikeyan Mani's avatar Karthikeyan Mani
Browse files

ASoC: wcd: Add support for analog USBC on sdm845



Use USBC_EN2 pin to swap between mic and gnd
on sdm845 instead of using the tavil gpio US_EURO.
Get pinctrl of EN2 when swap is needed and put the
pinctrl when the audio jack is removed so that other
drivers which need EN2 can take hold of it.

CRs-fixed: 2024655
Change-Id: I7d1397eab840950e985605bc5d0f4b48196b5f51
Signed-off-by: default avatarKarthikeyan Mani <kmani@codeaurora.org>
parent a25de292
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -2256,8 +2256,8 @@ Optional properties:
- qcom,wcn-btfm : Property to specify if WCN BT/FM chip is used for the target
- qcom,msm-mbhc-usbc-audio-supported : Property to specify if analog audio feature is
				       enabled or not.
- qcom,usbc-analog-en1_gpio : EN1 GPIO to enable USB type-C analog audio
- qcom,usbc-analog-en2_n_gpio : EN2 GPIO to enable USB type-C analog audio
- qcom,usbc-analog-en1-gpio : EN1 GPIO to enable USB type-C analog audio
- qcom,usbc-analog-en2-gpio : EN2 GPIO to enable USB type-C analog audio
- qcom,usbc-analog-force_detect_gpio : Force detect GPIO to enable USB type-C analog audio

Example:
@@ -2333,8 +2333,8 @@ Example:
		qcom,wsa-aux-dev-prefix = "SpkrRight", "SpkrLeft",
					  "SpkrRight", "SpkrLeft";
		qcom,msm-mbhc-usbc-audio-supported = <1>;
		qcom,usbc-analog-en1_gpio = <&wcd_usbc_analog_en1_gpio>;
		qcom,usbc-analog-en2_n_gpio = <&wcd_usbc_analog_en2n_gpio>;
		qcom,usbc-analog-en1-gpio = <&wcd_usbc_analog_en1_gpio>;
		qcom,usbc-analog-en2-gpio = <&tlmm 51 0>;
		qcom,usbc-analog-force_detect_gpio = <&wcd_usbc_analog_f_gpio>;
	};

+2 −1
Original line number Diff line number Diff line
@@ -729,7 +729,8 @@ static void wcd_correct_swch_plug(struct work_struct *work)
				 * otherwise report unsupported plug
				 */
				if (mbhc->mbhc_cfg->swap_gnd_mic &&
					mbhc->mbhc_cfg->swap_gnd_mic(codec)) {
					mbhc->mbhc_cfg->swap_gnd_mic(codec,
					true)) {
					pr_debug("%s: US_EU gpio present,flip switch\n"
						, __func__);
					continue;
+2 −1
Original line number Diff line number Diff line
@@ -633,7 +633,8 @@ static void wcd_correct_swch_plug(struct work_struct *work)
				 * otherwise report unsupported plug
				 */
				if (mbhc->mbhc_cfg->swap_gnd_mic &&
					mbhc->mbhc_cfg->swap_gnd_mic(codec)) {
					mbhc->mbhc_cfg->swap_gnd_mic(codec,
					true)) {
					pr_debug("%s: US_EU gpio present,flip switch\n"
						, __func__);
					continue;
+3 −26
Original line number Diff line number Diff line
@@ -1460,18 +1460,12 @@ static int wcd_mbhc_usb_c_analog_setup_gpios(struct wcd_mbhc *mbhc,
		if (config->usbc_en1_gpio_p)
			rc = msm_cdc_pinctrl_select_active_state(
				config->usbc_en1_gpio_p);
		if (rc == 0 && config->usbc_en2n_gpio_p)
			rc = msm_cdc_pinctrl_select_active_state(
				config->usbc_en2n_gpio_p);
		if (rc == 0 && config->usbc_force_gpio_p)
			rc = msm_cdc_pinctrl_select_active_state(
				config->usbc_force_gpio_p);
		mbhc->usbc_mode = POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER;
	} else {
		/* no delay is required when disabling GPIOs */
		if (config->usbc_en2n_gpio_p)
			msm_cdc_pinctrl_select_sleep_state(
				config->usbc_en2n_gpio_p);
		if (config->usbc_en1_gpio_p)
			msm_cdc_pinctrl_select_sleep_state(
				config->usbc_en1_gpio_p);
@@ -1490,6 +1484,8 @@ static int wcd_mbhc_usb_c_analog_setup_gpios(struct wcd_mbhc *mbhc,
		}

		mbhc->usbc_mode = POWER_SUPPLY_TYPEC_NONE;
		if (mbhc->mbhc_cfg->swap_gnd_mic)
			mbhc->mbhc_cfg->swap_gnd_mic(mbhc->codec, false);
	}

	return rc;
@@ -1675,19 +1671,12 @@ int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg)
		dev_dbg(mbhc->codec->dev, "%s: usbc analog enabled\n",
				__func__);
		rc = wcd_mbhc_init_gpio(mbhc, mbhc_cfg,
				"qcom,usbc-analog-en1_gpio",
				"qcom,usbc-analog-en1-gpio",
				&config->usbc_en1_gpio,
				&config->usbc_en1_gpio_p);
		if (rc)
			goto err;

		rc = wcd_mbhc_init_gpio(mbhc, mbhc_cfg,
				"qcom,usbc-analog-en2_n_gpio",
				&config->usbc_en2n_gpio,
				&config->usbc_en2n_gpio_p);
		if (rc)
			goto err;

		if (of_find_property(card->dev->of_node,
				     "qcom,usbc-analog-force_detect_gpio",
				     NULL)) {
@@ -1734,12 +1723,6 @@ int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg)
		gpio_free(config->usbc_en1_gpio);
		config->usbc_en1_gpio = 0;
	}
	if (config->usbc_en2n_gpio > 0) {
		dev_dbg(card->dev, "%s free usb_en2 gpio %d\n",
			__func__, config->usbc_en2n_gpio);
		gpio_free(config->usbc_en2n_gpio);
		config->usbc_en2n_gpio = 0;
	}
	if (config->usbc_force_gpio > 0) {
		dev_dbg(card->dev, "%s free usb_force gpio %d\n",
			__func__, config->usbc_force_gpio);
@@ -1748,8 +1731,6 @@ int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg)
	}
	if (config->usbc_en1_gpio_p)
		of_node_put(config->usbc_en1_gpio_p);
	if (config->usbc_en2n_gpio_p)
		of_node_put(config->usbc_en2n_gpio_p);
	if (config->usbc_force_gpio_p)
		of_node_put(config->usbc_force_gpio_p);
	dev_dbg(mbhc->codec->dev, "%s: leave %d\n", __func__, rc);
@@ -1790,15 +1771,11 @@ void wcd_mbhc_stop(struct wcd_mbhc *mbhc)
		/* free GPIOs */
		if (config->usbc_en1_gpio > 0)
			gpio_free(config->usbc_en1_gpio);
		if (config->usbc_en2n_gpio > 0)
			gpio_free(config->usbc_en2n_gpio);
		if (config->usbc_force_gpio)
			gpio_free(config->usbc_force_gpio);

		if (config->usbc_en1_gpio_p)
			of_node_put(config->usbc_en1_gpio_p);
		if (config->usbc_en2n_gpio_p)
			of_node_put(config->usbc_en2n_gpio_p);
		if (config->usbc_force_gpio_p)
			of_node_put(config->usbc_force_gpio_p);
	}
+3 −3
Original line number Diff line number Diff line
@@ -404,10 +404,10 @@ enum mbhc_moisture_rref {

struct usbc_ana_audio_config {
	int usbc_en1_gpio;
	int usbc_en2n_gpio;
	int usbc_en2_gpio;
	int usbc_force_gpio;
	struct device_node *usbc_en1_gpio_p; /* used by pinctrl API */
	struct device_node *usbc_en2n_gpio_p; /* used by pinctrl API */
	struct device_node *usbc_en2_gpio_p; /* used by pinctrl API */
	struct device_node *usbc_force_gpio_p; /* used by pinctrl API */
};

@@ -416,7 +416,7 @@ struct wcd_mbhc_config {
	void *calibration;
	bool detect_extn_cable;
	bool mono_stero_detection;
	bool (*swap_gnd_mic)(struct snd_soc_codec *codec);
	bool (*swap_gnd_mic)(struct snd_soc_codec *codec, bool active);
	bool hs_ext_micbias;
	bool gnd_det_en;
	int key_code[WCD_MBHC_KEYCODE_NUM];
Loading