1af873fceSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
228a8d14cSLinus Walleij /*
328a8d14cSLinus Walleij * Consumer interface the pin control subsystem
428a8d14cSLinus Walleij *
528a8d14cSLinus Walleij * Copyright (C) 2012 ST-Ericsson SA
628a8d14cSLinus Walleij * Written on behalf of Linaro for ST-Ericsson
728a8d14cSLinus Walleij * Based on bits of regulator core, gpio core and clk core
828a8d14cSLinus Walleij *
928a8d14cSLinus Walleij * Author: Linus Walleij <[email protected]>
1028a8d14cSLinus Walleij */
1128a8d14cSLinus Walleij #ifndef __LINUX_PINCTRL_CONSUMER_H
1228a8d14cSLinus Walleij #define __LINUX_PINCTRL_CONSUMER_H
1328a8d14cSLinus Walleij
146e5e959dSStephen Warren #include <linux/err.h>
15e5530adcSAndy Shevchenko #include <linux/types.h>
16e5530adcSAndy Shevchenko
17a1ce3928SDavid Howells #include <linux/pinctrl/pinctrl-state.h>
1828a8d14cSLinus Walleij
19e5530adcSAndy Shevchenko struct device;
20ec963d04SBartosz Golaszewski struct gpio_chip;
21e5530adcSAndy Shevchenko
2228a8d14cSLinus Walleij /* This struct is private to the core and should be regarded as a cookie */
23e93bcee0SLinus Walleij struct pinctrl;
246e5e959dSStephen Warren struct pinctrl_state;
2528a8d14cSLinus Walleij
26befe5bdfSLinus Walleij #ifdef CONFIG_PINCTRL
2728a8d14cSLinus Walleij
28befe5bdfSLinus Walleij /* External interface to pin control */
2900762e41SBartosz Golaszewski bool pinctrl_gpio_can_use_line(struct gpio_chip *gc, unsigned int offset);
30acb38be6SBartosz Golaszewski int pinctrl_gpio_request(struct gpio_chip *gc, unsigned int offset);
314fccb263SBartosz Golaszewski void pinctrl_gpio_free(struct gpio_chip *gc, unsigned int offset);
32315c46f9SBartosz Golaszewski int pinctrl_gpio_direction_input(struct gpio_chip *gc,
33ec963d04SBartosz Golaszewski unsigned int offset);
34b679d6c0SBartosz Golaszewski int pinctrl_gpio_direction_output(struct gpio_chip *gc,
35ec963d04SBartosz Golaszewski unsigned int offset);
36*acf2981bSBartosz Golaszewski int pinctrl_gpio_set_config(struct gpio_chip *gc, unsigned int offset,
37ec963d04SBartosz Golaszewski unsigned long config);
386e5e959dSStephen Warren
399596ebf8SBartosz Golaszewski struct pinctrl * __must_check pinctrl_get(struct device *dev);
409596ebf8SBartosz Golaszewski void pinctrl_put(struct pinctrl *p);
419596ebf8SBartosz Golaszewski struct pinctrl_state * __must_check pinctrl_lookup_state(struct pinctrl *p,
426e5e959dSStephen Warren const char *name);
439596ebf8SBartosz Golaszewski int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *s);
4428a8d14cSLinus Walleij
459596ebf8SBartosz Golaszewski struct pinctrl * __must_check devm_pinctrl_get(struct device *dev);
469596ebf8SBartosz Golaszewski void devm_pinctrl_put(struct pinctrl *p);
479596ebf8SBartosz Golaszewski int pinctrl_select_default_state(struct device *dev);
486d4ca1fbSStephen Warren
4914005ee2SLinus Walleij #ifdef CONFIG_PM
509596ebf8SBartosz Golaszewski int pinctrl_pm_select_default_state(struct device *dev);
519596ebf8SBartosz Golaszewski int pinctrl_pm_select_sleep_state(struct device *dev);
529596ebf8SBartosz Golaszewski int pinctrl_pm_select_idle_state(struct device *dev);
5314005ee2SLinus Walleij #else
pinctrl_pm_select_default_state(struct device * dev)5414005ee2SLinus Walleij static inline int pinctrl_pm_select_default_state(struct device *dev)
5514005ee2SLinus Walleij {
5614005ee2SLinus Walleij return 0;
5714005ee2SLinus Walleij }
pinctrl_pm_select_sleep_state(struct device * dev)5814005ee2SLinus Walleij static inline int pinctrl_pm_select_sleep_state(struct device *dev)
5914005ee2SLinus Walleij {
6014005ee2SLinus Walleij return 0;
6114005ee2SLinus Walleij }
pinctrl_pm_select_idle_state(struct device * dev)6214005ee2SLinus Walleij static inline int pinctrl_pm_select_idle_state(struct device *dev)
6314005ee2SLinus Walleij {
6414005ee2SLinus Walleij return 0;
6514005ee2SLinus Walleij }
6614005ee2SLinus Walleij #endif
6714005ee2SLinus Walleij
68befe5bdfSLinus Walleij #else /* !CONFIG_PINCTRL */
6928a8d14cSLinus Walleij
70ec963d04SBartosz Golaszewski static inline bool
pinctrl_gpio_can_use_line(struct gpio_chip * gc,unsigned int offset)7100762e41SBartosz Golaszewski pinctrl_gpio_can_use_line(struct gpio_chip *gc, unsigned int offset)
72ec963d04SBartosz Golaszewski {
73ec963d04SBartosz Golaszewski return true;
74ec963d04SBartosz Golaszewski }
75ec963d04SBartosz Golaszewski
76ec963d04SBartosz Golaszewski static inline int
pinctrl_gpio_request(struct gpio_chip * gc,unsigned int offset)77acb38be6SBartosz Golaszewski pinctrl_gpio_request(struct gpio_chip *gc, unsigned int offset)
78ec963d04SBartosz Golaszewski {
79ec963d04SBartosz Golaszewski return 0;
80ec963d04SBartosz Golaszewski }
81ec963d04SBartosz Golaszewski
82ec963d04SBartosz Golaszewski static inline void
pinctrl_gpio_free(struct gpio_chip * gc,unsigned int offset)834fccb263SBartosz Golaszewski pinctrl_gpio_free(struct gpio_chip *gc, unsigned int offset)
84ec963d04SBartosz Golaszewski {
85ec963d04SBartosz Golaszewski }
86ec963d04SBartosz Golaszewski
87ec963d04SBartosz Golaszewski static inline int
pinctrl_gpio_direction_input(struct gpio_chip * gc,unsigned int offset)88315c46f9SBartosz Golaszewski pinctrl_gpio_direction_input(struct gpio_chip *gc, unsigned int offset)
89ec963d04SBartosz Golaszewski {
90ec963d04SBartosz Golaszewski return 0;
91ec963d04SBartosz Golaszewski }
92ec963d04SBartosz Golaszewski
93ec963d04SBartosz Golaszewski static inline int
pinctrl_gpio_direction_output(struct gpio_chip * gc,unsigned int offset)94b679d6c0SBartosz Golaszewski pinctrl_gpio_direction_output(struct gpio_chip *gc, unsigned int offset)
95ec963d04SBartosz Golaszewski {
96ec963d04SBartosz Golaszewski return 0;
97ec963d04SBartosz Golaszewski }
98ec963d04SBartosz Golaszewski
99ec963d04SBartosz Golaszewski static inline int
pinctrl_gpio_set_config(struct gpio_chip * gc,unsigned int offset,unsigned long config)100*acf2981bSBartosz Golaszewski pinctrl_gpio_set_config(struct gpio_chip *gc, unsigned int offset,
101ec963d04SBartosz Golaszewski unsigned long config)
102ec963d04SBartosz Golaszewski {
103ec963d04SBartosz Golaszewski return 0;
104ec963d04SBartosz Golaszewski }
105ec963d04SBartosz Golaszewski
pinctrl_get(struct device * dev)1066e5e959dSStephen Warren static inline struct pinctrl * __must_check pinctrl_get(struct device *dev)
10728a8d14cSLinus Walleij {
10840eeb111SLinus Walleij return NULL;
10928a8d14cSLinus Walleij }
11028a8d14cSLinus Walleij
pinctrl_put(struct pinctrl * p)111e93bcee0SLinus Walleij static inline void pinctrl_put(struct pinctrl *p)
11228a8d14cSLinus Walleij {
11328a8d14cSLinus Walleij }
11428a8d14cSLinus Walleij
pinctrl_lookup_state(struct pinctrl * p,const char * name)115e5530adcSAndy Shevchenko static inline struct pinctrl_state * __must_check pinctrl_lookup_state(struct pinctrl *p,
1166e5e959dSStephen Warren const char *name)
1176e5e959dSStephen Warren {
11840eeb111SLinus Walleij return NULL;
1196e5e959dSStephen Warren }
1206e5e959dSStephen Warren
pinctrl_select_state(struct pinctrl * p,struct pinctrl_state * s)1216e5e959dSStephen Warren static inline int pinctrl_select_state(struct pinctrl *p,
1226e5e959dSStephen Warren struct pinctrl_state *s)
12328a8d14cSLinus Walleij {
12428a8d14cSLinus Walleij return 0;
12528a8d14cSLinus Walleij }
12628a8d14cSLinus Walleij
devm_pinctrl_get(struct device * dev)1276d4ca1fbSStephen Warren static inline struct pinctrl * __must_check devm_pinctrl_get(struct device *dev)
1286d4ca1fbSStephen Warren {
12940eeb111SLinus Walleij return NULL;
1306d4ca1fbSStephen Warren }
1316d4ca1fbSStephen Warren
devm_pinctrl_put(struct pinctrl * p)1326d4ca1fbSStephen Warren static inline void devm_pinctrl_put(struct pinctrl *p)
1336d4ca1fbSStephen Warren {
1346d4ca1fbSStephen Warren }
1356d4ca1fbSStephen Warren
pinctrl_select_default_state(struct device * dev)13655d54d1eSUlf Hansson static inline int pinctrl_select_default_state(struct device *dev)
13755d54d1eSUlf Hansson {
13855d54d1eSUlf Hansson return 0;
13955d54d1eSUlf Hansson }
14055d54d1eSUlf Hansson
pinctrl_pm_select_default_state(struct device * dev)141ff73ceedSLinus Walleij static inline int pinctrl_pm_select_default_state(struct device *dev)
142ff73ceedSLinus Walleij {
143ff73ceedSLinus Walleij return 0;
144ff73ceedSLinus Walleij }
145ff73ceedSLinus Walleij
pinctrl_pm_select_sleep_state(struct device * dev)146ff73ceedSLinus Walleij static inline int pinctrl_pm_select_sleep_state(struct device *dev)
147ff73ceedSLinus Walleij {
148ff73ceedSLinus Walleij return 0;
149ff73ceedSLinus Walleij }
150ff73ceedSLinus Walleij
pinctrl_pm_select_idle_state(struct device * dev)151ff73ceedSLinus Walleij static inline int pinctrl_pm_select_idle_state(struct device *dev)
152ff73ceedSLinus Walleij {
153ff73ceedSLinus Walleij return 0;
154ff73ceedSLinus Walleij }
155ff73ceedSLinus Walleij
1566e5e959dSStephen Warren #endif /* CONFIG_PINCTRL */
1576e5e959dSStephen Warren
pinctrl_get_select(struct device * dev,const char * name)158e5530adcSAndy Shevchenko static inline struct pinctrl * __must_check pinctrl_get_select(struct device *dev,
159e5530adcSAndy Shevchenko const char *name)
16028a8d14cSLinus Walleij {
1616e5e959dSStephen Warren struct pinctrl *p;
1626e5e959dSStephen Warren struct pinctrl_state *s;
1636e5e959dSStephen Warren int ret;
1646e5e959dSStephen Warren
1656e5e959dSStephen Warren p = pinctrl_get(dev);
1666e5e959dSStephen Warren if (IS_ERR(p))
1676e5e959dSStephen Warren return p;
1686e5e959dSStephen Warren
1696e5e959dSStephen Warren s = pinctrl_lookup_state(p, name);
1706e5e959dSStephen Warren if (IS_ERR(s)) {
1716e5e959dSStephen Warren pinctrl_put(p);
17266eb3bd8SFabian Frederick return ERR_CAST(s);
17328a8d14cSLinus Walleij }
17428a8d14cSLinus Walleij
1756e5e959dSStephen Warren ret = pinctrl_select_state(p, s);
1766e5e959dSStephen Warren if (ret < 0) {
1776e5e959dSStephen Warren pinctrl_put(p);
1786e5e959dSStephen Warren return ERR_PTR(ret);
1796e5e959dSStephen Warren }
1806e5e959dSStephen Warren
1816e5e959dSStephen Warren return p;
1826e5e959dSStephen Warren }
1836e5e959dSStephen Warren
pinctrl_get_select_default(struct device * dev)184e5530adcSAndy Shevchenko static inline struct pinctrl * __must_check pinctrl_get_select_default(struct device *dev)
1856e5e959dSStephen Warren {
1866e5e959dSStephen Warren return pinctrl_get_select(dev, PINCTRL_STATE_DEFAULT);
1876e5e959dSStephen Warren }
18828a8d14cSLinus Walleij
devm_pinctrl_get_select(struct device * dev,const char * name)189e5530adcSAndy Shevchenko static inline struct pinctrl * __must_check devm_pinctrl_get_select(struct device *dev,
190e5530adcSAndy Shevchenko const char *name)
1916d4ca1fbSStephen Warren {
1926d4ca1fbSStephen Warren struct pinctrl *p;
1936d4ca1fbSStephen Warren struct pinctrl_state *s;
1946d4ca1fbSStephen Warren int ret;
1956d4ca1fbSStephen Warren
1966d4ca1fbSStephen Warren p = devm_pinctrl_get(dev);
1976d4ca1fbSStephen Warren if (IS_ERR(p))
1986d4ca1fbSStephen Warren return p;
1996d4ca1fbSStephen Warren
2006d4ca1fbSStephen Warren s = pinctrl_lookup_state(p, name);
2016d4ca1fbSStephen Warren if (IS_ERR(s)) {
2026d4ca1fbSStephen Warren devm_pinctrl_put(p);
203e60bc2dfSUwe Kleine-König return ERR_CAST(s);
2046d4ca1fbSStephen Warren }
2056d4ca1fbSStephen Warren
2066d4ca1fbSStephen Warren ret = pinctrl_select_state(p, s);
2076d4ca1fbSStephen Warren if (ret < 0) {
2086d4ca1fbSStephen Warren devm_pinctrl_put(p);
2096d4ca1fbSStephen Warren return ERR_PTR(ret);
2106d4ca1fbSStephen Warren }
2116d4ca1fbSStephen Warren
2126d4ca1fbSStephen Warren return p;
2136d4ca1fbSStephen Warren }
2146d4ca1fbSStephen Warren
devm_pinctrl_get_select_default(struct device * dev)215e5530adcSAndy Shevchenko static inline struct pinctrl * __must_check devm_pinctrl_get_select_default(struct device *dev)
2166d4ca1fbSStephen Warren {
2176d4ca1fbSStephen Warren return devm_pinctrl_get_select(dev, PINCTRL_STATE_DEFAULT);
2186d4ca1fbSStephen Warren }
2196d4ca1fbSStephen Warren
22028a8d14cSLinus Walleij #endif /* __LINUX_PINCTRL_CONSUMER_H */
221