From c848d4ca45ff58fcc406afc9f95be02b054c520d Mon Sep 17 00:00:00 2001 From: Karthikeyan Mani Date: Thu, 4 May 2017 11:39:47 -0700 Subject: [PATCH] ASoC: wsa881x: Fix GPIO leak issue In case of any probe/logical address error, set the pinctrl of wsa881x to the state that it was before the probe entered. Otherwise set it to active state. CRs-fixed: 2050725 Change-Id: I5022885f36111caeac1d25017db8a474e26ca521 Signed-off-by: Karthikeyan Mani --- sound/soc/codecs/wsa881x.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sound/soc/codecs/wsa881x.c b/sound/soc/codecs/wsa881x.c index 0af656ce48f0..fe975a7dbe4e 100644 --- a/sound/soc/codecs/wsa881x.c +++ b/sound/soc/codecs/wsa881x.c @@ -1185,6 +1185,7 @@ static int wsa881x_swr_probe(struct swr_device *pdev) int ret = 0; struct wsa881x_priv *wsa881x; u8 devnum = 0; + bool pin_state_current = false; wsa881x = devm_kzalloc(&pdev->dev, sizeof(struct wsa881x_priv), GFP_KERNEL); @@ -1218,6 +1219,9 @@ static int wsa881x_swr_probe(struct swr_device *pdev) if (ret) goto err; } + if (wsa881x->wsa_rst_np) + pin_state_current = msm_cdc_pinctrl_get_state( + wsa881x->wsa_rst_np); wsa881x_gpio_ctrl(wsa881x, true); wsa881x->state = WSA881X_DEV_UP; @@ -1280,6 +1284,8 @@ static int wsa881x_swr_probe(struct swr_device *pdev) return 0; dev_err: + if (pin_state_current == false) + wsa881x_gpio_ctrl(wsa881x, false); swr_remove_device(pdev); err: return ret;