diff options
| author | Harry Yang <harryy@codeaurora.org> | 2016-08-10 14:21:10 -0700 |
|---|---|---|
| committer | Harry Yang <harryy@codeaurora.org> | 2016-08-17 13:21:51 -0700 |
| commit | 4d1e66e5e5a143aecfe5b1b75e578c567bf0a15f (patch) | |
| tree | 65335389fa88e6625f3121b0c50cd272ce08b485 | |
| parent | 2e45ea728118fa88ba245a0a755d0a3844d9f54e (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.c | 22 | ||||
| -rw-r--r-- | drivers/power/qcom-charger/smb-lib.h | 5 |
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 { |
