diff options
author | Greg Kroah-Hartman | 2014-10-21 10:25:13 +0200 |
---|---|---|
committer | Greg Kroah-Hartman | 2014-10-21 10:25:13 +0200 |
commit | 0369a459982f58688235000fc8990b70e7553e6e (patch) | |
tree | 93e3a86ee965b7f49a1c6a322e00b00eac28c126 /drivers/staging/greybus/battery-gb.c | |
parent | greybus: battery-gb.c: fix memory leak found by Viresh (diff) | |
download | kernel-qcow2-linux-0369a459982f58688235000fc8990b70e7553e6e.tar.gz kernel-qcow2-linux-0369a459982f58688235000fc8990b70e7553e6e.tar.xz kernel-qcow2-linux-0369a459982f58688235000fc8990b70e7553e6e.zip |
greybus: battery-gb: Allow kernel values to get out of sync with greybus spec
We can't know that the greybus values and the kernel values for a number
of battery enumerated types will remain in sync. And as theses are sent
by an external device from the kernel, we have to explicitly check these
values.
Reported-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
Diffstat (limited to 'drivers/staging/greybus/battery-gb.c')
-rw-r--r-- | drivers/staging/greybus/battery-gb.c | 52 |
1 files changed, 48 insertions, 4 deletions
diff --git a/drivers/staging/greybus/battery-gb.c b/drivers/staging/greybus/battery-gb.c index fd2b86e5579c..592b68d5115a 100644 --- a/drivers/staging/greybus/battery-gb.c +++ b/drivers/staging/greybus/battery-gb.c @@ -181,10 +181,35 @@ static int get_tech(struct gb_battery *gb) return retval; /* - * We have a one-to-one mapping of tech types to power_supply - * status, so just return that value. + * Map greybus values to power_supply values. Hopefully these are + * "identical" which should allow gcc to optomize the code away to + * nothing. */ technology = le32_to_cpu(tech_request.technology); + switch (technology) { + case GB_BATTERY_TECH_NiMH: + technology = POWER_SUPPLY_TECHNOLOGY_NiMH; + break; + case GB_BATTERY_TECH_LION: + technology = POWER_SUPPLY_TECHNOLOGY_LION; + break; + case GB_BATTERY_TECH_LIPO: + technology = POWER_SUPPLY_TECHNOLOGY_LIPO; + break; + case GB_BATTERY_TECH_LiFe: + technology = POWER_SUPPLY_TECHNOLOGY_LiFe; + break; + case GB_BATTERY_TECH_NiCd: + technology = POWER_SUPPLY_TECHNOLOGY_NiCd; + break; + case GB_BATTERY_TECH_LiMn: + technology = POWER_SUPPLY_TECHNOLOGY_LiMn; + break; + case GB_BATTERY_TECH_UNKNOWN: + default: + technology = POWER_SUPPLY_TECHNOLOGY_UNKNOWN; + break; + } return technology; } @@ -200,10 +225,29 @@ static int get_status(struct gb_battery *gb) return retval; /* - * We have a one-to-one mapping of battery status to power_supply - * status, so just return that value. + * Map greybus values to power_supply values. Hopefully these are + * "identical" which should allow gcc to optomize the code away to + * nothing. */ battery_status = le16_to_cpu(status_request.battery_status); + switch (battery_status) { + case GB_BATTERY_STATUS_CHARGING: + battery_status = POWER_SUPPLY_STATUS_CHARGING; + break; + case GB_BATTERY_STATUS_DISCHARGING: + battery_status = POWER_SUPPLY_STATUS_DISCHARGING; + break; + case GB_BATTERY_STATUS_NOT_CHARGING: + battery_status = POWER_SUPPLY_STATUS_NOT_CHARGING; + break; + case GB_BATTERY_STATUS_FULL: + battery_status = POWER_SUPPLY_STATUS_FULL; + break; + case GB_BATTERY_STATUS_UNKNOWN: + default: + battery_status = POWER_SUPPLY_STATUS_UNKNOWN; + break; + } return battery_status; } |