aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mfd/twl6040-core.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mfd/twl6040-core.c')
-rw-r--r--drivers/mfd/twl6040-core.c52
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
196static irqreturn_t twl6040_naudint_handler(int irq, void *data) 196static 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) { 205static 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
652mfd_err: 659mfd_err:
660 free_irq(twl6040->irq_base + TWL6040_IRQ_TH, twl6040);
661thirq_err:
653 free_irq(twl6040->irq_base + TWL6040_IRQ_READY, twl6040); 662 free_irq(twl6040->irq_base + TWL6040_IRQ_READY, twl6040);
654irq_err: 663readyirq_err:
655 twl6040_irq_exit(twl6040); 664 twl6040_irq_exit(twl6040);
656irq_init_err: 665irq_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);