hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/fpga/fpga-mgr.c
....@@ -482,11 +482,6 @@
482482 }
483483 EXPORT_SYMBOL_GPL(fpga_mgr_get);
484484
485
-static int fpga_mgr_of_node_match(struct device *dev, const void *data)
486
-{
487
- return dev->of_node == data;
488
-}
489
-
490485 /**
491486 * of_fpga_mgr_get - Given a device node, get a reference to a fpga mgr.
492487 *
....@@ -498,8 +493,7 @@
498493 {
499494 struct device *dev;
500495
501
- dev = class_find_device(fpga_mgr_class, NULL, node,
502
- fpga_mgr_of_node_match);
496
+ dev = class_find_device_by_of_node(fpga_mgr_class, node);
503497 if (!dev)
504498 return ERR_PTR(-ENODEV);
505499
....@@ -558,6 +552,9 @@
558552 * @mops: pointer to structure of fpga manager ops
559553 * @priv: fpga manager private data
560554 *
555
+ * The caller of this function is responsible for freeing the struct with
556
+ * fpga_mgr_free(). Using devm_fpga_mgr_create() instead is recommended.
557
+ *
561558 * Return: pointer to struct fpga_manager or NULL
562559 */
563560 struct fpga_manager *fpga_mgr_create(struct device *dev, const char *name,
....@@ -584,10 +581,8 @@
584581 return NULL;
585582
586583 id = ida_simple_get(&fpga_mgr_ida, 0, 0, GFP_KERNEL);
587
- if (id < 0) {
588
- ret = id;
584
+ if (id < 0)
589585 goto error_kfree;
590
- }
591586
592587 mutex_init(&mgr->ref_mutex);
593588
....@@ -618,8 +613,8 @@
618613 EXPORT_SYMBOL_GPL(fpga_mgr_create);
619614
620615 /**
621
- * fpga_mgr_free - deallocate a FPGA manager
622
- * @mgr: fpga manager struct created by fpga_mgr_create
616
+ * fpga_mgr_free - free a FPGA manager created with fpga_mgr_create()
617
+ * @mgr: fpga manager struct
623618 */
624619 void fpga_mgr_free(struct fpga_manager *mgr)
625620 {
....@@ -628,9 +623,55 @@
628623 }
629624 EXPORT_SYMBOL_GPL(fpga_mgr_free);
630625
626
+static void devm_fpga_mgr_release(struct device *dev, void *res)
627
+{
628
+ struct fpga_manager *mgr = *(struct fpga_manager **)res;
629
+
630
+ fpga_mgr_free(mgr);
631
+}
632
+
633
+/**
634
+ * devm_fpga_mgr_create - create and initialize a managed FPGA manager struct
635
+ * @dev: fpga manager device from pdev
636
+ * @name: fpga manager name
637
+ * @mops: pointer to structure of fpga manager ops
638
+ * @priv: fpga manager private data
639
+ *
640
+ * This function is intended for use in a FPGA manager driver's probe function.
641
+ * After the manager driver creates the manager struct with
642
+ * devm_fpga_mgr_create(), it should register it with fpga_mgr_register(). The
643
+ * manager driver's remove function should call fpga_mgr_unregister(). The
644
+ * manager struct allocated with this function will be freed automatically on
645
+ * driver detach. This includes the case of a probe function returning error
646
+ * before calling fpga_mgr_register(), the struct will still get cleaned up.
647
+ *
648
+ * Return: pointer to struct fpga_manager or NULL
649
+ */
650
+struct fpga_manager *devm_fpga_mgr_create(struct device *dev, const char *name,
651
+ const struct fpga_manager_ops *mops,
652
+ void *priv)
653
+{
654
+ struct fpga_manager **ptr, *mgr;
655
+
656
+ ptr = devres_alloc(devm_fpga_mgr_release, sizeof(*ptr), GFP_KERNEL);
657
+ if (!ptr)
658
+ return NULL;
659
+
660
+ mgr = fpga_mgr_create(dev, name, mops, priv);
661
+ if (!mgr) {
662
+ devres_free(ptr);
663
+ } else {
664
+ *ptr = mgr;
665
+ devres_add(dev, ptr);
666
+ }
667
+
668
+ return mgr;
669
+}
670
+EXPORT_SYMBOL_GPL(devm_fpga_mgr_create);
671
+
631672 /**
632673 * fpga_mgr_register - register a FPGA manager
633
- * @mgr: fpga manager struct created by fpga_mgr_create
674
+ * @mgr: fpga manager struct
634675 *
635676 * Return: 0 on success, negative error code otherwise.
636677 */
....@@ -661,8 +702,10 @@
661702 EXPORT_SYMBOL_GPL(fpga_mgr_register);
662703
663704 /**
664
- * fpga_mgr_unregister - unregister and free a FPGA manager
665
- * @mgr: fpga manager struct
705
+ * fpga_mgr_unregister - unregister a FPGA manager
706
+ * @mgr: fpga manager struct
707
+ *
708
+ * This function is intended for use in a FPGA manager driver's remove function.
666709 */
667710 void fpga_mgr_unregister(struct fpga_manager *mgr)
668711 {
....@@ -681,9 +724,6 @@
681724
682725 static void fpga_mgr_dev_release(struct device *dev)
683726 {
684
- struct fpga_manager *mgr = to_fpga_manager(dev);
685
-
686
- fpga_mgr_free(mgr);
687727 }
688728
689729 static int __init fpga_mgr_class_init(void)