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

Commit bd4535a8 authored by Sriharsha Allenki's avatar Sriharsha Allenki
Browse files

usb: gadget: f_uac2: Adds support for S24_LE



Adds support for S24_LE format along with the
existing S24_3LE. The S24_LE and S24_3LE has same
bit resolution but different slot sizes, so added
a new fields p_sres and c_sbres to f_uac2 opts
to help distinguish these two formats. Adds two alt
settings so HOST can select the alt setting to select
S24_LE format.

Change-Id: Id58b76a3e344eaa36db8fce8adde16f0ac052e9f
Signed-off-by: default avatarSriharsha Allenki <sallenki@codeaurora.org>
parent b3c14770
Loading
Loading
Loading
Loading
+167 −30
Original line number Original line Diff line number Diff line
@@ -397,6 +397,7 @@ static int uac2_pcm_open(struct snd_pcm_substream *substream)
	struct audio_dev *audio_dev;
	struct audio_dev *audio_dev;
	struct f_uac2_opts *opts;
	struct f_uac2_opts *opts;
	int p_ssize, c_ssize;
	int p_ssize, c_ssize;
	int p_sres, c_sres;
	int p_srate, c_srate;
	int p_srate, c_srate;
	int p_chmask, c_chmask;
	int p_chmask, c_chmask;


@@ -404,6 +405,8 @@ static int uac2_pcm_open(struct snd_pcm_substream *substream)
	opts = container_of(audio_dev->func.fi, struct f_uac2_opts, func_inst);
	opts = container_of(audio_dev->func.fi, struct f_uac2_opts, func_inst);
	p_ssize = opts->p_ssize;
	p_ssize = opts->p_ssize;
	c_ssize = opts->c_ssize;
	c_ssize = opts->c_ssize;
	p_sres = opts->p_sres;
	c_sres = opts->c_sres;
	p_srate = opts->p_srate;
	p_srate = opts->p_srate;
	c_srate = opts->c_srate;
	c_srate = opts->c_srate;
	p_chmask = opts->p_chmask;
	p_chmask = opts->p_chmask;
@@ -412,6 +415,8 @@ static int uac2_pcm_open(struct snd_pcm_substream *substream)


	runtime->hw = uac2_pcm_hardware;
	runtime->hw = uac2_pcm_hardware;


	pr_debug("p_srate:%d	p_chmask:%d\n", p_srate, p_chmask);
	pr_debug("c_srate:%d	c_chmask:%d\n", c_srate, c_chmask);
	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
		if (audio_dev->as_in_alt == 0) {
		if (audio_dev->as_in_alt == 0) {
			pr_err("%s: Host is not ready to receive the streaming\n",
			pr_err("%s: Host is not ready to receive the streaming\n",
@@ -420,14 +425,27 @@ static int uac2_pcm_open(struct snd_pcm_substream *substream)
		}
		}
		spin_lock_init(&uac2->p_prm.lock);
		spin_lock_init(&uac2->p_prm.lock);
		runtime->hw.rate_min = p_srate;
		runtime->hw.rate_min = p_srate;
		switch (p_sres) {
		case 24:
			switch (p_ssize) {
			switch (p_ssize) {
			case 3:
			case 3:
			runtime->hw.formats = SNDRV_PCM_FMTBIT_S24_3LE;
				pr_debug("%s:S24_3LE\n", __func__);
				runtime->hw.formats =
					SNDRV_PCM_FMTBIT_S24_3LE;
				break;
				break;
		case 4:
			default:
				pr_debug("%s:S24_LE\n", __func__);
				runtime->hw.formats =
					SNDRV_PCM_FMTBIT_S24_LE;
				break;
			}
			break;
		case 32:
			pr_debug("%s:S32_LE\n", __func__);
			runtime->hw.formats = SNDRV_PCM_FMTBIT_S32_LE;
			runtime->hw.formats = SNDRV_PCM_FMTBIT_S32_LE;
			break;
			break;
		default:
		default:
			pr_debug("%s:S16_LE\n", __func__);
			runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
			runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
			break;
			break;
		}
		}
@@ -442,14 +460,27 @@ static int uac2_pcm_open(struct snd_pcm_substream *substream)
		}
		}
		spin_lock_init(&uac2->c_prm.lock);
		spin_lock_init(&uac2->c_prm.lock);
		runtime->hw.rate_min = c_srate;
		runtime->hw.rate_min = c_srate;
		switch (c_sres) {
		case 24:
			switch (c_ssize) {
			switch (c_ssize) {
			case 3:
			case 3:
			runtime->hw.formats = SNDRV_PCM_FMTBIT_S24_3LE;
				pr_debug("%s:S24_3LE\n", __func__);
				runtime->hw.formats =
					SNDRV_PCM_FMTBIT_S24_3LE;
				break;
			default:
				pr_debug("%s:S24_LE\n", __func__);
				runtime->hw.formats =
					SNDRV_PCM_FMTBIT_S24_LE;
				break;
			}
			break;
			break;
		case 4:
		case 32:
			pr_debug("%s:S32_LE\n", __func__);
			runtime->hw.formats = SNDRV_PCM_FMTBIT_S32_LE;
			runtime->hw.formats = SNDRV_PCM_FMTBIT_S32_LE;
			break;
			break;
		default:
		default:
			pr_debug("%s:S16_LE\n", __func__);
			runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
			runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
			break;
			break;
		}
		}
