mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-12 20:06:26 +07:00
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>
This commit is contained in:
parent
d4c80bad59
commit
2c848944c1
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user