| From 237bcfff8cc5a7d5cf66a5a3e77c9a1b6e6dea68 Mon Sep 17 00:00:00 2001 |
| From: Alan Tull <atull@kernel.org> |
| Date: Wed, 15 Nov 2017 14:20:28 -0600 |
| Subject: [PATCH 1677/1795] 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> |
| (cherry picked from commit 845089bbf589be75143d0c9fb326d5595c1b5787) |
| Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> |
| --- |
| drivers/fpga/fpga-bridge.c | 1 + |
| drivers/fpga/fpga-mgr.c | 1 + |
| drivers/fpga/fpga-region.c | 1 + |
| include/linux/fpga/fpga-bridge.h | 2 ++ |
| include/linux/fpga/fpga-mgr.h | 2 ++ |
| include/linux/fpga/fpga-region.h | 2 ++ |
| 6 files changed, 9 insertions(+) |
| |
| diff --git a/drivers/fpga/fpga-bridge.c b/drivers/fpga/fpga-bridge.c |
| index 0dfe9d78cee2..e693c3607a14 100644 |
| --- a/drivers/fpga/fpga-bridge.c |
| +++ b/drivers/fpga/fpga-bridge.c |
| @@ -367,6 +367,7 @@ int fpga_bridge_register(struct device *dev, const char *name, |
| bridge->priv = priv; |
| |
| device_initialize(&bridge->dev); |
| + bridge->dev.groups = br_ops->groups; |
| bridge->dev.class = fpga_bridge_class; |
| bridge->dev.parent = dev; |
| bridge->dev.of_node = dev->of_node; |
| diff --git a/drivers/fpga/fpga-mgr.c b/drivers/fpga/fpga-mgr.c |
| index d27e8d2a149c..223f2401939b 100644 |
| --- a/drivers/fpga/fpga-mgr.c |
| +++ b/drivers/fpga/fpga-mgr.c |
| @@ -569,6 +569,7 @@ int fpga_mgr_register(struct device *dev, const char *name, |
| |
| device_initialize(&mgr->dev); |
| mgr->dev.class = fpga_mgr_class; |
| + mgr->dev.groups = mops->groups; |
| mgr->dev.parent = dev; |
| mgr->dev.of_node = dev->of_node; |
| mgr->dev.id = id; |
| diff --git a/drivers/fpga/fpga-region.c b/drivers/fpga/fpga-region.c |
| index afc61885a601..edab2a2e03ef 100644 |
| --- a/drivers/fpga/fpga-region.c |
| +++ b/drivers/fpga/fpga-region.c |
| @@ -173,6 +173,7 @@ int fpga_region_register(struct device *dev, struct fpga_region *region) |
| mutex_init(®ion->mutex); |
| INIT_LIST_HEAD(®ion->bridge_list); |
| device_initialize(®ion->dev); |
| + region->dev.groups = region->groups; |
| region->dev.class = fpga_region_class; |
| region->dev.parent = dev; |
| region->dev.of_node = dev->of_node; |
| diff --git a/include/linux/fpga/fpga-bridge.h b/include/linux/fpga/fpga-bridge.h |
| index 6ca41f8f949f..3694821a6d2d 100644 |
| --- a/include/linux/fpga/fpga-bridge.h |
| +++ b/include/linux/fpga/fpga-bridge.h |
| @@ -13,11 +13,13 @@ struct fpga_bridge; |
| * @enable_show: returns the FPGA bridge's status |
| * @enable_set: set a FPGA bridge as enabled or disabled |
| * @fpga_bridge_remove: set FPGA into a specific state during driver remove |
| + * @groups: optional attribute groups. |
| */ |
| struct fpga_bridge_ops { |
| int (*enable_show)(struct fpga_bridge *bridge); |
| int (*enable_set)(struct fpga_bridge *bridge, bool enable); |
| void (*fpga_bridge_remove)(struct fpga_bridge *bridge); |
| + const struct attribute_group **groups; |
| }; |
| |
| /** |
| diff --git a/include/linux/fpga/fpga-mgr.h b/include/linux/fpga/fpga-mgr.h |
| index 4fb706bd9aba..3c6de23aabdf 100644 |
| --- a/include/linux/fpga/fpga-mgr.h |
| +++ b/include/linux/fpga/fpga-mgr.h |
| @@ -115,6 +115,7 @@ struct fpga_image_info { |
| * @write_sg: write the scatter list of configuration data to the FPGA |
| * @write_complete: set FPGA to operating state after writing is done |
| * @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 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, |
| struct fpga_image_info *info); |
| void (*fpga_remove)(struct fpga_manager *mgr); |
| + const struct attribute_group **groups; |
| }; |
| |
| /** |
| diff --git a/include/linux/fpga/fpga-region.h b/include/linux/fpga/fpga-region.h |
| index 704844944631..b6520318ab9c 100644 |
| --- a/include/linux/fpga/fpga-region.h |
| +++ b/include/linux/fpga/fpga-region.h |
| @@ -14,6 +14,7 @@ |
| * @info: FPGA image info |
| * @priv: private data |
| * @get_bridges: optional function to get bridges to a list |
| + * @groups: optional attribute groups. |
| */ |
| struct fpga_region { |
| struct device dev; |
| @@ -23,6 +24,7 @@ struct fpga_region { |
| struct fpga_image_info *info; |
| void *priv; |
| int (*get_bridges)(struct fpga_region *region); |
| + const struct attribute_group **groups; |
| }; |
| |
| #define to_fpga_region(d) container_of(d, struct fpga_region, dev) |
| -- |
| 2.19.0 |
| |