1 /* 2 * External Connector (extcon) framework 3 * - linux/include/linux/extcon.h for extcon consumer device driver. 4 * 5 * Copyright (C) 2015 Samsung Electronics 6 * Author: Chanwoo Choi <cw00.choi@samsung.com> 7 * 8 * Copyright (C) 2012 Samsung Electronics 9 * Author: Donggeun Kim <dg77.kim@samsung.com> 10 * Author: MyungJoo Ham <myungjoo.ham@samsung.com> 11 * 12 * based on switch class driver 13 * Copyright (C) 2008 Google, Inc. 14 * Author: Mike Lockwood <lockwood@android.com> 15 * 16 * This software is licensed under the terms of the GNU General Public 17 * License version 2, as published by the Free Software Foundation, and 18 * may be copied, distributed, and modified under those terms. 19 * 20 * This program is distributed in the hope that it will be useful, 21 * but WITHOUT ANY WARRANTY; without even the implied warranty of 22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 23 * GNU General Public License for more details. 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 properties 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 */ 170 union extcon_property_value { 171 int intval; /* type : integer (intval) */ 172 }; 173 174 struct extcon_dev; 175 176 #if IS_ENABLED(CONFIG_EXTCON) 177 /* 178 * Following APIs get the connected state of each external connector. 179 * The 'id' argument indicates the defined external connector. 180 */ 181 extern int extcon_get_state(struct extcon_dev *edev, unsigned int id); 182 183 /* 184 * Following APIs get the property of each external connector. 185 * The 'id' argument indicates the defined external connector 186 * and the 'prop' indicates the extcon property. 187 * 188 * And extcon_get_property_capability() get the capability of the property 189 * for each external connector. They are used to get the capability of the 190 * property of each external connector based on the id and property. 191 */ 192 extern int extcon_get_property(struct extcon_dev *edev, unsigned int id, 193 unsigned int prop, 194 union extcon_property_value *prop_val); 195 extern int extcon_get_property_capability(struct extcon_dev *edev, 196 unsigned int id, unsigned int prop); 197 198 /* 199 * Following APIs register the notifier block in order to detect 200 * the change of both state and property value for each external connector. 201 * 202 * extcon_register_notifier(*edev, id, *nb) : Register a notifier block 203 * for specific external connector of the extcon. 204 * extcon_register_notifier_all(*edev, *nb) : Register a notifier block 205 * for all supported external connectors of the extcon. 206 */ 207 extern int extcon_register_notifier(struct extcon_dev *edev, unsigned int id, 208 struct notifier_block *nb); 209 extern int extcon_unregister_notifier(struct extcon_dev *edev, unsigned int id, 210 struct notifier_block *nb); 211 extern int devm_extcon_register_notifier(struct device *dev, 212 struct extcon_dev *edev, unsigned int id, 213 struct notifier_block *nb); 214 extern void devm_extcon_unregister_notifier(struct device *dev, 215 struct extcon_dev *edev, unsigned int id, 216 struct notifier_block *nb); 217 218 extern int extcon_register_notifier_all(struct extcon_dev *edev, 219 struct notifier_block *nb); 220 extern int extcon_unregister_notifier_all(struct extcon_dev *edev, 221 struct notifier_block *nb); 222 extern int devm_extcon_register_notifier_all(struct device *dev, 223 struct extcon_dev *edev, 224 struct notifier_block *nb); 225 extern void devm_extcon_unregister_notifier_all(struct device *dev, 226 struct extcon_dev *edev, 227 struct notifier_block *nb); 228 229 /* 230 * Following APIs get the extcon_dev from devicetree or by through extcon name. 231 */ 232 extern struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name); 233 extern struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev, 234 int index); 235 236 /* Following API get the name of extcon device. */ 237 extern const char *extcon_get_edev_name(struct extcon_dev *edev); 238 239 #else /* CONFIG_EXTCON */ 240 static inline int extcon_get_state(struct extcon_dev *edev, unsigned int id) 241 { 242 return 0; 243 } 244 245 static inline int extcon_get_property(struct extcon_dev *edev, unsigned int id, 246 unsigned int prop, 247 union extcon_property_value *prop_val) 248 { 249 return 0; 250 } 251 252 static inline int extcon_get_property_capability(struct extcon_dev *edev, 253 unsigned int id, unsigned int prop) 254 { 255 return 0; 256 } 257 258 static inline int extcon_register_notifier(struct extcon_dev *edev, 259 unsigned int id, struct notifier_block *nb) 260 { 261 return 0; 262 } 263 264 static inline int extcon_unregister_notifier(struct extcon_dev *edev, 265 unsigned int id, struct notifier_block *nb) 266 { 267 return 0; 268 } 269 270 static inline int devm_extcon_register_notifier(struct device *dev, 271 struct extcon_dev *edev, unsigned int id, 272 struct notifier_block *nb) 273 { 274 return -ENOSYS; 275 } 276 277 static inline void devm_extcon_unregister_notifier(struct device *dev, 278 struct extcon_dev *edev, unsigned int id, 279 struct notifier_block *nb) { } 280 281 static inline struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name) 282 { 283 return ERR_PTR(-ENODEV); 284 } 285 286 static inline struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev, 287 int index) 288 { 289 return ERR_PTR(-ENODEV); 290 } 291 #endif /* CONFIG_EXTCON */ 292 293 /* 294 * Following structure and API are deprecated. EXTCON remains the function 295 * definition to prevent the build break. 296 */ 297 struct extcon_specific_cable_nb { 298 struct notifier_block *user_nb; 299 int cable_index; 300 struct extcon_dev *edev; 301 unsigned long previous_value; 302 }; 303 304 static inline int extcon_register_interest(struct extcon_specific_cable_nb *obj, 305 const char *extcon_name, const char *cable_name, 306 struct notifier_block *nb) 307 { 308 return -EINVAL; 309 } 310 311 static inline int extcon_unregister_interest(struct extcon_specific_cable_nb *obj) 312 { 313 return -EINVAL; 314 } 315 #endif /* __LINUX_EXTCON_H__ */ 316