summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonghwa Lee <jonghwa3.lee@samsung.com>2014-09-11 21:09:21 +0900
committerJonghwa Lee <jonghwa3.lee@samsung.com>2014-10-10 14:15:28 +0900
commit3a30d401fe7f2a96d29769ab35fa7f0404e65366 (patch)
tree07139ad93667f0ffc1ad591525322bd0b9053825
parentd882ae79273faf458146b26a1ec5a4da98984bf3 (diff)
downloadlinux-3.10-3a30d401fe7f2a96d29769ab35fa7f0404e65366.tar.gz
linux-3.10-3a30d401fe7f2a96d29769ab35fa7f0404e65366.tar.bz2
linux-3.10-3a30d401fe7f2a96d29769ab35fa7f0404e65366.zip
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. Change-Id: I68b3940a9388a095f47205207f1bc6bc863bd407 Signed-off-by: Jonghwa Lee <jonghwa3.lee@samsung.com>
-rw-r--r--drivers/power/charger-manager.c86
1 files changed, 34 insertions, 52 deletions
diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c
index 1917a263472..bf4919ad3ad 100644
--- a/drivers/power/charger-manager.c
+++ b/drivers/power/charger-manager.c
@@ -764,28 +764,12 @@ 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;
+ ret = cm->fuel_gauge->get_property(cm->fuel_gauge,
+ POWER_SUPPLY_PROP_CHARGE_FULL, val);
break;
case POWER_SUPPLY_PROP_CHARGE_NOW:
- if (is_charging(cm)) {
- ret = cm->fuel_gauge->get_property(cm->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;
- }
+ ret = cm->fuel_gauge->get_property(cm->fuel_gauge,
+ POWER_SUPPLY_PROP_CHARGE_NOW, val);
break;
default:
return -EINVAL;
@@ -793,8 +777,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,
@@ -802,20 +785,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 struct power_supply 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,
};
@@ -1328,6 +1312,18 @@ static inline struct charger_desc *cm_get_drv_data(struct platform_device *pdev)
return (struct charger_desc *)dev_get_platdata(&pdev->dev);
}
+static void cm_add_optional_property(struct charger_manager *cm,
+ enum power_supply_property psp)
+{
+ union power_supply_propval val;
+
+ if (cm->fuel_gauge->get_property(cm->fuel_gauge, psp, &val))
+ return;
+
+ cm->charger_psy.properties[cm->charger_psy.num_properties] = psp;
+ cm->charger_psy.num_properties++;
+}
+
static enum alarmtimer_restart cm_timer_func(struct alarm *alarm, ktime_t now)
{
cm_timer_set = false;
@@ -1340,7 +1336,6 @@ static int charger_manager_probe(struct platform_device *pdev)
struct charger_manager *cm;
int ret = 0, i = 0;
int j = 0;
- union power_supply_propval val;
if (!desc) {
dev_err(&pdev->dev, "No platform data (desc) found\n");
@@ -1442,30 +1437,17 @@ static int charger_manager_probe(struct platform_device *pdev)
/* Allocate for psy properties because they may vary */
cm->charger_psy.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.properties)
return -ENOMEM;
- memcpy(cm->charger_psy.properties, default_charger_props,
- sizeof(enum power_supply_property) *
- ARRAY_SIZE(default_charger_props));
- cm->charger_psy.num_properties = psy_default.num_properties;
-
- /* Find which optional psy-properties are available */
- if (!cm->fuel_gauge->get_property(cm->fuel_gauge,
- POWER_SUPPLY_PROP_CHARGE_NOW, &val)) {
- cm->charger_psy.properties[cm->charger_psy.num_properties] =
- POWER_SUPPLY_PROP_CHARGE_NOW;
- cm->charger_psy.num_properties++;
- }
- if (!cm->fuel_gauge->get_property(cm->fuel_gauge,
- POWER_SUPPLY_PROP_CURRENT_NOW,
- &val)) {
- cm->charger_psy.properties[cm->charger_psy.num_properties] =
- POWER_SUPPLY_PROP_CURRENT_NOW;
- cm->charger_psy.num_properties++;
- }
+ memcpy(cm->charger_psy.properties, cm_default_props,
+ sizeof(enum power_supply_property) *
+ ARRAY_SIZE(cm_default_props));
+ cm->charger_psy.num_properties = ARRAY_SIZE(cm_default_props);
+
+ for (i = 0; i < ARRAY_SIZE(cm_optional_props); i++)
+ cm_add_optional_property(cm, cm_optional_props[i]);
if (desc->thermal_zone)
cm->tzd_batt =