This wouldn't happen normally, but in a buggy corner case it is possible
that all the connections aren't removed properly and they are still
present after the interfaces and endo are removed.
Warn in such a case and cleanup connections, so that /sys/bus/greybus/
can be removed while removing greybus modules.
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
cport_id, ret);
}
}
+
+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);
+ gb_connection_destroy(connection);
+ }
+}
int gb_connection_init(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,
u8 *data, size_t length);
*/
gb_interfaces_remove(hd);
gb_endo_remove(hd->endo);
+
+ /*
+ * Make sure there are no leftovers that can potentially corrupt sysfs.
+ */
+ if (WARN_ON(!list_empty(&hd->connections)))
+ gb_hd_connections_exit(hd);
+
kref_put_mutex(&hd->kref, free_hd, &hd_mutex);
}
EXPORT_SYMBOL_GPL(greybus_remove_hd);