at v4.12 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 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 */ 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 256extern int extcon_register_notifier_all(struct extcon_dev *edev, 257 struct notifier_block *nb); 258extern int extcon_unregister_notifier_all(struct extcon_dev *edev, 259 struct notifier_block *nb); 260extern int devm_extcon_register_notifier_all(struct device *dev, 261 struct extcon_dev *edev, 262 struct notifier_block *nb); 263extern 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 */ 271extern struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev, 272 int index); 273 274/* Following API to get information of extcon device */ 275extern const char *extcon_get_edev_name(struct extcon_dev *edev); 276 277 278#else /* CONFIG_EXTCON */ 279static inline int extcon_dev_register(struct extcon_dev *edev) 280{ 281 return 0; 282} 283 284static inline void extcon_dev_unregister(struct extcon_dev *edev) { } 285 286static inline int devm_extcon_dev_register(struct device *dev, 287 struct extcon_dev *edev) 288{ 289 return -EINVAL; 290} 291 292static inline void devm_extcon_dev_unregister(struct device *dev, 293 struct extcon_dev *edev) { } 294 295static inline struct extcon_dev *extcon_dev_allocate(const unsigned int *cable) 296{ 297 return ERR_PTR(-ENOSYS); 298} 299 300static inline void extcon_dev_free(struct extcon_dev *edev) { } 301 302static inline struct extcon_dev *devm_extcon_dev_allocate(struct device *dev, 303 const unsigned int *cable) 304{ 305 return ERR_PTR(-ENOSYS); 306} 307 308static inline void devm_extcon_dev_free(struct extcon_dev *edev) { } 309 310 311static inline int extcon_get_state(struct extcon_dev *edev, unsigned int id) 312{ 313 return 0; 314} 315 316static inline int extcon_set_state(struct extcon_dev *edev, unsigned int id, 317 bool cable_state) 318{ 319 return 0; 320} 321 322static inline int extcon_set_state_sync(struct extcon_dev *edev, unsigned int id, 323 bool cable_state) 324{ 325 return 0; 326} 327 328static inline int extcon_sync(struct extcon_dev *edev, unsigned int id) 329{ 330 return 0; 331} 332 333static 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} 339static 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 346static 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 353static inline int extcon_get_property_capability(struct extcon_dev *edev, 354 unsigned int id, unsigned int prop) 355{ 356 return 0; 357} 358 359static inline int extcon_set_property_capability(struct extcon_dev *edev, 360 unsigned int id, unsigned int prop) 361{ 362 return 0; 363} 364 365static inline struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name) 366{ 367 return NULL; 368} 369 370static inline int extcon_register_notifier(struct extcon_dev *edev, 371 unsigned int id, 372 struct notifier_block *nb) 373{ 374 return 0; 375} 376 377static inline int extcon_unregister_notifier(struct extcon_dev *edev, 378 unsigned int id, 379 struct notifier_block *nb) 380{ 381 return 0; 382} 383 384static 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 391static inline void devm_extcon_unregister_notifier(struct device *dev, 392 struct extcon_dev *edev, unsigned int id, 393 struct notifier_block *nb) { } 394 395static 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 */ 406struct 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 413static 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 420static inline int extcon_unregister_interest(struct extcon_specific_cable_nb 421 *obj) 422{ 423 return -EINVAL; 424} 425 426static inline int extcon_get_cable_state_(struct extcon_dev *edev, unsigned int id) 427{ 428 return extcon_get_state(edev, id); 429} 430 431static 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__ */