greybus: implement core module removal path
authorMatt Porter <mporter@linaro.org>
Fri, 3 Oct 2014 18:32:35 +0000 (14:32 -0400)
committerGreg Kroah-Hartman <greg@kroah.com>
Fri, 3 Oct 2014 18:52:26 +0000 (11:52 -0700)
Implement gb_remove_module() by finding the gb_module to
be removed via the supplied module_id. Add support for
removing the actual device into greybus_remove_device()
after all the subdevs are disconnected.

Signed-off-by: Matt Porter <mporter@linaro.org>
Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
drivers/staging/greybus/core.c

index 8237f5f..8811f35 100644 (file)
@@ -252,7 +252,19 @@ error:
 
 void gb_remove_module(struct greybus_host_device *hd, u8 module_id)
 {
-       // FIXME should be the remove_device call...
+       struct gb_module *gmod;
+       bool found = false;
+
+       list_for_each_entry(gmod, &hd->modules, links)
+               if (gmod->module_id == module_id) {
+                       found = true;
+                       break;
+               }
+
+       if (found)
+               greybus_remove_device(gmod);
+       else
+               dev_err(hd->parent, "module id %d remove error\n", module_id);
 }
 
 void greybus_remove_device(struct gb_module *gmod)
@@ -264,7 +276,8 @@ void greybus_remove_device(struct gb_module *gmod)
        gb_tty_disconnect(gmod);
        gb_battery_disconnect(gmod);
 
-       // FIXME - device_remove(&gmod->dev);
+       device_del(&gmod->dev);
+       put_device(&gmod->dev);
 }
 
 static DEFINE_MUTEX(hd_mutex);