diff options
Diffstat (limited to 'drivers/gpio')
| -rw-r--r-- | drivers/gpio/gpio-mvebu.c | 2 | ||||
| -rw-r--r-- | drivers/gpio/gpiolib-sysfs.c | 10 | 
2 files changed, 9 insertions, 3 deletions
| diff --git a/drivers/gpio/gpio-mvebu.c b/drivers/gpio/gpio-mvebu.c index e338c3743562..45c65f805fd6 100644 --- a/drivers/gpio/gpio-mvebu.c +++ b/drivers/gpio/gpio-mvebu.c @@ -557,7 +557,7 @@ static void mvebu_gpio_irq_handler(struct irq_desc *desc)  	edge_cause = mvebu_gpio_read_edge_cause(mvchip);  	edge_mask  = mvebu_gpio_read_edge_mask(mvchip); -	cause = (data_in ^ level_mask) | (edge_cause & edge_mask); +	cause = (data_in & level_mask) | (edge_cause & edge_mask);  	for (i = 0; i < mvchip->chip.ngpio; i++) {  		int irq; diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c index 16fe9742597b..fc80add5fedb 100644 --- a/drivers/gpio/gpiolib-sysfs.c +++ b/drivers/gpio/gpiolib-sysfs.c @@ -2,6 +2,7 @@  #include <linux/mutex.h>  #include <linux/device.h>  #include <linux/sysfs.h> +#include <linux/gpio.h>  #include <linux/gpio/consumer.h>  #include <linux/gpio/driver.h>  #include <linux/interrupt.h> @@ -432,6 +433,11 @@ static struct attribute *gpiochip_attrs[] = {  };  ATTRIBUTE_GROUPS(gpiochip); +static struct gpio_desc *gpio_to_valid_desc(int gpio) +{ +	return gpio_is_valid(gpio) ? gpio_to_desc(gpio) : NULL; +} +  /*   * /sys/class/gpio/export ... write-only   *	integer N ... number of GPIO to export (full access) @@ -450,7 +456,7 @@ static ssize_t export_store(struct class *class,  	if (status < 0)  		goto done; -	desc = gpio_to_desc(gpio); +	desc = gpio_to_valid_desc(gpio);  	/* reject invalid GPIOs */  	if (!desc) {  		pr_warn("%s: invalid GPIO %ld\n", __func__, gpio); @@ -493,7 +499,7 @@ static ssize_t unexport_store(struct class *class,  	if (status < 0)  		goto done; -	desc = gpio_to_desc(gpio); +	desc = gpio_to_valid_desc(gpio);  	/* reject bogus commands (gpio_unexport ignores them) */  	if (!desc) {  		pr_warn("%s: invalid GPIO %ld\n", __func__, gpio); |