13d0407baSopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
23d0407baSopenharmony_ci/*
33d0407baSopenharmony_ci * External Connector (extcon) framework
43d0407baSopenharmony_ci * - linux/include/linux/extcon.h for extcon consumer device driver.
53d0407baSopenharmony_ci *
63d0407baSopenharmony_ci * Copyright (C) 2015 Samsung Electronics
73d0407baSopenharmony_ci * Author: Chanwoo Choi <cw00.choi@samsung.com>
83d0407baSopenharmony_ci *
93d0407baSopenharmony_ci * Copyright (C) 2012 Samsung Electronics
103d0407baSopenharmony_ci * Author: Donggeun Kim <dg77.kim@samsung.com>
113d0407baSopenharmony_ci * Author: MyungJoo Ham <myungjoo.ham@samsung.com>
123d0407baSopenharmony_ci *
133d0407baSopenharmony_ci * based on switch class driver
143d0407baSopenharmony_ci * Copyright (C) 2008 Google, Inc.
153d0407baSopenharmony_ci * Author: Mike Lockwood <lockwood@android.com>
163d0407baSopenharmony_ci */
173d0407baSopenharmony_ci
183d0407baSopenharmony_ci#ifndef __LINUX_EXTCON_H__
193d0407baSopenharmony_ci#define __LINUX_EXTCON_H__
203d0407baSopenharmony_ci
213d0407baSopenharmony_ci#include <linux/device.h>
223d0407baSopenharmony_ci
233d0407baSopenharmony_ci/*
243d0407baSopenharmony_ci * Define the type of supported external connectors
253d0407baSopenharmony_ci */
263d0407baSopenharmony_ci#define EXTCON_TYPE_USB BIT(0)  /* USB connector */
273d0407baSopenharmony_ci#define EXTCON_TYPE_CHG BIT(1)  /* Charger connector */
283d0407baSopenharmony_ci#define EXTCON_TYPE_JACK BIT(2) /* Jack connector */
293d0407baSopenharmony_ci#define EXTCON_TYPE_DISP BIT(3) /* Display connector */
303d0407baSopenharmony_ci#define EXTCON_TYPE_MISC BIT(4) /* Miscellaneous connector */
313d0407baSopenharmony_ci
323d0407baSopenharmony_ci/*
333d0407baSopenharmony_ci * Define the unique id of supported external connectors
343d0407baSopenharmony_ci */
353d0407baSopenharmony_ci#define EXTCON_NONE 0
363d0407baSopenharmony_ci
373d0407baSopenharmony_ci/* USB external connector */
383d0407baSopenharmony_ci#define EXTCON_USB 1
393d0407baSopenharmony_ci#define EXTCON_USB_HOST 2
403d0407baSopenharmony_ci#define EXTCON_USB_VBUS_EN 3
413d0407baSopenharmony_ci
423d0407baSopenharmony_ci/*
433d0407baSopenharmony_ci * Charging external connector
443d0407baSopenharmony_ci *
453d0407baSopenharmony_ci * When one SDP charger connector was reported, we should also report
463d0407baSopenharmony_ci * the USB connector, which means EXTCON_CHG_USB_SDP should always
473d0407baSopenharmony_ci * appear together with EXTCON_USB. The same as ACA charger connector,
483d0407baSopenharmony_ci * EXTCON_CHG_USB_ACA would normally appear with EXTCON_USB_HOST.
493d0407baSopenharmony_ci *
503d0407baSopenharmony_ci * The EXTCON_CHG_USB_SLOW connector can provide at least 500mA of
513d0407baSopenharmony_ci * current at 5V. The EXTCON_CHG_USB_FAST connector can provide at
523d0407baSopenharmony_ci * least 1A of current at 5V.
533d0407baSopenharmony_ci */
543d0407baSopenharmony_ci#define EXTCON_CHG_USB_SDP 5 /* Standard Downstream Port */
553d0407baSopenharmony_ci#define EXTCON_CHG_USB_DCP 6 /* Dedicated Charging Port */
563d0407baSopenharmony_ci#define EXTCON_CHG_USB_CDP 7 /* Charging Downstream Port */
573d0407baSopenharmony_ci#define EXTCON_CHG_USB_ACA 8 /* Accessory Charger Adapter */
583d0407baSopenharmony_ci#define EXTCON_CHG_USB_FAST 9
593d0407baSopenharmony_ci#define EXTCON_CHG_USB_SLOW 10
603d0407baSopenharmony_ci#define EXTCON_CHG_WPT 11    /* Wireless Power Transfer */
613d0407baSopenharmony_ci#define EXTCON_CHG_USB_PD 12 /* USB Power Delivery */
623d0407baSopenharmony_ci
633d0407baSopenharmony_ci/* Jack external connector */
643d0407baSopenharmony_ci#define EXTCON_JACK_MICROPHONE 20
653d0407baSopenharmony_ci#define EXTCON_JACK_HEADPHONE 21
663d0407baSopenharmony_ci#define EXTCON_JACK_LINE_IN 22
673d0407baSopenharmony_ci#define EXTCON_JACK_LINE_OUT 23
683d0407baSopenharmony_ci#define EXTCON_JACK_VIDEO_IN 24
693d0407baSopenharmony_ci#define EXTCON_JACK_VIDEO_OUT 25
703d0407baSopenharmony_ci#define EXTCON_JACK_SPDIF_IN 26 /* Sony Philips Digital InterFace */
713d0407baSopenharmony_ci#define EXTCON_JACK_SPDIF_OUT 27
723d0407baSopenharmony_ci
733d0407baSopenharmony_ci/* Display external connector */
743d0407baSopenharmony_ci#define EXTCON_DISP_HDMI 40 /* High-Definition Multimedia Interface */
753d0407baSopenharmony_ci#define EXTCON_DISP_MHL 41  /* Mobile High-Definition Link */
763d0407baSopenharmony_ci#define EXTCON_DISP_DVI 42  /* Digital Visual Interface */
773d0407baSopenharmony_ci#define EXTCON_DISP_VGA 43  /* Video Graphics Array */
783d0407baSopenharmony_ci#define EXTCON_DISP_DP 44   /* Display Port */
793d0407baSopenharmony_ci#define EXTCON_DISP_HMD 45  /* Head-Mounted Display */
803d0407baSopenharmony_ci#define EXTCON_DISP_CVBS 46 /* Composite Video Broadcast Signal */
813d0407baSopenharmony_ci#define EXTCON_DISP_EDP 47  /* Embedded Display Port */
823d0407baSopenharmony_ci
833d0407baSopenharmony_ci/* Miscellaneous external connector */
843d0407baSopenharmony_ci#define EXTCON_DOCK 60
853d0407baSopenharmony_ci#define EXTCON_JIG 61
863d0407baSopenharmony_ci#define EXTCON_MECHANICAL 62
873d0407baSopenharmony_ci
883d0407baSopenharmony_ci#define EXTCON_NUM 63
893d0407baSopenharmony_ci
903d0407baSopenharmony_ci/*
913d0407baSopenharmony_ci * Define the properties of supported external connectors.
923d0407baSopenharmony_ci *
933d0407baSopenharmony_ci * When adding the new extcon property, they *must* have
943d0407baSopenharmony_ci * the type/value/default information. Also, you *have to*
953d0407baSopenharmony_ci * modify the EXTCON_PROP_[type]_START/END definitions
963d0407baSopenharmony_ci * which mean the range of the supported properties
973d0407baSopenharmony_ci * for each extcon type.
983d0407baSopenharmony_ci *
993d0407baSopenharmony_ci * The naming style of property
1003d0407baSopenharmony_ci * : EXTCON_PROP_[type]_[property name]
1013d0407baSopenharmony_ci *
1023d0407baSopenharmony_ci * EXTCON_PROP_USB_[property name]    : USB property
1033d0407baSopenharmony_ci * EXTCON_PROP_CHG_[property name]    : Charger property
1043d0407baSopenharmony_ci * EXTCON_PROP_JACK_[property name]    : Jack property
1053d0407baSopenharmony_ci * EXTCON_PROP_DISP_[property name]    : Display property
1063d0407baSopenharmony_ci */
1073d0407baSopenharmony_ci
1083d0407baSopenharmony_ci/*
1093d0407baSopenharmony_ci * Properties of EXTCON_TYPE_USB.
1103d0407baSopenharmony_ci *
1113d0407baSopenharmony_ci * - EXTCON_PROP_USB_VBUS
1123d0407baSopenharmony_ci * @type:    integer (intval)
1133d0407baSopenharmony_ci * @value:    0 (low) or 1 (high)
1143d0407baSopenharmony_ci * @default:    0 (low)
1153d0407baSopenharmony_ci * - EXTCON_PROP_USB_TYPEC_POLARITY
1163d0407baSopenharmony_ci * @type:    integer (intval)
1173d0407baSopenharmony_ci * @value:    0 (normal) or 1 (flip)
1183d0407baSopenharmony_ci * @default:    0 (normal)
1193d0407baSopenharmony_ci * - EXTCON_PROP_USB_SS (SuperSpeed)
1203d0407baSopenharmony_ci * @type:       integer (intval)
1213d0407baSopenharmony_ci * @value:      0 (USB/USB2) or 1 (USB3)
1223d0407baSopenharmony_ci * @default:    0 (USB/USB2)
1233d0407baSopenharmony_ci *
1243d0407baSopenharmony_ci */
1253d0407baSopenharmony_ci#define EXTCON_PROP_USB_VBUS 0
1263d0407baSopenharmony_ci#define EXTCON_PROP_USB_TYPEC_POLARITY 1
1273d0407baSopenharmony_ci#define EXTCON_PROP_USB_SS 2
1283d0407baSopenharmony_ci
1293d0407baSopenharmony_ci#define EXTCON_PROP_USB_MIN 0
1303d0407baSopenharmony_ci#define EXTCON_PROP_USB_MAX 2
1313d0407baSopenharmony_ci#define EXTCON_PROP_USB_CNT (EXTCON_PROP_USB_MAX - EXTCON_PROP_USB_MIN + 1)
1323d0407baSopenharmony_ci
1333d0407baSopenharmony_ci/* Properties of EXTCON_TYPE_CHG. */
1343d0407baSopenharmony_ci#define EXTCON_PROP_CHG_MIN 50
1353d0407baSopenharmony_ci#define EXTCON_PROP_CHG_MAX 50
1363d0407baSopenharmony_ci#define EXTCON_PROP_CHG_CNT (EXTCON_PROP_CHG_MAX - EXTCON_PROP_CHG_MIN + 1)
1373d0407baSopenharmony_ci
1383d0407baSopenharmony_ci/* Properties of EXTCON_TYPE_JACK. */
1393d0407baSopenharmony_ci#define EXTCON_PROP_JACK_MIN 100
1403d0407baSopenharmony_ci#define EXTCON_PROP_JACK_MAX 100
1413d0407baSopenharmony_ci#define EXTCON_PROP_JACK_CNT (EXTCON_PROP_JACK_MAX - EXTCON_PROP_JACK_MIN + 1)
1423d0407baSopenharmony_ci
1433d0407baSopenharmony_ci/*
1443d0407baSopenharmony_ci * Properties of EXTCON_TYPE_DISP.
1453d0407baSopenharmony_ci *
1463d0407baSopenharmony_ci * - EXTCON_PROP_DISP_HPD (Hot Plug Detect)
1473d0407baSopenharmony_ci * @type:       integer (intval)
1483d0407baSopenharmony_ci * @value:      0 (no hpd) or 1 (hpd)
1493d0407baSopenharmony_ci * @default:    0 (no hpd)
1503d0407baSopenharmony_ci *
1513d0407baSopenharmony_ci */
1523d0407baSopenharmony_ci#define EXTCON_PROP_DISP_HPD 150
1533d0407baSopenharmony_ci
1543d0407baSopenharmony_ci/* Properties of EXTCON_TYPE_DISP. */
1553d0407baSopenharmony_ci#define EXTCON_PROP_DISP_MIN 150
1563d0407baSopenharmony_ci#define EXTCON_PROP_DISP_MAX 151
1573d0407baSopenharmony_ci#define EXTCON_PROP_DISP_CNT (EXTCON_PROP_DISP_MAX - EXTCON_PROP_DISP_MIN + 1)
1583d0407baSopenharmony_ci
1593d0407baSopenharmony_ci/*
1603d0407baSopenharmony_ci * Define the type of property's value.
1613d0407baSopenharmony_ci *
1623d0407baSopenharmony_ci * Define the property's value as union type. Because each property
1633d0407baSopenharmony_ci * would need the different data type to store it.
1643d0407baSopenharmony_ci */
1653d0407baSopenharmony_ciunion extcon_property_value {
1663d0407baSopenharmony_ci    int intval; /* type : integer (intval) */
1673d0407baSopenharmony_ci};
1683d0407baSopenharmony_ci
1693d0407baSopenharmony_cistruct extcon_dev;
1703d0407baSopenharmony_ci
1713d0407baSopenharmony_ci#if IS_ENABLED(CONFIG_EXTCON)
1723d0407baSopenharmony_ci/*
1733d0407baSopenharmony_ci * Following APIs get the connected state of each external connector.
1743d0407baSopenharmony_ci * The 'id' argument indicates the defined external connector.
1753d0407baSopenharmony_ci */
1763d0407baSopenharmony_ciint extcon_get_state(struct extcon_dev *edev, unsigned int id);
1773d0407baSopenharmony_ci
1783d0407baSopenharmony_ci/*
1793d0407baSopenharmony_ci * Following APIs get the property of each external connector.
1803d0407baSopenharmony_ci * The 'id' argument indicates the defined external connector
1813d0407baSopenharmony_ci * and the 'prop' indicates the extcon property.
1823d0407baSopenharmony_ci *
1833d0407baSopenharmony_ci * And extcon_get_property_capability() get the capability of the property
1843d0407baSopenharmony_ci * for each external connector. They are used to get the capability of the
1853d0407baSopenharmony_ci * property of each external connector based on the id and property.
1863d0407baSopenharmony_ci */
1873d0407baSopenharmony_ciint extcon_get_property(struct extcon_dev *edev, unsigned int id, unsigned int prop,
1883d0407baSopenharmony_ci                        union extcon_property_value *prop_val);
1893d0407baSopenharmony_ciint extcon_get_property_capability(struct extcon_dev *edev, unsigned int id, unsigned int prop);
1903d0407baSopenharmony_ci
1913d0407baSopenharmony_ci/*
1923d0407baSopenharmony_ci * Following APIs register the notifier block in order to detect
1933d0407baSopenharmony_ci * the change of both state and property value for each external connector.
1943d0407baSopenharmony_ci *
1953d0407baSopenharmony_ci * extcon_register_notifier(*edev, id, *nb) : Register a notifier block
1963d0407baSopenharmony_ci *            for specific external connector of the extcon.
1973d0407baSopenharmony_ci * extcon_register_notifier_all(*edev, *nb) : Register a notifier block
1983d0407baSopenharmony_ci *            for all supported external connectors of the extcon.
1993d0407baSopenharmony_ci */
2003d0407baSopenharmony_ciint extcon_register_notifier(struct extcon_dev *edev, unsigned int id, struct notifier_block *nb);
2013d0407baSopenharmony_ciint extcon_unregister_notifier(struct extcon_dev *edev, unsigned int id, struct notifier_block *nb);
2023d0407baSopenharmony_ciint devm_extcon_register_notifier(struct device *dev, struct extcon_dev *edev, unsigned int id,
2033d0407baSopenharmony_ci                                  struct notifier_block *nb);
2043d0407baSopenharmony_civoid devm_extcon_unregister_notifier(struct device *dev, struct extcon_dev *edev, unsigned int id,
2053d0407baSopenharmony_ci                                     struct notifier_block *nb);
2063d0407baSopenharmony_ci
2073d0407baSopenharmony_ciint extcon_register_notifier_all(struct extcon_dev *edev, struct notifier_block *nb);
2083d0407baSopenharmony_ciint extcon_unregister_notifier_all(struct extcon_dev *edev, struct notifier_block *nb);
2093d0407baSopenharmony_ciint devm_extcon_register_notifier_all(struct device *dev, struct extcon_dev *edev, struct notifier_block *nb);
2103d0407baSopenharmony_civoid devm_extcon_unregister_notifier_all(struct device *dev, struct extcon_dev *edev, struct notifier_block *nb);
2113d0407baSopenharmony_ci
2123d0407baSopenharmony_ci/*
2133d0407baSopenharmony_ci * Following APIs get the extcon_dev from devicetree or by through extcon name.
2143d0407baSopenharmony_ci */
2153d0407baSopenharmony_cistruct extcon_dev *extcon_get_extcon_dev(const char *extcon_name);
2163d0407baSopenharmony_cistruct extcon_dev *extcon_find_edev_by_node(struct device_node *node);
2173d0407baSopenharmony_cistruct extcon_dev *extcon_get_edev_by_phandle(struct device *dev, int index);
2183d0407baSopenharmony_ci
2193d0407baSopenharmony_ci/* Following API get the name of extcon device. */
2203d0407baSopenharmony_ciconst char *extcon_get_edev_name(struct extcon_dev *edev);
2213d0407baSopenharmony_ci
2223d0407baSopenharmony_ci#else  /* CONFIG_EXTCON */
2233d0407baSopenharmony_cistatic inline int extcon_get_state(struct extcon_dev *edev, unsigned int id)
2243d0407baSopenharmony_ci{
2253d0407baSopenharmony_ci    return 0;
2263d0407baSopenharmony_ci}
2273d0407baSopenharmony_ci
2283d0407baSopenharmony_cistatic inline int extcon_get_property(struct extcon_dev *edev, unsigned int id, unsigned int prop,
2293d0407baSopenharmony_ci                                      union extcon_property_value *prop_val)
2303d0407baSopenharmony_ci{
2313d0407baSopenharmony_ci    return 0;
2323d0407baSopenharmony_ci}
2333d0407baSopenharmony_ci
2343d0407baSopenharmony_cistatic inline int extcon_get_property_capability(struct extcon_dev *edev, unsigned int id, unsigned int prop)
2353d0407baSopenharmony_ci{
2363d0407baSopenharmony_ci    return 0;
2373d0407baSopenharmony_ci}
2383d0407baSopenharmony_ci
2393d0407baSopenharmony_cistatic inline int extcon_register_notifier(struct extcon_dev *edev, unsigned int id, struct notifier_block *nb)
2403d0407baSopenharmony_ci{
2413d0407baSopenharmony_ci    return 0;
2423d0407baSopenharmony_ci}
2433d0407baSopenharmony_ci
2443d0407baSopenharmony_cistatic inline int extcon_unregister_notifier(struct extcon_dev *edev, unsigned int id, struct notifier_block *nb)
2453d0407baSopenharmony_ci{
2463d0407baSopenharmony_ci    return 0;
2473d0407baSopenharmony_ci}
2483d0407baSopenharmony_ci
2493d0407baSopenharmony_cistatic inline int devm_extcon_register_notifier(struct device *dev, struct extcon_dev *edev, unsigned int id,
2503d0407baSopenharmony_ci                                                struct notifier_block *nb)
2513d0407baSopenharmony_ci{
2523d0407baSopenharmony_ci    return -ENOSYS;
2533d0407baSopenharmony_ci}
2543d0407baSopenharmony_ci
2553d0407baSopenharmony_cistatic inline void devm_extcon_unregister_notifier(struct device *dev, struct extcon_dev *edev, unsigned int id,
2563d0407baSopenharmony_ci                                                   struct notifier_block *nb)
2573d0407baSopenharmony_ci{
2583d0407baSopenharmony_ci}
2593d0407baSopenharmony_ci
2603d0407baSopenharmony_cistatic inline int extcon_register_notifier_all(struct extcon_dev *edev, struct notifier_block *nb)
2613d0407baSopenharmony_ci{
2623d0407baSopenharmony_ci    return 0;
2633d0407baSopenharmony_ci}
2643d0407baSopenharmony_ci
2653d0407baSopenharmony_cistatic inline int extcon_unregister_notifier_all(struct extcon_dev *edev, struct notifier_block *nb)
2663d0407baSopenharmony_ci{
2673d0407baSopenharmony_ci    return 0;
2683d0407baSopenharmony_ci}
2693d0407baSopenharmony_ci
2703d0407baSopenharmony_cistatic inline int devm_extcon_register_notifier_all(struct device *dev, struct extcon_dev *edev,
2713d0407baSopenharmony_ci                                                    struct notifier_block *nb)
2723d0407baSopenharmony_ci{
2733d0407baSopenharmony_ci    return 0;
2743d0407baSopenharmony_ci}
2753d0407baSopenharmony_ci
2763d0407baSopenharmony_cistatic inline void devm_extcon_unregister_notifier_all(struct device *dev, struct extcon_dev *edev,
2773d0407baSopenharmony_ci                                                       struct notifier_block *nb)
2783d0407baSopenharmony_ci{
2793d0407baSopenharmony_ci}
2803d0407baSopenharmony_ci
2813d0407baSopenharmony_cistatic inline struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name)
2823d0407baSopenharmony_ci{
2833d0407baSopenharmony_ci    return ERR_PTR(-ENODEV);
2843d0407baSopenharmony_ci}
2853d0407baSopenharmony_ci
2863d0407baSopenharmony_cistatic inline struct extcon_dev *extcon_find_edev_by_node(struct device_node *node)
2873d0407baSopenharmony_ci{
2883d0407baSopenharmony_ci    return ERR_PTR(-ENODEV);
2893d0407baSopenharmony_ci}
2903d0407baSopenharmony_ci
2913d0407baSopenharmony_cistatic inline struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev, int index)
2923d0407baSopenharmony_ci{
2933d0407baSopenharmony_ci    return ERR_PTR(-ENODEV);
2943d0407baSopenharmony_ci}
2953d0407baSopenharmony_ci
2963d0407baSopenharmony_cistatic inline const char *extcon_get_edev_name(struct extcon_dev *edev)
2973d0407baSopenharmony_ci{
2983d0407baSopenharmony_ci    return NULL;
2993d0407baSopenharmony_ci}
3003d0407baSopenharmony_ci#endif /* CONFIG_EXTCON */
3013d0407baSopenharmony_ci
3023d0407baSopenharmony_ci/*
3033d0407baSopenharmony_ci * Following structure and API are deprecated. EXTCON remains the function
3043d0407baSopenharmony_ci * definition to prevent the build break.
3053d0407baSopenharmony_ci */
3063d0407baSopenharmony_cistruct extcon_specific_cable_nb {
3073d0407baSopenharmony_ci    struct notifier_block *user_nb;
3083d0407baSopenharmony_ci    int cable_index;
3093d0407baSopenharmony_ci    struct extcon_dev *edev;
3103d0407baSopenharmony_ci    unsigned long previous_value;
3113d0407baSopenharmony_ci};
3123d0407baSopenharmony_ci
3133d0407baSopenharmony_cistatic inline int extcon_register_interest(struct extcon_specific_cable_nb *obj, const char *extcon_name,
3143d0407baSopenharmony_ci                                           const char *cable_name, struct notifier_block *nb)
3153d0407baSopenharmony_ci{
3163d0407baSopenharmony_ci    return -EINVAL;
3173d0407baSopenharmony_ci}
3183d0407baSopenharmony_ci
3193d0407baSopenharmony_cistatic inline int extcon_unregister_interest(struct extcon_specific_cable_nb *obj)
3203d0407baSopenharmony_ci{
3213d0407baSopenharmony_ci    return -EINVAL;
3223d0407baSopenharmony_ci}
3233d0407baSopenharmony_ci#endif /* __LINUX_EXTCON_H__ */
324