linux/include/linux/extcon.h
<<
>>
Prefs
   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__ */
 322