blob: 7f8c7d9583d36e6d2755aa8d6d4f29d5a99e5b7e [file] [log] [blame]
David Brazdil0f672f62019-12-10 10:32:29 +00001/* SPDX-License-Identifier: GPL-2.0-only */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002/*
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>
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000010 */
11#ifndef __LINUX_PINCTRL_CONSUMER_H
12#define __LINUX_PINCTRL_CONSUMER_H
13
14#include <linux/err.h>
15#include <linux/list.h>
16#include <linux/seq_file.h>
17#include <linux/pinctrl/pinctrl-state.h>
18
19/* This struct is private to the core and should be regarded as a cookie */
20struct pinctrl;
21struct pinctrl_state;
22struct device;
23
24#ifdef CONFIG_PINCTRL
25
26/* External interface to pin control */
David Brazdil0f672f62019-12-10 10:32:29 +000027extern bool pinctrl_gpio_can_use_line(unsigned gpio);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000028extern int pinctrl_gpio_request(unsigned gpio);
29extern void pinctrl_gpio_free(unsigned gpio);
30extern int pinctrl_gpio_direction_input(unsigned gpio);
31extern int pinctrl_gpio_direction_output(unsigned gpio);
32extern int pinctrl_gpio_set_config(unsigned gpio, unsigned long config);
33
34extern struct pinctrl * __must_check pinctrl_get(struct device *dev);
35extern void pinctrl_put(struct pinctrl *p);
36extern struct pinctrl_state * __must_check pinctrl_lookup_state(
37 struct pinctrl *p,
38 const char *name);
39extern int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *s);
40
41extern struct pinctrl * __must_check devm_pinctrl_get(struct device *dev);
42extern void devm_pinctrl_put(struct pinctrl *p);
43
44#ifdef CONFIG_PM
45extern int pinctrl_pm_select_default_state(struct device *dev);
46extern int pinctrl_pm_select_sleep_state(struct device *dev);
47extern int pinctrl_pm_select_idle_state(struct device *dev);
48#else
49static inline int pinctrl_pm_select_default_state(struct device *dev)
50{
51 return 0;
52}
53static inline int pinctrl_pm_select_sleep_state(struct device *dev)
54{
55 return 0;
56}
57static inline int pinctrl_pm_select_idle_state(struct device *dev)
58{
59 return 0;
60}
61#endif
62
63#else /* !CONFIG_PINCTRL */
64
David Brazdil0f672f62019-12-10 10:32:29 +000065static inline bool pinctrl_gpio_can_use_line(unsigned gpio)
66{
67 return true;
68}
69
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000070static inline int pinctrl_gpio_request(unsigned gpio)
71{
72 return 0;
73}
74
75static inline void pinctrl_gpio_free(unsigned gpio)
76{
77}
78
79static inline int pinctrl_gpio_direction_input(unsigned gpio)
80{
81 return 0;
82}
83
84static inline int pinctrl_gpio_direction_output(unsigned gpio)
85{
86 return 0;
87}
88
89static inline int pinctrl_gpio_set_config(unsigned gpio, unsigned long config)
90{
91 return 0;
92}
93
94static inline struct pinctrl * __must_check pinctrl_get(struct device *dev)
95{
96 return NULL;
97}
98
99static inline void pinctrl_put(struct pinctrl *p)
100{
101}
102
103static inline struct pinctrl_state * __must_check pinctrl_lookup_state(
104 struct pinctrl *p,
105 const char *name)
106{
107 return NULL;
108}
109
110static inline int pinctrl_select_state(struct pinctrl *p,
111 struct pinctrl_state *s)
112{
113 return 0;
114}
115
116static inline struct pinctrl * __must_check devm_pinctrl_get(struct device *dev)
117{
118 return NULL;
119}
120
121static inline void devm_pinctrl_put(struct pinctrl *p)
122{
123}
124
125static inline int pinctrl_pm_select_default_state(struct device *dev)
126{
127 return 0;
128}
129
130static inline int pinctrl_pm_select_sleep_state(struct device *dev)
131{
132 return 0;
133}
134
135static inline int pinctrl_pm_select_idle_state(struct device *dev)
136{
137 return 0;
138}
139
140#endif /* CONFIG_PINCTRL */
141
142static inline struct pinctrl * __must_check pinctrl_get_select(
143 struct device *dev, const char *name)
144{
145 struct pinctrl *p;
146 struct pinctrl_state *s;
147 int ret;
148
149 p = pinctrl_get(dev);
150 if (IS_ERR(p))
151 return p;
152
153 s = pinctrl_lookup_state(p, name);
154 if (IS_ERR(s)) {
155 pinctrl_put(p);
156 return ERR_CAST(s);
157 }
158
159 ret = pinctrl_select_state(p, s);
160 if (ret < 0) {
161 pinctrl_put(p);
162 return ERR_PTR(ret);
163 }
164
165 return p;
166}
167
168static inline struct pinctrl * __must_check pinctrl_get_select_default(
169 struct device *dev)
170{
171 return pinctrl_get_select(dev, PINCTRL_STATE_DEFAULT);
172}
173
174static inline struct pinctrl * __must_check devm_pinctrl_get_select(
175 struct device *dev, const char *name)
176{
177 struct pinctrl *p;
178 struct pinctrl_state *s;
179 int ret;
180
181 p = devm_pinctrl_get(dev);
182 if (IS_ERR(p))
183 return p;
184
185 s = pinctrl_lookup_state(p, name);
186 if (IS_ERR(s)) {
187 devm_pinctrl_put(p);
188 return ERR_CAST(s);
189 }
190
191 ret = pinctrl_select_state(p, s);
192 if (ret < 0) {
193 devm_pinctrl_put(p);
194 return ERR_PTR(ret);
195 }
196
197 return p;
198}
199
200static inline struct pinctrl * __must_check devm_pinctrl_get_select_default(
201 struct device *dev)
202{
203 return devm_pinctrl_get_select(dev, PINCTRL_STATE_DEFAULT);
204}
205
206#endif /* __LINUX_PINCTRL_CONSUMER_H */