diff options
author | Jonghwa Lee <jonghwa3.lee@samsung.com> | 2014-12-19 17:55:14 +0900 |
---|---|---|
committer | Seung-Woo Kim <sw0312.kim@samsung.com> | 2016-12-14 13:40:42 +0900 |
commit | fc08fc2342d2363a0cd4f263a37ee6e35e199424 (patch) | |
tree | dae1f665554ccee864fcb443ff202078e8d7c662 /drivers/power/charger-manager.c | |
parent | 10c0eb6bf82bb0e2f30ae8be6a04c138373391e7 (diff) | |
download | linux-exynos-fc08fc2342d2363a0cd4f263a37ee6e35e199424.tar.gz linux-exynos-fc08fc2342d2363a0cd4f263a37ee6e35e199424.tar.bz2 linux-exynos-fc08fc2342d2363a0cd4f263a37ee6e35e199424.zip |
power: charger-manager: Use thermal subsystem interface only to get temperature.
It drops the way of using power_supply interface to reference battery's
temperature. Then it tries to use thermal subsystem's only. This makes driver
more simple and also can remove ifdeferies.
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/charger-manager.c')
-rw-r--r-- | drivers/power/charger-manager.c | 115 |
1 files changed, 25 insertions, 90 deletions
diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c index 0aed13f90891..aa9ec1520197 100644 --- a/drivers/power/charger-manager.c +++ b/drivers/power/charger-manager.c @@ -28,13 +28,6 @@ #include <linux/of.h> #include <linux/thermal.h> -/* - * Default termperature threshold for charging. - * Every temperature units are in tenth of centigrade. - */ -#define CM_DEFAULT_RECHARGE_TEMP_DIFF 50 -#define CM_DEFAULT_CHARGE_TEMP_MAX 500 - static const char * const default_event_names[] = { [CM_EVENT_UNKNOWN] = "Unknown", [CM_EVENT_BATT_FULL] = "Battery Full", @@ -591,44 +584,18 @@ static int check_charging_duration(struct charger_manager *cm) return ret; } -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; - - 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, int *temp) { int ret; - if (!cm->desc->measure_battery_temp) + if (!cm->tzd_batt) return -ENODEV; -#ifdef CONFIG_THERMAL - if (cm->tzd_batt) { - ret = thermal_zone_get_temp(cm->tzd_batt, (unsigned long *)temp); - if (!ret) - /* Calibrate temperature unit */ - *temp /= 100; - } else -#endif - { - /* if-else continued from CONFIG_THERMAL */ - ret = cm_get_battery_temperature_by_psy(cm, temp); - } + ret = thermal_zone_get_temp(cm->tzd_batt, (unsigned long *)temp); + if (!ret) + /* Calibrate temperature unit */ + *temp /= 100; return ret; } @@ -1031,12 +998,11 @@ static enum power_supply_property default_charger_props[] = { 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, - * POWER_SUPPLY_PROP_TEMP, and - * POWER_SUPPLY_PROP_TEMP_AMBIENT, */ }; @@ -1441,49 +1407,6 @@ err: return ret; } -static int cm_init_thermal_data(struct charger_manager *cm, - struct power_supply *fuel_gauge) -{ - struct charger_desc *desc = cm->desc; - union power_supply_propval val; - int ret; - - /* Verify whether fuel gauge provides battery temperature */ - ret = power_supply_get_property(fuel_gauge, - POWER_SUPPLY_PROP_TEMP, &val); - - if (!ret) { - cm->charger_psy_desc.properties[cm->charger_psy_desc.num_properties] = - POWER_SUPPLY_PROP_TEMP; - cm->charger_psy_desc.num_properties++; - cm->desc->measure_battery_temp = true; - } -#ifdef CONFIG_THERMAL - if (ret && desc->thermal_zone) { - cm->tzd_batt = - thermal_zone_get_zone_by_name(desc->thermal_zone); - if (IS_ERR(cm->tzd_batt)) - return PTR_ERR(cm->tzd_batt); - - /* Use external thermometer */ - cm->charger_psy_desc.properties[cm->charger_psy_desc.num_properties] = - POWER_SUPPLY_PROP_TEMP_AMBIENT; - cm->charger_psy_desc.num_properties++; - cm->desc->measure_battery_temp = true; - ret = 0; - } -#endif - if (cm->desc->measure_battery_temp) { - /* NOTICE : Default allowable minimum charge temperature is 0 */ - if (!desc->temp_max) - desc->temp_max = CM_DEFAULT_CHARGE_TEMP_MAX; - if (!desc->temp_diff) - desc->temp_diff = CM_DEFAULT_RECHARGE_TEMP_DIFF; - } - - return ret; -} - static const struct of_device_id charger_manager_match[] = { { .compatible = "charger-manager", @@ -1498,6 +1421,7 @@ static struct charger_desc *of_cm_parse_desc(struct device *dev) u32 poll_mode = CM_POLL_DISABLE; u32 battery_stat = CM_NO_BATTERY; int num_chgs = 0; + bool monitor_temp = false; desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL); if (!desc) @@ -1541,14 +1465,16 @@ static struct charger_desc *of_cm_parse_desc(struct device *dev) of_property_read_string(np, "cm-fuel-gauge", &desc->psy_fuel_gauge); - of_property_read_string(np, "cm-thermal-zone", &desc->thermal_zone); - - of_property_read_u32(np, "cm-battery-cold", &desc->temp_min); - if (of_get_property(np, "cm-battery-cold-in-minus", NULL)) - desc->temp_min *= -1; - of_property_read_u32(np, "cm-battery-hot", &desc->temp_max); + if (!of_property_read_u32(np, "cm-battery-cold", &desc->temp_min)) + monitor_temp = true; + if (!of_property_read_u32(np, "cm-battery-hot", &desc->temp_max)) + monitor_temp = true; of_property_read_u32(np, "cm-battery-temp-diff", &desc->temp_diff); + if (monitor_temp && of_property_read_string(np, + "cm-thermal-zone", &desc->thermal_zone)) + desc->thermal_zone = desc->psy_fuel_gauge; + of_property_read_u32(np, "cm-charging-max", &desc->charging_max_duration_ms); of_property_read_u32(np, "cm-discharging-max", @@ -1759,7 +1685,16 @@ static int charger_manager_probe(struct platform_device *pdev) cm->charger_psy_desc.num_properties++; } - ret = cm_init_thermal_data(cm, fuel_gauge); + if (desc->thermal_zone) { + cm->tzd_batt = + thermal_zone_get_zone_by_name(desc->thermal_zone); + if (!cm->tzd_batt) { + pr_err("Failed to get thermal zone (%s).\n", + desc->thermal_zone); + return -ENODEV; + } + } + if (ret) { dev_err(&pdev->dev, "Failed to initialize thermal data\n"); cm->desc->measure_battery_temp = false; |