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