diff options
Diffstat (limited to 'drivers/mfd/twl6040-core.c')
-rw-r--r-- | drivers/mfd/twl6040-core.c | 52 |
1 files changed, 31 insertions, 21 deletions
diff --git a/drivers/mfd/twl6040-core.c b/drivers/mfd/twl6040-core.c index 6d9db275b0f1..5817bc6d09dc 100644 --- a/drivers/mfd/twl6040-core.c +++ b/drivers/mfd/twl6040-core.c | |||
@@ -193,27 +193,27 @@ static void twl6040_power_down_manual(struct twl6040 *twl6040) | |||
193 | twl6040_reg_write(twl6040, TWL6040_REG_LDOCTL, ldoctl); | 193 | twl6040_reg_write(twl6040, TWL6040_REG_LDOCTL, ldoctl); |
194 | } | 194 | } |
195 | 195 | ||
196 | static irqreturn_t twl6040_naudint_handler(int irq, void *data) | 196 | static irqreturn_t twl6040_readyint_handler(int irq, void *data) |
197 | { | 197 | { |
198 | struct twl6040 *twl6040 = data; | 198 | struct twl6040 *twl6040 = data; |
199 | u8 intid, status; | ||
200 | 199 | ||
201 | intid = twl6040_reg_read(twl6040, TWL6040_REG_INTID); | 200 | complete(&twl6040->ready); |
202 | 201 | ||
203 | if (intid & TWL6040_READYINT) | 202 | return IRQ_HANDLED; |
204 | complete(&twl6040->ready); | 203 | } |
205 | 204 | ||
206 | if (intid & TWL6040_THINT) { | 205 | static irqreturn_t twl6040_thint_handler(int irq, void *data) |
207 | status = twl6040_reg_read(twl6040, TWL6040_REG_STATUS); | 206 | { |
208 | if (status & TWL6040_TSHUTDET) { | 207 | struct twl6040 *twl6040 = data; |
209 | dev_warn(twl6040->dev, | 208 | u8 status; |
210 | "Thermal shutdown, powering-off"); | 209 | |
211 | twl6040_power(twl6040, 0); | 210 | status = twl6040_reg_read(twl6040, TWL6040_REG_STATUS); |
212 | } else { | 211 | if (status & TWL6040_TSHUTDET) { |
213 | dev_warn(twl6040->dev, | 212 | dev_warn(twl6040->dev, "Thermal shutdown, powering-off"); |
214 | "Leaving thermal shutdown, powering-on"); | 213 | twl6040_power(twl6040, 0); |
215 | twl6040_power(twl6040, 1); | 214 | } else { |
216 | } | 215 | dev_warn(twl6040->dev, "Leaving thermal shutdown, powering-on"); |
216 | twl6040_power(twl6040, 1); | ||
217 | } | 217 | } |
218 | 218 | ||
219 | return IRQ_HANDLED; | 219 | return IRQ_HANDLED; |
@@ -580,12 +580,19 @@ static int __devinit twl6040_probe(struct i2c_client *client, | |||
580 | goto irq_init_err; | 580 | goto irq_init_err; |
581 | 581 | ||
582 | ret = request_threaded_irq(twl6040->irq_base + TWL6040_IRQ_READY, | 582 | ret = request_threaded_irq(twl6040->irq_base + TWL6040_IRQ_READY, |
583 | NULL, twl6040_naudint_handler, IRQF_ONESHOT, | 583 | NULL, twl6040_readyint_handler, IRQF_ONESHOT, |
584 | "twl6040_irq_ready", twl6040); | 584 | "twl6040_irq_ready", twl6040); |
585 | if (ret) { | 585 | if (ret) { |
586 | dev_err(twl6040->dev, "READY IRQ request failed: %d\n", | 586 | dev_err(twl6040->dev, "READY IRQ request failed: %d\n", ret); |
587 | ret); | 587 | goto readyirq_err; |
588 | goto irq_err; | 588 | } |
589 | |||
590 | ret = request_threaded_irq(twl6040->irq_base + TWL6040_IRQ_TH, | ||
591 | NULL, twl6040_thint_handler, IRQF_ONESHOT, | ||
592 | "twl6040_irq_th", twl6040); | ||
593 | if (ret) { | ||
594 | dev_err(twl6040->dev, "Thermal IRQ request failed: %d\n", ret); | ||
595 | goto thirq_err; | ||
589 | } | 596 | } |
590 | 597 | ||
591 | /* dual-access registers controlled by I2C only */ | 598 | /* dual-access registers controlled by I2C only */ |
@@ -650,8 +657,10 @@ static int __devinit twl6040_probe(struct i2c_client *client, | |||
650 | return 0; | 657 | return 0; |
651 | 658 | ||
652 | mfd_err: | 659 | mfd_err: |
660 | free_irq(twl6040->irq_base + TWL6040_IRQ_TH, twl6040); | ||
661 | thirq_err: | ||
653 | free_irq(twl6040->irq_base + TWL6040_IRQ_READY, twl6040); | 662 | free_irq(twl6040->irq_base + TWL6040_IRQ_READY, twl6040); |
654 | irq_err: | 663 | readyirq_err: |
655 | twl6040_irq_exit(twl6040); | 664 | twl6040_irq_exit(twl6040); |
656 | irq_init_err: | 665 | irq_init_err: |
657 | if (gpio_is_valid(twl6040->audpwron)) | 666 | if (gpio_is_valid(twl6040->audpwron)) |
@@ -677,6 +686,7 @@ static int __devexit twl6040_remove(struct i2c_client *client) | |||
677 | gpio_free(twl6040->audpwron); | 686 | gpio_free(twl6040->audpwron); |
678 | 687 | ||
679 | free_irq(twl6040->irq_base + TWL6040_IRQ_READY, twl6040); | 688 | free_irq(twl6040->irq_base + TWL6040_IRQ_READY, twl6040); |
689 | free_irq(twl6040->irq_base + TWL6040_IRQ_TH, twl6040); | ||
680 | twl6040_irq_exit(twl6040); | 690 | twl6040_irq_exit(twl6040); |
681 | 691 | ||
682 | mfd_remove_devices(&client->dev); | 692 | mfd_remove_devices(&client->dev); |