Received: by 10.223.185.116 with SMTP id b49csp881204wrg; Sat, 10 Feb 2018 22:56:35 -0800 (PST) X-Google-Smtp-Source: AH8x227Bao9em+Fh6O+OrQ4nbM7edv2cZ3jh32dyx03ZqGm2eUx/ROPe9/VrmEffg5Oqagfk7sdE X-Received: by 2002:a17:902:c01:: with SMTP id 1-v6mr7150764pls.55.1518332195458; Sat, 10 Feb 2018 22:56:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518332195; cv=none; d=google.com; s=arc-20160816; b=jYGSIyoRPo2K/AwzLazZrQRjottdyxdJirpMlz7eaVpnuUe3fT3lyVSzH9yJeGXiHl IqFSFF2IbOp67+J0s9nYoKsCghmf3/y5/1W7wYxlfTT72qfnJXtDGv+EEGVa+r020zmk 7rh5xVy6Hwe+Ll+2VQ8DdUrt3r+AEZ/ba99MwLGXUS407cl2kk/aK8EUFJSvbe5JUW0u 6xNspRVRPlvCWtAG6VjXbOfeR5A5uSBegvkeXP8ZsbNw4OngmE0LGNeII2xqgQG4dLud SkQIpFQBuJPzCPZwAMK+6mhhGOsy/S7gy5i9MGlLyfMNOFY7lameqG2dUsUtmJNxVojW Oc0g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=tQ8sP6z9GC2+zIHcZaVMgbpRZcgIb+mPHO8lsNT9SfU=; b=FsPUN5y3UooqxLfssfS1n11fXnCduBiCGq0pvKr6NuS/9ldTy5Bsr7QaTelhoRRnrh qAXksrteTvd1dPhNtfdolZbZ4Xblycv5NeTIRoQQUdHMdhr61+dYQvkQoYevgIQfOlBU R8WpYBnjEa6hqlNIhWVBzJv46rx3hyWFGDBpR7h3iS/4kHU+DJ7JZ7vEMq5XsQ3FvX/1 l356FSJ3qDkmlj7s7oZ5Z+DG2YxDjTH33Uy7KV8FVIPJadb3j/+932YDfMCYgCmeVji1 MuWS69qQ8G/rW+XAxm8yfqQth0x5VEI9K2Hqlfbi/qhlD1THohw/WpZ1WlaQZKgezZ8g Hhkg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=dkuvnzSO; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g6-v6si4204809pln.755.2018.02.10.22.56.20; Sat, 10 Feb 2018 22:56:35 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=dkuvnzSO; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752618AbeBKGzi (ORCPT + 99 others); Sun, 11 Feb 2018 01:55:38 -0500 Received: from mail-pg0-f66.google.com ([74.125.83.66]:44902 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752224AbeBKGzg (ORCPT ); Sun, 11 Feb 2018 01:55:36 -0500 Received: by mail-pg0-f66.google.com with SMTP id j9so5128963pgp.11 for ; Sat, 10 Feb 2018 22:55:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=tQ8sP6z9GC2+zIHcZaVMgbpRZcgIb+mPHO8lsNT9SfU=; b=dkuvnzSOH6bhy+VJZnLVADOlNvamQBDhDR6Sd1fkVqnrGX2Y/7afF5oL3OVQiyjtbg 39UkVQyYMmDOLC+RnHR/IA9HajJhrLbk3OHh8hkPXQM78OAC9ZgrEorK5MBuSKJbfm+7 DISXllizkrU4yTd8ggWda+xo1ENywG/S2kBKs= 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=tQ8sP6z9GC2+zIHcZaVMgbpRZcgIb+mPHO8lsNT9SfU=; b=GVUInJAoXMsqnexvkNjjiWFCYIAnuBXmX9LfWLU5ciTX8LH+3eBjhw31Wnjw2/74xN WKLSs3ip5VM6X3NJ/X2SAQzfgKvmnWEskRmkotEoGwCb7HHCMcniYbgUXN0lZ39EdV9k L2fSDrPBYAXP+z5vIt8LH1zQ+Pj8hqqbLOPUXPndFqHN9Ugva3cA1azX4dz9nog7q/SX rHBaLCipp/V+NhM/Xxgb80CleP7aEugeDnhvp0VNZthiQRzCf/QOZHC1BhHHvDFRe/yJ VtTczIo5uFBu11lMDRAQdM300Xv+Ah35eaNHHog0zTMFJwJkrDwkeux677xk0F5Wmqet R7Pw== X-Gm-Message-State: APf1xPC6Z50QcwhQ5Pm6Lk6NuwaEYn8j4BsdNzjelQ2BrYHkqS7dvBA8 3DphnkEdrJ9CO0SGRw1Acyrmuw== X-Received: by 10.99.53.193 with SMTP id c184mr6384473pga.180.1518332135612; Sat, 10 Feb 2018 22:55:35 -0800 (PST) Received: from baolinwangubtpc.spreadtrum.com ([117.18.48.82]) by smtp.gmail.com with ESMTPSA id w70sm15936213pfa.187.2018.02.10.22.55.31 (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 10 Feb 2018 22:55:34 -0800 (PST) From: Baolin Wang To: dmitry.torokhov@gmail.com, robh+dt@kernel.org, mark.rutland@arm.com Cc: gregkh@linuxfoundation.org, lumotuwe@gmail.com, arvind.yadav.cs@gmail.com, josephl@nvidia.com, kstewart@linuxfoundation.org, pombredanne@nexb.com, tglx@linutronix.de, linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, broonie@kernel.org, linus.walleij@linaro.org, baolin.wang@linaro.org Subject: [PATCH v2] Input: gpio_keys: Add level trigger support for GPIO keys Date: Sun, 11 Feb 2018 14:55:04 +0800 Message-Id: <7fc26df245d56fd2014532b56e67630e76e2c513.1518316248.git.baolin.wang@linaro.org> X-Mailer: git-send-email 1.7.9.5 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On some platforms (such as Spreadtrum platform), the GPIO keys can only be triggered by level type. So this patch introduces one property to indicate if the GPIO trigger type is level trigger or edge trigger. Signed-off-by: Baolin Wang --- Changes since v1: - Diable the GPIO irq until reversing the GPIO level type. --- .../devicetree/bindings/input/gpio-keys.txt | 2 ++ drivers/input/keyboard/gpio_keys.c | 26 +++++++++++++++++++- include/linux/gpio_keys.h | 1 + 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/input/gpio-keys.txt b/Documentation/devicetree/bindings/input/gpio-keys.txt index a949404..e3104bd 100644 --- a/Documentation/devicetree/bindings/input/gpio-keys.txt +++ b/Documentation/devicetree/bindings/input/gpio-keys.txt @@ -29,6 +29,8 @@ Optional subnode-properties: - linux,can-disable: Boolean, indicates that button is connected to dedicated (not shared) interrupt which can be disabled to suppress events from the button. + - gpio-key,level-trigger: Boolean, indicates that button's interrupt + type is level trigger. Otherwise it is edge trigger as default. Example nodes: diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index 87e613d..218698a 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c @@ -385,6 +385,20 @@ static void gpio_keys_gpio_work_func(struct work_struct *work) struct gpio_button_data *bdata = container_of(work, struct gpio_button_data, work.work); + if (bdata->button->level_trigger) { + unsigned int trigger = + irq_get_trigger_type(bdata->irq) & ~IRQF_TRIGGER_MASK; + int state = gpiod_get_raw_value_cansleep(bdata->gpiod); + + if (state) + trigger |= IRQF_TRIGGER_LOW; + else + trigger |= IRQF_TRIGGER_HIGH; + + irq_set_irq_type(bdata->irq, trigger); + enable_irq(bdata->irq); + } + gpio_keys_gpio_report_event(bdata); if (bdata->button->wakeup) @@ -397,6 +411,9 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) BUG_ON(irq != bdata->irq); + if (bdata->button->level_trigger) + disable_irq_nosync(bdata->irq); + if (bdata->button->wakeup) { const struct gpio_keys_button *button = bdata->button; @@ -566,7 +583,11 @@ static int gpio_keys_setup_key(struct platform_device *pdev, INIT_DELAYED_WORK(&bdata->work, gpio_keys_gpio_work_func); isr = gpio_keys_gpio_isr; - irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING; + if (button->level_trigger) + irqflags = gpiod_is_active_low(bdata->gpiod) ? + IRQF_TRIGGER_LOW : IRQF_TRIGGER_HIGH; + else + irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING; } else { if (!button->irq) { @@ -721,6 +742,9 @@ static void gpio_keys_close(struct input_dev *input) button->can_disable = fwnode_property_read_bool(child, "linux,can-disable"); + button->level_trigger = + fwnode_property_read_bool(child, "gpio-key,level-trigger"); + if (fwnode_property_read_u32(child, "debounce-interval", &button->debounce_interval)) button->debounce_interval = 5; diff --git a/include/linux/gpio_keys.h b/include/linux/gpio_keys.h index d06bf77..5095645 100644 --- a/include/linux/gpio_keys.h +++ b/include/linux/gpio_keys.h @@ -28,6 +28,7 @@ struct gpio_keys_button { int wakeup; int debounce_interval; bool can_disable; + bool level_trigger; int value; unsigned int irq; }; -- 1.7.9.5