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

Commit 8e63f8c8 authored by Ajay Agarwal's avatar Ajay Agarwal Committed by Vijayavardhan Vennapusa
Browse files

usb: gadget: f_uac1: Add support for UAC1 function



Add support for the UAC1 function with the configfs framework
along with following other changes:
 - Add dynamic updation of AudioStreaming interface numbers in
   the AudioControl interface descriptor.
 - Add superspeed support.
 - Stop playback on func disable so that pending request's
   completion is called before request has been freed in unbind.
 - Fix minor compilation issue.

Change-Id: I5f60680c5795d77cf37f6db37cf5a8c8d3648b4b
Signed-off-by: default avatarAjay Agarwal <ajaya@codeaurora.org>
Signed-off-by: default avatarVijayavardhan Vennapusa <vvreddy@codeaurora.org>
parent a425c383
Loading
Loading
Loading
Loading
+50 −7
Original line number Diff line number Diff line
@@ -75,11 +75,6 @@ static struct uac1_ac_header_descriptor_2 ac_header_desc = {
	.bcdADC =		cpu_to_le16(0x0100),
	.wTotalLength =		cpu_to_le16(UAC_DT_TOTAL_LENGTH),
	.bInCollection =	F_AUDIO_NUM_INTERFACES,
	.baInterfaceNr = {
	/* Interface number of the AudioStream interfaces */
		[0] =		1,
		[1] =		2,
	}
};

#define USB_OUT_IT_ID	1
@@ -205,6 +200,13 @@ static struct usb_endpoint_descriptor as_out_ep_desc = {
	.bInterval =		4,
};

static struct usb_ss_ep_comp_descriptor as_out_ep_comp_desc = {
	.bLength =		sizeof(as_out_ep_comp_desc),
	.bDescriptorType =	USB_DT_SS_ENDPOINT_COMP,

	.wBytesPerInterval =	cpu_to_le16(1024),
};

/* Class-specific AS ISO OUT Endpoint Descriptor */
static struct uac_iso_endpoint_descriptor as_iso_out_desc = {
	.bLength =		UAC_ISO_ENDPOINT_DESC_SIZE,
@@ -236,6 +238,13 @@ static struct usb_endpoint_descriptor as_in_ep_desc = {
	.bInterval =		4,
};

static struct usb_ss_ep_comp_descriptor as_in_ep_comp_desc = {
	.bLength =		sizeof(as_in_ep_comp_desc),
	.bDescriptorType =	USB_DT_SS_ENDPOINT_COMP,

	.wBytesPerInterval =	cpu_to_le16(1024),
};

/* Class-specific AS ISO OUT Endpoint Descriptor */
static struct uac_iso_endpoint_descriptor as_iso_in_desc = {
	.bLength =		UAC_ISO_ENDPOINT_DESC_SIZE,
@@ -275,6 +284,37 @@ static struct usb_descriptor_header *f_audio_desc[] = {
	NULL,
};

static struct usb_descriptor_header *f_audio_ss_desc[] = {
	(struct usb_descriptor_header *)&ac_interface_desc,
	(struct usb_descriptor_header *)&ac_header_desc,

	(struct usb_descriptor_header *)&usb_out_it_desc,
	(struct usb_descriptor_header *)&io_out_ot_desc,
	(struct usb_descriptor_header *)&io_in_it_desc,
	(struct usb_descriptor_header *)&usb_in_ot_desc,

	(struct usb_descriptor_header *)&as_out_interface_alt_0_desc,
	(struct usb_descriptor_header *)&as_out_interface_alt_1_desc,
	(struct usb_descriptor_header *)&as_out_header_desc,

	(struct usb_descriptor_header *)&as_out_type_i_desc,

	(struct usb_descriptor_header *)&as_out_ep_desc,
	(struct usb_descriptor_header *)&as_out_ep_comp_desc,
	(struct usb_descriptor_header *)&as_iso_out_desc,

	(struct usb_descriptor_header *)&as_in_interface_alt_0_desc,
	(struct usb_descriptor_header *)&as_in_interface_alt_1_desc,
	(struct usb_descriptor_header *)&as_in_header_desc,

	(struct usb_descriptor_header *)&as_in_type_i_desc,

	(struct usb_descriptor_header *)&as_in_ep_desc,
	(struct usb_descriptor_header *)&as_in_ep_comp_desc,
	(struct usb_descriptor_header *)&as_iso_in_desc,
	NULL,
};

enum {
	STR_AC_IF,
	STR_USB_OUT_IT,
@@ -500,6 +540,7 @@ static void f_audio_disable(struct usb_function *f)
	uac1->as_in_alt = 0;

	u_audio_stop_capture(&uac1->g_audio);
	u_audio_stop_playback(&uac1->g_audio);
}

/*-------------------------------------------------------------------------*/
@@ -566,6 +607,7 @@ static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
	status = usb_interface_id(c, f);
	if (status < 0)
		goto fail;
	ac_header_desc.baInterfaceNr[0] = status;
	as_out_interface_alt_0_desc.bInterfaceNumber = status;
	as_out_interface_alt_1_desc.bInterfaceNumber = status;
	uac1->as_out_intf = status;
@@ -574,6 +616,7 @@ static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
	status = usb_interface_id(c, f);
	if (status < 0)
		goto fail;
	ac_header_desc.baInterfaceNr[1] = status;
	as_in_interface_alt_0_desc.bInterfaceNumber = status;
	as_in_interface_alt_1_desc.bInterfaceNumber = status;
	uac1->as_in_intf = status;
@@ -597,8 +640,8 @@ static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
	audio->in_ep->desc = &as_in_ep_desc;

	/* copy descriptors, and track endpoint copies */
	status = usb_assign_descriptors(f, f_audio_desc, f_audio_desc, NULL,
					NULL);
	status = usb_assign_descriptors(f, f_audio_desc, f_audio_desc,
							f_audio_ss_desc, NULL);
	if (status)
		goto fail;