aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/fpga/fpga-bridge.c
diff options
context:
space:
mode:
authorAlan Tull <atull@kernel.org>2017-11-15 15:20:11 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-11-28 10:30:36 -0500
commit9c1c4b2753fea36a072e78a5efc82fca0d13b455 (patch)
treedfac82fbde45ad1a5fd62aef49b82bf995509d14 /drivers/fpga/fpga-bridge.c
parent4fbd8d194f06c8a3fd2af1ce560ddb31f7ec8323 (diff)
fpga: bridge: support getting bridge from device
Add two functions for getting the FPGA bridge from the device rather than device tree node. This is to enable writing code that will support using FPGA bridges without device tree. Rename one old function to make it clear that it is device tree-ish. This leaves us with 3 functions for getting a bridge: * fpga_bridge_get Get the bridge given the device. * fpga_bridges_get_to_list Given the device, get the bridge and add it to a list. * of_fpga_bridges_get_to_list Renamed from priviously existing fpga_bridges_get_to_list. Given the device node, get the bridge and add it to a list. Signed-off-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/fpga-bridge.c')
-rw-r--r--drivers/fpga/fpga-bridge.c110
1 files changed, 87 insertions, 23 deletions
diff --git a/drivers/fpga/fpga-bridge.c b/drivers/fpga/fpga-bridge.c
index 9651aa56244a..0dfe9d78cee2 100644
--- a/drivers/fpga/fpga-bridge.c
+++ b/drivers/fpga/fpga-bridge.c
@@ -2,6 +2,7 @@
2 * FPGA Bridge Framework Driver 2 * FPGA Bridge Framework Driver
3 * 3 *
4 * Copyright (C) 2013-2016 Altera Corporation, All Rights Reserved. 4 * Copyright (C) 2013-2016 Altera Corporation, All Rights Reserved.
5 * Copyright (C) 2017 Intel Corporation
5 * 6 *
6 * This program is free software; you can redistribute it and/or modify it 7 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License, 8 * under the terms and conditions of the GNU General Public License,
@@ -70,29 +71,12 @@ int fpga_bridge_disable(struct fpga_bridge *bridge)
70} 71}
71EXPORT_SYMBOL_GPL(fpga_bridge_disable); 72EXPORT_SYMBOL_GPL(fpga_bridge_disable);
72 73
73/** 74static struct fpga_bridge *__fpga_bridge_get(struct device *dev,
74 * of_fpga_bridge_get - get an exclusive reference to a fpga bridge 75 struct fpga_image_info *info)
75 *
76 * @np: node pointer of a FPGA bridge
77 * @info: fpga image specific information
78 *
79 * Return fpga_bridge struct if successful.
80 * Return -EBUSY if someone already has a reference to the bridge.
81 * Return -ENODEV if @np is not a FPGA Bridge.
82 */
83struct fpga_bridge *of_fpga_bridge_get(struct device_node *np,
84 struct fpga_image_info *info)
85
86{ 76{
87 struct device *dev;
88 struct fpga_bridge *bridge; 77 struct fpga_bridge *bridge;
89 int ret = -ENODEV; 78 int ret = -ENODEV;
90 79
91 dev = class_find_device(fpga_bridge_class, NULL, np,
92 fpga_bridge_of_node_match);
93 if (!dev)
94 goto err_dev;
95
96 bridge = to_fpga_bridge(dev); 80 bridge = to_fpga_bridge(dev);
97 if (!bridge) 81 if (!bridge)
98 goto err_dev; 82 goto err_dev;
@@ -117,8 +101,58 @@ err_dev:
117 put_device(dev); 101 put_device(dev);
118 return ERR_PTR(ret); 102 return ERR_PTR(ret);
119} 103}
104
105/**
106 * of_fpga_bridge_get - get an exclusive reference to a fpga bridge
107 *
108 * @np: node pointer of a FPGA bridge
109 * @info: fpga image specific information
110 *
111 * Return fpga_bridge struct if successful.
112 * Return -EBUSY if someone already has a reference to the bridge.
113 * Return -ENODEV if @np is not a FPGA Bridge.
114 */
115struct fpga_bridge *of_fpga_bridge_get(struct device_node *np,
116 struct fpga_image_info *info)
117{
118 struct device *dev;
119
120 dev = class_find_device(fpga_bridge_class, NULL, np,
121 fpga_bridge_of_node_match);
122 if (!dev)
123 return ERR_PTR(-ENODEV);
124
125 return __fpga_bridge_get(dev, info);
126}
120EXPORT_SYMBOL_GPL(of_fpga_bridge_get); 127EXPORT_SYMBOL_GPL(of_fpga_bridge_get);
121 128
129static int fpga_bridge_dev_match(struct device *dev, const void *data)
130{
131 return dev->parent == data;
132}
133
134/**
135 * fpga_bridge_get - get an exclusive reference to a fpga bridge
136 * @dev: parent device that fpga bridge was registered with
137 *
138 * Given a device, get an exclusive reference to a fpga bridge.
139 *
140 * Return: fpga manager struct or IS_ERR() condition containing error code.
141 */
142struct fpga_bridge *fpga_bridge_get(struct device *dev,
143 struct fpga_image_info *info)
144{
145 struct device *bridge_dev;
146
147 bridge_dev = class_find_device(fpga_bridge_class, NULL, dev,
148 fpga_bridge_dev_match);
149 if (!bridge_dev)
150 return ERR_PTR(-ENODEV);
151
152 return __fpga_bridge_get(bridge_dev, info);
153}
154EXPORT_SYMBOL_GPL(fpga_bridge_get);
155
122/** 156/**
123 * fpga_bridge_put - release a reference to a bridge 157 * fpga_bridge_put - release a reference to a bridge
124 * 158 *
@@ -206,7 +240,7 @@ void fpga_bridges_put(struct list_head *bridge_list)
206EXPORT_SYMBOL_GPL(fpga_bridges_put); 240EXPORT_SYMBOL_GPL(fpga_bridges_put);
207 241
208/** 242/**
209 * fpga_bridges_get_to_list - get a bridge, add it to a list 243 * of_fpga_bridge_get_to_list - get a bridge, add it to a list
210 * 244 *
211 * @np: node pointer of a FPGA bridge 245 * @np: node pointer of a FPGA bridge
212 * @info: fpga image specific information 246 * @info: fpga image specific information
@@ -216,14 +250,44 @@ EXPORT_SYMBOL_GPL(fpga_bridges_put);
216 * 250 *
217 * Return 0 for success, error code from of_fpga_bridge_get() othewise. 251 * Return 0 for success, error code from of_fpga_bridge_get() othewise.
218 */ 252 */
219int fpga_bridge_get_to_list(struct device_node *np, 253int of_fpga_bridge_get_to_list(struct device_node *np,
254 struct fpga_image_info *info,
255 struct list_head *bridge_list)
256{
257 struct fpga_bridge *bridge;
258 unsigned long flags;
259
260 bridge = of_fpga_bridge_get(np, info);
261 if (IS_ERR(bridge))
262 return PTR_ERR(bridge);
263
264 spin_lock_irqsave(&bridge_list_lock, flags);
265 list_add(&bridge->node, bridge_list);
266 spin_unlock_irqrestore(&bridge_list_lock, flags);
267
268 return 0;
269}
270EXPORT_SYMBOL_GPL(of_fpga_bridge_get_to_list);
271
272/**
273 * fpga_bridge_get_to_list - given device, get a bridge, add it to a list
274 *
275 * @dev: FPGA bridge device
276 * @info: fpga image specific information
277 * @bridge_list: list of FPGA bridges
278 *
279 * Get an exclusive reference to the bridge and and it to the list.
280 *
281 * Return 0 for success, error code from fpga_bridge_get() othewise.
282 */
283int fpga_bridge_get_to_list(struct device *dev,
220 struct fpga_image_info *info, 284 struct fpga_image_info *info,
221 struct list_head *bridge_list) 285 struct list_head *bridge_list)
222{ 286{
223 struct fpga_bridge *bridge; 287 struct fpga_bridge *bridge;
224 unsigned long flags; 288 unsigned long flags;
225 289
226 bridge = of_fpga_bridge_get(np, info); 290 bridge = fpga_bridge_get(dev, info);
227 if (IS_ERR(bridge)) 291 if (IS_ERR(bridge))
228 return PTR_ERR(bridge); 292 return PTR_ERR(bridge);
229 293
@@ -381,7 +445,7 @@ static void __exit fpga_bridge_dev_exit(void)
381} 445}
382 446
383MODULE_DESCRIPTION("FPGA Bridge Driver"); 447MODULE_DESCRIPTION("FPGA Bridge Driver");
384MODULE_AUTHOR("Alan Tull <atull@opensource.altera.com>"); 448MODULE_AUTHOR("Alan Tull <atull@kernel.org>");
385MODULE_LICENSE("GPL v2"); 449MODULE_LICENSE("GPL v2");
386 450
387subsys_initcall(fpga_bridge_dev_init); 451subsys_initcall(fpga_bridge_dev_init);