aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/power
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/da9052-battery.c44
1 files changed, 25 insertions, 19 deletions
diff --git a/drivers/power/da9052-battery.c b/drivers/power/da9052-battery.c
index bb0df8917adc..3c5c2e459d73 100644
--- a/drivers/power/da9052-battery.c
+++ b/drivers/power/da9052-battery.c
@@ -440,8 +440,10 @@ static int da9052_bat_check_health(struct da9052_battery *bat, int *health)
440static irqreturn_t da9052_bat_irq(int irq, void *data) 440static irqreturn_t da9052_bat_irq(int irq, void *data)
441{ 441{
442 struct da9052_battery *bat = data; 442 struct da9052_battery *bat = data;
443 int virq;
443 444
444 irq -= bat->da9052->irq_base; 445 virq = regmap_irq_get_virq(bat->da9052->irq_data, irq);
446 irq -= virq;
445 447
446 if (irq == DA9052_IRQ_CHGEND) 448 if (irq == DA9052_IRQ_CHGEND)
447 bat->status = POWER_SUPPLY_STATUS_FULL; 449 bat->status = POWER_SUPPLY_STATUS_FULL;
@@ -567,7 +569,7 @@ static struct power_supply template_battery = {
567 .get_property = da9052_bat_get_property, 569 .get_property = da9052_bat_get_property,
568}; 570};
569 571
570static const char *const da9052_bat_irqs[] = { 572static char *da9052_bat_irqs[] = {
571 "BATT TEMP", 573 "BATT TEMP",
572 "DCIN DET", 574 "DCIN DET",
573 "DCIN REM", 575 "DCIN REM",
@@ -576,12 +578,20 @@ static const char *const da9052_bat_irqs[] = {
576 "CHG END", 578 "CHG END",
577}; 579};
578 580
581static int da9052_bat_irq_bits[] = {
582 DA9052_IRQ_TBAT,
583 DA9052_IRQ_DCIN,
584 DA9052_IRQ_DCINREM,
585 DA9052_IRQ_VBUS,
586 DA9052_IRQ_VBUSREM,
587 DA9052_IRQ_CHGEND,
588};
589
579static s32 da9052_bat_probe(struct platform_device *pdev) 590static s32 da9052_bat_probe(struct platform_device *pdev)
580{ 591{
581 struct da9052_pdata *pdata; 592 struct da9052_pdata *pdata;
582 struct da9052_battery *bat; 593 struct da9052_battery *bat;
583 int ret; 594 int ret;
584 int irq;
585 int i; 595 int i;
586 596
587 bat = kzalloc(sizeof(struct da9052_battery), GFP_KERNEL); 597 bat = kzalloc(sizeof(struct da9052_battery), GFP_KERNEL);
@@ -602,15 +612,14 @@ static s32 da9052_bat_probe(struct platform_device *pdev)
602 bat->psy.use_for_apm = 1; 612 bat->psy.use_for_apm = 1;
603 613
604 for (i = 0; i < ARRAY_SIZE(da9052_bat_irqs); i++) { 614 for (i = 0; i < ARRAY_SIZE(da9052_bat_irqs); i++) {
605 irq = platform_get_irq_byname(pdev, da9052_bat_irqs[i]); 615 ret = da9052_request_irq(bat->da9052,
606 ret = request_threaded_irq(bat->da9052->irq_base + irq, 616 da9052_bat_irq_bits[i], da9052_bat_irqs[i],
607 NULL, da9052_bat_irq, 617 da9052_bat_irq, bat);
608 IRQF_TRIGGER_LOW | IRQF_ONESHOT, 618
609 da9052_bat_irqs[i], bat);
610 if (ret != 0) { 619 if (ret != 0) {
611 dev_err(bat->da9052->dev, 620 dev_err(bat->da9052->dev,
612 "DA9052 failed to request %s IRQ %d: %d\n", 621 "DA9052 failed to request %s IRQ: %d\n",
613 da9052_bat_irqs[i], irq, ret); 622 da9052_bat_irqs[i], ret);
614 goto err; 623 goto err;
615 } 624 }
616 } 625 }
@@ -623,23 +632,20 @@ static s32 da9052_bat_probe(struct platform_device *pdev)
623 return 0; 632 return 0;
624 633
625err: 634err:
626 while (--i >= 0) { 635 while (--i >= 0)
627 irq = platform_get_irq_byname(pdev, da9052_bat_irqs[i]); 636 da9052_free_irq(bat->da9052, da9052_bat_irq_bits[i], bat);
628 free_irq(bat->da9052->irq_base + irq, bat); 637
629 }
630 kfree(bat); 638 kfree(bat);
631 return ret; 639 return ret;
632} 640}
633static int da9052_bat_remove(struct platform_device *pdev) 641static int da9052_bat_remove(struct platform_device *pdev)
634{ 642{
635 int i; 643 int i;
636 int irq;
637 struct da9052_battery *bat = platform_get_drvdata(pdev); 644 struct da9052_battery *bat = platform_get_drvdata(pdev);
638 645
639 for (i = 0; i < ARRAY_SIZE(da9052_bat_irqs); i++) { 646 for (i = 0; i < ARRAY_SIZE(da9052_bat_irqs); i++)
640 irq = platform_get_irq_byname(pdev, da9052_bat_irqs[i]); 647 da9052_free_irq(bat->da9052, da9052_bat_irq_bits[i], bat);
641 free_irq(bat->da9052->irq_base + irq, bat); 648
642 }
643 power_supply_unregister(&bat->psy); 649 power_supply_unregister(&bat->psy);
644 kfree(bat); 650 kfree(bat);
645 651