From: Avaneesh Kumar Dwivedi <akdwived@codeaurora.org>
To: bjorn.andersson@linaro.org
Cc: sboyd@codeaurora.org, agross@codeaurora.org,
linux-arm-msm@vger.kernel.org,
Avaneesh Kumar Dwivedi <akdwived@codeaurora.org>
Subject: [PATCH v4 04/10] remoteproc: qcom: Modify regulator enable and disable interface
Date: Wed, 16 Nov 2016 22:31:30 +0530 [thread overview]
Message-ID: <1479315696-15490-5-git-send-email-akdwived@codeaurora.org> (raw)
In-Reply-To: <1479315696-15490-1-git-send-email-akdwived@codeaurora.org>
Regulator enable routine will get additional input parameter of
regulator info and count, It will read regulator info and will do
appropriate voltage and load configuration before turning them up.
Signed-off-by: Avaneesh Kumar Dwivedi <akdwived@codeaurora.org>
---
drivers/remoteproc/qcom_q6v5_pil.c | 87 ++++++++++++++++++++++++++------------
1 file changed, 59 insertions(+), 28 deletions(-)
diff --git a/drivers/remoteproc/qcom_q6v5_pil.c b/drivers/remoteproc/qcom_q6v5_pil.c
index 32e4bbc..8843605 100644
--- a/drivers/remoteproc/qcom_q6v5_pil.c
+++ b/drivers/remoteproc/qcom_q6v5_pil.c
@@ -127,7 +127,6 @@ struct q6v5 {
struct qcom_smem_state *state;
unsigned stop_bit;
- struct regulator_bulk_data supply[4];
struct clk *ahb_clk;
struct clk *axi_clk;
@@ -155,12 +154,6 @@ struct q6v5 {
size_t mpss_size;
};
-enum {
- Q6V5_SUPPLY_CX,
- Q6V5_SUPPLY_MX,
- Q6V5_SUPPLY_MSS,
- Q6V5_SUPPLY_PLL,
-};
static int q6v5_regulator_init(struct device *dev,
struct reg_info **regs_ref, char **reg_str, int volatage_load[][2])
@@ -206,33 +199,64 @@ static int q6v5_regulator_init(struct device *dev,
return reg_count;
}
-static int q6v5_regulator_enable(struct q6v5 *qproc)
+static int q6v5_regulator_enable(struct q6v5 *qproc,
+ struct reg_info *regs, int count)
{
- struct regulator *mss = qproc->supply[Q6V5_SUPPLY_MSS].consumer;
- struct regulator *mx = qproc->supply[Q6V5_SUPPLY_MX].consumer;
- int ret;
+ int i, rc = 0;
+
+ for (i = 0; i < count; i++) {
+ if (regs[i].uV > 0) {
+ rc = regulator_set_voltage(regs[i].reg,
+ regs[i].uV, INT_MAX);
+ if (rc) {
+ dev_err(qproc->dev,
+ "Failed to request voltage for %d.\n",
+ i);
+ goto err_voltage;
+ }
+ }
- /* TODO: Q6V5_SUPPLY_CX is supposed to be set to super-turbo here */
+ if (regs[i].uA > 0) {
+ rc = regulator_set_load(regs[i].reg,
+ regs[i].uA);
+ if (rc < 0) {
+ dev_err(qproc->dev, "Failed to set regulator mode\n");
+ goto err_load;
+ }
+ }
- ret = regulator_set_voltage(mx, 1050000, INT_MAX);
- if (ret)
- return ret;
+ rc = regulator_enable(regs[i].reg);
+ if (rc) {
+ dev_err(qproc->dev, "Regulator enable failed\n");
+ goto err_enable;
+ }
+ }
- regulator_set_voltage(mss, 1000000, 1150000);
+ return 0;
+err_enable:
+ if (regs[i].uA > 0) {
+ regulator_set_voltage(regs[i].reg, 0, INT_MAX);
+ regulator_set_load(regs[i].reg, 0);
+ }
+err_load:
+ if (regs[i].uV > 0)
+ regulator_set_voltage(regs[i].reg, 0, INT_MAX);
+err_voltage:
+ for (i--; i >= 0; i--) {
+ if (regs[i].uV > 0)
+ regulator_set_voltage(regs[i].reg, 0, INT_MAX);
+
+ if (regs[i].uA > 0)
+ regulator_set_load(regs[i].reg, 0);
+
+ regulator_disable(regs[i].reg);
+ }
- return regulator_bulk_enable(ARRAY_SIZE(qproc->supply), qproc->supply);
+ return rc;
}
static void q6v5_regulator_disable(struct q6v5 *qproc)
{
- struct regulator *mss = qproc->supply[Q6V5_SUPPLY_MSS].consumer;
- struct regulator *mx = qproc->supply[Q6V5_SUPPLY_MX].consumer;
-
- /* TODO: Q6V5_SUPPLY_CX corner votes should be released */
-
- regulator_bulk_disable(ARRAY_SIZE(qproc->supply), qproc->supply);
- regulator_set_voltage(mx, 0, INT_MAX);
- regulator_set_voltage(mss, 0, 1150000);
}
static int q6v5_load(struct rproc *rproc, const struct firmware *fw)
@@ -524,12 +548,19 @@ static int q6v5_start(struct rproc *rproc)
struct q6v5 *qproc = (struct q6v5 *)rproc->priv;
int ret;
- ret = q6v5_regulator_enable(qproc);
+ ret = q6v5_regulator_enable(qproc, qproc->proxy_regs,
+ qproc->proxy_reg_count);
if (ret) {
- dev_err(qproc->dev, "failed to enable supplies\n");
+ dev_err(qproc->dev, "failed to enable proxy supplies\n");
return ret;
}
+ ret = q6v5_regulator_enable(qproc, qproc->active_regs,
+ qproc->active_reg_count);
+ if (ret) {
+ dev_err(qproc->dev, "failed to enable supplies\n");
+ goto disable_proxy_clk;
+ }
ret = reset_control_deassert(qproc->mss_restart);
if (ret) {
dev_err(qproc->dev, "failed to deassert mss restart\n");
@@ -599,7 +630,7 @@ static int q6v5_start(struct rproc *rproc)
reset_control_assert(qproc->mss_restart);
disable_vdd:
q6v5_regulator_disable(qproc);
-
+disable_proxy_clk:
return ret;
}
--
Qualcomm India Private Limited, on behalf of Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project.
next prev parent reply other threads:[~2016-11-16 17:01 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-16 17:01 [PATCH v4 00/10]remoteproc: qcom: Add support to hexagon q6v56 in qcom hexagon rproc driver Avaneesh Kumar Dwivedi
2016-11-16 17:01 ` [PATCH v4 01/10] remoteproc: qcom: Add and initialize private data for hexagon dsp Avaneesh Kumar Dwivedi
2016-11-16 17:01 ` [PATCH v4 02/10] remoteproc: qcom: Initialize MSS reset control handle Avaneesh Kumar Dwivedi
2016-11-16 17:01 ` [PATCH v4 03/10] remoteproc: qcom: Initialize clock and regulator handle with private data Avaneesh Kumar Dwivedi
2016-11-16 17:01 ` Avaneesh Kumar Dwivedi [this message]
2016-11-16 17:01 ` [PATCH v4 05/10] remoteproc: qcom: Separate out regulator disable routine in two Avaneesh Kumar Dwivedi
2016-11-16 17:01 ` [PATCH v4 06/10] remoteproc: qcom: Modify clock enable and disable routine Avaneesh Kumar Dwivedi
2016-11-16 17:01 ` [PATCH v4 07/10] remoteproc: qcom: Add new routine for mss restart programming Avaneesh Kumar Dwivedi
2016-11-16 17:01 ` [PATCH v4 08/10] remoteproc: qcom: Modify reset sequence for hexagon to support q6v56 Avaneesh Kumar Dwivedi
2016-11-16 17:01 ` [PATCH v4 09/10] remoteproc: qcom: Modify stop routine for q6v56 specific step Avaneesh Kumar Dwivedi
2016-11-16 17:01 ` [PATCH v4 10/10] remoteproc: qcom: Adding required initialization for q6v5 hexagon Avaneesh Kumar Dwivedi
2016-11-16 23:03 ` [PATCH v4 00/10]remoteproc: qcom: Add support to hexagon q6v56 in qcom hexagon rproc driver Stephen Boyd
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1479315696-15490-5-git-send-email-akdwived@codeaurora.org \
--to=akdwived@codeaurora.org \
--cc=agross@codeaurora.org \
--cc=bjorn.andersson@linaro.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=sboyd@codeaurora.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).