From patchwork Sat Dec 14 09:40:11 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Frank Schaefer X-Patchwork-Id: 21118 Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1VrlhM-0006Fb-TQ; Sat, 14 Dec 2013 10:39:48 +0100 X-tubIT-Incoming-IP: 209.132.180.67 Received: from vger.kernel.org ([209.132.180.67]) by mail.tu-berlin.de (exim-4.72/mailfrontend-7) with esmtp id 1VrlhK-0000Le-0S; Sat, 14 Dec 2013 10:39:48 +0100 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752126Ab3LNJjW (ORCPT + 1 other); Sat, 14 Dec 2013 04:39:22 -0500 Received: from mail-ea0-f182.google.com ([209.85.215.182]:52577 "EHLO mail-ea0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751986Ab3LNJjU (ORCPT ); Sat, 14 Dec 2013 04:39:20 -0500 Received: by mail-ea0-f182.google.com with SMTP id a15so1294025eae.13 for ; Sat, 14 Dec 2013 01:39:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20120113; h=from:to:cc:subject:date:message-id:mime-version:content-type :content-transfer-encoding; bh=z8unNx/L00omYkBSxJNjBUPM1NDC2v1YkW+h3Uk9j7Y=; b=Dw3nLIT0s1ofOejguUV73edksakkZJbRSN2j0QIJjKWIOn6YtIPo1sacF2kgxDj/U8 uVeWUFnV0Fckzs6nKPazz4eZ+iKJLdaOatWyHCKYA+VeWRYaKXVlq/FcwWksoCWd7vXG +giFrm6eHRfCUTLbbbGTD+5HWoDjdpMo80uCpzBKnE9m6grEwfZ47U+3iOWT3PfYMYLS piWV9pAiDo5+ZAL32b/YdI/ApXZDlwdPgQwyJK6rwz0h6wMVYLblOx0ihgo6XNfj04BE 8p3iNUUKoDczbBeHzEkLTx8Wy4tmfJrE2tIFXkqqwMy2+zq2ZHi2k3tXyM8PYJrzLV/J i37g== X-Received: by 10.15.52.73 with SMTP id o49mr7140273eew.60.1387013958823; Sat, 14 Dec 2013 01:39:18 -0800 (PST) Received: from Athlon64X2-5000.site (ip-109-90-246-241.unitymediagroup.de. [109.90.246.241]) by mx.google.com with ESMTPSA id 1sm16546242eeg.4.2013.12.14.01.39.18 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 14 Dec 2013 01:39:18 -0800 (PST) From: =?UTF-8?q?Frank=20Sch=C3=A4fer?= To: m.chehab@samsung.com Cc: linux-media@vger.kernel.org, =?UTF-8?q?Frank=20Sch=C3=A4fer?= Subject: [PATCH v2] em28xx: reduce the polling interval for GPI connected buttons Date: Sat, 14 Dec 2013 10:40:11 +0100 Message-Id: <1387014011-3062-1-git-send-email-fschaefer.oss@googlemail.com> X-Mailer: git-send-email 1.7.10.4 MIME-Version: 1.0 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 6.0.0.2142326, Antispam-Engine: 2.7.2.2107409, Antispam-Data: 2013.12.14.92715 X-PMX-Spam: Gauge=IIIIIIII, Probability=8%, Report=' MULTIPLE_RCPTS 0.1, HTML_00_01 0.05, HTML_00_10 0.05, BODY_SIZE_4000_4999 0, BODY_SIZE_5000_LESS 0, BODY_SIZE_7000_LESS 0, CT_TEXT_PLAIN_UTF8_CAPS 0, DKIM_SIGNATURE 0, URI_ENDS_IN_HTML 0, __ANY_URI 0, __CP_URI_IN_BODY 0, __CT 0, __CTE 0, __CT_TEXT_PLAIN 0, __FRAUD_BODY_WEBMAIL 0, __FRAUD_WEBMAIL 0, __FRAUD_WEBMAIL_FROM 0, __HAS_FROM 0, __HAS_MSGID 0, __HAS_X_MAILER 0, __HAS_X_MAILING_LIST 0, __MIME_TEXT_ONLY 0, __MIME_VERSION 0, __MULTIPLE_RCPTS_CC_X2 0, __PHISH_SPEAR_STRUCTURE_1 0, __SANE_MSGID 0, __SUBJ_ALPHA_END 0, __TO_MALFORMED_2 0, __TO_NO_NAME 0, __URI_NO_WWW 0, __URI_NS , __YOUTUBE_RCVD 0' For GPI-connected buttons without (hardware) debouncing, the polling interval needs to be reduced to detect button presses properly. Signed-off-by: Frank Schäfer --- drivers/media/usb/em28xx/em28xx-input.c | 21 ++++++++++++++------- drivers/media/usb/em28xx/em28xx.h | 1 + 2 Dateien geändert, 15 Zeilen hinzugefügt(+), 7 Zeilen entfernt(-) diff --git a/drivers/media/usb/em28xx/em28xx-input.c b/drivers/media/usb/em28xx/em28xx-input.c index e0acc92..4ff67729 100644 --- a/drivers/media/usb/em28xx/em28xx-input.c +++ b/drivers/media/usb/em28xx/em28xx-input.c @@ -30,8 +30,9 @@ #include "em28xx.h" -#define EM28XX_SNAPSHOT_KEY KEY_CAMERA -#define EM28XX_BUTTONS_QUERY_INTERVAL 500 +#define EM28XX_SNAPSHOT_KEY KEY_CAMERA +#define EM28XX_BUTTONS_DEBOUNCED_QUERY_INTERVAL 500 /* [ms] */ +#define EM28XX_BUTTONS_VOLATILE_QUERY_INTERVAL 100 /* [ms] */ static unsigned int ir_debug; module_param(ir_debug, int, 0644); @@ -545,7 +546,7 @@ static void em28xx_query_buttons(struct work_struct *work) } /* Schedule next poll */ schedule_delayed_work(&dev->buttons_query_work, - msecs_to_jiffies(EM28XX_BUTTONS_QUERY_INTERVAL)); + msecs_to_jiffies(dev->button_polling_interval)); } static int em28xx_register_snapshot_button(struct em28xx *dev) @@ -593,6 +594,7 @@ static void em28xx_init_buttons(struct em28xx *dev) u8 i = 0, j = 0; bool addr_new = 0; + dev->button_polling_interval = EM28XX_BUTTONS_DEBOUNCED_QUERY_INTERVAL; while (dev->board.buttons[i].role >= 0 && dev->board.buttons[i].role < EM28XX_NUM_BUTTON_ROLES) { struct em28xx_button *button = &dev->board.buttons[i]; @@ -608,18 +610,18 @@ static void em28xx_init_buttons(struct em28xx *dev) if (addr_new && dev->num_button_polling_addresses >= EM28XX_NUM_BUTTON_ADDRESSES_MAX) { WARN_ONCE(1, "BUG: maximum number of button polling addresses exceeded."); - addr_new = 0; + goto next_button; } /* Button role specific checks and actions */ if (button->role == EM28XX_BUTTON_SNAPSHOT) { /* Register input device */ if (em28xx_register_snapshot_button(dev) < 0) - addr_new = 0; + goto next_button; } else if (button->role == EM28XX_BUTTON_ILLUMINATION) { /* Check sanity */ if (!em28xx_find_led(dev, EM28XX_LED_ILLUMINATION)) { em28xx_errdev("BUG: illumination button defined, but no illumination LED.\n"); - addr_new = 0; + goto next_button; } } /* Add read address to list of polling addresses */ @@ -628,6 +630,11 @@ static void em28xx_init_buttons(struct em28xx *dev) dev->button_polling_addresses[index] = button->reg_r; dev->num_button_polling_addresses++; } + /* Reduce polling interval if necessary */ + if (!button->reg_clearing) + dev->button_polling_interval = + EM28XX_BUTTONS_VOLATILE_QUERY_INTERVAL; +next_button: /* Next button */ i++; } @@ -639,7 +646,7 @@ static void em28xx_init_buttons(struct em28xx *dev) INIT_DELAYED_WORK(&dev->buttons_query_work, em28xx_query_buttons); schedule_delayed_work(&dev->buttons_query_work, - msecs_to_jiffies(EM28XX_BUTTONS_QUERY_INTERVAL)); + msecs_to_jiffies(dev->button_polling_interval)); } } diff --git a/drivers/media/usb/em28xx/em28xx.h b/drivers/media/usb/em28xx/em28xx.h index 6e26fba..27652d4 100644 --- a/drivers/media/usb/em28xx/em28xx.h +++ b/drivers/media/usb/em28xx/em28xx.h @@ -680,6 +680,7 @@ struct em28xx { u8 button_polling_addresses[EM28XX_NUM_BUTTON_ADDRESSES_MAX]; u8 button_polling_last_values[EM28XX_NUM_BUTTON_ADDRESSES_MAX]; u8 num_button_polling_addresses; + u16 button_polling_interval; /* [ms] */ /* Snapshot button input device */ char snapshot_button_path[30]; /* path of the input dev */ struct input_dev *sbutton_input_dev;