summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/staging/greybus/es1.c9
-rw-r--r--drivers/staging/greybus/es2.c9
-rw-r--r--drivers/staging/greybus/hd.c24
-rw-r--r--drivers/staging/greybus/hd.h4
4 files changed, 35 insertions, 11 deletions
diff --git a/drivers/staging/greybus/es1.c b/drivers/staging/greybus/es1.c
index 858c4aa..75253d9 100644
--- a/drivers/staging/greybus/es1.c
+++ b/drivers/staging/greybus/es1.c
@@ -390,7 +390,7 @@ static void es1_destroy(struct es1_ap_dev *es1)
}
udev = es1->usb_dev;
- gb_hd_remove(es1->hd);
+ gb_hd_put(es1->hd);
usb_put_dev(udev);
}
@@ -403,6 +403,8 @@ static void ap_disconnect(struct usb_interface *interface)
for (i = 0; i < NUM_CPORT_IN_URB; ++i)
usb_kill_urb(es1->cport_in_urb[i]);
+ gb_hd_del(es1->hd);
+
es1_destroy(es1);
}
@@ -692,6 +694,10 @@ static int ap_probe(struct usb_interface *interface,
gb_debugfs_get(), es1,
&apb1_log_enable_fops);
+ retval = gb_hd_add(hd);
+ if (retval)
+ goto error;
+
for (i = 0; i < NUM_CPORT_IN_URB; ++i) {
retval = usb_submit_urb(es1->cport_in_urb[i], GFP_KERNEL);
if (retval)
@@ -703,6 +709,7 @@ static int ap_probe(struct usb_interface *interface,
err_kill_in_urbs:
for (--i; i >= 0; --i)
usb_kill_urb(es1->cport_in_urb[i]);
+ gb_hd_del(hd);
error:
es1_destroy(es1);
diff --git a/drivers/staging/greybus/es2.c b/drivers/staging/greybus/es2.c
index 96ba1a7..aad6451 100644
--- a/drivers/staging/greybus/es2.c
+++ b/drivers/staging/greybus/es2.c
@@ -585,7 +585,7 @@ static void es2_destroy(struct es2_ap_dev *es2)
udev = es2->usb_dev;
cport_to_ep = es2->cport_to_ep;
- gb_hd_remove(es2->hd);
+ gb_hd_put(es2->hd);
kfree(cport_to_ep);
usb_put_dev(udev);
@@ -599,6 +599,8 @@ static void ap_disconnect(struct usb_interface *interface)
for (i = 0; i < NUM_BULKS; ++i)
es2_cport_in_disable(es2, &es2->cport_in[i]);
+ gb_hd_del(es2->hd);
+
es2_destroy(es2);
}
@@ -942,6 +944,10 @@ static int ap_probe(struct usb_interface *interface,
gb_debugfs_get(), es2,
&apb_log_enable_fops);
+ retval = gb_hd_add(hd);
+ if (retval)
+ goto error;
+
for (i = 0; i < NUM_BULKS; ++i) {
retval = es2_cport_in_enable(es2, &es2->cport_in[i]);
if (retval)
@@ -953,6 +959,7 @@ static int ap_probe(struct usb_interface *interface,
err_disable_cport_in:
for (--i; i >= 0; --i)
es2_cport_in_disable(es2, &es2->cport_in[i]);
+ gb_hd_del(hd);
error:
es2_destroy(es2);
diff --git a/drivers/staging/greybus/hd.c b/drivers/staging/greybus/hd.c
index 6f29eb4..b22d547 100644
--- a/drivers/staging/greybus/hd.c
+++ b/drivers/staging/greybus/hd.c
@@ -77,6 +77,12 @@ struct gb_host_device *gb_hd_create(struct gb_hd_driver *driver,
hd->buffer_size_max = buffer_size_max;
hd->num_cports = num_cports;
+ return hd;
+}
+EXPORT_SYMBOL_GPL(gb_hd_create);
+
+int gb_hd_add(struct gb_host_device *hd)
+{
/*
* Initialize AP's SVC protocol connection:
*
@@ -87,16 +93,14 @@ struct gb_host_device *gb_hd_create(struct gb_hd_driver *driver,
* time we will create a fully initialized svc-connection, as we need
* endo-id and AP's interface id for that.
*/
- if (!gb_ap_svc_connection_create(hd)) {
- kref_put_mutex(&hd->kref, free_hd, &hd_mutex);
- return ERR_PTR(-ENOMEM);
- }
+ if (!gb_ap_svc_connection_create(hd))
+ return -ENOMEM;
- return hd;
+ return 0;
}
-EXPORT_SYMBOL_GPL(gb_hd_create);
+EXPORT_SYMBOL_GPL(gb_hd_add);
-void gb_hd_remove(struct gb_host_device *hd)
+void gb_hd_del(struct gb_host_device *hd)
{
/*
* Tear down all interfaces, modules, and the endo that is associated
@@ -109,7 +113,11 @@ void gb_hd_remove(struct gb_host_device *hd)
/* Is the SVC still using the partially uninitialized connection ? */
if (hd->initial_svc_connection)
gb_connection_destroy(hd->initial_svc_connection);
+}
+EXPORT_SYMBOL_GPL(gb_hd_del);
+void gb_hd_put(struct gb_host_device *hd)
+{
kref_put_mutex(&hd->kref, free_hd, &hd_mutex);
}
-EXPORT_SYMBOL_GPL(gb_hd_remove);
+EXPORT_SYMBOL_GPL(gb_hd_put);
diff --git a/drivers/staging/greybus/hd.h b/drivers/staging/greybus/hd.h
index 91fcccb..6724cfe 100644
--- a/drivers/staging/greybus/hd.h
+++ b/drivers/staging/greybus/hd.h
@@ -52,6 +52,8 @@ struct gb_host_device *gb_hd_create(struct gb_hd_driver *driver,
struct device *parent,
size_t buffer_size_max,
size_t num_cports);
-void gb_hd_remove(struct gb_host_device *hd);
+int gb_hd_add(struct gb_host_device *hd);
+void gb_hd_del(struct gb_host_device *hd);
+void gb_hd_put(struct gb_host_device *hd);
#endif /* __HD_H */
OpenPOWER on IntegriCloud