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

Commit 2a481800 authored by Julia Lawall's avatar Julia Lawall Committed by Linus Torvalds
Browse files

drivers/gpio/timbgpio.c: add missing unlock

In an error handling case the lock is not unlocked.  The return is
converted to a goto, to share the unlock at the end of the function.

A simplified version of the semantic patch that finds this problem is as
follows: (http://coccinelle.lip6.fr/

)

// <smpl>
@r exists@
expression E1;
identifier f;
@@

f (...) { <+...
* spin_lock_irqsave (E1,...);
... when != E1
* return ...;
...+> }
// </smpl>

Signed-off-by: default avatarJulia Lawall <julia@diku.dk>
Cc: <richard.rojfors@pelagicore.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent c70c036f
Loading
Loading
Loading
Loading
+8 −4
Original line number Original line Diff line number Diff line
@@ -131,6 +131,7 @@ static int timbgpio_irq_type(unsigned irq, unsigned trigger)
	unsigned long flags;
	unsigned long flags;
	u32 lvr, flr, bflr = 0;
	u32 lvr, flr, bflr = 0;
	u32 ver;
	u32 ver;
	int ret = 0;


	if (offset < 0 || offset > tgpio->gpio.ngpio)
	if (offset < 0 || offset > tgpio->gpio.ngpio)
		return -EINVAL;
		return -EINVAL;
@@ -154,8 +155,10 @@ static int timbgpio_irq_type(unsigned irq, unsigned trigger)
	}
	}


	if ((trigger & IRQ_TYPE_EDGE_BOTH) == IRQ_TYPE_EDGE_BOTH) {
	if ((trigger & IRQ_TYPE_EDGE_BOTH) == IRQ_TYPE_EDGE_BOTH) {
		if (ver < 3)
		if (ver < 3) {
			return -EINVAL;
			ret = -EINVAL;
			goto out;
		}
		else {
		else {
			flr |= 1 << offset;
			flr |= 1 << offset;
			bflr |= 1 << offset;
			bflr |= 1 << offset;
@@ -175,9 +178,10 @@ static int timbgpio_irq_type(unsigned irq, unsigned trigger)
		iowrite32(bflr, tgpio->membase + TGPIO_BFLR);
		iowrite32(bflr, tgpio->membase + TGPIO_BFLR);


	iowrite32(1 << offset, tgpio->membase + TGPIO_ICR);
	iowrite32(1 << offset, tgpio->membase + TGPIO_ICR);
	spin_unlock_irqrestore(&tgpio->lock, flags);


	return 0;
out:
	spin_unlock_irqrestore(&tgpio->lock, flags);
	return ret;
}
}


static void timbgpio_irq(unsigned int irq, struct irq_desc *desc)
static void timbgpio_irq(unsigned int irq, struct irq_desc *desc)