Received: by 10.223.185.116 with SMTP id b49csp3456489wrg; Tue, 13 Feb 2018 02:41:55 -0800 (PST) X-Google-Smtp-Source: AH8x227W+2c59jojKplFL7LwqaPhTcwbQbL5DWp29iS+fQZsfqWYgscMsLvKpCJySF30tanXbK39 X-Received: by 2002:a17:902:7290:: with SMTP id d16-v6mr717661pll.303.1518518515095; Tue, 13 Feb 2018 02:41:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518518515; cv=none; d=google.com; s=arc-20160816; b=ZdKHltEYxzFEM4Y0avLyNK2IBXRmyVu33dggh3MXVPyBmLmHuDrIfnp9Dy0OA1z2U6 Bqh0d+AA8H9BwLIovaraxEKBJoMFySL6VJlF2whN/22pvhfQE6/vWw3liFEEKLiXJPB+ GlFGoBzAOHQLr/lSYZCNdOKWWnSqoeqlZAGo6Fd0KfayQMrJLIG+2jYZnCCd1X57Eias aaiRpL93TKLQF0fq/29eQKmJzmKRLs/jyOYJyLlUeR/IoXHBEdkMDxcQxIjUWZWWpqzB c58V2STqc2aCXa0xdmlPfMoqsK7dPEhISiYb0h1ABKc6PbanOrIVFmS2gWPelsZtD2hl kWtA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:arc-authentication-results; bh=a9bcCMO9xa7t910zJ98BW6UYW7KC3t7BMmIJ+RUrUK4=; b=aR4aoyQmRlPJt9LG3QHPBbndum+TUDqaq832xA1Vv01oWUroMXWgPivG8L4CDbP2Cr ZlXm6zlHG4idk7Se4hr9DSwxvF6a0cWNMZuKnbDeGDkZXU5PVYK4xGqMUTFpXDUPONZp xmUlxrcnBZbJChYcpfWeuUSaUIUnnxcGAfFEIuH77qQ63AXp1wokLvHLrzCYwZHWclQk Vd2I9ukmKmqaoC2//eVSCXJmKcgP1eqEp/5O3LhARHQjfeMThXjWCjKBV0hRru3l+xsb KmAOGtGFlSbPvPFX+jQwSwpxXUOQ2PCAKIshnC6JXKVUMNV9LzAcmKj7CM0+Ne3NInaz Cppw== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o12-v6si1128457plg.607.2018.02.13.02.41.39; Tue, 13 Feb 2018 02:41:55 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934167AbeBMKkz (ORCPT + 99 others); Tue, 13 Feb 2018 05:40:55 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:43900 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934011AbeBMKkt (ORCPT ); Tue, 13 Feb 2018 05:40:49 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: eballetbo) with ESMTPSA id 3ACC4276466 Subject: Re: [PATCH v2 1/3] Input: gpio-keys - add support for wakeup event action To: Brian Norris , Jeffy Chen Cc: linux-kernel@vger.kernel.org, briannorris@google.com, dtor@google.com, dianders@google.com, Thomas Gleixner , Joseph Lo , stephen lu , Dmitry Torokhov , Kate Stewart , linux-input@vger.kernel.org, Greg Kroah-Hartman , Philippe Ombredanne , Arvind Yadav References: <20180210110907.5504-1-jeffy.chen@rock-chips.com> <20180210110907.5504-2-jeffy.chen@rock-chips.com> <20180212221309.GA66974@ban.mtv.corp.google.com> From: Enric Balletbo i Serra Message-ID: <059e2aa9-bf94-517d-a132-abe851ec69f7@collabora.com> Date: Tue, 13 Feb 2018 11:40:44 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: <20180212221309.GA66974@ban.mtv.corp.google.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-GB Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Jeffy, On 12/02/18 23:13, Brian Norris wrote: > Hi Jeffy, > > On Sat, Feb 10, 2018 at 07:09:05PM +0800, Jeffy Chen wrote: >> Add support for specifying event actions to trigger wakeup when using >> the gpio-keys input device as a wakeup source. >> >> This would allow the device to configure when to wakeup the system. For >> example a gpio-keys input device for pen insert, may only want to wakeup >> the system when ejecting the pen. >> >> Suggested-by: Brian Norris >> Signed-off-by: Jeffy Chen >> --- >> >> Changes in v2: >> Specify wakeup event action instead of irq trigger type as Brian >> suggested. >> >> drivers/input/keyboard/gpio_keys.c | 27 +++++++++++++++++++++++++++ >> include/linux/gpio_keys.h | 2 ++ >> include/uapi/linux/input-event-codes.h | 9 +++++++++ >> 3 files changed, 38 insertions(+) >> >> diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c >> index 87e613dc33b8..5c57339d3999 100644 >> --- a/drivers/input/keyboard/gpio_keys.c >> +++ b/drivers/input/keyboard/gpio_keys.c >> @@ -45,6 +45,8 @@ struct gpio_button_data { >> unsigned int software_debounce; /* in msecs, for GPIO-driven buttons */ >> >> unsigned int irq; >> + unsigned int irq_trigger_type; >> + unsigned int wakeup_trigger_type; >> spinlock_t lock; >> bool disabled; >> bool key_pressed; >> @@ -540,6 +542,8 @@ static int gpio_keys_setup_key(struct platform_device *pdev, >> } >> >> if (bdata->gpiod) { >> + int active_low = gpiod_is_active_low(bdata->gpiod); >> + >> if (button->debounce_interval) { >> error = gpiod_set_debounce(bdata->gpiod, >> button->debounce_interval * 1000); >> @@ -568,6 +572,16 @@ static int gpio_keys_setup_key(struct platform_device *pdev, >> isr = gpio_keys_gpio_isr; >> irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING; >> >> + switch (button->wakeup_event_action) { >> + case EV_ACT_ASSERTED: >> + bdata->wakeup_trigger_type = active_low ? >> + IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING; >> + break; >> + case EV_ACT_DEASSERTED: >> + bdata->wakeup_trigger_type = active_low ? >> + IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING; >> + break; > > What about EV_ACT_ANY? And default case? I think for ANY, we're OK > letting suspend/resume not reconfigure the trigger type, but maybe a > comment here to note that? > >> + } >> } else { > > What about the 'else' case? Shouldn't we try to handle that? > > Brian > >> if (!button->irq) { >> dev_err(dev, "Found button without gpio or irq\n"); >> @@ -618,6 +632,8 @@ static int gpio_keys_setup_key(struct platform_device *pdev, >> return error; >> } >> >> + bdata->irq_trigger_type = irq_get_trigger_type(bdata->irq); >> + >> return 0; >> } >> >> @@ -718,6 +734,9 @@ gpio_keys_get_devtree_pdata(struct device *dev) >> /* legacy name */ >> fwnode_property_read_bool(child, "gpio-key,wakeup"); >> >> + fwnode_property_read_u32(child, "wakeup-event-action", >> + &button->wakeup_event_action); >> + >> button->can_disable = >> fwnode_property_read_bool(child, "linux,can-disable"); >> >> @@ -854,6 +873,10 @@ static int __maybe_unused gpio_keys_suspend(struct device *dev) >> if (device_may_wakeup(dev)) { >> for (i = 0; i < ddata->pdata->nbuttons; i++) { >> struct gpio_button_data *bdata = &ddata->data[i]; >> + >> + if (bdata->button->wakeup && bdata->wakeup_trigger_type) >> + irq_set_irq_type(bdata->irq, >> + bdata->wakeup_trigger_type); >> if (bdata->button->wakeup) >> enable_irq_wake(bdata->irq); >> bdata->suspended = true; >> @@ -878,6 +901,10 @@ static int __maybe_unused gpio_keys_resume(struct device *dev) >> if (device_may_wakeup(dev)) { >> for (i = 0; i < ddata->pdata->nbuttons; i++) { >> struct gpio_button_data *bdata = &ddata->data[i]; >> + >> + if (bdata->button->wakeup && bdata->wakeup_trigger_type) >> + irq_set_irq_type(bdata->irq, >> + bdata->irq_trigger_type); >> if (bdata->button->wakeup) >> disable_irq_wake(bdata->irq); >> bdata->suspended = false; >> diff --git a/include/linux/gpio_keys.h b/include/linux/gpio_keys.h >> index d06bf77400f1..7160df54a6fe 100644 >> --- a/include/linux/gpio_keys.h >> +++ b/include/linux/gpio_keys.h >> @@ -13,6 +13,7 @@ struct device; >> * @desc: label that will be attached to button's gpio >> * @type: input event type (%EV_KEY, %EV_SW, %EV_ABS) >> * @wakeup: configure the button as a wake-up source >> + * @wakeup_event_action: event action to trigger wakeup >> * @debounce_interval: debounce ticks interval in msecs >> * @can_disable: %true indicates that userspace is allowed to >> * disable button via sysfs >> @@ -26,6 +27,7 @@ struct gpio_keys_button { >> const char *desc; >> unsigned int type; >> int wakeup; >> + int wakeup_event_action; >> int debounce_interval; >> bool can_disable; >> int value; >> diff --git a/include/uapi/linux/input-event-codes.h b/include/uapi/linux/input-event-codes.h >> index 53fbae27b280..d7917b0bd438 100644 >> --- a/include/uapi/linux/input-event-codes.h >> +++ b/include/uapi/linux/input-event-codes.h >> @@ -32,6 +32,15 @@ >> #define INPUT_PROP_CNT (INPUT_PROP_MAX + 1) >> >> /* >> + * Event action types >> + */ >> +#define EV_ACT_ANY 0x00 /* asserted or deasserted */ >> +#define EV_ACT_ASSERTED 0x01 /* asserted */ >> +#define EV_ACT_DEASSERTED 0x02 /* deasserted */ >> +#define EV_ACT_MAX 0x02 >> +#define EV_ACT_CNT (EV_ACT_MAX+1) >> + >> +/* >> * Event types >> */ >> >> -- >> 2.11.0 >> >> Not sure if you were aware but there is also some discussion related to this, maybe we can join the efforts? v1: https://patchwork.kernel.org/patch/10208261/ v2: https://patchwork.kernel.org/patch/10211147/ Best regards, Enric