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 <[email protected]> 8 * 9 * Copyright (C) 2012 Samsung Electronics 10 * Author: Donggeun Kim <[email protected]> 11 * Author: MyungJoo Ham <[email protected]> 12 * 13 * based on switch class driver 14 * Copyright (C) 2008 Google, Inc. 15 * Author: Mike Lockwood <[email protected]> 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 */ 162 union extcon_property_value { 163 int intval; /* type : integer (intval) */ 164 }; 165 166 struct 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 */ 173 int 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 */ 184 int extcon_get_property(struct extcon_dev *edev, unsigned int id, 185 unsigned int prop, 186 union extcon_property_value *prop_val); 187 int 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 */ 199 int extcon_register_notifier(struct extcon_dev *edev, unsigned int id, 200 struct notifier_block *nb); 201 int extcon_unregister_notifier(struct extcon_dev *edev, unsigned int id, 202 struct notifier_block *nb); 203 int devm_extcon_register_notifier(struct device *dev, 204 struct extcon_dev *edev, unsigned int id, 205 struct notifier_block *nb); 206 void devm_extcon_unregister_notifier(struct device *dev, 207 struct extcon_dev *edev, unsigned int id, 208 struct notifier_block *nb); 209 210 int extcon_register_notifier_all(struct extcon_dev *edev, 211 struct notifier_block *nb); 212 int extcon_unregister_notifier_all(struct extcon_dev *edev, 213 struct notifier_block *nb); 214 int devm_extcon_register_notifier_all(struct device *dev, 215 struct extcon_dev *edev, 216 struct notifier_block *nb); 217 void 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 */ 224 struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name); 225 struct extcon_dev *extcon_find_edev_by_node(struct device_node *node); 226 struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev, 227 int index); 228 229 /* Following API get the name of extcon device. */ 230 const char *extcon_get_edev_name(struct extcon_dev *edev); 231 232 #else /* CONFIG_EXTCON */ 233 static inline int extcon_get_state(struct extcon_dev *edev, unsigned int id) 234 { 235 return 0; 236 } 237 238 static 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 245 static inline int extcon_get_property_capability(struct extcon_dev *edev, 246 unsigned int id, unsigned int prop) 247 { 248 return 0; 249 } 250 251 static inline int extcon_register_notifier(struct extcon_dev *edev, 252 unsigned int id, struct notifier_block *nb) 253 { 254 return 0; 255 } 256 257 static inline int extcon_unregister_notifier(struct extcon_dev *edev, 258 unsigned int id, struct notifier_block *nb) 259 { 260 return 0; 261 } 262 263 static 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 270 static inline void devm_extcon_unregister_notifier(struct device *dev, 271 struct extcon_dev *edev, unsigned int id, 272 struct notifier_block *nb) { } 273 274 static inline struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name) 275 { 276 return ERR_PTR(-ENODEV); 277 } 278 279 static inline struct extcon_dev *extcon_find_edev_by_node(struct device_node *node) 280 { 281 return ERR_PTR(-ENODEV); 282 } 283 284 static inline struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev, 285 int index) 286 { 287 return ERR_PTR(-ENODEV); 288 } 289 290 static inline const char *extcon_get_edev_name(struct extcon_dev *edev) 291 { 292 return NULL; 293 } 294 #endif /* CONFIG_EXTCON */ 295 296 /* 297 * Following structure and API are deprecated. EXTCON remains the function 298 * definition to prevent the build break. 299 */ 300 struct extcon_specific_cable_nb { 301 struct notifier_block *user_nb; 302 int cable_index; 303 struct extcon_dev *edev; 304 unsigned long previous_value; 305 }; 306 307 static inline int extcon_register_interest(struct extcon_specific_cable_nb *obj, 308 const char *extcon_name, const char *cable_name, 309 struct notifier_block *nb) 310 { 311 return -EINVAL; 312 } 313 314 static inline int extcon_unregister_interest(struct extcon_specific_cable_nb *obj) 315 { 316 return -EINVAL; 317 } 318 #endif /* __LINUX_EXTCON_H__ */ 319