@@ -567,8 +567,10 @@ static int dwc_pcie_register_dev(struct pci_dev *pdev)
567
567
return PTR_ERR (plat_dev );
568
568
569
569
dev_info = kzalloc (sizeof (* dev_info ), GFP_KERNEL );
570
- if (!dev_info )
570
+ if (!dev_info ) {
571
+ platform_device_unregister (plat_dev );
571
572
return - ENOMEM ;
573
+ }
572
574
573
575
/* Cache platform device to handle pci device hotplug */
574
576
dev_info -> plat_dev = plat_dev ;
@@ -724,6 +726,15 @@ static struct platform_driver dwc_pcie_pmu_driver = {
724
726
.driver = {.name = "dwc_pcie_pmu" ,},
725
727
};
726
728
729
+ static void dwc_pcie_cleanup_devices (void )
730
+ {
731
+ struct dwc_pcie_dev_info * dev_info , * tmp ;
732
+
733
+ list_for_each_entry_safe (dev_info , tmp , & dwc_pcie_dev_info_head , dev_node ) {
734
+ dwc_pcie_unregister_dev (dev_info );
735
+ }
736
+ }
737
+
727
738
static int __init dwc_pcie_pmu_init (void )
728
739
{
729
740
struct pci_dev * pdev = NULL ;
@@ -736,7 +747,7 @@ static int __init dwc_pcie_pmu_init(void)
736
747
ret = dwc_pcie_register_dev (pdev );
737
748
if (ret ) {
738
749
pci_dev_put (pdev );
739
- return ret ;
750
+ goto err_cleanup ;
740
751
}
741
752
}
742
753
@@ -745,35 +756,35 @@ static int __init dwc_pcie_pmu_init(void)
745
756
dwc_pcie_pmu_online_cpu ,
746
757
dwc_pcie_pmu_offline_cpu );
747
758
if (ret < 0 )
748
- return ret ;
759
+ goto err_cleanup ;
749
760
750
761
dwc_pcie_pmu_hp_state = ret ;
751
762
752
763
ret = platform_driver_register (& dwc_pcie_pmu_driver );
753
764
if (ret )
754
- goto platform_driver_register_err ;
765
+ goto err_remove_cpuhp ;
755
766
756
767
ret = bus_register_notifier (& pci_bus_type , & dwc_pcie_pmu_nb );
757
768
if (ret )
758
- goto platform_driver_register_err ;
769
+ goto err_unregister_driver ;
759
770
notify = true;
760
771
761
772
return 0 ;
762
773
763
- platform_driver_register_err :
774
+ err_unregister_driver :
775
+ platform_driver_unregister (& dwc_pcie_pmu_driver );
776
+ err_remove_cpuhp :
764
777
cpuhp_remove_multi_state (dwc_pcie_pmu_hp_state );
765
-
778
+ err_cleanup :
779
+ dwc_pcie_cleanup_devices ();
766
780
return ret ;
767
781
}
768
782
769
783
static void __exit dwc_pcie_pmu_exit (void )
770
784
{
771
- struct dwc_pcie_dev_info * dev_info , * tmp ;
772
-
773
785
if (notify )
774
786
bus_unregister_notifier (& pci_bus_type , & dwc_pcie_pmu_nb );
775
- list_for_each_entry_safe (dev_info , tmp , & dwc_pcie_dev_info_head , dev_node )
776
- dwc_pcie_unregister_dev (dev_info );
787
+ dwc_pcie_cleanup_devices ();
777
788
platform_driver_unregister (& dwc_pcie_pmu_driver );
778
789
cpuhp_remove_multi_state (dwc_pcie_pmu_hp_state );
779
790
}
0 commit comments