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

greybus: hd: generalise cport allocation



Generalise CPort allocation by allowing host-device drivers to override
the default implementation.

Also pass the connection flags down the stack as such information is
needed for proper CPort allocation. Specifically, this will initially be
used to allow the camera driver to allocate the dedicated CDSI CPorts.

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 05061507
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -152,7 +152,7 @@ _gb_connection_create(struct gb_host_device *hd, int hd_cport_id,
		goto err_unlock;
	}

	ret = gb_hd_cport_allocate(hd, hd_cport_id);
	ret = gb_hd_cport_allocate(hd, hd_cport_id, flags);
	if (ret < 0) {
		dev_err(&hd->dev, "failed to allocate cport: %d\n", ret);
		goto err_unlock;
+10 −1
Original line number Diff line number Diff line
@@ -55,11 +55,15 @@ int gb_hd_cport_reserve(struct gb_host_device *hd, u16 cport_id)
EXPORT_SYMBOL_GPL(gb_hd_cport_reserve);

/* Locking: Caller guarantees serialisation */
int gb_hd_cport_allocate(struct gb_host_device *hd, int cport_id)
int gb_hd_cport_allocate(struct gb_host_device *hd, int cport_id,
				unsigned long flags)
{
	struct ida *id_map = &hd->cport_id_map;
	int ida_start, ida_end;

	if (hd->driver->cport_allocate)
		return hd->driver->cport_allocate(hd, cport_id, flags);

	if (cport_id < 0) {
		ida_start = 0;
		ida_end = hd->num_cports;
@@ -77,6 +81,11 @@ int gb_hd_cport_allocate(struct gb_host_device *hd, int cport_id)
/* Locking: Caller guarantees serialisation */
void gb_hd_cport_release(struct gb_host_device *hd, u16 cport_id)
{
	if (hd->driver->cport_release) {
		hd->driver->cport_release(hd, cport_id);
		return;
	}

	ida_simple_remove(&hd->cport_id_map, cport_id);
}

+5 −1
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@ struct gb_message;
struct gb_hd_driver {
	size_t	hd_priv_size;

	int (*cport_allocate)(struct gb_host_device *hd, int cport_id,
				unsigned long flags);
	void (*cport_release)(struct gb_host_device *hd, u16 cport_id);
	int (*cport_enable)(struct gb_host_device *hd, u16 cport_id);
	int (*cport_disable)(struct gb_host_device *hd, u16 cport_id);
	int (*message_send)(struct gb_host_device *hd, u16 dest_cport_id,
@@ -51,7 +54,8 @@ struct gb_host_device {
#define to_gb_host_device(d) container_of(d, struct gb_host_device, dev)

int gb_hd_cport_reserve(struct gb_host_device *hd, u16 cport_id);
int gb_hd_cport_allocate(struct gb_host_device *hd, int cport_id);
int gb_hd_cport_allocate(struct gb_host_device *hd, int cport_id,
					unsigned long flags);
void gb_hd_cport_release(struct gb_host_device *hd, u16 cport_id);

struct gb_host_device *gb_hd_create(struct gb_hd_driver *driver,