Commit | Line | Data |
---|---|---|
af873fce | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
28a8d14c LW |
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> | |
28a8d14c LW |
10 | */ |
11 | #ifndef __LINUX_PINCTRL_CONSUMER_H | |
12 | #define __LINUX_PINCTRL_CONSUMER_H | |
13 | ||
6e5e959d | 14 | #include <linux/err.h> |
e5530adc AS |
15 | #include <linux/types.h> |
16 | ||
a1ce3928 | 17 | #include <linux/pinctrl/pinctrl-state.h> |
28a8d14c | 18 | |
e5530adc | 19 | struct device; |
ec963d04 | 20 | struct gpio_chip; |
e5530adc | 21 | |
28a8d14c | 22 | /* This struct is private to the core and should be regarded as a cookie */ |
e93bcee0 | 23 | struct pinctrl; |
6e5e959d | 24 | struct pinctrl_state; |
28a8d14c | 25 | |
befe5bdf | 26 | #ifdef CONFIG_PINCTRL |
28a8d14c | 27 | |
befe5bdf | 28 | /* External interface to pin control */ |
00762e41 | 29 | bool pinctrl_gpio_can_use_line(struct gpio_chip *gc, unsigned int offset); |
acb38be6 | 30 | int pinctrl_gpio_request(struct gpio_chip *gc, unsigned int offset); |
4fccb263 | 31 | void pinctrl_gpio_free(struct gpio_chip *gc, unsigned int offset); |
315c46f9 BG |
32 | int pinctrl_gpio_direction_input(struct gpio_chip *gc, |
33 | unsigned int offset); | |
b679d6c0 BG |
34 | int pinctrl_gpio_direction_output(struct gpio_chip *gc, |
35 | unsigned int offset); | |
acf2981b | 36 | int pinctrl_gpio_set_config(struct gpio_chip *gc, unsigned int offset, |
ec963d04 | 37 | unsigned long config); |
9596ebf8 BG |
38 | |
39 | struct pinctrl * __must_check pinctrl_get(struct device *dev); | |
40 | void pinctrl_put(struct pinctrl *p); | |
41 | struct pinctrl_state * __must_check pinctrl_lookup_state(struct pinctrl *p, | |
42 | const char *name); | |
43 | int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *s); | |
44 | ||
45 | struct pinctrl * __must_check devm_pinctrl_get(struct device *dev); | |
46 | void devm_pinctrl_put(struct pinctrl *p); | |
47 | int pinctrl_select_default_state(struct device *dev); | |
6d4ca1fb | 48 | |
14005ee2 | 49 | #ifdef CONFIG_PM |
9596ebf8 BG |
50 | int pinctrl_pm_select_default_state(struct device *dev); |
51 | int pinctrl_pm_select_sleep_state(struct device *dev); | |
52 | int pinctrl_pm_select_idle_state(struct device *dev); | |
14005ee2 LW |
53 | #else |
54 | static inline int pinctrl_pm_select_default_state(struct device *dev) | |
55 | { | |
56 | return 0; | |
57 | } | |
58 | static inline int pinctrl_pm_select_sleep_state(struct device *dev) | |
59 | { | |
60 | return 0; | |
61 | } | |
62 | static inline int pinctrl_pm_select_idle_state(struct device *dev) | |
63 | { | |
64 | return 0; | |
65 | } | |
66 | #endif | |
67 | ||
befe5bdf | 68 | #else /* !CONFIG_PINCTRL */ |
28a8d14c | 69 | |
ec963d04 | 70 | static inline bool |
00762e41 | 71 | pinctrl_gpio_can_use_line(struct gpio_chip *gc, unsigned int offset) |
ec963d04 BG |
72 | { |
73 | return true; | |
74 | } | |
75 | ||
ec963d04 | 76 | static inline int |
acb38be6 | 77 | pinctrl_gpio_request(struct gpio_chip *gc, unsigned int offset) |
ec963d04 BG |
78 | { |
79 | return 0; | |
80 | } | |
81 | ||
ec963d04 | 82 | static inline void |
4fccb263 | 83 | pinctrl_gpio_free(struct gpio_chip *gc, unsigned int offset) |
ec963d04 BG |
84 | { |
85 | } | |
86 | ||
ec963d04 | 87 | static inline int |
315c46f9 | 88 | pinctrl_gpio_direction_input(struct gpio_chip *gc, unsigned int offset) |
ec963d04 BG |
89 | { |
90 | return 0; | |
91 | } | |
92 | ||
ec963d04 | 93 | static inline int |
b679d6c0 | 94 | pinctrl_gpio_direction_output(struct gpio_chip *gc, unsigned int offset) |
ec963d04 BG |
95 | { |
96 | return 0; | |
97 | } | |
98 | ||
ec963d04 | 99 | static inline int |
acf2981b | 100 | pinctrl_gpio_set_config(struct gpio_chip *gc, unsigned int offset, |
ec963d04 BG |
101 | unsigned long config) |
102 | { | |
103 | return 0; | |
104 | } | |
105 | ||
6e5e959d | 106 | static inline struct pinctrl * __must_check pinctrl_get(struct device *dev) |
28a8d14c | 107 | { |
40eeb111 | 108 | return NULL; |
28a8d14c LW |
109 | } |
110 | ||
e93bcee0 | 111 | static inline void pinctrl_put(struct pinctrl *p) |
28a8d14c LW |
112 | { |
113 | } | |
114 | ||
e5530adc AS |
115 | static inline struct pinctrl_state * __must_check pinctrl_lookup_state(struct pinctrl *p, |
116 | const char *name) | |
28a8d14c | 117 | { |
40eeb111 | 118 | return NULL; |
28a8d14c LW |
119 | } |
120 | ||
6e5e959d SW |
121 | static inline int pinctrl_select_state(struct pinctrl *p, |
122 | struct pinctrl_state *s) | |
28a8d14c | 123 | { |
6e5e959d | 124 | return 0; |
28a8d14c LW |
125 | } |
126 | ||
6d4ca1fb SW |
127 | static inline struct pinctrl * __must_check devm_pinctrl_get(struct device *dev) |
128 | { | |
40eeb111 | 129 | return NULL; |
6d4ca1fb SW |
130 | } |
131 | ||
132 | static inline void devm_pinctrl_put(struct pinctrl *p) | |
133 | { | |
134 | } | |
135 | ||
55d54d1e UH |
136 | static inline int pinctrl_select_default_state(struct device *dev) |
137 | { | |
138 | return 0; | |
139 | } | |
140 | ||
ff73ceed LW |
141 | static inline int pinctrl_pm_select_default_state(struct device *dev) |
142 | { | |
143 | return 0; | |
144 | } | |
145 | ||
146 | static inline int pinctrl_pm_select_sleep_state(struct device *dev) | |
147 | { | |
148 | return 0; | |
149 | } | |
150 | ||
151 | static inline int pinctrl_pm_select_idle_state(struct device *dev) | |
152 | { | |
153 | return 0; | |
154 | } | |
155 | ||
befe5bdf | 156 | #endif /* CONFIG_PINCTRL */ |
28a8d14c | 157 | |
e5530adc AS |
158 | static inline struct pinctrl * __must_check pinctrl_get_select(struct device *dev, |
159 | const char *name) | |
6e5e959d SW |
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); | |
66eb3bd8 | 172 | return ERR_CAST(s); |
6e5e959d SW |
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 | ||
e5530adc | 184 | static inline struct pinctrl * __must_check pinctrl_get_select_default(struct device *dev) |
6e5e959d SW |
185 | { |
186 | return pinctrl_get_select(dev, PINCTRL_STATE_DEFAULT); | |
6d4ca1fb SW |
187 | } |
188 | ||
e5530adc AS |
189 | static inline struct pinctrl * __must_check devm_pinctrl_get_select(struct device *dev, |
190 | const char *name) | |
6d4ca1fb SW |
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); | |
e60bc2df | 203 | return ERR_CAST(s); |
6d4ca1fb SW |
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 | ||
e5530adc | 215 | static inline struct pinctrl * __must_check devm_pinctrl_get_select_default(struct device *dev) |
6d4ca1fb SW |
216 | { |
217 | return devm_pinctrl_get_select(dev, PINCTRL_STATE_DEFAULT); | |
6e5e959d SW |
218 | } |
219 | ||
28a8d14c | 220 | #endif /* __LINUX_PINCTRL_CONSUMER_H */ |