OSDN Git Service

bcma: simplify freeing cores (internal devices structs)
authorRafał Miłecki <zajec5@gmail.com>
Sat, 24 Jan 2015 17:47:19 +0000 (18:47 +0100)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 29 Jan 2015 08:49:28 +0000 (10:49 +0200)
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/bcma/main.c

index c3c5e0a..73b2ee3 100644 (file)
@@ -368,12 +368,19 @@ static void bcma_unregister_cores(struct bcma_bus *bus)
        struct bcma_device *core, *tmp;
 
        list_for_each_entry_safe(core, tmp, &bus->cores, list) {
+               if (!core->dev_registered)
+                       continue;
                list_del(&core->list);
-               if (core->dev_registered)
-                       device_unregister(&core->dev);
+               device_unregister(&core->dev);
        }
        if (bus->hosttype == BCMA_HOSTTYPE_SOC)
                platform_device_unregister(bus->drv_cc.watchdog);
+
+       /* Now noone uses internally-handled cores, we can free them */
+       list_for_each_entry_safe(core, tmp, &bus->cores, list) {
+               list_del(&core->list);
+               kfree(core);
+       }
 }
 
 int bcma_bus_register(struct bcma_bus *bus)
@@ -467,7 +474,6 @@ int bcma_bus_register(struct bcma_bus *bus)
 
 void bcma_bus_unregister(struct bcma_bus *bus)
 {
-       struct bcma_device *cores[3];
        int err;
 
        err = bcma_gpio_unregister(&bus->drv_cc);
@@ -478,15 +484,7 @@ void bcma_bus_unregister(struct bcma_bus *bus)
 
        bcma_core_chipcommon_b_free(&bus->drv_cc_b);
 
-       cores[0] = bcma_find_core(bus, BCMA_CORE_MIPS_74K);
-       cores[1] = bcma_find_core(bus, BCMA_CORE_PCIE);
-       cores[2] = bcma_find_core(bus, BCMA_CORE_4706_MAC_GBIT_COMMON);
-
        bcma_unregister_cores(bus);
-
-       kfree(cores[2]);
-       kfree(cores[1]);
-       kfree(cores[0]);
 }
 
 /*