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 <linus.walleij@linaro.org>
1028a8d14cSLinus Walleij */
1128a8d14cSLinus Walleij #ifndef __LINUX_PINCTRL_CONSUMER_H
1228a8d14cSLinus Walleij #define __LINUX_PINCTRL_CONSUMER_H
1328a8d14cSLinus Walleij
146e5e959dSStephen Warren #include <linux/err.h>
15*e5530adcSAndy Shevchenko #include <linux/types.h>
16*e5530adcSAndy Shevchenko
17a1ce3928SDavid Howells #include <linux/pinctrl/pinctrl-state.h>
1828a8d14cSLinus Walleij
19*e5530adcSAndy Shevchenko struct device;
20*e5530adcSAndy Shevchenko
2128a8d14cSLinus Walleij /* This struct is private to the core and should be regarded as a cookie */
22e93bcee0SLinus Walleij struct pinctrl;
236e5e959dSStephen Warren struct pinctrl_state;
2428a8d14cSLinus Walleij
25befe5bdfSLinus Walleij #ifdef CONFIG_PINCTRL
2628a8d14cSLinus Walleij
27befe5bdfSLinus Walleij /* External interface to pin control */
28472a61e7SStefan Wahren extern bool pinctrl_gpio_can_use_line(unsigned gpio);
29a9a1d2a7SLinus Walleij extern int pinctrl_gpio_request(unsigned gpio);
30a9a1d2a7SLinus Walleij extern void pinctrl_gpio_free(unsigned gpio);
31e93bcee0SLinus Walleij extern int pinctrl_gpio_direction_input(unsigned gpio);
32e93bcee0SLinus Walleij extern int pinctrl_gpio_direction_output(unsigned gpio);
3315381bc7SMika Westerberg extern int pinctrl_gpio_set_config(unsigned gpio, unsigned long config);
346e5e959dSStephen Warren
356e5e959dSStephen Warren extern struct pinctrl * __must_check pinctrl_get(struct device *dev);
36e93bcee0SLinus Walleij extern void pinctrl_put(struct pinctrl *p);
37*e5530adcSAndy Shevchenko extern struct pinctrl_state * __must_check pinctrl_lookup_state(struct pinctrl *p,
386e5e959dSStephen Warren const char *name);
396e5e959dSStephen Warren extern int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *s);
4028a8d14cSLinus Walleij
416d4ca1fbSStephen Warren extern struct pinctrl * __must_check devm_pinctrl_get(struct device *dev);
426d4ca1fbSStephen Warren extern void devm_pinctrl_put(struct pinctrl *p);
4355d54d1eSUlf Hansson extern int pinctrl_select_default_state(struct device *dev);
446d4ca1fbSStephen Warren
4514005ee2SLinus Walleij #ifdef CONFIG_PM
4614005ee2SLinus Walleij extern int pinctrl_pm_select_default_state(struct device *dev);
4714005ee2SLinus Walleij extern int pinctrl_pm_select_sleep_state(struct device *dev);
4814005ee2SLinus Walleij extern int pinctrl_pm_select_idle_state(struct device *dev);
4914005ee2SLinus Walleij #else
pinctrl_pm_select_default_state(struct device * dev)5014005ee2SLinus Walleij static inline int pinctrl_pm_select_default_state(struct device *dev)
5114005ee2SLinus Walleij {
5214005ee2SLinus Walleij return 0;
5314005ee2SLinus Walleij }
pinctrl_pm_select_sleep_state(struct device * dev)5414005ee2SLinus Walleij static inline int pinctrl_pm_select_sleep_state(struct device *dev)
5514005ee2SLinus Walleij {
5614005ee2SLinus Walleij return 0;
5714005ee2SLinus Walleij }
pinctrl_pm_select_idle_state(struct device * dev)5814005ee2SLinus Walleij static inline int pinctrl_pm_select_idle_state(struct device *dev)
5914005ee2SLinus Walleij {
6014005ee2SLinus Walleij return 0;
6114005ee2SLinus Walleij }
6214005ee2SLinus Walleij #endif
6314005ee2SLinus Walleij
64befe5bdfSLinus Walleij #else /* !CONFIG_PINCTRL */
6528a8d14cSLinus Walleij
pinctrl_gpio_can_use_line(unsigned gpio)66472a61e7SStefan Wahren static inline bool pinctrl_gpio_can_use_line(unsigned gpio)
67472a61e7SStefan Wahren {
68472a61e7SStefan Wahren return true;
69472a61e7SStefan Wahren }
70472a61e7SStefan Wahren
pinctrl_gpio_request(unsigned gpio)71a9a1d2a7SLinus Walleij static inline int pinctrl_gpio_request(unsigned gpio)
7228a8d14cSLinus Walleij {
7328a8d14cSLinus Walleij return 0;
7428a8d14cSLinus Walleij }
7528a8d14cSLinus Walleij
pinctrl_gpio_free(unsigned gpio)76a9a1d2a7SLinus Walleij static inline void pinctrl_gpio_free(unsigned gpio)
7728a8d14cSLinus Walleij {
7828a8d14cSLinus Walleij }
7928a8d14cSLinus Walleij
pinctrl_gpio_direction_input(unsigned gpio)80e93bcee0SLinus Walleij static inline int pinctrl_gpio_direction_input(unsigned gpio)
8128a8d14cSLinus Walleij {
8228a8d14cSLinus Walleij return 0;
8328a8d14cSLinus Walleij }
8428a8d14cSLinus Walleij
pinctrl_gpio_direction_output(unsigned gpio)85e93bcee0SLinus Walleij static inline int pinctrl_gpio_direction_output(unsigned gpio)
8628a8d14cSLinus Walleij {
8728a8d14cSLinus Walleij return 0;
8828a8d14cSLinus Walleij }
8928a8d14cSLinus Walleij
pinctrl_gpio_set_config(unsigned gpio,unsigned long config)9015381bc7SMika Westerberg static inline int pinctrl_gpio_set_config(unsigned gpio, unsigned long config)
9115381bc7SMika Westerberg {
9215381bc7SMika Westerberg return 0;
9315381bc7SMika Westerberg }
9415381bc7SMika Westerberg
pinctrl_get(struct device * dev)956e5e959dSStephen Warren static inline struct pinctrl * __must_check pinctrl_get(struct device *dev)
9628a8d14cSLinus Walleij {
9740eeb111SLinus Walleij return NULL;
9828a8d14cSLinus Walleij }
9928a8d14cSLinus Walleij
pinctrl_put(struct pinctrl * p)100e93bcee0SLinus Walleij static inline void pinctrl_put(struct pinctrl *p)
10128a8d14cSLinus Walleij {
10228a8d14cSLinus Walleij }
10328a8d14cSLinus Walleij
pinctrl_lookup_state(struct pinctrl * p,const char * name)104*e5530adcSAndy Shevchenko static inline struct pinctrl_state * __must_check pinctrl_lookup_state(struct pinctrl *p,
1056e5e959dSStephen Warren const char *name)
1066e5e959dSStephen Warren {
10740eeb111SLinus Walleij return NULL;
1086e5e959dSStephen Warren }
1096e5e959dSStephen Warren
pinctrl_select_state(struct pinctrl * p,struct pinctrl_state * s)1106e5e959dSStephen Warren static inline int pinctrl_select_state(struct pinctrl *p,
1116e5e959dSStephen Warren struct pinctrl_state *s)
11228a8d14cSLinus Walleij {
11328a8d14cSLinus Walleij return 0;
11428a8d14cSLinus Walleij }
11528a8d14cSLinus Walleij
devm_pinctrl_get(struct device * dev)1166d4ca1fbSStephen Warren static inline struct pinctrl * __must_check devm_pinctrl_get(struct device *dev)
1176d4ca1fbSStephen Warren {
11840eeb111SLinus Walleij return NULL;
1196d4ca1fbSStephen Warren }
1206d4ca1fbSStephen Warren
devm_pinctrl_put(struct pinctrl * p)1216d4ca1fbSStephen Warren static inline void devm_pinctrl_put(struct pinctrl *p)
1226d4ca1fbSStephen Warren {
1236d4ca1fbSStephen Warren }
1246d4ca1fbSStephen Warren
pinctrl_select_default_state(struct device * dev)12555d54d1eSUlf Hansson static inline int pinctrl_select_default_state(struct device *dev)
12655d54d1eSUlf Hansson {
12755d54d1eSUlf Hansson return 0;
12855d54d1eSUlf Hansson }
12955d54d1eSUlf Hansson
pinctrl_pm_select_default_state(struct device * dev)130ff73ceedSLinus Walleij static inline int pinctrl_pm_select_default_state(struct device *dev)
131ff73ceedSLinus Walleij {
132ff73ceedSLinus Walleij return 0;
133ff73ceedSLinus Walleij }
134ff73ceedSLinus Walleij
pinctrl_pm_select_sleep_state(struct device * dev)135ff73ceedSLinus Walleij static inline int pinctrl_pm_select_sleep_state(struct device *dev)
136ff73ceedSLinus Walleij {
137ff73ceedSLinus Walleij return 0;
138ff73ceedSLinus Walleij }
139ff73ceedSLinus Walleij
pinctrl_pm_select_idle_state(struct device * dev)140ff73ceedSLinus Walleij static inline int pinctrl_pm_select_idle_state(struct device *dev)
141ff73ceedSLinus Walleij {
142ff73ceedSLinus Walleij return 0;
143ff73ceedSLinus Walleij }
144ff73ceedSLinus Walleij
1456e5e959dSStephen Warren #endif /* CONFIG_PINCTRL */
1466e5e959dSStephen Warren
pinctrl_get_select(struct device * dev,const char * name)147*e5530adcSAndy Shevchenko static inline struct pinctrl * __must_check pinctrl_get_select(struct device *dev,
148*e5530adcSAndy Shevchenko const char *name)
14928a8d14cSLinus Walleij {
1506e5e959dSStephen Warren struct pinctrl *p;
1516e5e959dSStephen Warren struct pinctrl_state *s;
1526e5e959dSStephen Warren int ret;
1536e5e959dSStephen Warren
1546e5e959dSStephen Warren p = pinctrl_get(dev);
1556e5e959dSStephen Warren if (IS_ERR(p))
1566e5e959dSStephen Warren return p;
1576e5e959dSStephen Warren
1586e5e959dSStephen Warren s = pinctrl_lookup_state(p, name);
1596e5e959dSStephen Warren if (IS_ERR(s)) {
1606e5e959dSStephen Warren pinctrl_put(p);
16166eb3bd8SFabian Frederick return ERR_CAST(s);
16228a8d14cSLinus Walleij }
16328a8d14cSLinus Walleij
1646e5e959dSStephen Warren ret = pinctrl_select_state(p, s);
1656e5e959dSStephen Warren if (ret < 0) {
1666e5e959dSStephen Warren pinctrl_put(p);
1676e5e959dSStephen Warren return ERR_PTR(ret);
1686e5e959dSStephen Warren }
1696e5e959dSStephen Warren
1706e5e959dSStephen Warren return p;
1716e5e959dSStephen Warren }
1726e5e959dSStephen Warren
pinctrl_get_select_default(struct device * dev)173*e5530adcSAndy Shevchenko static inline struct pinctrl * __must_check pinctrl_get_select_default(struct device *dev)
1746e5e959dSStephen Warren {
1756e5e959dSStephen Warren return pinctrl_get_select(dev, PINCTRL_STATE_DEFAULT);
1766e5e959dSStephen Warren }
17728a8d14cSLinus Walleij
devm_pinctrl_get_select(struct device * dev,const char * name)178*e5530adcSAndy Shevchenko static inline struct pinctrl * __must_check devm_pinctrl_get_select(struct device *dev,
179*e5530adcSAndy Shevchenko const char *name)
1806d4ca1fbSStephen Warren {
1816d4ca1fbSStephen Warren struct pinctrl *p;
1826d4ca1fbSStephen Warren struct pinctrl_state *s;
1836d4ca1fbSStephen Warren int ret;
1846d4ca1fbSStephen Warren
1856d4ca1fbSStephen Warren p = devm_pinctrl_get(dev);
1866d4ca1fbSStephen Warren if (IS_ERR(p))
1876d4ca1fbSStephen Warren return p;
1886d4ca1fbSStephen Warren
1896d4ca1fbSStephen Warren s = pinctrl_lookup_state(p, name);
1906d4ca1fbSStephen Warren if (IS_ERR(s)) {
1916d4ca1fbSStephen Warren devm_pinctrl_put(p);
192e60bc2dfSUwe Kleine-König return ERR_CAST(s);
1936d4ca1fbSStephen Warren }
1946d4ca1fbSStephen Warren
1956d4ca1fbSStephen Warren ret = pinctrl_select_state(p, s);
1966d4ca1fbSStephen Warren if (ret < 0) {
1976d4ca1fbSStephen Warren devm_pinctrl_put(p);
1986d4ca1fbSStephen Warren return ERR_PTR(ret);
1996d4ca1fbSStephen Warren }
2006d4ca1fbSStephen Warren
2016d4ca1fbSStephen Warren return p;
2026d4ca1fbSStephen Warren }
2036d4ca1fbSStephen Warren
devm_pinctrl_get_select_default(struct device * dev)204*e5530adcSAndy Shevchenko static inline struct pinctrl * __must_check devm_pinctrl_get_select_default(struct device *dev)
2056d4ca1fbSStephen Warren {
2066d4ca1fbSStephen Warren return devm_pinctrl_get_select(dev, PINCTRL_STATE_DEFAULT);
2076d4ca1fbSStephen Warren }
2086d4ca1fbSStephen Warren
20928a8d14cSLinus Walleij #endif /* __LINUX_PINCTRL_CONSUMER_H */
210