From a804ab121b7cd5c4a07cb3a55d0a6d56bd9f0ddc Mon Sep 17 00:00:00 2001 From: Prasad Kumpatla Date: Fri, 31 Jan 2020 21:38:58 +0530 Subject: [PATCH] asoc: Fix port collision interrupt in WSA During multiple PDR usecases, due to sync issues port collision interrupt is observed. set wsa state to device down before cancelling the ocp workqueue and bail out from the workqueue when wsa state is set to device down. Change-Id: Ibefb338c1d6d2901b8773928fa2c0c48b51ac6f7 Signed-off-by: Prasad Kumpatla --- asoc/codecs/bolero/rx-macro.c | 5 +---- asoc/codecs/bolero/tx-macro.c | 3 --- asoc/codecs/bolero/va-macro.c | 3 --- asoc/codecs/bolero/wsa-macro.c | 3 --- asoc/codecs/wsa881x.c | 9 ++++++--- 5 files changed, 7 insertions(+), 16 deletions(-) diff --git a/asoc/codecs/bolero/rx-macro.c b/asoc/codecs/bolero/rx-macro.c index 92f43439fc..62da031f26 100644 --- a/asoc/codecs/bolero/rx-macro.c +++ b/asoc/codecs/bolero/rx-macro.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. +/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. */ #include @@ -1396,9 +1396,6 @@ static int rx_macro_event_handler(struct snd_soc_component *component, trace_printk("%s, enter SSR down\n", __func__); rx_priv->dev_up = false; if (rx_priv->swr_ctrl_data) { - swrm_wcd_notify( - rx_priv->swr_ctrl_data[0].rx_swr_pdev, - SWR_DEVICE_DOWN, NULL); swrm_wcd_notify( rx_priv->swr_ctrl_data[0].rx_swr_pdev, SWR_DEVICE_SSR_DOWN, NULL); diff --git a/asoc/codecs/bolero/tx-macro.c b/asoc/codecs/bolero/tx-macro.c index d411c274b0..c41e0ab92a 100644 --- a/asoc/codecs/bolero/tx-macro.c +++ b/asoc/codecs/bolero/tx-macro.c @@ -376,9 +376,6 @@ static int tx_macro_event_handler(struct snd_soc_component *component, case BOLERO_MACRO_EVT_SSR_DOWN: trace_printk("%s, enter SSR down\n", __func__); if (tx_priv->swr_ctrl_data) { - swrm_wcd_notify( - tx_priv->swr_ctrl_data[0].tx_swr_pdev, - SWR_DEVICE_DOWN, NULL); swrm_wcd_notify( tx_priv->swr_ctrl_data[0].tx_swr_pdev, SWR_DEVICE_SSR_DOWN, NULL); diff --git a/asoc/codecs/bolero/va-macro.c b/asoc/codecs/bolero/va-macro.c index 0424fe6326..d42aa8c82a 100644 --- a/asoc/codecs/bolero/va-macro.c +++ b/asoc/codecs/bolero/va-macro.c @@ -323,9 +323,6 @@ static int va_macro_event_handler(struct snd_soc_component *component, break; case BOLERO_MACRO_EVT_SSR_DOWN: if (va_priv->swr_ctrl_data) { - swrm_wcd_notify( - va_priv->swr_ctrl_data[0].va_swr_pdev, - SWR_DEVICE_DOWN, NULL); swrm_wcd_notify( va_priv->swr_ctrl_data[0].va_swr_pdev, SWR_DEVICE_SSR_DOWN, NULL); diff --git a/asoc/codecs/bolero/wsa-macro.c b/asoc/codecs/bolero/wsa-macro.c index d5808e7f37..ef062fc8db 100644 --- a/asoc/codecs/bolero/wsa-macro.c +++ b/asoc/codecs/bolero/wsa-macro.c @@ -996,9 +996,6 @@ static int wsa_macro_event_handler(struct snd_soc_component *component, case BOLERO_MACRO_EVT_SSR_DOWN: trace_printk("%s, enter SSR down\n", __func__); if (wsa_priv->swr_ctrl_data) { - swrm_wcd_notify( - wsa_priv->swr_ctrl_data[0].wsa_swr_pdev, - SWR_DEVICE_DOWN, NULL); swrm_wcd_notify( wsa_priv->swr_ctrl_data[0].wsa_swr_pdev, SWR_DEVICE_SSR_DOWN, NULL); diff --git a/asoc/codecs/wsa881x.c b/asoc/codecs/wsa881x.c index aed1d5d23b..adb4d91baf 100644 --- a/asoc/codecs/wsa881x.c +++ b/asoc/codecs/wsa881x.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved. */ #include @@ -992,6 +992,9 @@ static void wsa881x_ocp_ctl_work(struct work_struct *work) dwork = to_delayed_work(work); wsa881x = container_of(dwork, struct wsa881x_priv, ocp_ctl_work); + if (wsa881x->state == WSA881X_DEV_DOWN) + return; + component = wsa881x->component; wsa881x_get_temp(wsa881x->tz_pdata.tz_dev, &temp_val); dev_dbg(component->dev, " temp = %d\n", temp_val); @@ -1605,14 +1608,14 @@ static int wsa881x_swr_down(struct swr_device *pdev) dev_err(&pdev->dev, "%s: wsa881x is NULL\n", __func__); return -EINVAL; } - if (delayed_work_pending(&wsa881x->ocp_ctl_work)) - cancel_delayed_work_sync(&wsa881x->ocp_ctl_work); ret = wsa881x_gpio_ctrl(wsa881x, false); if (ret) dev_err(&pdev->dev, "%s: Failed to disable gpio\n", __func__); else wsa881x->state = WSA881X_DEV_DOWN; + if (delayed_work_pending(&wsa881x->ocp_ctl_work)) + cancel_delayed_work_sync(&wsa881x->ocp_ctl_work); return ret; }