1 /* 2 * External Connector (extcon) framework 3 * 4 * Copyright (C) 2015 Samsung Electronics 5 * Author: Chanwoo Choi <[email protected]> 6 * 7 * Copyright (C) 2012 Samsung Electronics 8 * Author: Donggeun Kim <[email protected]> 9 * Author: MyungJoo Ham <[email protected]> 10 * 11 * based on switch class driver 12 * Copyright (C) 2008 Google, Inc. 13 * Author: Mike Lockwood <[email protected]> 14 * 15 * This software is licensed under the terms of the GNU General Public 16 * License version 2, as published by the Free Software Foundation, and 17 * may be copied, distributed, and modified under those terms. 18 * 19 * This program is distributed in the hope that it will be useful, 20 * but WITHOUT ANY WARRANTY; without even the implied warranty of 21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22 * GNU General Public License for more details. 23 */ 24 25 #ifndef __LINUX_EXTCON_H__ 26 #define __LINUX_EXTCON_H__ 27 28 #include <linux/device.h> 29 30 /* 31 * Define the type of supported external connectors 32 */ 33 #define EXTCON_TYPE_USB BIT(0) /* USB connector */ 34 #define EXTCON_TYPE_CHG BIT(1) /* Charger connector */ 35 #define EXTCON_TYPE_JACK BIT(2) /* Jack connector */ 36 #define EXTCON_TYPE_DISP BIT(3) /* Display connector */ 37 #define EXTCON_TYPE_MISC BIT(4) /* Miscellaneous connector */ 38 39 /* 40 * Define the unique id of supported external connectors 41 */ 42 #define EXTCON_NONE 0 43 44 /* USB external connector */ 45 #define EXTCON_USB 1 46 #define EXTCON_USB_HOST 2 47 48 /* 49 * Charging external connector 50 * 51 * When one SDP charger connector was reported, we should also report 52 * the USB connector, which means EXTCON_CHG_USB_SDP should always 53 * appear together with EXTCON_USB. The same as ACA charger connector, 54 * EXTCON_CHG_USB_ACA would normally appear with EXTCON_USB_HOST. 55 * 56 * The EXTCON_CHG_USB_SLOW connector can provide at least 500mA of 57 * current at 5V. The EXTCON_CHG_USB_FAST connector can provide at 58 * least 1A of current at 5V. 59 */ 60 #define EXTCON_CHG_USB_SDP 5 /* Standard Downstream Port */ 61 #define EXTCON_CHG_USB_DCP 6 /* Dedicated Charging Port */ 62 #define EXTCON_CHG_USB_CDP 7 /* Charging Downstream Port */ 63 #define EXTCON_CHG_USB_ACA 8 /* Accessory Charger Adapter */ 64 #define EXTCON_CHG_USB_FAST 9 65 #define EXTCON_CHG_USB_SLOW 10 66 #define EXTCON_CHG_WPT 11 /* Wireless Power Transfer */ 67 #define EXTCON_CHG_USB_PD 12 /* USB Power Delivery */ 68 69 /* Jack external connector */ 70 #define EXTCON_JACK_MICROPHONE 20 71 #define EXTCON_JACK_HEADPHONE 21 72 #define EXTCON_JACK_LINE_IN 22 73 #define EXTCON_JACK_LINE_OUT 23 74 #define EXTCON_JACK_VIDEO_IN 24 75 #define EXTCON_JACK_VIDEO_OUT 25 76 #define EXTCON_JACK_SPDIF_IN 26 /* Sony Philips Digital InterFace */ 77 #define EXTCON_JACK_SPDIF_OUT 27 78 79 /* Display external connector */ 80 #define EXTCON_DISP_HDMI 40 /* High-Definition Multimedia Interface */ 81 #define EXTCON_DISP_MHL 41 /* Mobile High-Definition Link */ 82 #define EXTCON_DISP_DVI 42 /* Digital Visual Interface */ 83 #define EXTCON_DISP_VGA 43 /* Video Graphics Array */ 84 #define EXTCON_DISP_DP 44 /* Display Port */ 85 #define EXTCON_DISP_HMD 45 /* Head-Mounted Display */ 86 87 /* Miscellaneous external connector */ 88 #define EXTCON_DOCK 60 89 #define EXTCON_JIG 61 90 #define EXTCON_MECHANICAL 62 91 92 #define EXTCON_NUM 63 93 94 /* 95 * Define the properties of supported external connectors. 96 * 97 * When adding the new extcon property, they *must* have 98 * the type/value/default information. Also, you *have to* 99 * modify the EXTCON_PROP_[type]_START/END definitions 100 * which mean the range of the supported properties 101 * for each extcon type. 102 * 103 * The naming style of property 104 * : EXTCON_PROP_[type]_[property name] 105 * 106 * EXTCON_PROP_USB_[property name] : USB property 107 * EXTCON_PROP_CHG_[property name] : Charger property 108 * EXTCON_PROP_JACK_[property name] : Jack property 109 * EXTCON_PROP_DISP_[property name] : Display property 110 */ 111 112 /* 113 * Properties of EXTCON_TYPE_USB. 114 * 115 * - EXTCON_PROP_USB_VBUS 116 * @type: integer (intval) 117 * @value: 0 (low) or 1 (high) 118 * @default: 0 (low) 119 * - EXTCON_PROP_USB_TYPEC_POLARITY 120 * @type: integer (intval) 121 * @value: 0 (normal) or 1 (flip) 122 * @default: 0 (normal) 123 * - EXTCON_PROP_USB_SS (SuperSpeed) 124 * @type: integer (intval) 125 * @value: 0 (USB/USB2) or 1 (USB3) 126 * @default: 0 (USB/USB2) 127 * 128 */ 129 #define EXTCON_PROP_USB_VBUS 0 130 #define EXTCON_PROP_USB_TYPEC_POLARITY 1 131 #define EXTCON_PROP_USB_SS 2 132 133 #define EXTCON_PROP_USB_MIN 0 134 #define EXTCON_PROP_USB_MAX 2 135 #define EXTCON_PROP_USB_CNT (EXTCON_PROP_USB_MAX - EXTCON_PROP_USB_MIN + 1) 136 137 /* Properties of EXTCON_TYPE_CHG. */ 138 #define EXTCON_PROP_CHG_MIN 50 139 #define EXTCON_PROP_CHG_MAX 50 140 #define EXTCON_PROP_CHG_CNT (EXTCON_PROP_CHG_MAX - EXTCON_PROP_CHG_MIN + 1) 141 142 /* Properties of EXTCON_TYPE_JACK. */ 143 #define EXTCON_PROP_JACK_MIN 100 144 #define EXTCON_PROP_JACK_MAX 100 145 #define EXTCON_PROP_JACK_CNT (EXTCON_PROP_JACK_MAX - EXTCON_PROP_JACK_MIN + 1) 146 147 /* 148 * Properties of EXTCON_TYPE_DISP. 149 * 150 * - EXTCON_PROP_DISP_HPD (Hot Plug Detect) 151 * @type: integer (intval) 152 * @value: 0 (no hpd) or 1 (hpd) 153 * @default: 0 (no hpd) 154 * 155 */ 156 #define EXTCON_PROP_DISP_HPD 150 157 158 /* Properties of EXTCON_TYPE_DISP. */ 159 #define EXTCON_PROP_DISP_MIN 150 160 #define EXTCON_PROP_DISP_MAX 151 161 #define EXTCON_PROP_DISP_CNT (EXTCON_PROP_DISP_MAX - EXTCON_PROP_DISP_MIN + 1) 162 163 /* 164 * Define the type of property's value. 165 * 166 * Define the property's value as union type. Because each property 167 * would need the different data type to store it. 168 */ 169 union extcon_property_value { 170 int intval; /* type : integer (intval) */ 171 }; 172 173 struct extcon_cable; 174 struct extcon_dev; 175 176 #if IS_ENABLED(CONFIG_EXTCON) 177 178 /* Following APIs register/unregister the extcon device. */ 179 extern int extcon_dev_register(struct extcon_dev *edev); 180 extern void extcon_dev_unregister(struct extcon_dev *edev); 181 extern int devm_extcon_dev_register(struct device *dev, 182 struct extcon_dev *edev); 183 extern void devm_extcon_dev_unregister(struct device *dev, 184 struct extcon_dev *edev); 185 186 /* Following APIs allocate/free the memory of the extcon device. */ 187 extern struct extcon_dev *extcon_dev_allocate(const unsigned int *cable); 188 extern void extcon_dev_free(struct extcon_dev *edev); 189 extern struct extcon_dev *devm_extcon_dev_allocate(struct device *dev, 190 const unsigned int *cable); 191 extern void devm_extcon_dev_free(struct device *dev, struct extcon_dev *edev); 192 193 /* Synchronize the state and property value for each external connector. */ 194 extern int extcon_sync(struct extcon_dev *edev, unsigned int id); 195 196 /* 197 * Following APIs get/set the connected state of each external connector. 198 * The 'id' argument indicates the defined external connector. 199 */ 200 extern int extcon_get_state(struct extcon_dev *edev, unsigned int id); 201 extern int extcon_set_state(struct extcon_dev *edev, unsigned int id, 202 bool state); 203 extern int extcon_set_state_sync(struct extcon_dev *edev, unsigned int id, 204 bool state); 205 206 /* 207 * Following APIs get/set the property of each external connector. 208 * The 'id' argument indicates the defined external connector 209 * and the 'prop' indicates the extcon property. 210 * 211 * And extcon_get/set_property_capability() set the capability of the property 212 * for each external connector. They are used to set the capability of the 213 * property of each external connector based on the id and property. 214 */ 215 extern int extcon_get_property(struct extcon_dev *edev, unsigned int id, 216 unsigned int prop, 217 union extcon_property_value *prop_val); 218 extern int extcon_set_property(struct extcon_dev *edev, unsigned int id, 219 unsigned int prop, 220 union extcon_property_value prop_val); 221 extern int extcon_set_property_sync(struct extcon_dev *edev, unsigned int id, 222 unsigned int prop, 223 union extcon_property_value prop_val); 224 extern int extcon_get_property_capability(struct extcon_dev *edev, 225 unsigned int id, unsigned int prop); 226 extern int extcon_set_property_capability(struct extcon_dev *edev, 227 unsigned int id, unsigned int prop); 228 229 /* 230 * Following APIs register the notifier block in order to detect 231 * the change of both state and property value for each external connector. 232 * 233 * extcon_register_notifier(*edev, id, *nb) : Register a notifier block 234 * for specific external connector of the extcon. 235 * extcon_register_notifier_all(*edev, *nb) : Register a notifier block 236 * for all supported external connectors of the extcon. 237 */ 238 extern int extcon_register_notifier(struct extcon_dev *edev, unsigned int id, 239 struct notifier_block *nb); 240 extern int extcon_unregister_notifier(struct extcon_dev *edev, unsigned int id, 241 struct notifier_block *nb); 242 extern int devm_extcon_register_notifier(struct device *dev, 243 struct extcon_dev *edev, unsigned int id, 244 struct notifier_block *nb); 245 extern void devm_extcon_unregister_notifier(struct device *dev, 246 struct extcon_dev *edev, unsigned int id, 247 struct notifier_block *nb); 248 249 extern int extcon_register_notifier_all(struct extcon_dev *edev, 250 struct notifier_block *nb); 251 extern int extcon_unregister_notifier_all(struct extcon_dev *edev, 252 struct notifier_block *nb); 253 extern int devm_extcon_register_notifier_all(struct device *dev, 254 struct extcon_dev *edev, 255 struct notifier_block *nb); 256 extern void devm_extcon_unregister_notifier_all(struct device *dev, 257 struct extcon_dev *edev, 258 struct notifier_block *nb); 259 260 /* 261 * Following APIs get the extcon_dev from devicetree or by through extcon name. 262 */ 263 extern struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name); 264 extern struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev, 265 int index); 266 267 /* Following API get the name of extcon device. */ 268 extern const char *extcon_get_edev_name(struct extcon_dev *edev); 269 270 #else /* CONFIG_EXTCON */ 271 static inline int extcon_dev_register(struct extcon_dev *edev) 272 { 273 return 0; 274 } 275 276 static inline void extcon_dev_unregister(struct extcon_dev *edev) { } 277 278 static inline int devm_extcon_dev_register(struct device *dev, 279 struct extcon_dev *edev) 280 { 281 return -EINVAL; 282 } 283 284 static inline void devm_extcon_dev_unregister(struct device *dev, 285 struct extcon_dev *edev) { } 286 287 static inline struct extcon_dev *extcon_dev_allocate(const unsigned int *cable) 288 { 289 return ERR_PTR(-ENOSYS); 290 } 291 292 static inline void extcon_dev_free(struct extcon_dev *edev) { } 293 294 static inline struct extcon_dev *devm_extcon_dev_allocate(struct device *dev, 295 const unsigned int *cable) 296 { 297 return ERR_PTR(-ENOSYS); 298 } 299 300 static inline void devm_extcon_dev_free(struct extcon_dev *edev) { } 301 302 303 static inline int extcon_get_state(struct extcon_dev *edev, unsigned int id) 304 { 305 return 0; 306 } 307 308 static inline int extcon_set_state(struct extcon_dev *edev, unsigned int id, 309 bool state) 310 { 311 return 0; 312 } 313 314 static inline int extcon_set_state_sync(struct extcon_dev *edev, unsigned int id, 315 bool state) 316 { 317 return 0; 318 } 319 320 static inline int extcon_sync(struct extcon_dev *edev, unsigned int id) 321 { 322 return 0; 323 } 324 325 static inline int extcon_get_property(struct extcon_dev *edev, unsigned int id, 326 unsigned int prop, 327 union extcon_property_value *prop_val) 328 { 329 return 0; 330 } 331 static inline int extcon_set_property(struct extcon_dev *edev, unsigned int id, 332 unsigned int prop, 333 union extcon_property_value prop_val) 334 { 335 return 0; 336 } 337 338 static inline int extcon_set_property_sync(struct extcon_dev *edev, 339 unsigned int id, unsigned int prop, 340 union extcon_property_value prop_val) 341 { 342 return 0; 343 } 344 345 static inline int extcon_get_property_capability(struct extcon_dev *edev, 346 unsigned int id, unsigned int prop) 347 { 348 return 0; 349 } 350 351 static inline int extcon_set_property_capability(struct extcon_dev *edev, 352 unsigned int id, unsigned int prop) 353 { 354 return 0; 355 } 356 357 static inline int extcon_register_notifier(struct extcon_dev *edev, 358 unsigned int id, struct notifier_block *nb) 359 { 360 return 0; 361 } 362 363 static inline int extcon_unregister_notifier(struct extcon_dev *edev, 364 unsigned int id, struct notifier_block *nb) 365 { 366 return 0; 367 } 368 369 static inline int devm_extcon_register_notifier(struct device *dev, 370 struct extcon_dev *edev, unsigned int id, 371 struct notifier_block *nb) 372 { 373 return -ENOSYS; 374 } 375 376 static inline void devm_extcon_unregister_notifier(struct device *dev, 377 struct extcon_dev *edev, unsigned int id, 378 struct notifier_block *nb) { } 379 380 static inline struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name) 381 { 382 return ERR_PTR(-ENODEV); 383 } 384 385 static inline struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev, 386 int index) 387 { 388 return ERR_PTR(-ENODEV); 389 } 390 #endif /* CONFIG_EXTCON */ 391 392 /* 393 * Following structure and API are deprecated. EXTCON remains the function 394 * definition to prevent the build break. 395 */ 396 struct extcon_specific_cable_nb { 397 struct notifier_block *user_nb; 398 int cable_index; 399 struct extcon_dev *edev; 400 unsigned long previous_value; 401 }; 402 403 static inline int extcon_register_interest(struct extcon_specific_cable_nb *obj, 404 const char *extcon_name, const char *cable_name, 405 struct notifier_block *nb) 406 { 407 return -EINVAL; 408 } 409 410 static inline int extcon_unregister_interest(struct extcon_specific_cable_nb *obj) 411 { 412 return -EINVAL; 413 } 414 #endif /* __LINUX_EXTCON_H__ */ 415