Commit fda2381b authored by Viresh Kumar's avatar Viresh Kumar Committed by Johan Hovold

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: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarJohan Hovold <johan@hovoldconsulting.com>
parent 4c583f42
...@@ -201,10 +201,8 @@ static void gb_bundle_connections_exit(struct gb_bundle *bundle) ...@@ -201,10 +201,8 @@ static void gb_bundle_connections_exit(struct gb_bundle *bundle)
struct gb_connection *next; struct gb_connection *next;
list_for_each_entry_safe(connection, next, &bundle->connections, list_for_each_entry_safe(connection, next, &bundle->connections,
bundle_links) { bundle_links)
gb_connection_exit(connection);
gb_connection_destroy(connection); gb_connection_destroy(connection);
}
} }
/* /*
......
...@@ -318,32 +318,6 @@ static void gb_connection_cancel_operations(struct gb_connection *connection, ...@@ -318,32 +318,6 @@ static void gb_connection_cancel_operations(struct gb_connection *connection,
spin_unlock_irq(&connection->lock); 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) static void gb_connection_disconnected(struct gb_connection *connection)
{ {
struct gb_control *control; struct gb_control *control;
...@@ -420,7 +394,7 @@ static int gb_connection_init(struct gb_connection *connection) ...@@ -420,7 +394,7 @@ static int gb_connection_init(struct gb_connection *connection)
return ret; return ret;
} }
void gb_connection_exit(struct gb_connection *connection) static void gb_connection_exit(struct gb_connection *connection)
{ {
if (!connection->protocol) { if (!connection->protocol) {
dev_warn(&connection->dev, "exit without protocol.\n"); dev_warn(&connection->dev, "exit without protocol.\n");
...@@ -441,14 +415,40 @@ void gb_connection_exit(struct gb_connection *connection) ...@@ -441,14 +415,40 @@ void gb_connection_exit(struct gb_connection *connection)
gb_connection_disconnected(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) void gb_hd_connections_exit(struct greybus_host_device *hd)
{ {
struct gb_connection *connection; struct gb_connection *connection;
list_for_each_entry(connection, &hd->connections, hd_links) { list_for_each_entry(connection, &hd->connections, hd_links)
gb_connection_exit(connection);
gb_connection_destroy(connection); gb_connection_destroy(connection);
}
} }
void gb_connection_bind_protocol(struct gb_connection *connection) void gb_connection_bind_protocol(struct gb_connection *connection)
......
...@@ -60,8 +60,6 @@ struct gb_connection *gb_connection_create_range(struct greybus_host_device *hd, ...@@ -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, u16 cport_id, u8 protocol_id, u32 ida_start,
u32 ida_end); u32 ida_end);
void gb_connection_destroy(struct gb_connection *connection); 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 gb_hd_connections_exit(struct greybus_host_device *hd);
void greybus_data_rcvd(struct greybus_host_device *hd, u16 cport_id, void greybus_data_rcvd(struct greybus_host_device *hd, u16 cport_id,
......
...@@ -259,10 +259,8 @@ void greybus_remove_hd(struct greybus_host_device *hd) ...@@ -259,10 +259,8 @@ void greybus_remove_hd(struct greybus_host_device *hd)
gb_endo_remove(hd->endo); gb_endo_remove(hd->endo);
/* Is the SVC still using the partially uninitialized connection ? */ /* Is the SVC still using the partially uninitialized connection ? */
if (hd->initial_svc_connection) { if (hd->initial_svc_connection)
gb_connection_exit(hd->initial_svc_connection);
gb_connection_destroy(hd->initial_svc_connection); gb_connection_destroy(hd->initial_svc_connection);
}
/* /*
* Make sure there are no leftovers that can potentially corrupt sysfs. * Make sure there are no leftovers that can potentially corrupt sysfs.
......
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