xref: /linux-6.15/include/linux/pinctrl/consumer.h (revision acf2981b)
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