Skip to content

Commit

Permalink
mfd: twl6040: Correct Ready and Thermal interrupt handling
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Peter Ujfalusi authored and Samuel Ortiz committed Nov 13, 2012
1 parent f9be134 commit 1ac9626
Showing 1 changed file with 31 additions and 21 deletions.
52 changes: 31 additions & 21 deletions drivers/mfd/twl6040-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -193,27 +193,27 @@ static void twl6040_power_down_manual(struct twl6040 *twl6040)
twl6040_reg_write(twl6040, TWL6040_REG_LDOCTL, ldoctl);
}

static irqreturn_t twl6040_naudint_handler(int irq, void *data)
static irqreturn_t twl6040_readyint_handler(int irq, void *data)
{
struct twl6040 *twl6040 = data;
u8 intid, status;

intid = twl6040_reg_read(twl6040, TWL6040_REG_INTID);
complete(&twl6040->ready);

if (intid & TWL6040_READYINT)
complete(&twl6040->ready);
return IRQ_HANDLED;
}

if (intid & TWL6040_THINT) {
status = twl6040_reg_read(twl6040, TWL6040_REG_STATUS);
if (status & TWL6040_TSHUTDET) {
dev_warn(twl6040->dev,
"Thermal shutdown, powering-off");
twl6040_power(twl6040, 0);
} else {
dev_warn(twl6040->dev,
"Leaving thermal shutdown, powering-on");
twl6040_power(twl6040, 1);
}
static irqreturn_t twl6040_thint_handler(int irq, void *data)
{
struct twl6040 *twl6040 = data;
u8 status;

status = twl6040_reg_read(twl6040, TWL6040_REG_STATUS);
if (status & TWL6040_TSHUTDET) {
dev_warn(twl6040->dev, "Thermal shutdown, powering-off");
twl6040_power(twl6040, 0);
} else {
dev_warn(twl6040->dev, "Leaving thermal shutdown, powering-on");
twl6040_power(twl6040, 1);
}

return IRQ_HANDLED;
Expand Down Expand Up @@ -580,12 +580,19 @@ static int __devinit twl6040_probe(struct i2c_client *client,
goto irq_init_err;

ret = request_threaded_irq(twl6040->irq_base + TWL6040_IRQ_READY,
NULL, twl6040_naudint_handler, IRQF_ONESHOT,
NULL, twl6040_readyint_handler, IRQF_ONESHOT,
"twl6040_irq_ready", twl6040);
if (ret) {
dev_err(twl6040->dev, "READY IRQ request failed: %d\n",
ret);
goto irq_err;
dev_err(twl6040->dev, "READY IRQ request failed: %d\n", ret);
goto readyirq_err;
}

ret = request_threaded_irq(twl6040->irq_base + TWL6040_IRQ_TH,
NULL, twl6040_thint_handler, IRQF_ONESHOT,
"twl6040_irq_th", twl6040);
if (ret) {
dev_err(twl6040->dev, "Thermal IRQ request failed: %d\n", ret);
goto thirq_err;
}

/* dual-access registers controlled by I2C only */
Expand Down Expand Up @@ -650,8 +657,10 @@ static int __devinit twl6040_probe(struct i2c_client *client,
return 0;

mfd_err:
free_irq(twl6040->irq_base + TWL6040_IRQ_TH, twl6040);
thirq_err:
free_irq(twl6040->irq_base + TWL6040_IRQ_READY, twl6040);
irq_err:
readyirq_err:
twl6040_irq_exit(twl6040);
irq_init_err:
if (gpio_is_valid(twl6040->audpwron))
Expand All @@ -677,6 +686,7 @@ static int __devexit twl6040_remove(struct i2c_client *client)
gpio_free(twl6040->audpwron);

free_irq(twl6040->irq_base + TWL6040_IRQ_READY, twl6040);
free_irq(twl6040->irq_base + TWL6040_IRQ_TH, twl6040);
twl6040_irq_exit(twl6040);

mfd_remove_devices(&client->dev);
Expand Down

0 comments on commit 1ac9626

Please sign in to comment.