linux/include/linux/extcon.h
<<
>>
Prefs
   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 ERR_PTR(-ENODEV);
 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__ */
 342