1 | // SPDX-License-Identifier: GPL-2.0 |
2 | |
3 | #ifndef __USB_TYPEC_MUX |
4 | #define __USB_TYPEC_MUX |
5 | |
6 | #include <linux/property.h> |
7 | #include <linux/usb/typec.h> |
8 | |
9 | struct device; |
10 | struct typec_mux; |
11 | struct typec_mux_dev; |
12 | struct typec_switch; |
13 | struct typec_switch_dev; |
14 | struct typec_altmode; |
15 | struct fwnode_handle; |
16 | |
17 | typedef int (*typec_switch_set_fn_t)(struct typec_switch_dev *sw, |
18 | enum typec_orientation orientation); |
19 | |
20 | struct typec_switch_desc { |
21 | struct fwnode_handle *fwnode; |
22 | typec_switch_set_fn_t set; |
23 | const char *name; |
24 | void *drvdata; |
25 | }; |
26 | |
27 | struct typec_switch *fwnode_typec_switch_get(struct fwnode_handle *fwnode); |
28 | void typec_switch_put(struct typec_switch *sw); |
29 | int typec_switch_set(struct typec_switch *sw, |
30 | enum typec_orientation orientation); |
31 | |
32 | static inline struct typec_switch *typec_switch_get(struct device *dev) |
33 | { |
34 | return fwnode_typec_switch_get(dev_fwnode(dev)); |
35 | } |
36 | |
37 | struct typec_switch_dev * |
38 | typec_switch_register(struct device *parent, |
39 | const struct typec_switch_desc *desc); |
40 | void typec_switch_unregister(struct typec_switch_dev *sw); |
41 | |
42 | void typec_switch_set_drvdata(struct typec_switch_dev *sw, void *data); |
43 | void *typec_switch_get_drvdata(struct typec_switch_dev *sw); |
44 | |
45 | struct typec_mux_state { |
46 | struct typec_altmode *alt; |
47 | unsigned long mode; |
48 | void *data; |
49 | }; |
50 | |
51 | typedef int (*typec_mux_set_fn_t)(struct typec_mux_dev *mux, |
52 | struct typec_mux_state *state); |
53 | |
54 | struct typec_mux_desc { |
55 | struct fwnode_handle *fwnode; |
56 | typec_mux_set_fn_t set; |
57 | const char *name; |
58 | void *drvdata; |
59 | }; |
60 | |
61 | #if IS_ENABLED(CONFIG_TYPEC) |
62 | |
63 | struct typec_mux *fwnode_typec_mux_get(struct fwnode_handle *fwnode); |
64 | void typec_mux_put(struct typec_mux *mux); |
65 | int typec_mux_set(struct typec_mux *mux, struct typec_mux_state *state); |
66 | |
67 | struct typec_mux_dev * |
68 | typec_mux_register(struct device *parent, const struct typec_mux_desc *desc); |
69 | void typec_mux_unregister(struct typec_mux_dev *mux); |
70 | |
71 | void typec_mux_set_drvdata(struct typec_mux_dev *mux, void *data); |
72 | void *typec_mux_get_drvdata(struct typec_mux_dev *mux); |
73 | |
74 | #else |
75 | |
76 | static inline struct typec_mux *fwnode_typec_mux_get(struct fwnode_handle *fwnode) |
77 | { |
78 | return NULL; |
79 | } |
80 | |
81 | static inline void typec_mux_put(struct typec_mux *mux) {} |
82 | |
83 | static inline int typec_mux_set(struct typec_mux *mux, struct typec_mux_state *state) |
84 | { |
85 | return 0; |
86 | } |
87 | |
88 | static inline struct typec_mux_dev * |
89 | typec_mux_register(struct device *parent, const struct typec_mux_desc *desc) |
90 | { |
91 | return ERR_PTR(-EOPNOTSUPP); |
92 | } |
93 | static inline void typec_mux_unregister(struct typec_mux_dev *mux) {} |
94 | |
95 | static inline void typec_mux_set_drvdata(struct typec_mux_dev *mux, void *data) {} |
96 | static inline void *typec_mux_get_drvdata(struct typec_mux_dev *mux) |
97 | { |
98 | return ERR_PTR(-EOPNOTSUPP); |
99 | } |
100 | |
101 | #endif /* CONFIG_TYPEC */ |
102 | |
103 | static inline struct typec_mux *typec_mux_get(struct device *dev) |
104 | { |
105 | return fwnode_typec_mux_get(dev_fwnode(dev)); |
106 | } |
107 | |
108 | #endif /* __USB_TYPEC_MUX */ |
109 | |