From fda2381bd2d96b4f45806e4796d558eec678e3c6 Mon Sep 17 00:00:00 2001 From: Viresh Kumar Date: Mon, 31 Aug 2015 17:21:13 +0530 Subject: [PATCH] greybus: connection: call gb_connection_exit() from gb_connection_destroy() Both the routines are always called together and in the same sequence. Rather than duplicating this at different places, make gb_connection_destroy() call gb_connection_exit(). This also makes it more sensible, as gb_connection_init() is never called directly by the users and so its its counterpart shouldn't be called directly as well. Signed-off-by: Viresh Kumar Signed-off-by: Johan Hovold --- drivers/staging/greybus/bundle.c | 4 +- drivers/staging/greybus/connection.c | 60 ++++++++++++++-------------- drivers/staging/greybus/connection.h | 2 - drivers/staging/greybus/core.c | 4 +- 4 files changed, 32 insertions(+), 38 deletions(-) diff --git a/drivers/staging/greybus/bundle.c b/drivers/staging/greybus/bundle.c index 459c62a3efb9..5c09bccf55b8 100644 --- a/drivers/staging/greybus/bundle.c +++ b/drivers/staging/greybus/bundle.c @@ -201,10 +201,8 @@ static void gb_bundle_connections_exit(struct gb_bundle *bundle) struct gb_connection *next; list_for_each_entry_safe(connection, next, &bundle->connections, - bundle_links) { - gb_connection_exit(connection); + bundle_links) gb_connection_destroy(connection); - } } /* diff --git a/drivers/staging/greybus/connection.c b/drivers/staging/greybus/connection.c index 8fe056d57493..29870536aa2f 100644 --- a/drivers/staging/greybus/connection.c +++ b/drivers/staging/greybus/connection.c @@ -318,32 +318,6 @@ static void gb_connection_cancel_operations(struct gb_connection *connection, spin_unlock_irq(&connection->lock); } -/* - * Tear down a previously set up connection. - */ -void gb_connection_destroy(struct gb_connection *connection) -{ - struct ida *id_map; - - if (WARN_ON(!connection)) - return; - - spin_lock_irq(&gb_connections_lock); - list_del(&connection->bundle_links); - list_del(&connection->hd_links); - spin_unlock_irq(&gb_connections_lock); - - if (connection->protocol) - gb_protocol_put(connection->protocol); - connection->protocol = NULL; - - id_map = &connection->hd->cport_id_map; - ida_simple_remove(id_map, connection->hd_cport_id); - connection->hd_cport_id = CPORT_ID_BAD; - - device_unregister(&connection->dev); -} - static void gb_connection_disconnected(struct gb_connection *connection) { struct gb_control *control; @@ -420,7 +394,7 @@ disconnect: return ret; } -void gb_connection_exit(struct gb_connection *connection) +static void gb_connection_exit(struct gb_connection *connection) { if (!connection->protocol) { dev_warn(&connection->dev, "exit without protocol.\n"); @@ -441,14 +415,40 @@ void gb_connection_exit(struct gb_connection *connection) gb_connection_disconnected(connection); } +/* + * Tear down a previously set up connection. + */ +void gb_connection_destroy(struct gb_connection *connection) +{ + struct ida *id_map; + + if (WARN_ON(!connection)) + return; + + gb_connection_exit(connection); + + spin_lock_irq(&gb_connections_lock); + list_del(&connection->bundle_links); + list_del(&connection->hd_links); + spin_unlock_irq(&gb_connections_lock); + + if (connection->protocol) + gb_protocol_put(connection->protocol); + connection->protocol = NULL; + + id_map = &connection->hd->cport_id_map; + ida_simple_remove(id_map, connection->hd_cport_id); + connection->hd_cport_id = CPORT_ID_BAD; + + device_unregister(&connection->dev); +} + void gb_hd_connections_exit(struct greybus_host_device *hd) { struct gb_connection *connection; - list_for_each_entry(connection, &hd->connections, hd_links) { - gb_connection_exit(connection); + list_for_each_entry(connection, &hd->connections, hd_links) gb_connection_destroy(connection); - } } void gb_connection_bind_protocol(struct gb_connection *connection) diff --git a/drivers/staging/greybus/connection.h b/drivers/staging/greybus/connection.h index f1b5863820c5..0b442fe61b87 100644 --- a/drivers/staging/greybus/connection.h +++ b/drivers/staging/greybus/connection.h @@ -60,8 +60,6 @@ struct gb_connection *gb_connection_create_range(struct greybus_host_device *hd, u16 cport_id, u8 protocol_id, u32 ida_start, u32 ida_end); void gb_connection_destroy(struct gb_connection *connection); - -void gb_connection_exit(struct gb_connection *connection); void gb_hd_connections_exit(struct greybus_host_device *hd); void greybus_data_rcvd(struct greybus_host_device *hd, u16 cport_id, diff --git a/drivers/staging/greybus/core.c b/drivers/staging/greybus/core.c index 605a0887dc61..3c89cb368f6d 100644 --- a/drivers/staging/greybus/core.c +++ b/drivers/staging/greybus/core.c @@ -259,10 +259,8 @@ void greybus_remove_hd(struct greybus_host_device *hd) gb_endo_remove(hd->endo); /* Is the SVC still using the partially uninitialized connection ? */ - if (hd->initial_svc_connection) { - gb_connection_exit(hd->initial_svc_connection); + if (hd->initial_svc_connection) gb_connection_destroy(hd->initial_svc_connection); - } /* * Make sure there are no leftovers that can potentially corrupt sysfs. -- 2.20.1