fpga: add managed create functions
cover fpga: add managed create functions
Hi Greg,
Please take these four patches that have been reviewed on the mailing list. They all apply and build cleanly on the current linux-next and char-misc-testing. The first 3 add managed create functions for the FPGA API. The fourth is documentation rework.
Alan
Alan Tull (4):
fpga: mgr: add devm_fpga_mgr_create
fpga: bridge: add devm_fpga_bridge_create
fpga: add devm_fpga_region_create
docs: fpga: document programming fpgas using regions
Documentation/driver-api/fpga/fpga-bridge.rst | 37 ++---- Documentation/driver-api/fpga/fpga-mgr.rst | 126 +++------------------ Documentation/driver-api/fpga/fpga-programming.rst | 107 +++++++++++++++++ Documentation/driver-api/fpga/fpga-region.rst | 91 +++++++-------- Documentation/driver-api/fpga/index.rst | 2 + Documentation/driver-api/fpga/intro.rst | 2 +- drivers/fpga/altera-cvp.c | 8 +- drivers/fpga/altera-fpga2sdram.c | 8 +- drivers/fpga/altera-freeze-bridge.c | 13 +-- drivers/fpga/altera-hps2fpga.c | 7 +- drivers/fpga/altera-pr-ip-core.c | 9 +- drivers/fpga/altera-ps-spi.c | 11 +- drivers/fpga/dfl-fme-br.c | 11 +- drivers/fpga/dfl-fme-mgr.c | 11 +- drivers/fpga/dfl-fme-region.c | 6 +- drivers/fpga/dfl.c | 6 +- drivers/fpga/fpga-bridge.c | 68 +++++++++-- drivers/fpga/fpga-mgr.c | 64 +++++++++-- drivers/fpga/fpga-region.c | 65 +++++++++-- drivers/fpga/ice40-spi.c | 10 +- drivers/fpga/machxo2-spi.c | 11 +- drivers/fpga/of-fpga-region.c | 6 +- drivers/fpga/socfpga-a10.c | 5 +- drivers/fpga/socfpga.c | 10 +- drivers/fpga/ts73xx-fpga.c | 11 +- drivers/fpga/xilinx-pr-decoupler.c | 4 +- drivers/fpga/xilinx-spi.c | 12 +- drivers/fpga/zynq-fpga.c | 5 +- include/linux/fpga/fpga-bridge.h | 4 + include/linux/fpga/fpga-mgr.h | 4 + include/linux/fpga/fpga-region.h | 4 + 31 files changed, 412 insertions(+), 326 deletions(-) create mode 100644 Documentation/driver-api/fpga/fpga-programming.rst
Signature · 1 line
2.7.4
PATCH 1/4 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 usedevm_fpga_mgr_create()
--- Documentation/driver-api/fpga/fpga-mgr.rst | 13 +++--- drivers/fpga/altera-cvp.c | 8 ++-- drivers/fpga/altera-pr-ip-core.c | 9 +---- drivers/fpga/altera-ps-spi.c | 11 ++--- drivers/fpga/dfl-fme-mgr.c | 11 ++--- drivers/fpga/fpga-mgr.c | 64 ++++++++++++++++++++++++++---- drivers/fpga/ice40-spi.c | 10 ++--- drivers/fpga/machxo2-spi.c | 11 ++--- drivers/fpga/socfpga-a10.c | 5 +-- drivers/fpga/socfpga.c | 10 ++--- drivers/fpga/ts73xx-fpga.c | 11 ++--- drivers/fpga/xilinx-spi.c | 12 ++---- drivers/fpga/zynq-fpga.c | 5 +-- include/linux/fpga/fpga-mgr.h | 4 ++ 14 files changed, 97 insertions(+), 87 deletions(-)
Documentation/driver-api/fpga/fpga-mgr.rst +6 -7
@@ -49,18 +49,14 @@ probe function calls fpga_mgr_register(), such as:: * them in priv */ - mgr = fpga_mgr_create(dev, "Altera SOCFPGA FPGA Manager", - &socfpga_fpga_ops, priv); + mgr = devm_fpga_mgr_create(dev, "Altera SOCFPGA FPGA Manager", + &socfpga_fpga_ops, priv); if (!mgr) return -ENOMEM; platform_set_drvdata(pdev, mgr); - ret = fpga_mgr_register(mgr); - if (ret) - fpga_mgr_free(mgr); - - return ret; + return fpga_mgr_register(mgr); } static int socfpga_fpga_remove(struct platform_device *pdev)
@@ -170,6 +166,9 @@ API for implementing a new FPGA Manager driver :functions: fpga_manager_ops .. kernel-doc:: drivers/fpga/fpga-mgr.c + :functions: devm_fpga_mgr_create + +.. kernel-doc:: drivers/fpga/fpga-mgr.c :functions: fpga_mgr_create .. kernel-doc:: drivers/fpga/fpga-mgr.c
drivers/fpga/altera-cvp.c +3 -5
@@ -453,8 +453,8 @@ static int altera_cvp_probe(struct pci_dev *pdev,snprintf (conf->mgr_name,sizeof (conf->mgr_name),"%s @%s" ,ALTERA_CVP_MGR_NAME ,pci_name (pdev)); - mgr =fpga_mgr_create (&pdev->dev, conf->mgr_name, - &altera_cvp_ops, conf); + mgr =devm_fpga_mgr_create (&pdev->dev, conf->mgr_name, + &altera_cvp_ops, conf);if (!mgr) { ret = -ENOMEM ; goto err_unmap;
@@ -463,10 +463,8 @@ static int altera_cvp_probe(struct pci_dev *pdev,pci_set_drvdata (pdev, mgr); ret =fpga_mgr_register (mgr); -if (ret) { -fpga_mgr_free (mgr); +if (ret) goto err_unmap; - } ret =driver_create_file (&altera_cvp_driver.driver, &driver_attr_chkcfg);
drivers/fpga/altera-pr-ip-core.c +2 -7
@@ -177,7 +177,6 @@ int alt_pr_register(struct device *dev, void __iomem *reg_base) {struct alt_pr_priv *priv;struct fpga_manager *mgr; -int ret;u32 val; priv =devm_kzalloc (dev,sizeof (*priv),GFP_KERNEL );
@@ -192,17 +191,13 @@ int alt_pr_register(struct device *dev, void __iomem *reg_base) (val &ALT_PR_CSR_STATUS_MSK ) >>ALT_PR_CSR_STATUS_SFT , (int)(val & ALT_PR_CSR_PR_START)); - mgr =fpga_mgr_create (dev,dev_name (dev), &alt_pr_ops, priv); + mgr =devm_fpga_mgr_create (dev,dev_name (dev), &alt_pr_ops, priv);if (!mgr)return -ENOMEM ;dev_set_drvdata (dev, mgr); - ret =fpga_mgr_register (mgr); -if (ret) -fpga_mgr_free (mgr); - -return ret; +return fpga_mgr_register (mgr); }EXPORT_SYMBOL_GPL (alt_pr_register);
drivers/fpga/altera-ps-spi.c +3 -8
@@ -239,7 +239,6 @@ static int altera_ps_probe(struct spi_device *spi)struct altera_ps_conf *conf;const struct of_device_id *of_id;struct fpga_manager *mgr; -int ret; conf =devm_kzalloc (&spi->dev,sizeof (*conf),GFP_KERNEL );if (!conf)
@@ -275,18 +274,14 @@ static int altera_ps_probe(struct spi_device *spi)snprintf (conf->mgr_name,sizeof (conf->mgr_name),"%s %s" ,dev_driver_string (&spi->dev),dev_name (&spi->dev)); - mgr =fpga_mgr_create (&spi->dev, conf->mgr_name, - &altera_ps_ops, conf); + mgr =devm_fpga_mgr_create (&spi->dev, conf->mgr_name, + &altera_ps_ops, conf);if (!mgr)return -ENOMEM ;spi_set_drvdata (spi, mgr); - ret =fpga_mgr_register (mgr); -if (ret) -fpga_mgr_free (mgr); - -return ret; +return fpga_mgr_register (mgr); }static int altera_ps_remove (struct spi_device *spi)
drivers/fpga/dfl-fme-mgr.c +3 -8
@@ -287,7 +287,6 @@ static int fme_mgr_probe(struct platform_device *pdev)struct fme_mgr_priv *priv;struct fpga_manager *mgr;struct resource *res; -int ret; priv =devm_kzalloc (dev,sizeof (*priv),GFP_KERNEL );if (!priv)
@@ -309,19 +308,15 @@ static int fme_mgr_probe(struct platform_device *pdev)fme_mgr_get_compat_id (priv->ioaddr, compat_id); - mgr =fpga_mgr_create (dev,"DFL FME FPGA Manager" , - &fme_mgr_ops, priv); + mgr =devm_fpga_mgr_create (dev,"DFL FME FPGA Manager" , + &fme_mgr_ops, priv);if (!mgr)return -ENOMEM ; mgr->compat_id = compat_id;platform_set_drvdata (pdev, mgr); - ret =fpga_mgr_register (mgr); -if (ret) -fpga_mgr_free (mgr); - -return ret; +return fpga_mgr_register (mgr); }static int fme_mgr_remove (struct platform_device *pdev)
drivers/fpga/fpga-mgr.c +56 -8
96 lines not on this page · raw message
drivers/fpga/ice40-spi.c +3 -7
@@ -175,18 +175,14 @@ static int ice40_fpga_probe(struct spi_device *spi)return ret; } - mgr =fpga_mgr_create (dev,"Lattice iCE40 FPGA Manager" , - &ice40_fpga_ops, priv); + mgr =devm_fpga_mgr_create (dev,"Lattice iCE40 FPGA Manager" , + &ice40_fpga_ops, priv);if (!mgr)return -ENOMEM ;spi_set_drvdata (spi, mgr); - ret =fpga_mgr_register (mgr); -if (ret) -fpga_mgr_free (mgr); - -return ret; +return fpga_mgr_register (mgr); }static int ice40_fpga_remove (struct spi_device *spi)
drivers/fpga/machxo2-spi.c +3 -8
@@ -356,25 +356,20 @@ static int machxo2_spi_probe(struct spi_device *spi) {struct device *dev = &spi->dev;struct fpga_manager *mgr; -int ret;if (spi->max_speed_hz >MACHXO2_MAX_SPEED ) {dev_err (dev,"Speed is too high\n" );return -EINVAL ; } - mgr =fpga_mgr_create (dev,"Lattice MachXO2 SPI FPGA Manager" , - &machxo2_ops, spi); + mgr =devm_fpga_mgr_create (dev,"Lattice MachXO2 SPI FPGA Manager" , + &machxo2_ops, spi);if (!mgr)return -ENOMEM ;spi_set_drvdata (spi, mgr); - ret =fpga_mgr_register (mgr); -if (ret) -fpga_mgr_free (mgr); - -return ret; +return fpga_mgr_register (mgr); }static int machxo2_spi_remove (struct spi_device *spi)
drivers/fpga/socfpga-a10.c +2 -3
@@ -508,8 +508,8 @@ static int socfpga_a10_fpga_probe(struct platform_device *pdev)return -EBUSY ; } - mgr =fpga_mgr_create (dev,"SoCFPGA Arria10 FPGA Manager" , - &socfpga_a10_fpga_mgr_ops, priv); + mgr =devm_fpga_mgr_create (dev,"SoCFPGA Arria10 FPGA Manager" , + &socfpga_a10_fpga_mgr_ops, priv);if (!mgr)return -ENOMEM ;
@@ -517,7 +517,6 @@ static int socfpga_a10_fpga_probe(struct platform_device *pdev) ret =fpga_mgr_register (mgr);if (ret) { -fpga_mgr_free (mgr);clk_disable_unprepare (priv->clk);return ret; }
drivers/fpga/socfpga.c +3 -7
@@ -571,18 +571,14 @@ static int socfpga_fpga_probe(struct platform_device *pdev)if (ret)return ret; - mgr =fpga_mgr_create (dev,"Altera SOCFPGA FPGA Manager" , - &socfpga_fpga_ops, priv); + mgr =devm_fpga_mgr_create (dev,"Altera SOCFPGA FPGA Manager" , + &socfpga_fpga_ops, priv);if (!mgr)return -ENOMEM ;platform_set_drvdata (pdev, mgr); - ret =fpga_mgr_register (mgr); -if (ret) -fpga_mgr_free (mgr); - -return ret; +return fpga_mgr_register (mgr); }static int socfpga_fpga_remove (struct platform_device *pdev)
drivers/fpga/ts73xx-fpga.c +3 -8
@@ -118,7 +118,6 @@ static int ts73xx_fpga_probe(struct platform_device *pdev)struct ts73xx_fpga_priv *priv;struct fpga_manager *mgr;struct resource *res; -int ret; priv =devm_kzalloc (kdev,sizeof (*priv),GFP_KERNEL );if (!priv)
@@ -133,18 +132,14 @@ static int ts73xx_fpga_probe(struct platform_device *pdev)return PTR_ERR (priv->io_base); } - mgr =fpga_mgr_create (kdev,"TS-73xx FPGA Manager" , - &ts73xx_fpga_ops, priv); + mgr =devm_fpga_mgr_create (kdev,"TS-73xx FPGA Manager" , + &ts73xx_fpga_ops, priv);if (!mgr)return -ENOMEM ;platform_set_drvdata (pdev, mgr); - ret =fpga_mgr_register (mgr); -if (ret) -fpga_mgr_free (mgr); - -return ret; +return fpga_mgr_register (mgr); }static int ts73xx_fpga_remove (struct platform_device *pdev)
drivers/fpga/xilinx-spi.c +4 -8
@@ -144,7 +144,6 @@ static int xilinx_spi_probe(struct spi_device *spi) {struct xilinx_spi_conf *conf;struct fpga_manager *mgr; -int ret; conf =devm_kzalloc (&spi->dev,sizeof (*conf),GFP_KERNEL );if (!conf)
@@ -167,18 +166,15 @@ static int xilinx_spi_probe(struct spi_device *spi)return PTR_ERR (conf->done); } - mgr =fpga_mgr_create (&spi->dev,"Xilinx Slave Serial FPGA Manager" , - &xilinx_spi_ops, conf); + mgr =devm_fpga_mgr_create (&spi->dev, +"Xilinx Slave Serial FPGA Manager" , + &xilinx_spi_ops, conf);if (!mgr)return -ENOMEM ;spi_set_drvdata (spi, mgr); - ret =fpga_mgr_register (mgr); -if (ret) -fpga_mgr_free (mgr); - -return ret; +return fpga_mgr_register (mgr); }static int xilinx_spi_remove (struct spi_device *spi)
drivers/fpga/zynq-fpga.c +2 -3
@@ -614,8 +614,8 @@ static int zynq_fpga_probe(struct platform_device *pdev)clk_disable (priv->clk); - mgr =fpga_mgr_create (dev,"Xilinx Zynq FPGA Manager" , - &zynq_fpga_ops, priv); + mgr =devm_fpga_mgr_create (dev,"Xilinx Zynq FPGA Manager" , + &zynq_fpga_ops, priv);if (!mgr)return -ENOMEM ;
@@ -624,7 +624,6 @@ static int zynq_fpga_probe(struct platform_device *pdev) err =fpga_mgr_register (mgr);if (err) {dev_err (dev,"unable to register FPGA manager\n" ); -fpga_mgr_free (mgr);clk_unprepare (priv->clk);return err; }
include/linux/fpga/fpga-mgr.h +4 -0
@@ -198,4 +198,8 @@ void fpga_mgr_free(struct fpga_manager *mgr);int fpga_mgr_register (struct fpga_manager *mgr);void fpga_mgr_unregister (struct fpga_manager *mgr); +struct fpga_manager *devm_fpga_mgr_create (struct device *dev,const char *name, +const struct fpga_manager_ops *mops, +void *priv); +#endif /*_LINUX_FPGA_MGR_H */
Signature · 1 line
2.7.4
PATCH 2/4 fpga: bridge: add devm_fpga_bridge_create
In reply to Alan TullAdd devm_fpga_bridge_create() which is the managed version of fpga_bridge_create().
Change current bridge drivers to usedevm_fpga_bridge_create().
--- Documentation/driver-api/fpga/fpga-bridge.rst | 3 ++ drivers/fpga/altera-fpga2sdram.c | 8 ++-- drivers/fpga/altera-freeze-bridge.c | 13 ++--- drivers/fpga/altera-hps2fpga.c | 7 ++- drivers/fpga/dfl-fme-br.c | 11 ++--- drivers/fpga/fpga-bridge.c | 68 +++++++++++++++++++++++---- drivers/fpga/xilinx-pr-decoupler.c | 4 +- include/linux/fpga/fpga-bridge.h | 4 ++ 8 files changed, 80 insertions(+), 38 deletions(-)
Documentation/driver-api/fpga/fpga-bridge.rst +3 -0
@@ -11,6 +11,9 @@ API to implement a new FPGA bridge :functions: fpga_bridge_ops .. kernel-doc:: drivers/fpga/fpga-bridge.c + :functions: devm_fpga_bridge_create + +.. kernel-doc:: drivers/fpga/fpga-bridge.c :functions: fpga_bridge_create .. kernel-doc:: drivers/fpga/fpga-bridge.c
drivers/fpga/altera-fpga2sdram.c +3 -5
@@ -121,18 +121,16 @@ static int alt_fpga_bridge_probe(struct platform_device *pdev)/* Get f2s bridge configuration saved in handoff register */ regmap_read (sysmgr,SYSMGR_ISWGRP_HANDOFF3 , &priv->mask); - br =fpga_bridge_create (dev,F2S_BRIDGE_NAME , - &altera_fpga2sdram_br_ops, priv); + br =devm_fpga_bridge_create (dev,F2S_BRIDGE_NAME , + &altera_fpga2sdram_br_ops, priv);if (!br)return -ENOMEM ;platform_set_drvdata (pdev, br); ret =fpga_bridge_register (br); -if (ret) { -fpga_bridge_free (br); +if (ret)return ret; - }dev_info (dev,"driver initialized with handoff %08x\n" , priv->mask);
drivers/fpga/altera-freeze-bridge.c +3 -10
@@ -213,7 +213,6 @@ static int altera_freeze_br_probe(struct platform_device *pdev)struct fpga_bridge *br;struct resource *res;u32 status, revision; -int ret;if (!np)return -ENODEV ;
@@ -245,20 +244,14 @@ static int altera_freeze_br_probe(struct platform_device *pdev) priv->base_addr = base_addr; - br =fpga_bridge_create (dev,FREEZE_BRIDGE_NAME , - &altera_freeze_br_br_ops, priv); + br =devm_fpga_bridge_create (dev,FREEZE_BRIDGE_NAME , + &altera_freeze_br_br_ops, priv);if (!br)return -ENOMEM ;platform_set_drvdata (pdev, br); - ret =fpga_bridge_register (br); -if (ret) { -fpga_bridge_free (br); -return ret; - } - -return 0 ; +return fpga_bridge_register (br); }static int altera_freeze_br_remove (struct platform_device *pdev)
drivers/fpga/altera-hps2fpga.c +3 -4
@@ -180,7 +180,8 @@ static int alt_fpga_bridge_probe(struct platform_device *pdev) } } - br =fpga_bridge_create (dev, priv->name, &altera_hps2fpga_br_ops, priv); + br =devm_fpga_bridge_create (dev, priv->name, + &altera_hps2fpga_br_ops, priv);if (!br) { ret = -ENOMEM ; goto err;
@@ -190,12 +191,10 @@ static int alt_fpga_bridge_probe(struct platform_device *pdev) ret =fpga_bridge_register (br);if (ret) - goto err_free; + goto err;return 0 ; -err_free: -fpga_bridge_free (br); err:clk_disable_unprepare (priv->clk);
drivers/fpga/dfl-fme-br.c +3 -8
@@ -61,7 +61,6 @@ static int fme_br_probe(struct platform_device *pdev)struct device *dev = &pdev->dev;struct fme_br_priv *priv;struct fpga_bridge *br; -int ret; priv =devm_kzalloc (dev,sizeof (*priv),GFP_KERNEL );if (!priv)
@@ -69,18 +68,14 @@ static int fme_br_probe(struct platform_device *pdev) priv->pdata =dev_get_platdata (dev); - br =fpga_bridge_create (dev,"DFL FPGA FME Bridge" , - &fme_bridge_ops, priv); + br =devm_fpga_bridge_create (dev,"DFL FPGA FME Bridge" , + &fme_bridge_ops, priv);if (!br)return -ENOMEM ;platform_set_drvdata (pdev, br); - ret =fpga_bridge_register (br); -if (ret) -fpga_bridge_free (br); - -return ret; +return fpga_bridge_register (br); }static int fme_br_remove (struct platform_device *pdev)
drivers/fpga/fpga-bridge.c +59 -9
99 lines not on this page · raw message
drivers/fpga/xilinx-pr-decoupler.c +2 -2
@@ -121,8 +121,8 @@ static int xlnx_pr_decoupler_probe(struct platform_device *pdev)clk_disable (priv->clk); - br =fpga_bridge_create (&pdev->dev,"Xilinx PR Decoupler" , - &xlnx_pr_decoupler_br_ops, priv); + br =devm_fpga_bridge_create (&pdev->dev,"Xilinx PR Decoupler" , + &xlnx_pr_decoupler_br_ops, priv);if (!br) { err = -ENOMEM ; goto err_clk;
include/linux/fpga/fpga-bridge.h +4 -0
@@ -69,4 +69,8 @@ void fpga_bridge_free(struct fpga_bridge *br);int fpga_bridge_register (struct fpga_bridge *br);void fpga_bridge_unregister (struct fpga_bridge *br); +struct fpga_bridge +*devm_fpga_bridge_create (struct device *dev,const char *name, +const struct fpga_bridge_ops *br_ops,void *priv); +#endif /* _LINUX_FPGA_BRIDGE_H */
Signature · 1 line
2.7.4
PATCH 3/4 fpga: add devm_fpga_region_create
In reply to Alan TullAdd devm_fpga_region_create() which is the managed version of fpga_region_create().
Change current region drivers to usedevm_fpga_region_create().
--- Documentation/driver-api/fpga/fpga-region.rst | 3 ++ drivers/fpga/dfl-fme-region.c | 6 +-- drivers/fpga/dfl.c | 6 +-- drivers/fpga/fpga-region.c | 65 +++++++++++++++++++++++---- drivers/fpga/of-fpga-region.c | 6 +-- include/linux/fpga/fpga-region.h | 4 ++ 6 files changed, 70 insertions(+), 20 deletions(-)
Documentation/driver-api/fpga/fpga-region.rst +3 -0
@@ -90,6 +90,9 @@ API to add a new FPGA region :functions: fpga_region .. kernel-doc:: drivers/fpga/fpga-region.c + :functions: devm_fpga_region_create + +.. kernel-doc:: drivers/fpga/fpga-region.c :functions: fpga_region_create .. kernel-doc:: drivers/fpga/fpga-region.c
drivers/fpga/dfl-fme-region.c +2 -4
@@ -39,7 +39,7 @@ static int fme_region_probe(struct platform_device *pdev)if (IS_ERR (mgr))return -EPROBE_DEFER ; - region =fpga_region_create (dev, mgr, fme_region_get_bridges); + region =devm_fpga_region_create (dev, mgr, fme_region_get_bridges);if (!region) { ret = -ENOMEM ; goto eprobe_mgr_put;
@@ -51,14 +51,12 @@ static int fme_region_probe(struct platform_device *pdev) ret =fpga_region_register (region);if (ret) - goto region_free; + goto eprobe_mgr_put;dev_dbg (dev,"DFL FME FPGA Region probed\n" );return 0 ; -region_free: -fpga_region_free (region); eprobe_mgr_put:fpga_mgr_put (mgr);return ret;
drivers/fpga/dfl.c +2 -4
@@ -899,7 +899,7 @@ dfl_fpga_feature_devs_enumerate(struct dfl_fpga_enum_info *info)if (!cdev)return ERR_PTR (-ENOMEM ); - cdev->region =fpga_region_create (info->dev,NULL ,NULL ); + cdev->region =devm_fpga_region_create (info->dev,NULL ,NULL );if (!cdev->region) { ret = -ENOMEM ; goto free_cdev_exit;
@@ -911,7 +911,7 @@ dfl_fpga_feature_devs_enumerate(struct dfl_fpga_enum_info *info) ret =fpga_region_register (cdev->region);if (ret) - goto free_region_exit; + goto free_cdev_exit;/* create and init build info for enumeration */ binfo =devm_kzalloc (info->dev,sizeof (*binfo),GFP_KERNEL );
@@ -942,8 +942,6 @@ dfl_fpga_feature_devs_enumerate(struct dfl_fpga_enum_info *info) unregister_region_exit:fpga_region_unregister (cdev->region); -free_region_exit: -fpga_region_free (cdev->region); free_cdev_exit:devm_kfree (info->dev, cdev);return ERR_PTR (ret);
drivers/fpga/fpga-region.c +57 -8
101 lines not on this page · raw message
drivers/fpga/of-fpga-region.c +2 -4
@@ -410,7 +410,7 @@ static int of_fpga_region_probe(struct platform_device *pdev)if (IS_ERR (mgr))return -EPROBE_DEFER ; - region =fpga_region_create (dev, mgr, of_fpga_region_get_bridges); + region =devm_fpga_region_create (dev, mgr, of_fpga_region_get_bridges);if (!region) { ret = -ENOMEM ; goto eprobe_mgr_put;
@@ -418,7 +418,7 @@ static int of_fpga_region_probe(struct platform_device *pdev) ret =fpga_region_register (region);if (ret) - goto eprobe_free; + goto eprobe_mgr_put;of_platform_populate (np, fpga_region_of_match,NULL , ®ion->dev);dev_set_drvdata (dev, region);
@@ -427,8 +427,6 @@ static int of_fpga_region_probe(struct platform_device *pdev)return 0 ; -eprobe_free: -fpga_region_free (region); eprobe_mgr_put:fpga_mgr_put (mgr);return ret;
include/linux/fpga/fpga-region.h +4 -0
@@ -44,4 +44,8 @@ void fpga_region_free(struct fpga_region *region);int fpga_region_register (struct fpga_region *region);void fpga_region_unregister (struct fpga_region *region); +struct fpga_region +*devm_fpga_region_create (struct device *dev,struct fpga_manager *mgr, +int (*get_bridges)(struct fpga_region *)); +#endif /* _FPGA_REGION_H */
Signature · 1 line
2.7.4
PATCH 4/4 docs: fpga: document programming fpgas using regions
In reply to Alan TullClarify the intention that interfaces and upper layers use regions rather than managers directly.
Rearrange API documentation to better group the API functions used to create FPGA mgr/bridge/regions and the API used for programming FPGAs.
--- Documentation/driver-api/fpga/fpga-bridge.rst | 38 ++----- Documentation/driver-api/fpga/fpga-mgr.rst | 117 ++------------------- Documentation/driver-api/fpga/fpga-programming.rst | 107 +++++++++++++++++++ Documentation/driver-api/fpga/fpga-region.rst | 92 ++++++++-------- Documentation/driver-api/fpga/index.rst | 2 + Documentation/driver-api/fpga/intro.rst | 2 +- 6 files changed, 171 insertions(+), 187 deletions(-) create mode 100644 Documentation/driver-api/fpga/fpga-programming.rst
Documentation/driver-api/fpga/fpga-bridge.rst +6 -32
@@ -4,6 +4,12 @@ FPGA Bridge API to implement a new FPGA bridge ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +* struct :c:type:`fpga_bridge` — The FPGA Bridge structure +* struct :c:type:`fpga_bridge_ops` — Low level Bridge driver ops +* :c:func:`devm_fpga_bridge_create()` — Allocate and init a bridge struct +* :c:func:`fpga_bridge_register()` — Register a bridge +* :c:func:`fpga_bridge_unregister()` — Unregister a bridge + .. kernel-doc:: include/linux/fpga/fpga-bridge.h :functions: fpga_bridge
@@ -14,39 +20,7 @@ API to implement a new FPGA bridge :functions: devm_fpga_bridge_create .. kernel-doc:: drivers/fpga/fpga-bridge.c - :functions: fpga_bridge_create - -.. kernel-doc:: drivers/fpga/fpga-bridge.c - :functions: fpga_bridge_free - -.. kernel-doc:: drivers/fpga/fpga-bridge.c :functions: fpga_bridge_register .. kernel-doc:: drivers/fpga/fpga-bridge.c :functions: fpga_bridge_unregister - -API to control an FPGA bridge -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You probably won't need these directly. FPGA regions should handle this. - -.. kernel-doc:: drivers/fpga/fpga-bridge.c - :functions: of_fpga_bridge_get - -.. kernel-doc:: drivers/fpga/fpga-bridge.c - :functions: fpga_bridge_get - -.. kernel-doc:: drivers/fpga/fpga-bridge.c - :functions: fpga_bridge_put - -.. kernel-doc:: drivers/fpga/fpga-bridge.c - :functions: fpga_bridge_get_to_list - -.. kernel-doc:: drivers/fpga/fpga-bridge.c - :functions: of_fpga_bridge_get_to_list - -.. kernel-doc:: drivers/fpga/fpga-bridge.c - :functions: fpga_bridge_enable - -.. kernel-doc:: drivers/fpga/fpga-bridge.c - :functions: fpga_bridge_disable
Documentation/driver-api/fpga/fpga-mgr.rst +10 -107
133 lines not on this page · raw message
Documentation/driver-api/fpga/fpga-programming.rst new file +107 -0
107 lines not on this page · raw message
Documentation/driver-api/fpga/fpga-region.rst +45 -47
114 lines not on this page · raw message
Documentation/driver-api/fpga/index.rst +2 -0
@@ -11,3 +11,5 @@ FPGA Subsystem fpga-mgr fpga-bridge fpga-region + fpga-programming +
Documentation/driver-api/fpga/intro.rst +1 -1
@@ -44,7 +44,7 @@ FPGA Region ----------- If you are adding a new interface to the FPGA framework, add it on top -of an FPGA region to allow the most reuse of your interface. +of an FPGA region. The FPGA Region framework (fpga-region.c) associates managers and bridges as reconfigurable regions. A region may refer to the whole
Signature · 1 line
2.7.4