aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/fpga
diff options
context:
space:
mode:
authorWu Hao <hao.wu@intel.com>2018-06-29 20:53:15 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-07-15 07:55:45 -0400
commit5d56e117001996766c3dab5767663b0c43b76639 (patch)
tree90ca25fdad1af397732654f312f633ed8655fd33 /drivers/fpga
parentb16c5147dc3b1a03405f58f6864b56f29ab7aaf9 (diff)
fpga: dfl: add dfl_fpga_cdev_find_port
For feature devices, we need a method to find the port dedicated to the device. This patch adds a function dfl_fpga_cdev_find_port for this purpose. e.g. FPGA Management Engine (FME) Partial Reconfiguration sub feature, it uses this function to find dedicated port on the device for PR function implementation. Signed-off-by: Tim Whisonant <tim.whisonant@intel.com> Signed-off-by: Enno Luebbers <enno.luebbers@intel.com> Signed-off-by: Shiva Rao <shiva.rao@intel.com> Signed-off-by: Christopher Rauer <christopher.rauer@intel.com> Signed-off-by: Xiao Guangrong <guangrong.xiao@linux.intel.com> Signed-off-by: Wu Hao <hao.wu@intel.com> Acked-by: Alan Tull <atull@kernel.org> Acked-by: Moritz Fischer <mdf@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/fpga')
-rw-r--r--drivers/fpga/dfl.c32
-rw-r--r--drivers/fpga/dfl.h21
2 files changed, 53 insertions, 0 deletions
diff --git a/drivers/fpga/dfl.c b/drivers/fpga/dfl.c
index b56933c64371..68e0b45617b2 100644
--- a/drivers/fpga/dfl.c
+++ b/drivers/fpga/dfl.c
@@ -813,6 +813,38 @@ void dfl_fpga_feature_devs_remove(struct dfl_fpga_cdev *cdev)
813} 813}
814EXPORT_SYMBOL_GPL(dfl_fpga_feature_devs_remove); 814EXPORT_SYMBOL_GPL(dfl_fpga_feature_devs_remove);
815 815
816/**
817 * __dfl_fpga_cdev_find_port - find a port under given container device
818 *
819 * @cdev: container device
820 * @data: data passed to match function
821 * @match: match function used to find specific port from the port device list
822 *
823 * Find a port device under container device. This function needs to be
824 * invoked with lock held.
825 *
826 * Return: pointer to port's platform device if successful, NULL otherwise.
827 *
828 * NOTE: you will need to drop the device reference with put_device() after use.
829 */
830struct platform_device *
831__dfl_fpga_cdev_find_port(struct dfl_fpga_cdev *cdev, void *data,
832 int (*match)(struct platform_device *, void *))
833{
834 struct dfl_feature_platform_data *pdata;
835 struct platform_device *port_dev;
836
837 list_for_each_entry(pdata, &cdev->port_dev_list, node) {
838 port_dev = pdata->dev;
839
840 if (match(port_dev, data) && get_device(&port_dev->dev))
841 return port_dev;
842 }
843
844 return NULL;
845}
846EXPORT_SYMBOL_GPL(__dfl_fpga_cdev_find_port);
847
816static int __init dfl_fpga_init(void) 848static int __init dfl_fpga_init(void)
817{ 849{
818 int ret; 850 int ret;
diff --git a/drivers/fpga/dfl.h b/drivers/fpga/dfl.h
index 66c2ade5a06b..b4f65250a29c 100644
--- a/drivers/fpga/dfl.h
+++ b/drivers/fpga/dfl.h
@@ -284,4 +284,25 @@ struct dfl_fpga_cdev *
284dfl_fpga_feature_devs_enumerate(struct dfl_fpga_enum_info *info); 284dfl_fpga_feature_devs_enumerate(struct dfl_fpga_enum_info *info);
285void dfl_fpga_feature_devs_remove(struct dfl_fpga_cdev *cdev); 285void dfl_fpga_feature_devs_remove(struct dfl_fpga_cdev *cdev);
286 286
287/*
288 * need to drop the device reference with put_device() after use port platform
289 * device returned by __dfl_fpga_cdev_find_port and dfl_fpga_cdev_find_port
290 * functions.
291 */
292struct platform_device *
293__dfl_fpga_cdev_find_port(struct dfl_fpga_cdev *cdev, void *data,
294 int (*match)(struct platform_device *, void *));
295
296static inline struct platform_device *
297dfl_fpga_cdev_find_port(struct dfl_fpga_cdev *cdev, void *data,
298 int (*match)(struct platform_device *, void *))
299{
300 struct platform_device *pdev;
301
302 mutex_lock(&cdev->lock);
303 pdev = __dfl_fpga_cdev_find_port(cdev, data, match);
304 mutex_unlock(&cdev->lock);
305
306 return pdev;
307}
287#endif /* __FPGA_DFL_H */ 308#endif /* __FPGA_DFL_H */