summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarry Yang <harryy@codeaurora.org>2016-08-10 14:21:10 -0700
committerHarry Yang <harryy@codeaurora.org>2016-08-17 13:21:51 -0700
commit4d1e66e5e5a143aecfe5b1b75e578c567bf0a15f (patch)
tree65335389fa88e6625f3121b0c50cd272ce08b485
parent2e45ea728118fa88ba245a0a755d0a3844d9f54e (diff)
qcom-charger: expand data structure smb_chg_param
Add callback function members in data structure smb_chg_param to handle data conversions other than the default provided in the existing framework. CRs-Fixed: 1052854 Change-Id: I0f4f0e1e67f3097b567db006a7826a2d1fd7c2d6 Signed-off-by: Harry Yang <harryy@codeaurora.org>
-rw-r--r--drivers/power/qcom-charger/smb-lib.c22
-rw-r--r--drivers/power/qcom-charger/smb-lib.h5
2 files changed, 21 insertions, 6 deletions
diff --git a/drivers/power/qcom-charger/smb-lib.c b/drivers/power/qcom-charger/smb-lib.c
index 18b02fbde5a6..eae00d4e1a1b 100644
--- a/drivers/power/qcom-charger/smb-lib.c
+++ b/drivers/power/qcom-charger/smb-lib.c
@@ -134,7 +134,10 @@ int smblib_get_charge_param(struct smb_charger *chg,
return rc;
}
- *val_u = val_raw * param->step_u + param->min_u;
+ if (param->get_proc)
+ *val_u = param->get_proc(param, val_raw);
+ else
+ *val_u = val_raw * param->step_u + param->min_u;
smblib_dbg(chg, PR_REGISTER, "%s = %d (0x%02x)\n",
param->name, *val_u, val_raw);
@@ -216,13 +219,20 @@ int smblib_set_charge_param(struct smb_charger *chg,
int rc = 0;
u8 val_raw;
- if (val_u > param->max_u || val_u < param->min_u) {
- dev_err(chg->dev, "%s: %d is out of range [%d, %d]\n",
- param->name, val_u, param->min_u, param->max_u);
- return -EINVAL;
+ if (param->set_proc) {
+ rc = param->set_proc(param, val_u, &val_raw);
+ if (rc < 0)
+ return -EINVAL;
+ } else {
+ if (val_u > param->max_u || val_u < param->min_u) {
+ dev_err(chg->dev, "%s: %d is out of range [%d, %d]\n",
+ param->name, val_u, param->min_u, param->max_u);
+ return -EINVAL;
+ }
+
+ val_raw = (val_u - param->min_u) / param->step_u;
}
- val_raw = (val_u - param->min_u) / param->step_u;
rc = smblib_write(chg, param->reg, val_raw);
if (rc < 0) {
dev_err(chg->dev, "%s: Couldn't write 0x%02x to 0x%04x rc=%d\n",
diff --git a/drivers/power/qcom-charger/smb-lib.h b/drivers/power/qcom-charger/smb-lib.h
index 47839074b724..12074fb5ce9d 100644
--- a/drivers/power/qcom-charger/smb-lib.h
+++ b/drivers/power/qcom-charger/smb-lib.h
@@ -56,6 +56,11 @@ struct smb_chg_param {
int min_u;
int max_u;
int step_u;
+ int (*get_proc)(struct smb_chg_param *param,
+ u8 val_raw);
+ int (*set_proc)(struct smb_chg_param *param,
+ int val_u,
+ u8 *val_raw);
};
struct smb_params {