1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Consumer interface the pin control subsystem
4 *
5 * Copyright (C) 2012 ST-Ericsson SA
6 * Written on behalf of Linaro for ST-Ericsson
7 * Based on bits of regulator core, gpio core and clk core
8 *
9 * Author: Linus Walleij <linus.walleij@linaro.org>
10 */
11#ifndef __LINUX_PINCTRL_CONSUMER_H
12#define __LINUX_PINCTRL_CONSUMER_H
13
14#include <linux/err.h>
15#include <linux/types.h>
16
17#include <linux/pinctrl/pinctrl-state.h>
18
19struct device;
20struct gpio_chip;
21
22/* This struct is private to the core and should be regarded as a cookie */
23struct pinctrl;
24struct pinctrl_state;
25
26#ifdef CONFIG_PINCTRL
27
28/* External interface to pin control */
29bool pinctrl_gpio_can_use_line(struct gpio_chip *gc, unsigned int offset);
30int pinctrl_gpio_request(struct gpio_chip *gc, unsigned int offset);
31void pinctrl_gpio_free(struct gpio_chip *gc, unsigned int offset);
32int pinctrl_gpio_direction_input(struct gpio_chip *gc,
33				 unsigned int offset);
34int pinctrl_gpio_direction_output(struct gpio_chip *gc,
35				  unsigned int offset);
36int pinctrl_gpio_set_config(struct gpio_chip *gc, unsigned int offset,
37				unsigned long config);
38
39struct pinctrl * __must_check pinctrl_get(struct device *dev);
40void pinctrl_put(struct pinctrl *p);
41struct pinctrl_state * __must_check pinctrl_lookup_state(struct pinctrl *p,
42							 const char *name);
43int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *s);
44
45struct pinctrl * __must_check devm_pinctrl_get(struct device *dev);
46void devm_pinctrl_put(struct pinctrl *p);
47int pinctrl_select_default_state(struct device *dev);
48
49#ifdef CONFIG_PM
50int pinctrl_pm_select_default_state(struct device *dev);
51int pinctrl_pm_select_sleep_state(struct device *dev);
52int pinctrl_pm_select_idle_state(struct device *dev);
53#else
54static inline int pinctrl_pm_select_default_state(struct device *dev)
55{
56	return 0;
57}
58static inline int pinctrl_pm_select_sleep_state(struct device *dev)
59{
60	return 0;
61}
62static inline int pinctrl_pm_select_idle_state(struct device *dev)
63{
64	return 0;
65}
66#endif
67
68#else /* !CONFIG_PINCTRL */
69
70static inline bool
71pinctrl_gpio_can_use_line(struct gpio_chip *gc, unsigned int offset)
72{
73	return true;
74}
75
76static inline int
77pinctrl_gpio_request(struct gpio_chip *gc, unsigned int offset)
78{
79	return 0;
80}
81
82static inline void
83pinctrl_gpio_free(struct gpio_chip *gc, unsigned int offset)
84{
85}
86
87static inline int
88pinctrl_gpio_direction_input(struct gpio_chip *gc, unsigned int offset)
89{
90	return 0;
91}
92
93static inline int
94pinctrl_gpio_direction_output(struct gpio_chip *gc, unsigned int offset)
95{
96	return 0;
97}
98
99static inline int
100pinctrl_gpio_set_config(struct gpio_chip *gc, unsigned int offset,
101			    unsigned long config)
102{
103	return 0;
104}
105
106static inline struct pinctrl * __must_check pinctrl_get(struct device *dev)
107{
108	return NULL;
109}
110
111static inline void pinctrl_put(struct pinctrl *p)
112{
113}
114
115static inline struct pinctrl_state * __must_check pinctrl_lookup_state(struct pinctrl *p,
116								       const char *name)
117{
118	return NULL;
119}
120
121static inline int pinctrl_select_state(struct pinctrl *p,
122				       struct pinctrl_state *s)
123{
124	return 0;
125}
126
127static inline struct pinctrl * __must_check devm_pinctrl_get(struct device *dev)
128{
129	return NULL;
130}
131
132static inline void devm_pinctrl_put(struct pinctrl *p)
133{
134}
135
136static inline int pinctrl_select_default_state(struct device *dev)
137{
138	return 0;
139}
140
141static inline int pinctrl_pm_select_default_state(struct device *dev)
142{
143	return 0;
144}
145
146static inline int pinctrl_pm_select_sleep_state(struct device *dev)
147{
148	return 0;
149}
150
151static inline int pinctrl_pm_select_idle_state(struct device *dev)
152{
153	return 0;
154}
155
156#endif /* CONFIG_PINCTRL */
157
158static inline struct pinctrl * __must_check pinctrl_get_select(struct device *dev,
159							       const char *name)
160{
161	struct pinctrl *p;
162	struct pinctrl_state *s;
163	int ret;
164
165	p = pinctrl_get(dev);
166	if (IS_ERR(p))
167		return p;
168
169	s = pinctrl_lookup_state(p, name);
170	if (IS_ERR(s)) {
171		pinctrl_put(p);
172		return ERR_CAST(s);
173	}
174
175	ret = pinctrl_select_state(p, s);
176	if (ret < 0) {
177		pinctrl_put(p);
178		return ERR_PTR(ret);
179	}
180
181	return p;
182}
183
184static inline struct pinctrl * __must_check pinctrl_get_select_default(struct device *dev)
185{
186	return pinctrl_get_select(dev, PINCTRL_STATE_DEFAULT);
187}
188
189static inline struct pinctrl * __must_check devm_pinctrl_get_select(struct device *dev,
190								    const char *name)
191{
192	struct pinctrl *p;
193	struct pinctrl_state *s;
194	int ret;
195
196	p = devm_pinctrl_get(dev);
197	if (IS_ERR(p))
198		return p;
199
200	s = pinctrl_lookup_state(p, name);
201	if (IS_ERR(s)) {
202		devm_pinctrl_put(p);
203		return ERR_CAST(s);
204	}
205
206	ret = pinctrl_select_state(p, s);
207	if (ret < 0) {
208		devm_pinctrl_put(p);
209		return ERR_PTR(ret);
210	}
211
212	return p;
213}
214
215static inline struct pinctrl * __must_check devm_pinctrl_get_select_default(struct device *dev)
216{
217	return devm_pinctrl_get_select(dev, PINCTRL_STATE_DEFAULT);
218}
219
220#endif /* __LINUX_PINCTRL_CONSUMER_H */
221