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