lkml.org 
[lkml]   [2015]   [Feb]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 14/20] power_supply: charger-manager: Decrement the power supply's device reference counter
    Date
    Use power_supply_put() to decrement the power supply's device reference
    counter.

    Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
    Acked-by: Pavel Machek <pavel@ucw.cz>
    Reviewed-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
    Reviewed-by: Sebastian Reichel <sre@kernel.org>
    ---
    drivers/power/charger-manager.c | 70 +++++++++++++++++++++++++++--------------
    1 file changed, 47 insertions(+), 23 deletions(-)

    diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c
    index 5c47409c6889..e23b7ba2cbd2 100644
    --- a/drivers/power/charger-manager.c
    +++ b/drivers/power/charger-manager.c
    @@ -107,6 +107,7 @@ static bool is_batt_present(struct charger_manager *cm)
    &val);
    if (ret == 0 && val.intval)
    present = true;
    + power_supply_put(psy);
    break;
    case CM_CHARGER_STAT:
    for (i = 0; cm->desc->psy_charger_stat[i]; i++) {
    @@ -120,6 +121,7 @@ static bool is_batt_present(struct charger_manager *cm)

    ret = power_supply_get_property(psy,
    POWER_SUPPLY_PROP_PRESENT, &val);
    + power_supply_put(psy);
    if (ret == 0 && val.intval) {
    present = true;
    break;
    @@ -157,6 +159,7 @@ static bool is_ext_pwr_online(struct charger_manager *cm)

    ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_ONLINE,
    &val);
    + power_supply_put(psy);
    if (ret == 0 && val.intval) {
    online = true;
    break;
    @@ -186,6 +189,7 @@ static int get_batt_uV(struct charger_manager *cm, int *uV)

    ret = power_supply_get_property(fuel_gauge,
    POWER_SUPPLY_PROP_VOLTAGE_NOW, &val);
    + power_supply_put(fuel_gauge);
    if (ret)
    return ret;

    @@ -229,10 +233,13 @@ static bool is_charging(struct charger_manager *cm)
    if (ret) {
    dev_warn(cm->dev, "Cannot read ONLINE value from %s\n",
    cm->desc->psy_charger_stat[i]);
    + power_supply_put(psy);
    continue;
    }
    - if (val.intval == 0)
    + if (val.intval == 0) {
    + power_supply_put(psy);
    continue;
    + }

    /*
    * 3. The charger should not be FULL, DISCHARGING,
    @@ -240,6 +247,7 @@ static bool is_charging(struct charger_manager *cm)
    */
    ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_STATUS,
    &val);
    + power_supply_put(psy);
    if (ret) {
    dev_warn(cm->dev, "Cannot read STATUS value from %s\n",
    cm->desc->psy_charger_stat[i]);
    @@ -267,6 +275,7 @@ static bool is_full_charged(struct charger_manager *cm)
    struct charger_desc *desc = cm->desc;
    union power_supply_propval val;
    struct power_supply *fuel_gauge;
    + bool is_full = false;
    int ret = 0;
    int uV;

    @@ -284,15 +293,19 @@ static bool is_full_charged(struct charger_manager *cm)
    /* Not full if capacity of fuel gauge isn't full */
    ret = power_supply_get_property(fuel_gauge,
    POWER_SUPPLY_PROP_CHARGE_FULL, &val);
    - if (!ret && val.intval > desc->fullbatt_full_capacity)
    - return true;
    + if (!ret && val.intval > desc->fullbatt_full_capacity) {
    + is_full = true;
    + goto out;
    + }
    }

    /* Full, if it's over the fullbatt voltage */
    if (desc->fullbatt_uV > 0) {
    ret = get_batt_uV(cm, &uV);
    - if (!ret && uV >= desc->fullbatt_uV)
    - return true;
    + if (!ret && uV >= desc->fullbatt_uV) {
    + is_full = true;
    + goto out;
    + }
    }

    /* Full, if the capacity is more than fullbatt_soc */
    @@ -301,11 +314,15 @@ static bool is_full_charged(struct charger_manager *cm)

    ret = power_supply_get_property(fuel_gauge,
    POWER_SUPPLY_PROP_CAPACITY, &val);
    - if (!ret && val.intval >= desc->fullbatt_soc)
    - return true;
    + if (!ret && val.intval >= desc->fullbatt_soc) {
    + is_full = true;
    + goto out;
    + }
    }

    - return false;
    +out:
    + power_supply_put(fuel_gauge);
    + return is_full;
    }

    /**
    @@ -578,14 +595,18 @@ static int cm_get_battery_temperature_by_psy(struct charger_manager *cm,
    int *temp)
    {
    struct power_supply *fuel_gauge;
    + int ret;

    fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
    if (!fuel_gauge)
    return -ENODEV;

    - return power_supply_get_property(fuel_gauge,
    + ret = power_supply_get_property(fuel_gauge,
    POWER_SUPPLY_PROP_TEMP,
    (union power_supply_propval *)temp);
    + power_supply_put(fuel_gauge);
    +
    + return ret;
    }

    static int cm_get_battery_temperature(struct charger_manager *cm,
    @@ -866,7 +887,7 @@ static int charger_get_property(struct power_supply *psy,
    {
    struct charger_manager *cm = power_supply_get_drvdata(psy);
    struct charger_desc *desc = cm->desc;
    - struct power_supply *fuel_gauge;
    + struct power_supply *fuel_gauge = NULL;
    int ret = 0;
    int uV;

    @@ -909,18 +930,18 @@ static int charger_get_property(struct power_supply *psy,
    case POWER_SUPPLY_PROP_TEMP_AMBIENT:
    return cm_get_battery_temperature(cm, &val->intval);
    case POWER_SUPPLY_PROP_CAPACITY:
    - fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
    - if (!fuel_gauge) {
    - ret = -ENODEV;
    - break;
    - }
    -
    if (!is_batt_present(cm)) {
    /* There is no battery. Assume 100% */
    val->intval = 100;
    break;
    }

    + 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_CAPACITY, val);
    if (ret)
    @@ -995,6 +1016,8 @@ static int charger_get_property(struct power_supply *psy,
    default:
    return -EINVAL;
    }
    + if (fuel_gauge)
    + power_supply_put(fuel_gauge);
    return ret;
    }

    @@ -1676,13 +1699,7 @@ static int charger_manager_probe(struct platform_device *pdev)
    desc->psy_charger_stat[i]);
    return -ENODEV;
    }
    - }
    -
    - 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;
    + power_supply_put(psy);
    }

    if (desc->polling_interval_ms == 0 ||
    @@ -1722,6 +1739,12 @@ static int charger_manager_probe(struct platform_device *pdev)
    cm->charger_psy_desc.num_properties = psy_default.num_properties;

    /* Find which optional psy-properties are available */
    + 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] =
    @@ -1741,6 +1764,7 @@ static int charger_manager_probe(struct platform_device *pdev)
    dev_err(&pdev->dev, "Failed to initialize thermal data\n");
    cm->desc->measure_battery_temp = false;
    }
    + power_supply_put(fuel_gauge);

    INIT_DELAYED_WORK(&cm->fullbatt_vchk_work, fullbatt_vchk);

    --
    1.9.1


    \
     
     \ /
      Last update: 2015-02-23 13:01    [W:5.856 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site