From 66d674cfafb2be4002265e6081a1580d0ea461f7 Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Wed, 9 Mar 2016 12:20:41 +0100 Subject: [PATCH] greybus: interface: move interface-removal helper Move helper to remove all interfaces of a host-device to the svc code and call it when removing the svc device as this needs to be coordinated with flushing the SVC work queue. Signed-off-by: Johan Hovold Reviewed-by: Jeffrey Carlyle Reviewed-by: Viresh Kumar Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/hd.c | 1 - drivers/staging/greybus/interface.c | 8 -------- drivers/staging/greybus/interface.h | 1 - drivers/staging/greybus/svc.c | 10 ++++++++++ 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/staging/greybus/hd.c b/drivers/staging/greybus/hd.c index 147a92d14cfc..2c13860e4a05 100644 --- a/drivers/staging/greybus/hd.c +++ b/drivers/staging/greybus/hd.c @@ -138,7 +138,6 @@ void gb_hd_del(struct gb_host_device *hd) * removing the remaining interfaces. */ gb_svc_del(hd->svc); - gb_interfaces_remove(hd); device_del(&hd->dev); } diff --git a/drivers/staging/greybus/interface.c b/drivers/staging/greybus/interface.c index 4671f4092a17..ebf008161120 100644 --- a/drivers/staging/greybus/interface.c +++ b/drivers/staging/greybus/interface.c @@ -167,14 +167,6 @@ void gb_interface_remove(struct gb_interface *intf) put_device(&intf->dev); } -void gb_interfaces_remove(struct gb_host_device *hd) -{ - struct gb_interface *intf, *temp; - - list_for_each_entry_safe(intf, temp, &hd->interfaces, links) - gb_interface_remove(intf); -} - /* * Intialise an interface by enabling the control connection and fetching the * manifest and other information over it. diff --git a/drivers/staging/greybus/interface.h b/drivers/staging/greybus/interface.h index 5238804e236b..7fc7d29257d9 100644 --- a/drivers/staging/greybus/interface.h +++ b/drivers/staging/greybus/interface.h @@ -50,6 +50,5 @@ struct gb_interface *gb_interface_create(struct gb_host_device *hd, int gb_interface_init(struct gb_interface *intf); int gb_interface_add(struct gb_interface *intf); void gb_interface_remove(struct gb_interface *intf); -void gb_interfaces_remove(struct gb_host_device *hd); #endif /* __INTERFACE_H */ diff --git a/drivers/staging/greybus/svc.c b/drivers/staging/greybus/svc.c index 572ed0e23fe7..446cb25b49c0 100644 --- a/drivers/staging/greybus/svc.c +++ b/drivers/staging/greybus/svc.c @@ -997,6 +997,14 @@ int gb_svc_add(struct gb_svc *svc) return 0; } +static void gb_svc_remove_interfaces(struct gb_svc *svc) +{ + struct gb_interface *intf, *tmp; + + list_for_each_entry_safe(intf, tmp, &svc->hd->interfaces, links) + gb_interface_remove(intf); +} + void gb_svc_del(struct gb_svc *svc) { gb_connection_disable(svc->connection); @@ -1012,6 +1020,8 @@ void gb_svc_del(struct gb_svc *svc) } flush_workqueue(svc->wq); + + gb_svc_remove_interfaces(svc); } void gb_svc_put(struct gb_svc *svc)