Chanwoo Choi | 176aa36 | 2017-09-21 12:11:24 +0900 | [diff] [blame^] | 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 | |
| 23 | struct extcon_dev; |
| 24 | |
| 25 | #if IS_ENABLED(CONFIG_EXTCON) |
| 26 | |
| 27 | /* Following APIs register/unregister the extcon device. */ |
| 28 | extern int extcon_dev_register(struct extcon_dev *edev); |
| 29 | extern void extcon_dev_unregister(struct extcon_dev *edev); |
| 30 | extern int devm_extcon_dev_register(struct device *dev, |
| 31 | struct extcon_dev *edev); |
| 32 | extern 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. */ |
| 36 | extern struct extcon_dev *extcon_dev_allocate(const unsigned int *cable); |
| 37 | extern void extcon_dev_free(struct extcon_dev *edev); |
| 38 | extern struct extcon_dev *devm_extcon_dev_allocate(struct device *dev, |
| 39 | const unsigned int *cable); |
| 40 | extern void devm_extcon_dev_free(struct device *dev, struct extcon_dev *edev); |
| 41 | |
| 42 | /* Synchronize the state and property value for each external connector. */ |
| 43 | extern 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 | */ |
| 49 | extern int extcon_set_state(struct extcon_dev *edev, unsigned int id, |
| 50 | bool state); |
| 51 | extern 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 | */ |
| 63 | extern int extcon_set_property(struct extcon_dev *edev, unsigned int id, |
| 64 | unsigned int prop, |
| 65 | union extcon_property_value prop_val); |
| 66 | extern int extcon_set_property_sync(struct extcon_dev *edev, unsigned int id, |
| 67 | unsigned int prop, |
| 68 | union extcon_property_value prop_val); |
| 69 | extern int extcon_set_property_capability(struct extcon_dev *edev, |
| 70 | unsigned int id, unsigned int prop); |
| 71 | |
| 72 | #else /* CONFIG_EXTCON */ |
| 73 | static inline int extcon_dev_register(struct extcon_dev *edev) |
| 74 | { |
| 75 | return 0; |
| 76 | } |
| 77 | |
| 78 | static inline void extcon_dev_unregister(struct extcon_dev *edev) { } |
| 79 | |
| 80 | static inline int devm_extcon_dev_register(struct device *dev, |
| 81 | struct extcon_dev *edev) |
| 82 | { |
| 83 | return -EINVAL; |
| 84 | } |
| 85 | |
| 86 | static inline void devm_extcon_dev_unregister(struct device *dev, |
| 87 | struct extcon_dev *edev) { } |
| 88 | |
| 89 | static inline struct extcon_dev *extcon_dev_allocate(const unsigned int *cable) |
| 90 | { |
| 91 | return ERR_PTR(-ENOSYS); |
| 92 | } |
| 93 | |
| 94 | static inline void extcon_dev_free(struct extcon_dev *edev) { } |
| 95 | |
| 96 | static inline struct extcon_dev *devm_extcon_dev_allocate(struct device *dev, |
| 97 | const unsigned int *cable) |
| 98 | { |
| 99 | return ERR_PTR(-ENOSYS); |
| 100 | } |
| 101 | |
| 102 | static inline void devm_extcon_dev_free(struct extcon_dev *edev) { } |
| 103 | |
| 104 | |
| 105 | static inline int extcon_set_state(struct extcon_dev *edev, unsigned int id, |
| 106 | bool state) |
| 107 | { |
| 108 | return 0; |
| 109 | } |
| 110 | |
| 111 | static inline int extcon_set_state_sync(struct extcon_dev *edev, unsigned int id, |
| 112 | bool state) |
| 113 | { |
| 114 | return 0; |
| 115 | } |
| 116 | |
| 117 | static inline int extcon_sync(struct extcon_dev *edev, unsigned int id) |
| 118 | { |
| 119 | return 0; |
| 120 | } |
| 121 | |
| 122 | static 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 | |
| 129 | static 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 | |
| 136 | static 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__ */ |