diff options
Diffstat (limited to 'drivers/power/da9150-charger.c')
-rw-r--r-- | drivers/power/da9150-charger.c | 80 |
1 files changed, 43 insertions, 37 deletions
diff --git a/drivers/power/da9150-charger.c b/drivers/power/da9150-charger.c index db8ba5d8d1e3..60099815296e 100644 --- a/drivers/power/da9150-charger.c +++ b/drivers/power/da9150-charger.c | |||
@@ -30,8 +30,8 @@ struct da9150_charger { | |||
30 | struct da9150 *da9150; | 30 | struct da9150 *da9150; |
31 | struct device *dev; | 31 | struct device *dev; |
32 | 32 | ||
33 | struct power_supply usb; | 33 | struct power_supply *usb; |
34 | struct power_supply battery; | 34 | struct power_supply *battery; |
35 | struct power_supply *supply_online; | 35 | struct power_supply *supply_online; |
36 | 36 | ||
37 | struct usb_phy *usb_phy; | 37 | struct usb_phy *usb_phy; |
@@ -114,7 +114,7 @@ static int da9150_charger_get_prop(struct power_supply *psy, | |||
114 | enum power_supply_property psp, | 114 | enum power_supply_property psp, |
115 | union power_supply_propval *val) | 115 | union power_supply_propval *val) |
116 | { | 116 | { |
117 | struct da9150_charger *charger = dev_get_drvdata(psy->dev->parent); | 117 | struct da9150_charger *charger = dev_get_drvdata(psy->dev.parent); |
118 | int ret; | 118 | int ret; |
119 | 119 | ||
120 | switch (psp) { | 120 | switch (psp) { |
@@ -326,7 +326,7 @@ static int da9150_charger_battery_get_prop(struct power_supply *psy, | |||
326 | enum power_supply_property psp, | 326 | enum power_supply_property psp, |
327 | union power_supply_propval *val) | 327 | union power_supply_propval *val) |
328 | { | 328 | { |
329 | struct da9150_charger *charger = dev_get_drvdata(psy->dev->parent); | 329 | struct da9150_charger *charger = dev_get_drvdata(psy->dev.parent); |
330 | int ret; | 330 | int ret; |
331 | 331 | ||
332 | switch (psp) { | 332 | switch (psp) { |
@@ -369,7 +369,7 @@ static irqreturn_t da9150_charger_chg_irq(int irq, void *data) | |||
369 | { | 369 | { |
370 | struct da9150_charger *charger = data; | 370 | struct da9150_charger *charger = data; |
371 | 371 | ||
372 | power_supply_changed(&charger->battery); | 372 | power_supply_changed(charger->battery); |
373 | 373 | ||
374 | return IRQ_HANDLED; | 374 | return IRQ_HANDLED; |
375 | } | 375 | } |
@@ -380,7 +380,7 @@ static irqreturn_t da9150_charger_tjunc_irq(int irq, void *data) | |||
380 | 380 | ||
381 | /* Nothing we can really do except report this. */ | 381 | /* Nothing we can really do except report this. */ |
382 | dev_crit(charger->dev, "TJunc over temperature!!!\n"); | 382 | dev_crit(charger->dev, "TJunc over temperature!!!\n"); |
383 | power_supply_changed(&charger->usb); | 383 | power_supply_changed(charger->usb); |
384 | 384 | ||
385 | return IRQ_HANDLED; | 385 | return IRQ_HANDLED; |
386 | } | 386 | } |
@@ -391,8 +391,8 @@ static irqreturn_t da9150_charger_vfault_irq(int irq, void *data) | |||
391 | 391 | ||
392 | /* Nothing we can really do except report this. */ | 392 | /* Nothing we can really do except report this. */ |
393 | dev_crit(charger->dev, "VSYS under voltage!!!\n"); | 393 | dev_crit(charger->dev, "VSYS under voltage!!!\n"); |
394 | power_supply_changed(&charger->usb); | 394 | power_supply_changed(charger->usb); |
395 | power_supply_changed(&charger->battery); | 395 | power_supply_changed(charger->battery); |
396 | 396 | ||
397 | return IRQ_HANDLED; | 397 | return IRQ_HANDLED; |
398 | } | 398 | } |
@@ -408,10 +408,10 @@ static irqreturn_t da9150_charger_vbus_irq(int irq, void *data) | |||
408 | switch (reg & DA9150_VBUS_STAT_MASK) { | 408 | switch (reg & DA9150_VBUS_STAT_MASK) { |
409 | case DA9150_VBUS_STAT_OFF: | 409 | case DA9150_VBUS_STAT_OFF: |
410 | case DA9150_VBUS_STAT_WAIT: | 410 | case DA9150_VBUS_STAT_WAIT: |
411 | charger->supply_online = &charger->battery; | 411 | charger->supply_online = charger->battery; |
412 | break; | 412 | break; |
413 | case DA9150_VBUS_STAT_CHG: | 413 | case DA9150_VBUS_STAT_CHG: |
414 | charger->supply_online = &charger->usb; | 414 | charger->supply_online = charger->usb; |
415 | break; | 415 | break; |
416 | default: | 416 | default: |
417 | dev_warn(charger->dev, "Unknown VBUS state - reg = 0x%x\n", | 417 | dev_warn(charger->dev, "Unknown VBUS state - reg = 0x%x\n", |
@@ -420,8 +420,8 @@ static irqreturn_t da9150_charger_vbus_irq(int irq, void *data) | |||
420 | break; | 420 | break; |
421 | } | 421 | } |
422 | 422 | ||
423 | power_supply_changed(&charger->usb); | 423 | power_supply_changed(charger->usb); |
424 | power_supply_changed(&charger->battery); | 424 | power_supply_changed(charger->battery); |
425 | 425 | ||
426 | return IRQ_HANDLED; | 426 | return IRQ_HANDLED; |
427 | } | 427 | } |
@@ -439,8 +439,8 @@ static void da9150_charger_otg_work(struct work_struct *data) | |||
439 | break; | 439 | break; |
440 | case USB_EVENT_NONE: | 440 | case USB_EVENT_NONE: |
441 | /* Revert to charge mode */ | 441 | /* Revert to charge mode */ |
442 | power_supply_changed(&charger->usb); | 442 | power_supply_changed(charger->usb); |
443 | power_supply_changed(&charger->battery); | 443 | power_supply_changed(charger->battery); |
444 | da9150_set_bits(charger->da9150, DA9150_PPR_BKCTRL_A, | 444 | da9150_set_bits(charger->da9150, DA9150_PPR_BKCTRL_A, |
445 | DA9150_VBUS_MODE_MASK, DA9150_VBUS_MODE_CHG); | 445 | DA9150_VBUS_MODE_MASK, DA9150_VBUS_MODE_CHG); |
446 | break; | 446 | break; |
@@ -499,12 +499,27 @@ static void da9150_charger_unregister_irq(struct platform_device *pdev, | |||
499 | free_irq(irq, charger); | 499 | free_irq(irq, charger); |
500 | } | 500 | } |
501 | 501 | ||
502 | static const struct power_supply_desc usb_desc = { | ||
503 | .name = "da9150-usb", | ||
504 | .type = POWER_SUPPLY_TYPE_USB, | ||
505 | .properties = da9150_charger_props, | ||
506 | .num_properties = ARRAY_SIZE(da9150_charger_props), | ||
507 | .get_property = da9150_charger_get_prop, | ||
508 | }; | ||
509 | |||
510 | static const struct power_supply_desc battery_desc = { | ||
511 | .name = "da9150-battery", | ||
512 | .type = POWER_SUPPLY_TYPE_BATTERY, | ||
513 | .properties = da9150_charger_bat_props, | ||
514 | .num_properties = ARRAY_SIZE(da9150_charger_bat_props), | ||
515 | .get_property = da9150_charger_battery_get_prop, | ||
516 | }; | ||
517 | |||
502 | static int da9150_charger_probe(struct platform_device *pdev) | 518 | static int da9150_charger_probe(struct platform_device *pdev) |
503 | { | 519 | { |
504 | struct device *dev = &pdev->dev; | 520 | struct device *dev = &pdev->dev; |
505 | struct da9150 *da9150 = dev_get_drvdata(dev->parent); | 521 | struct da9150 *da9150 = dev_get_drvdata(dev->parent); |
506 | struct da9150_charger *charger; | 522 | struct da9150_charger *charger; |
507 | struct power_supply *usb, *battery; | ||
508 | u8 reg; | 523 | u8 reg; |
509 | int ret; | 524 | int ret; |
510 | 525 | ||
@@ -542,26 +557,17 @@ static int da9150_charger_probe(struct platform_device *pdev) | |||
542 | } | 557 | } |
543 | 558 | ||
544 | /* Register power supplies */ | 559 | /* Register power supplies */ |
545 | usb = &charger->usb; | 560 | charger->usb = power_supply_register(dev, &usb_desc, NULL); |
546 | battery = &charger->battery; | 561 | if (IS_ERR(charger->usb)) { |
547 | 562 | ret = PTR_ERR(charger->usb); | |
548 | usb->name = "da9150-usb", | ||
549 | usb->type = POWER_SUPPLY_TYPE_USB; | ||
550 | usb->properties = da9150_charger_props; | ||
551 | usb->num_properties = ARRAY_SIZE(da9150_charger_props); | ||
552 | usb->get_property = da9150_charger_get_prop; | ||
553 | ret = power_supply_register(dev, usb, NULL); | ||
554 | if (ret) | ||
555 | goto usb_fail; | 563 | goto usb_fail; |
564 | } | ||
556 | 565 | ||
557 | battery->name = "da9150-battery"; | 566 | charger->battery = power_supply_register(dev, &battery_desc, NULL); |
558 | battery->type = POWER_SUPPLY_TYPE_BATTERY; | 567 | if (IS_ERR(charger->battery)) { |
559 | battery->properties = da9150_charger_bat_props; | 568 | ret = PTR_ERR(charger->battery); |
560 | battery->num_properties = ARRAY_SIZE(da9150_charger_bat_props); | ||
561 | battery->get_property = da9150_charger_battery_get_prop; | ||
562 | ret = power_supply_register(dev, battery, NULL); | ||
563 | if (ret) | ||
564 | goto battery_fail; | 569 | goto battery_fail; |
570 | } | ||
565 | 571 | ||
566 | /* Get initial online supply */ | 572 | /* Get initial online supply */ |
567 | reg = da9150_reg_read(da9150, DA9150_STATUS_H); | 573 | reg = da9150_reg_read(da9150, DA9150_STATUS_H); |
@@ -569,10 +575,10 @@ static int da9150_charger_probe(struct platform_device *pdev) | |||
569 | switch (reg & DA9150_VBUS_STAT_MASK) { | 575 | switch (reg & DA9150_VBUS_STAT_MASK) { |
570 | case DA9150_VBUS_STAT_OFF: | 576 | case DA9150_VBUS_STAT_OFF: |
571 | case DA9150_VBUS_STAT_WAIT: | 577 | case DA9150_VBUS_STAT_WAIT: |
572 | charger->supply_online = &charger->battery; | 578 | charger->supply_online = charger->battery; |
573 | break; | 579 | break; |
574 | case DA9150_VBUS_STAT_CHG: | 580 | case DA9150_VBUS_STAT_CHG: |
575 | charger->supply_online = &charger->usb; | 581 | charger->supply_online = charger->usb; |
576 | break; | 582 | break; |
577 | default: | 583 | default: |
578 | dev_warn(dev, "Unknown VBUS state - reg = 0x%x\n", reg); | 584 | dev_warn(dev, "Unknown VBUS state - reg = 0x%x\n", reg); |
@@ -622,7 +628,7 @@ chg_irq_fail: | |||
622 | if (!IS_ERR_OR_NULL(charger->usb_phy)) | 628 | if (!IS_ERR_OR_NULL(charger->usb_phy)) |
623 | usb_unregister_notifier(charger->usb_phy, &charger->otg_nb); | 629 | usb_unregister_notifier(charger->usb_phy, &charger->otg_nb); |
624 | battery_fail: | 630 | battery_fail: |
625 | power_supply_unregister(usb); | 631 | power_supply_unregister(charger->usb); |
626 | 632 | ||
627 | usb_fail: | 633 | usb_fail: |
628 | iio_channel_release(charger->vbat_chan); | 634 | iio_channel_release(charger->vbat_chan); |
@@ -661,8 +667,8 @@ static int da9150_charger_remove(struct platform_device *pdev) | |||
661 | if (!IS_ERR_OR_NULL(charger->usb_phy)) | 667 | if (!IS_ERR_OR_NULL(charger->usb_phy)) |
662 | usb_unregister_notifier(charger->usb_phy, &charger->otg_nb); | 668 | usb_unregister_notifier(charger->usb_phy, &charger->otg_nb); |
663 | 669 | ||
664 | power_supply_unregister(&charger->battery); | 670 | power_supply_unregister(charger->battery); |
665 | power_supply_unregister(&charger->usb); | 671 | power_supply_unregister(charger->usb); |
666 | 672 | ||
667 | /* Release ADC channels */ | 673 | /* Release ADC channels */ |
668 | iio_channel_release(charger->ibus_chan); | 674 | iio_channel_release(charger->ibus_chan); |