diff options
Diffstat (limited to 'drivers/power')
-rw-r--r-- | drivers/power/da9052-battery.c | 44 |
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) | |||
440 | static irqreturn_t da9052_bat_irq(int irq, void *data) | 440 | static 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 | ||
570 | static const char *const da9052_bat_irqs[] = { | 572 | static 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 | ||
581 | static 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 | |||
579 | static s32 da9052_bat_probe(struct platform_device *pdev) | 590 | static 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 | ||
625 | err: | 634 | err: |
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 | } |
633 | static int da9052_bat_remove(struct platform_device *pdev) | 641 | static 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 | ||