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