Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1562e461 authored by Grygorii Strashko's avatar Grygorii Strashko Committed by Linus Walleij
Browse files

gpio: omap: fix error handling in omap_gpio_irq_type



The GPIO bank will be kept powered in case if input parameters
are invalid or error occurred in omap_gpio_irq_type.

Hence, fix it by ensuring that GPIO bank will be unpowered
in case of errors and add additional check of value returned
from omap_set_gpio_triggering().

Signed-off-by: default avatarGrygorii Strashko <grygorii.strashko@linaro.org>
Tested-by: default avatarTony Lindgren <tony@atomide.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 5f982c70
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -488,9 +488,6 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned type)
	unsigned long flags;
	unsigned offset = d->hwirq;

	if (!BANK_USED(bank))
		pm_runtime_get_sync(bank->dev);

	if (type & ~IRQ_TYPE_SENSE_MASK)
		return -EINVAL;

@@ -498,12 +495,18 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned type)
		(type & (IRQ_TYPE_LEVEL_LOW|IRQ_TYPE_LEVEL_HIGH)))
		return -EINVAL;

	if (!BANK_USED(bank))
		pm_runtime_get_sync(bank->dev);

	spin_lock_irqsave(&bank->lock, flags);
	retval = omap_set_gpio_triggering(bank, offset, type);
	if (retval)
		goto error;
	omap_gpio_init_irq(bank, offset);
	if (!omap_gpio_is_input(bank, offset)) {
		spin_unlock_irqrestore(&bank->lock, flags);
		return -EINVAL;
		retval = -EINVAL;
		goto error;
	}
	spin_unlock_irqrestore(&bank->lock, flags);

@@ -512,6 +515,11 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned type)
	else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
		__irq_set_handler_locked(d->irq, handle_edge_irq);

	return 0;

error:
	if (!BANK_USED(bank))
		pm_runtime_put(bank->dev);
	return retval;
}