Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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) {
+1 −0
Original line number Diff line number Diff line
@@ -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);
+7 −16
Original line number Diff line number Diff line
@@ -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);
}