From a4739036740b1670cc3ab5d8f076944acb585262 Mon Sep 17 00:00:00 2001 From: Deepak Katragadda Date: Thu, 14 Sep 2017 11:21:18 -0700 Subject: [PATCH 1/2] clk: qcom: clk-aop-qmp: Do not send duplicate requests to AOP Currently, duplicate enable requests are sent for the qdss_qmp_clk during its registration. This is not ideal behavior and should be corrected. Change-Id: I1d66ad83fe9c109a88df527ef3fae5fc60e855e7 Signed-off-by: Deepak Katragadda --- drivers/clk/qcom/clk-aop-qmp.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/clk/qcom/clk-aop-qmp.c b/drivers/clk/qcom/clk-aop-qmp.c index f813f460d44c..b6c3dadadcdc 100644 --- a/drivers/clk/qcom/clk-aop-qmp.c +++ b/drivers/clk/qcom/clk-aop-qmp.c @@ -129,6 +129,12 @@ static int clk_aop_qmp_prepare(struct clk_hw *hw) struct clk_aop_qmp *clk = to_aop_qmp_clk(hw); mutex_lock(&clk_aop_lock); + /* + * Return early if the clock has been enabled already. This + * is to avoid issues with sending duplicate enable requests. + */ + if (clk->enabled) + goto err; if (clk->level) rate = clk->level; @@ -167,6 +173,9 @@ static void clk_aop_qmp_unprepare(struct clk_hw *hw) mutex_lock(&clk_aop_lock); + if (!clk->enabled) + goto err; + rate = clk->disable_state; snprintf(mbox_msg, MAX_LEN, "{class: %s, res: %s, val: %ld}", From 44f18c6139146fb2784fd6aa7d70aa4320552afc Mon Sep 17 00:00:00 2001 From: David Collins Date: Mon, 27 Nov 2017 18:01:41 -0800 Subject: [PATCH 2/2] clk: qcom: clk-aop-qmp: correct mailbox channel request logic Ensure that the clk-aop-qmp probe function correctly returns -EPROBE_DEFER if mbox_request_channel() returns -EPROBE_DEFER. This avoids invalid memory dereferencing during QDSS clock calls in the case that the AOP mailbox is not yet available. Change-Id: I4ef07ceaace05a1911f51992a181903b4365afe2 Signed-off-by: David Collins --- drivers/clk/qcom/clk-aop-qmp.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/clk/qcom/clk-aop-qmp.c b/drivers/clk/qcom/clk-aop-qmp.c index b6c3dadadcdc..903ef9e171dd 100644 --- a/drivers/clk/qcom/clk-aop-qmp.c +++ b/drivers/clk/qcom/clk-aop-qmp.c @@ -225,6 +225,7 @@ static int qmp_update_client(struct clk_hw *hw, struct device *dev, struct mbox_chan *mbox) { struct clk_aop_qmp *clk_aop = to_aop_qmp_clk(hw); + int ret; /* Use mailbox client with blocking mode */ clk_aop->cl.dev = dev; @@ -239,10 +240,12 @@ static int qmp_update_client(struct clk_hw *hw, struct device *dev, /* Allocate mailbox channel */ mbox = clk_aop->mbox = mbox_request_channel(&clk_aop->cl, 0); - if (IS_ERR(clk_aop->mbox) && PTR_ERR(clk_aop->mbox) != -EPROBE_DEFER) { - dev_err(dev, "Failed to get mailbox channel %pK %ld\n", - mbox, PTR_ERR(mbox)); - return PTR_ERR(clk_aop->mbox); + if (IS_ERR(clk_aop->mbox)) { + ret = PTR_ERR(clk_aop->mbox); + if (ret != -EPROBE_DEFER) + dev_err(dev, "Failed to get mailbox channel, ret %d\n", + ret); + return ret; } return 0;