linux/include/linux/extcon.h
<<
>>
Prefs
   1/*
   2 *  External connector (extcon) class driver
   3 *
   4 * Copyright (C) 2015 Samsung Electronics
   5 * Author: Chanwoo Choi <cw00.choi@samsung.com>
   6 *
   7 * Copyright (C) 2012 Samsung Electronics
   8 * Author: Donggeun Kim <dg77.kim@samsung.com>
   9 * Author: MyungJoo Ham <myungjoo.ham@samsung.com>
  10 *
  11 * based on switch class driver
  12 * Copyright (C) 2008 Google, Inc.
  13 * Author: Mike Lockwood <lockwood@android.com>
  14 *
  15 * This software is licensed under the terms of the GNU General Public
  16 * License version 2, as published by the Free Software Foundation, and
  17 * may be copied, distributed, and modified under those terms.
  18 *
  19 * This program is distributed in the hope that it will be useful,
  20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  22 * GNU General Public License for more details.
  23 *
  24*/
  25
  26#ifndef __LINUX_EXTCON_H__
  27#define __LINUX_EXTCON_H__
  28
  29#include <linux/device.h>
  30
  31/*
  32 * Define the unique id of supported external connectors
  33 */
  34#define EXTCON_NONE             0
  35
  36/* USB external connector */
  37#define EXTCON_USB              1
  38#define EXTCON_USB_HOST         2
  39
  40/* Charging external connector */
  41#define EXTCON_CHG_USB_SDP      5       /* Standard Downstream Port */
  42#define EXTCON_CHG_USB_DCP      6       /* Dedicated Charging Port */
  43#define EXTCON_CHG_USB_CDP      7       /* Charging Downstream Port */
  44#define EXTCON_CHG_USB_ACA      8       /* Accessory Charger Adapter */
  45#define EXTCON_CHG_USB_FAST     9
  46#define EXTCON_CHG_USB_SLOW     10
  47
  48/* Jack external connector */
  49#define EXTCON_JACK_MICROPHONE  20
  50#define EXTCON_JACK_HEADPHONE   21
  51#define EXTCON_JACK_LINE_IN     22
  52#define EXTCON_JACK_LINE_OUT    23
  53#define EXTCON_JACK_VIDEO_IN    24
  54#define EXTCON_JACK_VIDEO_OUT   25
  55#define EXTCON_JACK_SPDIF_IN    26      /* Sony Philips Digital InterFace */
  56#define EXTCON_JACK_SPDIF_OUT   27
  57
  58/* Display external connector */
  59#define EXTCON_DISP_HDMI        40      /* High-Definition Multimedia Interface */
  60#define EXTCON_DISP_MHL         41      /* Mobile High-Definition Link */
  61#define EXTCON_DISP_DVI         42      /* Digital Visual Interface */
  62#define EXTCON_DISP_VGA         43      /* Video Graphics Array */
  63
  64/* Miscellaneous external connector */
  65#define EXTCON_DOCK             60
  66#define EXTCON_JIG              61
  67#define EXTCON_MECHANICAL       62
  68
  69#define EXTCON_NUM              63
  70
  71struct extcon_cable;
  72
  73/**
  74 * struct extcon_dev - An extcon device represents one external connector.
  75 * @name:               The name of this extcon device. Parent device name is
  76 *                      used if NULL.
  77 * @supported_cable:    Array of supported cable names ending with EXTCON_NONE.
  78 *                      If supported_cable is NULL, cable name related APIs
  79 *                      are disabled.
  80 * @mutually_exclusive: Array of mutually exclusive set of cables that cannot
  81 *                      be attached simultaneously. The array should be
  82 *                      ending with NULL or be NULL (no mutually exclusive
  83 *                      cables). For example, if it is { 0x7, 0x30, 0}, then,
  84 *                      {0, 1}, {0, 1, 2}, {0, 2}, {1, 2}, or {4, 5} cannot
  85 *                      be attached simulataneously. {0x7, 0} is equivalent to
  86 *                      {0x3, 0x6, 0x5, 0}. If it is {0xFFFFFFFF, 0}, there
  87 *                      can be no simultaneous connections.
  88 * @dev:                Device of this extcon.
  89 * @state:              Attach/detach state of this extcon. Do not provide at
  90 *                      register-time.
  91 * @nh:                 Notifier for the state change events from this extcon
  92 * @entry:              To support list of extcon devices so that users can
  93 *                      search for extcon devices based on the extcon name.
  94 * @lock:
  95 * @max_supported:      Internal value to store the number of cables.
  96 * @extcon_dev_type:    Device_type struct to provide attribute_groups
  97 *                      customized for each extcon device.
  98 * @cables:             Sysfs subdirectories. Each represents one cable.
  99 *
 100 * In most cases, users only need to provide "User initializing data" of
 101 * this struct when registering an extcon. In some exceptional cases,
 102 * optional callbacks may be needed. However, the values in "internal data"
 103 * are overwritten by register function.
 104 */
 105struct extcon_dev {
 106        /* Optional user initializing data */
 107        const char *name;
 108        const unsigned int *supported_cable;
 109        const u32 *mutually_exclusive;
 110
 111        /* Internal data. Please do not set. */
 112        struct device dev;
 113        struct raw_notifier_head *nh;
 114        struct list_head entry;
 115        int max_supported;
 116        spinlock_t lock;        /* could be called by irq handler */
 117        u32 state;
 118
 119        /* /sys/class/extcon/.../cable.n/... */
 120        struct device_type extcon_dev_type;
 121        struct extcon_cable *cables;
 122
 123        /* /sys/class/extcon/.../mutually_exclusive/... */
 124        struct attribute_group attr_g_muex;
 125        struct attribute **attrs_muex;
 126        struct device_attribute *d_attrs_muex;
 127};
 128
 129#if IS_ENABLED(CONFIG_EXTCON)
 130
 131/*
 132 * Following APIs are for notifiers or configurations.
 133 * Notifiers are the external port and connection devices.
 134 */
 135extern int extcon_dev_register(struct extcon_dev *edev);
 136extern void extcon_dev_unregister(struct extcon_dev *edev);
 137extern int devm_extcon_dev_register(struct device *dev,
 138                                    struct extcon_dev *edev);
 139extern void devm_extcon_dev_unregister(struct device *dev,
 140                                       struct extcon_dev *edev);
 141extern struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name);
 142
 143/*
 144 * Following APIs control the memory of extcon device.
 145 */
 146extern struct extcon_dev *extcon_dev_allocate(const unsigned int *cable);
 147extern void extcon_dev_free(struct extcon_dev *edev);
 148extern struct extcon_dev *devm_extcon_dev_allocate(struct device *dev,
 149                                                   const unsigned int *cable);
 150extern void devm_extcon_dev_free(struct device *dev, struct extcon_dev *edev);
 151
 152/*
 153 * get/set/update_state access the 32b encoded state value, which represents
 154 * states of all possible cables of the multistate port. For example, if one
 155 * calls extcon_set_state(edev, 0x7), it may mean that all the three cables
 156 * are attached to the port.
 157 */
 158static inline u32 extcon_get_state(struct extcon_dev *edev)
 159{
 160        return edev->state;
 161}
 162
 163extern int extcon_set_state(struct extcon_dev *edev, u32 state);
 164extern int extcon_update_state(struct extcon_dev *edev, u32 mask, u32 state);
 165
 166/*
 167 * get/set_cable_state access each bit of the 32b encoded state value.
 168 * They are used to access the status of each cable based on the cable id.
 169 */
 170extern int extcon_get_cable_state_(struct extcon_dev *edev, unsigned int id);
 171extern int extcon_set_cable_state_(struct extcon_dev *edev, unsigned int id,
 172                                   bool cable_state);
 173
 174/*
 175 * Following APIs are to monitor every action of a notifier.
 176 * Registrar gets notified for every external port of a connection device.
 177 * Probably this could be used to debug an action of notifier; however,
 178 * we do not recommend to use this for normal 'notifiee' device drivers who
 179 * want to be notified by a specific external port of the notifier.
 180 */
 181extern int extcon_register_notifier(struct extcon_dev *edev, unsigned int id,
 182                                    struct notifier_block *nb);
 183extern int extcon_unregister_notifier(struct extcon_dev *edev, unsigned int id,
 184                                    struct notifier_block *nb);
 185extern int devm_extcon_register_notifier(struct device *dev,
 186                                struct extcon_dev *edev, unsigned int id,
 187                                struct notifier_block *nb);
 188extern void devm_extcon_unregister_notifier(struct device *dev,
 189                                struct extcon_dev *edev, unsigned int id,
 190                                struct notifier_block *nb);
 191
 192/*
 193 * Following API get the extcon device from devicetree.
 194 * This function use phandle of devicetree to get extcon device directly.
 195 */
 196extern struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev,
 197                                                     int index);
 198
 199/* Following API to get information of extcon device */
 200extern const char *extcon_get_edev_name(struct extcon_dev *edev);
 201
 202
 203#else /* CONFIG_EXTCON */
 204static inline int extcon_dev_register(struct extcon_dev *edev)
 205{
 206        return 0;
 207}
 208
 209static inline void extcon_dev_unregister(struct extcon_dev *edev) { }
 210
 211static inline int devm_extcon_dev_register(struct device *dev,
 212                                           struct extcon_dev *edev)
 213{
 214        return -EINVAL;
 215}
 216
 217static inline void devm_extcon_dev_unregister(struct device *dev,
 218                                              struct extcon_dev *edev) { }
 219
 220static inline struct extcon_dev *extcon_dev_allocate(const unsigned int *cable)
 221{
 222        return ERR_PTR(-ENOSYS);
 223}
 224
 225static inline void extcon_dev_free(struct extcon_dev *edev) { }
 226
 227static inline struct extcon_dev *devm_extcon_dev_allocate(struct device *dev,
 228                                                const unsigned int *cable)
 229{
 230        return ERR_PTR(-ENOSYS);
 231}
 232
 233static inline void devm_extcon_dev_free(struct extcon_dev *edev) { }
 234
 235static inline u32 extcon_get_state(struct extcon_dev *edev)
 236{
 237        return 0;
 238}
 239
 240static inline int extcon_set_state(struct extcon_dev *edev, u32 state)
 241{
 242        return 0;
 243}
 244
 245static inline int extcon_update_state(struct extcon_dev *edev, u32 mask,
 246                                       u32 state)
 247{
 248        return 0;
 249}
 250
 251static inline int extcon_get_cable_state_(struct extcon_dev *edev,
 252                                          unsigned int id)
 253{
 254        return 0;
 255}
 256
 257static inline int extcon_set_cable_state_(struct extcon_dev *edev,
 258                                          unsigned int id, bool cable_state)
 259{
 260        return 0;
 261}
 262
 263static inline struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name)
 264{
 265        return NULL;
 266}
 267
 268static inline int extcon_register_notifier(struct extcon_dev *edev,
 269                                        unsigned int id,
 270                                        struct notifier_block *nb)
 271{
 272        return 0;
 273}
 274
 275static inline int extcon_unregister_notifier(struct extcon_dev *edev,
 276                                        unsigned int id,
 277                                        struct notifier_block *nb)
 278{
 279        return 0;
 280}
 281
 282static inline int devm_extcon_register_notifier(struct device *dev,
 283                                struct extcon_dev *edev, unsigned int id,
 284                                struct notifier_block *nb)
 285{
 286        return -ENOSYS;
 287}
 288
 289static inline  void devm_extcon_unregister_notifier(struct device *dev,
 290                                struct extcon_dev *edev, unsigned int id,
 291                                struct notifier_block *nb) { }
 292
 293static inline struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev,
 294                                                            int index)
 295{
 296        return ERR_PTR(-ENODEV);
 297}
 298#endif /* CONFIG_EXTCON */
 299
 300/*
 301 * Following structure and API are deprecated. EXTCON remains the function
 302 * definition to prevent the build break.
 303 */
 304struct extcon_specific_cable_nb {
 305       struct notifier_block *user_nb;
 306       int cable_index;
 307       struct extcon_dev *edev;
 308       unsigned long previous_value;
 309};
 310
 311static inline int extcon_register_interest(struct extcon_specific_cable_nb *obj,
 312                        const char *extcon_name, const char *cable_name,
 313                        struct notifier_block *nb)
 314{
 315        return -EINVAL;
 316}
 317
 318static inline int extcon_unregister_interest(struct extcon_specific_cable_nb
 319                                                    *obj)
 320{
 321        return -EINVAL;
 322}
 323#endif /* __LINUX_EXTCON_H__ */
 324