1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun #ifndef _LINUX_FPGA_BRIDGE_H 4*4882a593Smuzhiyun #define _LINUX_FPGA_BRIDGE_H 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #include <linux/device.h> 7*4882a593Smuzhiyun #include <linux/fpga/fpga-mgr.h> 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun struct fpga_bridge; 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun /** 12*4882a593Smuzhiyun * struct fpga_bridge_ops - ops for low level FPGA bridge drivers 13*4882a593Smuzhiyun * @enable_show: returns the FPGA bridge's status 14*4882a593Smuzhiyun * @enable_set: set a FPGA bridge as enabled or disabled 15*4882a593Smuzhiyun * @fpga_bridge_remove: set FPGA into a specific state during driver remove 16*4882a593Smuzhiyun * @groups: optional attribute groups. 17*4882a593Smuzhiyun */ 18*4882a593Smuzhiyun struct fpga_bridge_ops { 19*4882a593Smuzhiyun int (*enable_show)(struct fpga_bridge *bridge); 20*4882a593Smuzhiyun int (*enable_set)(struct fpga_bridge *bridge, bool enable); 21*4882a593Smuzhiyun void (*fpga_bridge_remove)(struct fpga_bridge *bridge); 22*4882a593Smuzhiyun const struct attribute_group **groups; 23*4882a593Smuzhiyun }; 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /** 26*4882a593Smuzhiyun * struct fpga_bridge - FPGA bridge structure 27*4882a593Smuzhiyun * @name: name of low level FPGA bridge 28*4882a593Smuzhiyun * @dev: FPGA bridge device 29*4882a593Smuzhiyun * @mutex: enforces exclusive reference to bridge 30*4882a593Smuzhiyun * @br_ops: pointer to struct of FPGA bridge ops 31*4882a593Smuzhiyun * @info: fpga image specific information 32*4882a593Smuzhiyun * @node: FPGA bridge list node 33*4882a593Smuzhiyun * @priv: low level driver private date 34*4882a593Smuzhiyun */ 35*4882a593Smuzhiyun struct fpga_bridge { 36*4882a593Smuzhiyun const char *name; 37*4882a593Smuzhiyun struct device dev; 38*4882a593Smuzhiyun struct mutex mutex; /* for exclusive reference to bridge */ 39*4882a593Smuzhiyun const struct fpga_bridge_ops *br_ops; 40*4882a593Smuzhiyun struct fpga_image_info *info; 41*4882a593Smuzhiyun struct list_head node; 42*4882a593Smuzhiyun void *priv; 43*4882a593Smuzhiyun }; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #define to_fpga_bridge(d) container_of(d, struct fpga_bridge, dev) 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun struct fpga_bridge *of_fpga_bridge_get(struct device_node *node, 48*4882a593Smuzhiyun struct fpga_image_info *info); 49*4882a593Smuzhiyun struct fpga_bridge *fpga_bridge_get(struct device *dev, 50*4882a593Smuzhiyun struct fpga_image_info *info); 51*4882a593Smuzhiyun void fpga_bridge_put(struct fpga_bridge *bridge); 52*4882a593Smuzhiyun int fpga_bridge_enable(struct fpga_bridge *bridge); 53*4882a593Smuzhiyun int fpga_bridge_disable(struct fpga_bridge *bridge); 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun int fpga_bridges_enable(struct list_head *bridge_list); 56*4882a593Smuzhiyun int fpga_bridges_disable(struct list_head *bridge_list); 57*4882a593Smuzhiyun void fpga_bridges_put(struct list_head *bridge_list); 58*4882a593Smuzhiyun int fpga_bridge_get_to_list(struct device *dev, 59*4882a593Smuzhiyun struct fpga_image_info *info, 60*4882a593Smuzhiyun struct list_head *bridge_list); 61*4882a593Smuzhiyun int of_fpga_bridge_get_to_list(struct device_node *np, 62*4882a593Smuzhiyun struct fpga_image_info *info, 63*4882a593Smuzhiyun struct list_head *bridge_list); 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun struct fpga_bridge *fpga_bridge_create(struct device *dev, const char *name, 66*4882a593Smuzhiyun const struct fpga_bridge_ops *br_ops, 67*4882a593Smuzhiyun void *priv); 68*4882a593Smuzhiyun void fpga_bridge_free(struct fpga_bridge *br); 69*4882a593Smuzhiyun int fpga_bridge_register(struct fpga_bridge *br); 70*4882a593Smuzhiyun void fpga_bridge_unregister(struct fpga_bridge *br); 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun struct fpga_bridge 73*4882a593Smuzhiyun *devm_fpga_bridge_create(struct device *dev, const char *name, 74*4882a593Smuzhiyun const struct fpga_bridge_ops *br_ops, void *priv); 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun #endif /* _LINUX_FPGA_BRIDGE_H */ 77