forked from Minki/linux
fpga: add attribute groups
Make it easy to add attributes to low level FPGA drivers the right way. Add attribute groups pointers to structures that are used when registering a manager, bridge, or group. When the low level driver registers, set the device attribute group. The attributes are created in device_add. Signed-off-by: Alan Tull <atull@kernel.org> Acked-by: Moritz Fischer <mdf@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
84e93f1d4f
commit
845089bbf5
@ -367,6 +367,7 @@ int fpga_bridge_register(struct device *dev, const char *name,
|
|||||||
bridge->priv = priv;
|
bridge->priv = priv;
|
||||||
|
|
||||||
device_initialize(&bridge->dev);
|
device_initialize(&bridge->dev);
|
||||||
|
bridge->dev.groups = br_ops->groups;
|
||||||
bridge->dev.class = fpga_bridge_class;
|
bridge->dev.class = fpga_bridge_class;
|
||||||
bridge->dev.parent = dev;
|
bridge->dev.parent = dev;
|
||||||
bridge->dev.of_node = dev->of_node;
|
bridge->dev.of_node = dev->of_node;
|
||||||
|
@ -569,6 +569,7 @@ int fpga_mgr_register(struct device *dev, const char *name,
|
|||||||
|
|
||||||
device_initialize(&mgr->dev);
|
device_initialize(&mgr->dev);
|
||||||
mgr->dev.class = fpga_mgr_class;
|
mgr->dev.class = fpga_mgr_class;
|
||||||
|
mgr->dev.groups = mops->groups;
|
||||||
mgr->dev.parent = dev;
|
mgr->dev.parent = dev;
|
||||||
mgr->dev.of_node = dev->of_node;
|
mgr->dev.of_node = dev->of_node;
|
||||||
mgr->dev.id = id;
|
mgr->dev.id = id;
|
||||||
|
@ -173,6 +173,7 @@ int fpga_region_register(struct device *dev, struct fpga_region *region)
|
|||||||
mutex_init(®ion->mutex);
|
mutex_init(®ion->mutex);
|
||||||
INIT_LIST_HEAD(®ion->bridge_list);
|
INIT_LIST_HEAD(®ion->bridge_list);
|
||||||
device_initialize(®ion->dev);
|
device_initialize(®ion->dev);
|
||||||
|
region->dev.groups = region->groups;
|
||||||
region->dev.class = fpga_region_class;
|
region->dev.class = fpga_region_class;
|
||||||
region->dev.parent = dev;
|
region->dev.parent = dev;
|
||||||
region->dev.of_node = dev->of_node;
|
region->dev.of_node = dev->of_node;
|
||||||
|
@ -13,11 +13,13 @@ struct fpga_bridge;
|
|||||||
* @enable_show: returns the FPGA bridge's status
|
* @enable_show: returns the FPGA bridge's status
|
||||||
* @enable_set: set a FPGA bridge as enabled or disabled
|
* @enable_set: set a FPGA bridge as enabled or disabled
|
||||||
* @fpga_bridge_remove: set FPGA into a specific state during driver remove
|
* @fpga_bridge_remove: set FPGA into a specific state during driver remove
|
||||||
|
* @groups: optional attribute groups.
|
||||||
*/
|
*/
|
||||||
struct fpga_bridge_ops {
|
struct fpga_bridge_ops {
|
||||||
int (*enable_show)(struct fpga_bridge *bridge);
|
int (*enable_show)(struct fpga_bridge *bridge);
|
||||||
int (*enable_set)(struct fpga_bridge *bridge, bool enable);
|
int (*enable_set)(struct fpga_bridge *bridge, bool enable);
|
||||||
void (*fpga_bridge_remove)(struct fpga_bridge *bridge);
|
void (*fpga_bridge_remove)(struct fpga_bridge *bridge);
|
||||||
|
const struct attribute_group **groups;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -115,6 +115,7 @@ struct fpga_image_info {
|
|||||||
* @write_sg: write the scatter list of configuration data to the FPGA
|
* @write_sg: write the scatter list of configuration data to the FPGA
|
||||||
* @write_complete: set FPGA to operating state after writing is done
|
* @write_complete: set FPGA to operating state after writing is done
|
||||||
* @fpga_remove: optional: Set FPGA into a specific state during driver remove
|
* @fpga_remove: optional: Set FPGA into a specific state during driver remove
|
||||||
|
* @groups: optional attribute groups.
|
||||||
*
|
*
|
||||||
* fpga_manager_ops are the low level functions implemented by a specific
|
* fpga_manager_ops are the low level functions implemented by a specific
|
||||||
* fpga manager driver. The optional ones are tested for NULL before being
|
* fpga manager driver. The optional ones are tested for NULL before being
|
||||||
@ -131,6 +132,7 @@ struct fpga_manager_ops {
|
|||||||
int (*write_complete)(struct fpga_manager *mgr,
|
int (*write_complete)(struct fpga_manager *mgr,
|
||||||
struct fpga_image_info *info);
|
struct fpga_image_info *info);
|
||||||
void (*fpga_remove)(struct fpga_manager *mgr);
|
void (*fpga_remove)(struct fpga_manager *mgr);
|
||||||
|
const struct attribute_group **groups;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
* @info: FPGA image info
|
* @info: FPGA image info
|
||||||
* @priv: private data
|
* @priv: private data
|
||||||
* @get_bridges: optional function to get bridges to a list
|
* @get_bridges: optional function to get bridges to a list
|
||||||
|
* @groups: optional attribute groups.
|
||||||
*/
|
*/
|
||||||
struct fpga_region {
|
struct fpga_region {
|
||||||
struct device dev;
|
struct device dev;
|
||||||
@ -23,6 +24,7 @@ struct fpga_region {
|
|||||||
struct fpga_image_info *info;
|
struct fpga_image_info *info;
|
||||||
void *priv;
|
void *priv;
|
||||||
int (*get_bridges)(struct fpga_region *region);
|
int (*get_bridges)(struct fpga_region *region);
|
||||||
|
const struct attribute_group **groups;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define to_fpga_region(d) container_of(d, struct fpga_region, dev)
|
#define to_fpga_region(d) container_of(d, struct fpga_region, dev)
|
||||||
|
Loading…
Reference in New Issue
Block a user