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)
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) {
......
......@@ -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);
......
......@@ -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);
}
......
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