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