return -EINVAL;
}
+ /* In order to operate correctly we need valid interrupt config */
+ if (!pdata->naudint_irq || !pdata->irq_base) {
+ dev_err(&pdev->dev, "Invalid IRQ configuration\n");
+ return -EINVAL;
+ }
+
twl6040 = kzalloc(sizeof(struct twl6040), GFP_KERNEL);
if (!twl6040)
return -ENOMEM;
if (twl6040->rev == TWL6040_REV_ES1_0)
twl6040->audpwron = -EINVAL;
- if (twl6040->irq) {
- /* codec interrupt */
- ret = twl6040_irq_init(twl6040);
- if (ret)
- goto gpio2_err;
-
- ret = twl6040_request_irq(twl6040, TWL6040_IRQ_READY,
- twl6040_naudint_handler, 0,
- "twl6040_irq_ready", twl6040);
- if (ret) {
- dev_err(twl6040->dev, "READY IRQ request failed: %d\n",
- ret);
- goto irq_err;
- }
+ /* codec interrupt */
+ ret = twl6040_irq_init(twl6040);
+ if (ret)
+ goto gpio2_err;
+
+ ret = twl6040_request_irq(twl6040, TWL6040_IRQ_READY,
+ twl6040_naudint_handler, 0,
+ "twl6040_irq_ready", twl6040);
+ if (ret) {
+ dev_err(twl6040->dev, "READY IRQ request failed: %d\n",
+ ret);
+ goto irq_err;
}
/* dual-access registers controlled by I2C only */
return 0;
mfd_err:
- if (twl6040->irq)
- twl6040_free_irq(twl6040, TWL6040_IRQ_READY, twl6040);
+ twl6040_free_irq(twl6040, TWL6040_IRQ_READY, twl6040);
irq_err:
- if (twl6040->irq)
- twl6040_irq_exit(twl6040);
+ twl6040_irq_exit(twl6040);
gpio2_err:
if (gpio_is_valid(twl6040->audpwron))
gpio_free(twl6040->audpwron);
gpio_free(twl6040->audpwron);
twl6040_free_irq(twl6040, TWL6040_IRQ_READY, twl6040);
-
- if (twl6040->irq)
- twl6040_irq_exit(twl6040);
+ twl6040_irq_exit(twl6040);
mfd_remove_devices(&pdev->dev);
platform_set_drvdata(pdev, NULL);
twl6040->irq_masks_cache = TWL6040_ALLINT_MSK;
twl6040_reg_write(twl6040, TWL6040_REG_INTMR, TWL6040_ALLINT_MSK);
- if (!twl6040->irq) {
- dev_warn(twl6040->dev,
- "no interrupt specified, no interrupts\n");
- twl6040->irq_base = 0;
- return 0;
- }
-
- if (!twl6040->irq_base) {
- dev_err(twl6040->dev,
- "no interrupt base specified, no interrupts\n");
- return 0;
- }
-
/* Register them with genirq */
for (cur_irq = twl6040->irq_base;
cur_irq < twl6040->irq_base + ARRAY_SIZE(twl6040_irqs);
void twl6040_irq_exit(struct twl6040 *twl6040)
{
- if (twl6040->irq)
- free_irq(twl6040->irq, twl6040);
+ free_irq(twl6040->irq, twl6040);
}
EXPORT_SYMBOL(twl6040_irq_exit);