From patchwork Fri May 31 10:13:03 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Hebbar, Gururaja" X-Patchwork-Id: 2641941 Return-Path: X-Original-To: patchwork-davinci@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from devils.ext.ti.com (devils.ext.ti.com [198.47.26.153]) by patchwork1.kernel.org (Postfix) with ESMTP id A1D2B3FD2B for ; Fri, 31 May 2013 10:14:33 +0000 (UTC) Received: from dlelxv90.itg.ti.com ([172.17.2.17]) by devils.ext.ti.com (8.13.7/8.13.7) with ESMTP id r4VAD3Rt017991; Fri, 31 May 2013 05:13:03 -0500 Received: from DLEE71.ent.ti.com (dlee71.ent.ti.com [157.170.170.114]) by dlelxv90.itg.ti.com (8.14.3/8.13.8) with ESMTP id r4VAD30h007520; Fri, 31 May 2013 05:13:03 -0500 Received: from dlelxv24.itg.ti.com (172.17.1.199) by DLEE71.ent.ti.com (157.170.170.114) with Microsoft SMTP Server id 14.2.342.3; Fri, 31 May 2013 05:13:02 -0500 Received: from linux.omap.com (dlelxs01.itg.ti.com [157.170.227.31]) by dlelxv24.itg.ti.com (8.13.8/8.13.8) with ESMTP id r4VAD228019181; Fri, 31 May 2013 05:13:02 -0500 Received: from linux.omap.com (localhost [127.0.0.1]) by linux.omap.com (Postfix) with ESMTP id 29B3D80630; Fri, 31 May 2013 05:13:02 -0500 (CDT) X-Original-To: davinci-linux-open-source@linux.davincidsp.com Delivered-To: davinci-linux-open-source@linux.davincidsp.com Received: from dlelxv90.itg.ti.com (dlelxv90.itg.ti.com [172.17.2.17]) by linux.omap.com (Postfix) with ESMTP id 59E4380626 for ; Fri, 31 May 2013 05:11:17 -0500 (CDT) Received: from DLEE70.ent.ti.com (dlee70.ent.ti.com [157.170.170.113]) by dlelxv90.itg.ti.com (8.14.3/8.13.8) with ESMTP id r4VABGw9003490; Fri, 31 May 2013 05:11:16 -0500 Received: from dlelxv23.itg.ti.com (172.17.1.198) by DLEE70.ent.ti.com (157.170.170.113) with Microsoft SMTP Server id 14.2.342.3; Fri, 31 May 2013 05:11:16 -0500 Received: from ucmsshproxy.india.ext.ti.com (dbdp20.itg.ti.com [172.24.170.38]) by dlelxv23.itg.ti.com (8.13.8/8.13.8) with SMTP id r4VABBOi005848; Fri, 31 May 2013 05:11:12 -0500 Received: from symphony.india.ext.ti.com (unknown [192.168.247.13]) by ucmsshproxy.india.ext.ti.com (Postfix) with ESMTP id D8D53158005; Fri, 31 May 2013 15:41:10 +0530 (IST) Received: from ubuntu-psp-linux.india.ext.ti.com (ubuntu-psp-linux [192.168.247.46]) by symphony.india.ext.ti.com (8.11.7p1+Sun/8.11.7) with ESMTP id r4VABAR05838; Fri, 31 May 2013 15:41:10 +0530 (IST) From: Hebbar Gururaja To: , , , Subject: [PATCH 03/11] Input: gpio_keys: Adopt pinctrl support Date: Fri, 31 May 2013 15:43:03 +0530 Message-ID: <1369995191-20855-4-git-send-email-gururaja.hebbar@ti.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1369995191-20855-1-git-send-email-gururaja.hebbar@ti.com> References: <1369995191-20855-1-git-send-email-gururaja.hebbar@ti.com> MIME-Version: 1.0 CC: , , , Dmitry Torokhov , , , X-BeenThere: davinci-linux-open-source@linux.davincidsp.com X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: Errors-To: davinci-linux-open-source-bounces@linux.davincidsp.com Amend gpio-keys driver to optionally take a pin control handle and set the state of the pins to: - "default" on boot, resume - "sleep" on suspend() By Optionally putting the pins into sleep state in the suspend callback we can accomplish two things. - One is to minimize current leakage from pins and thus save power, - second, we can prevent the IP from driving pins output in an uncontrolled manner, which may happen if the power domain drops the domain regulator. If any of the above pin states are missing in dt, a warning message about the missing state is displayed. If certain pin-states are not available, to remove this warning message pass respective state name with null phandler. Todo: - if an idle state is available for pins, add support for it. Signed-off-by: Hebbar Gururaja Cc: Dmitry Torokhov Cc: linux-input@vger.kernel.org --- :100644 100644 b29ca65... ca615a4... M drivers/input/keyboard/gpio_keys.c drivers/input/keyboard/gpio_keys.c | 47 ++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index b29ca65..ca615a4 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c @@ -28,6 +28,7 @@ #include #include #include +#include #include struct gpio_button_data { @@ -47,6 +48,10 @@ struct gpio_keys_drvdata { struct input_dev *input; struct mutex disable_lock; struct gpio_button_data data[0]; + /* Two optional pin states - default & sleep */ + struct pinctrl *pinctrl; + struct pinctrl_state *pins_default; + struct pinctrl_state *pins_sleep; }; /* @@ -709,6 +714,35 @@ static int gpio_keys_probe(struct platform_device *pdev) goto fail1; } + ddata->pinctrl = devm_pinctrl_get(dev); + if (!IS_ERR(ddata->pinctrl)) { + ddata->pins_default = pinctrl_lookup_state(ddata->pinctrl, + PINCTRL_STATE_DEFAULT); + /* enable pins to be muxed in and configured */ + if (IS_ERR(ddata->pins_default)) + dev_dbg(dev, "could not get default pinstate\n"); + else + if (pinctrl_select_state(ddata->pinctrl, + ddata->pins_default)) + dev_err(dev, + "could not set default pinstate\n"); + + ddata->pins_sleep = pinctrl_lookup_state(ddata->pinctrl, + PINCTRL_STATE_SLEEP); + if (IS_ERR(ddata->pins_sleep)) + dev_dbg(dev, "could not get sleep pinstate\n"); + } else { + /* + * Since we continue even when pinctrl node is not found, + * Invalidate pins as not available. This is to make sure that + * IS_ERR(pins_xxx) results in failure when used. + */ + ddata->pins_default = ERR_PTR(-ENODATA); + ddata->pins_sleep = ERR_PTR(-ENODATA); + + dev_dbg(dev, "pins are not configured from the driver\n"); + } + ddata->pdata = pdata; ddata->input = input; mutex_init(&ddata->disable_lock); @@ -816,6 +850,13 @@ static int gpio_keys_suspend(struct device *dev) enable_irq_wake(bdata->irq); } } else { + /* Optionally let pins go into sleep states */ + if (!IS_ERR(ddata->pins_sleep)) + if (pinctrl_select_state(ddata->pinctrl, + ddata->pins_sleep)) + dev_err(dev, + "could not set pins to sleep state\n"); + mutex_lock(&input->mutex); if (input->users) gpio_keys_close(input); @@ -839,6 +880,12 @@ static int gpio_keys_resume(struct device *dev) disable_irq_wake(bdata->irq); } } else { + /* Optionaly enable pins to be muxed in and configured */ + if (!IS_ERR(ddata->pins_default)) + if (pinctrl_select_state(ddata->pinctrl, + ddata->pins_default)) + dev_err(dev, "could not set default pins\n"); + mutex_lock(&input->mutex); if (input->users) error = gpio_keys_open(input);