summaryrefslogtreecommitdiff
path: root/soc
diff options
context:
space:
mode:
authorLaxminath Kasam <lkasam@codeaurora.org>2020-04-28 00:02:32 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2020-05-17 22:58:21 -0700
commitea6cbeeb1ad818c8c7907252409edb306c81d0ae (patch)
treedf7be103cf184c08cead7a46328d6515560f0bd8 /soc
parent9128e3099f88c62b16ac317c75b406b06b30046a (diff)
downloadmsm-extra-ea6cbeeb1ad818c8c7907252409edb306c81d0ae.tar.gz
soc: mstr-ctrl: Retain Audio_HM voting until suspend
Restore change to retain audio_hm voting and ensure AOP hang issue not seen by masking interrupt wakeup of swr pinctrl pins. Change-Id: I51bf36d6d6b0999abf10a4bc94cce900d1adf1d5 Signed-off-by: Laxminath Kasam <lkasam@codeaurora.org>
Diffstat (limited to 'soc')
-rw-r--r--soc/swr-mstr-ctrl.c23
-rw-r--r--soc/swr-mstr-ctrl.h4
2 files changed, 17 insertions, 10 deletions
diff --git a/soc/swr-mstr-ctrl.c b/soc/swr-mstr-ctrl.c
index 6358437f..981060cd 100644
--- a/soc/swr-mstr-ctrl.c
+++ b/soc/swr-mstr-ctrl.c
@@ -2552,6 +2552,8 @@ static int swrm_probe(struct platform_device *pdev)
ret = -EINVAL;
goto err_pdata_fail;
}
+ swrm->pinctrl_setup = pdata->pinctrl_setup;
+
if (of_property_read_u32(pdev->dev.of_node,
"qcom,swr-clock-stop-mode0",
&swrm->clk_stop_mode0_supp)) {
@@ -2873,7 +2875,6 @@ static int swrm_runtime_resume(struct device *dev)
int ret = 0;
bool swrm_clk_req_err = false;
bool hw_core_err = false;
- bool aud_core_err = false;
struct swr_master *mstr = &swrm->master;
struct swr_device *swr_dev;
@@ -2891,7 +2892,7 @@ static int swrm_runtime_resume(struct device *dev)
if (swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, true)) {
dev_err(dev, "%s:lpass audio hw enable failed\n",
__func__);
- aud_core_err = true;
+ swrm->aud_core_err = true;
}
if ((swrm->state == SWR_MSTR_DOWN) ||
@@ -2910,6 +2911,9 @@ static int swrm_runtime_resume(struct device *dev)
irq_get_irq_data(swrm->wake_irq)))
disable_irq_nosync(swrm->wake_irq);
mutex_unlock(&swrm->irq_lock);
+ if (swrm->dmic_sva && swrm->pinctrl_setup)
+ swrm->pinctrl_setup(swrm->handle,
+ false);
}
if (swrm->ipc_wakeup)
msm_aud_evt_blocking_notifier_call_chain(
@@ -2977,7 +2981,7 @@ static int swrm_runtime_resume(struct device *dev)
swrm->state = SWR_MSTR_UP;
}
exit:
- if (!aud_core_err)
+ if (ret && !swrm->aud_core_err)
swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, false);
if (!hw_core_err)
swrm_request_hw_vote(swrm, LPASS_HW_CORE, false);
@@ -3000,7 +3004,6 @@ static int swrm_runtime_suspend(struct device *dev)
struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev);
int ret = 0;
bool hw_core_err = false;
- bool aud_core_err = false;
struct swr_master *mstr = &swrm->master;
struct swr_device *swr_dev;
int current_state = 0;
@@ -3019,11 +3022,6 @@ static int swrm_runtime_suspend(struct device *dev)
__func__);
hw_core_err = true;
}
- if (swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, true)) {
- dev_err(dev, "%s:lpass audio hw enable failed\n",
- __func__);
- aud_core_err = true;
- }
if ((current_state == SWR_MSTR_UP) ||
(current_state == SWR_MSTR_SSR)) {
@@ -3108,6 +3106,8 @@ static int swrm_runtime_suspend(struct device *dev)
if (swrm->clk_stop_mode0_supp) {
if (swrm->wake_irq > 0) {
+ if (swrm->dmic_sva && swrm->pinctrl_setup)
+ swrm->pinctrl_setup(swrm->handle, true);
enable_irq(swrm->wake_irq);
} else if (swrm->ipc_wakeup) {
msm_aud_evt_blocking_notifier_call_chain(
@@ -3121,10 +3121,11 @@ static int swrm_runtime_suspend(struct device *dev)
if (current_state != SWR_MSTR_SSR)
swrm->state = SWR_MSTR_DOWN;
exit:
- if (!aud_core_err)
+ if (!swrm->aud_core_err)
swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, false);
if (!hw_core_err)
swrm_request_hw_vote(swrm, LPASS_HW_CORE, false);
+ swrm->aud_core_err = false;
mutex_unlock(&swrm->reslock);
trace_printk("%s: pm_runtime: suspend done state: %d\n",
__func__, swrm->state);
@@ -3451,10 +3452,12 @@ int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data)
case SWR_REGISTER_WAKEUP:
msm_aud_evt_blocking_notifier_call_chain(
SWR_WAKE_IRQ_REGISTER, (void *)swrm);
+ swrm->dmic_sva = *(u32 *)data;
break;
case SWR_DEREGISTER_WAKEUP:
msm_aud_evt_blocking_notifier_call_chain(
SWR_WAKE_IRQ_DEREGISTER, (void *)swrm);
+ swrm->dmic_sva = 0;
break;
case SWR_SET_PORT_MAP:
if (!data) {
diff --git a/soc/swr-mstr-ctrl.h b/soc/swr-mstr-ctrl.h
index ec5bbd2f..5439ce6f 100644
--- a/soc/swr-mstr-ctrl.h
+++ b/soc/swr-mstr-ctrl.h
@@ -108,6 +108,7 @@ struct swr_ctrl_platform_data {
int (*core_vote)(void *handle, bool enable);
int (*reg_irq)(void *handle, irqreturn_t(*irq_handler)(int irq,
void *data), void *swr_handle, int type);
+ int (*pinctrl_setup)(void *handle, bool enable);
};
struct swr_mstr_ctrl {
@@ -140,6 +141,7 @@ struct swr_mstr_ctrl {
int (*core_vote)(void *handle, bool enable);
int (*reg_irq)(void *handle, irqreturn_t(*irq_handler)(int irq,
void *data), void *swr_handle, int type);
+ int (*pinctrl_setup)(void *handle, bool enable);
int irq;
int wake_irq;
int version;
@@ -165,8 +167,10 @@ struct swr_mstr_ctrl {
u32 clk_stop_mode0_supp;
struct work_struct wakeup_work;
u32 ipc_wakeup;
+ u32 dmic_sva;
bool dev_up;
bool ipc_wakeup_triggered;
+ bool aud_core_err;
struct pm_qos_request pm_qos_req;
enum swrm_pm_state pm_state;
wait_queue_head_t pm_wq;