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 <nkumpat@codeaurora.org>
This commit is contained in:
parent
657d8f8ab3
commit
71fef46921
6 changed files with 13 additions and 15 deletions
|
@ -1374,9 +1374,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);
|
||||
|
|
|
@ -375,9 +375,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);
|
||||
|
|
|
@ -325,9 +325,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);
|
||||
|
|
|
@ -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 <linux/module.h>
|
||||
|
@ -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);
|
||||
|
|
|
@ -985,6 +985,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);
|
||||
|
@ -1598,14 +1601,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;
|
||||
}
|
||||
|
||||
|
|
|
@ -3280,12 +3280,19 @@ int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data)
|
|||
break;
|
||||
case SWR_DEVICE_SSR_DOWN:
|
||||
trace_printk("%s: swr device down called\n", __func__);
|
||||
mutex_lock(&swrm->mlock);
|
||||
if (swrm->state == SWR_MSTR_DOWN)
|
||||
dev_dbg(swrm->dev, "%s:SWR master is already Down:%d\n",
|
||||
__func__, swrm->state);
|
||||
else
|
||||
swrm_device_down(&pdev->dev);
|
||||
mutex_lock(&swrm->devlock);
|
||||
swrm->dev_up = false;
|
||||
mutex_unlock(&swrm->devlock);
|
||||
mutex_lock(&swrm->reslock);
|
||||
swrm->state = SWR_MSTR_SSR;
|
||||
mutex_unlock(&swrm->reslock);
|
||||
mutex_unlock(&swrm->mlock);
|
||||
break;
|
||||
case SWR_DEVICE_SSR_UP:
|
||||
/* wait for clk voting to be zero */
|
||||
|
|
Loading…
Reference in a new issue