From f13849040726d154fdff7ccdbbb831490b2a2ee4 Mon Sep 17 00:00:00 2001 From: Prudhvi Yarlagadda Date: Thu, 14 Nov 2019 12:02:42 +0530 Subject: [PATCH 1/2] slim-msm-ngd: Add wake lock to avoid race with suspend and SSR Add wake lock in SSR up notification handling to avoid race condition between system suspend and SSR up handling sequence which can result in un-clocked access. Change-Id: I246fa70df53b0cb7acdfcadf9cfe2ce01a3bff6b Signed-off-by: Prudhvi Yarlagadda --- drivers/slimbus/slim-msm-ngd.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/slimbus/slim-msm-ngd.c b/drivers/slimbus/slim-msm-ngd.c index c672c22e6136..bee258e74122 100644 --- a/drivers/slimbus/slim-msm-ngd.c +++ b/drivers/slimbus/slim-msm-ngd.c @@ -166,6 +166,8 @@ static int ngd_slim_qmi_new_server(struct qmi_handle *hdl, container_of(qmi, struct msm_slim_ctrl, qmi); SLIM_INFO(dev, "Slimbus QMI new server event received\n"); + /* Hold wake lock until notify slaves thread is done */ + pm_stay_awake(dev->dev); qmi->svc_info.sq_family = AF_QIPCRTR; qmi->svc_info.sq_node = service->node; qmi->svc_info.sq_port = service->port; @@ -1622,6 +1624,7 @@ static int ngd_notify_slaves(void *data) ret = ngd_slim_qmi_svc_event_init(&dev->qmi); if (ret) { pr_err("Slimbus QMI service registration failed:%d\n", ret); + pm_relax(dev->dev); return ret; } @@ -1662,6 +1665,7 @@ static int ngd_notify_slaves(void *data) } mutex_unlock(&ctrl->m_ctrl); } + pm_relax(dev->dev); return 0; } From e52cc1851bf9b1f24be0054d4064b49a71f957f6 Mon Sep 17 00:00:00 2001 From: Prudhvi Yarlagadda Date: Fri, 10 Jan 2020 15:34:20 +0530 Subject: [PATCH 2/2] slim-msm-ngd: Add qmi deferred response check in pm resume Add a check in slimbus runtime resume api to query for qmi deferred response if deferred response flag is set in the previous slimbus system suspend api. Change-Id: Ie306261d512df3417a5f33398bcf2b7160e572d6 Signed-off-by: Prudhvi Yarlagadda --- drivers/slimbus/slim-msm-ngd.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/slimbus/slim-msm-ngd.c b/drivers/slimbus/slim-msm-ngd.c index bee258e74122..7eb4bcd68308 100644 --- a/drivers/slimbus/slim-msm-ngd.c +++ b/drivers/slimbus/slim-msm-ngd.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. */ #include @@ -2121,6 +2121,17 @@ static int ngd_slim_runtime_resume(struct device *device) int ret = 0; mutex_lock(&dev->tx_lock); + + if (dev->qmi.deferred_resp) { + SLIM_WARN(dev, "%s: RT resume called ahead of sys resume\n", + __func__); + ret = msm_slim_qmi_deferred_status_req(dev); + if (ret) + SLIM_WARN(dev, "%s: deferred resp failure\n", + __func__); + dev->qmi.deferred_resp = false; + } + if ((dev->state >= MSM_CTRL_ASLEEP) && (dev->qmi.handle != NULL)) ret = ngd_slim_power_up(dev, false); if (ret || dev->qmi.handle == NULL) { @@ -2223,6 +2234,7 @@ static int ngd_slim_resume(struct device *dev) * mark runtime-pm status as active to be consistent * with HW status */ + mutex_lock(&cdev->tx_lock); if (cdev->qmi.deferred_resp) { ret = msm_slim_qmi_deferred_status_req(cdev); if (ret) { @@ -2238,6 +2250,7 @@ static int ngd_slim_resume(struct device *dev) * clock/power on */ SLIM_INFO(cdev, "system resume state: %d\n", cdev->state); + mutex_unlock(&cdev->tx_lock); return ret; } #endif /* CONFIG_PM_SLEEP */