Update all rpmh clients to start using rpmh_start_transaction() and rpmh_end_transaction(). Cc: Taniya Das <tdas@xxxxxxxxxxxxxx> Cc: Odelu Kukatla <okukatla@xxxxxxxxxxxxxx> Cc: Kiran Gunda <kgunda@xxxxxxxxxxxxxx> Cc: Sibi Sankar <sibis@xxxxxxxxxxxxxx> Signed-off-by: Maulik Shah <mkshah@xxxxxxxxxxxxxx> --- drivers/clk/qcom/clk-rpmh.c | 21 ++++++++++++++------- drivers/interconnect/qcom/bcm-voter.c | 13 +++++++++---- drivers/regulator/qcom-rpmh-regulator.c | 4 ++++ drivers/soc/qcom/rpmhpd.c | 11 +++++++++-- 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/drivers/clk/qcom/clk-rpmh.c b/drivers/clk/qcom/clk-rpmh.c index 12bd871..16f68d4 100644 --- a/drivers/clk/qcom/clk-rpmh.c +++ b/drivers/clk/qcom/clk-rpmh.c @@ -154,22 +154,27 @@ static int clk_rpmh_send_aggregate_command(struct clk_rpmh *c) cmd_state = c->aggr_state; on_val = c->res_on_val; + rpmh_start_transaction(c->dev); + for (; state <= RPMH_ACTIVE_ONLY_STATE; state++) { if (has_state_changed(c, state)) { if (cmd_state & BIT(state)) cmd.data = on_val; ret = rpmh_write_async(c->dev, state, &cmd, 1); - if (ret) { - dev_err(c->dev, "set %s state of %s failed: (%d)\n", - !state ? "sleep" : - state == RPMH_WAKE_ONLY_STATE ? - "wake" : "active", c->res_name, ret); - return ret; - } + if (ret) + break; } } + ret |= rpmh_end_transaction(c->dev); + if (ret) { + dev_err(c->dev, "set %s state of %s failed: (%d)\n", + !state ? "sleep" : state == RPMH_WAKE_ONLY_STATE ? + "wake" : "active", c->res_name, ret); + return ret; + } + c->last_sent_aggr_state = c->aggr_state; c->peer->last_sent_aggr_state = c->last_sent_aggr_state; @@ -267,7 +272,9 @@ static int clk_rpmh_bcm_send_cmd(struct clk_rpmh *c, bool enable) cmd.addr = c->res_addr; cmd.data = BCM_TCS_CMD(1, enable, 0, cmd_state); + rpmh_start_transaction(c->dev); ret = rpmh_write_async(c->dev, RPMH_ACTIVE_ONLY_STATE, &cmd, 1); + ret |= rpmh_end_transaction(c->dev); if (ret) { dev_err(c->dev, "set active state of %s failed: (%d)\n", c->res_name, ret); diff --git a/drivers/interconnect/qcom/bcm-voter.c b/drivers/interconnect/qcom/bcm-voter.c index 2adfde8..fbe18b2 100644 --- a/drivers/interconnect/qcom/bcm-voter.c +++ b/drivers/interconnect/qcom/bcm-voter.c @@ -263,7 +263,9 @@ int qcom_icc_bcm_voter_commit(struct bcm_voter *voter) tcs_list_gen(&voter->commit_list, QCOM_ICC_BUCKET_AMC, cmds, commit_idx); if (!commit_idx[0]) - goto out; + goto end; + + rpmh_start_transaction(voter-dev); ret = rpmh_invalidate(voter->dev); if (ret) { @@ -312,12 +314,15 @@ int qcom_icc_bcm_voter_commit(struct bcm_voter *voter) tcs_list_gen(&voter->commit_list, QCOM_ICC_BUCKET_SLEEP, cmds, commit_idx); ret = rpmh_write_batch(voter->dev, RPMH_SLEEP_STATE, cmds, commit_idx); - if (ret) { + if (ret) pr_err("Error sending SLEEP RPMH requests (%d)\n", ret); - goto out; - } out: + ret = rpmh_end_transaction(voter-dev); + if (ret) + pr_err("Error ending rpmh transaction (%d)\n", ret); + +end: list_for_each_entry_safe(bcm, bcm_tmp, &voter->commit_list, list) list_del_init(&bcm->list); diff --git a/drivers/regulator/qcom-rpmh-regulator.c b/drivers/regulator/qcom-rpmh-regulator.c index c86ad40..f4b9176 100644 --- a/drivers/regulator/qcom-rpmh-regulator.c +++ b/drivers/regulator/qcom-rpmh-regulator.c @@ -163,12 +163,16 @@ static int rpmh_regulator_send_request(struct rpmh_vreg *vreg, { int ret; + rpmh_start_transaction(vreg->dev); + if (wait_for_ack || vreg->always_wait_for_ack) ret = rpmh_write(vreg->dev, RPMH_ACTIVE_ONLY_STATE, cmd, 1); else ret = rpmh_write_async(vreg->dev, RPMH_ACTIVE_ONLY_STATE, cmd, 1); + ret |= rpmh_end_transaction(vreg->dev); + return ret; } diff --git a/drivers/soc/qcom/rpmhpd.c b/drivers/soc/qcom/rpmhpd.c index 4d264d0..0e9d204 100644 --- a/drivers/soc/qcom/rpmhpd.c +++ b/drivers/soc/qcom/rpmhpd.c @@ -193,19 +193,26 @@ static const struct of_device_id rpmhpd_match_table[] = { static int rpmhpd_send_corner(struct rpmhpd *pd, int state, unsigned int corner, bool sync) { + int ret; struct tcs_cmd cmd = { .addr = pd->addr, .data = corner, }; + rpmh_start_transaction(pd->dev); + /* * Wait for an ack only when we are increasing the * perf state of the power domain */ if (sync) - return rpmh_write(pd->dev, state, &cmd, 1); + ret = rpmh_write(pd->dev, state, &cmd, 1); else - return rpmh_write_async(pd->dev, state, &cmd, 1); + ret = rpmh_write_async(pd->dev, state, &cmd, 1); + + ret |= rpmh_end_transaction(pd->dev); + + return ret; } static void to_active_sleep(struct rpmhpd *pd, unsigned int corner, -- QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation