|
@@ -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 {
|