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