summaryrefslogtreecommitdiff
path: root/drivers/power/smb347-charger.c
diff options
context:
space:
mode:
authorTodd Poynor <toddpoynor@google.com>2012-07-03 14:12:42 -0700
committerVarun Wadekar <vwadekar@nvidia.com>2012-07-23 14:21:13 +0530
commit5465c1ac3bbd39f2e2037227a867875762dc6113 (patch)
tree360e85f1c868be5bd83f7bd9cb2c1f4409bfab6e /drivers/power/smb347-charger.c
parent9d8f8b6f7bd77aa30db7d4c20ca884b38a792c2a (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.c53
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;