summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFernando Guzman Lugo <fernando.lugo@ti.com>2012-06-12 15:15:35 -0500
committerXavier Boudet <x-boudet@ti.com>2012-07-10 17:26:51 +0200
commit003f4dda6921110547502639f56ec7b1c792b7e2 (patch)
tree58c154f82447d5e0d9548ad6c6ac3212a42ea9b5
parentb33cbc91eda54b819df215a4283ab30a4796fe40 (diff)
rpmsg: resmgr: omap: request regulator based on ids
There can be any number of different regulators that needs to be controlled from the remote processor and these are specific to each board. The corresponding mach layer provides a new op to get the desired regulator data, and this can looked up using a platform agnostic id. The specific rprm regulator data has provision to identify whether a regulator voltage is fixed or variable, and this info is used accordingly in calling the regulator_set_voltage API. Change-Id: I335fdc66eae1c4b2318074ec09d7d3441ad237b3 Signed-off-by: Fernando Guzman Lugo <fernando.lugo@ti.com> Signed-off-by: Subramaniam Chanderashekarapuram <subramaniam.ca@ti.com> Signed-off-by: Suman Anna <s-anna@ti.com>
-rw-r--r--drivers/rpmsg/omap_rpmsg_resmgr.c63
-rw-r--r--drivers/rpmsg/omap_rpmsg_resmgr.h4
2 files changed, 47 insertions, 20 deletions
diff --git a/drivers/rpmsg/omap_rpmsg_resmgr.c b/drivers/rpmsg/omap_rpmsg_resmgr.c
index 38046d0b7a0c..ddf0bc15e4cd 100644
--- a/drivers/rpmsg/omap_rpmsg_resmgr.c
+++ b/drivers/rpmsg/omap_rpmsg_resmgr.c
@@ -46,6 +46,7 @@ struct rprm_auxclk_depot {
struct rprm_regulator_depot {
struct rprm_regulator args;
struct regulator *reg_p;
+ struct omap_rprm_regulator *oreg;
u32 orig_uv;
};
@@ -312,12 +313,24 @@ static int rprm_regulator_request(void **handle, void *data, size_t len)
int ret;
struct rprm_regulator *reg = data;
struct rprm_regulator_depot *rd;
+ struct omap_rprm_regulator *oreg;
if (len != sizeof *reg) {
pr_err("error requesting regulator - invalid length\n");
return -EINVAL;
}
+ if (!mach_ops || !mach_ops->lookup_regulator) {
+ pr_err("error requesting regulator - invalid ops\n");
+ return -ENOSYS;
+ }
+
+ oreg = mach_ops->lookup_regulator(reg->reg_id);
+ if (!oreg) {
+ pr_err("regulator lookup failed, id %d\n", reg->reg_id);
+ return -EINVAL;
+ }
+
/* create regulator depot */
rd = kzalloc(sizeof *rd, GFP_KERNEL);
if (!rd) {
@@ -325,25 +338,35 @@ static int rprm_regulator_request(void **handle, void *data, size_t len)
return -ENOMEM;
}
- /* make sure name is NULL terminated */
- reg->name[sizeof reg->name - 1] = '\0';
- rd->reg_p = regulator_get_exclusive(NULL, reg->name);
+ rd->oreg = oreg;
+ rd->reg_p = regulator_get_exclusive(NULL, oreg->name);
if (IS_ERR_OR_NULL(rd->reg_p)) {
- pr_err("error providing regulator %s\n", reg->name);
+ pr_err("error providing regulator %s\n", oreg->name);
ret = -EINVAL;
goto error;
}
rd->orig_uv = regulator_get_voltage(rd->reg_p);
- ret = regulator_set_voltage(rd->reg_p, reg->min_uv, reg->max_uv);
- if (ret) {
- pr_err("error setting %s voltage\n", reg->name);
- goto error_reg;
+
+ /* if regulator is not fixed, set voltage as requested */
+ if (!oreg->fixed) {
+ ret = regulator_set_voltage(rd->reg_p,
+ reg->min_uv, reg->max_uv);
+ if (ret) {
+ pr_err("error setting %s voltage\n", oreg->name);
+ goto error_reg;
+ }
+ } else {
+ /*
+ * if regulator is fixed update paramaters so that rproc
+ * can get the real voltage the regulator was set
+ */
+ reg->min_uv = reg->max_uv = rd->orig_uv;
}
ret = regulator_enable(rd->reg_p);
if (ret) {
- pr_err("error enabling %s ldo regulator\n", reg->name);
+ pr_err("error enabling %s ldo regulator\n", oreg->name);
goto error_enable;
}
@@ -353,8 +376,9 @@ static int rprm_regulator_request(void **handle, void *data, size_t len)
return 0;
error_enable:
- /* restore original voltage */
- regulator_set_voltage(rd->reg_p, rd->orig_uv, rd->orig_uv);
+ /* restore original voltage if not fixed*/
+ if (!oreg->fixed)
+ regulator_set_voltage(rd->reg_p, rd->orig_uv, rd->orig_uv);
error_reg:
regulator_put(rd->reg_p);
error:
@@ -370,15 +394,18 @@ static int rprm_regulator_release(void *handle)
ret = regulator_disable(rd->reg_p);
if (ret) {
- pr_err("error disabling regulator %s\n", rd->args.name);
+ pr_err("error disabling regulator %s\n", rd->oreg->name);
return ret;
}
- /* restore orginal voltage */
- ret = regulator_set_voltage(rd->reg_p, rd->orig_uv, rd->orig_uv);
- if (ret) {
- pr_err("error restoring voltage %u\n", rd->orig_uv);
- return ret;
+ /* restore original voltage if not fixed */
+ if (!rd->oreg->fixed) {
+ ret = regulator_set_voltage(rd->reg_p,
+ rd->orig_uv, rd->orig_uv);
+ if (ret) {
+ pr_err("error restoring voltage %u\n", rd->orig_uv);
+ return ret;
+ }
}
regulator_put(rd->reg_p);
@@ -408,7 +435,7 @@ static int rprm_regulator_get_info(void *handle, char *buf, size_t len)
"min_uV:%d\n"
"max_uV:%d\n"
"orig_uV:%d\n",
- reg->name, reg->min_uv, reg->max_uv, rd->orig_uv);
+ rd->oreg->name, reg->min_uv, reg->max_uv, rd->orig_uv);
}
static int
diff --git a/drivers/rpmsg/omap_rpmsg_resmgr.h b/drivers/rpmsg/omap_rpmsg_resmgr.h
index 7fe2d5cf7184..2b8dc974e6a4 100644
--- a/drivers/rpmsg/omap_rpmsg_resmgr.h
+++ b/drivers/rpmsg/omap_rpmsg_resmgr.h
@@ -70,12 +70,12 @@ struct rprm_auxclk {
/**
* struct rprm_regulator - resource manager parameters for regulator
- * @name: name of the regulator
+ * @reg_id: regulator id
* @min_uv minimum voltage in micro volts
* @max_uv maximum voltage in micro volts
*/
struct rprm_regulator {
- char name[16];
+ u32 reg_id;
u32 min_uv;
u32 max_uv;
} __packed;