diff options
author | Johan Hovold <johan@hovoldconsulting.com> | 2015-12-07 15:05:36 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@google.com> | 2015-12-08 15:31:14 -0500 |
commit | 2c848944c14cf9c74c298b2459cc39dc3c757f25 (patch) | |
tree | 0391f472ba611a95dff83228acc4a8d4b611143d /drivers/staging/greybus | |
parent | d4c80bad59dbc69a989ca2c4efbcc0fb772a713b (diff) | |
download | op-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')
-rw-r--r-- | drivers/staging/greybus/connection.c | 2 | ||||
-rw-r--r-- | drivers/staging/greybus/connection.h | 1 | ||||
-rw-r--r-- | drivers/staging/greybus/hd.c | 23 |
3 files changed, 9 insertions, 17 deletions
diff --git a/drivers/staging/greybus/connection.c b/drivers/staging/greybus/connection.c index c936502..38604e8 100644 --- a/drivers/staging/greybus/connection.c +++ b/drivers/staging/greybus/connection.c @@ -437,7 +437,7 @@ err_unbind_protocol: return ret; } -static void gb_connection_exit(struct gb_connection *connection) +void gb_connection_exit(struct gb_connection *connection) { spin_lock_irq(&connection->lock); if (connection->state != GB_CONNECTION_STATE_ENABLED) { diff --git a/drivers/staging/greybus/connection.h b/drivers/staging/greybus/connection.h index 329b705..b795b44 100644 --- a/drivers/staging/greybus/connection.h +++ b/drivers/staging/greybus/connection.h @@ -64,6 +64,7 @@ static inline bool gb_connection_is_static(struct gb_connection *connection) } int gb_connection_init(struct gb_connection *connection); +void gb_connection_exit(struct gb_connection *connection); void greybus_data_rcvd(struct gb_host_device *hd, u16 cport_id, u8 *data, size_t length); 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); } |