From patchwork Mon Jul 3 09:12:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bartosz Golaszewski X-Patchwork-Id: 783372 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3x1LxS0Rp3z9s76 for ; Mon, 3 Jul 2017 19:12:12 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=bgdev-pl.20150623.gappssmtp.com header.i=@bgdev-pl.20150623.gappssmtp.com header.b="NGbiQEE/"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753300AbdGCJMK (ORCPT ); Mon, 3 Jul 2017 05:12:10 -0400 Received: from mail-wm0-f50.google.com ([74.125.82.50]:35238 "EHLO mail-wm0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753378AbdGCJMK (ORCPT ); Mon, 3 Jul 2017 05:12:10 -0400 Received: by mail-wm0-f50.google.com with SMTP id w126so161789279wme.0 for ; Mon, 03 Jul 2017 02:12:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bgdev-pl.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=/+YL47t9WvDOo0pgfN7a8aYXzXzWIuwuO4BHezuY1p8=; b=NGbiQEE/DwRrDw4yb0qHkeyA/4E0+Ug0p8jL5KmZV/1RFRGcG8Y+EZmVJ1GSWLdu4J +zx7KdZE+EiFEMo5WQIQrIIOvCVwzQ1EeI/8G0GsOz0O2iBLpTy9u0f7chbIMu1ZdSfK W7ph2HlWDpkFOA31E2OoM0+fgkqruZqQmqwGNC31aZJYA3lzLFl7YGA+fFZIVWF5nonX Ym+ld5XCTJnO1R6LEg1qDVoP/Qc3zGybCI86mWpt0DxPPU/Gfbj7+03BV/N+6t0cKWSz KI3MExI7kG6I4DyMlqDq8nNHdiZK9K9+D0fcbVb2MrcJAhp1fauKKopEGYxdR1pDDqra z4HQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=/+YL47t9WvDOo0pgfN7a8aYXzXzWIuwuO4BHezuY1p8=; b=VcGCgwS+sX7XeobQvIXvaYE+HFOFzEoiZwbpgCBC/SBEFo7qafjZl2HoIAl7C+eDIc 1UjTIEC/EdNh3y37CiSUR1Ff8ksSTgBP6bmhAnxA57oT+z21Hu4ErHnKF+oGaTpIyVXX iFxuxB17n1whQ5BwTnuqAtrVSFkdwcZTSK57znG9ITqvlzAfGQEXWSFIOv992wp1V4oO 7mMJRyX/pGEd8hkGvbEymgbyFvUgQH/aCuMdke+SpGcacO4oY9PUcxjcyibqOEGcWtzZ bkWLTF6AZ4CVV0JKcRZ2dx7XYUXBs8+3yUSzDDZmbFQvumXjY1uAUkDgbfEbWAiA0JwF kaoQ== X-Gm-Message-State: AKS2vOyjO9WDfwajZC9XzxM3thGTJK8ICCH1m4GMU4vG+7KdV60nTdXx L+4k983wpEaQ+lCjjGBZyQ== X-Received: by 10.28.152.87 with SMTP id a84mr10813182wme.18.1499073128670; Mon, 03 Jul 2017 02:12:08 -0700 (PDT) Received: from bgdev-debian.lan (dynamic-194-228-20-184.ipv4.broadband.iol.cz. [194.228.20.184]) by smtp.gmail.com with ESMTPSA id k75sm7134886wmh.10.2017.07.03.02.12.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 03 Jul 2017 02:12:08 -0700 (PDT) From: Bartosz Golaszewski To: Linus Walleij Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, Bartosz Golaszewski Subject: [PATCH] gpiolib: skip unwanted events, don't convert them to opposite edge Date: Mon, 3 Jul 2017 11:12:03 +0200 Message-Id: <1499073123-13393-1-git-send-email-brgl@bgdev.pl> X-Mailer: git-send-email 2.1.4 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org The previous fix for filtering out of unwatched events was not entirely correct. Instead of skipping the events we don't want, they are now interpreted as events with opposing edge. In order to fix it: always read the GPIO line value on interrupt and only emit the event if it corresponds with the event type we requested. Fixes: ad537b822577 ("gpiolib: fix filtering out unwanted events") Signed-off-by: Bartosz Golaszewski --- Hi Linus, I tested my previous fix on a real board, where I got a storm of interrupts from simply playing with a GPIO manually. It looked ok so I posted the patch, but I didn't notice that when waiting for rising-edge events, all falling-edge events got interpreted as such. This patch should actually fix this bug. Tested carefully with gpio-mockup this time. drivers/gpio/gpiolib.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index a42a1ee..2e96b3d 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 {