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

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

greybus: es2: add support for greybus cport flags



Add support for Greybus CPort flags that are sent to the bridge through
a new USB vendor request when enabling a CPort as part of connection
establishment.

Currently the Greybus control and high-priority connection flags are
recognised and forwarded to APBA.

Reviewed-by: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarJohan Hovold <johan@hovoldconsulting.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent 3094f947
Loading
Loading
Loading
Loading
+42 −0
Original line number Diff line number Diff line
@@ -607,6 +607,47 @@ static void es2_cport_release(struct gb_host_device *hd, u16 cport_id)
	ida_simple_remove(&hd->cport_id_map, cport_id);
}

static int cport_enable(struct gb_host_device *hd, u16 cport_id,
			unsigned long flags)
{
	struct es2_ap_dev *es2 = hd_to_es2(hd);
	struct usb_device *udev = es2->usb_dev;
	struct gb_apb_request_cport_flags *req;
	int ret;

	req = kzalloc(sizeof(*req), GFP_KERNEL);
	if (!req)
		return -ENOMEM;

	if (flags & GB_CONNECTION_FLAG_CONTROL)
		req->flags |= GB_APB_CPORT_FLAG_CONTROL;
	if (flags & GB_CONNECTION_FLAG_HIGH_PRIO)
		req->flags |= GB_APB_CPORT_FLAG_HIGH_PRIO;

	dev_dbg(&hd->dev, "%s - cport = %u, flags = %02x\n", __func__,
			cport_id, req->flags);

	ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
				GB_APB_REQUEST_CPORT_FLAGS,
				USB_DIR_OUT | USB_TYPE_VENDOR |
				USB_RECIP_INTERFACE, cport_id, 0,
				req, sizeof(*req), ES2_TIMEOUT);
	if (ret != sizeof(*req)) {
		dev_err(&udev->dev, "failed to set cport flags for port %d\n",
				cport_id);
		if (ret >= 0)
			ret = -EIO;

		goto out;
	}

	ret = 0;
out:
	kfree(req);

	return ret;
}

static int cport_disable(struct gb_host_device *hd, u16 cport_id)
{
	int retval;
@@ -799,6 +840,7 @@ static struct gb_hd_driver es2_driver = {
	.message_cancel			= message_cancel,
	.cport_allocate			= es2_cport_allocate,
	.cport_release			= es2_cport_release,
	.cport_enable			= cport_enable,
	.cport_disable			= cport_disable,
	.latency_tag_enable		= latency_tag_enable,
	.latency_tag_disable		= latency_tag_disable,
+10 −0
Original line number Diff line number Diff line
@@ -225,6 +225,16 @@ struct gb_control_timesync_get_last_event_response {
#define REQUEST_TIMESYNC_AUTHORITATIVE		0x0f
#define REQUEST_TIMESYNC_GET_LAST_EVENT		0x10

/* requests to set Greybus CPort flags */
#define GB_APB_REQUEST_CPORT_FLAGS		0x11

struct gb_apb_request_cport_flags {
	u32	flags;
#define GB_APB_CPORT_FLAG_CONTROL		0x01
#define GB_APB_CPORT_FLAG_HIGH_PRIO		0x02
} __packed;


/* Firmware Download Protocol */

/* Request Types */