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_init_state(struct device *dev);
52int pinctrl_pm_select_sleep_state(struct device *dev);
53int pinctrl_pm_select_idle_state(struct device *dev);
54#else
55static inline int pinctrl_pm_select_default_state(struct device *dev)
56{
57 return 0;
58}
59static inline int pinctrl_pm_select_init_state(struct device *dev)
60{
61 return 0;
62}
63static inline int pinctrl_pm_select_sleep_state(struct device *dev)
64{
65 return 0;
66}
67static inline int pinctrl_pm_select_idle_state(struct device *dev)
68{
69 return 0;
70}
71#endif
72
73#else /* !CONFIG_PINCTRL */
74
75static inline bool
76pinctrl_gpio_can_use_line(struct gpio_chip *gc, unsigned int offset)
77{
78 return true;
79}
80
81static inline int
82pinctrl_gpio_request(struct gpio_chip *gc, unsigned int offset)
83{
84 return 0;
85}
86
87static inline void
88pinctrl_gpio_free(struct gpio_chip *gc, unsigned int offset)
89{
90}
91
92static inline int
93pinctrl_gpio_direction_input(struct gpio_chip *gc, unsigned int offset)
94{
95 return 0;
96}
97
98static inline int
99pinctrl_gpio_direction_output(struct gpio_chip *gc, unsigned int offset)
100{
101 return 0;
102}
103
104static inline int
105pinctrl_gpio_set_config(struct gpio_chip *gc, unsigned int offset,
106 unsigned long config)
107{
108 return 0;
109}
110
111static inline struct pinctrl * __must_check pinctrl_get(struct device *dev)
112{
113 return NULL;
114}
115
116static inline void pinctrl_put(struct pinctrl *p)
117{
118}
119
120static inline struct pinctrl_state * __must_check pinctrl_lookup_state(struct pinctrl *p,
121 const char *name)
122{
123 return NULL;
124}
125
126static inline int pinctrl_select_state(struct pinctrl *p,
127 struct pinctrl_state *s)
128{
129 return 0;
130}
131
132static inline struct pinctrl * __must_check devm_pinctrl_get(struct device *dev)
133{
134 return NULL;
135}
136
137static inline void devm_pinctrl_put(struct pinctrl *p)
138{
139}
140
141static inline int pinctrl_select_default_state(struct device *dev)
142{
143 return 0;
144}
145
146static inline int pinctrl_pm_select_default_state(struct device *dev)
147{
148 return 0;
149}
150
151static inline int pinctrl_pm_select_init_state(struct device *dev)
152{
153 return 0;
154}
155
156static inline int pinctrl_pm_select_sleep_state(struct device *dev)
157{
158 return 0;
159}
160
161static inline int pinctrl_pm_select_idle_state(struct device *dev)
162{
163 return 0;
164}
165
166#endif /* CONFIG_PINCTRL */
167
168static inline struct pinctrl * __must_check pinctrl_get_select(struct device *dev,
169 const char *name)
170{
171 struct pinctrl *p;
172 struct pinctrl_state *s;
173 int ret;
174
175 p = pinctrl_get(dev);
176 if (IS_ERR(ptr: p))
177 return p;
178
179 s = pinctrl_lookup_state(p, name);
180 if (IS_ERR(ptr: s)) {
181 pinctrl_put(p);
182 return ERR_CAST(ptr: s);
183 }
184
185 ret = pinctrl_select_state(p, s);
186 if (ret < 0) {
187 pinctrl_put(p);
188 return ERR_PTR(error: ret);
189 }
190
191 return p;
192}
193
194static inline struct pinctrl * __must_check pinctrl_get_select_default(struct device *dev)
195{
196 return pinctrl_get_select(dev, PINCTRL_STATE_DEFAULT);
197}
198
199static inline struct pinctrl * __must_check devm_pinctrl_get_select(struct device *dev,
200 const char *name)
201{
202 struct pinctrl *p;
203 struct pinctrl_state *s;
204 int ret;
205
206 p = devm_pinctrl_get(dev);
207 if (IS_ERR(ptr: p))
208 return p;
209
210 s = pinctrl_lookup_state(p, name);
211 if (IS_ERR(ptr: s)) {
212 devm_pinctrl_put(p);
213 return ERR_CAST(ptr: s);
214 }
215
216 ret = pinctrl_select_state(p, s);
217 if (ret < 0) {
218 devm_pinctrl_put(p);
219 return ERR_PTR(error: ret);
220 }
221
222 return p;
223}
224
225static inline struct pinctrl * __must_check devm_pinctrl_get_select_default(struct device *dev)
226{
227 return devm_pinctrl_get_select(dev, PINCTRL_STATE_DEFAULT);
228}
229
230#endif /* __LINUX_PINCTRL_CONSUMER_H */
231