aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/core.c
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@linaro.org>2013-06-05 09:30:33 -0400
committerLinus Walleij <linus.walleij@linaro.org>2013-06-16 05:56:52 -0400
commit14005ee270cad7078adbce6b7f3687b992a8334e (patch)
tree65771454d8f060007a489927cf9f70847503f4ce /drivers/pinctrl/core.c
parent7970cb770dffa23cb20a36f46602e688e075f5d9 (diff)
drivers: pinctrl sleep and idle states in the core
If a device have sleep and idle states in addition to the default state, look up these in the core and stash them in the pinctrl state container. Add accessor functions for pinctrl consumers to put the pins into "default", "sleep" and "idle" states passing nothing but the struct device * affected. Solution suggested by Kevin Hilman, Mark Brown and Dmitry Torokhov in response to a patch series from Hebbar Gururaja. Cc: Hebbar Gururaja <gururaja.hebbar@ti.com> Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com> Cc: Stephen Warren <swarren@wwwdotorg.org> Acked-by: Wolfram Sang <wsa@the-dreams.de> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Reviewed-by: Mark Brown <broonie@kernel.org> Reviewed-by: Kevin Hilman <khilman@linaro.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/core.c')
-rw-r--r--drivers/pinctrl/core.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c
index 1f9608bd237e..dca9208f5463 100644
--- a/drivers/pinctrl/core.c
+++ b/drivers/pinctrl/core.c
@@ -1196,6 +1196,67 @@ int pinctrl_force_default(struct pinctrl_dev *pctldev)
1196} 1196}
1197EXPORT_SYMBOL_GPL(pinctrl_force_default); 1197EXPORT_SYMBOL_GPL(pinctrl_force_default);
1198 1198
1199#ifdef CONFIG_PM
1200
1201/**
1202 * pinctrl_pm_select_default_state() - select default pinctrl state for PM
1203 * @dev: device to select default state for
1204 */
1205int pinctrl_pm_select_default_state(struct device *dev)
1206{
1207 struct dev_pin_info *pins = dev->pins;
1208 int ret;
1209
1210 if (!pins)
1211 return 0;
1212 if (IS_ERR(pins->default_state))
1213 return 0; /* No default state */
1214 ret = pinctrl_select_state(pins->p, pins->default_state);
1215 if (ret)
1216 dev_err(dev, "failed to activate default pinctrl state\n");
1217 return ret;
1218}
1219
1220/**
1221 * pinctrl_pm_select_sleep_state() - select sleep pinctrl state for PM
1222 * @dev: device to select sleep state for
1223 */
1224int pinctrl_pm_select_sleep_state(struct device *dev)
1225{
1226 struct dev_pin_info *pins = dev->pins;
1227 int ret;
1228
1229 if (!pins)
1230 return 0;
1231 if (IS_ERR(pins->sleep_state))
1232 return 0; /* No sleep state */
1233 ret = pinctrl_select_state(pins->p, pins->sleep_state);
1234 if (ret)
1235 dev_err(dev, "failed to activate pinctrl sleep state\n");
1236 return ret;
1237}
1238
1239/**
1240 * pinctrl_pm_select_idle_state() - select idle pinctrl state for PM
1241 * @dev: device to select idle state for
1242 */
1243int pinctrl_pm_select_idle_state(struct device *dev)
1244{
1245 struct dev_pin_info *pins = dev->pins;
1246 int ret;
1247
1248 if (!pins)
1249 return 0;
1250 if (IS_ERR(pins->idle_state))
1251 return 0; /* No idle state */
1252 ret = pinctrl_select_state(pins->p, pins->idle_state);
1253 if (ret)
1254 dev_err(dev, "failed to activate pinctrl idle state\n");
1255 return ret;
1256}
1257
1258#endif
1259
1199#ifdef CONFIG_DEBUG_FS 1260#ifdef CONFIG_DEBUG_FS
1200 1261
1201static int pinctrl_pins_show(struct seq_file *s, void *what) 1262static int pinctrl_pins_show(struct seq_file *s, void *what)