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