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