summaryrefslogtreecommitdiffstats
path: root/drivers/power/da9150-charger.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/power/da9150-charger.c')
-rw-r--r--drivers/power/da9150-charger.c80
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
502static 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
510static 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
502static int da9150_charger_probe(struct platform_device *pdev) 518static 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);
624battery_fail: 630battery_fail:
625 power_supply_unregister(usb); 631 power_supply_unregister(charger->usb);
626 632
627usb_fail: 633usb_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);