slim-msm-ngd: Prevent system suspend during initialization

Prevent system suspend from happening during slimbus initialization
process where the NGD Slimbus component gets enummerated with
ADSP slimbus component and then queries the logical addresses of
the clients connected.

This is to prevent the issue where the slimbus driver goes to
suspend due to system suspend after the enumeration phase is
done after an SSR/PDR. Driver again resumes for querying logical
addresses of clients connected assuming enumeration process is
already done whereas it has to be re-enumerated as driver got
suspened and resumed.

Change-Id: I42ab3f7a6061a1c464d436aa13e43d27eb312fd4
Signed-off-by: Prudhvi Yarlagadda <pyarlaga@codeaurora.org>
This commit is contained in:
Prudhvi Yarlagadda 2020-01-24 15:20:41 +05:30 committed by Gerrit - the friendly Code Review server
parent 1b1f2e23c3
commit a9fed7cf6f
2 changed files with 35 additions and 1 deletions

View File

@ -276,6 +276,7 @@ static int dsp_domr_notify_cb(struct notifier_block *n, unsigned long code,
SLIM_INFO(dev, "SLIM DSP SSR notify cb:%lu\n", code);
/* Hold wake lock until notify slaves thread is done */
pm_stay_awake(dev->dev);
atomic_set(&dev->init_in_progress, 1);
if (dev->lpass_mem_usage) {
dev->lpass_mem->start = dev->lpass_phy_base;
dev->lpass.base = dev->lpass_virt_base;
@ -1570,6 +1571,7 @@ static int ngd_slim_rx_msgq_thread(void *data)
struct msm_slim_ctrl *dev = (struct msm_slim_ctrl *)data;
struct completion *notify = &dev->rx_msgq_notify;
int ret = 0;
bool release_wake_lock = false;
while (!kthread_should_stop()) {
struct slim_msg_txn txn;
@ -1607,17 +1609,36 @@ capability_retry:
/* ADSP SSR, send device_up notifications */
if (prev_state == MSM_CTRL_DOWN)
complete(&dev->qmi.slave_notify);
else
release_wake_lock = true;
} else if (ret == -EIO) {
SLIM_WARN(dev, "capability message NACKed, retrying\n");
if (retries < INIT_MX_RETRIES) {
msleep(DEF_RETRY_MS);
retries++;
goto capability_retry;
} else {
release_wake_lock = true;
}
} else {
SLIM_WARN(dev, "SLIM: capability TX failed:%d\n", ret);
release_wake_lock = true;
}
if (release_wake_lock) {
/*
* As we are not going to reset the
* init_in_progress flag and release wake
* lock from notify slave thread, we are
* doing it here.
*/
atomic_set(&dev->init_in_progress, 0);
pm_relax(dev->dev);
release_wake_lock = false;
}
}
atomic_set(&dev->init_in_progress, 0);
pm_relax(dev->dev);
return 0;
}
@ -1672,7 +1693,10 @@ static int ngd_notify_slaves(void *data)
mutex_lock(&ctrl->m_ctrl);
}
mutex_unlock(&ctrl->m_ctrl);
atomic_set(&dev->init_in_progress, 0);
pm_relax(dev->dev);
}
atomic_set(&dev->init_in_progress, 0);
pm_relax(dev->dev);
return 0;
}
@ -1702,7 +1726,10 @@ static void ngd_dom_up(struct work_struct *work)
wait_for_completion_interruptible(&dev->qmi_up);
mutex_lock(&dev->ssr_lock);
ngd_slim_enable(dev, true);
if (ngd_slim_enable(dev, true)) {
atomic_set(&dev->init_in_progress, 0);
pm_relax(dev->dev);
}
mutex_unlock(&dev->ssr_lock);
}
@ -2205,6 +2232,12 @@ static int ngd_slim_suspend(struct device *dev)
cdev = platform_get_drvdata(pdev);
if (atomic_read(&cdev->init_in_progress)) {
ret = -EBUSY;
SLIM_INFO(cdev, "system suspend due to ssr: %d\n", ret);
return ret;
}
if (cdev->state == MSM_CTRL_AWAKE) {
ret = -EBUSY;
SLIM_INFO(cdev, "system suspend: %d\n", ret);

View File

@ -324,6 +324,7 @@ struct msm_slim_ctrl {
u32 current_rx_buf[10];
int current_count;
atomic_t ssr_in_progress;
atomic_t init_in_progress;
struct completion qmi_up;
};