aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/fpga
diff options
context:
space:
mode:
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2018-11-13 04:58:49 -0500
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2018-11-13 04:59:10 -0500
commit0ea0397a3a12f9720d6acb78a48da796a54e81aa (patch)
treee2078363019cb2fde493844d7f25293412c4b6df /drivers/fpga
parent913240696ec64a2af2de250b1591cc45b5cea2f6 (diff)
parent651022382c7f8da46cb4872a545ee1da6d097d2a (diff)
Merge remote-tracking branch 'drm/drm-next' into drm-misc-next
drm-next is forwarded to v4.20-rc1, and we need this to make a patch series apply. Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Diffstat (limited to 'drivers/fpga')
-rw-r--r--drivers/fpga/altera-cvp.c8
-rw-r--r--drivers/fpga/altera-fpga2sdram.c8
-rw-r--r--drivers/fpga/altera-freeze-bridge.c13
-rw-r--r--drivers/fpga/altera-hps2fpga.c7
-rw-r--r--drivers/fpga/altera-pr-ip-core.c9
-rw-r--r--drivers/fpga/altera-ps-spi.c11
-rw-r--r--drivers/fpga/dfl-afu-dma-region.c2
-rw-r--r--drivers/fpga/dfl-fme-br.c11
-rw-r--r--drivers/fpga/dfl-fme-mgr.c13
-rw-r--r--drivers/fpga/dfl-fme-region.c10
-rw-r--r--drivers/fpga/dfl.c6
-rw-r--r--drivers/fpga/fpga-bridge.c70
-rw-r--r--drivers/fpga/fpga-mgr.c64
-rw-r--r--drivers/fpga/fpga-region.c65
-rw-r--r--drivers/fpga/ice40-spi.c10
-rw-r--r--drivers/fpga/machxo2-spi.c11
-rw-r--r--drivers/fpga/of-fpga-region.c9
-rw-r--r--drivers/fpga/socfpga-a10.c5
-rw-r--r--drivers/fpga/socfpga.c10
-rw-r--r--drivers/fpga/ts73xx-fpga.c11
-rw-r--r--drivers/fpga/xilinx-pr-decoupler.c4
-rw-r--r--drivers/fpga/xilinx-spi.c12
-rw-r--r--drivers/fpga/zynq-fpga.c5
23 files changed, 231 insertions, 143 deletions
diff --git a/drivers/fpga/altera-cvp.c b/drivers/fpga/altera-cvp.c
index 7fa793672a7a..610a1558e0ed 100644
--- a/drivers/fpga/altera-cvp.c
+++ b/drivers/fpga/altera-cvp.c
@@ -453,8 +453,8 @@ static int altera_cvp_probe(struct pci_dev *pdev,
453 snprintf(conf->mgr_name, sizeof(conf->mgr_name), "%s @%s", 453 snprintf(conf->mgr_name, sizeof(conf->mgr_name), "%s @%s",
454 ALTERA_CVP_MGR_NAME, pci_name(pdev)); 454 ALTERA_CVP_MGR_NAME, pci_name(pdev));
455 455
456 mgr = fpga_mgr_create(&pdev->dev, conf->mgr_name, 456 mgr = devm_fpga_mgr_create(&pdev->dev, conf->mgr_name,
457 &altera_cvp_ops, conf); 457 &altera_cvp_ops, conf);
458 if (!mgr) { 458 if (!mgr) {
459 ret = -ENOMEM; 459 ret = -ENOMEM;
460 goto err_unmap; 460 goto err_unmap;
@@ -463,10 +463,8 @@ static int altera_cvp_probe(struct pci_dev *pdev,
463 pci_set_drvdata(pdev, mgr); 463 pci_set_drvdata(pdev, mgr);
464 464
465 ret = fpga_mgr_register(mgr); 465 ret = fpga_mgr_register(mgr);
466 if (ret) { 466 if (ret)
467 fpga_mgr_free(mgr);
468 goto err_unmap; 467 goto err_unmap;
469 }
470 468
471 ret = driver_create_file(&altera_cvp_driver.driver, 469 ret = driver_create_file(&altera_cvp_driver.driver,
472 &driver_attr_chkcfg); 470 &driver_attr_chkcfg);
diff --git a/drivers/fpga/altera-fpga2sdram.c b/drivers/fpga/altera-fpga2sdram.c
index 23660ccd634b..a78e49c63c64 100644
--- a/drivers/fpga/altera-fpga2sdram.c
+++ b/drivers/fpga/altera-fpga2sdram.c
@@ -121,18 +121,16 @@ static int alt_fpga_bridge_probe(struct platform_device *pdev)
121 /* Get f2s bridge configuration saved in handoff register */ 121 /* Get f2s bridge configuration saved in handoff register */
122 regmap_read(sysmgr, SYSMGR_ISWGRP_HANDOFF3, &priv->mask); 122 regmap_read(sysmgr, SYSMGR_ISWGRP_HANDOFF3, &priv->mask);
123 123
124 br = fpga_bridge_create(dev, F2S_BRIDGE_NAME, 124 br = devm_fpga_bridge_create(dev, F2S_BRIDGE_NAME,
125 &altera_fpga2sdram_br_ops, priv); 125 &altera_fpga2sdram_br_ops, priv);
126 if (!br) 126 if (!br)
127 return -ENOMEM; 127 return -ENOMEM;
128 128
129 platform_set_drvdata(pdev, br); 129 platform_set_drvdata(pdev, br);
130 130
131 ret = fpga_bridge_register(br); 131 ret = fpga_bridge_register(br);
132 if (ret) { 132 if (ret)
133 fpga_bridge_free(br);
134 return ret; 133 return ret;
135 }
136 134
137 dev_info(dev, "driver initialized with handoff %08x\n", priv->mask); 135 dev_info(dev, "driver initialized with handoff %08x\n", priv->mask);
138 136
diff --git a/drivers/fpga/altera-freeze-bridge.c b/drivers/fpga/altera-freeze-bridge.c
index ffd586c48ecf..dd58c4aea92e 100644
--- a/drivers/fpga/altera-freeze-bridge.c
+++ b/drivers/fpga/altera-freeze-bridge.c
@@ -213,7 +213,6 @@ static int altera_freeze_br_probe(struct platform_device *pdev)
213 struct fpga_bridge *br; 213 struct fpga_bridge *br;
214 struct resource *res; 214 struct resource *res;
215 u32 status, revision; 215 u32 status, revision;
216 int ret;
217 216
218 if (!np) 217 if (!np)
219 return -ENODEV; 218 return -ENODEV;
@@ -245,20 +244,14 @@ static int altera_freeze_br_probe(struct platform_device *pdev)
245 244
246 priv->base_addr = base_addr; 245 priv->base_addr = base_addr;
247 246
248 br = fpga_bridge_create(dev, FREEZE_BRIDGE_NAME, 247 br = devm_fpga_bridge_create(dev, FREEZE_BRIDGE_NAME,
249 &altera_freeze_br_br_ops, priv); 248 &altera_freeze_br_br_ops, priv);
250 if (!br) 249 if (!br)
251 return -ENOMEM; 250 return -ENOMEM;
252 251
253 platform_set_drvdata(pdev, br); 252 platform_set_drvdata(pdev, br);
254 253
255 ret = fpga_bridge_register(br); 254 return fpga_bridge_register(br);
256 if (ret) {
257 fpga_bridge_free(br);
258 return ret;
259 }
260
261 return 0;
262} 255}
263 256
264static int altera_freeze_br_remove(struct platform_device *pdev) 257static int altera_freeze_br_remove(struct platform_device *pdev)
diff --git a/drivers/fpga/altera-hps2fpga.c b/drivers/fpga/altera-hps2fpga.c
index a974d3f60321..77b95f251821 100644
--- a/drivers/fpga/altera-hps2fpga.c
+++ b/drivers/fpga/altera-hps2fpga.c
@@ -180,7 +180,8 @@ static int alt_fpga_bridge_probe(struct platform_device *pdev)
180 } 180 }
181 } 181 }
182 182
183 br = fpga_bridge_create(dev, priv->name, &altera_hps2fpga_br_ops, priv); 183 br = devm_fpga_bridge_create(dev, priv->name,
184 &altera_hps2fpga_br_ops, priv);
184 if (!br) { 185 if (!br) {
185 ret = -ENOMEM; 186 ret = -ENOMEM;
186 goto err; 187 goto err;
@@ -190,12 +191,10 @@ static int alt_fpga_bridge_probe(struct platform_device *pdev)
190 191
191 ret = fpga_bridge_register(br); 192 ret = fpga_bridge_register(br);
192 if (ret) 193 if (ret)
193 goto err_free; 194 goto err;
194 195
195 return 0; 196 return 0;
196 197
197err_free:
198 fpga_bridge_free(br);
199err: 198err:
200 clk_disable_unprepare(priv->clk); 199 clk_disable_unprepare(priv->clk);
201 200
diff --git a/drivers/fpga/altera-pr-ip-core.c b/drivers/fpga/altera-pr-ip-core.c
index 65e0b6a2c031..a7a3bf0b5202 100644
--- a/drivers/fpga/altera-pr-ip-core.c
+++ b/drivers/fpga/altera-pr-ip-core.c
@@ -177,7 +177,6 @@ int alt_pr_register(struct device *dev, void __iomem *reg_base)
177{ 177{
178 struct alt_pr_priv *priv; 178 struct alt_pr_priv *priv;
179 struct fpga_manager *mgr; 179 struct fpga_manager *mgr;
180 int ret;
181 u32 val; 180 u32 val;
182 181
183 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 182 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
@@ -192,17 +191,13 @@ int alt_pr_register(struct device *dev, void __iomem *reg_base)
192 (val & ALT_PR_CSR_STATUS_MSK) >> ALT_PR_CSR_STATUS_SFT, 191 (val & ALT_PR_CSR_STATUS_MSK) >> ALT_PR_CSR_STATUS_SFT,
193 (int)(val & ALT_PR_CSR_PR_START)); 192 (int)(val & ALT_PR_CSR_PR_START));
194 193
195 mgr = fpga_mgr_create(dev, dev_name(dev), &alt_pr_ops, priv); 194 mgr = devm_fpga_mgr_create(dev, dev_name(dev), &alt_pr_ops, priv);
196 if (!mgr) 195 if (!mgr)
197 return -ENOMEM; 196 return -ENOMEM;
198 197
199 dev_set_drvdata(dev, mgr); 198 dev_set_drvdata(dev, mgr);
200 199
201 ret = fpga_mgr_register(mgr); 200 return fpga_mgr_register(mgr);
202 if (ret)
203 fpga_mgr_free(mgr);
204
205 return ret;
206} 201}
207EXPORT_SYMBOL_GPL(alt_pr_register); 202EXPORT_SYMBOL_GPL(alt_pr_register);
208 203
diff --git a/drivers/fpga/altera-ps-spi.c b/drivers/fpga/altera-ps-spi.c
index 24b25c626036..33aafda50af5 100644
--- a/drivers/fpga/altera-ps-spi.c
+++ b/drivers/fpga/altera-ps-spi.c
@@ -239,7 +239,6 @@ static int altera_ps_probe(struct spi_device *spi)
239 struct altera_ps_conf *conf; 239 struct altera_ps_conf *conf;
240 const struct of_device_id *of_id; 240 const struct of_device_id *of_id;
241 struct fpga_manager *mgr; 241 struct fpga_manager *mgr;
242 int ret;
243 242
244 conf = devm_kzalloc(&spi->dev, sizeof(*conf), GFP_KERNEL); 243 conf = devm_kzalloc(&spi->dev, sizeof(*conf), GFP_KERNEL);
245 if (!conf) 244 if (!conf)
@@ -275,18 +274,14 @@ static int altera_ps_probe(struct spi_device *spi)
275 snprintf(conf->mgr_name, sizeof(conf->mgr_name), "%s %s", 274 snprintf(conf->mgr_name, sizeof(conf->mgr_name), "%s %s",
276 dev_driver_string(&spi->dev), dev_name(&spi->dev)); 275 dev_driver_string(&spi->dev), dev_name(&spi->dev));
277 276
278 mgr = fpga_mgr_create(&spi->dev, conf->mgr_name, 277 mgr = devm_fpga_mgr_create(&spi->dev, conf->mgr_name,
279 &altera_ps_ops, conf); 278 &altera_ps_ops, conf);
280 if (!mgr) 279 if (!mgr)
281 return -ENOMEM; 280 return -ENOMEM;
282 281
283 spi_set_drvdata(spi, mgr); 282 spi_set_drvdata(spi, mgr);
284 283
285 ret = fpga_mgr_register(mgr); 284 return fpga_mgr_register(mgr);
286 if (ret)
287 fpga_mgr_free(mgr);
288
289 return ret;
290} 285}
291 286
292static int altera_ps_remove(struct spi_device *spi) 287static int altera_ps_remove(struct spi_device *spi)
diff --git a/drivers/fpga/dfl-afu-dma-region.c b/drivers/fpga/dfl-afu-dma-region.c
index 0e81d33af856..025aba3ea76c 100644
--- a/drivers/fpga/dfl-afu-dma-region.c
+++ b/drivers/fpga/dfl-afu-dma-region.c
@@ -70,7 +70,7 @@ static int afu_dma_adjust_locked_vm(struct device *dev, long npages, bool incr)
70 dev_dbg(dev, "[%d] RLIMIT_MEMLOCK %c%ld %ld/%ld%s\n", current->pid, 70 dev_dbg(dev, "[%d] RLIMIT_MEMLOCK %c%ld %ld/%ld%s\n", current->pid,
71 incr ? '+' : '-', npages << PAGE_SHIFT, 71 incr ? '+' : '-', npages << PAGE_SHIFT,
72 current->mm->locked_vm << PAGE_SHIFT, rlimit(RLIMIT_MEMLOCK), 72 current->mm->locked_vm << PAGE_SHIFT, rlimit(RLIMIT_MEMLOCK),
73 ret ? "- execeeded" : ""); 73 ret ? "- exceeded" : "");
74 74
75 up_write(&current->mm->mmap_sem); 75 up_write(&current->mm->mmap_sem);
76 76
diff --git a/drivers/fpga/dfl-fme-br.c b/drivers/fpga/dfl-fme-br.c
index 7cc041def8b3..3ff9f3a687ce 100644
--- a/drivers/fpga/dfl-fme-br.c
+++ b/drivers/fpga/dfl-fme-br.c
@@ -61,7 +61,6 @@ static int fme_br_probe(struct platform_device *pdev)
61 struct device *dev = &pdev->dev; 61 struct device *dev = &pdev->dev;
62 struct fme_br_priv *priv; 62 struct fme_br_priv *priv;
63 struct fpga_bridge *br; 63 struct fpga_bridge *br;
64 int ret;
65 64
66 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 65 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
67 if (!priv) 66 if (!priv)
@@ -69,18 +68,14 @@ static int fme_br_probe(struct platform_device *pdev)
69 68
70 priv->pdata = dev_get_platdata(dev); 69 priv->pdata = dev_get_platdata(dev);
71 70
72 br = fpga_bridge_create(dev, "DFL FPGA FME Bridge", 71 br = devm_fpga_bridge_create(dev, "DFL FPGA FME Bridge",
73 &fme_bridge_ops, priv); 72 &fme_bridge_ops, priv);
74 if (!br) 73 if (!br)
75 return -ENOMEM; 74 return -ENOMEM;
76 75
77 platform_set_drvdata(pdev, br); 76 platform_set_drvdata(pdev, br);
78 77
79 ret = fpga_bridge_register(br); 78 return fpga_bridge_register(br);
80 if (ret)
81 fpga_bridge_free(br);
82
83 return ret;
84} 79}
85 80
86static int fme_br_remove(struct platform_device *pdev) 81static int fme_br_remove(struct platform_device *pdev)
diff --git a/drivers/fpga/dfl-fme-mgr.c b/drivers/fpga/dfl-fme-mgr.c
index b5ef405b6d88..76f37709dd1a 100644
--- a/drivers/fpga/dfl-fme-mgr.c
+++ b/drivers/fpga/dfl-fme-mgr.c
@@ -201,7 +201,7 @@ static int fme_mgr_write(struct fpga_manager *mgr,
201 } 201 }
202 202
203 if (count < 4) { 203 if (count < 4) {
204 dev_err(dev, "Invaild PR bitstream size\n"); 204 dev_err(dev, "Invalid PR bitstream size\n");
205 return -EINVAL; 205 return -EINVAL;
206 } 206 }
207 207
@@ -287,7 +287,6 @@ static int fme_mgr_probe(struct platform_device *pdev)
287 struct fme_mgr_priv *priv; 287 struct fme_mgr_priv *priv;
288 struct fpga_manager *mgr; 288 struct fpga_manager *mgr;
289 struct resource *res; 289 struct resource *res;
290 int ret;
291 290
292 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 291 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
293 if (!priv) 292 if (!priv)
@@ -309,19 +308,15 @@ static int fme_mgr_probe(struct platform_device *pdev)
309 308
310 fme_mgr_get_compat_id(priv->ioaddr, compat_id); 309 fme_mgr_get_compat_id(priv->ioaddr, compat_id);
311 310
312 mgr = fpga_mgr_create(dev, "DFL FME FPGA Manager", 311 mgr = devm_fpga_mgr_create(dev, "DFL FME FPGA Manager",
313 &fme_mgr_ops, priv); 312 &fme_mgr_ops, priv);
314 if (!mgr) 313 if (!mgr)
315 return -ENOMEM; 314 return -ENOMEM;
316 315
317 mgr->compat_id = compat_id; 316 mgr->compat_id = compat_id;
318 platform_set_drvdata(pdev, mgr); 317 platform_set_drvdata(pdev, mgr);
319 318
320 ret = fpga_mgr_register(mgr); 319 return fpga_mgr_register(mgr);
321 if (ret)
322 fpga_mgr_free(mgr);
323
324 return ret;
325} 320}
326 321
327static int fme_mgr_remove(struct platform_device *pdev) 322static int fme_mgr_remove(struct platform_device *pdev)
diff --git a/drivers/fpga/dfl-fme-region.c b/drivers/fpga/dfl-fme-region.c
index 0b7e19c27c6d..ec134ec93f08 100644
--- a/drivers/fpga/dfl-fme-region.c
+++ b/drivers/fpga/dfl-fme-region.c
@@ -14,6 +14,7 @@
14 */ 14 */
15 15
16#include <linux/module.h> 16#include <linux/module.h>
17#include <linux/fpga/fpga-mgr.h>
17#include <linux/fpga/fpga-region.h> 18#include <linux/fpga/fpga-region.h>
18 19
19#include "dfl-fme-pr.h" 20#include "dfl-fme-pr.h"
@@ -38,7 +39,7 @@ static int fme_region_probe(struct platform_device *pdev)
38 if (IS_ERR(mgr)) 39 if (IS_ERR(mgr))
39 return -EPROBE_DEFER; 40 return -EPROBE_DEFER;
40 41
41 region = fpga_region_create(dev, mgr, fme_region_get_bridges); 42 region = devm_fpga_region_create(dev, mgr, fme_region_get_bridges);
42 if (!region) { 43 if (!region) {
43 ret = -ENOMEM; 44 ret = -ENOMEM;
44 goto eprobe_mgr_put; 45 goto eprobe_mgr_put;
@@ -50,14 +51,12 @@ static int fme_region_probe(struct platform_device *pdev)
50 51
51 ret = fpga_region_register(region); 52 ret = fpga_region_register(region);
52 if (ret) 53 if (ret)
53 goto region_free; 54 goto eprobe_mgr_put;
54 55
55 dev_dbg(dev, "DFL FME FPGA Region probed\n"); 56 dev_dbg(dev, "DFL FME FPGA Region probed\n");
56 57
57 return 0; 58 return 0;
58 59
59region_free:
60 fpga_region_free(region);
61eprobe_mgr_put: 60eprobe_mgr_put:
62 fpga_mgr_put(mgr); 61 fpga_mgr_put(mgr);
63 return ret; 62 return ret;
@@ -66,9 +65,10 @@ eprobe_mgr_put:
66static int fme_region_remove(struct platform_device *pdev) 65static int fme_region_remove(struct platform_device *pdev)
67{ 66{
68 struct fpga_region *region = dev_get_drvdata(&pdev->dev); 67 struct fpga_region *region = dev_get_drvdata(&pdev->dev);
68 struct fpga_manager *mgr = region->mgr;
69 69
70 fpga_region_unregister(region); 70 fpga_region_unregister(region);
71 fpga_mgr_put(region->mgr); 71 fpga_mgr_put(mgr);
72 72
73 return 0; 73 return 0;
74} 74}
diff --git a/drivers/fpga/dfl.c b/drivers/fpga/dfl.c
index a9b521bccb06..2c09e502e721 100644
--- a/drivers/fpga/dfl.c
+++ b/drivers/fpga/dfl.c
@@ -899,7 +899,7 @@ dfl_fpga_feature_devs_enumerate(struct dfl_fpga_enum_info *info)
899 if (!cdev) 899 if (!cdev)
900 return ERR_PTR(-ENOMEM); 900 return ERR_PTR(-ENOMEM);
901 901
902 cdev->region = fpga_region_create(info->dev, NULL, NULL); 902 cdev->region = devm_fpga_region_create(info->dev, NULL, NULL);
903 if (!cdev->region) { 903 if (!cdev->region) {
904 ret = -ENOMEM; 904 ret = -ENOMEM;
905 goto free_cdev_exit; 905 goto free_cdev_exit;
@@ -911,7 +911,7 @@ dfl_fpga_feature_devs_enumerate(struct dfl_fpga_enum_info *info)
911 911
912 ret = fpga_region_register(cdev->region); 912 ret = fpga_region_register(cdev->region);
913 if (ret) 913 if (ret)
914 goto free_region_exit; 914 goto free_cdev_exit;
915 915
916 /* create and init build info for enumeration */ 916 /* create and init build info for enumeration */
917 binfo = devm_kzalloc(info->dev, sizeof(*binfo), GFP_KERNEL); 917 binfo = devm_kzalloc(info->dev, sizeof(*binfo), GFP_KERNEL);
@@ -942,8 +942,6 @@ dfl_fpga_feature_devs_enumerate(struct dfl_fpga_enum_info *info)
942 942
943unregister_region_exit: 943unregister_region_exit:
944 fpga_region_unregister(cdev->region); 944 fpga_region_unregister(cdev->region);
945free_region_exit:
946 fpga_region_free(cdev->region);
947free_cdev_exit: 945free_cdev_exit:
948 devm_kfree(info->dev, cdev); 946 devm_kfree(info->dev, cdev);
949 return ERR_PTR(ret); 947 return ERR_PTR(ret);
diff --git a/drivers/fpga/fpga-bridge.c b/drivers/fpga/fpga-bridge.c
index 24b8f98b73ec..80bd8f1b2aa6 100644
--- a/drivers/fpga/fpga-bridge.c
+++ b/drivers/fpga/fpga-bridge.c
@@ -125,7 +125,7 @@ static int fpga_bridge_dev_match(struct device *dev, const void *data)
125 * 125 *
126 * Given a device, get an exclusive reference to a fpga bridge. 126 * Given a device, get an exclusive reference to a fpga bridge.
127 * 127 *
128 * Return: fpga manager struct or IS_ERR() condition containing error code. 128 * Return: fpga bridge struct or IS_ERR() condition containing error code.
129 */ 129 */
130struct fpga_bridge *fpga_bridge_get(struct device *dev, 130struct fpga_bridge *fpga_bridge_get(struct device *dev,
131 struct fpga_image_info *info) 131 struct fpga_image_info *info)
@@ -324,6 +324,9 @@ ATTRIBUTE_GROUPS(fpga_bridge);
324 * @br_ops: pointer to structure of fpga bridge ops 324 * @br_ops: pointer to structure of fpga bridge ops
325 * @priv: FPGA bridge private data 325 * @priv: FPGA bridge private data
326 * 326 *
327 * The caller of this function is responsible for freeing the bridge with
328 * fpga_bridge_free(). Using devm_fpga_bridge_create() instead is recommended.
329 *
327 * Return: struct fpga_bridge or NULL 330 * Return: struct fpga_bridge or NULL
328 */ 331 */
329struct fpga_bridge *fpga_bridge_create(struct device *dev, const char *name, 332struct fpga_bridge *fpga_bridge_create(struct device *dev, const char *name,
@@ -378,8 +381,8 @@ error_kfree:
378EXPORT_SYMBOL_GPL(fpga_bridge_create); 381EXPORT_SYMBOL_GPL(fpga_bridge_create);
379 382
380/** 383/**
381 * fpga_bridge_free - free a fpga bridge and its id 384 * fpga_bridge_free - free a fpga bridge created by fpga_bridge_create()
382 * @bridge: FPGA bridge struct created by fpga_bridge_create 385 * @bridge: FPGA bridge struct
383 */ 386 */
384void fpga_bridge_free(struct fpga_bridge *bridge) 387void fpga_bridge_free(struct fpga_bridge *bridge)
385{ 388{
@@ -388,9 +391,56 @@ void fpga_bridge_free(struct fpga_bridge *bridge)
388} 391}
389EXPORT_SYMBOL_GPL(fpga_bridge_free); 392EXPORT_SYMBOL_GPL(fpga_bridge_free);
390 393
394static void devm_fpga_bridge_release(struct device *dev, void *res)
395{
396 struct fpga_bridge *bridge = *(struct fpga_bridge **)res;
397
398 fpga_bridge_free(bridge);
399}
400
391/** 401/**
392 * fpga_bridge_register - register a fpga bridge 402 * devm_fpga_bridge_create - create and init a managed struct fpga_bridge
393 * @bridge: FPGA bridge struct created by fpga_bridge_create 403 * @dev: FPGA bridge device from pdev
404 * @name: FPGA bridge name
405 * @br_ops: pointer to structure of fpga bridge ops
406 * @priv: FPGA bridge private data
407 *
408 * This function is intended for use in a FPGA bridge driver's probe function.
409 * After the bridge driver creates the struct with devm_fpga_bridge_create(), it
410 * should register the bridge with fpga_bridge_register(). The bridge driver's
411 * remove function should call fpga_bridge_unregister(). The bridge struct
412 * allocated with this function will be freed automatically on driver detach.
413 * This includes the case of a probe function returning error before calling
414 * fpga_bridge_register(), the struct will still get cleaned up.
415 *
416 * Return: struct fpga_bridge or NULL
417 */
418struct fpga_bridge
419*devm_fpga_bridge_create(struct device *dev, const char *name,
420 const struct fpga_bridge_ops *br_ops, void *priv)
421{
422 struct fpga_bridge **ptr, *bridge;
423
424 ptr = devres_alloc(devm_fpga_bridge_release, sizeof(*ptr), GFP_KERNEL);
425 if (!ptr)
426 return NULL;
427
428 bridge = fpga_bridge_create(dev, name, br_ops, priv);
429 if (!bridge) {
430 devres_free(ptr);
431 } else {
432 *ptr = bridge;
433 devres_add(dev, ptr);
434 }
435
436 return bridge;
437}
438EXPORT_SYMBOL_GPL(devm_fpga_bridge_create);
439
440/**
441 * fpga_bridge_register - register a FPGA bridge
442 *
443 * @bridge: FPGA bridge struct
394 * 444 *
395 * Return: 0 for success, error code otherwise. 445 * Return: 0 for success, error code otherwise.
396 */ 446 */
@@ -412,8 +462,11 @@ int fpga_bridge_register(struct fpga_bridge *bridge)
412EXPORT_SYMBOL_GPL(fpga_bridge_register); 462EXPORT_SYMBOL_GPL(fpga_bridge_register);
413 463
414/** 464/**
415 * fpga_bridge_unregister - unregister and free a fpga bridge 465 * fpga_bridge_unregister - unregister a FPGA bridge
416 * @bridge: FPGA bridge struct created by fpga_bridge_create 466 *
467 * @bridge: FPGA bridge struct
468 *
469 * This function is intended for use in a FPGA bridge driver's remove function.
417 */ 470 */
418void fpga_bridge_unregister(struct fpga_bridge *bridge) 471void fpga_bridge_unregister(struct fpga_bridge *bridge)
419{ 472{
@@ -430,9 +483,6 @@ EXPORT_SYMBOL_GPL(fpga_bridge_unregister);
430 483
431static void fpga_bridge_dev_release(struct device *dev) 484static void fpga_bridge_dev_release(struct device *dev)
432{ 485{
433 struct fpga_bridge *bridge = to_fpga_bridge(dev);
434
435 fpga_bridge_free(bridge);
436} 486}
437 487
438static int __init fpga_bridge_dev_init(void) 488static int __init fpga_bridge_dev_init(void)
diff --git a/drivers/fpga/fpga-mgr.c b/drivers/fpga/fpga-mgr.c
index a41b07e37884..c3866816456a 100644
--- a/drivers/fpga/fpga-mgr.c
+++ b/drivers/fpga/fpga-mgr.c
@@ -558,6 +558,9 @@ EXPORT_SYMBOL_GPL(fpga_mgr_unlock);
558 * @mops: pointer to structure of fpga manager ops 558 * @mops: pointer to structure of fpga manager ops
559 * @priv: fpga manager private data 559 * @priv: fpga manager private data
560 * 560 *
561 * The caller of this function is responsible for freeing the struct with
562 * fpga_mgr_free(). Using devm_fpga_mgr_create() instead is recommended.
563 *
561 * Return: pointer to struct fpga_manager or NULL 564 * Return: pointer to struct fpga_manager or NULL
562 */ 565 */
563struct fpga_manager *fpga_mgr_create(struct device *dev, const char *name, 566struct fpga_manager *fpga_mgr_create(struct device *dev, const char *name,
@@ -618,8 +621,8 @@ error_kfree:
618EXPORT_SYMBOL_GPL(fpga_mgr_create); 621EXPORT_SYMBOL_GPL(fpga_mgr_create);
619 622
620/** 623/**
621 * fpga_mgr_free - deallocate a FPGA manager 624 * fpga_mgr_free - free a FPGA manager created with fpga_mgr_create()
622 * @mgr: fpga manager struct created by fpga_mgr_create 625 * @mgr: fpga manager struct
623 */ 626 */
624void fpga_mgr_free(struct fpga_manager *mgr) 627void fpga_mgr_free(struct fpga_manager *mgr)
625{ 628{
@@ -628,9 +631,55 @@ void fpga_mgr_free(struct fpga_manager *mgr)
628} 631}
629EXPORT_SYMBOL_GPL(fpga_mgr_free); 632EXPORT_SYMBOL_GPL(fpga_mgr_free);
630 633
634static void devm_fpga_mgr_release(struct device *dev, void *res)
635{
636 struct fpga_manager *mgr = *(struct fpga_manager **)res;
637
638 fpga_mgr_free(mgr);
639}
640
641/**
642 * devm_fpga_mgr_create - create and initialize a managed FPGA manager struct
643 * @dev: fpga manager device from pdev
644 * @name: fpga manager name
645 * @mops: pointer to structure of fpga manager ops
646 * @priv: fpga manager private data
647 *
648 * This function is intended for use in a FPGA manager driver's probe function.
649 * After the manager driver creates the manager struct with
650 * devm_fpga_mgr_create(), it should register it with fpga_mgr_register(). The
651 * manager driver's remove function should call fpga_mgr_unregister(). The
652 * manager struct allocated with this function will be freed automatically on
653 * driver detach. This includes the case of a probe function returning error
654 * before calling fpga_mgr_register(), the struct will still get cleaned up.
655 *
656 * Return: pointer to struct fpga_manager or NULL
657 */
658struct fpga_manager *devm_fpga_mgr_create(struct device *dev, const char *name,
659 const struct fpga_manager_ops *mops,
660 void *priv)
661{
662 struct fpga_manager **ptr, *mgr;
663
664 ptr = devres_alloc(devm_fpga_mgr_release, sizeof(*ptr), GFP_KERNEL);
665 if (!ptr)
666 return NULL;
667
668 mgr = fpga_mgr_create(dev, name, mops, priv);
669 if (!mgr) {
670 devres_free(ptr);
671 } else {
672 *ptr = mgr;
673 devres_add(dev, ptr);
674 }
675
676 return mgr;
677}
678EXPORT_SYMBOL_GPL(devm_fpga_mgr_create);
679
631/** 680/**
632 * fpga_mgr_register - register a FPGA manager 681 * fpga_mgr_register - register a FPGA manager
633 * @mgr: fpga manager struct created by fpga_mgr_create 682 * @mgr: fpga manager struct
634 * 683 *
635 * Return: 0 on success, negative error code otherwise. 684 * Return: 0 on success, negative error code otherwise.
636 */ 685 */
@@ -661,8 +710,10 @@ error_device:
661EXPORT_SYMBOL_GPL(fpga_mgr_register); 710EXPORT_SYMBOL_GPL(fpga_mgr_register);
662 711
663/** 712/**
664 * fpga_mgr_unregister - unregister and free a FPGA manager 713 * fpga_mgr_unregister - unregister a FPGA manager
665 * @mgr: fpga manager struct 714 * @mgr: fpga manager struct
715 *
716 * This function is intended for use in a FPGA manager driver's remove function.
666 */ 717 */
667void fpga_mgr_unregister(struct fpga_manager *mgr) 718void fpga_mgr_unregister(struct fpga_manager *mgr)
668{ 719{
@@ -681,9 +732,6 @@ EXPORT_SYMBOL_GPL(fpga_mgr_unregister);
681 732
682static void fpga_mgr_dev_release(struct device *dev) 733static void fpga_mgr_dev_release(struct device *dev)
683{ 734{
684 struct fpga_manager *mgr = to_fpga_manager(dev);
685
686 fpga_mgr_free(mgr);
687} 735}
688 736
689static int __init fpga_mgr_class_init(void) 737static int __init fpga_mgr_class_init(void)
diff --git a/drivers/fpga/fpga-region.c b/drivers/fpga/fpga-region.c
index 0d65220d5ec5..bde5a9d460c5 100644
--- a/drivers/fpga/fpga-region.c
+++ b/drivers/fpga/fpga-region.c
@@ -185,6 +185,10 @@ ATTRIBUTE_GROUPS(fpga_region);
185 * @mgr: manager that programs this region 185 * @mgr: manager that programs this region
186 * @get_bridges: optional function to get bridges to a list 186 * @get_bridges: optional function to get bridges to a list
187 * 187 *
188 * The caller of this function is responsible for freeing the resulting region
189 * struct with fpga_region_free(). Using devm_fpga_region_create() instead is
190 * recommended.
191 *
188 * Return: struct fpga_region or NULL 192 * Return: struct fpga_region or NULL
189 */ 193 */
190struct fpga_region 194struct fpga_region
@@ -230,8 +234,8 @@ err_free:
230EXPORT_SYMBOL_GPL(fpga_region_create); 234EXPORT_SYMBOL_GPL(fpga_region_create);
231 235
232/** 236/**
233 * fpga_region_free - free a struct fpga_region 237 * fpga_region_free - free a FPGA region created by fpga_region_create()
234 * @region: FPGA region created by fpga_region_create 238 * @region: FPGA region
235 */ 239 */
236void fpga_region_free(struct fpga_region *region) 240void fpga_region_free(struct fpga_region *region)
237{ 241{
@@ -240,21 +244,69 @@ void fpga_region_free(struct fpga_region *region)
240} 244}
241EXPORT_SYMBOL_GPL(fpga_region_free); 245EXPORT_SYMBOL_GPL(fpga_region_free);
242 246
247static void devm_fpga_region_release(struct device *dev, void *res)
248{
249 struct fpga_region *region = *(struct fpga_region **)res;
250
251 fpga_region_free(region);
252}
253
254/**
255 * devm_fpga_region_create - create and initialize a managed FPGA region struct
256 * @dev: device parent
257 * @mgr: manager that programs this region
258 * @get_bridges: optional function to get bridges to a list
259 *
260 * This function is intended for use in a FPGA region driver's probe function.
261 * After the region driver creates the region struct with
262 * devm_fpga_region_create(), it should register it with fpga_region_register().
263 * The region driver's remove function should call fpga_region_unregister().
264 * The region struct allocated with this function will be freed automatically on
265 * driver detach. This includes the case of a probe function returning error
266 * before calling fpga_region_register(), the struct will still get cleaned up.
267 *
268 * Return: struct fpga_region or NULL
269 */
270struct fpga_region
271*devm_fpga_region_create(struct device *dev,
272 struct fpga_manager *mgr,
273 int (*get_bridges)(struct fpga_region *))
274{
275 struct fpga_region **ptr, *region;
276
277 ptr = devres_alloc(devm_fpga_region_release, sizeof(*ptr), GFP_KERNEL);
278 if (!ptr)
279 return NULL;
280
281 region = fpga_region_create(dev, mgr, get_bridges);
282 if (!region) {
283 devres_free(ptr);
284 } else {
285 *ptr = region;
286 devres_add(dev, ptr);
287 }
288
289 return region;
290}
291EXPORT_SYMBOL_GPL(devm_fpga_region_create);
292
243/** 293/**
244 * fpga_region_register - register a FPGA region 294 * fpga_region_register - register a FPGA region
245 * @region: FPGA region created by fpga_region_create 295 * @region: FPGA region
296 *
246 * Return: 0 or -errno 297 * Return: 0 or -errno
247 */ 298 */
248int fpga_region_register(struct fpga_region *region) 299int fpga_region_register(struct fpga_region *region)
249{ 300{
250 return device_add(&region->dev); 301 return device_add(&region->dev);
251
252} 302}
253EXPORT_SYMBOL_GPL(fpga_region_register); 303EXPORT_SYMBOL_GPL(fpga_region_register);
254 304
255/** 305/**
256 * fpga_region_unregister - unregister and free a FPGA region 306 * fpga_region_unregister - unregister a FPGA region
257 * @region: FPGA region 307 * @region: FPGA region
308 *
309 * This function is intended for use in a FPGA region driver's remove function.
258 */ 310 */
259void fpga_region_unregister(struct fpga_region *region) 311void fpga_region_unregister(struct fpga_region *region)
260{ 312{
@@ -264,9 +316,6 @@ EXPORT_SYMBOL_GPL(fpga_region_unregister);
264 316
265static void fpga_region_dev_release(struct device *dev) 317static void fpga_region_dev_release(struct device *dev)
266{ 318{
267 struct fpga_region *region = to_fpga_region(dev);
268
269 fpga_region_free(region);
270} 319}
271 320
272/** 321/**
diff --git a/drivers/fpga/ice40-spi.c b/drivers/fpga/ice40-spi.c
index 5981c7ee7a7d..6154661b8f76 100644
--- a/drivers/fpga/ice40-spi.c
+++ b/drivers/fpga/ice40-spi.c
@@ -175,18 +175,14 @@ static int ice40_fpga_probe(struct spi_device *spi)
175 return ret; 175 return ret;
176 } 176 }
177 177
178 mgr = fpga_mgr_create(dev, "Lattice iCE40 FPGA Manager", 178 mgr = devm_fpga_mgr_create(dev, "Lattice iCE40 FPGA Manager",
179 &ice40_fpga_ops, priv); 179 &ice40_fpga_ops, priv);
180 if (!mgr) 180 if (!mgr)
181 return -ENOMEM; 181 return -ENOMEM;
182 182
183 spi_set_drvdata(spi, mgr); 183 spi_set_drvdata(spi, mgr);
184 184
185 ret = fpga_mgr_register(mgr); 185 return fpga_mgr_register(mgr);
186 if (ret)
187 fpga_mgr_free(mgr);
188
189 return ret;
190} 186}
191 187
192static int ice40_fpga_remove(struct spi_device *spi) 188static int ice40_fpga_remove(struct spi_device *spi)
diff --git a/drivers/fpga/machxo2-spi.c b/drivers/fpga/machxo2-spi.c
index a582e0000c97..4d8a87641587 100644
--- a/drivers/fpga/machxo2-spi.c
+++ b/drivers/fpga/machxo2-spi.c
@@ -356,25 +356,20 @@ static int machxo2_spi_probe(struct spi_device *spi)
356{ 356{
357 struct device *dev = &spi->dev; 357 struct device *dev = &spi->dev;
358 struct fpga_manager *mgr; 358 struct fpga_manager *mgr;
359 int ret;
360 359
361 if (spi->max_speed_hz > MACHXO2_MAX_SPEED) { 360 if (spi->max_speed_hz > MACHXO2_MAX_SPEED) {
362 dev_err(dev, "Speed is too high\n"); 361 dev_err(dev, "Speed is too high\n");
363 return -EINVAL; 362 return -EINVAL;
364 } 363 }
365 364
366 mgr = fpga_mgr_create(dev, "Lattice MachXO2 SPI FPGA Manager", 365 mgr = devm_fpga_mgr_create(dev, "Lattice MachXO2 SPI FPGA Manager",
367 &machxo2_ops, spi); 366 &machxo2_ops, spi);
368 if (!mgr) 367 if (!mgr)
369 return -ENOMEM; 368 return -ENOMEM;
370 369
371 spi_set_drvdata(spi, mgr); 370 spi_set_drvdata(spi, mgr);
372 371
373 ret = fpga_mgr_register(mgr); 372 return fpga_mgr_register(mgr);
374 if (ret)
375 fpga_mgr_free(mgr);
376
377 return ret;
378} 373}
379 374
380static int machxo2_spi_remove(struct spi_device *spi) 375static int machxo2_spi_remove(struct spi_device *spi)
diff --git a/drivers/fpga/of-fpga-region.c b/drivers/fpga/of-fpga-region.c
index 35fabb8083fb..122286fd255a 100644
--- a/drivers/fpga/of-fpga-region.c
+++ b/drivers/fpga/of-fpga-region.c
@@ -410,7 +410,7 @@ static int of_fpga_region_probe(struct platform_device *pdev)
410 if (IS_ERR(mgr)) 410 if (IS_ERR(mgr))
411 return -EPROBE_DEFER; 411 return -EPROBE_DEFER;
412 412
413 region = fpga_region_create(dev, mgr, of_fpga_region_get_bridges); 413 region = devm_fpga_region_create(dev, mgr, of_fpga_region_get_bridges);
414 if (!region) { 414 if (!region) {
415 ret = -ENOMEM; 415 ret = -ENOMEM;
416 goto eprobe_mgr_put; 416 goto eprobe_mgr_put;
@@ -418,7 +418,7 @@ static int of_fpga_region_probe(struct platform_device *pdev)
418 418
419 ret = fpga_region_register(region); 419 ret = fpga_region_register(region);
420 if (ret) 420 if (ret)
421 goto eprobe_free; 421 goto eprobe_mgr_put;
422 422
423 of_platform_populate(np, fpga_region_of_match, NULL, &region->dev); 423 of_platform_populate(np, fpga_region_of_match, NULL, &region->dev);
424 dev_set_drvdata(dev, region); 424 dev_set_drvdata(dev, region);
@@ -427,8 +427,6 @@ static int of_fpga_region_probe(struct platform_device *pdev)
427 427
428 return 0; 428 return 0;
429 429
430eprobe_free:
431 fpga_region_free(region);
432eprobe_mgr_put: 430eprobe_mgr_put:
433 fpga_mgr_put(mgr); 431 fpga_mgr_put(mgr);
434 return ret; 432 return ret;
@@ -437,9 +435,10 @@ eprobe_mgr_put:
437static int of_fpga_region_remove(struct platform_device *pdev) 435static int of_fpga_region_remove(struct platform_device *pdev)
438{ 436{
439 struct fpga_region *region = platform_get_drvdata(pdev); 437 struct fpga_region *region = platform_get_drvdata(pdev);
438 struct fpga_manager *mgr = region->mgr;
440 439
441 fpga_region_unregister(region); 440 fpga_region_unregister(region);
442 fpga_mgr_put(region->mgr); 441 fpga_mgr_put(mgr);
443 442
444 return 0; 443 return 0;
445} 444}
diff --git a/drivers/fpga/socfpga-a10.c b/drivers/fpga/socfpga-a10.c
index be30c48eb6e4..573d88bdf730 100644
--- a/drivers/fpga/socfpga-a10.c
+++ b/drivers/fpga/socfpga-a10.c
@@ -508,8 +508,8 @@ static int socfpga_a10_fpga_probe(struct platform_device *pdev)
508 return -EBUSY; 508 return -EBUSY;
509 } 509 }
510 510
511 mgr = fpga_mgr_create(dev, "SoCFPGA Arria10 FPGA Manager", 511 mgr = devm_fpga_mgr_create(dev, "SoCFPGA Arria10 FPGA Manager",
512 &socfpga_a10_fpga_mgr_ops, priv); 512 &socfpga_a10_fpga_mgr_ops, priv);
513 if (!mgr) 513 if (!mgr)
514 return -ENOMEM; 514 return -ENOMEM;
515 515
@@ -517,7 +517,6 @@ static int socfpga_a10_fpga_probe(struct platform_device *pdev)
517 517
518 ret = fpga_mgr_register(mgr); 518 ret = fpga_mgr_register(mgr);
519 if (ret) { 519 if (ret) {
520 fpga_mgr_free(mgr);
521 clk_disable_unprepare(priv->clk); 520 clk_disable_unprepare(priv->clk);
522 return ret; 521 return ret;
523 } 522 }
diff --git a/drivers/fpga/socfpga.c b/drivers/fpga/socfpga.c
index 959d71f26896..4a8a2fcd4e6c 100644
--- a/drivers/fpga/socfpga.c
+++ b/drivers/fpga/socfpga.c
@@ -571,18 +571,14 @@ static int socfpga_fpga_probe(struct platform_device *pdev)
571 if (ret) 571 if (ret)
572 return ret; 572 return ret;
573 573
574 mgr = fpga_mgr_create(dev, "Altera SOCFPGA FPGA Manager", 574 mgr = devm_fpga_mgr_create(dev, "Altera SOCFPGA FPGA Manager",
575 &socfpga_fpga_ops, priv); 575 &socfpga_fpga_ops, priv);
576 if (!mgr) 576 if (!mgr)
577 return -ENOMEM; 577 return -ENOMEM;
578 578
579 platform_set_drvdata(pdev, mgr); 579 platform_set_drvdata(pdev, mgr);
580 580
581 ret = fpga_mgr_register(mgr); 581 return fpga_mgr_register(mgr);
582 if (ret)
583 fpga_mgr_free(mgr);
584
585 return ret;
586} 582}
587 583
588static int socfpga_fpga_remove(struct platform_device *pdev) 584static int socfpga_fpga_remove(struct platform_device *pdev)
diff --git a/drivers/fpga/ts73xx-fpga.c b/drivers/fpga/ts73xx-fpga.c
index 08efd1895b1b..dc22a5842609 100644
--- a/drivers/fpga/ts73xx-fpga.c
+++ b/drivers/fpga/ts73xx-fpga.c
@@ -118,7 +118,6 @@ static int ts73xx_fpga_probe(struct platform_device *pdev)
118 struct ts73xx_fpga_priv *priv; 118 struct ts73xx_fpga_priv *priv;
119 struct fpga_manager *mgr; 119 struct fpga_manager *mgr;
120 struct resource *res; 120 struct resource *res;
121 int ret;
122 121
123 priv = devm_kzalloc(kdev, sizeof(*priv), GFP_KERNEL); 122 priv = devm_kzalloc(kdev, sizeof(*priv), GFP_KERNEL);
124 if (!priv) 123 if (!priv)
@@ -133,18 +132,14 @@ static int ts73xx_fpga_probe(struct platform_device *pdev)
133 return PTR_ERR(priv->io_base); 132 return PTR_ERR(priv->io_base);
134 } 133 }
135 134
136 mgr = fpga_mgr_create(kdev, "TS-73xx FPGA Manager", 135 mgr = devm_fpga_mgr_create(kdev, "TS-73xx FPGA Manager",
137 &ts73xx_fpga_ops, priv); 136 &ts73xx_fpga_ops, priv);
138 if (!mgr) 137 if (!mgr)
139 return -ENOMEM; 138 return -ENOMEM;
140 139
141 platform_set_drvdata(pdev, mgr); 140 platform_set_drvdata(pdev, mgr);
142 141
143 ret = fpga_mgr_register(mgr); 142 return fpga_mgr_register(mgr);
144 if (ret)
145 fpga_mgr_free(mgr);
146
147 return ret;
148} 143}
149 144
150static int ts73xx_fpga_remove(struct platform_device *pdev) 145static int ts73xx_fpga_remove(struct platform_device *pdev)
diff --git a/drivers/fpga/xilinx-pr-decoupler.c b/drivers/fpga/xilinx-pr-decoupler.c
index 07ba1539e82c..641036135207 100644
--- a/drivers/fpga/xilinx-pr-decoupler.c
+++ b/drivers/fpga/xilinx-pr-decoupler.c
@@ -121,8 +121,8 @@ static int xlnx_pr_decoupler_probe(struct platform_device *pdev)
121 121
122 clk_disable(priv->clk); 122 clk_disable(priv->clk);
123 123
124 br = fpga_bridge_create(&pdev->dev, "Xilinx PR Decoupler", 124 br = devm_fpga_bridge_create(&pdev->dev, "Xilinx PR Decoupler",
125 &xlnx_pr_decoupler_br_ops, priv); 125 &xlnx_pr_decoupler_br_ops, priv);
126 if (!br) { 126 if (!br) {
127 err = -ENOMEM; 127 err = -ENOMEM;
128 goto err_clk; 128 goto err_clk;
diff --git a/drivers/fpga/xilinx-spi.c b/drivers/fpga/xilinx-spi.c
index 8d1945966533..469486be20c4 100644
--- a/drivers/fpga/xilinx-spi.c
+++ b/drivers/fpga/xilinx-spi.c
@@ -144,7 +144,6 @@ static int xilinx_spi_probe(struct spi_device *spi)
144{ 144{
145 struct xilinx_spi_conf *conf; 145 struct xilinx_spi_conf *conf;
146 struct fpga_manager *mgr; 146 struct fpga_manager *mgr;
147 int ret;
148 147
149 conf = devm_kzalloc(&spi->dev, sizeof(*conf), GFP_KERNEL); 148 conf = devm_kzalloc(&spi->dev, sizeof(*conf), GFP_KERNEL);
150 if (!conf) 149 if (!conf)
@@ -167,18 +166,15 @@ static int xilinx_spi_probe(struct spi_device *spi)
167 return PTR_ERR(conf->done); 166 return PTR_ERR(conf->done);
168 } 167 }
169 168
170 mgr = fpga_mgr_create(&spi->dev, "Xilinx Slave Serial FPGA Manager", 169 mgr = devm_fpga_mgr_create(&spi->dev,
171 &xilinx_spi_ops, conf); 170 "Xilinx Slave Serial FPGA Manager",
171 &xilinx_spi_ops, conf);
172 if (!mgr) 172 if (!mgr)
173 return -ENOMEM; 173 return -ENOMEM;
174 174
175 spi_set_drvdata(spi, mgr); 175 spi_set_drvdata(spi, mgr);
176 176
177 ret = fpga_mgr_register(mgr); 177 return fpga_mgr_register(mgr);
178 if (ret)
179 fpga_mgr_free(mgr);
180
181 return ret;
182} 178}
183 179
184static int xilinx_spi_remove(struct spi_device *spi) 180static int xilinx_spi_remove(struct spi_device *spi)
diff --git a/drivers/fpga/zynq-fpga.c b/drivers/fpga/zynq-fpga.c
index 3110e00121ca..bb82efeebb9d 100644
--- a/drivers/fpga/zynq-fpga.c
+++ b/drivers/fpga/zynq-fpga.c
@@ -614,8 +614,8 @@ static int zynq_fpga_probe(struct platform_device *pdev)
614 614
615 clk_disable(priv->clk); 615 clk_disable(priv->clk);
616 616
617 mgr = fpga_mgr_create(dev, "Xilinx Zynq FPGA Manager", 617 mgr = devm_fpga_mgr_create(dev, "Xilinx Zynq FPGA Manager",
618 &zynq_fpga_ops, priv); 618 &zynq_fpga_ops, priv);
619 if (!mgr) 619 if (!mgr)
620 return -ENOMEM; 620 return -ENOMEM;
621 621
@@ -624,7 +624,6 @@ static int zynq_fpga_probe(struct platform_device *pdev)
624 err = fpga_mgr_register(mgr); 624 err = fpga_mgr_register(mgr);
625 if (err) { 625 if (err) {
626 dev_err(dev, "unable to register FPGA manager\n"); 626 dev_err(dev, "unable to register FPGA manager\n");
627 fpga_mgr_free(mgr);
628 clk_unprepare(priv->clk); 627 clk_unprepare(priv->clk);
629 return err; 628 return err;
630 } 629 }