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

Commit 5c6ff79d authored by Roel Kluin's avatar Roel Kluin Committed by Linus Torvalds
Browse files

cris gpio: undo locks before returning



Signed-off-by: default avatarRoel Kluin <12o3l@tiscali.nl>
Cc: Mikael Starvik <starvik@axis.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 5d0360ee
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -297,8 +297,10 @@ gpio_poll(struct file *file,
		data = *R_PORT_PB_DATA;
	else if (priv->minor == GPIO_MINOR_G)
		data = *R_PORT_G_DATA;
	else
	else {
		spin_unlock(&gpio_lock);
		return 0;
	}
	
	if ((data & priv->highalarm) ||
	    (~data & priv->lowalarm)) {
@@ -381,18 +383,21 @@ static ssize_t gpio_write(struct file * file, const char * buf, size_t count,

	ssize_t retval = count;
	if (priv->minor !=GPIO_MINOR_A && priv->minor != GPIO_MINOR_B) {
		return -EFAULT;
		retval = -EFAULT;
		goto out;
	}
    
	if (!access_ok(VERIFY_READ, buf, count)) {
		return -EFAULT;
		retval = -EFAULT;
		goto out;
	}
	clk_mask = priv->clk_mask;
	data_mask = priv->data_mask;
	/* It must have been configured using the IO_CFG_WRITE_MODE */
	/* Perhaps a better error code? */
	if (clk_mask == 0 || data_mask == 0) {
		return -EPERM;
		retval = -EPERM;
		goto out;
	}
	write_msb = priv->write_msb;
	D(printk("gpio_write: %lu to data 0x%02X clk 0x%02X msb: %i\n",count, data_mask, clk_mask, write_msb));
@@ -425,6 +430,7 @@ static ssize_t gpio_write(struct file * file, const char * buf, size_t count,
			}
		}
	}
out:
	spin_unlock(&gpio_lock);
	return retval;
}
@@ -506,6 +512,7 @@ gpio_release(struct inode *inode, struct file *filp)
	while (p) {
		if (p->highalarm | p->lowalarm) {
			gpio_some_alarms = 1;
			spin_unlock(&gpio_lock);
			return 0;
		}
		p = p->next;