@@ -856,7 +887,7 @@ static struct usb_interface_descriptor std_as_out_if0_desc = {
#define USB_OUT_TYPE_I_FMT_DESC2(id)	usb_out_fmt##id##_desc
#define USB_OUT_TYPE_I_FMT_DESC2(id)	usb_out_fmt##id##_desc
#define USB_OUT_TYPE_I_FMT_DESC(id)	USB_OUT_TYPE_I_FMT_DESC2(id)
#define USB_OUT_TYPE_I_FMT_DESC(id)	USB_OUT_TYPE_I_FMT_DESC2(id)


#define INIT_USB_OUT_ALT_SETTING(id, channels, bitdepth)	\
#define INIT_USB_OUT_ALT_SETTING(id, channels, slotsize, bitdepth)	\
struct usb_interface_descriptor USB_OUT_STD_ALT_DESC(id) =	\
struct usb_interface_descriptor USB_OUT_STD_ALT_DESC(id) =	\
{								\
{								\
	.bLength		= UAC2_STD_AS_INTF_SIZE,	\
	.bLength		= UAC2_STD_AS_INTF_SIZE,	\
@@ -890,20 +921,24 @@ struct uac2_format_type_i_descriptor USB_OUT_TYPE_I_FMT_DESC(id) = \
	.bDescriptorType	= USB_DT_CS_INTERFACE,			\
	.bDescriptorType	= USB_DT_CS_INTERFACE,			\
	.bDescriptorSubtype	= UAC_FORMAT_TYPE,			\
	.bDescriptorSubtype	= UAC_FORMAT_TYPE,			\
	.bFormatType		= UAC_FORMAT_TYPE_I,			\
	.bFormatType		= UAC_FORMAT_TYPE_I,			\
	.bSubslotSize		= GET_SUBSLOT_SIZE(bitdepth),		\
	.bSubslotSize		= slotsize,				\
	.bBitResolution		= bitdepth,				\
	.bBitResolution		= bitdepth,				\
}
}


/* Audio Streaming OUT Interface - (MONO, STEREO) X (16, 24) */
/* Audio Streaming OUT Interface - (MONO, STEREO) X (16(2), 24(3), 24(4)) */
INIT_USB_OUT_ALT_SETTING(1, UAC2_MONO, 16);
INIT_USB_OUT_ALT_SETTING(1, UAC2_MONO, 2, 16);

INIT_USB_OUT_ALT_SETTING(2, UAC2_STEREO, 2, 16);


INIT_USB_OUT_ALT_SETTING(2, UAC2_STEREO, 16);
INIT_USB_OUT_ALT_SETTING(3, UAC2_MONO, 3, 24);


INIT_USB_OUT_ALT_SETTING(3, UAC2_MONO, 24);
INIT_USB_OUT_ALT_SETTING(4, UAC2_STEREO, 3, 24);


INIT_USB_OUT_ALT_SETTING(4, UAC2_STEREO, 24);
INIT_USB_OUT_ALT_SETTING(5, UAC2_MONO, 4, 24);


#define MAX_AS_OUT_ALT	4
INIT_USB_OUT_ALT_SETTING(6, UAC2_STEREO, 4, 24);

#define MAX_AS_OUT_ALT	6


/* List of non-zero alt settings for Audio Streaming OUT Interface*/
/* List of non-zero alt settings for Audio Streaming OUT Interface*/
static struct usb_header_descriptor *as_out_alt_setting[][3] = {
static struct usb_header_descriptor *as_out_alt_setting[][3] = {
@@ -918,7 +953,13 @@ static struct usb_header_descriptor *as_out_alt_setting[][3] = {
	 (struct usb_header_descriptor *)&USB_OUT_TYPE_I_FMT_DESC(3)},
	 (struct usb_header_descriptor *)&USB_OUT_TYPE_I_FMT_DESC(3)},
	{(struct usb_header_descriptor *)&USB_OUT_STD_ALT_DESC(4),
	{(struct usb_header_descriptor *)&USB_OUT_STD_ALT_DESC(4),
	 (struct usb_header_descriptor *)&USB_OUT_AS_HDR_DESC(4),
	 (struct usb_header_descriptor *)&USB_OUT_AS_HDR_DESC(4),
	 (struct usb_header_descriptor *)&USB_OUT_TYPE_I_FMT_DESC(4)}
	 (struct usb_header_descriptor *)&USB_OUT_TYPE_I_FMT_DESC(4)},
	{(struct usb_header_descriptor *)&USB_OUT_STD_ALT_DESC(5),
	 (struct usb_header_descriptor *)&USB_OUT_AS_HDR_DESC(5),
	 (struct usb_header_descriptor *)&USB_OUT_TYPE_I_FMT_DESC(5)},
	{(struct usb_header_descriptor *)&USB_OUT_STD_ALT_DESC(6),
	 (struct usb_header_descriptor *)&USB_OUT_AS_HDR_DESC(6),
	 (struct usb_header_descriptor *)&USB_OUT_TYPE_I_FMT_DESC(6)}
};
};


