Skip to content

Commit 4ba0b2c

Browse files
Russ Weightmfischer
authored andcommitted
fpga: mgr: Use standard dev_release for class driver
The FPGA manager class driver data structure is being treated as a managed resource instead of using the standard dev_release call-back function to release the class data structure. This change removes the managed resource code for the freeing of the class data structure and combines the create() and register() functions into a single register() or register_full() function. The register_full() function accepts an info data structure to provide flexibility in passing optional parameters. The register() function supports the current parameter list for users that don't require the use of optional parameters. The devm_fpga_mgr_register() function is retained, and the devm_fpga_mgr_register_full() function is added. Signed-off-by: Russ Weight <russell.h.weight@intel.com> Reviewed-by: Xu Yilun <yilun.xu@intel.com> Acked-by: Xu Yilun <yilun.xu@intel.com> Signed-off-by: Moritz Fischer <mdf@kernel.org>
1 parent fa55b7d commit 4ba0b2c

File tree

17 files changed

+217
-261
lines changed

17 files changed

+217
-261
lines changed

Documentation/driver-api/fpga/fpga-mgr.rst

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ How to support a new FPGA device
2424
--------------------------------
2525

2626
To add another FPGA manager, write a driver that implements a set of ops. The
27-
probe function calls fpga_mgr_register(), such as::
27+
probe function calls fpga_mgr_register() or fpga_mgr_register_full(), such as::
2828

2929
static const struct fpga_manager_ops socfpga_fpga_ops = {
3030
.write_init = socfpga_fpga_ops_configure_init,
@@ -49,14 +49,14 @@ probe function calls fpga_mgr_register(), such as::
4949
* them in priv
5050
*/
5151

52-
mgr = devm_fpga_mgr_create(dev, "Altera SOCFPGA FPGA Manager",
53-
&socfpga_fpga_ops, priv);
54-
if (!mgr)
55-
return -ENOMEM;
52+
mgr = fpga_mgr_register(dev, "Altera SOCFPGA FPGA Manager",
53+
&socfpga_fpga_ops, priv);
54+
if (IS_ERR(mgr))
55+
return PTR_ERR(mgr);
5656

5757
platform_set_drvdata(pdev, mgr);
5858

59-
return fpga_mgr_register(mgr);
59+
return 0;
6060
}
6161

6262
static int socfpga_fpga_remove(struct platform_device *pdev)
@@ -68,6 +68,11 @@ probe function calls fpga_mgr_register(), such as::
6868
return 0;
6969
}
7070

71+
Alternatively, the probe function could call one of the resource managed
72+
register functions, devm_fpga_mgr_register() or devm_fpga_mgr_register_full().
73+
When these functions are used, the parameter syntax is the same, but the call
74+
to fpga_mgr_unregister() should be removed. In the above example, the
75+
socfpga_fpga_remove() function would not be required.
7176

7277
The ops will implement whatever device specific register writes are needed to
7378
do the programming sequence for this particular FPGA. These ops return 0 for
@@ -104,8 +109,14 @@ API for implementing a new FPGA Manager driver
104109
* ``fpga_mgr_states`` - Values for :c:expr:`fpga_manager->state`.
105110
* struct fpga_manager - the FPGA manager struct
106111
* struct fpga_manager_ops - Low level FPGA manager driver ops
107-
* devm_fpga_mgr_create() - Allocate and init a manager struct
108-
* fpga_mgr_register() - Register an FPGA manager
112+
* struct fpga_manager_info - Parameter structure for fpga_mgr_register_full()
113+
* fpga_mgr_register_full() - Create and register an FPGA manager using the
114+
fpga_mgr_info structure to provide the full flexibility of options
115+
* fpga_mgr_register() - Create and register an FPGA manager using standard
116+
arguments
117+
* devm_fpga_mgr_register_full() - Resource managed version of
118+
fpga_mgr_register_full()
119+
* devm_fpga_mgr_register() - Resource managed version of fpga_mgr_register()
109120
* fpga_mgr_unregister() - Unregister an FPGA manager
110121

111122
.. kernel-doc:: include/linux/fpga/fpga-mgr.h
@@ -117,11 +128,20 @@ API for implementing a new FPGA Manager driver
117128
.. kernel-doc:: include/linux/fpga/fpga-mgr.h
118129
:functions: fpga_manager_ops
119130

131+
.. kernel-doc:: include/linux/fpga/fpga-mgr.h
132+
:functions: fpga_manager_info
133+
120134
.. kernel-doc:: drivers/fpga/fpga-mgr.c
121-
:functions: devm_fpga_mgr_create
135+
:functions: fpga_mgr_register_full
122136

123137
.. kernel-doc:: drivers/fpga/fpga-mgr.c
124138
:functions: fpga_mgr_register
125139

