summaryrefslogtreecommitdiff
path: root/sound/soc
diff options
context:
space:
mode:
authorStephen Oglesby <soglesby@codeaurora.org>2016-05-19 17:19:35 -0700
committerKyle Yan <kyan@codeaurora.org>2016-06-13 16:18:31 -0700
commitbbcb7758294b882907b011c0a70b55a5bfd91b43 (patch)
tree8d7510e2fa4d6abde3c8ac9b7a5c947c48f6555e /sound/soc
parent402fc23f0c2d395fe52bdfdd2169c5682ed75d6f (diff)
ASoC: msmcobalt: Switch ground/mic swap GPIO control to pinctrl
Switch to swap ground and mic headset poles is controlled by a GPIO on the Apps processor instead of the PMIC, and therefore software logic must change to use pinctrl APIs CRs-fixed: 1019254 Change-Id: Ibccddc82b18614ddbe6ef9c9720b3de1ce00163e Signed-off-by: Stephen Oglesby <soglesby@codeaurora.org>
Diffstat (limited to 'sound/soc')
-rw-r--r--sound/soc/msm/msmcobalt.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/sound/soc/msm/msmcobalt.c b/sound/soc/msm/msmcobalt.c
index 07bade08b3f5..88225e8a4861 100644
--- a/sound/soc/msm/msmcobalt.c
+++ b/sound/soc/msm/msmcobalt.c
@@ -22,6 +22,7 @@
#include <linux/module.h>
#include <linux/switch.h>
#include <linux/input.h>
+#include <linux/mfd/msm-cdc-pinctrl.h>
#include <sound/core.h>
#include <sound/soc.h>
#include <sound/soc-dapm.h>
@@ -107,9 +108,10 @@ struct msm_wsa881x_dev_info {
struct msm_asoc_mach_data {
u32 mclk_freq;
- int us_euro_gpio;
int hph_en1_gpio;
int hph_en0_gpio;
+ int us_euro_gpio; /* used by gpio driver API */
+ struct device_node *us_euro_gpio_p; /* used by pinctrl API */
struct snd_info_entry *codec_root;
};
@@ -1155,10 +1157,21 @@ static bool msm_swap_gnd_mic(struct snd_soc_codec *codec)
struct snd_soc_card *card = codec->component.card;
struct msm_asoc_mach_data *pdata =
snd_soc_card_get_drvdata(card);
- int value = gpio_get_value_cansleep(pdata->us_euro_gpio);
+ int value;
+ if (pdata->us_euro_gpio_p) {
+ value = msm_cdc_pinctrl_get_state(pdata->us_euro_gpio_p);
+ if (value)
+ msm_cdc_pinctrl_select_sleep_state(
+ pdata->us_euro_gpio_p);
+ else
+ msm_cdc_pinctrl_select_active_state(
+ pdata->us_euro_gpio_p);
+ } else if (pdata->us_euro_gpio >= 0) {
+ value = gpio_get_value_cansleep(pdata->us_euro_gpio);
+ gpio_set_value_cansleep(pdata->us_euro_gpio, !value);
+ }
pr_debug("%s: swap select switch %d to %d\n", __func__, value, !value);
- gpio_set_value_cansleep(pdata->us_euro_gpio, !value);
return true;
}
@@ -3517,13 +3530,15 @@ static int msm_asoc_machine_probe(struct platform_device *pdev)
*/
pdata->us_euro_gpio = of_get_named_gpio(pdev->dev.of_node,
"qcom,us-euro-gpios", 0);
- if (pdata->us_euro_gpio < 0) {
+ if (pdata->us_euro_gpio < 0)
+ pdata->us_euro_gpio_p = of_parse_phandle(pdev->dev.of_node,
+ "qcom,us-euro-gpios", 0);
+ if ((pdata->us_euro_gpio < 0) && (!pdata->us_euro_gpio_p)) {
dev_info(&pdev->dev, "property %s not detected in node %s",
- "qcom,us-euro-gpios",
- pdev->dev.of_node->full_name);
+ "qcom,us-euro-gpios", pdev->dev.of_node->full_name);
} else {
- dev_dbg(&pdev->dev, "%s detected %d",
- "qcom,us-euro-gpios", pdata->us_euro_gpio);
+ dev_dbg(&pdev->dev, "%s detected",
+ "qcom,us-euro-gpios");
wcd_mbhc_cfg.swap_gnd_mic = msm_swap_gnd_mic;
}