From b57cad08fbf8a5fcd7a3b22e7155230fecd650ff Mon Sep 17 00:00:00 2001 From: Subbaraman Narayanamurthy Date: Fri, 19 Aug 2022 11:27:18 -0700 Subject: [PATCH] soc: qcom: pmic_glink: use semaphore in pmic_glink_register_client() Commit 922e045cea2f3 ("soc: qcom: pmic_glink: Fix a race condition in removing rpmsg device") added a semaphore to protect rpdev usage when it is added/removed when rpmsg driver is probed/removed so that clients can use it in pmic_glink_write() concurrently. When a client tries to register using pmic_glink_register_client() it checks for the state of pmic_glink device. It's logical to use the semaphore before reading the state. Change-Id: Ib715819ea2008f14d204fe097ac1631dbd129e40 Signed-off-by: Subbaraman Narayanamurthy --- drivers/soc/qcom/pmic_glink.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/soc/qcom/pmic_glink.c b/drivers/soc/qcom/pmic_glink.c index 433b070272d9..985436f51d19 100644 --- a/drivers/soc/qcom/pmic_glink.c +++ b/drivers/soc/qcom/pmic_glink.c @@ -312,10 +312,13 @@ struct pmic_glink_client *pmic_glink_register_client(struct device *dev, return ERR_PTR(-ENODEV); } + down_read(&pgdev->rpdev_sem); if (!atomic_read(&pgdev->state)) { + up_read(&pgdev->rpdev_sem); pr_err("pmic_glink is not up\n"); return ERR_PTR(-EPROBE_DEFER); } + up_read(&pgdev->rpdev_sem); client = kzalloc(sizeof(*client), GFP_KERNEL); if (!client)