mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-17 02:15:57 +00:00
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: Alex Elder <elder@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
parent
bc94208358
commit
fe53b45ca8
@ -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 @@ put_module:
|
||||
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user