at v5.2-rc2 10 kB view raw
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 */ 170union extcon_property_value { 171 int intval; /* type : integer (intval) */ 172}; 173 174struct 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 */ 181extern 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 */ 192extern int extcon_get_property(struct extcon_dev *edev, unsigned int id, 193 unsigned int prop, 194 union extcon_property_value *prop_val); 195extern 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 */ 207extern int extcon_register_notifier(struct extcon_dev *edev, unsigned int id, 208 struct notifier_block *nb); 209extern int extcon_unregister_notifier(struct extcon_dev *edev, unsigned int id, 210 struct notifier_block *nb); 211extern int devm_extcon_register_notifier(struct device *dev, 212 struct extcon_dev *edev, unsigned int id, 213 struct notifier_block *nb); 214extern void devm_extcon_unregister_notifier(struct device *dev, 215 struct extcon_dev *edev, unsigned int id, 216 struct notifier_block *nb); 217 218extern int extcon_register_notifier_all(struct extcon_dev *edev, 219 struct notifier_block *nb); 220extern int extcon_unregister_notifier_all(struct extcon_dev *edev, 221 struct notifier_block *nb); 222extern int devm_extcon_register_notifier_all(struct device *dev, 223 struct extcon_dev *edev, 224 struct notifier_block *nb); 225extern 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 */ 232extern struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name); 233extern struct extcon_dev *extcon_find_edev_by_node(struct device_node *node); 234extern struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev, 235 int index); 236 237/* Following API get the name of extcon device. */ 238extern const char *extcon_get_edev_name(struct extcon_dev *edev); 239 240#else /* CONFIG_EXTCON */ 241static inline int extcon_get_state(struct extcon_dev *edev, unsigned int id) 242{ 243 return 0; 244} 245 246static inline int extcon_get_property(struct extcon_dev *edev, unsigned int id, 247 unsigned int prop, 248 union extcon_property_value *prop_val) 249{ 250 return 0; 251} 252 253static inline int extcon_get_property_capability(struct extcon_dev *edev, 254 unsigned int id, unsigned int prop) 255{ 256 return 0; 257} 258 259static inline int extcon_register_notifier(struct extcon_dev *edev, 260 unsigned int id, struct notifier_block *nb) 261{ 262 return 0; 263} 264 265static inline int extcon_unregister_notifier(struct extcon_dev *edev, 266 unsigned int id, struct notifier_block *nb) 267{ 268 return 0; 269} 270 271static inline int devm_extcon_register_notifier(struct device *dev, 272 struct extcon_dev *edev, unsigned int id, 273 struct notifier_block *nb) 274{ 275 return -ENOSYS; 276} 277 278static inline void devm_extcon_unregister_notifier(struct device *dev, 279 struct extcon_dev *edev, unsigned int id, 280 struct notifier_block *nb) { } 281 282static inline struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name) 283{ 284 return ERR_PTR(-ENODEV); 285} 286 287static inline struct extcon_dev *extcon_find_edev_by_node(struct device_node *node) 288{ 289 return ERR_PTR(-ENODEV); 290} 291 292static inline struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev, 293 int index) 294{ 295 return ERR_PTR(-ENODEV); 296} 297#endif /* CONFIG_EXTCON */ 298 299/* 300 * Following structure and API are deprecated. EXTCON remains the function 301 * definition to prevent the build break. 302 */ 303struct extcon_specific_cable_nb { 304 struct notifier_block *user_nb; 305 int cable_index; 306 struct extcon_dev *edev; 307 unsigned long previous_value; 308}; 309 310static inline int extcon_register_interest(struct extcon_specific_cable_nb *obj, 311 const char *extcon_name, const char *cable_name, 312 struct notifier_block *nb) 313{ 314 return -EINVAL; 315} 316 317static inline int extcon_unregister_interest(struct extcon_specific_cable_nb *obj) 318{ 319 return -EINVAL; 320} 321#endif /* __LINUX_EXTCON_H__ */