| From 6cc9e7b146fc8e24e1ca6b7ae0b0e27ca6cc3fae Mon Sep 17 00:00:00 2001 |
| From: Alan Tull <atull@opensource.altera.com> |
| Date: Tue, 1 Nov 2016 14:14:23 -0500 |
| Subject: [PATCH 025/103] fpga: add method to get fpga manager from device |
| |
| The intent is to provide a non-DT method of getting |
| ahold of a FPGA manager to do some FPGA programming. |
| |
| This patch refactors of_fpga_mgr_get() to reuse most of it |
| while adding a new method fpga_mgr_get() for getting a |
| pointer to a fpga manager struct, given the device. |
| |
| Signed-off-by: Alan Tull <atull@opensource.altera.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| Documentation/fpga/fpga-mgr.txt | 6 ++- |
| drivers/fpga/fpga-mgr.c | 76 ++++++++++++++++++++++++++++------------ |
| include/linux/fpga/fpga-mgr.h | 2 + |
| 3 files changed, 60 insertions(+), 24 deletions(-) |
| |
| --- a/Documentation/fpga/fpga-mgr.txt |
| +++ b/Documentation/fpga/fpga-mgr.txt |
| @@ -38,11 +38,13 @@ To get/put a reference to a FPGA manager |
| ----------------------------------------- |
| |
| struct fpga_manager *of_fpga_mgr_get(struct device_node *node); |
| + struct fpga_manager *fpga_mgr_get(struct device *dev); |
| + |
| +Given a DT node or device, get an exclusive reference to a FPGA manager. |
| |
| void fpga_mgr_put(struct fpga_manager *mgr); |
| |
| -Given a DT node, get an exclusive reference to a FPGA manager or release |
| -the reference. |
| +Release the reference. |
| |
| |
| To register or unregister the low level FPGA-specific driver: |
| --- a/drivers/fpga/fpga-mgr.c |
| +++ b/drivers/fpga/fpga-mgr.c |
| @@ -39,7 +39,8 @@ static struct class *fpga_mgr_class; |
| * Step the low level fpga manager through the device-specific steps of getting |
| * an FPGA ready to be configured, writing the image to it, then doing whatever |
| * post-configuration steps necessary. This code assumes the caller got the |
| - * mgr pointer from of_fpga_mgr_get() and checked that it is not an error code. |
| + * mgr pointer from of_fpga_mgr_get() or fpga_mgr_get() and checked that it is |
| + * not an error code. |
| * |
| * Return: 0 on success, negative error code otherwise. |
| */ |
| @@ -99,7 +100,8 @@ EXPORT_SYMBOL_GPL(fpga_mgr_buf_load); |
| * Request an FPGA image using the firmware class, then write out to the FPGA. |
| * Update the state before each step to provide info on what step failed if |
| * there is a failure. This code assumes the caller got the mgr pointer |
| - * from of_fpga_mgr_get() and checked that it is not an error code. |
| + * from of_fpga_mgr_get() or fpga_mgr_get() and checked that it is not an error |
| + * code. |
| * |
| * Return: 0 on success, negative error code otherwise. |
| */ |
| @@ -181,30 +183,11 @@ static struct attribute *fpga_mgr_attrs[ |
| }; |
| ATTRIBUTE_GROUPS(fpga_mgr); |
| |
| -static int fpga_mgr_of_node_match(struct device *dev, const void *data) |
| -{ |
| - return dev->of_node == data; |
| -} |
| - |
| -/** |
| - * of_fpga_mgr_get - get an exclusive reference to a fpga mgr |
| - * @node: device node |
| - * |
| - * Given a device node, get an exclusive reference to a fpga mgr. |
| - * |
| - * Return: fpga manager struct or IS_ERR() condition containing error code. |
| - */ |
| -struct fpga_manager *of_fpga_mgr_get(struct device_node *node) |
| +struct fpga_manager *__fpga_mgr_get(struct device *dev) |
| { |
| struct fpga_manager *mgr; |
| - struct device *dev; |
| int ret = -ENODEV; |
| |
| - dev = class_find_device(fpga_mgr_class, NULL, node, |
| - fpga_mgr_of_node_match); |
| - if (!dev) |
| - return ERR_PTR(-ENODEV); |
| - |
| mgr = to_fpga_manager(dev); |
| if (!mgr) |
| goto err_dev; |
| @@ -226,6 +209,55 @@ err_dev: |
| put_device(dev); |
| return ERR_PTR(ret); |
| } |
| + |
| +static int fpga_mgr_dev_match(struct device *dev, const void *data) |
| +{ |
| + return dev->parent == data; |
| +} |
| + |
| +/** |
| + * fpga_mgr_get - get an exclusive reference to a fpga mgr |
| + * @dev: parent device that fpga mgr was registered with |
| + * |
| + * Given a device, get an exclusive reference to a fpga mgr. |
| + * |
| + * Return: fpga manager struct or IS_ERR() condition containing error code. |
| + */ |
| +struct fpga_manager *fpga_mgr_get(struct device *dev) |
| +{ |
| + struct device *mgr_dev = class_find_device(fpga_mgr_class, NULL, dev, |
| + fpga_mgr_dev_match); |
| + if (!mgr_dev) |
| + return ERR_PTR(-ENODEV); |
| + |
| + return __fpga_mgr_get(mgr_dev); |
| +} |
| +EXPORT_SYMBOL_GPL(fpga_mgr_get); |
| + |
| +static int fpga_mgr_of_node_match(struct device *dev, const void *data) |
| +{ |
| + return dev->of_node == data; |
| +} |
| + |
| +/** |
| + * of_fpga_mgr_get - get an exclusive reference to a fpga mgr |
| + * @node: device node |
| + * |
| + * Given a device node, get an exclusive reference to a fpga mgr. |
| + * |
| + * Return: fpga manager struct or IS_ERR() condition containing error code. |
| + */ |
| +struct fpga_manager *of_fpga_mgr_get(struct device_node *node) |
| +{ |
| + struct device *dev; |
| + |
| + dev = class_find_device(fpga_mgr_class, NULL, node, |
| + fpga_mgr_of_node_match); |
| + if (!dev) |
| + return ERR_PTR(-ENODEV); |
| + |
| + return __fpga_mgr_get(dev); |
| +} |
| EXPORT_SYMBOL_GPL(of_fpga_mgr_get); |
| |
| /** |
| --- a/include/linux/fpga/fpga-mgr.h |
| +++ b/include/linux/fpga/fpga-mgr.h |
| @@ -117,6 +117,8 @@ int fpga_mgr_firmware_load(struct fpga_m |
| |
| struct fpga_manager *of_fpga_mgr_get(struct device_node *node); |
| |
| +struct fpga_manager *fpga_mgr_get(struct device *dev); |
| + |
| void fpga_mgr_put(struct fpga_manager *mgr); |
| |
| int fpga_mgr_register(struct device *dev, const char *name, |