1/*
2 * External Connector (extcon) framework
3 * - linux/include/linux/extcon-provider.h for extcon provider device driver.
4 *
5 * Copyright (C) 2017 Samsung Electronics
6 * Author: Chanwoo Choi <cw00.choi@samsung.com>
7 *
8 * This software is licensed under the terms of the GNU General Public
9 * License version 2, as published by the Free Software Foundation, and
10 * may be copied, distributed, and modified under those terms.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 */
17
18#ifndef __LINUX_EXTCON_PROVIDER_H__
19#define __LINUX_EXTCON_PROVIDER_H__
20
21#include <linux/extcon.h>
22
23struct extcon_dev;
24
25#if IS_ENABLED(CONFIG_EXTCON)
26
27/* Following APIs register/unregister the extcon device. */
28extern int extcon_dev_register(struct extcon_dev *edev);
29extern void extcon_dev_unregister(struct extcon_dev *edev);
30extern int devm_extcon_dev_register(struct device *dev,
31 struct extcon_dev *edev);
32extern void devm_extcon_dev_unregister(struct device *dev,
33 struct extcon_dev *edev);
34
35/* Following APIs allocate/free the memory of the extcon device. */
36extern struct extcon_dev *extcon_dev_allocate(const unsigned int *cable);
37extern void extcon_dev_free(struct extcon_dev *edev);
38extern struct extcon_dev *devm_extcon_dev_allocate(struct device *dev,
39 const unsigned int *cable);
40extern void devm_extcon_dev_free(struct device *dev, struct extcon_dev *edev);
41
42/* Synchronize the state and property value for each external connector. */
43extern int extcon_sync(struct extcon_dev *edev, unsigned int id);
44
45/*
46 * Following APIs set the connected state of each external connector.
47 * The 'id' argument indicates the defined external connector.
48 */
49extern int extcon_set_state(struct extcon_dev *edev, unsigned int id,
50 bool state);
51extern int extcon_set_state_sync(struct extcon_dev *edev, unsigned int id,
52 bool state);
53
54/*
55 * Following APIs set the property of each external connector.
56 * The 'id' argument indicates the defined external connector
57 * and the 'prop' indicates the extcon property.
58 *
59 * And extcon_set_property_capability() set the capability of the property
60 * for each external connector. They are used to set the capability of the
61 * property of each external connector based on the id and property.
62 */
63extern int extcon_set_property(struct extcon_dev *edev, unsigned int id,
64 unsigned int prop,
65 union extcon_property_value prop_val);
66extern int extcon_set_property_sync(struct extcon_dev *edev, unsigned int id,
67 unsigned int prop,
68 union extcon_property_value prop_val);
69extern int extcon_set_property_capability(struct extcon_dev *edev,
70 unsigned int id, unsigned int prop);
71
72#else /* CONFIG_EXTCON */
73static inline int extcon_dev_register(struct extcon_dev *edev)
74{
75 return 0;
76}
77
78static inline void extcon_dev_unregister(struct extcon_dev *edev) { }
79
80static inline int devm_extcon_dev_register(struct device *dev,
81 struct extcon_dev *edev)
82{
83 return -EINVAL;
84}
85
86static inline void devm_extcon_dev_unregister(struct device *dev,
87 struct extcon_dev *edev) { }
88
89static inline struct extcon_dev *extcon_dev_allocate(const unsigned int *cable)
90{
91 return ERR_PTR(-ENOSYS);
92}
93
94static inline void extcon_dev_free(struct extcon_dev *edev) { }
95
96static inline struct extcon_dev *devm_extcon_dev_allocate(struct device *dev,
97 const unsigned int *cable)
98{
99 return ERR_PTR(-ENOSYS);
100}
101
102static inline void devm_extcon_dev_free(struct extcon_dev *edev) { }
103
104
105static inline int extcon_set_state(struct extcon_dev *edev, unsigned int id,
106 bool state)
107{
108 return 0;
109}
110
111static inline int extcon_set_state_sync(struct extcon_dev *edev, unsigned int id,
112 bool state)
113{
114 return 0;
115}
116
117static inline int extcon_sync(struct extcon_dev *edev, unsigned int id)
118{
119 return 0;
120}
121
122static inline int extcon_set_property(struct extcon_dev *edev, unsigned int id,
123 unsigned int prop,
124 union extcon_property_value prop_val)
125{
126 return 0;
127}
128
129static inline int extcon_set_property_sync(struct extcon_dev *edev,
130 unsigned int id, unsigned int prop,
131 union extcon_property_value prop_val)
132{
133 return 0;
134}
135
136static inline int extcon_set_property_capability(struct extcon_dev *edev,
137 unsigned int id, unsigned int prop)
138{
139 return 0;
140}
141#endif /* CONFIG_EXTCON */
142#endif /* __LINUX_EXTCON_PROVIDER_H__ */
143