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