diff options
author | Wenyou Yang <wenyou.yang@atmel.com> | 2016-08-25 03:19:54 -0400 |
---|---|---|
committer | Sebastian Reichel <sre@kernel.org> | 2016-08-31 10:47:01 -0400 |
commit | 10ca08b07bc572ff39bd95148085994e9958b10b (patch) | |
tree | f2db0fb11afeddb6edb19cd055517d1bca7ea9e2 /drivers/power | |
parent | a09209acd6a808794bdd7866af3678d1fd1d90e7 (diff) |
power: supply: act8945a_charger: Fix the power supply type
The power supply type property is varying as the external power
supply changes. It is not a constant.
Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
Signed-off-by: Sebastian Reichel <sre@kernel.org>
Diffstat (limited to 'drivers/power')
-rw-r--r-- | drivers/power/supply/act8945a_charger.c | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/drivers/power/supply/act8945a_charger.c b/drivers/power/supply/act8945a_charger.c index e129255c1e0d..48775f8233f3 100644 --- a/drivers/power/supply/act8945a_charger.c +++ b/drivers/power/supply/act8945a_charger.c | |||
@@ -78,6 +78,7 @@ static const char *act8945a_charger_manufacturer = "Active-semi"; | |||
78 | 78 | ||
79 | struct act8945a_charger { | 79 | struct act8945a_charger { |
80 | struct power_supply *psy; | 80 | struct power_supply *psy; |
81 | struct power_supply_desc desc; | ||
81 | struct regmap *regmap; | 82 | struct regmap *regmap; |
82 | struct work_struct work; | 83 | struct work_struct work; |
83 | 84 | ||
@@ -250,14 +251,6 @@ static int act8945a_charger_get_property(struct power_supply *psy, | |||
250 | return ret; | 251 | return ret; |
251 | } | 252 | } |
252 | 253 | ||
253 | static const struct power_supply_desc act8945a_charger_desc = { | ||
254 | .name = "act8945a-charger", | ||
255 | .type = POWER_SUPPLY_TYPE_BATTERY, | ||
256 | .get_property = act8945a_charger_get_property, | ||
257 | .properties = act8945a_charger_props, | ||
258 | .num_properties = ARRAY_SIZE(act8945a_charger_props), | ||
259 | }; | ||
260 | |||
261 | static int act8945a_enable_interrupt(struct act8945a_charger *charger) | 254 | static int act8945a_enable_interrupt(struct act8945a_charger *charger) |
262 | { | 255 | { |
263 | struct regmap *regmap = charger->regmap; | 256 | struct regmap *regmap = charger->regmap; |
@@ -281,11 +274,39 @@ static int act8945a_enable_interrupt(struct act8945a_charger *charger) | |||
281 | return 0; | 274 | return 0; |
282 | } | 275 | } |
283 | 276 | ||
277 | static unsigned int act8945a_set_supply_type(struct act8945a_charger *charger, | ||
278 | unsigned int *type) | ||
279 | { | ||
280 | unsigned int status, state; | ||
281 | int ret; | ||
282 | |||
283 | ret = regmap_read(charger->regmap, ACT8945A_APCH_STATUS, &status); | ||
284 | if (ret < 0) | ||
285 | return ret; | ||
286 | |||
287 | ret = regmap_read(charger->regmap, ACT8945A_APCH_STATE, &state); | ||
288 | if (ret < 0) | ||
289 | return ret; | ||
290 | |||
291 | if (status & APCH_STATUS_INDAT) { | ||
292 | if (state & APCH_STATE_ACINSTAT) | ||
293 | *type = POWER_SUPPLY_TYPE_MAINS; | ||
294 | else | ||
295 | *type = POWER_SUPPLY_TYPE_USB; | ||
296 | } else { | ||
297 | *type = POWER_SUPPLY_TYPE_BATTERY; | ||
298 | } | ||
299 | |||
300 | return 0; | ||
301 | } | ||
302 | |||
284 | static void act8945a_work(struct work_struct *work) | 303 | static void act8945a_work(struct work_struct *work) |
285 | { | 304 | { |
286 | struct act8945a_charger *charger = | 305 | struct act8945a_charger *charger = |
287 | container_of(work, struct act8945a_charger, work); | 306 | container_of(work, struct act8945a_charger, work); |
288 | 307 | ||
308 | act8945a_set_supply_type(charger, &charger->desc.type); | ||
309 | |||
289 | power_supply_changed(charger->psy); | 310 | power_supply_changed(charger->psy); |
290 | } | 311 | } |
291 | 312 | ||
@@ -440,11 +461,20 @@ static int act8945a_charger_probe(struct platform_device *pdev) | |||
440 | return ret; | 461 | return ret; |
441 | } | 462 | } |
442 | 463 | ||
464 | charger->desc.name = "act8945a-charger"; | ||
465 | charger->desc.get_property = act8945a_charger_get_property; | ||
466 | charger->desc.properties = act8945a_charger_props; | ||
467 | charger->desc.num_properties = ARRAY_SIZE(act8945a_charger_props); | ||
468 | |||
469 | ret = act8945a_set_supply_type(charger, &charger->desc.type); | ||
470 | if (ret) | ||
471 | return -EINVAL; | ||
472 | |||
443 | psy_cfg.of_node = pdev->dev.of_node; | 473 | psy_cfg.of_node = pdev->dev.of_node; |
444 | psy_cfg.drv_data = charger; | 474 | psy_cfg.drv_data = charger; |
445 | 475 | ||
446 | charger->psy = devm_power_supply_register(&pdev->dev, | 476 | charger->psy = devm_power_supply_register(&pdev->dev, |
447 | &act8945a_charger_desc, | 477 | &charger->desc, |
448 | &psy_cfg); | 478 | &psy_cfg); |
449 | if (IS_ERR(charger->psy)) { | 479 | if (IS_ERR(charger->psy)) { |
450 | dev_err(&pdev->dev, "failed to register power supply\n"); | 480 | dev_err(&pdev->dev, "failed to register power supply\n"); |