diff options
author | Jonghwa Lee <jonghwa3.lee@samsung.com> | 2014-12-19 17:55:17 +0900 |
---|---|---|
committer | Seung-Woo Kim <sw0312.kim@samsung.com> | 2016-12-14 13:40:44 +0900 |
commit | a49c1aebb45f2bedaab3747159b8ef541b46c188 (patch) | |
tree | 2c658ae81ffb6a3ed327ddf3c5fdb69bb8aac923 /drivers/power | |
parent | fec558454c8aa451ec16652fac752eee9f9ce1be (diff) |
power: charger-manager: Fix to use CHARGE_NOW/FULL property correctly.
The POWER_SUPPLY_CHARGE_NOW/FULL property reflects battery's charges
in uAh unit, but charger-manager has been used it wrongly. This patch
makes it to use those propeties correctly and change to be optional.
Signed-off-by: Jonghwa Lee <jonghwa3.lee@samsung.com>
[k.kozlowski: rebased on 4.1]
Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Diffstat (limited to 'drivers/power')
-rw-r--r-- | drivers/power/charger-manager.c | 83 |
1 files changed, 27 insertions, 56 deletions
diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c index b5071732840b..e7b6741f0127 100644 --- a/drivers/power/charger-manager.c +++ b/drivers/power/charger-manager.c @@ -814,35 +814,13 @@ static int charger_get_property(struct power_supply *psy, val->intval = 0; break; case POWER_SUPPLY_PROP_CHARGE_FULL: - if (is_full_charged(cm)) - val->intval = 1; - else - val->intval = 0; - ret = 0; - break; case POWER_SUPPLY_PROP_CHARGE_NOW: - if (is_charging(cm)) { - fuel_gauge = power_supply_get_by_name( - cm->desc->psy_fuel_gauge); - if (!fuel_gauge) { - ret = -ENODEV; - break; - } - - ret = power_supply_get_property(fuel_gauge, - POWER_SUPPLY_PROP_CHARGE_NOW, - val); - if (ret) { - val->intval = 1; - ret = 0; - } else { - /* If CHARGE_NOW is supplied, use it */ - val->intval = (val->intval > 0) ? - val->intval : 1; - } - } else { - val->intval = 0; + fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); + if (!fuel_gauge) { + ret = -ENODEV; + break; } + ret = power_supply_get_property(fuel_gauge, psp, val); break; default: return -EINVAL; @@ -852,8 +830,7 @@ static int charger_get_property(struct power_supply *psy, return ret; } -#define NUM_CHARGER_PSY_OPTIONAL (4) -static enum power_supply_property default_charger_props[] = { +static enum power_supply_property cm_default_props[] = { /* Guaranteed to provide */ POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_PROP_HEALTH, @@ -861,20 +838,21 @@ static enum power_supply_property default_charger_props[] = { POWER_SUPPLY_PROP_VOLTAGE_NOW, POWER_SUPPLY_PROP_CAPACITY, POWER_SUPPLY_PROP_ONLINE, - POWER_SUPPLY_PROP_CHARGE_FULL, POWER_SUPPLY_PROP_TEMP, - /* - * Optional properties are: - * POWER_SUPPLY_PROP_CHARGE_NOW, - * POWER_SUPPLY_PROP_CURRENT_NOW, - */ }; +static enum power_supply_property cm_optional_props[] = { + POWER_SUPPLY_PROP_CHARGE_FULL, + POWER_SUPPLY_PROP_CHARGE_NOW, + POWER_SUPPLY_PROP_CURRENT_NOW, +}; + +#define CM_NUM_OF_PROPS \ + (ARRAY_SIZE(cm_default_props) + ARRAY_SIZE(cm_optional_props)) + static const struct power_supply_desc psy_default = { .name = "battery", .type = POWER_SUPPLY_TYPE_BATTERY, - .properties = default_charger_props, - .num_properties = ARRAY_SIZE(default_charger_props), .get_property = charger_get_property, .no_thermal = true, }; @@ -1500,35 +1478,28 @@ static int charger_manager_probe(struct platform_device *pdev) /* Allocate for psy properties because they may vary */ cm->charger_psy_desc.properties = devm_kzalloc(&pdev->dev, sizeof(enum power_supply_property) - * (ARRAY_SIZE(default_charger_props) + - NUM_CHARGER_PSY_OPTIONAL), GFP_KERNEL); + * CM_NUM_OF_PROPS, GFP_KERNEL); if (!cm->charger_psy_desc.properties) return -ENOMEM; - memcpy(cm->charger_psy_desc.properties, default_charger_props, - sizeof(enum power_supply_property) * - ARRAY_SIZE(default_charger_props)); - cm->charger_psy_desc.num_properties = psy_default.num_properties; + memcpy(cm->charger_psy_desc.properties, cm_default_props, + sizeof(enum power_supply_property) * + ARRAY_SIZE(cm_default_props)); + cm->charger_psy_desc.num_properties = ARRAY_SIZE(cm_default_props); - /* Find which optional psy-properties are available */ + /* Add available optional properties */ fuel_gauge = power_supply_get_by_name(desc->psy_fuel_gauge); if (!fuel_gauge) { dev_err(&pdev->dev, "Cannot find power supply \"%s\"\n", desc->psy_fuel_gauge); return -ENODEV; } - if (!power_supply_get_property(fuel_gauge, - POWER_SUPPLY_PROP_CHARGE_NOW, &val)) { - cm->charger_psy_desc.properties[cm->charger_psy_desc.num_properties] = - POWER_SUPPLY_PROP_CHARGE_NOW; - cm->charger_psy_desc.num_properties++; - } - if (!power_supply_get_property(fuel_gauge, - POWER_SUPPLY_PROP_CURRENT_NOW, - &val)) { - cm->charger_psy_desc.properties[cm->charger_psy_desc.num_properties] = - POWER_SUPPLY_PROP_CURRENT_NOW; - cm->charger_psy_desc.num_properties++; + for (i = 0; i < ARRAY_SIZE(cm_optional_props); i++) { + if (power_supply_get_property(fuel_gauge, + cm_optional_props[i], &val)) + continue; + cm->charger_psy_desc.properties[cm->charger_psy_desc.num_properties++] = + cm_optional_props[i]; } if (desc->thermal_zone) { |