/* STD AS ISO OUT Endpoint */
/* STD AS ISO OUT Endpoint */
@@ -981,7 +1022,7 @@ static struct usb_interface_descriptor std_as_in_if0_desc = {
#define USB_IN_TYPE_I_FMT_DESC2(id)	usb_in_fmt##id##_desc
#define USB_IN_TYPE_I_FMT_DESC2(id)	usb_in_fmt##id##_desc
#define USB_IN_TYPE_I_FMT_DESC(id)	USB_IN_TYPE_I_FMT_DESC2(id)
#define USB_IN_TYPE_I_FMT_DESC(id)	USB_IN_TYPE_I_FMT_DESC2(id)


#define INIT_USB_IN_ALT_SETTING(id, channels, bitdepth)			\
#define INIT_USB_IN_ALT_SETTING(id, channels, slotsize, bitdepth)	\
struct usb_interface_descriptor USB_IN_STD_ALT_DESC(id) =		\
struct usb_interface_descriptor USB_IN_STD_ALT_DESC(id) =		\
{								\
{								\
	.bLength		= UAC2_STD_AS_INTF_SIZE,	\
	.bLength		= UAC2_STD_AS_INTF_SIZE,	\
@@ -1015,20 +1056,24 @@ struct uac2_format_type_i_descriptor USB_IN_TYPE_I_FMT_DESC(id) = \
	.bDescriptorType	= USB_DT_CS_INTERFACE,			\
	.bDescriptorType	= USB_DT_CS_INTERFACE,			\
	.bDescriptorSubtype	= UAC_FORMAT_TYPE,			\
	.bDescriptorSubtype	= UAC_FORMAT_TYPE,			\
	.bFormatType		= UAC_FORMAT_TYPE_I,			\
	.bFormatType		= UAC_FORMAT_TYPE_I,			\
	.bSubslotSize		= GET_SUBSLOT_SIZE(bitdepth),		\
	.bSubslotSize		= slotsize,				\
	.bBitResolution		= bitdepth,				\
	.bBitResolution		= bitdepth,				\
}
}


/* Audio Streaming IN Interface - (MONO, STEREO) X (16, 24) */
/* Audio Streaming IN Interface - (MONO, STEREO) X (16(2), 24(3), 24(4)) */
INIT_USB_IN_ALT_SETTING(1, UAC2_MONO, 16);
INIT_USB_IN_ALT_SETTING(1, UAC2_MONO, 2, 16);

INIT_USB_IN_ALT_SETTING(2, UAC2_STEREO, 2, 16);


INIT_USB_IN_ALT_SETTING(2, UAC2_STEREO, 16);
INIT_USB_IN_ALT_SETTING(3, UAC2_MONO, 3, 24);


INIT_USB_IN_ALT_SETTING(3, UAC2_MONO, 24);
INIT_USB_IN_ALT_SETTING(4, UAC2_STEREO, 3, 24);


INIT_USB_IN_ALT_SETTING(4, UAC2_STEREO, 24);
INIT_USB_IN_ALT_SETTING(5, UAC2_MONO, 4, 24);


#define MAX_AS_IN_ALT	4
INIT_USB_IN_ALT_SETTING(6, UAC2_STEREO, 4, 24);

#define MAX_AS_IN_ALT	6


/* List of non-zero alt settings for Audio Streaming IN Interface */
/* List of non-zero alt settings for Audio Streaming IN Interface */
static struct usb_header_descriptor *as_in_alt_setting[][3] = {
static struct usb_header_descriptor *as_in_alt_setting[][3] = {
@@ -1043,7 +1088,13 @@ static struct usb_header_descriptor *as_in_alt_setting[][3] = {
	 (struct usb_header_descriptor *)&USB_IN_TYPE_I_FMT_DESC(3)},
	 (struct usb_header_descriptor *)&USB_IN_TYPE_I_FMT_DESC(3)},
	{(struct usb_header_descriptor *)&USB_IN_STD_ALT_DESC(4),
	{(struct usb_header_descriptor *)&USB_IN_STD_ALT_DESC(4),
	 (struct usb_header_descriptor *)&USB_IN_AS_HDR_DESC(4),
	 (struct usb_header_descriptor *)&USB_IN_AS_HDR_DESC(4),
	 (struct usb_header_descriptor *)&USB_IN_TYPE_I_FMT_DESC(4)}
	 (struct usb_header_descriptor *)&USB_IN_TYPE_I_FMT_DESC(4)},
	{(struct usb_header_descriptor *)&USB_IN_STD_ALT_DESC(5),
	 (struct usb_header_descriptor *)&USB_IN_AS_HDR_DESC(5),
	 (struct usb_header_descriptor *)&USB_IN_TYPE_I_FMT_DESC(5)},
	{(struct usb_header_descriptor *)&USB_IN_STD_ALT_DESC(6),
	 (struct usb_header_descriptor *)&USB_IN_AS_HDR_DESC(6),
	 (struct usb_header_descriptor *)&USB_IN_TYPE_I_FMT_DESC(6)}
};
};


