at v4.11 13 kB view raw
1/* 2 * External connector (extcon) class driver 3 * 4 * Copyright (C) 2015 Samsung Electronics 5 * Author: Chanwoo Choi <cw00.choi@samsung.com> 6 * 7 * Copyright (C) 2012 Samsung Electronics 8 * Author: Donggeun Kim <dg77.kim@samsung.com> 9 * Author: MyungJoo Ham <myungjoo.ham@samsung.com> 10 * 11 * based on switch class driver 12 * Copyright (C) 2008 Google, Inc. 13 * Author: Mike Lockwood <lockwood@android.com> 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 */ 170union extcon_property_value { 171 int intval; /* type : integer (intval) */ 172}; 173 174struct extcon_cable; 175struct 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 */ 183extern int extcon_dev_register(struct extcon_dev *edev); 184extern void extcon_dev_unregister(struct extcon_dev *edev); 185extern int devm_extcon_dev_register(struct device *dev, 186 struct extcon_dev *edev); 187extern void devm_extcon_dev_unregister(struct device *dev, 188 struct extcon_dev *edev); 189extern struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name); 190 191/* 192 * Following APIs control the memory of extcon device. 193 */ 194extern struct extcon_dev *extcon_dev_allocate(const unsigned int *cable); 195extern void extcon_dev_free(struct extcon_dev *edev); 196extern struct extcon_dev *devm_extcon_dev_allocate(struct device *dev, 197 const unsigned int *cable); 198extern 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 */ 204extern int extcon_get_state(struct extcon_dev *edev, unsigned int id); 205extern int extcon_set_state(struct extcon_dev *edev, unsigned int id, 206 bool cable_state); 207extern 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 */ 212extern 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 */ 218extern int extcon_get_property(struct extcon_dev *edev, unsigned int id, 219 unsigned int prop, 220 union extcon_property_value *prop_val); 221extern int extcon_set_property(struct extcon_dev *edev, unsigned int id, 222 unsigned int prop, 223 union extcon_property_value prop_val); 224extern 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 */ 233extern int extcon_get_property_capability(struct extcon_dev *edev, 234 unsigned int id, unsigned int prop); 235extern int extcon_set_property_capability(struct extcon_dev *edev, 236 unsigned int id, unsigned int prop); 237 238/* 239 * Following APIs are to monitor every action of a notifier. 240 * Registrar gets notified for every external port of a connection device. 241 * Probably this could be used to debug an action of notifier; however, 242 * we do not recommend to use this for normal 'notifiee' device drivers who 243 * want to be notified by a specific external port of the notifier. 244 */ 245extern int extcon_register_notifier(struct extcon_dev *edev, unsigned int id, 246 struct notifier_block *nb); 247extern int extcon_unregister_notifier(struct extcon_dev *edev, unsigned int id, 248 struct notifier_block *nb); 249extern int devm_extcon_register_notifier(struct device *dev, 250 struct extcon_dev *edev, unsigned int id, 251 struct notifier_block *nb); 252extern void devm_extcon_unregister_notifier(struct device *dev, 253 struct extcon_dev *edev, unsigned int id, 254 struct notifier_block *nb); 255 256/* 257 * Following API get the extcon device from devicetree. 258 * This function use phandle of devicetree to get extcon device directly. 259 */ 260extern struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev, 261 int index); 262 263/* Following API to get information of extcon device */ 264extern const char *extcon_get_edev_name(struct extcon_dev *edev); 265 266 267#else /* CONFIG_EXTCON */ 268static inline int extcon_dev_register(struct extcon_dev *edev) 269{ 270 return 0; 271} 272 273static inline void extcon_dev_unregister(struct extcon_dev *edev) { } 274 275static inline int devm_extcon_dev_register(struct device *dev, 276 struct extcon_dev *edev) 277{ 278 return -EINVAL; 279} 280 281static inline void devm_extcon_dev_unregister(struct device *dev, 282 struct extcon_dev *edev) { } 283 284static inline struct extcon_dev *extcon_dev_allocate(const unsigned int *cable) 285{ 286 return ERR_PTR(-ENOSYS); 287} 288 289static inline void extcon_dev_free(struct extcon_dev *edev) { } 290 291static inline struct extcon_dev *devm_extcon_dev_allocate(struct device *dev, 292 const unsigned int *cable) 293{ 294 return ERR_PTR(-ENOSYS); 295} 296 297static inline void devm_extcon_dev_free(struct extcon_dev *edev) { } 298 299 300static inline int extcon_get_state(struct extcon_dev *edev, unsigned int id) 301{ 302 return 0; 303} 304 305static inline int extcon_set_state(struct extcon_dev *edev, unsigned int id, 306 bool cable_state) 307{ 308 return 0; 309} 310 311static inline int extcon_set_state_sync(struct extcon_dev *edev, unsigned int id, 312 bool cable_state) 313{ 314 return 0; 315} 316 317static inline int extcon_sync(struct extcon_dev *edev, unsigned int id) 318{ 319 return 0; 320} 321 322static inline int extcon_get_property(struct extcon_dev *edev, unsigned int id, 323 unsigned int prop, 324 union extcon_property_value *prop_val) 325{ 326 return 0; 327} 328static inline int extcon_set_property(struct extcon_dev *edev, unsigned int id, 329 unsigned int prop, 330 union extcon_property_value prop_val) 331{ 332 return 0; 333} 334 335static inline int extcon_set_property_sync(struct extcon_dev *edev, 336 unsigned int id, unsigned int prop, 337 union extcon_property_value prop_val) 338{ 339 return 0; 340} 341 342static inline int extcon_get_property_capability(struct extcon_dev *edev, 343 unsigned int id, unsigned int prop) 344{ 345 return 0; 346} 347 348static inline int extcon_set_property_capability(struct extcon_dev *edev, 349 unsigned int id, unsigned int prop) 350{ 351 return 0; 352} 353 354static inline struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name) 355{ 356 return NULL; 357} 358 359static inline int extcon_register_notifier(struct extcon_dev *edev, 360 unsigned int id, 361 struct notifier_block *nb) 362{ 363 return 0; 364} 365 366static inline int extcon_unregister_notifier(struct extcon_dev *edev, 367 unsigned int id, 368 struct notifier_block *nb) 369{ 370 return 0; 371} 372 373static inline int devm_extcon_register_notifier(struct device *dev, 374 struct extcon_dev *edev, unsigned int id, 375 struct notifier_block *nb) 376{ 377 return -ENOSYS; 378} 379 380static inline void devm_extcon_unregister_notifier(struct device *dev, 381 struct extcon_dev *edev, unsigned int id, 382 struct notifier_block *nb) { } 383 384static inline struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev, 385 int index) 386{ 387 return ERR_PTR(-ENODEV); 388} 389#endif /* CONFIG_EXTCON */ 390 391/* 392 * Following structure and API are deprecated. EXTCON remains the function 393 * definition to prevent the build break. 394 */ 395struct extcon_specific_cable_nb { 396 struct notifier_block *user_nb; 397 int cable_index; 398 struct extcon_dev *edev; 399 unsigned long previous_value; 400}; 401 402static inline int extcon_register_interest(struct extcon_specific_cable_nb *obj, 403 const char *extcon_name, const char *cable_name, 404 struct notifier_block *nb) 405{ 406 return -EINVAL; 407} 408 409static inline int extcon_unregister_interest(struct extcon_specific_cable_nb 410 *obj) 411{ 412 return -EINVAL; 413} 414 415static inline int extcon_get_cable_state_(struct extcon_dev *edev, unsigned int id) 416{ 417 return extcon_get_state(edev, id); 418} 419 420static inline int extcon_set_cable_state_(struct extcon_dev *edev, unsigned int id, 421 bool cable_state) 422{ 423 return extcon_set_state_sync(edev, id, cable_state); 424} 425#endif /* __LINUX_EXTCON_H__ */