diff options
author | Todd Poynor <toddpoynor@google.com> | 2012-07-03 14:12:42 -0700 |
---|---|---|
committer | Varun Wadekar <vwadekar@nvidia.com> | 2012-07-23 14:21:13 +0530 |
commit | 5465c1ac3bbd39f2e2037227a867875762dc6113 (patch) | |
tree | 360e85f1c868be5bd83f7bd9cb2c1f4409bfab6e /drivers/power/smb347-charger.c | |
parent | 9d8f8b6f7bd77aa30db7d4c20ca884b38a792c2a (diff) |
power: smb347: Add settable current max property for mains
Change-Id: I85ff9fc07b9a9eefad40b729e27887f5a6c1cb84
Signed-off-by: Todd Poynor <toddpoynor@google.com>
Diffstat (limited to 'drivers/power/smb347-charger.c')
-rw-r--r-- | drivers/power/smb347-charger.c | 53 |
1 files changed, 50 insertions, 3 deletions
diff --git a/drivers/power/smb347-charger.c b/drivers/power/smb347-charger.c index 83b40a3ac14d..a0707e0bba62 100644 --- a/drivers/power/smb347-charger.c +++ b/drivers/power/smb347-charger.c @@ -135,6 +135,7 @@ struct smb347_charger { bool mains_online; bool usb_online; bool charging_enabled; + unsigned int mains_current_limit; struct dentry *dentry; const struct smb347_charger_platform_data *pdata; }; @@ -424,9 +425,9 @@ static int smb347_set_current_limits(struct smb347_charger *smb) if (ret < 0) return ret; - if (smb->pdata->mains_current_limit) { + if (smb->mains_current_limit) { val = current_to_hw(icl_tbl, ARRAY_SIZE(icl_tbl), - smb->pdata->mains_current_limit); + smb->mains_current_limit); if (val < 0) return val; @@ -949,15 +950,57 @@ static int smb347_mains_get_property(struct power_supply *psy, struct smb347_charger *smb = container_of(psy, struct smb347_charger, mains); - if (prop == POWER_SUPPLY_PROP_ONLINE) { + switch (prop) { + case POWER_SUPPLY_PROP_ONLINE: val->intval = smb->mains_online; return 0; + + case POWER_SUPPLY_PROP_CURRENT_MAX: + val->intval = smb->mains_current_limit; + return 0; + + default: + return -EINVAL; + } + return -EINVAL; +} + +static int smb347_mains_set_property(struct power_supply *psy, + enum power_supply_property prop, + const union power_supply_propval *val) +{ + struct smb347_charger *smb = + container_of(psy, struct smb347_charger, mains); + + switch (prop) { + case POWER_SUPPLY_PROP_CURRENT_MAX: + smb->mains_current_limit = val->intval; + smb347_hw_init(smb); + return 0; + + default: + return -EINVAL; } + return -EINVAL; } +static int smb347_mains_property_is_writeable(struct power_supply *psy, + enum power_supply_property prop) +{ + switch (prop) { + case POWER_SUPPLY_PROP_CURRENT_MAX: + return 1; + default: + break; + } + + return 0; +} + static enum power_supply_property smb347_mains_properties[] = { POWER_SUPPLY_PROP_ONLINE, + POWER_SUPPLY_PROP_CURRENT_MAX, }; static int smb347_usb_get_property(struct power_supply *psy, @@ -1181,6 +1224,8 @@ static int smb347_probe(struct i2c_client *client, smb->client = client; smb->pdata = pdata; + smb->mains_current_limit = smb->pdata->mains_current_limit; + ret = smb347_hw_init(smb); if (ret < 0) return ret; @@ -1188,6 +1233,8 @@ static int smb347_probe(struct i2c_client *client, smb->mains.name = "smb347-mains"; smb->mains.type = POWER_SUPPLY_TYPE_MAINS; smb->mains.get_property = smb347_mains_get_property; + smb->mains.set_property = smb347_mains_set_property; + smb->mains.property_is_writeable = smb347_mains_property_is_writeable; smb->mains.properties = smb347_mains_properties; smb->mains.num_properties = ARRAY_SIZE(smb347_mains_properties); smb->mains.supplied_to = battery; |