/* STD AS ISO IN Endpoint */
/* STD AS ISO IN Endpoint */
@@ -1127,6 +1178,18 @@ static struct usb_descriptor_header *fs_audio_desc[] = {
	(struct usb_descriptor_header *)&fs_epout_desc,
	(struct usb_descriptor_header *)&fs_epout_desc,
	(struct usb_descriptor_header *)&as_iso_out_desc,
	(struct usb_descriptor_header *)&as_iso_out_desc,


	(struct usb_descriptor_header *)&USB_OUT_STD_ALT_DESC(5),
	(struct usb_descriptor_header *)&USB_OUT_AS_HDR_DESC(5),
	(struct usb_descriptor_header *)&USB_OUT_TYPE_I_FMT_DESC(5),
	(struct usb_descriptor_header *)&fs_epout_desc,
	(struct usb_descriptor_header *)&as_iso_out_desc,

	(struct usb_descriptor_header *)&USB_OUT_STD_ALT_DESC(6),
	(struct usb_descriptor_header *)&USB_OUT_AS_HDR_DESC(6),
	(struct usb_descriptor_header *)&USB_OUT_TYPE_I_FMT_DESC(6),
	(struct usb_descriptor_header *)&fs_epout_desc,
	(struct usb_descriptor_header *)&as_iso_out_desc,

	(struct usb_descriptor_header *)&std_as_in_if0_desc,
	(struct usb_descriptor_header *)&std_as_in_if0_desc,


	(struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(1),
	(struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(1),
@@ -1152,6 +1215,18 @@ static struct usb_descriptor_header *fs_audio_desc[] = {
	(struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(4),
	(struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(4),
	(struct usb_descriptor_header *)&fs_epin_desc,
	(struct usb_descriptor_header *)&fs_epin_desc,
	(struct usb_descriptor_header *)&as_iso_in_desc,
	(struct usb_descriptor_header *)&as_iso_in_desc,

	(struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(5),
	(struct usb_descriptor_header *)&USB_IN_AS_HDR_DESC(5),
	(struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(5),
	(struct usb_descriptor_header *)&fs_epin_desc,
	(struct usb_descriptor_header *)&as_iso_in_desc,

	(struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(6),
	(struct usb_descriptor_header *)&USB_IN_AS_HDR_DESC(6),
	(struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(6),
	(struct usb_descriptor_header *)&fs_epin_desc,
	(struct usb_descriptor_header *)&as_iso_in_desc,
	NULL,
	NULL,
};
};


@@ -1197,6 +1272,18 @@ static struct usb_descriptor_header *hs_audio_desc[] = {
	(struct usb_descriptor_header *)&hs_epout_desc,
	(struct usb_descriptor_header *)&hs_epout_desc,
	(struct usb_descriptor_header *)&as_iso_out_desc,
	(struct usb_descriptor_header *)&as_iso_out_desc,


	(struct usb_descriptor_header *)&USB_OUT_STD_ALT_DESC(5),
	(struct usb_descriptor_header *)&USB_OUT_AS_HDR_DESC(5),
	(struct usb_descriptor_header *)&USB_OUT_TYPE_I_FMT_DESC(5),
	(struct usb_descriptor_header *)&hs_epout_desc,
	(struct usb_descriptor_header *)&as_iso_out_desc,

	(struct usb_descriptor_header *)&USB_OUT_STD_ALT_DESC(6),
	(struct usb_descriptor_header *)&USB_OUT_AS_HDR_DESC(6),
	(struct usb_descriptor_header *)&USB_OUT_TYPE_I_FMT_DESC(6),
	(struct usb_descriptor_header *)&hs_epout_desc,
	(struct usb_descriptor_header *)&as_iso_out_desc,

	(struct usb_descriptor_header *)&std_as_in_if0_desc,
	(struct usb_descriptor_header *)&std_as_in_if0_desc,


	(struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(1),
	(struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(1),
@@ -1222,6 +1309,18 @@ static struct usb_descriptor_header *hs_audio_desc[] = {
	(struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(4),
	(struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(4),
	(struct usb_descriptor_header *)&hs_epin_desc,
	(struct usb_descriptor_header *)&hs_epin_desc,
	(struct usb_descriptor_header *)&as_iso_in_desc,
	(struct usb_descriptor_header *)&as_iso_in_desc,

	(struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(5),
	(struct usb_descriptor_header *)&USB_IN_AS_HDR_DESC(5),
	(struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(5),
	(struct usb_descriptor_header *)&hs_epin_desc,
	(struct usb_descriptor_header *)&as_iso_in_desc,

	(struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(6),
	(struct usb_descriptor_header *)&USB_IN_AS_HDR_DESC(6),
	(struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(6),
	(struct usb_descriptor_header *)&hs_epin_desc,
	(struct usb_descriptor_header *)&as_iso_in_desc,
	NULL,
	NULL,
};
};


@@ -1271,6 +1370,20 @@ static struct usb_descriptor_header *ss_audio_desc[] = {
	(struct usb_descriptor_header *)&ss_epout_comp_desc,
	(struct usb_descriptor_header *)&ss_epout_comp_desc,
	(struct usb_descriptor_header *)&as_iso_out_desc,
	(struct usb_descriptor_header *)&as_iso_out_desc,


	(struct usb_descriptor_header *)&USB_OUT_STD_ALT_DESC(5),
	(struct usb_descriptor_header *)&USB_OUT_AS_HDR_DESC(5),
	(struct usb_descriptor_header *)&USB_OUT_TYPE_I_FMT_DESC(5),
	(struct usb_descriptor_header *)&hs_epout_desc,
	(struct usb_descriptor_header *)&ss_epout_comp_desc,
	(struct usb_descriptor_header *)&as_iso_out_desc,

	(struct usb_descriptor_header *)&USB_OUT_STD_ALT_DESC(6),
	(struct usb_descriptor_header *)&USB_OUT_AS_HDR_DESC(6),
	(struct usb_descriptor_header *)&USB_OUT_TYPE_I_FMT_DESC(6),
	(struct usb_descriptor_header *)&hs_epout_desc,
	(struct usb_descriptor_header *)&ss_epout_comp_desc,
	(struct usb_descriptor_header *)&as_iso_out_desc,

	(struct usb_descriptor_header *)&std_as_in_if0_desc,
	(struct usb_descriptor_header *)&std_as_in_if0_desc,


	(struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(1),
	(struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(1),
@@ -1300,6 +1413,20 @@ static struct usb_descriptor_header *ss_audio_desc[] = {
	(struct usb_descriptor_header *)&hs_epin_desc,
	(struct usb_descriptor_header *)&hs_epin_desc,
	(struct usb_descriptor_header *)&ss_epin_comp_desc,
	(struct usb_descriptor_header *)&ss_epin_comp_desc,
	(struct usb_descriptor_header *)&as_iso_in_desc,
	(struct usb_descriptor_header *)&as_iso_in_desc,

	(struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(5),
	(struct usb_descriptor_header *)&USB_IN_AS_HDR_DESC(5),
	(struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(5),
	(struct usb_descriptor_header *)&hs_epin_desc,
	(struct usb_descriptor_header *)&ss_epin_comp_desc,
	(struct usb_descriptor_header *)&as_iso_in_desc,

	(struct usb_descriptor_header *)&USB_IN_STD_ALT_DESC(6),
	(struct usb_descriptor_header *)&USB_IN_AS_HDR_DESC(6),
	(struct usb_descriptor_header *)&USB_IN_TYPE_I_FMT_DESC(6),
	(struct usb_descriptor_header *)&hs_epin_desc,
	(struct usb_descriptor_header *)&ss_epin_comp_desc,
	(struct usb_descriptor_header *)&as_iso_in_desc,
	NULL,
	NULL,
};
};


@@ -1624,8 +1751,12 @@ afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt)
				as_out_alt_setting[alt-1][2])->bSubslotSize;
				as_out_alt_setting[alt-1][2])->bSubslotSize;
			opts->c_chmask = ((struct uac2_as_header_descriptor *)
			opts->c_chmask = ((struct uac2_as_header_descriptor *)
				as_out_alt_setting[alt-1][1])->bmChannelConfig;
				as_out_alt_setting[alt-1][1])->bmChannelConfig;
			pr_debug("%s: values set c_ssize:%u c_chmask:%u\n",
			opts->c_sres =
				__func__, opts->c_ssize, opts->c_chmask);
			((struct uac2_format_type_i_descriptor *)
				as_out_alt_setting[alt-1][2])->bBitResolution;
			pr_debug("%s: values set c_ssize:%u c_sres:%u c_chmask:%u\n",
				__func__, opts->c_ssize, opts->c_sres,
				opts->c_chmask);
			pr_debug("%s: scheduling connect c_uevent_work\n",
			pr_debug("%s: scheduling connect c_uevent_work\n",
					__func__);
					__func__);
			queue_delayed_work(agdev->uevent_wq, &agdev->c_work,
			queue_delayed_work(agdev->uevent_wq, &agdev->c_work,
@@ -1660,8 +1791,12 @@ afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt)
				as_in_alt_setting[alt-1][2])->bSubslotSize;
				as_in_alt_setting[alt-1][2])->bSubslotSize;
			opts->p_chmask = ((struct uac2_as_header_descriptor *)
			opts->p_chmask = ((struct uac2_as_header_descriptor *)
				as_in_alt_setting[alt-1][1])->bmChannelConfig;
				as_in_alt_setting[alt-1][1])->bmChannelConfig;
			pr_debug("%s: values set p_ssize:%u p_chmask:%u\n",
			opts->p_sres =
				__func__, opts->p_ssize, opts->p_chmask);
			((struct uac2_format_type_i_descriptor *)
				as_in_alt_setting[alt-1][2])->bBitResolution;
			pr_debug("%s: values set p_ssize:%u p_sres:%u p_chmask:%u\n",
				__func__, opts->p_ssize, opts->p_sres,
				opts->p_chmask);
			pr_debug("%s: scheduling connect p_uevent_work\n",
			pr_debug("%s: scheduling connect p_uevent_work\n",
					__func__);
					__func__);
			queue_delayed_work(agdev->uevent_wq, &agdev->p_work,
			queue_delayed_work(agdev->uevent_wq, &agdev->p_work,
@@ -2095,9 +2230,11 @@ static struct usb_function_instance *afunc_alloc_inst(void)
	opts->p_chmask = UAC2_DEF_PCHMASK;
	opts->p_chmask = UAC2_DEF_PCHMASK;
	opts->p_srate = UAC2_DEF_PSRATE;
	opts->p_srate = UAC2_DEF_PSRATE;
	opts->p_ssize = UAC2_DEF_PSSIZE;
	opts->p_ssize = UAC2_DEF_PSSIZE;
	opts->p_sres = UAC2_DEF_PSBITRES;
	opts->c_chmask = UAC2_DEF_CCHMASK;
	opts->c_chmask = UAC2_DEF_CCHMASK;
	opts->c_srate = UAC2_DEF_CSRATE;
	opts->c_srate = UAC2_DEF_CSRATE;
	opts->c_ssize = UAC2_DEF_CSSIZE;
	opts->c_ssize = UAC2_DEF_CSSIZE;
	opts->c_sres = UAC2_DEF_CSBITRES;
	return &opts->func_inst;
	return &opts->func_inst;
}
}


+4 −0
Original line number Original line Diff line number Diff line
@@ -21,18 +21,22 @@
#define UAC2_DEF_PCHMASK 0x3
#define UAC2_DEF_PCHMASK 0x3
#define UAC2_DEF_PSRATE 48000
#define UAC2_DEF_PSRATE 48000
#define UAC2_DEF_PSSIZE 2
#define UAC2_DEF_PSSIZE 2
#define UAC2_DEF_PSBITRES 16
#define UAC2_DEF_CCHMASK 0x3
#define UAC2_DEF_CCHMASK 0x3
#define UAC2_DEF_CSRATE 44100
#define UAC2_DEF_CSRATE 44100
#define UAC2_DEF_CSSIZE 2
#define UAC2_DEF_CSSIZE 2
#define UAC2_DEF_CSBITRES 16


struct f_uac2_opts {
struct f_uac2_opts {
	struct usb_function_instance	func_inst;
	struct usb_function_instance	func_inst;
	int				p_chmask;
	int				p_chmask;
	int				p_srate;
	int				p_srate;
	int				p_ssize;
	int				p_ssize;
	int				p_sres;
	int				c_chmask;
	int				c_chmask;
	int				c_srate;
	int				c_srate;
	int				c_ssize;
	int				c_ssize;
	int				c_sres;
	bool				bound;
	bool				bound;


	struct mutex			lock;
	struct mutex			lock;