diff options
| -rw-r--r-- | drivers/gpio/gpiolib.c | 9 | 
1 files changed, 4 insertions, 5 deletions
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 9568708a550b..cd003b74512f 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -704,24 +704,23 @@ static irqreturn_t lineevent_irq_thread(int irq, void *p)  {  	struct lineevent_state *le = p;  	struct gpioevent_data ge; -	int ret; +	int ret, level;  	ge.timestamp = ktime_get_real_ns(); +	level = gpiod_get_value_cansleep(le->desc);  	if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE  	    && le->eflags & GPIOEVENT_REQUEST_FALLING_EDGE) { -		int level = gpiod_get_value_cansleep(le->desc); -  		if (level)  			/* Emit low-to-high event */  			ge.id = GPIOEVENT_EVENT_RISING_EDGE;  		else  			/* Emit high-to-low event */  			ge.id = GPIOEVENT_EVENT_FALLING_EDGE; -	} else if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE) { +	} else if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE && level) {  		/* Emit low-to-high event */  		ge.id = GPIOEVENT_EVENT_RISING_EDGE; -	} else if (le->eflags & GPIOEVENT_REQUEST_FALLING_EDGE) { +	} else if (le->eflags & GPIOEVENT_REQUEST_FALLING_EDGE && !level) {  		/* Emit high-to-low event */  		ge.id = GPIOEVENT_EVENT_FALLING_EDGE;  	} else {  | 
