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  
typec_switch_get(struct device * dev)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  
fwnode_typec_mux_get(struct fwnode_handle * fwnode)76  static inline struct typec_mux *fwnode_typec_mux_get(struct fwnode_handle *fwnode)
77  {
78  	return NULL;
79  }
80  
typec_mux_put(struct typec_mux * mux)81  static inline void typec_mux_put(struct typec_mux *mux) {}
82  
typec_mux_set(struct typec_mux * mux,struct typec_mux_state * state)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 *
typec_mux_register(struct device * parent,const struct typec_mux_desc * desc)89  typec_mux_register(struct device *parent, const struct typec_mux_desc *desc)
90  {
91  	return ERR_PTR(-EOPNOTSUPP);
92  }
typec_mux_unregister(struct typec_mux_dev * mux)93  static inline void typec_mux_unregister(struct typec_mux_dev *mux) {}
94  
typec_mux_set_drvdata(struct typec_mux_dev * mux,void * data)95  static inline void typec_mux_set_drvdata(struct typec_mux_dev *mux, void *data) {}
typec_mux_get_drvdata(struct typec_mux_dev * mux)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  
typec_mux_get(struct device * dev)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