From patchwork Fri May 31 10:13:04 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Hebbar, Gururaja" X-Patchwork-Id: 2641921 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by patchwork2.kernel.org (Postfix) with ESMTP id 1079DDFB79 for ; Fri, 31 May 2013 10:14:26 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1UiMKL-0007b9-Ia; Fri, 31 May 2013 10:12:54 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1UiMJs-0005Pj-Vm; Fri, 31 May 2013 10:12:25 +0000 Received: from comal.ext.ti.com ([198.47.26.152]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1UiMJG-0005J8-Lm for linux-arm-kernel@lists.infradead.org; Fri, 31 May 2013 10:11:52 +0000 Received: from dlelxv90.itg.ti.com ([172.17.2.17]) by comal.ext.ti.com (8.13.7/8.13.7) with ESMTP id r4VABHKK028042; Fri, 31 May 2013 05:11:17 -0500 Received: from DFLE73.ent.ti.com (dfle73.ent.ti.com [128.247.5.110]) by dlelxv90.itg.ti.com (8.14.3/8.13.8) with ESMTP id r4VABGPg003494; Fri, 31 May 2013 05:11:16 -0500 Received: from dlelxv23.itg.ti.com (172.17.1.198) by DFLE73.ent.ti.com (128.247.5.110) 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 r4VABBEn005849; 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 4DAC7158006; Fri, 31 May 2013 15:41:11 +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 r4VABAR05841; Fri, 31 May 2013 15:41:10 +0530 (IST) From: Hebbar Gururaja To: , , , Subject: [PATCH 04/11] Input: matrix-keypad: Adopt pinctrl support Date: Fri, 31 May 2013 15:43:04 +0530 Message-ID: <1369995191-20855-5-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 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130531_061147_279231_CF5993F2 X-CRM114-Status: GOOD ( 15.29 ) X-Spam-Score: -8.0 (--------) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (-8.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -5.0 RCVD_IN_DNSWL_HI RBL: Sender listed at http://www.dnswl.org/, high trust [198.47.26.152 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -1.1 RP_MATCHES_RCVD Envelope sender domain matches handover relay domain -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] Cc: davinci-linux-open-source@linux.davincidsp.com, sudhakar.raj@ti.com, linux@arm.linux.org.uk, devicetree-discuss@lists.ozlabs.org, Dmitry Torokhov , linux-kernel@vger.kernel.org, vaibhav.bedia@ti.com, gururaja.hebbar@ti.com, linux-input@vger.kernel.org, linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org Amend matrix-keypad 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 71d7719... aed43fb... M drivers/input/keyboard/matrix_keypad.c drivers/input/keyboard/matrix_keypad.c | 48 ++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/drivers/input/keyboard/matrix_keypad.c b/drivers/input/keyboard/matrix_keypad.c index 71d7719..aed43fb 100644 --- a/drivers/input/keyboard/matrix_keypad.c +++ b/drivers/input/keyboard/matrix_keypad.c @@ -26,6 +26,7 @@ #include #include #include +#include struct matrix_keypad { const struct matrix_keypad_platform_data *pdata; @@ -40,6 +41,10 @@ struct matrix_keypad { bool scan_pending; bool stopped; bool gpio_all_disabled; + /* Two optional pin states - default & sleep */ + struct pinctrl *pinctrl; + struct pinctrl_state *pins_default; + struct pinctrl_state *pins_sleep; }; /* @@ -280,6 +285,13 @@ static int matrix_keypad_suspend(struct device *dev) if (device_may_wakeup(&pdev->dev)) matrix_keypad_enable_wakeup(keypad); + else + /* Optionally let pins go into sleep states */ + if (!IS_ERR(keypad->pins_sleep)) + if (pinctrl_select_state(keypad->pinctrl, + keypad->pins_sleep)) + dev_err(dev, + "could not set pins to sleep state\n"); return 0; } @@ -291,6 +303,12 @@ static int matrix_keypad_resume(struct device *dev) if (device_may_wakeup(&pdev->dev)) matrix_keypad_disable_wakeup(keypad); + else + /* Optionaly enable pins to be muxed in and configured */ + if (!IS_ERR(keypad->pins_default)) + if (pinctrl_select_state(keypad->pinctrl, + keypad->pins_default)) + dev_err(dev, "could not set default pins\n"); matrix_keypad_start(keypad->input_dev); @@ -491,6 +509,36 @@ static int matrix_keypad_probe(struct platform_device *pdev) goto err_free_mem; } + keypad->pinctrl = devm_pinctrl_get(&pdev->dev); + if (!IS_ERR(keypad->pinctrl)) { + keypad->pins_default = pinctrl_lookup_state(keypad->pinctrl, + PINCTRL_STATE_DEFAULT); + /* enable pins to be muxed in and configured */ + if (IS_ERR(keypad->pins_default)) + dev_dbg(&pdev->dev, "could not get default pinstate\n"); + else + if (pinctrl_select_state(keypad->pinctrl, + keypad->pins_default)) + dev_err(&pdev->dev, + "could not set default pins\n"); + + keypad->pins_sleep = pinctrl_lookup_state(keypad->pinctrl, + PINCTRL_STATE_SLEEP); + if (IS_ERR(keypad->pins_sleep)) + dev_dbg(&pdev->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. + */ + keypad->pins_default = ERR_PTR(-ENODATA); + keypad->pins_sleep = ERR_PTR(-ENODATA); + + dev_dbg(&pdev->dev, + "pins are not configured from the driver\n"); + } + keypad->input_dev = input_dev; keypad->pdata = pdata; keypad->row_shift = get_count_order(pdata->num_col_gpios);