GNU Linux-libre 6.9.2-gnu
[releases.git] / include / linux / usb / typec_mux.h
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 */