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