staging: most: move channel disconnect to function most_deregister_interface
authorChristian Gromm <christian.gromm@microchip.com>
Tue, 22 Dec 2015 09:52:55 +0000 (10:52 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 8 Feb 2016 01:34:58 +0000 (17:34 -0800)
This patch moves the code that disconnects linked channels. It is needed
to have cleaning things up done right.

Signed-off-by: Christian Gromm <christian.gromm@microchip.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/most/mostcore/core.c

index ae1b5778b24bd020712f81e1ab4a11efa6c8c97e..782747a50477850cc198f9964a89de82c15b43a1 100644 (file)
@@ -738,20 +738,7 @@ static void destroy_most_inst_obj(struct most_inst_obj *inst)
 {
        struct most_c_obj *c, *tmp;
 
-       /* need to destroy channels first, since
-        * each channel incremented the
-        * reference count of the inst->kobj
-        */
        list_for_each_entry_safe(c, tmp, &inst->channel_list, list) {
-               if (c->aim0.ptr)
-                       c->aim0.ptr->disconnect_channel(c->iface,
-                                                       c->channel_id);
-               if (c->aim1.ptr)
-                       c->aim1.ptr->disconnect_channel(c->iface,
-                                                       c->channel_id);
-               c->aim0.ptr = NULL;
-               c->aim1.ptr = NULL;
-
                mutex_lock(&deregister_mutex);
                flush_trash_fifo(c);
                flush_channel_fifos(c);
@@ -1837,6 +1824,17 @@ void most_deregister_interface(struct most_interface *iface)
        pr_info("deregistering MOST device %s (%s)\n", i->kobj.name,
                iface->description);
 
+       list_for_each_entry(c, &i->channel_list, list) {
+               if (c->aim0.ptr)
+                       c->aim0.ptr->disconnect_channel(c->iface,
+                                                       c->channel_id);
+               if (c->aim1.ptr)
+                       c->aim1.ptr->disconnect_channel(c->iface,
+                                                       c->channel_id);
+               c->aim0.ptr = NULL;
+               c->aim1.ptr = NULL;
+       }
+
        mutex_lock(&deregister_mutex);
        atomic_set(&i->tainted, 1);
        mutex_unlock(&deregister_mutex);