aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Tull <atull@kernel.org>2018-10-15 18:20:01 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-10-16 05:13:50 -0400
commit084181fe8cc7472695b907f0018f4cd00934cb12 (patch)
tree812b6c10de92d91bccfdec2da621abacc2745c4d
parent1c87dc897b8c8ace3aa4480fa29ef6439dabb3ab (diff)
fpga: mgr: add devm_fpga_mgr_create
Add devm_fpga_mgr_create() which is the managed version of fpga_mgr_create(). Change current FPGA manager drivers to use devm_fpga_mgr_create() Signed-off-by: Alan Tull <atull@kernel.org> Suggested-by: Federico Vaga <federico.vaga@cern.ch> Acked-by: Moritz Fischer <mdf@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--Documentation/driver-api/fpga/fpga-mgr.rst13
-rw-r--r--drivers/fpga/altera-cvp.c8
-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-fme-mgr.c11
-rw-r--r--drivers/fpga/fpga-mgr.c64
-rw-r--r--drivers/fpga/ice40-spi.c10
-rw-r--r--drivers/fpga/machxo2-spi.c11
-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-spi.c12
-rw-r--r--drivers/fpga/zynq-fpga.c5
-rw-r--r--include/linux/fpga/fpga-mgr.h4
14 files changed, 97 insertions, 87 deletions
diff --git a/Documentation/driver-api/fpga/fpga-mgr.rst b/Documentation/driver-api/fpga/fpga-mgr.rst
index 82b6dbbd31cd..db8885efbc22 100644
--- a/Documentation/driver-api/fpga/fpga-mgr.rst
+++ b/Documentation/driver-api/fpga/fpga-mgr.rst
@@ -49,18 +49,14 @@ probe function calls fpga_mgr_register(), such as::
49 * them in priv 49 * them in priv
50 */ 50 */
51 51
52 mgr = fpga_mgr_create(dev, "Altera SOCFPGA FPGA Manager", 52 mgr = devm_fpga_mgr_create(dev, "Altera SOCFPGA FPGA Manager",
53 &socfpga_fpga_ops, priv); 53 &socfpga_fpga_ops, priv);
54 if (!mgr) 54 if (!mgr)
55 return -ENOMEM; 55 return -ENOMEM;
56 56
57 platform_set_drvdata(pdev, mgr); 57 platform_set_drvdata(pdev, mgr);
58 58
59 ret = fpga_mgr_register(mgr); 59 return fpga_mgr_register(mgr);
60 if (ret)
61 fpga_mgr_free(mgr);
62
63 return ret;
64 } 60 }
65 61
66 static int socfpga_fpga_remove(struct platform_device *pdev) 62 static int socfpga_fpga_remove(struct platform_device *pdev)
@@ -170,6 +166,9 @@ API for implementing a new FPGA Manager driver
170 :functions: fpga_manager_ops 166 :functions: fpga_manager_ops
171 167
172.. kernel-doc:: drivers/fpga/fpga-mgr.c 168.. kernel-doc:: drivers/fpga/fpga-mgr.c
169 :functions: devm_fpga_mgr_create
170
171.. kernel-doc:: drivers/fpga/fpga-mgr.c
173 :functions: fpga_mgr_create 172 :functions: fpga_mgr_create
174 173
175.. kernel-doc:: drivers/fpga/fpga-mgr.c 174.. kernel-doc:: drivers/fpga/fpga-mgr.c
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-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-fme-mgr.c b/drivers/fpga/dfl-fme-mgr.c
index 9f045d058cfd..76f37709dd1a 100644
--- a/drivers/fpga/dfl-fme-mgr.c
+++ b/drivers/fpga/dfl-fme-mgr.c
@@ -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/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/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/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-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 }
diff --git a/include/linux/fpga/fpga-mgr.h b/include/linux/fpga/fpga-mgr.h
index 8ab5df769923..e8ca62b2cb5b 100644
--- a/include/linux/fpga/fpga-mgr.h
+++ b/include/linux/fpga/fpga-mgr.h
@@ -198,4 +198,8 @@ void fpga_mgr_free(struct fpga_manager *mgr);
198int fpga_mgr_register(struct fpga_manager *mgr); 198int fpga_mgr_register(struct fpga_manager *mgr);
199void fpga_mgr_unregister(struct fpga_manager *mgr); 199void fpga_mgr_unregister(struct fpga_manager *mgr);
200 200
201struct fpga_manager *devm_fpga_mgr_create(struct device *dev, const char *name,
202 const struct fpga_manager_ops *mops,
203 void *priv);
204
201#endif /*_LINUX_FPGA_MGR_H */ 205#endif /*_LINUX_FPGA_MGR_H */