greybus: implement core module removal path
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>
diff --git a/drivers/staging/greybus/core.c b/drivers/staging/greybus/core.c
index 8237f5f..8811f35 100644
--- a/drivers/staging/greybus/core.c
+++ b/drivers/staging/greybus/core.c
@@ -252,7 +252,19 @@
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 @@
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);