From patchwork Tue Jun 11 08:16:56 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Linus Walleij X-Patchwork-Id: 2700481 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by patchwork1.kernel.org (Postfix) with ESMTP id 72E3540077 for ; Tue, 11 Jun 2013 08:18:18 +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 1UmJmS-0002K1-QN; Tue, 11 Jun 2013 08:18:17 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1UmJmQ-00068K-3R; Tue, 11 Jun 2013 08:18:14 +0000 Received: from eu1sys200aog122.obsmtp.com ([207.126.144.153]) by merlin.infradead.org with smtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1UmJmM-00067Y-LH for linux-arm-kernel@lists.infradead.org; Tue, 11 Jun 2013 08:18:11 +0000 Received: from beta.dmz-us.st.com ([167.4.1.35]) (using TLSv1) by eu1sys200aob122.postini.com ([207.126.147.11]) with SMTP ID DSNKUbbdEbiFyViYh2HDA3syf5haoi8LfRz5@postini.com; Tue, 11 Jun 2013 08:18:10 UTC Received: from zeta.dmz-us.st.com (ns4.st.com [167.4.16.71]) by beta.dmz-us.st.com (STMicroelectronics) with ESMTP id BE35848; Tue, 11 Jun 2013 08:16:03 +0000 (GMT) Received: from relay2.stm.gmessaging.net (unknown [10.230.100.18]) by zeta.dmz-us.st.com (STMicroelectronics) with ESMTP id D44FE4E; Tue, 11 Jun 2013 08:17:03 +0000 (GMT) Received: from exdcvycastm004.EQ1STM.local (alteon-source-exch [10.230.100.61]) (using TLSv1 with cipher RC4-MD5 (128/128 bits)) (Client CN "exdcvycastm004", Issuer "exdcvycastm004" (not verified)) by relay2.stm.gmessaging.net (Postfix) with ESMTPS id CCB4AA8088; Tue, 11 Jun 2013 10:16:59 +0200 (CEST) Received: from steludxu4075.lud.stericsson.com (10.230.100.153) by smtp.stericsson.com (10.230.100.2) with Microsoft SMTP Server (TLS) id 8.3.279.5; Tue, 11 Jun 2013 10:17:03 +0200 From: Linus Walleij To: Greg Kroah-Hartman , Stephen Warren , Kevin Hilman , Tony Lindgren Subject: [PATCH] drivers: pinctrl: add active state to core Date: Tue, 11 Jun 2013 10:16:56 +0200 Message-ID: <1370938616-5952-1-git-send-email-linus.walleij@stericsson.com> X-Mailer: git-send-email 1.7.11.3 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130611_041811_032714_39C185DA X-CRM114-Status: GOOD ( 20.78 ) X-Spam-Score: -4.2 (----) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (-4.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -2.3 RCVD_IN_DNSWL_MED RBL: Sender listed at http://www.dnswl.org/, medium trust [207.126.144.153 listed in list.dnswl.org] -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] Cc: Stephen Warren , Wolfram Sang , Linus Walleij , Dmitry Torokhov , linux-kernel@vger.kernel.org, Hebbar Gururaja , Mark Brown , 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 From: Linus Walleij In addition to the recently introduced pinctrl core control, the PM runtime pin control for the OMAP platforms require a fourth state in addtition to the default, idle and sleep states already handled by the core: an explicit "active" state. Let's introduce this to the core in addition to the other states already defined. Cc: Hebbar Gururaja Cc: Dmitry Torokhov Cc: Stephen Warren Cc: Wolfram Sang Cc: Greg Kroah-Hartman Cc: Mark Brown Cc: Kevin Hilman Suggested-by: Tony Lindgren Signed-off-by: Linus Walleij Acked-by: Greg Kroah-Hartman Acked-by: Tony Lindgren --- Greg: need your ACK on this to merge it through the pinctrl tree. --- drivers/base/pinctrl.c | 8 +++++++- drivers/pinctrl/core.c | 15 +++++++++++++++ include/linux/pinctrl/consumer.h | 10 ++++++++++ include/linux/pinctrl/devinfo.h | 4 ++++ include/linux/pinctrl/pinctrl-state.h | 5 +++++ 5 files changed, 41 insertions(+), 1 deletion(-) diff --git a/drivers/base/pinctrl.c b/drivers/base/pinctrl.c index 5fb74b4..833d7cd 100644 --- a/drivers/base/pinctrl.c +++ b/drivers/base/pinctrl.c @@ -51,9 +51,15 @@ int pinctrl_bind_pins(struct device *dev) #ifdef CONFIG_PM /* * If power management is enabled, we also look for the optional - * sleep and idle pin states, with semantics as defined in + * active, sleep and idle pin states, with semantics as defined in * */ + dev->pins->active_state = pinctrl_lookup_state(dev->pins->p, + PINCTRL_STATE_ACTIVE); + if (IS_ERR(dev->pins->active_state)) + /* Not supplying this state is perfectly legal */ + dev_dbg(dev, "no active pinctrl state\n"); + dev->pins->sleep_state = pinctrl_lookup_state(dev->pins->p, PINCTRL_STATE_SLEEP); if (IS_ERR(dev->pins->sleep_state)) diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index dca9208..ff01b8f 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c @@ -1217,6 +1217,21 @@ int pinctrl_pm_select_default_state(struct device *dev) return ret; } +int pinctrl_pm_select_active_state(struct device *dev) +{ + struct dev_pin_info *pins = dev->pins; + int ret; + + if (!pins) + return 0; + if (IS_ERR(pins->active_state)) + return 0; /* No active state */ + ret = pinctrl_select_state(pins->p, pins->active_state); + if (ret) + dev_err(dev, "failed to activate pinctrl active state\n"); + return ret; +} + /** * pinctrl_pm_select_sleep_state() - select sleep pinctrl state for PM * @dev: device to select sleep state for diff --git a/include/linux/pinctrl/consumer.h b/include/linux/pinctrl/consumer.h index 0f32f10..18cdbb1 100644 --- a/include/linux/pinctrl/consumer.h +++ b/include/linux/pinctrl/consumer.h @@ -42,6 +42,7 @@ extern void devm_pinctrl_put(struct pinctrl *p); #ifdef CONFIG_PM extern int pinctrl_pm_select_default_state(struct device *dev); +extern int pinctrl_pm_select_active_state(struct device *dev); extern int pinctrl_pm_select_sleep_state(struct device *dev); extern int pinctrl_pm_select_idle_state(struct device *dev); #else @@ -49,6 +50,10 @@ static inline int pinctrl_pm_select_default_state(struct device *dev) { return 0; } +static inline int pinctrl_pm_select_active_state(struct device *dev) +{ + return 0; +} static inline int pinctrl_pm_select_sleep_state(struct device *dev) { return 0; @@ -223,6 +228,11 @@ static inline int pinctrl_pm_select_default_state(struct device *dev) return 0; } +static inline int pinctrl_pm_select_active_state(struct device *dev) +{ + return 0; +} + static inline int pinctrl_pm_select_sleep_state(struct device *dev) { return 0; diff --git a/include/linux/pinctrl/devinfo.h b/include/linux/pinctrl/devinfo.h index 281cb91..a61e6a5 100644 --- a/include/linux/pinctrl/devinfo.h +++ b/include/linux/pinctrl/devinfo.h @@ -24,11 +24,15 @@ * struct dev_pin_info - pin state container for devices * @p: pinctrl handle for the containing device * @default_state: the default state for the handle, if found + * @active_state: the active state for the handle, if found + * @sleep_state: the sleep state for the handle, if found + * @idle_state: the idle state for the handle, if found */ struct dev_pin_info { struct pinctrl *p; struct pinctrl_state *default_state; #ifdef CONFIG_PM + struct pinctrl_state *active_state; struct pinctrl_state *sleep_state; struct pinctrl_state *idle_state; #endif diff --git a/include/linux/pinctrl/pinctrl-state.h b/include/linux/pinctrl/pinctrl-state.h index b5919f8..37d0cd1 100644 --- a/include/linux/pinctrl/pinctrl-state.h +++ b/include/linux/pinctrl/pinctrl-state.h @@ -9,6 +9,10 @@ * hogs to configure muxing and pins at boot, and also as a state * to go into when returning from sleep and idle in * .pm_runtime_resume() or ordinary .resume() for example. + * @PINCTRL_STATE_ACTIVE: the state the pinctrl handle shall be put + * into for explicitly active mode, typically in .pm_runtime_resume() + * and other occasions where we want to be sure that the pins are + * ready to roll. * @PINCTRL_STATE_IDLE: the state the pinctrl handle shall be put into * when the pins are idle. This is a state where the system is relaxed * but not fully sleeping - some power may be on but clocks gated for @@ -20,5 +24,6 @@ * ordinary .suspend() function. */ #define PINCTRL_STATE_DEFAULT "default" +#define PINCTRL_STATE_ACTIVE "active" #define PINCTRL_STATE_IDLE "idle" #define PINCTRL_STATE_SLEEP "sleep"