Commit fe53b45c authored by Alex Elder's avatar Alex Elder Committed by Greg Kroah-Hartman

greybus: bundle: fix gb_bundle_destroy()

Currently gb_bundle_destroy() takes an interface as an argument,
and really doesn't do what a function by that name should do.

What it now does is delete all bundles associated with a given
interface.  What it should do is destroy a single bundle.

Move the looping logic out of gb_bundle_destroy() and into its
caller, gb_interface_destroy().  Pass each bundle in an interface to
gb_bundle_destroy(), which will do what's required to destroy a
single bundle (including removing it from its interface's bundle
list under protection of the lock).
Signed-off-by: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent bc942083
......@@ -215,24 +215,14 @@ struct gb_bundle *gb_bundle_create(struct gb_interface *intf, u8 bundle_id,
/*
* Tear down a previously set up bundle.
*/
void gb_bundle_destroy(struct gb_interface *intf)
void gb_bundle_destroy(struct gb_bundle *bundle)
{
LIST_HEAD(list);
struct gb_bundle *bundle;
struct gb_bundle *temp;
if (WARN_ON(!intf))
return;
spin_lock_irq(&gb_bundles_lock);
list_splice_init(&intf->bundles, &list);
list_del(&bundle->links);
spin_unlock_irq(&gb_bundles_lock);
list_for_each_entry_safe(bundle, temp, &list, links) {
list_del(&bundle->links);
gb_bundle_connections_exit(bundle);
device_unregister(&bundle->dev);
}
gb_bundle_connections_exit(bundle);
device_unregister(&bundle->dev);
}
int gb_bundle_init(struct gb_bundle *bundle, u8 device_id)
......
......@@ -31,7 +31,7 @@ struct gb_bundle {
/* Greybus "private" definitions" */
struct gb_bundle *gb_bundle_create(struct gb_interface *intf, u8 bundle_id,
u8 class);
void gb_bundle_destroy(struct gb_interface *intf);
void gb_bundle_destroy(struct gb_bundle *bundle);
int gb_bundle_init(struct gb_bundle *bundle, u8 device_id);
int gb_bundles_init(struct gb_interface *intf, u8 device_id);
......
......@@ -141,6 +141,8 @@ static struct gb_interface *gb_interface_create(struct greybus_host_device *hd,
static void gb_interface_destroy(struct gb_interface *intf)
{
struct gb_module *module;
struct gb_bundle *bundle;
struct gb_bundle *next;
if (WARN_ON(!intf))
return;
......@@ -149,11 +151,11 @@ static void gb_interface_destroy(struct gb_interface *intf)
list_del(&intf->links);
spin_unlock_irq(&gb_interfaces_lock);
gb_bundle_destroy(intf);
list_for_each_entry_safe(bundle, next, &intf->bundles, links)
gb_bundle_destroy(bundle);
kfree(intf->product_string);
kfree(intf->vendor_string);
/* kref_put(module->hd); */
module = intf->module;
device_unregister(&intf->dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment