Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

fpga: manager: change api, don't use drvdata

Change fpga_mgr_register to not set or use drvdata. This supports
the case where a PCIe device has more than one manager.

Add fpga_mgr_create/free functions. Change fpga_mgr_register and
fpga_mgr_unregister functions to take the mgr struct as their only
parameter.

struct fpga_manager *fpga_mgr_create(struct device *dev,
const char *name,
const struct fpga_manager_ops *mops,
void *priv);
void fpga_mgr_free(struct fpga_manager *mgr);
int fpga_mgr_register(struct fpga_manager *mgr);
void fpga_mgr_unregister(struct fpga_manager *mgr);

Update the drivers that call fpga_mgr_register with the new API.

Signed-off-by: Alan Tull <atull@kernel.org>
[Moritz: Fixup whitespace issue]
Reported-by: Jiuyue Ma <majiuyue@huawei.com>
Signed-off-by: Moritz Fischer <mdf@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Alan Tull and committed by
Greg Kroah-Hartman
7085e2a9 bbaa9cd3

+237 -71
+27 -8
Documentation/fpga/fpga-mgr.txt
··· 63 63 attempting to program the FPGA. Likewise, the user should call 64 64 fpga_mgr_unlock when done programming the FPGA. 65 65 66 + To alloc/free a FPGA manager struct: 67 + ------------------------------------ 68 + 69 + struct fpga_manager *fpga_mgr_create(struct device *dev, 70 + const char *name, 71 + const struct fpga_manager_ops *mops, 72 + void *priv); 73 + void fpga_mgr_free(struct fpga_manager *mgr); 66 74 67 75 To register or unregister the low level FPGA-specific driver: 68 76 ------------------------------------------------------------- 69 77 70 - int fpga_mgr_register(struct device *dev, const char *name, 71 - const struct fpga_manager_ops *mops, 72 - void *priv); 78 + int fpga_mgr_register(struct fpga_manager *mgr); 73 79 74 - void fpga_mgr_unregister(struct device *dev); 80 + void fpga_mgr_unregister(struct fpga_manager *mgr); 75 81 76 - Use of these two functions is described below in "How To Support a new FPGA 82 + Use of these functions is described below in "How To Support a new FPGA 77 83 device." 78 84 79 85 ··· 154 148 { 155 149 struct device *dev = &pdev->dev; 156 150 struct socfpga_fpga_priv *priv; 151 + struct fpga_manager *mgr; 157 152 int ret; 158 153 159 154 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); ··· 164 157 /* ... do ioremaps, get interrupts, etc. and save 165 158 them in priv... */ 166 159 167 - return fpga_mgr_register(dev, "Altera SOCFPGA FPGA Manager", 168 - &socfpga_fpga_ops, priv); 160 + mgr = fpga_mgr_create(dev, "Altera SOCFPGA FPGA Manager", 161 + &socfpga_fpga_ops, priv); 162 + if (!mgr) 163 + return -ENOMEM; 164 + 165 + platform_set_drvdata(pdev, mgr); 166 + 167 + ret = fpga_mgr_register(mgr); 168 + if (ret) 169 + fpga_mgr_free(mgr); 170 + 171 + return ret; 169 172 } 170 173 171 174 static int socfpga_fpga_remove(struct platform_device *pdev) 172 175 { 173 - fpga_mgr_unregister(&pdev->dev); 176 + struct fpga_manager *mgr = platform_get_drvdata(pdev); 177 + 178 + fpga_mgr_unregister(mgr); 174 179 175 180 return 0; 176 181 }
+14 -5
drivers/fpga/altera-cvp.c
··· 401 401 const struct pci_device_id *dev_id) 402 402 { 403 403 struct altera_cvp_conf *conf; 404 + struct fpga_manager *mgr; 404 405 u16 cmd, val; 405 406 int ret; 406 407 ··· 453 452 snprintf(conf->mgr_name, sizeof(conf->mgr_name), "%s @%s", 454 453 ALTERA_CVP_MGR_NAME, pci_name(pdev)); 455 454 456 - ret = fpga_mgr_register(&pdev->dev, conf->mgr_name, 457 - &altera_cvp_ops, conf); 458 - if (ret) 455 + mgr = fpga_mgr_create(&pdev->dev, conf->mgr_name, 456 + &altera_cvp_ops, conf); 457 + if (!mgr) 458 + return -ENOMEM; 459 + 460 + pci_set_drvdata(pdev, mgr); 461 + 462 + ret = fpga_mgr_register(mgr); 463 + if (ret) { 464 + fpga_mgr_free(mgr); 459 465 goto err_unmap; 466 + } 460 467 461 468 ret = driver_create_file(&altera_cvp_driver.driver, 462 469 &driver_attr_chkcfg); 463 470 if (ret) { 464 471 dev_err(&pdev->dev, "Can't create sysfs chkcfg file\n"); 465 - fpga_mgr_unregister(&pdev->dev); 472 + fpga_mgr_unregister(mgr); 466 473 goto err_unmap; 467 474 } 468 475 ··· 492 483 u16 cmd; 493 484 494 485 driver_remove_file(&altera_cvp_driver.driver, &driver_attr_chkcfg); 495 - fpga_mgr_unregister(&pdev->dev); 486 + fpga_mgr_unregister(mgr); 496 487 pci_iounmap(pdev, conf->map); 497 488 pci_release_region(pdev, CVP_BAR); 498 489 pci_read_config_word(pdev, PCI_COMMAND, &cmd);
+16 -2
drivers/fpga/altera-pr-ip-core.c
··· 187 187 int alt_pr_register(struct device *dev, void __iomem *reg_base) 188 188 { 189 189 struct alt_pr_priv *priv; 190 + struct fpga_manager *mgr; 191 + int ret; 190 192 u32 val; 191 193 192 194 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); ··· 203 201 (val & ALT_PR_CSR_STATUS_MSK) >> ALT_PR_CSR_STATUS_SFT, 204 202 (int)(val & ALT_PR_CSR_PR_START)); 205 203 206 - return fpga_mgr_register(dev, dev_name(dev), &alt_pr_ops, priv); 204 + mgr = fpga_mgr_create(dev, dev_name(dev), &alt_pr_ops, priv); 205 + if (!mgr) 206 + return -ENOMEM; 207 + 208 + dev_set_drvdata(dev, mgr); 209 + 210 + ret = fpga_mgr_register(mgr); 211 + if (ret) 212 + fpga_mgr_free(mgr); 213 + 214 + return ret; 207 215 } 208 216 EXPORT_SYMBOL_GPL(alt_pr_register); 209 217 210 218 int alt_pr_unregister(struct device *dev) 211 219 { 220 + struct fpga_manager *mgr = dev_get_drvdata(dev); 221 + 212 222 dev_dbg(dev, "%s\n", __func__); 213 223 214 - fpga_mgr_unregister(dev); 224 + fpga_mgr_unregister(mgr); 215 225 216 226 return 0; 217 227 }
+17 -3
drivers/fpga/altera-ps-spi.c
··· 238 238 { 239 239 struct altera_ps_conf *conf; 240 240 const struct of_device_id *of_id; 241 + struct fpga_manager *mgr; 242 + int ret; 241 243 242 244 conf = devm_kzalloc(&spi->dev, sizeof(*conf), GFP_KERNEL); 243 245 if (!conf) ··· 275 273 snprintf(conf->mgr_name, sizeof(conf->mgr_name), "%s %s", 276 274 dev_driver_string(&spi->dev), dev_name(&spi->dev)); 277 275 278 - return fpga_mgr_register(&spi->dev, conf->mgr_name, 279 - &altera_ps_ops, conf); 276 + mgr = fpga_mgr_create(&spi->dev, conf->mgr_name, 277 + &altera_ps_ops, conf); 278 + if (!mgr) 279 + return -ENOMEM; 280 + 281 + spi_set_drvdata(spi, mgr); 282 + 283 + ret = fpga_mgr_register(mgr); 284 + if (ret) 285 + fpga_mgr_free(mgr); 286 + 287 + return ret; 280 288 } 281 289 282 290 static int altera_ps_remove(struct spi_device *spi) 283 291 { 284 - fpga_mgr_unregister(&spi->dev); 292 + struct fpga_manager *mgr = spi_get_drvdata(spi); 293 + 294 + fpga_mgr_unregister(mgr); 285 295 286 296 return 0; 287 297 }
+52 -26
drivers/fpga/fpga-mgr.c
··· 515 515 EXPORT_SYMBOL_GPL(fpga_mgr_unlock); 516 516 517 517 /** 518 - * fpga_mgr_register - register a low level fpga manager driver 518 + * fpga_mgr_create - create and initialize a FPGA manager struct 519 519 * @dev: fpga manager device from pdev 520 520 * @name: fpga manager name 521 521 * @mops: pointer to structure of fpga manager ops 522 522 * @priv: fpga manager private data 523 523 * 524 - * Return: 0 on success, negative error code otherwise. 524 + * Return: pointer to struct fpga_manager or NULL 525 525 */ 526 - int fpga_mgr_register(struct device *dev, const char *name, 527 - const struct fpga_manager_ops *mops, 528 - void *priv) 526 + struct fpga_manager *fpga_mgr_create(struct device *dev, const char *name, 527 + const struct fpga_manager_ops *mops, 528 + void *priv) 529 529 { 530 530 struct fpga_manager *mgr; 531 531 int id, ret; ··· 534 534 !mops->write_init || (!mops->write && !mops->write_sg) || 535 535 (mops->write && mops->write_sg)) { 536 536 dev_err(dev, "Attempt to register without fpga_manager_ops\n"); 537 - return -EINVAL; 537 + return NULL; 538 538 } 539 539 540 540 if (!name || !strlen(name)) { 541 541 dev_err(dev, "Attempt to register with no name!\n"); 542 - return -EINVAL; 542 + return NULL; 543 543 } 544 544 545 545 mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); 546 546 if (!mgr) 547 - return -ENOMEM; 547 + return NULL; 548 548 549 549 id = ida_simple_get(&fpga_mgr_ida, 0, 0, GFP_KERNEL); 550 550 if (id < 0) { ··· 558 558 mgr->mops = mops; 559 559 mgr->priv = priv; 560 560 561 - /* 562 - * Initialize framework state by requesting low level driver read state 563 - * from device. FPGA may be in reset mode or may have been programmed 564 - * by bootloader or EEPROM. 565 - */ 566 - mgr->state = mgr->mops->state(mgr); 567 - 568 561 device_initialize(&mgr->dev); 569 562 mgr->dev.class = fpga_mgr_class; 570 563 mgr->dev.groups = mops->groups; 571 564 mgr->dev.parent = dev; 572 565 mgr->dev.of_node = dev->of_node; 573 566 mgr->dev.id = id; 574 - dev_set_drvdata(dev, mgr); 575 567 576 568 ret = dev_set_name(&mgr->dev, "fpga%d", id); 577 569 if (ret) 578 570 goto error_device; 571 + 572 + return mgr; 573 + 574 + error_device: 575 + ida_simple_remove(&fpga_mgr_ida, id); 576 + error_kfree: 577 + kfree(mgr); 578 + 579 + return NULL; 580 + } 581 + EXPORT_SYMBOL_GPL(fpga_mgr_create); 582 + 583 + /** 584 + * fpga_mgr_free - deallocate a FPGA manager 585 + * @mgr: fpga manager struct created by fpga_mgr_create 586 + */ 587 + void fpga_mgr_free(struct fpga_manager *mgr) 588 + { 589 + ida_simple_remove(&fpga_mgr_ida, mgr->dev.id); 590 + kfree(mgr); 591 + } 592 + EXPORT_SYMBOL_GPL(fpga_mgr_free); 593 + 594 + /** 595 + * fpga_mgr_register - register a FPGA manager 596 + * @mgr: fpga manager struct created by fpga_mgr_create 597 + * 598 + * Return: 0 on success, negative error code otherwise. 599 + */ 600 + int fpga_mgr_register(struct fpga_manager *mgr) 601 + { 602 + int ret; 603 + 604 + /* 605 + * Initialize framework state by requesting low level driver read state 606 + * from device. FPGA may be in reset mode or may have been programmed 607 + * by bootloader or EEPROM. 608 + */ 609 + mgr->state = mgr->mops->state(mgr); 579 610 580 611 ret = device_add(&mgr->dev); 581 612 if (ret) ··· 617 586 return 0; 618 587 619 588 error_device: 620 - ida_simple_remove(&fpga_mgr_ida, id); 621 - error_kfree: 622 - kfree(mgr); 589 + ida_simple_remove(&fpga_mgr_ida, mgr->dev.id); 623 590 624 591 return ret; 625 592 } 626 593 EXPORT_SYMBOL_GPL(fpga_mgr_register); 627 594 628 595 /** 629 - * fpga_mgr_unregister - unregister a low level fpga manager driver 630 - * @dev: fpga manager device from pdev 596 + * fpga_mgr_unregister - unregister a FPGA manager 597 + * @mgr: fpga manager struct 631 598 */ 632 - void fpga_mgr_unregister(struct device *dev) 599 + void fpga_mgr_unregister(struct fpga_manager *mgr) 633 600 { 634 - struct fpga_manager *mgr = dev_get_drvdata(dev); 635 - 636 601 dev_info(&mgr->dev, "%s %s\n", __func__, mgr->name); 637 602 638 603 /* ··· 646 619 { 647 620 struct fpga_manager *mgr = to_fpga_manager(dev); 648 621 649 - ida_simple_remove(&fpga_mgr_ida, mgr->dev.id); 650 - kfree(mgr); 622 + fpga_mgr_free(mgr); 651 623 } 652 624 653 625 static int __init fpga_mgr_class_init(void)
+17 -4
drivers/fpga/ice40-spi.c
··· 133 133 { 134 134 struct device *dev = &spi->dev; 135 135 struct ice40_fpga_priv *priv; 136 + struct fpga_manager *mgr; 136 137 int ret; 137 138 138 139 priv = devm_kzalloc(&spi->dev, sizeof(*priv), GFP_KERNEL); ··· 175 174 return ret; 176 175 } 177 176 178 - /* Register with the FPGA manager */ 179 - return fpga_mgr_register(dev, "Lattice iCE40 FPGA Manager", 180 - &ice40_fpga_ops, priv); 177 + mgr = fpga_mgr_create(dev, "Lattice iCE40 FPGA Manager", 178 + &ice40_fpga_ops, priv); 179 + if (!mgr) 180 + return -ENOMEM; 181 + 182 + spi_set_drvdata(spi, mgr); 183 + 184 + ret = fpga_mgr_register(mgr); 185 + if (ret) 186 + fpga_mgr_free(mgr); 187 + 188 + return ret; 181 189 } 182 190 183 191 static int ice40_fpga_remove(struct spi_device *spi) 184 192 { 185 - fpga_mgr_unregister(&spi->dev); 193 + struct fpga_manager *mgr = spi_get_drvdata(spi); 194 + 195 + fpga_mgr_unregister(mgr); 196 + 186 197 return 0; 187 198 } 188 199
+16 -4
drivers/fpga/machxo2-spi.c
··· 355 355 static int machxo2_spi_probe(struct spi_device *spi) 356 356 { 357 357 struct device *dev = &spi->dev; 358 + struct fpga_manager *mgr; 359 + int ret; 358 360 359 361 if (spi->max_speed_hz > MACHXO2_MAX_SPEED) { 360 362 dev_err(dev, "Speed is too high\n"); 361 363 return -EINVAL; 362 364 } 363 365 364 - return fpga_mgr_register(dev, "Lattice MachXO2 SPI FPGA Manager", 365 - &machxo2_ops, spi); 366 + mgr = fpga_mgr_create(dev, "Lattice MachXO2 SPI FPGA Manager", 367 + &machxo2_ops, spi); 368 + if (!mgr) 369 + return -ENOMEM; 370 + 371 + spi_set_drvdata(spi, mgr); 372 + 373 + ret = fpga_mgr_register(mgr); 374 + if (ret) 375 + fpga_mgr_free(mgr); 376 + 377 + return ret; 366 378 } 367 379 368 380 static int machxo2_spi_remove(struct spi_device *spi) 369 381 { 370 - struct device *dev = &spi->dev; 382 + struct fpga_manager *mgr = spi_get_drvdata(spi); 371 383 372 - fpga_mgr_unregister(dev); 384 + fpga_mgr_unregister(mgr); 373 385 374 386 return 0; 375 387 }
+11 -3
drivers/fpga/socfpga-a10.c
··· 482 482 struct device *dev = &pdev->dev; 483 483 struct a10_fpga_priv *priv; 484 484 void __iomem *reg_base; 485 + struct fpga_manager *mgr; 485 486 struct resource *res; 486 487 int ret; 487 488 ··· 520 519 return -EBUSY; 521 520 } 522 521 523 - ret = fpga_mgr_register(dev, "SoCFPGA Arria10 FPGA Manager", 524 - &socfpga_a10_fpga_mgr_ops, priv); 522 + mgr = fpga_mgr_create(dev, "SoCFPGA Arria10 FPGA Manager", 523 + &socfpga_a10_fpga_mgr_ops, priv); 524 + if (!mgr) 525 + return -ENOMEM; 526 + 527 + platform_set_drvdata(pdev, mgr); 528 + 529 + ret = fpga_mgr_register(mgr); 525 530 if (ret) { 531 + fpga_mgr_free(mgr); 526 532 clk_disable_unprepare(priv->clk); 527 533 return ret; 528 534 } ··· 542 534 struct fpga_manager *mgr = platform_get_drvdata(pdev); 543 535 struct a10_fpga_priv *priv = mgr->priv; 544 536 545 - fpga_mgr_unregister(&pdev->dev); 537 + fpga_mgr_unregister(mgr); 546 538 clk_disable_unprepare(priv->clk); 547 539 548 540 return 0;
+16 -3
drivers/fpga/socfpga.c
··· 555 555 { 556 556 struct device *dev = &pdev->dev; 557 557 struct socfpga_fpga_priv *priv; 558 + struct fpga_manager *mgr; 558 559 struct resource *res; 559 560 int ret; 560 561 ··· 582 581 if (ret) 583 582 return ret; 584 583 585 - return fpga_mgr_register(dev, "Altera SOCFPGA FPGA Manager", 586 - &socfpga_fpga_ops, priv); 584 + mgr = fpga_mgr_create(dev, "Altera SOCFPGA FPGA Manager", 585 + &socfpga_fpga_ops, priv); 586 + if (!mgr) 587 + return -ENOMEM; 588 + 589 + platform_set_drvdata(pdev, mgr); 590 + 591 + ret = fpga_mgr_register(mgr); 592 + if (ret) 593 + fpga_mgr_free(mgr); 594 + 595 + return ret; 587 596 } 588 597 589 598 static int socfpga_fpga_remove(struct platform_device *pdev) 590 599 { 591 - fpga_mgr_unregister(&pdev->dev); 600 + struct fpga_manager *mgr = platform_get_drvdata(pdev); 601 + 602 + fpga_mgr_unregister(mgr); 592 603 593 604 return 0; 594 605 }
+17 -3
drivers/fpga/ts73xx-fpga.c
··· 116 116 { 117 117 struct device *kdev = &pdev->dev; 118 118 struct ts73xx_fpga_priv *priv; 119 + struct fpga_manager *mgr; 119 120 struct resource *res; 121 + int ret; 120 122 121 123 priv = devm_kzalloc(kdev, sizeof(*priv), GFP_KERNEL); 122 124 if (!priv) ··· 133 131 return PTR_ERR(priv->io_base); 134 132 } 135 133 136 - return fpga_mgr_register(kdev, "TS-73xx FPGA Manager", 137 - &ts73xx_fpga_ops, priv); 134 + mgr = fpga_mgr_create(kdev, "TS-73xx FPGA Manager", 135 + &ts73xx_fpga_ops, priv); 136 + if (!mgr) 137 + return -ENOMEM; 138 + 139 + platform_set_drvdata(pdev, mgr); 140 + 141 + ret = fpga_mgr_register(mgr); 142 + if (ret) 143 + fpga_mgr_free(mgr); 144 + 145 + return ret; 138 146 } 139 147 140 148 static int ts73xx_fpga_remove(struct platform_device *pdev) 141 149 { 142 - fpga_mgr_unregister(&pdev->dev); 150 + struct fpga_manager *mgr = platform_get_drvdata(pdev); 151 + 152 + fpga_mgr_unregister(mgr); 143 153 144 154 return 0; 145 155 }
+17 -3
drivers/fpga/xilinx-spi.c
··· 143 143 static int xilinx_spi_probe(struct spi_device *spi) 144 144 { 145 145 struct xilinx_spi_conf *conf; 146 + struct fpga_manager *mgr; 147 + int ret; 146 148 147 149 conf = devm_kzalloc(&spi->dev, sizeof(*conf), GFP_KERNEL); 148 150 if (!conf) ··· 167 165 return PTR_ERR(conf->done); 168 166 } 169 167 170 - return fpga_mgr_register(&spi->dev, "Xilinx Slave Serial FPGA Manager", 171 - &xilinx_spi_ops, conf); 168 + mgr = fpga_mgr_create(&spi->dev, "Xilinx Slave Serial FPGA Manager", 169 + &xilinx_spi_ops, conf); 170 + if (!mgr) 171 + return -ENOMEM; 172 + 173 + spi_set_drvdata(spi, mgr); 174 + 175 + ret = fpga_mgr_register(mgr); 176 + if (ret) 177 + fpga_mgr_free(mgr); 178 + 179 + return ret; 172 180 } 173 181 174 182 static int xilinx_spi_remove(struct spi_device *spi) 175 183 { 176 - fpga_mgr_unregister(&spi->dev); 184 + struct fpga_manager *mgr = spi_get_drvdata(spi); 185 + 186 + fpga_mgr_unregister(mgr); 177 187 178 188 return 0; 179 189 }
+11 -3
drivers/fpga/zynq-fpga.c
··· 558 558 { 559 559 struct device *dev = &pdev->dev; 560 560 struct zynq_fpga_priv *priv; 561 + struct fpga_manager *mgr; 561 562 struct resource *res; 562 563 int err; 563 564 ··· 614 613 615 614 clk_disable(priv->clk); 616 615 617 - err = fpga_mgr_register(dev, "Xilinx Zynq FPGA Manager", 618 - &zynq_fpga_ops, priv); 616 + mgr = fpga_mgr_create(dev, "Xilinx Zynq FPGA Manager", 617 + &zynq_fpga_ops, priv); 618 + if (!mgr) 619 + return -ENOMEM; 620 + 621 + platform_set_drvdata(pdev, mgr); 622 + 623 + err = fpga_mgr_register(mgr); 619 624 if (err) { 620 625 dev_err(dev, "unable to register FPGA manager\n"); 626 + fpga_mgr_free(mgr); 621 627 clk_unprepare(priv->clk); 622 628 return err; 623 629 } ··· 640 632 mgr = platform_get_drvdata(pdev); 641 633 priv = mgr->priv; 642 634 643 - fpga_mgr_unregister(&pdev->dev); 635 + fpga_mgr_unregister(mgr); 644 636 645 637 clk_unprepare(priv->clk); 646 638
+6 -4
include/linux/fpga/fpga-mgr.h
··· 170 170 171 171 void fpga_mgr_put(struct fpga_manager *mgr); 172 172 173 - int fpga_mgr_register(struct device *dev, const char *name, 174 - const struct fpga_manager_ops *mops, void *priv); 175 - 176 - void fpga_mgr_unregister(struct device *dev); 173 + struct fpga_manager *fpga_mgr_create(struct device *dev, const char *name, 174 + const struct fpga_manager_ops *mops, 175 + void *priv); 176 + void fpga_mgr_free(struct fpga_manager *mgr); 177 + int fpga_mgr_register(struct fpga_manager *mgr); 178 + void fpga_mgr_unregister(struct fpga_manager *mgr); 177 179 178 180 #endif /*_LINUX_FPGA_MGR_H */