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