From 6cb17a0a3fe4f4e47c5bbad08dc8f2d84f489f72 Mon Sep 17 00:00:00 2001 From: Vatsal Bucha Date: Tue, 7 Aug 2018 11:07:04 +0530 Subject: [PATCH] ASoC: sm6150: Use FSA for USBC gnd-mic swap USBC gnd mic swap is taken care of by FSA4480. Gpio does not need to be swapped for this purpose. CRs-Fixed: 2323772 Change-Id: Ida490995761ec5361ff2302b990d3c6fe1f32f85 Signed-off-by: Vatsal Bucha --- asoc/sm6150.c | 96 ++++++++++----------------------------------------- 1 file changed, 18 insertions(+), 78 deletions(-) diff --git a/asoc/sm6150.c b/asoc/sm6150.c index 184960582be6..0508f063c751 100644 --- a/asoc/sm6150.c +++ b/asoc/sm6150.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -202,6 +203,7 @@ struct msm_asoc_mach_data { struct device_node *hph_en1_gpio_p; /* used by pinctrl API */ struct device_node *hph_en0_gpio_p; /* used by pinctrl API */ bool is_afe_config_done; + struct device_node *fsa_handle; }; struct msm_asoc_wcd93xx_codec { @@ -4465,88 +4467,14 @@ done: static bool msm_usbc_swap_gnd_mic(struct snd_soc_codec *codec, bool active) { - int value = 0; - bool ret = 0; struct snd_soc_card *card = codec->component.card; - struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); - struct pinctrl_state *en2_pinctrl_active; - struct pinctrl_state *en2_pinctrl_sleep; + struct msm_asoc_mach_data *pdata = + snd_soc_card_get_drvdata(card); - if (!pdata->usbc_en2_gpio_p) { - if (active) { - /* if active and usbc_en2_gpio undefined, get pin */ - pdata->usbc_en2_gpio_p = devm_pinctrl_get(card->dev); - if (IS_ERR_OR_NULL(pdata->usbc_en2_gpio_p)) { - dev_err(card->dev, - "%s: Can't get EN2 gpio pinctrl:%ld\n", - __func__, - PTR_ERR(pdata->usbc_en2_gpio_p)); - pdata->usbc_en2_gpio_p = NULL; - return false; - } - } else { - /* if not active and usbc_en2_gpio undefined, return */ - return false; - } - } - - pdata->usbc_en2_gpio = of_get_named_gpio(card->dev->of_node, - "qcom,usbc-analog-en2-gpio", 0); - if (!gpio_is_valid(pdata->usbc_en2_gpio)) { - dev_err(card->dev, "%s, property %s not in node %s", - __func__, "qcom,usbc-analog-en2-gpio", - card->dev->of_node->full_name); + if (!pdata->fsa_handle) return false; - } - en2_pinctrl_active = pinctrl_lookup_state( - pdata->usbc_en2_gpio_p, "aud_active"); - if (IS_ERR_OR_NULL(en2_pinctrl_active)) { - dev_err(card->dev, - "%s: Cannot get aud_active pinctrl state:%ld\n", - __func__, PTR_ERR(en2_pinctrl_active)); - ret = false; - goto err_lookup_state; - } - - en2_pinctrl_sleep = pinctrl_lookup_state( - pdata->usbc_en2_gpio_p, "aud_sleep"); - if (IS_ERR_OR_NULL(en2_pinctrl_sleep)) { - dev_err(card->dev, - "%s: Cannot get aud_sleep pinctrl state:%ld\n", - __func__, PTR_ERR(en2_pinctrl_sleep)); - ret = false; - goto err_lookup_state; - } - - /* if active and usbc_en2_gpio_p defined, swap using usbc_en2_gpio_p */ - if (active) { - dev_dbg(codec->dev, "%s: enter\n", __func__); - if (pdata->usbc_en2_gpio_p) { - value = gpio_get_value_cansleep(pdata->usbc_en2_gpio); - if (value) - pinctrl_select_state(pdata->usbc_en2_gpio_p, - en2_pinctrl_sleep); - else - pinctrl_select_state(pdata->usbc_en2_gpio_p, - en2_pinctrl_active); - } else if (pdata->usbc_en2_gpio >= 0) { - value = gpio_get_value_cansleep(pdata->usbc_en2_gpio); - gpio_set_value_cansleep(pdata->usbc_en2_gpio, !value); - } - pr_debug("%s: swap select switch %d to %d\n", __func__, - value, !value); - ret = true; - } else { - /* if not active, release usbc_en2_gpio_p pin */ - pinctrl_select_state(pdata->usbc_en2_gpio_p, - en2_pinctrl_sleep); - } - -err_lookup_state: - devm_pinctrl_put(pdata->usbc_en2_gpio_p); - pdata->usbc_en2_gpio_p = NULL; - return ret; + return fsa4480_switch_event(pdata->fsa_handle, FSA_MIC_GND_SWAP); } static bool msm_swap_gnd_mic(struct snd_soc_codec *codec, bool active) @@ -8459,6 +8387,18 @@ static int msm_asoc_machine_probe(struct platform_device *pdev) "qcom,us-euro-gpios"); wcd_mbhc_cfg.swap_gnd_mic = msm_swap_gnd_mic; } + + if (wcd_mbhc_cfg.enable_usbc_analog) { + wcd_mbhc_cfg.swap_gnd_mic = msm_usbc_swap_gnd_mic; + + pdata->fsa_handle = of_parse_phandle(pdev->dev.of_node, + "fsa4480-i2c-handle", 0); + if (!pdata->fsa_handle) + dev_err(&pdev->dev, + "property %s not detected in node %s\n", + "fsa4480-i2c-handle", + pdev->dev.of_node->full_name); + } /* Parse pinctrl info from devicetree */ ret = msm_get_pinctrl(pdev); if (!ret) {