Commit 2c848944 authored by Johan Hovold's avatar Johan Hovold Committed by Greg Kroah-Hartman

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: default avatarJohan Hovold <johan@hovoldconsulting.com>
Reviewed-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent d4c80bad
...@@ -437,7 +437,7 @@ int gb_connection_init(struct gb_connection *connection) ...@@ -437,7 +437,7 @@ int gb_connection_init(struct gb_connection *connection)
return ret; return ret;
} }
static void gb_connection_exit(struct gb_connection *connection) void gb_connection_exit(struct gb_connection *connection)
{ {
spin_lock_irq(&connection->lock); spin_lock_irq(&connection->lock);
if (connection->state != GB_CONNECTION_STATE_ENABLED) { if (connection->state != GB_CONNECTION_STATE_ENABLED) {
......
...@@ -64,6 +64,7 @@ static inline bool gb_connection_is_static(struct gb_connection *connection) ...@@ -64,6 +64,7 @@ static inline bool gb_connection_is_static(struct gb_connection *connection)
} }
int gb_connection_init(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, void greybus_data_rcvd(struct gb_host_device *hd, u16 cport_id,
u8 *data, size_t length); u8 *data, size_t length);
......
...@@ -21,6 +21,8 @@ static void gb_hd_release(struct device *dev) ...@@ -21,6 +21,8 @@ static void gb_hd_release(struct device *dev)
{ {
struct gb_host_device *hd = to_gb_host_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_simple_remove(&gb_hd_bus_id_map, hd->bus_id);
ida_destroy(&hd->cport_id_map); ida_destroy(&hd->cport_id_map);
kfree(hd); kfree(hd);
...@@ -93,21 +95,17 @@ struct gb_host_device *gb_hd_create(struct gb_hd_driver *driver, ...@@ -93,21 +95,17 @@ struct gb_host_device *gb_hd_create(struct gb_hd_driver *driver,
device_initialize(&hd->dev); device_initialize(&hd->dev);
dev_set_name(&hd->dev, "greybus%d", hd->bus_id); 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, hd->svc_connection = gb_connection_create_static(hd, GB_SVC_CPORT_ID,
GREYBUS_PROTOCOL_SVC); GREYBUS_PROTOCOL_SVC);
if (!hd->svc_connection) { if (!hd->svc_connection) {
dev_err(&hd->dev, "failed to create svc connection\n"); 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) int gb_hd_add(struct gb_host_device *hd)
{ {
...@@ -117,15 +115,8 @@ int gb_hd_add(struct gb_host_device *hd) ...@@ -117,15 +115,8 @@ int gb_hd_add(struct gb_host_device *hd)
if (ret) if (ret)
return 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); ret = gb_connection_init(hd->svc_connection);
if (ret) { if (ret) {
gb_connection_destroy(hd->svc_connection);
device_del(&hd->dev); device_del(&hd->dev);
return ret; return ret;
} }
...@@ -138,7 +129,7 @@ void gb_hd_del(struct gb_host_device *hd) ...@@ -138,7 +129,7 @@ void gb_hd_del(struct gb_host_device *hd)
{ {
gb_interfaces_remove(hd); gb_interfaces_remove(hd);
gb_connection_destroy(hd->svc_connection); gb_connection_exit(hd->svc_connection);
device_del(&hd->dev); device_del(&hd->dev);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment