1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#ifndef __LINUX_EXTCON_H__
27#define __LINUX_EXTCON_H__
28
29#include <linux/device.h>
30
31
32
33
34#define EXTCON_NONE 0
35
36
37#define EXTCON_USB 1
38#define EXTCON_USB_HOST 2
39
40
41#define EXTCON_CHG_USB_SDP 5
42#define EXTCON_CHG_USB_DCP 6
43#define EXTCON_CHG_USB_CDP 7
44#define EXTCON_CHG_USB_ACA 8
45#define EXTCON_CHG_USB_FAST 9
46#define EXTCON_CHG_USB_SLOW 10
47
48
49#define EXTCON_JACK_MICROPHONE 20
50#define EXTCON_JACK_HEADPHONE 21
51#define EXTCON_JACK_LINE_IN 22
52#define EXTCON_JACK_LINE_OUT 23
53#define EXTCON_JACK_VIDEO_IN 24
54#define EXTCON_JACK_VIDEO_OUT 25
55#define EXTCON_JACK_SPDIF_IN 26
56#define EXTCON_JACK_SPDIF_OUT 27
57
58
59#define EXTCON_DISP_HDMI 40
60#define EXTCON_DISP_MHL 41
61#define EXTCON_DISP_DVI 42
62#define EXTCON_DISP_VGA 43
63
64
65#define EXTCON_DOCK 60
66#define EXTCON_JIG 61
67#define EXTCON_MECHANICAL 62
68
69#define EXTCON_NUM 63
70
71struct extcon_cable;
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105struct extcon_dev {
106
107 const char *name;
108 const unsigned int *supported_cable;
109 const u32 *mutually_exclusive;
110
111
112 struct device dev;
113 struct raw_notifier_head *nh;
114 struct list_head entry;
115 int max_supported;
116 spinlock_t lock;
117 u32 state;
118
119
120 struct device_type extcon_dev_type;
121 struct extcon_cable *cables;
122
123
124 struct attribute_group attr_g_muex;
125 struct attribute **attrs_muex;
126 struct device_attribute *d_attrs_muex;
127};
128
129#if IS_ENABLED(CONFIG_EXTCON)
130
131
132
133
134
135extern int extcon_dev_register(struct extcon_dev *edev);
136extern void extcon_dev_unregister(struct extcon_dev *edev);
137extern int devm_extcon_dev_register(struct device *dev,
138 struct extcon_dev *edev);
139extern void devm_extcon_dev_unregister(struct device *dev,
140 struct extcon_dev *edev);
141extern struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name);
142
143
144
145
146extern struct extcon_dev *extcon_dev_allocate(const unsigned int *cable);
147extern void extcon_dev_free(struct extcon_dev *edev);
148extern struct extcon_dev *devm_extcon_dev_allocate(struct device *dev,
149 const unsigned int *cable);
150extern void devm_extcon_dev_free(struct device *dev, struct extcon_dev *edev);
151
152
153
154
155
156
157
158static inline u32 extcon_get_state(struct extcon_dev *edev)
159{
160 return edev->state;
161}
162
163extern int extcon_set_state(struct extcon_dev *edev, u32 state);
164extern int extcon_update_state(struct extcon_dev *edev, u32 mask, u32 state);
165
166
167
168
169
170extern int extcon_get_cable_state_(struct extcon_dev *edev, unsigned int id);
171extern int extcon_set_cable_state_(struct extcon_dev *edev, unsigned int id,
172 bool cable_state);
173
174
175
176
177
178
179
180
181extern int extcon_register_notifier(struct extcon_dev *edev, unsigned int id,
182 struct notifier_block *nb);
183extern int extcon_unregister_notifier(struct extcon_dev *edev, unsigned int id,
184 struct notifier_block *nb);
185extern int devm_extcon_register_notifier(struct device *dev,
186 struct extcon_dev *edev, unsigned int id,
187 struct notifier_block *nb);
188extern void devm_extcon_unregister_notifier(struct device *dev,
189 struct extcon_dev *edev, unsigned int id,
190 struct notifier_block *nb);
191
192
193
194
195
196extern struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev,
197 int index);
198
199
200extern const char *extcon_get_edev_name(struct extcon_dev *edev);
201
202
203#else
204static inline int extcon_dev_register(struct extcon_dev *edev)
205{
206 return 0;
207}
208
209static inline void extcon_dev_unregister(struct extcon_dev *edev) { }
210
211static inline int devm_extcon_dev_register(struct device *dev,
212 struct extcon_dev *edev)
213{
214 return -EINVAL;
215}
216
217static inline void devm_extcon_dev_unregister(struct device *dev,
218 struct extcon_dev *edev) { }
219
220static inline struct extcon_dev *extcon_dev_allocate(const unsigned int *cable)
221{
222 return ERR_PTR(-ENOSYS);
223}
224
225static inline void extcon_dev_free(struct extcon_dev *edev) { }
226
227static inline struct extcon_dev *devm_extcon_dev_allocate(struct device *dev,
228 const unsigned int *cable)
229{
230 return ERR_PTR(-ENOSYS);
231}
232
233static inline void devm_extcon_dev_free(struct extcon_dev *edev) { }
234
235static inline u32 extcon_get_state(struct extcon_dev *edev)
236{
237 return 0;
238}
239
240static inline int extcon_set_state(struct extcon_dev *edev, u32 state)
241{
242 return 0;
243}
244
245static inline int extcon_update_state(struct extcon_dev *edev, u32 mask,
246 u32 state)
247{
248 return 0;
249}
250
251static inline int extcon_get_cable_state_(struct extcon_dev *edev,
252 unsigned int id)
253{
254 return 0;
255}
256
257static inline int extcon_set_cable_state_(struct extcon_dev *edev,
258 unsigned int id, bool cable_state)
259{
260 return 0;
261}
262
263static inline struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name)
264{
265 return NULL;
266}
267
268static inline int extcon_register_notifier(struct extcon_dev *edev,
269 unsigned int id,
270 struct notifier_block *nb)
271{
272 return 0;
273}
274
275static inline int extcon_unregister_notifier(struct extcon_dev *edev,
276 unsigned int id,
277 struct notifier_block *nb)
278{
279 return 0;
280}
281
282static inline int devm_extcon_register_notifier(struct device *dev,
283 struct extcon_dev *edev, unsigned int id,
284 struct notifier_block *nb)
285{
286 return -ENOSYS;
287}
288
289static inline void devm_extcon_unregister_notifier(struct device *dev,
290 struct extcon_dev *edev, unsigned int id,
291 struct notifier_block *nb) { }
292
293static inline struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev,
294 int index)
295{
296 return ERR_PTR(-ENODEV);
297}
298#endif
299
300
301
302
303
304struct extcon_specific_cable_nb {
305 struct notifier_block *user_nb;
306 int cable_index;
307 struct extcon_dev *edev;
308 unsigned long previous_value;
309};
310
311static inline int extcon_register_interest(struct extcon_specific_cable_nb *obj,
312 const char *extcon_name, const char *cable_name,
313 struct notifier_block *nb)
314{
315 return -EINVAL;
316}
317
318static inline int extcon_unregister_interest(struct extcon_specific_cable_nb
319 *obj)
320{
321 return -EINVAL;
322}
323#endif
324