aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mfd/twl6040-core.c
diff options
context:
space:
mode:
authorPeter Ujfalusi <peter.ujfalusi@ti.com>2012-10-11 07:55:31 -0400
committerSamuel Ortiz <sameo@linux.intel.com>2012-11-13 13:54:22 -0500
commit1ac96265a6f35080083e85b0f58182cdc9c07d0e (patch)
tree68d4298bda44612a7ac9d4f0a588a2aa38c1b795 /drivers/mfd/twl6040-core.c
parentf9be134357c0200ce48f4cd56b4ec50d3d2e777e (diff)
mfd: twl6040: Correct Ready and Thermal interrupt handling
Create new irq handler for thermal events in order to be able to handle the event and clean up the code regarding to interrupt handling: Use proper function names for the irq handlers No need to read the INTD register anymore. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
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);