Source
551
551
}
552
552
EXPORT_SYMBOL_GPL(fpga_mgr_unlock);
553
553
554
554
/**
555
555
* fpga_mgr_create - create and initialize a FPGA manager struct
556
556
* @dev: fpga manager device from pdev
557
557
* @name: fpga manager name
558
558
* @mops: pointer to structure of fpga manager ops
559
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
564
* Return: pointer to struct fpga_manager or NULL
562
565
*/
563
566
struct fpga_manager *fpga_mgr_create(struct device *dev, const char *name,
564
567
const struct fpga_manager_ops *mops,
565
568
void *priv)
566
569
{
567
570
struct fpga_manager *mgr;
568
571
int id, ret;
569
572
570
573
if (!mops || !mops->write_complete || !mops->state ||
611
614
error_device:
612
615
ida_simple_remove(&fpga_mgr_ida, id);
613
616
error_kfree:
614
617
kfree(mgr);
615
618
616
619
return NULL;
617
620
}
618
621
EXPORT_SYMBOL_GPL(fpga_mgr_create);
619
622
620
623
/**
621
-
* fpga_mgr_free - deallocate a FPGA manager
622
-
* @mgr: fpga manager struct created by fpga_mgr_create
624
+
* fpga_mgr_free - free a FPGA manager created with fpga_mgr_create()
625
+
* @mgr: fpga manager struct
623
626
*/
624
627
void fpga_mgr_free(struct fpga_manager *mgr)
625
628
{
626
629
ida_simple_remove(&fpga_mgr_ida, mgr->dev.id);
627
630
kfree(mgr);
628
631
}
629
632
EXPORT_SYMBOL_GPL(fpga_mgr_free);
630
633
634
+
static 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
+
*/
658
+
struct 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
+
}
678
+
EXPORT_SYMBOL_GPL(devm_fpga_mgr_create);
679
+
631
680
/**
632
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
684
* Return: 0 on success, negative error code otherwise.
636
685
*/
637
686
int fpga_mgr_register(struct fpga_manager *mgr)
638
687
{
639
688
int ret;
640
689
641
690
/*
642
691
* Initialize framework state by requesting low level driver read state
643
692
* from device. FPGA may be in reset mode or may have been programmed
654
703
return 0;
655
704
656
705
error_device:
657
706
ida_simple_remove(&fpga_mgr_ida, mgr->dev.id);
658
707
659
708
return ret;
660
709
}
661
710
EXPORT_SYMBOL_GPL(fpga_mgr_register);
662
711
663
712
/**
664
-
* fpga_mgr_unregister - unregister and free a FPGA manager
665
-
* @mgr: fpga manager struct
713
+
* fpga_mgr_unregister - unregister a FPGA manager
714
+
* @mgr: fpga manager struct
715
+
*
716
+
* This function is intended for use in a FPGA manager driver's remove function.
666
717
*/
667
718
void fpga_mgr_unregister(struct fpga_manager *mgr)
668
719
{
669
720
dev_info(&mgr->dev, "%s %s\n", __func__, mgr->name);
670
721
671
722
/*
672
723
* If the low level driver provides a method for putting fpga into
673
724
* a desired state upon unregister, do it.
674
725
*/
675
726
if (mgr->mops->fpga_remove)
676
727
mgr->mops->fpga_remove(mgr);
677
728
678
729
device_unregister(&mgr->dev);
679
730
}
680
731
EXPORT_SYMBOL_GPL(fpga_mgr_unregister);
681
732
682
733
static 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
689
737
static int __init fpga_mgr_class_init(void)
690
738
{
691
739
pr_info("FPGA manager framework\n");
692
740
693
741
fpga_mgr_class = class_create(THIS_MODULE, "fpga_manager");
694
742
if (IS_ERR(fpga_mgr_class))
695
743
return PTR_ERR(fpga_mgr_class);
696
744