summaryrefslogtreecommitdiffstats
path: root/drivers/staging/greybus/hd.c
diff options
context:
space:
mode:
authorJohan Hovold <johan@hovoldconsulting.com>2015-12-07 15:05:36 +0100
committerGreg Kroah-Hartman <gregkh@google.com>2015-12-08 15:31:14 -0500
commit2c848944c14cf9c74c298b2459cc39dc3c757f25 (patch)
tree0391f472ba611a95dff83228acc4a8d4b611143d /drivers/staging/greybus/hd.c
parentd4c80bad59dbc69a989ca2c4efbcc0fb772a713b (diff)
downloadop-kernel-dev-2c848944c14cf9c74c298b2459cc39dc3c757f25.zip
op-kernel-dev-2c848944c14cf9c74c298b2459cc39dc3c757f25.tar.gz
greybus: hd: make svc-connection life time coincide with host-device
Create the svc-connection as part of the host device, and destroy it in the host-device destructor. The svc-connection is enabled when registering the host device, and disabled when the host device is deregistered. Signed-off-by: Johan Hovold <johan@hovoldconsulting.com> Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Diffstat (limited to 'drivers/staging/greybus/hd.c')
-rw-r--r--drivers/staging/greybus/hd.c23
1 files changed, 7 insertions, 16 deletions
diff --git a/drivers/staging/greybus/hd.c b/drivers/staging/greybus/hd.c
index e38c41c..469b31e 100644
--- a/drivers/staging/greybus/hd.c
+++ b/drivers/staging/greybus/hd.c
@@ -21,6 +21,8 @@ static void gb_hd_release(struct device *dev)
{
struct gb_host_device *hd = to_gb_host_device(dev);
+ if (hd->svc_connection)
+ gb_connection_destroy(hd->svc_connection);
ida_simple_remove(&gb_hd_bus_id_map, hd->bus_id);
ida_destroy(&hd->cport_id_map);
kfree(hd);
@@ -93,21 +95,17 @@ struct gb_host_device *gb_hd_create(struct gb_hd_driver *driver,
device_initialize(&hd->dev);
dev_set_name(&hd->dev, "greybus%d", hd->bus_id);
- return hd;
-}
-EXPORT_SYMBOL_GPL(gb_hd_create);
-
-static int gb_hd_create_svc_connection(struct gb_host_device *hd)
-{
hd->svc_connection = gb_connection_create_static(hd, GB_SVC_CPORT_ID,
GREYBUS_PROTOCOL_SVC);
if (!hd->svc_connection) {
dev_err(&hd->dev, "failed to create svc connection\n");
- return -ENOMEM;
+ put_device(&hd->dev);
+ return ERR_PTR(-ENOMEM);
}
- return 0;
+ return hd;
}
+EXPORT_SYMBOL_GPL(gb_hd_create);
int gb_hd_add(struct gb_host_device *hd)
{
@@ -117,15 +115,8 @@ int gb_hd_add(struct gb_host_device *hd)
if (ret)
return ret;
- ret = gb_hd_create_svc_connection(hd);
- if (ret) {
- device_del(&hd->dev);
- return ret;
- }
-
ret = gb_connection_init(hd->svc_connection);
if (ret) {
- gb_connection_destroy(hd->svc_connection);
device_del(&hd->dev);
return ret;
}
@@ -138,7 +129,7 @@ void gb_hd_del(struct gb_host_device *hd)
{
gb_interfaces_remove(hd);
- gb_connection_destroy(hd->svc_connection);
+ gb_connection_exit(hd->svc_connection);
device_del(&hd->dev);
}
OpenPOWER on IntegriCloud