1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * External Connector (extcon) framework |
4 | * - linux/include/linux/extcon.h for extcon consumer device driver. |
5 | * |
6 | * Copyright (C) 2015 Samsung Electronics |
7 | * Author: Chanwoo Choi <cw00.choi@samsung.com> |
8 | * |
9 | * Copyright (C) 2012 Samsung Electronics |
10 | * Author: Donggeun Kim <dg77.kim@samsung.com> |
11 | * Author: MyungJoo Ham <myungjoo.ham@samsung.com> |
12 | * |
13 | * based on switch class driver |
14 | * Copyright (C) 2008 Google, Inc. |
15 | * Author: Mike Lockwood <lockwood@android.com> |
16 | */ |
17 | |
18 | #ifndef __LINUX_EXTCON_H__ |
19 | #define __LINUX_EXTCON_H__ |
20 | |
21 | #include <linux/device.h> |
22 | |
23 | /* |
24 | * Define the type of supported external connectors |
25 | */ |
26 | #define EXTCON_TYPE_USB BIT(0) /* USB connector */ |
27 | #define EXTCON_TYPE_CHG BIT(1) /* Charger connector */ |
28 | #define EXTCON_TYPE_JACK BIT(2) /* Jack connector */ |
29 | #define EXTCON_TYPE_DISP BIT(3) /* Display connector */ |
30 | #define EXTCON_TYPE_MISC BIT(4) /* Miscellaneous connector */ |
31 | |
32 | /* |
33 | * Define the unique id of supported external connectors |
34 | */ |
35 | #define EXTCON_NONE 0 |
36 | |
37 | /* USB external connector */ |
38 | #define EXTCON_USB 1 |
39 | #define EXTCON_USB_HOST 2 |
40 | |
41 | /* |
42 | * Charging external connector |
43 | * |
44 | * When one SDP charger connector was reported, we should also report |
45 | * the USB connector, which means EXTCON_CHG_USB_SDP should always |
46 | * appear together with EXTCON_USB. The same as ACA charger connector, |
47 | * EXTCON_CHG_USB_ACA would normally appear with EXTCON_USB_HOST. |
48 | * |
49 | * The EXTCON_CHG_USB_SLOW connector can provide at least 500mA of |
50 | * current at 5V. The EXTCON_CHG_USB_FAST connector can provide at |
51 | * least 1A of current at 5V. |
52 | */ |
53 | #define EXTCON_CHG_USB_SDP 5 /* Standard Downstream Port */ |
54 | #define EXTCON_CHG_USB_DCP 6 /* Dedicated Charging Port */ |
55 | #define EXTCON_CHG_USB_CDP 7 /* Charging Downstream Port */ |
56 | #define EXTCON_CHG_USB_ACA 8 /* Accessory Charger Adapter */ |
57 | #define EXTCON_CHG_USB_FAST 9 |
58 | #define EXTCON_CHG_USB_SLOW 10 |
59 | #define EXTCON_CHG_WPT 11 /* Wireless Power Transfer */ |
60 | #define EXTCON_CHG_USB_PD 12 /* USB Power Delivery */ |
61 | |
62 | /* Jack external connector */ |
63 | #define EXTCON_JACK_MICROPHONE 20 |
64 | #define EXTCON_JACK_HEADPHONE 21 |
65 | #define EXTCON_JACK_LINE_IN 22 |
66 | #define EXTCON_JACK_LINE_OUT 23 |
67 | #define EXTCON_JACK_VIDEO_IN 24 |
68 | #define EXTCON_JACK_VIDEO_OUT 25 |
69 | #define EXTCON_JACK_SPDIF_IN 26 /* Sony Philips Digital InterFace */ |
70 | #define EXTCON_JACK_SPDIF_OUT 27 |
71 | |
72 | /* Display external connector */ |
73 | #define EXTCON_DISP_HDMI 40 /* High-Definition Multimedia Interface */ |
74 | #define EXTCON_DISP_MHL 41 /* Mobile High-Definition Link */ |
75 | #define EXTCON_DISP_DVI 42 /* Digital Visual Interface */ |
76 | #define EXTCON_DISP_VGA 43 /* Video Graphics Array */ |
77 | #define EXTCON_DISP_DP 44 /* Display Port */ |
78 | #define EXTCON_DISP_HMD 45 /* Head-Mounted Display */ |
79 | #define EXTCON_DISP_CVBS 46 /* Composite Video Broadcast Signal */ |
80 | #define EXTCON_DISP_EDP 47 /* Embedded Display Port */ |
81 | |
82 | /* Miscellaneous external connector */ |
83 | #define EXTCON_DOCK 60 |
84 | #define EXTCON_JIG 61 |
85 | #define EXTCON_MECHANICAL 62 |
86 | |
87 | #define EXTCON_NUM 63 |
88 | |
89 | /* |
90 | * Define the properties of supported external connectors. |
91 | * |
92 | * When adding the new extcon property, they *must* have |
93 | * the type/value/default information. Also, you *have to* |
94 | * modify the EXTCON_PROP_[type]_START/END definitions |
95 | * which mean the range of the supported properties |
96 | * for each extcon type. |
97 | * |
98 | * The naming style of property |
99 | * : EXTCON_PROP_[type]_[property name] |
100 | * |
101 | * EXTCON_PROP_USB_[property name] : USB property |
102 | * EXTCON_PROP_CHG_[property name] : Charger property |
103 | * EXTCON_PROP_JACK_[property name] : Jack property |
104 | * EXTCON_PROP_DISP_[property name] : Display property |
105 | */ |
106 | |
107 | /* |
108 | * Properties of EXTCON_TYPE_USB. |
109 | * |
110 | * - EXTCON_PROP_USB_VBUS |
111 | * @type: integer (intval) |
112 | * @value: 0 (low) or 1 (high) |
113 | * @default: 0 (low) |
114 | * - EXTCON_PROP_USB_TYPEC_POLARITY |
115 | * @type: integer (intval) |
116 | * @value: 0 (normal) or 1 (flip) |
117 | * @default: 0 (normal) |
118 | * - EXTCON_PROP_USB_SS (SuperSpeed) |
119 | * @type: integer (intval) |
120 | * @value: 0 (USB/USB2) or 1 (USB3) |
121 | * @default: 0 (USB/USB2) |
122 | * |
123 | */ |
124 | #define EXTCON_PROP_USB_VBUS 0 |
125 | #define EXTCON_PROP_USB_TYPEC_POLARITY 1 |
126 | #define EXTCON_PROP_USB_SS 2 |
127 | |
128 | #define EXTCON_PROP_USB_MIN 0 |
129 | #define EXTCON_PROP_USB_MAX 2 |
130 | #define EXTCON_PROP_USB_CNT (EXTCON_PROP_USB_MAX - EXTCON_PROP_USB_MIN + 1) |
131 | |
132 | /* Properties of EXTCON_TYPE_CHG. */ |
133 | #define EXTCON_PROP_CHG_MIN 50 |
134 | #define EXTCON_PROP_CHG_MAX 50 |
135 | #define EXTCON_PROP_CHG_CNT (EXTCON_PROP_CHG_MAX - EXTCON_PROP_CHG_MIN + 1) |
136 | |
137 | /* Properties of EXTCON_TYPE_JACK. */ |
138 | #define EXTCON_PROP_JACK_MIN 100 |
139 | #define EXTCON_PROP_JACK_MAX 100 |
140 | #define EXTCON_PROP_JACK_CNT (EXTCON_PROP_JACK_MAX - EXTCON_PROP_JACK_MIN + 1) |
141 | |
142 | /* |
143 | * Properties of EXTCON_TYPE_DISP. |
144 | * |
145 | * - EXTCON_PROP_DISP_HPD (Hot Plug Detect) |
146 | * @type: integer (intval) |
147 | * @value: 0 (no hpd) or 1 (hpd) |
148 | * @default: 0 (no hpd) |
149 | * |
150 | */ |
151 | #define EXTCON_PROP_DISP_HPD 150 |
152 | |
153 | /* Properties of EXTCON_TYPE_DISP. */ |
154 | #define EXTCON_PROP_DISP_MIN 150 |
155 | #define EXTCON_PROP_DISP_MAX 151 |
156 | #define EXTCON_PROP_DISP_CNT (EXTCON_PROP_DISP_MAX - EXTCON_PROP_DISP_MIN + 1) |
157 | |
158 | /* |
159 | * Define the type of property's value. |
160 | * |
161 | * Define the property's value as union type. Because each property |
162 | * would need the different data type to store it. |
163 | */ |
164 | union extcon_property_value { |
165 | int intval; /* type : integer (intval) */ |
166 | }; |
167 | |
168 | struct extcon_dev; |
169 | |
170 | #if IS_ENABLED(CONFIG_EXTCON) |
171 | /* |
172 | * Following APIs get the connected state of each external connector. |
173 | * The 'id' argument indicates the defined external connector. |
174 | */ |
175 | int extcon_get_state(struct extcon_dev *edev, unsigned int id); |
176 | |
177 | /* |
178 | * Following APIs get the property of each external connector. |
179 | * The 'id' argument indicates the defined external connector |
180 | * and the 'prop' indicates the extcon property. |
181 | * |
182 | * And extcon_get_property_capability() get the capability of the property |
183 | * for each external connector. They are used to get the capability of the |
184 | * property of each external connector based on the id and property. |
185 | */ |
186 | int extcon_get_property(struct extcon_dev *edev, unsigned int id, |
187 | unsigned int prop, |
188 | union extcon_property_value *prop_val); |
189 | int extcon_get_property_capability(struct extcon_dev *edev, |
190 | unsigned int id, unsigned int prop); |
191 | |
192 | /* |
193 | * Following APIs register the notifier block in order to detect |
194 | * the change of both state and property value for each external connector. |
195 | * |
196 | * extcon_register_notifier(*edev, id, *nb) : Register a notifier block |
197 | * for specific external connector of the extcon. |
198 | * extcon_register_notifier_all(*edev, *nb) : Register a notifier block |
199 | * for all supported external connectors of the extcon. |
200 | */ |
201 | int extcon_register_notifier(struct extcon_dev *edev, unsigned int id, |
202 | struct notifier_block *nb); |
203 | int extcon_unregister_notifier(struct extcon_dev *edev, unsigned int id, |
204 | struct notifier_block *nb); |
205 | int devm_extcon_register_notifier(struct device *dev, |
206 | struct extcon_dev *edev, unsigned int id, |
207 | struct notifier_block *nb); |
208 | void devm_extcon_unregister_notifier(struct device *dev, |
209 | struct extcon_dev *edev, unsigned int id, |
210 | struct notifier_block *nb); |
211 | |
212 | int extcon_register_notifier_all(struct extcon_dev *edev, |
213 | struct notifier_block *nb); |
214 | int extcon_unregister_notifier_all(struct extcon_dev *edev, |
215 | struct notifier_block *nb); |
216 | int devm_extcon_register_notifier_all(struct device *dev, |
217 | struct extcon_dev *edev, |
218 | struct notifier_block *nb); |
219 | void devm_extcon_unregister_notifier_all(struct device *dev, |
220 | struct extcon_dev *edev, |
221 | struct notifier_block *nb); |
222 | |
223 | /* |
224 | * Following APIs get the extcon_dev from devicetree or by through extcon name. |
225 | */ |
226 | struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name); |
227 | struct extcon_dev *extcon_find_edev_by_node(struct device_node *node); |
228 | struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev, |
229 | int index); |
230 | |
231 | /* Following API get the name of extcon device. */ |
232 | const char *extcon_get_edev_name(struct extcon_dev *edev); |
233 | |
234 | #else /* CONFIG_EXTCON */ |
235 | static inline int extcon_get_state(struct extcon_dev *edev, unsigned int id) |
236 | { |
237 | return 0; |
238 | } |
239 | |
240 | static inline int extcon_get_property(struct extcon_dev *edev, unsigned int id, |
241 | unsigned int prop, |
242 | union extcon_property_value *prop_val) |
243 | { |
244 | return 0; |
245 | } |
246 | |
247 | static inline int extcon_get_property_capability(struct extcon_dev *edev, |
248 | unsigned int id, unsigned int prop) |
249 | { |
250 | return 0; |
251 | } |
252 | |
253 | static inline int extcon_register_notifier(struct extcon_dev *edev, |
254 | unsigned int id, struct notifier_block *nb) |
255 | { |
256 | return 0; |
257 | } |
258 | |
259 | static inline int extcon_unregister_notifier(struct extcon_dev *edev, |
260 | unsigned int id, struct notifier_block *nb) |
261 | { |
262 | return 0; |
263 | } |
264 | |
265 | static inline int devm_extcon_register_notifier(struct device *dev, |
266 | struct extcon_dev *edev, unsigned int id, |
267 | struct notifier_block *nb) |
268 | { |
269 | return -ENOSYS; |
270 | } |
271 | |
272 | static inline void devm_extcon_unregister_notifier(struct device *dev, |
273 | struct extcon_dev *edev, unsigned int id, |
274 | struct notifier_block *nb) { } |
275 | |
276 | static inline int extcon_register_notifier_all(struct extcon_dev *edev, |
277 | struct notifier_block *nb) |
278 | { |
279 | return 0; |
280 | } |
281 | |
282 | static inline int extcon_unregister_notifier_all(struct extcon_dev *edev, |
283 | struct notifier_block *nb) |
284 | { |
285 | return 0; |
286 | } |
287 | |
288 | static inline int devm_extcon_register_notifier_all(struct device *dev, |
289 | struct extcon_dev *edev, |
290 | struct notifier_block *nb) |
291 | { |
292 | return 0; |
293 | } |
294 | |
295 | static inline void devm_extcon_unregister_notifier_all(struct device *dev, |
296 | struct extcon_dev *edev, |
297 | struct notifier_block *nb) { } |
298 | |
299 | static inline struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name) |
300 | { |
301 | return NULL; |
302 | } |
303 | |
304 | static inline struct extcon_dev *extcon_find_edev_by_node(struct device_node *node) |
305 | { |
306 | return ERR_PTR(-ENODEV); |
307 | } |
308 | |
309 | static inline struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev, |
310 | int index) |
311 | { |
312 | return ERR_PTR(-ENODEV); |
313 | } |
314 | |
315 | static inline const char *extcon_get_edev_name(struct extcon_dev *edev) |
316 | { |
317 | return NULL; |
318 | } |
319 | #endif /* CONFIG_EXTCON */ |
320 | |
321 | /* |
322 | * Following structure and API are deprecated. EXTCON remains the function |
323 | * definition to prevent the build break. |
324 | */ |
325 | struct extcon_specific_cable_nb { |
326 | struct notifier_block *user_nb; |
327 | int cable_index; |
328 | struct extcon_dev *edev; |
329 | unsigned long previous_value; |
330 | }; |
331 | #endif /* __LINUX_EXTCON_H__ */ |
332 | |