140+
.. kernel-doc:: drivers/fpga/fpga-mgr.c
141+
:functions: devm_fpga_mgr_register_full
142+
143+
.. kernel-doc:: drivers/fpga/fpga-mgr.c
144+
:functions: devm_fpga_mgr_register
145+
126146
.. kernel-doc:: drivers/fpga/fpga-mgr.c
127147
:functions: fpga_mgr_unregister

drivers/fpga/altera-cvp.c

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -652,19 +652,15 @@ static int altera_cvp_probe(struct pci_dev *pdev,
652652
snprintf(conf->mgr_name, sizeof(conf->mgr_name), "%s @%s",
653653
ALTERA_CVP_MGR_NAME, pci_name(pdev));
654654

655-
mgr = devm_fpga_mgr_create(&pdev->dev, conf->mgr_name,
656-
&altera_cvp_ops, conf);
657-
if (!mgr) {
658-
ret = -ENOMEM;
655+
mgr = fpga_mgr_register(&pdev->dev, conf->mgr_name,
656+
&altera_cvp_ops, conf);
657+
if (IS_ERR(mgr)) {
658+
ret = PTR_ERR(mgr);
659659
goto err_unmap;
660660
}
661661

662662
pci_set_drvdata(pdev, mgr);
663663

664-
ret = fpga_mgr_register(mgr);
665-
if (ret)
666-
goto err_unmap;
667-
668664
return 0;
669665

670666
err_unmap:

drivers/fpga/altera-pr-ip-core.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,8 @@ int alt_pr_register(struct device *dev, void __iomem *reg_base)
191191
(val & ALT_PR_CSR_STATUS_MSK) >> ALT_PR_CSR_STATUS_SFT,
192192
(int)(val & ALT_PR_CSR_PR_START));
193193

194-
mgr = devm_fpga_mgr_create(dev, dev_name(dev), &alt_pr_ops, priv);
195-
if (!mgr)
196-
return -ENOMEM;
197-
198-
return devm_fpga_mgr_register(dev, mgr);
194+
mgr = devm_fpga_mgr_register(dev, dev_name(dev), &alt_pr_ops, priv);
195+
return PTR_ERR_OR_ZERO(mgr);
199196
}
200197
EXPORT_SYMBOL_GPL(alt_pr_register);
201198

drivers/fpga/altera-ps-spi.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -302,12 +302,9 @@ static int altera_ps_probe(struct spi_device *spi)
302302
snprintf(conf->mgr_name, sizeof(conf->mgr_name), "%s %s",
303303
dev_driver_string(&spi->dev), dev_name(&spi->dev));
304304

305-
mgr = devm_fpga_mgr_create(&spi->dev, conf->mgr_name,
306-
&altera_ps_ops, conf);
307-
if (!mgr)
308-
return -ENOMEM;
309-
310-
return devm_fpga_mgr_register(&spi->dev, mgr);
305+
mgr = devm_fpga_mgr_register(&spi->dev, conf->mgr_name,
306+
&altera_ps_ops, conf);
307+
return PTR_ERR_OR_ZERO(mgr);
311308
}
312309

313310
static const struct spi_device_id altera_ps_spi_ids[] = {

drivers/fpga/dfl-fme-mgr.c

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ static void fme_mgr_get_compat_id(void __iomem *fme_pr,
276276
static int fme_mgr_probe(struct platform_device *pdev)
277277
{
278278
struct dfl_fme_mgr_pdata *pdata = dev_get_platdata(&pdev->dev);
279-
struct fpga_compat_id *compat_id;
279+
struct fpga_manager_info info = { 0 };
280280
struct device *dev = &pdev->dev;
281281
struct fme_mgr_priv *priv;
282282
struct fpga_manager *mgr;
@@ -296,20 +296,16 @@ static int fme_mgr_probe(struct platform_device *pdev)
296296
return PTR_ERR(priv->ioaddr);
297297
}
298298

299-
compat_id = devm_kzalloc(dev, sizeof(*compat_id), GFP_KERNEL);
300-
if (!compat_id)
299+
info.name = "DFL FME FPGA Manager";
300+
info.mops = &fme_mgr_ops;
301+
info.priv = priv;
302+
info.compat_id = devm_kzalloc(dev, sizeof(*info.compat_id), GFP_KERNEL);
303+
if (!info.compat_id)
301304
return -ENOMEM;
302305

303-
fme_mgr_get_compat_id(priv->ioaddr, compat_id);
304-
305-
mgr = devm_fpga_mgr_create(dev, "DFL FME FPGA Manager",
306-
&fme_mgr_ops, priv);
307-
if (!mgr)
308-
return -ENOMEM;
309-
310-
mgr->compat_id = compat_id;
311-
312-
return devm_fpga_mgr_register(dev, mgr);
306+
fme_mgr_get_compat_id(priv->ioaddr, info.compat_id);
307+
mgr = devm_fpga_mgr_register_full(dev, &info);
308+
return PTR_ERR_OR_ZERO(mgr);
313309
}
314310

315311
static struct platform_driver fme_mgr_driver = {

0 commit comments

Comments
 (0)