@@ -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
* <linux/pinctrl/pinctrl-state.h>
*/
+ 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))
@@ -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
@@ -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;
@@ -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
@@ -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"