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
9struct device;
10struct typec_mux;
11struct typec_mux_dev;
12struct typec_switch;
13struct typec_switch_dev;
14struct typec_altmode;
15struct fwnode_handle;
16
17typedef int (*typec_switch_set_fn_t)(struct typec_switch_dev *sw,
18				     enum typec_orientation orientation);
19
20struct typec_switch_desc {
21	struct fwnode_handle *fwnode;
22	typec_switch_set_fn_t set;
23	const char *name;
24	void *drvdata;
25};
26
27struct typec_switch *fwnode_typec_switch_get(struct fwnode_handle *fwnode);
28void typec_switch_put(struct typec_switch *sw);
29int typec_switch_set(struct typec_switch *sw,
30		     enum typec_orientation orientation);
31
32static inline struct typec_switch *typec_switch_get(struct device *dev)
33{
34	return fwnode_typec_switch_get(dev_fwnode(dev));
35}
36
37struct typec_switch_dev *
38typec_switch_register(struct device *parent,
39		      const struct typec_switch_desc *desc);
40void typec_switch_unregister(struct typec_switch_dev *sw);
41
42void typec_switch_set_drvdata(struct typec_switch_dev *sw, void *data);
43void *typec_switch_get_drvdata(struct typec_switch_dev *sw);
44
45struct typec_mux_state {
46	struct typec_altmode *alt;
47	unsigned long mode;
48	void *data;
49};
50
51typedef int (*typec_mux_set_fn_t)(struct typec_mux_dev *mux,
52				  struct typec_mux_state *state);
53
54struct 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
63struct typec_mux *fwnode_typec_mux_get(struct fwnode_handle *fwnode);
64void typec_mux_put(struct typec_mux *mux);
65int typec_mux_set(struct typec_mux *mux, struct typec_mux_state *state);
66
67struct typec_mux_dev *
68typec_mux_register(struct device *parent, const struct typec_mux_desc *desc);
69void typec_mux_unregister(struct typec_mux_dev *mux);
70
71void typec_mux_set_drvdata(struct typec_mux_dev *mux, void *data);
72void *typec_mux_get_drvdata(struct typec_mux_dev *mux);
73
74#else
75
76static inline struct typec_mux *fwnode_typec_mux_get(struct fwnode_handle *fwnode)
77{
78	return NULL;
79}
80
81static inline void typec_mux_put(struct typec_mux *mux) {}
82
83static inline int typec_mux_set(struct typec_mux *mux, struct typec_mux_state *state)
84{
85	return 0;
86}
87
88static inline struct typec_mux_dev *
89typec_mux_register(struct device *parent, const struct typec_mux_desc *desc)
90{
91	return ERR_PTR(-EOPNOTSUPP);
92}
93static inline void typec_mux_unregister(struct typec_mux_dev *mux) {}
94
95static inline void typec_mux_set_drvdata(struct typec_mux_dev *mux, void *data) {}
96static inline void *typec_mux_get_drvdata(struct typec_mux_dev *mux)
97{
98	return ERR_PTR(-EOPNOTSUPP);
99}
100
101#endif /* CONFIG_TYPEC */
102
103static 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