* [PATCH v3 00/11] usb: gadget: audio: Multiple rates, notify
@ 2022-01-09 11:59 Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 01/11] usb: gadget:audio: Replace deprecated macro S_IRUGO Pavel Hofman
` (10 more replies)
0 siblings, 11 replies; 15+ messages in thread
From: Pavel Hofman @ 2022-01-09 11:59 UTC (permalink / raw)
To: linux-usb
Cc: Pavel Hofman, Ruslan Bilovol, Felipe Balbi, Jerome Brunet,
Julian Scheel, John Keeping, Greg Kroah-Hartman
This series implements:
* Support for multiple rates in the audio gadget
* Notification of gadget-side alsa processes about playback/capture
start/stop on the host side via Playback/Capture Rate controls.
* Detection of the USB cable disconnection by handling SUSPEND call
in f_uac1/2. The disconnection generates a stop notification.
Patches for the multirate support, originally authored by Julian Scheel,
were rebased and modified for the current code base. Julian has
acknowledged the presented patches.
The detection of cable disconnection was discussed with dwc2 maintainer
Minas Harutyunyan who confirmed that the suspend event can be used
(https://lore.kernel.org/all/5aada8e3-f385-0589-8d58-187abd1a924d@synopsys.com/T/).
Tests on dwc2 have confirmed reliable detection, the gadget correctly
reports playback/capture stop at cable disconnection.
The start/stop/current rate notification feature is accompanied by
example implementation of audio gadget controller
https://github.com/pavhofman/gaudio_ctl. The controller also handles
debouncing fast start/stop events when USB host audio driver is loaded
and/or audio daemon re/started.
Changes:
--------
v2:
* Fixed compilation of "usb: gadget: f_uac1: Support multiple sampling
rates" - added changes for CONFIG_GADGET_UAC1
v3:
* Implemented most of changes suggested by John Keeping
* Patches for bInterval calculation moved to a separate patch series
* Patches for stopping substreams moved to a separate patch series
* audio: Replaced deprecated macro S_IRUGO
* u_audio: Moved dynamic srate from params to rtd
* f_uac2: removed current state srates from struct f_uac2_opts, using
u_audio_get_playback/capture_srate() instead.
* f_uac2: Reworked macros for struct cntrl_ranges_lay3_xxx
Julian Scheel (4):
usb: gadget: u_audio: Support multiple sampling rates
usb: gadget: f_uac2: Support multiple sampling rates
usb: gadget: f_uac2: Rename Clock Sources to fixed names
usb: gadget: f_uac1: Support multiple sampling rates
Pavel Hofman (7):
usb: gadget:audio: Replace deprecated macro S_IRUGO
usb: gadget: u_audio: Move dynamic srate from params to rtd
usb: gadget: u_audio: Add capture/playback srate getter
usb: gadget: u_audio: Rate ctl notifies about current srate
(0=stopped)
usb: gadget: u_audio: Add suspend call
usb: gadget: f_uac2: Add suspend callback
usb: gadget: f_uac1: Add suspend callback
.../ABI/testing/configfs-usb-gadget-uac1 | 4 +-
.../ABI/testing/configfs-usb-gadget-uac2 | 4 +-
Documentation/usb/gadget-testing.rst | 8 +-
drivers/usb/gadget/function/f_uac1.c | 190 ++++++++++++--
drivers/usb/gadget/function/f_uac2.c | 209 ++++++++++++---
drivers/usb/gadget/function/u_audio.c | 238 ++++++++++++++++--
drivers/usb/gadget/function/u_audio.h | 14 +-
drivers/usb/gadget/function/u_uac1.h | 5 +-
drivers/usb/gadget/function/u_uac2.h | 5 +-
drivers/usb/gadget/function/uac_common.h | 9 +
drivers/usb/gadget/legacy/audio.c | 78 +++---
11 files changed, 635 insertions(+), 129 deletions(-)
create mode 100644 drivers/usb/gadget/function/uac_common.h
--
2.25.1
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v3 01/11] usb: gadget:audio: Replace deprecated macro S_IRUGO
2022-01-09 11:59 [PATCH v3 00/11] usb: gadget: audio: Multiple rates, notify Pavel Hofman
@ 2022-01-09 11:59 ` Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 02/11] usb: gadget: u_audio: Support multiple sampling rates Pavel Hofman
` (9 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Pavel Hofman @ 2022-01-09 11:59 UTC (permalink / raw)
To: linux-usb
Cc: Pavel Hofman, Ruslan Bilovol, Felipe Balbi, Jerome Brunet,
Julian Scheel, John Keeping, Greg Kroah-Hartman
Use octal digits as suggested by checkpatch instead of the deprecated
macro.
Signed-off-by: Pavel Hofman <pavel.hofman@ivitera.com>
---
v3: new patch
---
drivers/usb/gadget/legacy/audio.c | 36 +++++++++++++++----------------
1 file changed, 18 insertions(+), 18 deletions(-)
diff --git a/drivers/usb/gadget/legacy/audio.c b/drivers/usb/gadget/legacy/audio.c
index a748ed0842e8..5ec477ffab7f 100644
--- a/drivers/usb/gadget/legacy/audio.c
+++ b/drivers/usb/gadget/legacy/audio.c
@@ -22,32 +22,32 @@ USB_GADGET_COMPOSITE_OPTIONS();
/* Playback(USB-IN) Default Stereo - Fl/Fr */
static int p_chmask = UAC2_DEF_PCHMASK;
-module_param(p_chmask, uint, S_IRUGO);
+module_param(p_chmask, uint, 0444);
MODULE_PARM_DESC(p_chmask, "Playback Channel Mask");
/* Playback Default 48 KHz */
static int p_srate = UAC2_DEF_PSRATE;
-module_param(p_srate, uint, S_IRUGO);
+module_param(p_srate, uint, 0444);
MODULE_PARM_DESC(p_srate, "Playback Sampling Rate");
/* Playback Default 16bits/sample */
static int p_ssize = UAC2_DEF_PSSIZE;
-module_param(p_ssize, uint, S_IRUGO);
+module_param(p_ssize, uint, 0444);
MODULE_PARM_DESC(p_ssize, "Playback Sample Size(bytes)");
/* Capture(USB-OUT) Default Stereo - Fl/Fr */
static int c_chmask = UAC2_DEF_CCHMASK;
-module_param(c_chmask, uint, S_IRUGO);
+module_param(c_chmask, uint, 0444);
MODULE_PARM_DESC(c_chmask, "Capture Channel Mask");
/* Capture Default 64 KHz */
static int c_srate = UAC2_DEF_CSRATE;
-module_param(c_srate, uint, S_IRUGO);
+module_param(c_srate, uint, 0444);
MODULE_PARM_DESC(c_srate, "Capture Sampling Rate");
/* Capture Default 16bits/sample */
static int c_ssize = UAC2_DEF_CSSIZE;
-module_param(c_ssize, uint, S_IRUGO);
+module_param(c_ssize, uint, 0444);
MODULE_PARM_DESC(c_ssize, "Capture Sample Size(bytes)");
#else
#ifndef CONFIG_GADGET_UAC1_LEGACY
@@ -55,58 +55,58 @@ MODULE_PARM_DESC(c_ssize, "Capture Sample Size(bytes)");
/* Playback(USB-IN) Default Stereo - Fl/Fr */
static int p_chmask = UAC1_DEF_PCHMASK;
-module_param(p_chmask, uint, S_IRUGO);
+module_param(p_chmask, uint, 0444);
MODULE_PARM_DESC(p_chmask, "Playback Channel Mask");
/* Playback Default 48 KHz */
static int p_srate = UAC1_DEF_PSRATE;
-module_param(p_srate, uint, S_IRUGO);
+module_param(p_srate, uint, 0444);
MODULE_PARM_DESC(p_srate, "Playback Sampling Rate");
/* Playback Default 16bits/sample */
static int p_ssize = UAC1_DEF_PSSIZE;
-module_param(p_ssize, uint, S_IRUGO);
+module_param(p_ssize, uint, 0444);
MODULE_PARM_DESC(p_ssize, "Playback Sample Size(bytes)");
/* Capture(USB-OUT) Default Stereo - Fl/Fr */
static int c_chmask = UAC1_DEF_CCHMASK;
-module_param(c_chmask, uint, S_IRUGO);
+module_param(c_chmask, uint, 0444);
MODULE_PARM_DESC(c_chmask, "Capture Channel Mask");
/* Capture Default 48 KHz */
static int c_srate = UAC1_DEF_CSRATE;
-module_param(c_srate, uint, S_IRUGO);
+module_param(c_srate, uint, 0444);
MODULE_PARM_DESC(c_srate, "Capture Sampling Rate");
/* Capture Default 16bits/sample */
static int c_ssize = UAC1_DEF_CSSIZE;
-module_param(c_ssize, uint, S_IRUGO);
+module_param(c_ssize, uint, 0444);
MODULE_PARM_DESC(c_ssize, "Capture Sample Size(bytes)");
#else /* CONFIG_GADGET_UAC1_LEGACY */
#include "u_uac1_legacy.h"
static char *fn_play = FILE_PCM_PLAYBACK;
-module_param(fn_play, charp, S_IRUGO);
+module_param(fn_play, charp, 0444);
MODULE_PARM_DESC(fn_play, "Playback PCM device file name");
static char *fn_cap = FILE_PCM_CAPTURE;
-module_param(fn_cap, charp, S_IRUGO);
+module_param(fn_cap, charp, 0444);
MODULE_PARM_DESC(fn_cap, "Capture PCM device file name");
static char *fn_cntl = FILE_CONTROL;
-module_param(fn_cntl, charp, S_IRUGO);
+module_param(fn_cntl, charp, 0444);
MODULE_PARM_DESC(fn_cntl, "Control device file name");
static int req_buf_size = UAC1_OUT_EP_MAX_PACKET_SIZE;
-module_param(req_buf_size, int, S_IRUGO);
+module_param(req_buf_size, int, 0444);
MODULE_PARM_DESC(req_buf_size, "ISO OUT endpoint request buffer size");
static int req_count = UAC1_REQ_COUNT;
-module_param(req_count, int, S_IRUGO);
+module_param(req_count, int, 0444);
MODULE_PARM_DESC(req_count, "ISO OUT endpoint request count");
static int audio_buf_size = UAC1_AUDIO_BUF_SIZE;
-module_param(audio_buf_size, int, S_IRUGO);
+module_param(audio_buf_size, int, 0444);
MODULE_PARM_DESC(audio_buf_size, "Audio buffer size");
#endif /* CONFIG_GADGET_UAC1_LEGACY */
#endif
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 02/11] usb: gadget: u_audio: Support multiple sampling rates
2022-01-09 11:59 [PATCH v3 00/11] usb: gadget: audio: Multiple rates, notify Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 01/11] usb: gadget:audio: Replace deprecated macro S_IRUGO Pavel Hofman
@ 2022-01-09 11:59 ` Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 03/11] usb: gadget: u_audio: Move dynamic srate from params to rtd Pavel Hofman
` (8 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Pavel Hofman @ 2022-01-09 11:59 UTC (permalink / raw)
To: linux-usb
Cc: Pavel Hofman, Ruslan Bilovol, Felipe Balbi, Jerome Brunet,
Julian Scheel, John Keeping, Greg Kroah-Hartman
From: Julian Scheel <julian@jusst.de>
Implement support for multiple sampling rates in u_audio part of the
audio gadget. The currently configured rates are exposed through
read-only amixer controls 'Capture Rate' and 'Playback Rate'.
Signed-off-by: Julian Scheel <julian@jusst.de>
Signed-off-by: Pavel Hofman <pavel.hofman@ivitera.com>
---
v3: removed unused variables in u_audio.c
---
drivers/usb/gadget/function/f_uac1.c | 2 +
drivers/usb/gadget/function/f_uac2.c | 2 +
drivers/usb/gadget/function/u_audio.c | 131 +++++++++++++++++++++++
drivers/usb/gadget/function/u_audio.h | 10 +-
drivers/usb/gadget/function/uac_common.h | 9 ++
5 files changed, 152 insertions(+), 2 deletions(-)
create mode 100644 drivers/usb/gadget/function/uac_common.h
diff --git a/drivers/usb/gadget/function/f_uac1.c b/drivers/usb/gadget/function/f_uac1.c
index 03f50643fbba..ccb0e4f41e5d 100644
--- a/drivers/usb/gadget/function/f_uac1.c
+++ b/drivers/usb/gadget/function/f_uac1.c
@@ -1298,6 +1298,7 @@ static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
audio->in_ep_maxpsize = le16_to_cpu(as_in_ep_desc.wMaxPacketSize);
audio->params.c_chmask = audio_opts->c_chmask;
audio->params.c_srate = audio_opts->c_srate;
+ audio->params.c_srates[0] = audio_opts->c_srate;
audio->params.c_ssize = audio_opts->c_ssize;
if (FUIN_EN(audio_opts)) {
audio->params.p_fu.id = USB_IN_FU_ID;
@@ -1310,6 +1311,7 @@ static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
}
audio->params.p_chmask = audio_opts->p_chmask;
audio->params.p_srate = audio_opts->p_srate;
+ audio->params.p_srates[0] = audio_opts->p_srate;
audio->params.p_ssize = audio_opts->p_ssize;
if (FUOUT_EN(audio_opts)) {
audio->params.c_fu.id = USB_OUT_FU_ID;
diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c
index 36fa6ef0581b..1334691073a0 100644
--- a/drivers/usb/gadget/function/f_uac2.c
+++ b/drivers/usb/gadget/function/f_uac2.c
@@ -1210,6 +1210,7 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
agdev->params.p_chmask = uac2_opts->p_chmask;
agdev->params.p_srate = uac2_opts->p_srate;
+ agdev->params.p_srates[0] = uac2_opts->p_srate;
agdev->params.p_ssize = uac2_opts->p_ssize;
if (FUIN_EN(uac2_opts)) {
agdev->params.p_fu.id = USB_IN_FU_ID;
@@ -1221,6 +1222,7 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
}
agdev->params.c_chmask = uac2_opts->c_chmask;
agdev->params.c_srate = uac2_opts->c_srate;
+ agdev->params.c_srates[0] = uac2_opts->c_srate;
agdev->params.c_ssize = uac2_opts->c_ssize;
if (FUOUT_EN(uac2_opts)) {
agdev->params.c_fu.id = USB_OUT_FU_ID;
diff --git a/drivers/usb/gadget/function/u_audio.c b/drivers/usb/gadget/function/u_audio.c
index 4561d7a183ff..50ccb36d22d7 100644
--- a/drivers/usb/gadget/function/u_audio.c
+++ b/drivers/usb/gadget/function/u_audio.c
@@ -32,6 +32,7 @@ enum {
UAC_P_PITCH_CTRL,
UAC_MUTE_CTRL,
UAC_VOLUME_CTRL,
+ UAC_RATE_CTRL,
};
/* Runtime data params for one stream */
@@ -62,6 +63,8 @@ struct uac_rtd_params {
s16 volume;
int mute;
+ struct snd_kcontrol *snd_kctl_rate; /* read-only current rate */
+
spinlock_t lock; /* lock for control transfers */
};
@@ -493,6 +496,44 @@ static inline void free_ep_fback(struct uac_rtd_params *prm, struct usb_ep *ep)
dev_err(uac->card->dev, "%s:%d Error!\n", __func__, __LINE__);
}
+int u_audio_set_capture_srate(struct g_audio *audio_dev, int srate)
+{
+ struct uac_params *params = &audio_dev->params;
+ int i;
+
+ dev_dbg(&audio_dev->gadget->dev, "%s: srate %d\n", __func__, srate);
+ for (i = 0; i < UAC_MAX_RATES; i++) {
+ if (params->c_srates[i] == srate) {
+ params->c_srate = srate;
+ return 0;
+ }
+ if (params->c_srates[i] == 0)
+ break;
+ }
+
+ return -EINVAL;
+}
+EXPORT_SYMBOL_GPL(u_audio_set_capture_srate);
+
+int u_audio_set_playback_srate(struct g_audio *audio_dev, int srate)
+{
+ struct uac_params *params = &audio_dev->params;
+ int i;
+
+ dev_dbg(&audio_dev->gadget->dev, "%s: srate %d\n", __func__, srate);
+ for (i = 0; i < UAC_MAX_RATES; i++) {
+ if (params->p_srates[i] == srate) {
+ params->p_srate = srate;
+ return 0;
+ }
+ if (params->p_srates[i] == 0)
+ break;
+ }
+
+ return -EINVAL;
+}
+EXPORT_SYMBOL_GPL(u_audio_set_playback_srate);
+
int u_audio_start_capture(struct g_audio *audio_dev)
{
struct snd_uac_chip *uac = audio_dev->uac;
@@ -504,6 +545,7 @@ int u_audio_start_capture(struct g_audio *audio_dev)
struct uac_params *params = &audio_dev->params;
int req_len, i;
+ dev_dbg(dev, "start capture with rate %d\n", params->c_srate);
ep = audio_dev->out_ep;
prm = &uac->c_prm;
config_ep_by_speed(gadget, &audio_dev->func, ep);
@@ -596,6 +638,7 @@ int u_audio_start_playback(struct g_audio *audio_dev)
int req_len, i;
unsigned int p_pktsize;
+ dev_dbg(dev, "start playback with rate %d\n", params->p_srate);
ep = audio_dev->in_ep;
prm = &uac->p_prm;
config_ep_by_speed(gadget, &audio_dev->func, ep);
@@ -943,6 +986,68 @@ static int u_audio_volume_put(struct snd_kcontrol *kcontrol,
return change;
}
+static int get_max_srate(const int *srates)
+{
+ int i, max_srate = 0;
+
+ for (i = 0; i < UAC_MAX_RATES; i++) {
+ if (srates[i] == 0)
+ break;
+ if (srates[i] > max_srate)
+ max_srate = srates[i];
+ }
+ return max_srate;
+}
+
+static int get_min_srate(const int *srates)
+{
+ int i, min_srate = INT_MAX;
+
+ for (i = 0; i < UAC_MAX_RATES; i++) {
+ if (srates[i] == 0)
+ break;
+ if (srates[i] < min_srate)
+ min_srate = srates[i];
+ }
+ return min_srate;
+}
+
+static int u_audio_rate_info(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_info *uinfo)
+{
+ const int *srates;
+ struct uac_rtd_params *prm = snd_kcontrol_chip(kcontrol);
+ struct snd_uac_chip *uac = prm->uac;
+ struct g_audio *audio_dev = uac->audio_dev;
+ struct uac_params *params = &audio_dev->params;
+
+ uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
+ uinfo->count = 1;
+
+ if (prm == &uac->c_prm)
+ srates = params->c_srates;
+ else
+ srates = params->p_srates;
+ uinfo->value.integer.min = get_min_srate(srates);
+ uinfo->value.integer.max = get_max_srate(srates);
+ return 0;
+}
+
+static int u_audio_rate_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct uac_rtd_params *prm = snd_kcontrol_chip(kcontrol);
+ struct snd_uac_chip *uac = prm->uac;
+ struct g_audio *audio_dev = uac->audio_dev;
+ struct uac_params *params = &audio_dev->params;
+
+ if (prm == &uac->c_prm)
+ ucontrol->value.integer.value[0] = params->c_srate;
+ else
+ ucontrol->value.integer.value[0] = params->p_srate;
+
+ return 0;
+}
static struct snd_kcontrol_new u_audio_controls[] = {
[UAC_FBACK_CTRL] {
@@ -973,6 +1078,13 @@ static struct snd_kcontrol_new u_audio_controls[] = {
.get = u_audio_volume_get,
.put = u_audio_volume_put,
},
+ [UAC_RATE_CTRL] {
+ .iface = SNDRV_CTL_ELEM_IFACE_PCM,
+ .name = "", /* will be filled later */
+ .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
+ .info = u_audio_rate_info,
+ .get = u_audio_rate_get,
+ },
};
int g_audio_setup(struct g_audio *g_audio, const char *pcm_name,
@@ -1186,6 +1298,25 @@ int g_audio_setup(struct g_audio *g_audio, const char *pcm_name,
prm->volume_min = fu->volume_min;
prm->volume_res = fu->volume_res;
}
+
+ /* Add rate control */
+ snprintf(ctrl_name, sizeof(ctrl_name),
+ "%s Rate", direction);
+ u_audio_controls[UAC_RATE_CTRL].name = ctrl_name;
+
+ kctl = snd_ctl_new1(&u_audio_controls[UAC_RATE_CTRL], prm);
+ if (!kctl) {
+ err = -ENOMEM;
+ goto snd_fail;
+ }
+
+ kctl->id.device = pcm->device;
+ kctl->id.subdevice = 0;
+
+ err = snd_ctl_add(card, kctl);
+ if (err < 0)
+ goto snd_fail;
+ prm->snd_kctl_rate = kctl;
}
strscpy(card->driver, card_name, sizeof(card->driver));
diff --git a/drivers/usb/gadget/function/u_audio.h b/drivers/usb/gadget/function/u_audio.h
index 8dfdae1721cd..76b5b8169444 100644
--- a/drivers/usb/gadget/function/u_audio.h
+++ b/drivers/usb/gadget/function/u_audio.h
@@ -10,6 +10,7 @@
#define __U_AUDIO_H
#include <linux/usb/composite.h>
+#include "uac_common.h"
/*
* Same maximum frequency deviation on the slower side as in
@@ -40,13 +41,15 @@ struct uac_fu_params {
struct uac_params {
/* playback */
int p_chmask; /* channel mask */
- int p_srate; /* rate in Hz */
+ int p_srates[UAC_MAX_RATES]; /* available rates in Hz (0 terminated list) */
+ int p_srate; /* selected rate in Hz */
int p_ssize; /* sample size */
struct uac_fu_params p_fu; /* Feature Unit parameters */
/* capture */
int c_chmask; /* channel mask */
- int c_srate; /* rate in Hz */
+ int c_srates[UAC_MAX_RATES]; /* available rates in Hz (0 terminated list) */
+ int c_srate; /* selected rate in Hz */
int c_ssize; /* sample size */
struct uac_fu_params c_fu; /* Feature Unit parameters */
@@ -117,6 +120,9 @@ void u_audio_stop_capture(struct g_audio *g_audio);
int u_audio_start_playback(struct g_audio *g_audio);
void u_audio_stop_playback(struct g_audio *g_audio);
+int u_audio_set_capture_srate(struct g_audio *audio_dev, int srate);
+int u_audio_set_playback_srate(struct g_audio *audio_dev, int srate);
+
int u_audio_get_volume(struct g_audio *g_audio, int playback, s16 *val);
int u_audio_set_volume(struct g_audio *g_audio, int playback, s16 val);
int u_audio_get_mute(struct g_audio *g_audio, int playback, int *val);
diff --git a/drivers/usb/gadget/function/uac_common.h b/drivers/usb/gadget/function/uac_common.h
new file mode 100644
index 000000000000..3ecf89d6e814
--- /dev/null
+++ b/drivers/usb/gadget/function/uac_common.h
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ */
+
+#ifndef UAC_COMMON_H
+#define UAC_COMMON_H
+
+#define UAC_MAX_RATES 10 /* maximum number of rates configurable by f_uac1/2 */
+#endif
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 03/11] usb: gadget: u_audio: Move dynamic srate from params to rtd
2022-01-09 11:59 [PATCH v3 00/11] usb: gadget: audio: Multiple rates, notify Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 01/11] usb: gadget:audio: Replace deprecated macro S_IRUGO Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 02/11] usb: gadget: u_audio: Support multiple sampling rates Pavel Hofman
@ 2022-01-09 11:59 ` Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 04/11] usb: gadget: u_audio: Add capture/playback srate getter Pavel Hofman
` (7 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Pavel Hofman @ 2022-01-09 11:59 UTC (permalink / raw)
To: linux-usb
Cc: Pavel Hofman, Ruslan Bilovol, Felipe Balbi, Jerome Brunet,
Julian Scheel, John Keeping, Greg Kroah-Hartman
Parameters uac_params.p_srate/c_srate are dynamic now and are not part
of parametric configuration anymore. Move them to the
runtime struct uac_rtd_params for each stream.
Signed-off-by: Pavel Hofman <pavel.hofman@ivitera.com>
---
v3: new patch
---
drivers/usb/gadget/function/f_uac1.c | 2 -
drivers/usb/gadget/function/f_uac2.c | 2 -
drivers/usb/gadget/function/u_audio.c | 68 ++++++++++++++-------------
drivers/usb/gadget/function/u_audio.h | 4 +-
4 files changed, 38 insertions(+), 38 deletions(-)
diff --git a/drivers/usb/gadget/function/f_uac1.c b/drivers/usb/gadget/function/f_uac1.c
index ccb0e4f41e5d..0397b27df42e 100644
--- a/drivers/usb/gadget/function/f_uac1.c
+++ b/drivers/usb/gadget/function/f_uac1.c
@@ -1297,7 +1297,6 @@ static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
audio->out_ep_maxpsize = le16_to_cpu(as_out_ep_desc.wMaxPacketSize);
audio->in_ep_maxpsize = le16_to_cpu(as_in_ep_desc.wMaxPacketSize);
audio->params.c_chmask = audio_opts->c_chmask;
- audio->params.c_srate = audio_opts->c_srate;
audio->params.c_srates[0] = audio_opts->c_srate;
audio->params.c_ssize = audio_opts->c_ssize;
if (FUIN_EN(audio_opts)) {
@@ -1310,7 +1309,6 @@ static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
audio->params.p_fu.volume_res = audio_opts->p_volume_res;
}
audio->params.p_chmask = audio_opts->p_chmask;
- audio->params.p_srate = audio_opts->p_srate;
audio->params.p_srates[0] = audio_opts->p_srate;
audio->params.p_ssize = audio_opts->p_ssize;
if (FUOUT_EN(audio_opts)) {
diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c
index 1334691073a0..e518f210968c 100644
--- a/drivers/usb/gadget/function/f_uac2.c
+++ b/drivers/usb/gadget/function/f_uac2.c
@@ -1209,7 +1209,6 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
agdev->gadget = gadget;
agdev->params.p_chmask = uac2_opts->p_chmask;
- agdev->params.p_srate = uac2_opts->p_srate;
agdev->params.p_srates[0] = uac2_opts->p_srate;
agdev->params.p_ssize = uac2_opts->p_ssize;
if (FUIN_EN(uac2_opts)) {
@@ -1221,7 +1220,6 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
agdev->params.p_fu.volume_res = uac2_opts->p_volume_res;
}
agdev->params.c_chmask = uac2_opts->c_chmask;
- agdev->params.c_srate = uac2_opts->c_srate;
agdev->params.c_srates[0] = uac2_opts->c_srate;
agdev->params.c_ssize = uac2_opts->c_ssize;
if (FUOUT_EN(uac2_opts)) {
diff --git a/drivers/usb/gadget/function/u_audio.c b/drivers/usb/gadget/function/u_audio.c
index 50ccb36d22d7..dce894dcae07 100644
--- a/drivers/usb/gadget/function/u_audio.c
+++ b/drivers/usb/gadget/function/u_audio.c
@@ -64,6 +64,7 @@ struct uac_rtd_params {
int mute;
struct snd_kcontrol *snd_kctl_rate; /* read-only current rate */
+ int srate; /* selected samplerate */
spinlock_t lock; /* lock for control transfers */
@@ -153,8 +154,6 @@ static void u_audio_iso_complete(struct usb_ep *ep, struct usb_request *req)
struct snd_pcm_runtime *runtime;
struct uac_rtd_params *prm = req->context;
struct snd_uac_chip *uac = prm->uac;
- struct g_audio *audio_dev = uac->audio_dev;
- struct uac_params *params = &audio_dev->params;
unsigned int frames, p_pktsize;
unsigned long long pitched_rate_mil, p_pktsize_residue_mil,
residue_frames_mil, div_result;
@@ -199,15 +198,14 @@ static void u_audio_iso_complete(struct usb_ep *ep, struct usb_request *req)
*/
unsigned long long p_interval_mil = uac->p_interval * 1000000ULL;
- pitched_rate_mil = (unsigned long long)
- params->p_srate * prm->pitch;
+ pitched_rate_mil = (unsigned long long) prm->srate * prm->pitch;
div_result = pitched_rate_mil;
do_div(div_result, uac->p_interval);
do_div(div_result, 1000000);
frames = (unsigned int) div_result;
pr_debug("p_srate %d, pitch %d, interval_mil %llu, frames %d\n",
- params->p_srate, prm->pitch, p_interval_mil, frames);
+ prm->srate, prm->pitch, p_interval_mil, frames);
p_pktsize = min_t(unsigned int,
uac->p_framesize * frames,
@@ -284,7 +282,6 @@ static void u_audio_iso_fback_complete(struct usb_ep *ep,
struct uac_rtd_params *prm = req->context;
struct snd_uac_chip *uac = prm->uac;
struct g_audio *audio_dev = uac->audio_dev;
- struct uac_params *params = &audio_dev->params;
int status = req->status;
/* i/f shutting down */
@@ -306,7 +303,7 @@ static void u_audio_iso_fback_complete(struct usb_ep *ep,
__func__, status, req->actual, req->length);
u_audio_set_fback_frequency(audio_dev->gadget->speed, audio_dev->out_ep,
- params->c_srate, prm->pitch,
+ prm->srate, prm->pitch,
req->buf);
if (usb_ep_queue(ep, req, GFP_ATOMIC))
@@ -390,16 +387,14 @@ static int uac_pcm_open(struct snd_pcm_substream *substream)
struct snd_pcm_runtime *runtime = substream->runtime;
struct g_audio *audio_dev;
struct uac_params *params;
+ struct uac_rtd_params *prm;
int p_ssize, c_ssize;
- int p_srate, c_srate;
int p_chmask, c_chmask;
audio_dev = uac->audio_dev;
params = &audio_dev->params;
p_ssize = params->p_ssize;
c_ssize = params->c_ssize;
- p_srate = params->p_srate;
- c_srate = params->c_srate;
p_chmask = params->p_chmask;
c_chmask = params->c_chmask;
uac->p_residue_mil = 0;
@@ -407,19 +402,18 @@ static int uac_pcm_open(struct snd_pcm_substream *substream)
runtime->hw = uac_pcm_hardware;
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
- runtime->hw.rate_min = p_srate;
runtime->hw.formats = uac_ssize_to_fmt(p_ssize);
runtime->hw.channels_min = num_channels(p_chmask);
- runtime->hw.period_bytes_min = 2 * uac->p_prm.max_psize
- / runtime->hw.periods_min;
+ prm = &uac->p_prm;
} else {
- runtime->hw.rate_min = c_srate;
runtime->hw.formats = uac_ssize_to_fmt(c_ssize);
runtime->hw.channels_min = num_channels(c_chmask);
- runtime->hw.period_bytes_min = 2 * uac->c_prm.max_psize
- / runtime->hw.periods_min;
+ prm = &uac->c_prm;
}
+ runtime->hw.period_bytes_min = 2 * prm->max_psize
+ / runtime->hw.periods_min;
+ runtime->hw.rate_min = prm->srate;
runtime->hw.rate_max = runtime->hw.rate_min;
runtime->hw.channels_max = runtime->hw.channels_min;
@@ -499,12 +493,18 @@ static inline void free_ep_fback(struct uac_rtd_params *prm, struct usb_ep *ep)
int u_audio_set_capture_srate(struct g_audio *audio_dev, int srate)
{
struct uac_params *params = &audio_dev->params;
+ struct snd_uac_chip *uac = audio_dev->uac;
+ struct uac_rtd_params *prm;
int i;
+ unsigned long flags;
dev_dbg(&audio_dev->gadget->dev, "%s: srate %d\n", __func__, srate);
+ prm = &uac->c_prm;
for (i = 0; i < UAC_MAX_RATES; i++) {
if (params->c_srates[i] == srate) {
- params->c_srate = srate;
+ spin_lock_irqsave(&prm->lock, flags);
+ prm->srate = srate;
+ spin_unlock_irqrestore(&prm->lock, flags);
return 0;
}
if (params->c_srates[i] == 0)
@@ -518,12 +518,18 @@ EXPORT_SYMBOL_GPL(u_audio_set_capture_srate);
int u_audio_set_playback_srate(struct g_audio *audio_dev, int srate)
{
struct uac_params *params = &audio_dev->params;
+ struct snd_uac_chip *uac = audio_dev->uac;
+ struct uac_rtd_params *prm;
int i;
+ unsigned long flags;
dev_dbg(&audio_dev->gadget->dev, "%s: srate %d\n", __func__, srate);
+ prm = &uac->p_prm;
for (i = 0; i < UAC_MAX_RATES; i++) {
if (params->p_srates[i] == srate) {
- params->p_srate = srate;
+ spin_lock_irqsave(&prm->lock, flags);
+ prm->srate = srate;
+ spin_unlock_irqrestore(&prm->lock, flags);
return 0;
}
if (params->p_srates[i] == 0)
@@ -545,9 +551,9 @@ int u_audio_start_capture(struct g_audio *audio_dev)
struct uac_params *params = &audio_dev->params;
int req_len, i;
- dev_dbg(dev, "start capture with rate %d\n", params->c_srate);
- ep = audio_dev->out_ep;
prm = &uac->c_prm;
+ dev_dbg(dev, "start capture with rate %d\n", prm->srate);
+ ep = audio_dev->out_ep;
config_ep_by_speed(gadget, &audio_dev->func, ep);
req_len = ep->maxpacket;
@@ -604,7 +610,7 @@ int u_audio_start_capture(struct g_audio *audio_dev)
*/
prm->pitch = 1000000;
u_audio_set_fback_frequency(audio_dev->gadget->speed, ep,
- params->c_srate, prm->pitch,
+ prm->srate, prm->pitch,
req_fback->buf);
if (usb_ep_queue(ep_fback, req_fback, GFP_ATOMIC))
@@ -638,9 +644,9 @@ int u_audio_start_playback(struct g_audio *audio_dev)
int req_len, i;
unsigned int p_pktsize;
- dev_dbg(dev, "start playback with rate %d\n", params->p_srate);
- ep = audio_dev->in_ep;
prm = &uac->p_prm;
+ dev_dbg(dev, "start playback with rate %d\n", prm->srate);
+ ep = audio_dev->in_ep;
config_ep_by_speed(gadget, &audio_dev->func, ep);
ep_desc = ep->desc;
@@ -661,7 +667,7 @@ int u_audio_start_playback(struct g_audio *audio_dev)
uac->p_interval = factor / (1 << (ep_desc->bInterval - 1));
p_pktsize = min_t(unsigned int,
uac->p_framesize *
- (params->p_srate / uac->p_interval),
+ (prm->srate / uac->p_interval),
ep->maxpacket);
req_len = p_pktsize;
@@ -1037,15 +1043,11 @@ static int u_audio_rate_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct uac_rtd_params *prm = snd_kcontrol_chip(kcontrol);
- struct snd_uac_chip *uac = prm->uac;
- struct g_audio *audio_dev = uac->audio_dev;
- struct uac_params *params = &audio_dev->params;
-
- if (prm == &uac->c_prm)
- ucontrol->value.integer.value[0] = params->c_srate;
- else
- ucontrol->value.integer.value[0] = params->p_srate;
+ unsigned long flags;
+ spin_lock_irqsave(&prm->lock, flags);
+ ucontrol->value.integer.value[0] = prm->srate;
+ spin_unlock_irqrestore(&prm->lock, flags);
return 0;
}
@@ -1117,6 +1119,7 @@ int g_audio_setup(struct g_audio *g_audio, const char *pcm_name,
spin_lock_init(&prm->lock);
uac->c_prm.uac = uac;
prm->max_psize = g_audio->out_ep_maxpsize;
+ prm->srate = params->c_srates[0];
prm->reqs = kcalloc(params->req_number,
sizeof(struct usb_request *),
@@ -1141,6 +1144,7 @@ int g_audio_setup(struct g_audio *g_audio, const char *pcm_name,
spin_lock_init(&prm->lock);
uac->p_prm.uac = uac;
prm->max_psize = g_audio->in_ep_maxpsize;
+ prm->srate = params->p_srates[0];
prm->reqs = kcalloc(params->req_number,
sizeof(struct usb_request *),
diff --git a/drivers/usb/gadget/function/u_audio.h b/drivers/usb/gadget/function/u_audio.h
index 76b5b8169444..84579fe81b92 100644
--- a/drivers/usb/gadget/function/u_audio.h
+++ b/drivers/usb/gadget/function/u_audio.h
@@ -42,17 +42,17 @@ struct uac_params {
/* playback */
int p_chmask; /* channel mask */
int p_srates[UAC_MAX_RATES]; /* available rates in Hz (0 terminated list) */
- int p_srate; /* selected rate in Hz */
int p_ssize; /* sample size */
struct uac_fu_params p_fu; /* Feature Unit parameters */
/* capture */
int c_chmask; /* channel mask */
int c_srates[UAC_MAX_RATES]; /* available rates in Hz (0 terminated list) */
- int c_srate; /* selected rate in Hz */
int c_ssize; /* sample size */
struct uac_fu_params c_fu; /* Feature Unit parameters */
+ /* rates are dynamic, in uac_rtd_params */
+
int req_number; /* number of preallocated requests */
int fb_max; /* upper frequency drift feedback limit per-mil */
};
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 04/11] usb: gadget: u_audio: Add capture/playback srate getter
2022-01-09 11:59 [PATCH v3 00/11] usb: gadget: audio: Multiple rates, notify Pavel Hofman
` (2 preceding siblings ...)
2022-01-09 11:59 ` [PATCH v3 03/11] usb: gadget: u_audio: Move dynamic srate from params to rtd Pavel Hofman
@ 2022-01-09 11:59 ` Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 05/11] usb: gadget: f_uac2: Support multiple sampling rates Pavel Hofman
` (6 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Pavel Hofman @ 2022-01-09 11:59 UTC (permalink / raw)
To: linux-usb
Cc: Pavel Hofman, Ruslan Bilovol, Felipe Balbi, Jerome Brunet,
Julian Scheel, John Keeping, Greg Kroah-Hartman
UAC1/UAC2 functions will need to query u_audio about the currently set
srate. Add the getter functions.
Signed-off-by: Pavel Hofman <pavel.hofman@ivitera.com>
---
v3: new patch
---
drivers/usb/gadget/function/u_audio.c | 28 +++++++++++++++++++++++++++
drivers/usb/gadget/function/u_audio.h | 2 ++
2 files changed, 30 insertions(+)
diff --git a/drivers/usb/gadget/function/u_audio.c b/drivers/usb/gadget/function/u_audio.c
index dce894dcae07..283a449a9538 100644
--- a/drivers/usb/gadget/function/u_audio.c
+++ b/drivers/usb/gadget/function/u_audio.c
@@ -515,6 +515,20 @@ int u_audio_set_capture_srate(struct g_audio *audio_dev, int srate)
}
EXPORT_SYMBOL_GPL(u_audio_set_capture_srate);
+int u_audio_get_capture_srate(struct g_audio *audio_dev, u32 *val)
+{
+ struct snd_uac_chip *uac = audio_dev->uac;
+ struct uac_rtd_params *prm;
+ unsigned long flags;
+
+ prm = &uac->c_prm;
+ spin_lock_irqsave(&prm->lock, flags);
+ *val = prm->srate;
+ spin_unlock_irqrestore(&prm->lock, flags);
+ return 0;
+}
+EXPORT_SYMBOL_GPL(u_audio_get_capture_srate);
+
int u_audio_set_playback_srate(struct g_audio *audio_dev, int srate)
{
struct uac_params *params = &audio_dev->params;
@@ -540,6 +554,20 @@ int u_audio_set_playback_srate(struct g_audio *audio_dev, int srate)
}
EXPORT_SYMBOL_GPL(u_audio_set_playback_srate);
+int u_audio_get_playback_srate(struct g_audio *audio_dev, u32 *val)
+{
+ struct snd_uac_chip *uac = audio_dev->uac;
+ struct uac_rtd_params *prm;
+ unsigned long flags;
+
+ prm = &uac->p_prm;
+ spin_lock_irqsave(&prm->lock, flags);
+ *val = prm->srate;
+ spin_unlock_irqrestore(&prm->lock, flags);
+ return 0;
+}
+EXPORT_SYMBOL_GPL(u_audio_get_playback_srate);
+
int u_audio_start_capture(struct g_audio *audio_dev)
{
struct snd_uac_chip *uac = audio_dev->uac;
diff --git a/drivers/usb/gadget/function/u_audio.h b/drivers/usb/gadget/function/u_audio.h
index 84579fe81b92..5e6ed0f31cc3 100644
--- a/drivers/usb/gadget/function/u_audio.h
+++ b/drivers/usb/gadget/function/u_audio.h
@@ -120,7 +120,9 @@ void u_audio_stop_capture(struct g_audio *g_audio);
int u_audio_start_playback(struct g_audio *g_audio);
void u_audio_stop_playback(struct g_audio *g_audio);
+int u_audio_get_capture_srate(struct g_audio *audio_dev, u32 *val);
int u_audio_set_capture_srate(struct g_audio *audio_dev, int srate);
+int u_audio_get_playback_srate(struct g_audio *audio_dev, u32 *val);
int u_audio_set_playback_srate(struct g_audio *audio_dev, int srate);
int u_audio_get_volume(struct g_audio *g_audio, int playback, s16 *val);
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 05/11] usb: gadget: f_uac2: Support multiple sampling rates
2022-01-09 11:59 [PATCH v3 00/11] usb: gadget: audio: Multiple rates, notify Pavel Hofman
` (3 preceding siblings ...)
2022-01-09 11:59 ` [PATCH v3 04/11] usb: gadget: u_audio: Add capture/playback srate getter Pavel Hofman
@ 2022-01-09 11:59 ` Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 06/11] usb: gadget: f_uac2: Rename Clock Sources to fixed names Pavel Hofman
` (5 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Pavel Hofman @ 2022-01-09 11:59 UTC (permalink / raw)
To: linux-usb
Cc: Pavel Hofman, Ruslan Bilovol, Felipe Balbi, Jerome Brunet,
Julian Scheel, John Keeping, Greg Kroah-Hartman
From: Julian Scheel <julian@jusst.de>
A list of sampling rates can be specified via configfs. All enabled
sampling rates are sent to the USB host on request. When the host
selects a sampling rate, the internal active rate (stored in
struct f_uac2) is updated.
Config strings with single value stay compatible with the previous
version.
Multiple samplerates passed as configuration arrays to g_audio module
when built for f_uac2.
Signed-off-by: Julian Scheel <julian@jusst.de>
Signed-off-by: Pavel Hofman <pavel.hofman@ivitera.com>
---
v3:
* audio.c: fixed unused variables for CONFIG_UAC1 variants
* audio: used 0444 instead of S_IRUGO
* f_uac2: renamed ctl_id -> clock_id + added explaining
comment
* f_uac2: removed current state srates from struct f_uac2_opts, using
u_audio_get_playback/capture_srate() instead.
* f_uac2: renamed UAC_RATE2_ATTRIBUTE -> UAC2_RATE_ATTRIBUTE, moved from
u_uac2.h to f_uac2.c
* renamed confusing cntrl_range_lay3 to cntrl_subrange_lay3
* struct cntrl_ranges_lay3_xxx is created with DECLARE_UAC2_CNTRL_RANGES_LAY3
* fixed ranges_size calculation, renamed to specific ranges_lay3_size
* updated commit message
---
.../ABI/testing/configfs-usb-gadget-uac2 | 4 +-
Documentation/usb/gadget-testing.rst | 4 +-
drivers/usb/gadget/function/f_uac2.c | 196 +++++++++++++++---
drivers/usb/gadget/function/u_uac2.h | 5 +-
drivers/usb/gadget/legacy/audio.c | 25 ++-
5 files changed, 186 insertions(+), 48 deletions(-)
diff --git a/Documentation/ABI/testing/configfs-usb-gadget-uac2 b/Documentation/ABI/testing/configfs-usb-gadget-uac2
index 7fb3dbe26857..9d2f59ab9701 100644
--- a/Documentation/ABI/testing/configfs-usb-gadget-uac2
+++ b/Documentation/ABI/testing/configfs-usb-gadget-uac2
@@ -6,7 +6,7 @@ Description:
===================== =======================================
c_chmask capture channel mask
- c_srate capture sampling rate
+ c_srate list of capture sampling rates (comma-separated)
c_ssize capture sample size (bytes)
c_sync capture synchronization type
(async/adaptive)
@@ -20,7 +20,7 @@ Description:
(in 1/256 dB)
fb_max maximum extra bandwidth in async mode
p_chmask playback channel mask
- p_srate playback sampling rate
+ p_srate list of playback sampling rates (comma-separated)
p_ssize playback sample size (bytes)
p_mute_present playback mute control enable
p_volume_present playback volume control enable
diff --git a/Documentation/usb/gadget-testing.rst b/Documentation/usb/gadget-testing.rst
index cbbd948c626f..419f6e5e890a 100644
--- a/Documentation/usb/gadget-testing.rst
+++ b/Documentation/usb/gadget-testing.rst
@@ -726,7 +726,7 @@ The uac2 function provides these attributes in its function directory:
================ ====================================================
c_chmask capture channel mask
- c_srate capture sampling rate
+ c_srate list of capture sampling rates (comma-separated)
c_ssize capture sample size (bytes)
c_sync capture synchronization type (async/adaptive)
c_mute_present capture mute control enable
@@ -736,7 +736,7 @@ The uac2 function provides these attributes in its function directory:
c_volume_res capture volume control resolution (in 1/256 dB)
fb_max maximum extra bandwidth in async mode
p_chmask playback channel mask
- p_srate playback sampling rate
+ p_srate list of playback sampling rates (comma-separated)
p_ssize playback sample size (bytes)
p_mute_present playback mute control enable
p_volume_present playback volume control enable
diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c
index e518f210968c..089da132913c 100644
--- a/drivers/usb/gadget/function/f_uac2.c
+++ b/drivers/usb/gadget/function/f_uac2.c
@@ -70,6 +70,8 @@ struct f_uac2 {
/* Interrupt IN endpoint of AC interface */
struct usb_ep *int_ep;
atomic_t int_count;
+ /* transient state, only valid during handling of a single control request */
+ int clock_id;
};
static inline struct f_uac2 *func_to_uac2(struct usb_function *f)
@@ -166,7 +168,7 @@ static struct uac_clock_source_descriptor in_clk_src_desc = {
.bDescriptorSubtype = UAC2_CLOCK_SOURCE,
/* .bClockID = DYNAMIC */
.bmAttributes = UAC_CLOCK_SOURCE_TYPE_INT_FIXED,
- .bmControls = (CONTROL_RDONLY << CLK_FREQ_CTRL),
+ .bmControls = (CONTROL_RDWR << CLK_FREQ_CTRL),
.bAssocTerminal = 0,
};
@@ -178,7 +180,7 @@ static struct uac_clock_source_descriptor out_clk_src_desc = {
.bDescriptorSubtype = UAC2_CLOCK_SOURCE,
/* .bClockID = DYNAMIC */
.bmAttributes = UAC_CLOCK_SOURCE_TYPE_INT_FIXED,
- .bmControls = (CONTROL_RDONLY << CLK_FREQ_CTRL),
+ .bmControls = (CONTROL_RDWR << CLK_FREQ_CTRL),
.bAssocTerminal = 0,
};
@@ -634,13 +636,36 @@ struct cntrl_cur_lay3 {
__le32 dCUR;
};
-struct cntrl_range_lay3 {
- __le16 wNumSubRanges;
+struct cntrl_subrange_lay3 {
__le32 dMIN;
__le32 dMAX;
__le32 dRES;
} __packed;
+#define ranges_lay3_size(c) (sizeof(c.wNumSubRanges) + c.wNumSubRanges \
+ * sizeof(struct cntrl_subrange_lay3))
+
+#define DECLARE_UAC2_CNTRL_RANGES_LAY3(k, n) \
+ struct cntrl_ranges_lay3_##k { \
+ __le16 wNumSubRanges; \
+ struct cntrl_subrange_lay3 r[n]; \
+} __packed
+
+DECLARE_UAC2_CNTRL_RANGES_LAY3(srates, UAC_MAX_RATES);
+
+static int get_max_srate(const int *srates)
+{
+ int i, max_srate = 0;
+
+ for (i = 0; i < UAC_MAX_RATES; i++) {
+ if (srates[i] == 0)
+ break;
+ if (srates[i] > max_srate)
+ max_srate = srates[i];
+ }
+ return max_srate;
+}
+
static int set_ep_max_packet_size(const struct f_uac2_opts *uac2_opts,
struct usb_endpoint_descriptor *ep_desc,
enum usb_device_speed speed, bool is_playback)
@@ -667,11 +692,11 @@ static int set_ep_max_packet_size(const struct f_uac2_opts *uac2_opts,
if (is_playback) {
chmask = uac2_opts->p_chmask;
- srate = uac2_opts->p_srate;
+ srate = get_max_srate(uac2_opts->p_srates);
ssize = uac2_opts->p_ssize;
} else {
chmask = uac2_opts->c_chmask;
- srate = uac2_opts->c_srate;
+ srate = get_max_srate(uac2_opts->c_srates);
ssize = uac2_opts->c_ssize;
}
@@ -912,10 +937,10 @@ static int afunc_validate_opts(struct g_audio *agdev, struct device *dev)
} else if ((opts->c_ssize < 1) || (opts->c_ssize > 4)) {
dev_err(dev, "Error: incorrect capture sample size\n");
return -EINVAL;
- } else if (!opts->p_srate) {
+ } else if (!opts->p_srates[0]) {
dev_err(dev, "Error: incorrect playback sampling rate\n");
return -EINVAL;
- } else if (!opts->c_srate) {
+ } else if (!opts->c_srates[0]) {
dev_err(dev, "Error: incorrect capture sampling rate\n");
return -EINVAL;
}
@@ -956,6 +981,7 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
struct f_uac2_opts *uac2_opts = g_audio_to_uac2_opts(agdev);
struct usb_string *us;
int ret;
+ int init_p_srate, init_c_srate;
ret = afunc_validate_opts(agdev, dev);
if (ret)
@@ -1037,8 +1063,11 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
*bma = cpu_to_le32(control);
}
- snprintf(clksrc_in, sizeof(clksrc_in), "%uHz", uac2_opts->p_srate);
- snprintf(clksrc_out, sizeof(clksrc_out), "%uHz", uac2_opts->c_srate);
+ init_p_srate = uac2_opts->p_srates[0];
+ init_c_srate = uac2_opts->c_srates[0];
+
+ snprintf(clksrc_in, sizeof(clksrc_in), "%uHz", init_p_srate);
+ snprintf(clksrc_out, sizeof(clksrc_out), "%uHz", init_c_srate);
ret = usb_interface_id(cfg, fn);
if (ret < 0) {
@@ -1209,7 +1238,8 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
agdev->gadget = gadget;
agdev->params.p_chmask = uac2_opts->p_chmask;
- agdev->params.p_srates[0] = uac2_opts->p_srate;
+ memcpy(agdev->params.p_srates, uac2_opts->p_srates,
+ sizeof(agdev->params.p_srates));
agdev->params.p_ssize = uac2_opts->p_ssize;
if (FUIN_EN(uac2_opts)) {
agdev->params.p_fu.id = USB_IN_FU_ID;
@@ -1220,7 +1250,8 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
agdev->params.p_fu.volume_res = uac2_opts->p_volume_res;
}
agdev->params.c_chmask = uac2_opts->c_chmask;
- agdev->params.c_srates[0] = uac2_opts->c_srate;
+ memcpy(agdev->params.c_srates, uac2_opts->c_srates,
+ sizeof(agdev->params.c_srates));
agdev->params.c_ssize = uac2_opts->c_ssize;
if (FUOUT_EN(uac2_opts)) {
agdev->params.c_fu.id = USB_OUT_FU_ID;
@@ -1423,10 +1454,10 @@ in_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
u8 entity_id = (w_index >> 8) & 0xff;
u8 control_selector = w_value >> 8;
int value = -EOPNOTSUPP;
- int p_srate, c_srate;
+ u32 p_srate, c_srate;
- p_srate = opts->p_srate;
- c_srate = opts->c_srate;
+ u_audio_get_playback_srate(agdev, &p_srate);
+ u_audio_get_capture_srate(agdev, &c_srate);
if ((entity_id == USB_IN_CLK_ID) || (entity_id == USB_OUT_CLK_ID)) {
if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) {
@@ -1500,28 +1531,39 @@ in_rq_range(struct usb_function *fn, const struct usb_ctrlrequest *cr)
u8 entity_id = (w_index >> 8) & 0xff;
u8 control_selector = w_value >> 8;
int value = -EOPNOTSUPP;
- int p_srate, c_srate;
-
- p_srate = opts->p_srate;
- c_srate = opts->c_srate;
if ((entity_id == USB_IN_CLK_ID) || (entity_id == USB_OUT_CLK_ID)) {
if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) {
- struct cntrl_range_lay3 r;
+ struct cntrl_ranges_lay3_srates rs;
+ int i;
+ int wNumSubRanges = 0;
+ int srate;
+ int *srates;
if (entity_id == USB_IN_CLK_ID)
- r.dMIN = cpu_to_le32(p_srate);
+ srates = opts->p_srates;
else if (entity_id == USB_OUT_CLK_ID)
- r.dMIN = cpu_to_le32(c_srate);
+ srates = opts->c_srates;
else
return -EOPNOTSUPP;
-
- r.dMAX = r.dMIN;
- r.dRES = 0;
- r.wNumSubRanges = cpu_to_le16(1);
-
- value = min_t(unsigned int, w_length, sizeof(r));
- memcpy(req->buf, &r, value);
+ for (i = 0; i < UAC_MAX_RATES; i++) {
+ srate = srates[i];
+ if (srate == 0)
+ break;
+
+ rs.r[wNumSubRanges].dMIN = cpu_to_le32(srate);
+ rs.r[wNumSubRanges].dMAX = cpu_to_le32(srate);
+ rs.r[wNumSubRanges].dRES = 0;
+ wNumSubRanges++;
+ dev_dbg(&agdev->gadget->dev,
+ "%s(): clk %d: rate ID %d: %d\n",
+ __func__, entity_id, wNumSubRanges, srate);
+ }
+ rs.wNumSubRanges = cpu_to_le16(wNumSubRanges);
+ value = min_t(unsigned int, w_length, ranges_lay3_size(rs));
+ dev_dbg(&agdev->gadget->dev, "%s(): sending %d rates, size %d\n",
+ __func__, rs.wNumSubRanges, value);
+ memcpy(req->buf, &rs, value);
} else {
dev_err(&agdev->gadget->dev,
"%s:%d control_selector=%d TODO!\n",
@@ -1580,6 +1622,25 @@ ac_rq_in(struct usb_function *fn, const struct usb_ctrlrequest *cr)
return -EOPNOTSUPP;
}
+static void uac2_cs_control_sam_freq(struct usb_ep *ep, struct usb_request *req)
+{
+ struct usb_function *fn = ep->driver_data;
+ struct g_audio *agdev = func_to_g_audio(fn);
+ struct f_uac2 *uac2 = func_to_uac2(fn);
+ u32 val;
+
+ if (req->actual != 4)
+ return;
+
+ val = le32_to_cpu(*((u32 *)req->buf));
+ dev_dbg(&agdev->gadget->dev, "%s val: %d.\n", __func__, val);
+ if (uac2->clock_id == USB_IN_CLK_ID) {
+ u_audio_set_playback_srate(agdev, val);
+ } else if (uac2->clock_id == USB_OUT_CLK_ID) {
+ u_audio_set_capture_srate(agdev, val);
+ }
+}
+
static void
out_rq_cur_complete(struct usb_ep *ep, struct usb_request *req)
{
@@ -1631,6 +1692,7 @@ out_rq_cur_complete(struct usb_ep *ep, struct usb_request *req)
static int
out_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
{
+ struct usb_composite_dev *cdev = fn->config->cdev;
struct usb_request *req = fn->config->cdev->req;
struct g_audio *agdev = func_to_g_audio(fn);
struct f_uac2_opts *opts = g_audio_to_uac2_opts(agdev);
@@ -1640,10 +1702,17 @@ out_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
u16 w_value = le16_to_cpu(cr->wValue);
u8 entity_id = (w_index >> 8) & 0xff;
u8 control_selector = w_value >> 8;
+ u8 clock_id = w_index >> 8;
if ((entity_id == USB_IN_CLK_ID) || (entity_id == USB_OUT_CLK_ID)) {
- if (control_selector == UAC2_CS_CONTROL_SAM_FREQ)
+ if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) {
+ dev_dbg(&agdev->gadget->dev,
+ "control_selector UAC2_CS_CONTROL_SAM_FREQ, clock: %d\n", clock_id);
+ cdev->gadget->ep0->driver_data = fn;
+ uac2->clock_id = clock_id;
+ req->complete = uac2_cs_control_sam_freq;
return w_length;
+ }
} else if ((FUIN_EN(opts) && (entity_id == USB_IN_FU_ID)) ||
(FUOUT_EN(opts) && (entity_id == USB_OUT_FU_ID))) {
memcpy(&uac2->setup_cr, cr, sizeof(*cr));
@@ -1836,11 +1905,70 @@ end: \
\
CONFIGFS_ATTR(f_uac2_opts_, name)
+#define UAC2_RATE_ATTRIBUTE(name) \
+static ssize_t f_uac2_opts_##name##_show(struct config_item *item, \
+ char *page) \
+{ \
+ struct f_uac2_opts *opts = to_f_uac2_opts(item); \
+ int result = 0; \
+ int i; \
+ \
+ mutex_lock(&opts->lock); \
+ page[0] = '\0'; \
+ for (i = 0; i < UAC_MAX_RATES; i++) { \
+ if (opts->name##s[i] == 0) \
+ break; \
+ result += sprintf(page + strlen(page), "%u,", \
+ opts->name##s[i]); \
+ } \
+ if (strlen(page) > 0) \
+ page[strlen(page) - 1] = '\n'; \
+ mutex_unlock(&opts->lock); \
+ \
+ return result; \
+} \
+ \
+static ssize_t f_uac2_opts_##name##_store(struct config_item *item, \
+ const char *page, size_t len) \
+{ \
+ struct f_uac2_opts *opts = to_f_uac2_opts(item); \
+ char *split_page = NULL; \
+ int ret = -EINVAL; \
+ char *token; \
+ u32 num; \
+ int i; \
+ \
+ mutex_lock(&opts->lock); \
+ if (opts->refcnt) { \
+ ret = -EBUSY; \
+ goto end; \
+ } \
+ \
+ i = 0; \
+ memset(opts->name##s, 0x00, sizeof(opts->name##s)); \
+ split_page = kstrdup(page, GFP_KERNEL); \
+ while ((token = strsep(&split_page, ",")) != NULL) { \
+ ret = kstrtou32(token, 0, &num); \
+ if (ret) \
+ goto end; \
+ \
+ opts->name##s[i++] = num; \
+ ret = len; \
+ }; \
+ \
+end: \
+ kfree(split_page); \
+ mutex_unlock(&opts->lock); \
+ return ret; \
+} \
+ \
+CONFIGFS_ATTR(f_uac2_opts_, name)
+
UAC2_ATTRIBUTE(u32, p_chmask);
-UAC2_ATTRIBUTE(u32, p_srate);
+UAC2_RATE_ATTRIBUTE(p_srate);
UAC2_ATTRIBUTE(u32, p_ssize);
UAC2_ATTRIBUTE(u32, c_chmask);
-UAC2_ATTRIBUTE(u32, c_srate);
+UAC2_RATE_ATTRIBUTE(c_srate);
UAC2_ATTRIBUTE_SYNC(c_sync);
UAC2_ATTRIBUTE(u32, c_ssize);
UAC2_ATTRIBUTE(u32, req_number);
@@ -1913,10 +2041,10 @@ static struct usb_function_instance *afunc_alloc_inst(void)
&f_uac2_func_type);
opts->p_chmask = UAC2_DEF_PCHMASK;
- opts->p_srate = UAC2_DEF_PSRATE;
+ opts->p_srates[0] = UAC2_DEF_PSRATE;
opts->p_ssize = UAC2_DEF_PSSIZE;
opts->c_chmask = UAC2_DEF_CCHMASK;
- opts->c_srate = UAC2_DEF_CSRATE;
+ opts->c_srates[0] = UAC2_DEF_CSRATE;
opts->c_ssize = UAC2_DEF_CSSIZE;
opts->c_sync = UAC2_DEF_CSYNC;
diff --git a/drivers/usb/gadget/function/u_uac2.h b/drivers/usb/gadget/function/u_uac2.h
index e0c8e3513bfd..6bfcf6d0e863 100644
--- a/drivers/usb/gadget/function/u_uac2.h
+++ b/drivers/usb/gadget/function/u_uac2.h
@@ -14,6 +14,7 @@
#define U_UAC2_H
#include <linux/usb/composite.h>
+#include "uac_common.h"
#define UAC2_DEF_PCHMASK 0x3
#define UAC2_DEF_PSRATE 48000
@@ -35,10 +36,10 @@
struct f_uac2_opts {
struct usb_function_instance func_inst;
int p_chmask;
- int p_srate;
+ int p_srates[UAC_MAX_RATES];
int p_ssize;
int c_chmask;
- int c_srate;
+ int c_srates[UAC_MAX_RATES];
int c_ssize;
int c_sync;
diff --git a/drivers/usb/gadget/legacy/audio.c b/drivers/usb/gadget/legacy/audio.c
index 5ec477ffab7f..d14b9f2d4c07 100644
--- a/drivers/usb/gadget/legacy/audio.c
+++ b/drivers/usb/gadget/legacy/audio.c
@@ -26,9 +26,10 @@ module_param(p_chmask, uint, 0444);
MODULE_PARM_DESC(p_chmask, "Playback Channel Mask");
/* Playback Default 48 KHz */
-static int p_srate = UAC2_DEF_PSRATE;
-module_param(p_srate, uint, 0444);
-MODULE_PARM_DESC(p_srate, "Playback Sampling Rate");
+static int p_srates[UAC_MAX_RATES] = {UAC2_DEF_PSRATE};
+static int p_srates_cnt = 1;
+module_param_array_named(p_srate, p_srates, uint, &p_srates_cnt, 0444);
+MODULE_PARM_DESC(p_srate, "Playback Sampling Rates (array)");
/* Playback Default 16bits/sample */
static int p_ssize = UAC2_DEF_PSSIZE;
@@ -41,9 +42,10 @@ module_param(c_chmask, uint, 0444);
MODULE_PARM_DESC(c_chmask, "Capture Channel Mask");
/* Capture Default 64 KHz */
-static int c_srate = UAC2_DEF_CSRATE;
-module_param(c_srate, uint, 0444);
-MODULE_PARM_DESC(c_srate, "Capture Sampling Rate");
+static int c_srates[UAC_MAX_RATES] = {UAC2_DEF_CSRATE};
+static int c_srates_cnt = 1;
+module_param_array_named(c_srate, c_srates, uint, &c_srates_cnt, 0444);
+MODULE_PARM_DESC(c_srate, "Capture Sampling Rates (array)");
/* Capture Default 16bits/sample */
static int c_ssize = UAC2_DEF_CSSIZE;
@@ -237,6 +239,7 @@ static int audio_bind(struct usb_composite_dev *cdev)
{
#ifndef CONFIG_GADGET_UAC1
struct f_uac2_opts *uac2_opts;
+ int i;
#else
#ifndef CONFIG_GADGET_UAC1_LEGACY
struct f_uac1_opts *uac1_opts;
@@ -263,10 +266,16 @@ static int audio_bind(struct usb_composite_dev *cdev)
#ifndef CONFIG_GADGET_UAC1
uac2_opts = container_of(fi_uac2, struct f_uac2_opts, func_inst);
uac2_opts->p_chmask = p_chmask;
- uac2_opts->p_srate = p_srate;
+
+ for (i = 0; i < p_srates_cnt; ++i)
+ uac2_opts->p_srates[i] = p_srates[i];
+
uac2_opts->p_ssize = p_ssize;
uac2_opts->c_chmask = c_chmask;
- uac2_opts->c_srate = c_srate;
+
+ for (i = 0; i < c_srates_cnt; ++i)
+ uac2_opts->c_srates[i] = c_srates[i];
+
uac2_opts->c_ssize = c_ssize;
uac2_opts->req_number = UAC2_DEF_REQ_NUM;
#else
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 06/11] usb: gadget: f_uac2: Rename Clock Sources to fixed names
2022-01-09 11:59 [PATCH v3 00/11] usb: gadget: audio: Multiple rates, notify Pavel Hofman
` (4 preceding siblings ...)
2022-01-09 11:59 ` [PATCH v3 05/11] usb: gadget: f_uac2: Support multiple sampling rates Pavel Hofman
@ 2022-01-09 11:59 ` Pavel Hofman
2022-01-09 14:08 ` kernel test robot
2022-01-09 17:40 ` kernel test robot
2022-01-09 11:59 ` [PATCH v3 07/11] usb: gadget: f_uac1: Support multiple sampling rates Pavel Hofman
` (4 subsequent siblings)
10 siblings, 2 replies; 15+ messages in thread
From: Pavel Hofman @ 2022-01-09 11:59 UTC (permalink / raw)
To: linux-usb
Cc: Pavel Hofman, Ruslan Bilovol, Felipe Balbi, Jerome Brunet,
Julian Scheel, John Keeping, Greg Kroah-Hartman
From: Julian Scheel <julian@jusst.de>
The gadget no longer supports only one frequency. Therefore USB strings
corresponding to the clock sources are renamed from specific Hz value to
general names Input clock/Output clock.
Signed-off-by: Julian Scheel <julian@jusst.de>
Signed-off-by: Pavel Hofman <pavel.hofman@ivitera.com>
---
v3:
* Renamed commit message
* Corrected STR_CLKSRC_IN/OUT capitalization
---
drivers/usb/gadget/function/f_uac2.c | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c
index 089da132913c..58e29cbf5d79 100644
--- a/drivers/usb/gadget/function/f_uac2.c
+++ b/drivers/usb/gadget/function/f_uac2.c
@@ -106,14 +106,11 @@ enum {
STR_AS_IN_ALT1,
};
-static char clksrc_in[8];
-static char clksrc_out[8];
-
static struct usb_string strings_fn[] = {
[STR_ASSOC].s = "Source/Sink",
[STR_IF_CTRL].s = "Topology Control",
- [STR_CLKSRC_IN].s = clksrc_in,
- [STR_CLKSRC_OUT].s = clksrc_out,
+ [STR_CLKSRC_IN].s = "Input Clock",
+ [STR_CLKSRC_OUT].s = "Output Clock",
[STR_USB_IT].s = "USBH Out",
[STR_IO_IT].s = "USBD Out",
[STR_USB_OT].s = "USBH In",
@@ -1066,9 +1063,6 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
init_p_srate = uac2_opts->p_srates[0];
init_c_srate = uac2_opts->c_srates[0];
- snprintf(clksrc_in, sizeof(clksrc_in), "%uHz", init_p_srate);
- snprintf(clksrc_out, sizeof(clksrc_out), "%uHz", init_c_srate);
-
ret = usb_interface_id(cfg, fn);
if (ret < 0) {
dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 07/11] usb: gadget: f_uac1: Support multiple sampling rates
2022-01-09 11:59 [PATCH v3 00/11] usb: gadget: audio: Multiple rates, notify Pavel Hofman
` (5 preceding siblings ...)
2022-01-09 11:59 ` [PATCH v3 06/11] usb: gadget: f_uac2: Rename Clock Sources to fixed names Pavel Hofman
@ 2022-01-09 11:59 ` Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 08/11] usb: gadget: u_audio: Rate ctl notifies about current srate (0=stopped) Pavel Hofman
` (3 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Pavel Hofman @ 2022-01-09 11:59 UTC (permalink / raw)
To: linux-usb
Cc: Pavel Hofman, Ruslan Bilovol, Felipe Balbi, Jerome Brunet,
Julian Scheel, John Keeping, Greg Kroah-Hartman
From: Julian Scheel <julian@jusst.de>
A list of sampling rates can be specified via configfs. All enabled
sampling rates are sent to the USB host on request. When the host
selects a sampling rate the internal active rate is updated.
Config strings with single value stay compatible with the previous version.
Multiple samplerates passed as configuration arrays to g_audio module
when built for f_uac1.
Signed-off-by: Julian Scheel <julian@jusst.de>
Signed-off-by: Pavel Hofman <pavel.hofman@ivitera.com>
---
v3:
* audio.c: fixed unused variables for CONFIG_UAC1 variants
* audio: used 0444 instead of S_IRUGO
* f_uac1: moved current state srates from struct f_uac1_opts to f_uac1
* f_uac1: renamed UAC_RATE1_ATTRIBUTE -> UAC1_RATE_ATTRIBUTE, moved from
u_uac1.h to f_uac1.c
* updated commit message
---
.../ABI/testing/configfs-usb-gadget-uac1 | 4 +-
Documentation/usb/gadget-testing.rst | 4 +-
drivers/usb/gadget/function/f_uac1.c | 181 +++++++++++++++---
drivers/usb/gadget/function/u_uac1.h | 5 +-
drivers/usb/gadget/legacy/audio.c | 25 ++-
5 files changed, 179 insertions(+), 40 deletions(-)
diff --git a/Documentation/ABI/testing/configfs-usb-gadget-uac1 b/Documentation/ABI/testing/configfs-usb-gadget-uac1
index d4b8cf40a9e4..09725e273e9b 100644
--- a/Documentation/ABI/testing/configfs-usb-gadget-uac1
+++ b/Documentation/ABI/testing/configfs-usb-gadget-uac1
@@ -6,7 +6,7 @@ Description:
===================== =======================================
c_chmask capture channel mask
- c_srate capture sampling rate
+ c_srate list of capture sampling rates (comma-separated)
c_ssize capture sample size (bytes)
c_mute_present capture mute control enable
c_volume_present capture volume control enable
@@ -17,7 +17,7 @@ Description:
c_volume_res capture volume control resolution
(in 1/256 dB)
p_chmask playback channel mask
- p_srate playback sampling rate
+ p_srate list of playback sampling rates (comma-separated)
p_ssize playback sample size (bytes)
p_mute_present playback mute control enable
p_volume_present playback volume control enable
diff --git a/Documentation/usb/gadget-testing.rst b/Documentation/usb/gadget-testing.rst
index 419f6e5e890a..046842b00c89 100644
--- a/Documentation/usb/gadget-testing.rst
+++ b/Documentation/usb/gadget-testing.rst
@@ -916,7 +916,7 @@ The uac1 function provides these attributes in its function directory:
================ ====================================================
c_chmask capture channel mask
- c_srate capture sampling rate
+ c_srate list of capture sampling rates (comma-separated)
c_ssize capture sample size (bytes)
c_mute_present capture mute control enable
c_volume_present capture volume control enable
@@ -924,7 +924,7 @@ The uac1 function provides these attributes in its function directory:
c_volume_max capture volume control max value (in 1/256 dB)
c_volume_res capture volume control resolution (in 1/256 dB)
p_chmask playback channel mask
- p_srate playback sampling rate
+ p_srate list of playback sampling rates (comma-separated)
p_ssize playback sample size (bytes)
p_mute_present playback mute control enable
p_volume_present playback volume control enable
diff --git a/drivers/usb/gadget/function/f_uac1.c b/drivers/usb/gadget/function/f_uac1.c
index 0397b27df42e..73df76a6fbe0 100644
--- a/drivers/usb/gadget/function/f_uac1.c
+++ b/drivers/usb/gadget/function/f_uac1.c
@@ -3,6 +3,7 @@
* f_uac1.c -- USB Audio Class 1.0 Function (using u_audio API)
*
* Copyright (C) 2016 Ruslan Bilovol <ruslan.bilovol@gmail.com>
+ * Copyright (C) 2021 Julian Scheel <julian@jusst.de>
*
* This driver doesn't expect any real Audio codec to be present
* on the device - the audio streams are simply sinked to and
@@ -42,6 +43,9 @@ struct f_uac1 {
/* Interrupt IN endpoint of AC interface */
struct usb_ep *int_ep;
atomic_t int_count;
+ int ctl_id; /* EP id */
+ int c_srate; /* current capture srate */
+ int p_srate; /* current playback prate */
};
static inline struct f_uac1 *func_to_uac1(struct usb_function *f)
@@ -188,16 +192,18 @@ static struct uac1_as_header_descriptor as_in_header_desc = {
.wFormatTag = cpu_to_le16(UAC_FORMAT_TYPE_I_PCM),
};
-DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(1);
+DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(UAC_MAX_RATES);
+#define uac_format_type_i_discrete_descriptor \
+ uac_format_type_i_discrete_descriptor_##UAC_MAX_RATES
-static struct uac_format_type_i_discrete_descriptor_1 as_out_type_i_desc = {
- .bLength = UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(1),
+static struct uac_format_type_i_discrete_descriptor as_out_type_i_desc = {
+ .bLength = 0, /* filled on rate setup */
.bDescriptorType = USB_DT_CS_INTERFACE,
.bDescriptorSubtype = UAC_FORMAT_TYPE,
.bFormatType = UAC_FORMAT_TYPE_I,
.bSubframeSize = 2,
.bBitResolution = 16,
- .bSamFreqType = 1,
+ .bSamFreqType = 0, /* filled on rate setup */
};
/* Standard ISO OUT Endpoint Descriptor */
@@ -221,14 +227,14 @@ static struct uac_iso_endpoint_descriptor as_iso_out_desc = {
.wLockDelay = cpu_to_le16(1),
};
-static struct uac_format_type_i_discrete_descriptor_1 as_in_type_i_desc = {
- .bLength = UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(1),
+static struct uac_format_type_i_discrete_descriptor as_in_type_i_desc = {
+ .bLength = 0, /* filled on rate setup */
.bDescriptorType = USB_DT_CS_INTERFACE,
.bDescriptorSubtype = UAC_FORMAT_TYPE,
.bFormatType = UAC_FORMAT_TYPE_I,
.bSubframeSize = 2,
.bBitResolution = 16,
- .bSamFreqType = 1,
+ .bSamFreqType = 0, /* filled on rate setup */
};
/* Standard ISO OUT Endpoint Descriptor */
@@ -333,6 +339,30 @@ static struct usb_gadget_strings *uac1_strings[] = {
* This function is an ALSA sound card following USB Audio Class Spec 1.0.
*/
+static void uac_cs_attr_sample_rate(struct usb_ep *ep, struct usb_request *req)
+{
+ struct usb_function *fn = ep->driver_data;
+ struct usb_composite_dev *cdev = fn->config->cdev;
+ struct g_audio *agdev = func_to_g_audio(fn);
+ struct f_uac1 *uac1 = func_to_uac1(fn);
+ u8 *buf = (u8 *)req->buf;
+ u32 val = 0;
+
+ if (req->actual != 3) {
+ WARN(cdev, "Invalid data size for UAC_EP_CS_ATTR_SAMPLE_RATE.\n");
+ return;
+ }
+
+ val = buf[0] | (buf[1] << 8) | (buf[2] << 16);
+ if (uac1->ctl_id == (USB_DIR_IN | 2)) {
+ uac1->p_srate = val;
+ u_audio_set_playback_srate(agdev, uac1->p_srate);
+ } else if (uac1->ctl_id == (USB_DIR_OUT | 1)) {
+ uac1->c_srate = val;
+ u_audio_set_capture_srate(agdev, uac1->c_srate);
+ }
+}
+
static void audio_notify_complete(struct usb_ep *_ep, struct usb_request *req)
{
struct g_audio *audio = req->context;
@@ -707,18 +737,27 @@ static int audio_set_endpoint_req(struct usb_function *f,
const struct usb_ctrlrequest *ctrl)
{
struct usb_composite_dev *cdev = f->config->cdev;
+ struct usb_request *req = f->config->cdev->req;
+ struct f_uac1 *uac1 = func_to_uac1(f);
int value = -EOPNOTSUPP;
u16 ep = le16_to_cpu(ctrl->wIndex);
u16 len = le16_to_cpu(ctrl->wLength);
u16 w_value = le16_to_cpu(ctrl->wValue);
+ u8 cs = w_value >> 8;
DBG(cdev, "bRequest 0x%x, w_value 0x%04x, len %d, endpoint %d\n",
ctrl->bRequest, w_value, len, ep);
switch (ctrl->bRequest) {
- case UAC_SET_CUR:
+ case UAC_SET_CUR: {
+ if (cs == UAC_EP_CS_ATTR_SAMPLE_RATE) {
+ cdev->gadget->ep0->driver_data = f;
+ uac1->ctl_id = ep;
+ req->complete = uac_cs_attr_sample_rate;
+ }
value = len;
break;
+ }
case UAC_SET_MIN:
break;
@@ -743,16 +782,33 @@ static int audio_get_endpoint_req(struct usb_function *f,
const struct usb_ctrlrequest *ctrl)
{
struct usb_composite_dev *cdev = f->config->cdev;
+ struct usb_request *req = f->config->cdev->req;
+ struct f_uac1 *uac1 = func_to_uac1(f);
+ u8 *buf = (u8 *)req->buf;
int value = -EOPNOTSUPP;
- u8 ep = ((le16_to_cpu(ctrl->wIndex) >> 8) & 0xFF);
+ u8 ep = le16_to_cpu(ctrl->wIndex);
u16 len = le16_to_cpu(ctrl->wLength);
u16 w_value = le16_to_cpu(ctrl->wValue);
+ u8 cs = w_value >> 8;
+ u32 val = 0;
DBG(cdev, "bRequest 0x%x, w_value 0x%04x, len %d, endpoint %d\n",
ctrl->bRequest, w_value, len, ep);
switch (ctrl->bRequest) {
- case UAC_GET_CUR:
+ case UAC_GET_CUR: {
+ if (cs == UAC_EP_CS_ATTR_SAMPLE_RATE) {
+ if (ep == (USB_DIR_IN | 2))
+ val = uac1->p_srate;
+ else if (ep == (USB_DIR_OUT | 1))
+ val = uac1->c_srate;
+ buf[2] = (val >> 16) & 0xff;
+ buf[1] = (val >> 8) & 0xff;
+ buf[0] = val & 0xff;
+ }
+ value = len;
+ break;
+ }
case UAC_GET_MIN:
case UAC_GET_MAX:
case UAC_GET_RES:
@@ -1074,10 +1130,10 @@ static int f_audio_validate_opts(struct g_audio *audio, struct device *dev)
} else if ((opts->c_ssize < 1) || (opts->c_ssize > 4)) {
dev_err(dev, "Error: incorrect capture sample size\n");
return -EINVAL;
- } else if (!opts->p_srate) {
+ } else if (!opts->p_srates[0]) {
dev_err(dev, "Error: incorrect playback sampling rate\n");
return -EINVAL;
- } else if (!opts->c_srate) {
+ } else if (!opts->c_srates[0]) {
dev_err(dev, "Error: incorrect capture sampling rate\n");
return -EINVAL;
}
@@ -1118,10 +1174,9 @@ static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
struct f_uac1_opts *audio_opts;
struct usb_ep *ep = NULL;
struct usb_string *us;
- u8 *sam_freq;
- int rate;
int ba_iface_id;
int status;
+ int idx, i;
status = f_audio_validate_opts(audio, dev);
if (status)
@@ -1213,12 +1268,25 @@ static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
}
/* Set sample rates */
- rate = audio_opts->c_srate;
- sam_freq = as_out_type_i_desc.tSamFreq[0];
- memcpy(sam_freq, &rate, 3);
- rate = audio_opts->p_srate;
- sam_freq = as_in_type_i_desc.tSamFreq[0];
- memcpy(sam_freq, &rate, 3);
+ for (i = 0, idx = 0; i < UAC_MAX_RATES; i++) {
+ if (audio_opts->c_srates[i] == 0)
+ break;
+ memcpy(as_out_type_i_desc.tSamFreq[idx++],
+ &audio_opts->c_srates[i], 3);
+ }
+ as_out_type_i_desc.bLength = UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(idx);
+ as_out_type_i_desc.bSamFreqType = idx;
+
+ for (i = 0, idx = 0; i < UAC_MAX_RATES; i++) {
+ if (audio_opts->p_srates[i] == 0)
+ break;
+ memcpy(as_in_type_i_desc.tSamFreq[idx++],
+ &audio_opts->p_srates[i], 3);
+ }
+ as_in_type_i_desc.bLength = UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(idx);
+ as_in_type_i_desc.bSamFreqType = idx;
+ uac1->p_srate = audio_opts->p_srates[0];
+ uac1->c_srate = audio_opts->c_srates[0];
/* allocate instance-specific interface IDs, and patch descriptors */
status = usb_interface_id(c, f);
@@ -1297,7 +1365,8 @@ static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
audio->out_ep_maxpsize = le16_to_cpu(as_out_ep_desc.wMaxPacketSize);
audio->in_ep_maxpsize = le16_to_cpu(as_in_ep_desc.wMaxPacketSize);
audio->params.c_chmask = audio_opts->c_chmask;
- audio->params.c_srates[0] = audio_opts->c_srate;
+ memcpy(audio->params.c_srates, audio_opts->c_srates,
+ sizeof(audio->params.c_srates));
audio->params.c_ssize = audio_opts->c_ssize;
if (FUIN_EN(audio_opts)) {
audio->params.p_fu.id = USB_IN_FU_ID;
@@ -1309,7 +1378,8 @@ static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
audio->params.p_fu.volume_res = audio_opts->p_volume_res;
}
audio->params.p_chmask = audio_opts->p_chmask;
- audio->params.p_srates[0] = audio_opts->p_srate;
+ memcpy(audio->params.p_srates, audio_opts->p_srates,
+ sizeof(audio->params.p_srates));
audio->params.p_ssize = audio_opts->p_ssize;
if (FUOUT_EN(audio_opts)) {
audio->params.c_fu.id = USB_OUT_FU_ID;
@@ -1414,11 +1484,70 @@ end: \
\
CONFIGFS_ATTR(f_uac1_opts_, name)
+#define UAC1_RATE_ATTRIBUTE(name) \
+static ssize_t f_uac1_opts_##name##_show(struct config_item *item, \
+ char *page) \
+{ \
+ struct f_uac1_opts *opts = to_f_uac1_opts(item); \
+ int result = 0; \
+ int i; \
+ \
+ mutex_lock(&opts->lock); \
+ page[0] = '\0'; \
+ for (i = 0; i < UAC_MAX_RATES; i++) { \
+ if (opts->name##s[i] == 0) \
+ break; \
+ result += sprintf(page + strlen(page), "%u,", \
+ opts->name##s[i]); \
+ } \
+ if (strlen(page) > 0) \
+ page[strlen(page) - 1] = '\n'; \
+ mutex_unlock(&opts->lock); \
+ \
+ return result; \
+} \
+ \
+static ssize_t f_uac1_opts_##name##_store(struct config_item *item, \
+ const char *page, size_t len) \
+{ \
+ struct f_uac1_opts *opts = to_f_uac1_opts(item); \
+ char *split_page = NULL; \
+ int ret = -EINVAL; \
+ char *token; \
+ u32 num; \
+ int i; \
+ \
+ mutex_lock(&opts->lock); \
+ if (opts->refcnt) { \
+ ret = -EBUSY; \
+ goto end; \
+ } \
+ \
+ i = 0; \
+ memset(opts->name##s, 0x00, sizeof(opts->name##s)); \
+ split_page = kstrdup(page, GFP_KERNEL); \
+ while ((token = strsep(&split_page, ",")) != NULL) { \
+ ret = kstrtou32(token, 0, &num); \
+ if (ret) \
+ goto end; \
+ \
+ opts->name##s[i++] = num; \
+ ret = len; \
+ }; \
+ \
+end: \
+ kfree(split_page); \
+ mutex_unlock(&opts->lock); \
+ return ret; \
+} \
+ \
+CONFIGFS_ATTR(f_uac1_opts_, name)
+
UAC1_ATTRIBUTE(u32, c_chmask);
-UAC1_ATTRIBUTE(u32, c_srate);
+UAC1_RATE_ATTRIBUTE(c_srate);
UAC1_ATTRIBUTE(u32, c_ssize);
UAC1_ATTRIBUTE(u32, p_chmask);
-UAC1_ATTRIBUTE(u32, p_srate);
+UAC1_RATE_ATTRIBUTE(p_srate);
UAC1_ATTRIBUTE(u32, p_ssize);
UAC1_ATTRIBUTE(u32, req_number);
@@ -1487,10 +1616,10 @@ static struct usb_function_instance *f_audio_alloc_inst(void)
&f_uac1_func_type);
opts->c_chmask = UAC1_DEF_CCHMASK;
- opts->c_srate = UAC1_DEF_CSRATE;
+ opts->c_srates[0] = UAC1_DEF_CSRATE;
opts->c_ssize = UAC1_DEF_CSSIZE;
opts->p_chmask = UAC1_DEF_PCHMASK;
- opts->p_srate = UAC1_DEF_PSRATE;
+ opts->p_srates[0] = UAC1_DEF_PSRATE;
opts->p_ssize = UAC1_DEF_PSSIZE;
opts->p_mute_present = UAC1_DEF_MUTE_PRESENT;
diff --git a/drivers/usb/gadget/function/u_uac1.h b/drivers/usb/gadget/function/u_uac1.h
index 589fae861141..b6cd6171d306 100644
--- a/drivers/usb/gadget/function/u_uac1.h
+++ b/drivers/usb/gadget/function/u_uac1.h
@@ -9,6 +9,7 @@
#define __U_UAC1_H
#include <linux/usb/composite.h>
+#include "uac_common.h"
#define UAC1_OUT_EP_MAX_PACKET_SIZE 200
#define UAC1_DEF_CCHMASK 0x3
@@ -30,10 +31,10 @@
struct f_uac1_opts {
struct usb_function_instance func_inst;
int c_chmask;
- int c_srate;
+ int c_srates[UAC_MAX_RATES];
int c_ssize;
int p_chmask;
- int p_srate;
+ int p_srates[UAC_MAX_RATES];
int p_ssize;
bool p_mute_present;
diff --git a/drivers/usb/gadget/legacy/audio.c b/drivers/usb/gadget/legacy/audio.c
index d14b9f2d4c07..c89c777a1aa3 100644
--- a/drivers/usb/gadget/legacy/audio.c
+++ b/drivers/usb/gadget/legacy/audio.c
@@ -61,9 +61,10 @@ module_param(p_chmask, uint, 0444);
MODULE_PARM_DESC(p_chmask, "Playback Channel Mask");
/* Playback Default 48 KHz */
-static int p_srate = UAC1_DEF_PSRATE;
-module_param(p_srate, uint, 0444);
-MODULE_PARM_DESC(p_srate, "Playback Sampling Rate");
+static int p_srates[UAC_MAX_RATES] = {UAC1_DEF_PSRATE};
+static int p_srates_cnt = 1;
+module_param_array_named(p_srate, p_srates, uint, &p_srates_cnt, 0444);
+MODULE_PARM_DESC(p_srate, "Playback Sampling Rates (array)");
/* Playback Default 16bits/sample */
static int p_ssize = UAC1_DEF_PSSIZE;
@@ -76,9 +77,10 @@ module_param(c_chmask, uint, 0444);
MODULE_PARM_DESC(c_chmask, "Capture Channel Mask");
/* Capture Default 48 KHz */
-static int c_srate = UAC1_DEF_CSRATE;
-module_param(c_srate, uint, 0444);
-MODULE_PARM_DESC(c_srate, "Capture Sampling Rate");
+static int c_srates[UAC_MAX_RATES] = {UAC1_DEF_CSRATE};
+static int c_srates_cnt = 1;
+module_param_array_named(c_srate, c_srates, uint, &c_srates_cnt, 0444);
+MODULE_PARM_DESC(c_srate, "Capture Sampling Rates (array)");
/* Capture Default 16bits/sample */
static int c_ssize = UAC1_DEF_CSSIZE;
@@ -243,6 +245,7 @@ static int audio_bind(struct usb_composite_dev *cdev)
#else
#ifndef CONFIG_GADGET_UAC1_LEGACY
struct f_uac1_opts *uac1_opts;
+ int i;
#else
struct f_uac1_legacy_opts *uac1_opts;
#endif
@@ -282,10 +285,16 @@ static int audio_bind(struct usb_composite_dev *cdev)
#ifndef CONFIG_GADGET_UAC1_LEGACY
uac1_opts = container_of(fi_uac1, struct f_uac1_opts, func_inst);
uac1_opts->p_chmask = p_chmask;
- uac1_opts->p_srate = p_srate;
+
+ for (i = 0; i < p_srates_cnt; ++i)
+ uac1_opts->p_srates[i] = p_srates[i];
+
uac1_opts->p_ssize = p_ssize;
uac1_opts->c_chmask = c_chmask;
- uac1_opts->c_srate = c_srate;
+
+ for (i = 0; i < c_srates_cnt; ++i)
+ uac1_opts->c_srates[i] = c_srates[i];
+
uac1_opts->c_ssize = c_ssize;
uac1_opts->req_number = UAC1_DEF_REQ_NUM;
#else /* CONFIG_GADGET_UAC1_LEGACY */
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 08/11] usb: gadget: u_audio: Rate ctl notifies about current srate (0=stopped)
2022-01-09 11:59 [PATCH v3 00/11] usb: gadget: audio: Multiple rates, notify Pavel Hofman
` (6 preceding siblings ...)
2022-01-09 11:59 ` [PATCH v3 07/11] usb: gadget: f_uac1: Support multiple sampling rates Pavel Hofman
@ 2022-01-09 11:59 ` Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 09/11] usb: gadget: u_audio: Add suspend call Pavel Hofman
` (2 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Pavel Hofman @ 2022-01-09 11:59 UTC (permalink / raw)
To: linux-usb
Cc: Pavel Hofman, Ruslan Bilovol, Felipe Balbi, Jerome Brunet,
Julian Scheel, John Keeping, Greg Kroah-Hartman
The Playback/Capture ctl currently reports rate value set by USB
control selector UAC2_CS_CONTROL_SAM_FREQ (fixed for UAC1). When the
stops playback/capture, the reported value does not change. The gadget
side has no information whether the host has started/stopped
capture/playback.
This patch sets the value reported by the respective rate ctl to zero
when the host side has stopped playback/capture. Also, it calls
snd_ctl_notify when start/stop occurs, so that a subscribed client can
act appropriately.
Tests have confirmed that USB hosts change UAC2_CS_CONTROL_SAM_FREQ
before switching altsetting to activate playback/capture, resulting in
correct order (params->c/p_srate is set to requested rate before
u_audio_start_capture/playback is called).
The gadget rate notifications are used by user-space audio gadget
controller gaudio_ctl https://github.com/pavhofman/gaudio_ctl.
Signed-off-by: Pavel Hofman <pavel.hofman@ivitera.com>
---
v3:
* using prm->srate instead of params->c_srate/p_srate due to the added commit
"[v3] usb: gadget: u_audio: Move dynamic srate from params to rtd"
---
drivers/usb/gadget/function/u_audio.c | 28 ++++++++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/gadget/function/u_audio.c b/drivers/usb/gadget/function/u_audio.c
index 283a449a9538..fab1bc439002 100644
--- a/drivers/usb/gadget/function/u_audio.c
+++ b/drivers/usb/gadget/function/u_audio.c
@@ -65,6 +65,7 @@ struct uac_rtd_params {
struct snd_kcontrol *snd_kctl_rate; /* read-only current rate */
int srate; /* selected samplerate */
+ int active; /* playback/capture running */
spinlock_t lock; /* lock for control transfers */
@@ -490,6 +491,21 @@ static inline void free_ep_fback(struct uac_rtd_params *prm, struct usb_ep *ep)
dev_err(uac->card->dev, "%s:%d Error!\n", __func__, __LINE__);
}
+static void set_active(struct uac_rtd_params *prm, bool active)
+{
+ // notifying through the Rate ctrl
+ struct snd_kcontrol *kctl = prm->snd_kctl_rate;
+ unsigned long flags;
+
+ spin_lock_irqsave(&prm->lock, flags);
+ if (prm->active != active) {
+ prm->active = active;
+ snd_ctl_notify(prm->uac->card, SNDRV_CTL_EVENT_MASK_VALUE,
+ &kctl->id);
+ }
+ spin_unlock_irqrestore(&prm->lock, flags);
+}
+
int u_audio_set_capture_srate(struct g_audio *audio_dev, int srate)
{
struct uac_params *params = &audio_dev->params;
@@ -607,6 +623,8 @@ int u_audio_start_capture(struct g_audio *audio_dev)
dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
}
+ set_active(&uac->c_prm, true);
+
ep_fback = audio_dev->in_ep_fback;
if (!ep_fback)
return 0;
@@ -652,6 +670,7 @@ void u_audio_stop_capture(struct g_audio *audio_dev)
{
struct snd_uac_chip *uac = audio_dev->uac;
+ set_active(&uac->c_prm, false);
if (audio_dev->in_ep_fback)
free_ep_fback(&uac->c_prm, audio_dev->in_ep_fback);
free_ep(&uac->c_prm, audio_dev->out_ep);
@@ -723,6 +742,8 @@ int u_audio_start_playback(struct g_audio *audio_dev)
dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
}
+ set_active(&uac->p_prm, true);
+
return 0;
}
EXPORT_SYMBOL_GPL(u_audio_start_playback);
@@ -731,6 +752,7 @@ void u_audio_stop_playback(struct g_audio *audio_dev)
{
struct snd_uac_chip *uac = audio_dev->uac;
+ set_active(&uac->p_prm, false);
free_ep(&uac->p_prm, audio_dev->in_ep);
}
EXPORT_SYMBOL_GPL(u_audio_stop_playback);
@@ -1074,7 +1096,11 @@ static int u_audio_rate_get(struct snd_kcontrol *kcontrol,
unsigned long flags;
spin_lock_irqsave(&prm->lock, flags);
- ucontrol->value.integer.value[0] = prm->srate;
+ if (prm->active)
+ ucontrol->value.integer.value[0] = prm->srate;
+ else
+ /* not active: reporting zero rate */
+ ucontrol->value.integer.value[0] = 0;
spin_unlock_irqrestore(&prm->lock, flags);
return 0;
}
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 09/11] usb: gadget: u_audio: Add suspend call
2022-01-09 11:59 [PATCH v3 00/11] usb: gadget: audio: Multiple rates, notify Pavel Hofman
` (7 preceding siblings ...)
2022-01-09 11:59 ` [PATCH v3 08/11] usb: gadget: u_audio: Rate ctl notifies about current srate (0=stopped) Pavel Hofman
@ 2022-01-09 11:59 ` Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 10/11] usb: gadget: f_uac2: Add suspend callback Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 11/11] usb: gadget: f_uac1: " Pavel Hofman
10 siblings, 0 replies; 15+ messages in thread
From: Pavel Hofman @ 2022-01-09 11:59 UTC (permalink / raw)
To: linux-usb
Cc: Pavel Hofman, Ruslan Bilovol, Felipe Balbi, Jerome Brunet,
Julian Scheel, John Keeping, Greg Kroah-Hartman
Add exported method u_audio_suspend which sets stream status to
inactive and sends notifications. The method does not free any
resources.
Signed-off-by: Pavel Hofman <pavel.hofman@ivitera.com>
---
v3:
* fixed commit title
* removed stopping substreams (moved to a separate patch series)
* calling set_active(false) instead of the removed set_srate(0)
* updated commit msg
---
drivers/usb/gadget/function/u_audio.c | 9 +++++++++
drivers/usb/gadget/function/u_audio.h | 2 ++
2 files changed, 11 insertions(+)
diff --git a/drivers/usb/gadget/function/u_audio.c b/drivers/usb/gadget/function/u_audio.c
index fab1bc439002..2bb569895a90 100644
--- a/drivers/usb/gadget/function/u_audio.c
+++ b/drivers/usb/gadget/function/u_audio.c
@@ -757,6 +757,15 @@ void u_audio_stop_playback(struct g_audio *audio_dev)
}
EXPORT_SYMBOL_GPL(u_audio_stop_playback);
+void u_audio_suspend(struct g_audio *audio_dev)
+{
+ struct snd_uac_chip *uac = audio_dev->uac;
+
+ set_active(&uac->p_prm, false);
+ set_active(&uac->c_prm, false);
+}
+EXPORT_SYMBOL_GPL(u_audio_suspend);
+
int u_audio_get_volume(struct g_audio *audio_dev, int playback, s16 *val)
{
struct snd_uac_chip *uac = audio_dev->uac;
diff --git a/drivers/usb/gadget/function/u_audio.h b/drivers/usb/gadget/function/u_audio.h
index 5e6ed0f31cc3..9512b8fccfaa 100644
--- a/drivers/usb/gadget/function/u_audio.h
+++ b/drivers/usb/gadget/function/u_audio.h
@@ -130,4 +130,6 @@ int u_audio_set_volume(struct g_audio *g_audio, int playback, s16 val);
int u_audio_get_mute(struct g_audio *g_audio, int playback, int *val);
int u_audio_set_mute(struct g_audio *g_audio, int playback, int val);
+void u_audio_suspend(struct g_audio *g_audio);
+
#endif /* __U_AUDIO_H */
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 10/11] usb: gadget: f_uac2: Add suspend callback
2022-01-09 11:59 [PATCH v3 00/11] usb: gadget: audio: Multiple rates, notify Pavel Hofman
` (8 preceding siblings ...)
2022-01-09 11:59 ` [PATCH v3 09/11] usb: gadget: u_audio: Add suspend call Pavel Hofman
@ 2022-01-09 11:59 ` Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 11/11] usb: gadget: f_uac1: " Pavel Hofman
10 siblings, 0 replies; 15+ messages in thread
From: Pavel Hofman @ 2022-01-09 11:59 UTC (permalink / raw)
To: linux-usb
Cc: Pavel Hofman, Ruslan Bilovol, Felipe Balbi, Jerome Brunet,
Julian Scheel, John Keeping, Greg Kroah-Hartman
When USB cable gets disconnected, the undergoing playback/capture
stalls, without any notification to u_audio about the change.
Experiments with a dwc2 gadget revealed that Suspend interrupt is
thrown at cable disconnection, which the gadget framework translates to
calling suspend callback of a function, if it is defined.
Add the suspend callback to f_uac2 function, calling
corresponding method of u_audio in order to stop the respective PCM
streams and to notify subscribed clients at cable disconnection.
Signed-off-by: Pavel Hofman <pavel.hofman@ivitera.com>
---
v3: fixed commit title and msg
---
drivers/usb/gadget/function/f_uac2.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c
index 58e29cbf5d79..f55e72f55d34 100644
--- a/drivers/usb/gadget/function/f_uac2.c
+++ b/drivers/usb/gadget/function/f_uac2.c
@@ -1436,6 +1436,14 @@ afunc_disable(struct usb_function *fn)
usb_ep_disable(uac2->int_ep);
}
+static void
+afunc_suspend(struct usb_function *fn)
+{
+ struct f_uac2 *uac2 = func_to_uac2(fn);
+
+ u_audio_suspend(&uac2->g_audio);
+}
+
static int
in_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
{
@@ -2107,6 +2115,7 @@ static struct usb_function *afunc_alloc(struct usb_function_instance *fi)
uac2->g_audio.func.set_alt = afunc_set_alt;
uac2->g_audio.func.get_alt = afunc_get_alt;
uac2->g_audio.func.disable = afunc_disable;
+ uac2->g_audio.func.suspend = afunc_suspend;
uac2->g_audio.func.setup = afunc_setup;
uac2->g_audio.func.free_func = afunc_free;
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 11/11] usb: gadget: f_uac1: Add suspend callback
2022-01-09 11:59 [PATCH v3 00/11] usb: gadget: audio: Multiple rates, notify Pavel Hofman
` (9 preceding siblings ...)
2022-01-09 11:59 ` [PATCH v3 10/11] usb: gadget: f_uac2: Add suspend callback Pavel Hofman
@ 2022-01-09 11:59 ` Pavel Hofman
10 siblings, 0 replies; 15+ messages in thread
From: Pavel Hofman @ 2022-01-09 11:59 UTC (permalink / raw)
To: linux-usb
Cc: Pavel Hofman, Ruslan Bilovol, Felipe Balbi, Jerome Brunet,
Julian Scheel, John Keeping, Greg Kroah-Hartman
Add suspend callback to f_uac1 function, calling corresponding method
of u_audio in order to stop the respective PCM streams and to notify
subscribed clients about the stop.
Signed-off-by: Pavel Hofman <pavel.hofman@ivitera.com>
---
v3: fixed commit title and msg
---
drivers/usb/gadget/function/f_uac1.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/usb/gadget/function/f_uac1.c b/drivers/usb/gadget/function/f_uac1.c
index 73df76a6fbe0..1484e5c231d3 100644
--- a/drivers/usb/gadget/function/f_uac1.c
+++ b/drivers/usb/gadget/function/f_uac1.c
@@ -961,6 +961,14 @@ static void f_audio_disable(struct usb_function *f)
usb_ep_disable(uac1->int_ep);
}
+static void
+f_audio_suspend(struct usb_function *f)
+{
+ struct f_uac1 *uac1 = func_to_uac1(f);
+
+ u_audio_suspend(&uac1->g_audio);
+}
+
/*-------------------------------------------------------------------------*/
static struct uac_feature_unit_descriptor *build_fu_desc(int chmask)
{
@@ -1691,6 +1699,7 @@ static struct usb_function *f_audio_alloc(struct usb_function_instance *fi)
uac1->g_audio.func.get_alt = f_audio_get_alt;
uac1->g_audio.func.setup = f_audio_setup;
uac1->g_audio.func.disable = f_audio_disable;
+ uac1->g_audio.func.suspend = f_audio_suspend;
uac1->g_audio.func.free_func = f_audio_free;
return &uac1->g_audio.func;
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v3 06/11] usb: gadget: f_uac2: Rename Clock Sources to fixed names
2022-01-09 11:59 ` [PATCH v3 06/11] usb: gadget: f_uac2: Rename Clock Sources to fixed names Pavel Hofman
@ 2022-01-09 14:08 ` kernel test robot
2022-01-09 17:40 ` kernel test robot
1 sibling, 0 replies; 15+ messages in thread
From: kernel test robot @ 2022-01-09 14:08 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 43698 bytes --]
Hi Pavel,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on usb/usb-testing]
[cannot apply to linus/master balbi-usb/testing/next peter-chen-usb/for-usb-next v5.16-rc8 next-20220107]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Pavel-Hofman/usb-gadget-audio-Multiple-rates-notify/20220109-200125
base: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
config: h8300-allyesconfig (https://download.01.org/0day-ci/archive/20220109/202201092241.ArbnmboF-lkp(a)intel.com/config)
compiler: h8300-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/4c4a7d32bcd7aa57e015597497c80ead346c7385
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Pavel-Hofman/usb-gadget-audio-Multiple-rates-notify/20220109-200125
git checkout 4c4a7d32bcd7aa57e015597497c80ead346c7385
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=h8300 SHELL=/bin/bash drivers/usb/gadget/function/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
In file included from include/linux/build_bug.h:5,
from include/linux/container_of.h:5,
from include/linux/list.h:5,
from include/linux/module.h:12,
from drivers/usb/gadget/function/f_uac2.c:15:
include/linux/scatterlist.h: In function 'sg_set_buf':
include/asm-generic/page.h:89:51: warning: ordered comparison of pointer with null pointer [-Wextra]
89 | #define virt_addr_valid(kaddr) (((void *)(kaddr) >= (void *)PAGE_OFFSET) && \
| ^~
include/linux/compiler.h:78:45: note: in definition of macro 'unlikely'
78 | # define unlikely(x) __builtin_expect(!!(x), 0)
| ^
include/linux/scatterlist.h:143:9: note: in expansion of macro 'BUG_ON'
143 | BUG_ON(!virt_addr_valid(buf));
| ^~~~~~
include/linux/scatterlist.h:143:17: note: in expansion of macro 'virt_addr_valid'
143 | BUG_ON(!virt_addr_valid(buf));
| ^~~~~~~~~~~~~~~
drivers/usb/gadget/function/f_uac2.c: In function 'afunc_bind':
>> drivers/usb/gadget/function/f_uac2.c:981:27: warning: variable 'init_c_srate' set but not used [-Wunused-but-set-variable]
981 | int init_p_srate, init_c_srate;
| ^~~~~~~~~~~~
>> drivers/usb/gadget/function/f_uac2.c:981:13: warning: variable 'init_p_srate' set but not used [-Wunused-but-set-variable]
981 | int init_p_srate, init_c_srate;
| ^~~~~~~~~~~~
vim +/init_c_srate +981 drivers/usb/gadget/function/f_uac2.c
3713d5ceb04d5a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-03-01 969
f8f93d244afad8 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 970 static int
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 971 afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 972 {
eb9fecb9e69b0b drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 973 struct f_uac2 *uac2 = func_to_uac2(fn);
eb9fecb9e69b0b drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 974 struct g_audio *agdev = func_to_g_audio(fn);
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 975 struct usb_composite_dev *cdev = cfg->cdev;
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 976 struct usb_gadget *gadget = cdev->gadget;
7158b57a495635 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 977 struct device *dev = &gadget->dev;
3713d5ceb04d5a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-03-01 978 struct f_uac2_opts *uac2_opts = g_audio_to_uac2_opts(agdev);
f408757f819a57 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 979 struct usb_string *us;
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 980 int ret;
919a88c00fb3ce drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 @981 int init_p_srate, init_c_srate;
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 982
3713d5ceb04d5a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-03-01 983 ret = afunc_validate_opts(agdev, dev);
3713d5ceb04d5a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-03-01 984 if (ret)
3713d5ceb04d5a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-03-01 985 return ret;
f8f93d244afad8 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 986
f408757f819a57 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 987 us = usb_gstrings_attach(cdev, fn_strings, ARRAY_SIZE(strings_fn));
f408757f819a57 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 988 if (IS_ERR(us))
f408757f819a57 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 989 return PTR_ERR(us);
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 990
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 991 if (FUOUT_EN(uac2_opts)) {
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 992 out_feature_unit_desc = build_fu_desc(uac2_opts->c_chmask);
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 993 if (!out_feature_unit_desc)
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 994 return -ENOMEM;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 995 }
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 996 if (FUIN_EN(uac2_opts)) {
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 997 in_feature_unit_desc = build_fu_desc(uac2_opts->p_chmask);
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 998 if (!in_feature_unit_desc) {
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 999 ret = -ENOMEM;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1000 goto err_free_fu;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1001 }
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1002 }
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1003
f408757f819a57 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1004 iad_desc.iFunction = us[STR_ASSOC].id;
f408757f819a57 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1005 std_ac_if_desc.iInterface = us[STR_IF_CTRL].id;
f408757f819a57 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1006 in_clk_src_desc.iClockSource = us[STR_CLKSRC_IN].id;
f408757f819a57 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1007 out_clk_src_desc.iClockSource = us[STR_CLKSRC_OUT].id;
f408757f819a57 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1008 usb_out_it_desc.iTerminal = us[STR_USB_IT].id;
f408757f819a57 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1009 io_in_it_desc.iTerminal = us[STR_IO_IT].id;
f408757f819a57 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1010 usb_in_ot_desc.iTerminal = us[STR_USB_OT].id;
f408757f819a57 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1011 io_out_ot_desc.iTerminal = us[STR_IO_OT].id;
f408757f819a57 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1012 std_as_out_if0_desc.iInterface = us[STR_AS_OUT_ALT0].id;
f408757f819a57 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1013 std_as_out_if1_desc.iInterface = us[STR_AS_OUT_ALT1].id;
f408757f819a57 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1014 std_as_in_if0_desc.iInterface = us[STR_AS_IN_ALT0].id;
f408757f819a57 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1015 std_as_in_if1_desc.iInterface = us[STR_AS_IN_ALT1].id;
f408757f819a57 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1016
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1017 if (FUOUT_EN(uac2_opts)) {
59e477af7b1a2a drivers/usb/gadget/function/f_uac2.c Colin Ian King 2021-08-04 1018 u8 *i_feature = (u8 *)out_feature_unit_desc +
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1019 out_feature_unit_desc->bLength - 1;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1020 *i_feature = us[STR_FU_OUT].id;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1021 }
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1022 if (FUIN_EN(uac2_opts)) {
59e477af7b1a2a drivers/usb/gadget/function/f_uac2.c Colin Ian King 2021-08-04 1023 u8 *i_feature = (u8 *)in_feature_unit_desc +
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1024 in_feature_unit_desc->bLength - 1;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1025 *i_feature = us[STR_FU_IN].id;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1026 }
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1027
f8f93d244afad8 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1028
f8f93d244afad8 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1029 /* Initialize the configurable parameters */
f8f93d244afad8 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1030 usb_out_it_desc.bNrChannels = num_channels(uac2_opts->c_chmask);
f8f93d244afad8 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1031 usb_out_it_desc.bmChannelConfig = cpu_to_le32(uac2_opts->c_chmask);
f8f93d244afad8 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1032 io_in_it_desc.bNrChannels = num_channels(uac2_opts->p_chmask);
f8f93d244afad8 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1033 io_in_it_desc.bmChannelConfig = cpu_to_le32(uac2_opts->p_chmask);
f8f93d244afad8 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1034 as_out_hdr_desc.bNrChannels = num_channels(uac2_opts->c_chmask);
f8f93d244afad8 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1035 as_out_hdr_desc.bmChannelConfig = cpu_to_le32(uac2_opts->c_chmask);
f8f93d244afad8 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1036 as_in_hdr_desc.bNrChannels = num_channels(uac2_opts->p_chmask);
f8f93d244afad8 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1037 as_in_hdr_desc.bmChannelConfig = cpu_to_le32(uac2_opts->p_chmask);
f8f93d244afad8 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1038 as_out_fmt1_desc.bSubslotSize = uac2_opts->c_ssize;
f8f93d244afad8 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1039 as_out_fmt1_desc.bBitResolution = uac2_opts->c_ssize * 8;
f8f93d244afad8 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1040 as_in_fmt1_desc.bSubslotSize = uac2_opts->p_ssize;
f8f93d244afad8 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1041 as_in_fmt1_desc.bBitResolution = uac2_opts->p_ssize * 8;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1042 if (FUOUT_EN(uac2_opts)) {
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1043 __le32 *bma = (__le32 *)&out_feature_unit_desc->bmaControls[0];
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1044 u32 control = 0;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1045
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1046 if (uac2_opts->c_mute_present)
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1047 control |= CONTROL_RDWR << FU_MUTE_CTRL;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1048 if (uac2_opts->c_volume_present)
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1049 control |= CONTROL_RDWR << FU_VOL_CTRL;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1050 *bma = cpu_to_le32(control);
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1051 }
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1052 if (FUIN_EN(uac2_opts)) {
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1053 __le32 *bma = (__le32 *)&in_feature_unit_desc->bmaControls[0];
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1054 u32 control = 0;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1055
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1056 if (uac2_opts->p_mute_present)
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1057 control |= CONTROL_RDWR << FU_MUTE_CTRL;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1058 if (uac2_opts->p_volume_present)
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1059 control |= CONTROL_RDWR << FU_VOL_CTRL;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1060 *bma = cpu_to_le32(control);
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1061 }
f8f93d244afad8 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1062
919a88c00fb3ce drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1063 init_p_srate = uac2_opts->p_srates[0];
919a88c00fb3ce drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1064 init_c_srate = uac2_opts->c_srates[0];
919a88c00fb3ce drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1065
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1066 ret = usb_interface_id(cfg, fn);
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1067 if (ret < 0) {
a8147dabe56f7e drivers/usb/gadget/function/f_uac2.c Daniel Mack 2014-08-27 1068 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1069 goto err_free_fu;
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1070 }
8813a59ed89230 drivers/usb/gadget/function/f_uac2.c John Keeping 2018-01-12 1071 iad_desc.bFirstInterface = ret;
8813a59ed89230 drivers/usb/gadget/function/f_uac2.c John Keeping 2018-01-12 1072
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1073 std_ac_if_desc.bInterfaceNumber = ret;
eb9fecb9e69b0b drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1074 uac2->ac_intf = ret;
eb9fecb9e69b0b drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1075 uac2->ac_alt = 0;
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1076
3fa4eaa6c08206 drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1077 if (EPOUT_EN(uac2_opts)) {
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1078 ret = usb_interface_id(cfg, fn);
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1079 if (ret < 0) {
a8147dabe56f7e drivers/usb/gadget/function/f_uac2.c Daniel Mack 2014-08-27 1080 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1081 goto err_free_fu;
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1082 }
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1083 std_as_out_if0_desc.bInterfaceNumber = ret;
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1084 std_as_out_if1_desc.bInterfaceNumber = ret;
eb9fecb9e69b0b drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1085 uac2->as_out_intf = ret;
eb9fecb9e69b0b drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1086 uac2->as_out_alt = 0;
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1087
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1088 if (EPOUT_FBACK_IN_EN(uac2_opts)) {
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1089 fs_epout_desc.bmAttributes =
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1090 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC;
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1091 hs_epout_desc.bmAttributes =
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1092 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC;
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1093 ss_epout_desc.bmAttributes =
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1094 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC;
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1095 std_as_out_if1_desc.bNumEndpoints++;
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1096 } else {
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1097 fs_epout_desc.bmAttributes =
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1098 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ADAPTIVE;
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1099 hs_epout_desc.bmAttributes =
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1100 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ADAPTIVE;
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1101 ss_epout_desc.bmAttributes =
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1102 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ADAPTIVE;
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1103 }
3fa4eaa6c08206 drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1104 }
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1105
3fa4eaa6c08206 drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1106 if (EPIN_EN(uac2_opts)) {
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1107 ret = usb_interface_id(cfg, fn);
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1108 if (ret < 0) {
a8147dabe56f7e drivers/usb/gadget/function/f_uac2.c Daniel Mack 2014-08-27 1109 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1110 goto err_free_fu;
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1111 }
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1112 std_as_in_if0_desc.bInterfaceNumber = ret;
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1113 std_as_in_if1_desc.bInterfaceNumber = ret;
eb9fecb9e69b0b drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1114 uac2->as_in_intf = ret;
eb9fecb9e69b0b drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1115 uac2->as_in_alt = 0;
3fa4eaa6c08206 drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1116 }
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1117
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1118 if (FUOUT_EN(uac2_opts) || FUIN_EN(uac2_opts)) {
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1119 uac2->int_ep = usb_ep_autoconfig(gadget, &fs_ep_int_desc);
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1120 if (!uac2->int_ep) {
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1121 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1122 ret = -ENODEV;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1123 goto err_free_fu;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1124 }
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1125
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1126 std_ac_if_desc.bNumEndpoints = 1;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1127 }
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1128
0db56e43359c47 drivers/usb/gadget/function/f_uac2.c Sekhar Nori 2017-05-17 1129 /* Calculate wMaxPacketSize according to audio bandwidth */
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1130 ret = set_ep_max_packet_size(uac2_opts, &fs_epin_desc, USB_SPEED_FULL,
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1131 true);
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1132 if (ret < 0) {
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1133 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1134 return ret;
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1135 }
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1136
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1137 ret = set_ep_max_packet_size(uac2_opts, &fs_epout_desc, USB_SPEED_FULL,
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1138 false);
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1139 if (ret < 0) {
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1140 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1141 return ret;
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1142 }
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1143
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1144 ret = set_ep_max_packet_size(uac2_opts, &hs_epin_desc, USB_SPEED_HIGH,
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1145 true);
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1146 if (ret < 0) {
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1147 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1148 return ret;
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1149 }
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1150
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1151 ret = set_ep_max_packet_size(uac2_opts, &hs_epout_desc, USB_SPEED_HIGH,
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1152 false);
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1153 if (ret < 0) {
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1154 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1155 return ret;
9389044f27081d drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1156 }
0db56e43359c47 drivers/usb/gadget/function/f_uac2.c Sekhar Nori 2017-05-17 1157
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1158 ret = set_ep_max_packet_size(uac2_opts, &ss_epin_desc, USB_SPEED_SUPER,
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1159 true);
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1160 if (ret < 0) {
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1161 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1162 return ret;
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1163 }
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1164
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1165 ret = set_ep_max_packet_size(uac2_opts, &ss_epout_desc, USB_SPEED_SUPER,
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1166 false);
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1167 if (ret < 0) {
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1168 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1169 return ret;
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1170 }
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1171
3fa4eaa6c08206 drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1172 if (EPOUT_EN(uac2_opts)) {
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1173 agdev->out_ep = usb_ep_autoconfig(gadget, &fs_epout_desc);
391aa852a37230 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1174 if (!agdev->out_ep) {
a8147dabe56f7e drivers/usb/gadget/function/f_uac2.c Daniel Mack 2014-08-27 1175 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1176 ret = -ENODEV;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1177 goto err_free_fu;
391aa852a37230 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1178 }
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1179 if (EPOUT_FBACK_IN_EN(uac2_opts)) {
24f779dac8f3ef drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1180 agdev->in_ep_fback = usb_ep_autoconfig(gadget,
24f779dac8f3ef drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1181 &fs_epin_fback_desc);
24f779dac8f3ef drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1182 if (!agdev->in_ep_fback) {
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1183 dev_err(dev, "%s:%d Error!\n",
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1184 __func__, __LINE__);
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1185 ret = -ENODEV;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1186 goto err_free_fu;
24f779dac8f3ef drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1187 }
3fa4eaa6c08206 drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1188 }
40c73b30546e75 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1189 }
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1190
3fa4eaa6c08206 drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1191 if (EPIN_EN(uac2_opts)) {
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1192 agdev->in_ep = usb_ep_autoconfig(gadget, &fs_epin_desc);
391aa852a37230 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1193 if (!agdev->in_ep) {
a8147dabe56f7e drivers/usb/gadget/function/f_uac2.c Daniel Mack 2014-08-27 1194 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1195 ret = -ENODEV;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1196 goto err_free_fu;
391aa852a37230 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1197 }
3fa4eaa6c08206 drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1198 }
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1199
14e1d56cbea6c0 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-25 1200 agdev->in_ep_maxpsize = max_t(u16,
14e1d56cbea6c0 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-25 1201 le16_to_cpu(fs_epin_desc.wMaxPacketSize),
14e1d56cbea6c0 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-25 1202 le16_to_cpu(hs_epin_desc.wMaxPacketSize));
14e1d56cbea6c0 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-25 1203 agdev->out_ep_maxpsize = max_t(u16,
14e1d56cbea6c0 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-25 1204 le16_to_cpu(fs_epout_desc.wMaxPacketSize),
14e1d56cbea6c0 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-25 1205 le16_to_cpu(hs_epout_desc.wMaxPacketSize));
eb127cb519d73c drivers/usb/gadget/f_uac2.c Jassi Brar 2013-05-30 1206
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1207 agdev->in_ep_maxpsize = max_t(u16, agdev->in_ep_maxpsize,
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1208 le16_to_cpu(ss_epin_desc.wMaxPacketSize));
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1209 agdev->out_ep_maxpsize = max_t(u16, agdev->out_ep_maxpsize,
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1210 le16_to_cpu(ss_epout_desc.wMaxPacketSize));
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1211
f0e8a206a2a53a drivers/usb/gadget/function/f_uac2.c Jack Pham 2021-09-09 1212 ss_epin_desc_comp.wBytesPerInterval = ss_epin_desc.wMaxPacketSize;
f0e8a206a2a53a drivers/usb/gadget/function/f_uac2.c Jack Pham 2021-09-09 1213 ss_epout_desc_comp.wBytesPerInterval = ss_epout_desc.wMaxPacketSize;
f0e8a206a2a53a drivers/usb/gadget/function/f_uac2.c Jack Pham 2021-09-09 1214
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1215 // HS and SS endpoint addresses are copied from autoconfigured FS descriptors
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1216 hs_ep_int_desc.bEndpointAddress = fs_ep_int_desc.bEndpointAddress;
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1217 hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress;
24f779dac8f3ef drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1218 hs_epin_fback_desc.bEndpointAddress = fs_epin_fback_desc.bEndpointAddress;
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1219 hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress;
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1220 ss_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress;
24f779dac8f3ef drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1221 ss_epin_fback_desc.bEndpointAddress = fs_epin_fback_desc.bEndpointAddress;
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1222 ss_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1223 ss_ep_int_desc.bEndpointAddress = fs_ep_int_desc.bEndpointAddress;
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1224
3fa4eaa6c08206 drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1225 setup_descriptor(uac2_opts);
3fa4eaa6c08206 drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1226
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1227 ret = usb_assign_descriptors(fn, fs_audio_desc, hs_audio_desc, ss_audio_desc,
f8cb3d556be31d drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1228 ss_audio_desc);
10287baec761d3 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1229 if (ret)
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1230 goto err_free_fu;
132fcb460839a8 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1231
7158b57a495635 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1232 agdev->gadget = gadget;
7158b57a495635 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1233
eb9fecb9e69b0b drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1234 agdev->params.p_chmask = uac2_opts->p_chmask;
919a88c00fb3ce drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1235 memcpy(agdev->params.p_srates, uac2_opts->p_srates,
919a88c00fb3ce drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1236 sizeof(agdev->params.p_srates));
eb9fecb9e69b0b drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1237 agdev->params.p_ssize = uac2_opts->p_ssize;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1238 if (FUIN_EN(uac2_opts)) {
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1239 agdev->params.p_fu.id = USB_IN_FU_ID;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1240 agdev->params.p_fu.mute_present = uac2_opts->p_mute_present;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1241 agdev->params.p_fu.volume_present = uac2_opts->p_volume_present;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1242 agdev->params.p_fu.volume_min = uac2_opts->p_volume_min;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1243 agdev->params.p_fu.volume_max = uac2_opts->p_volume_max;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1244 agdev->params.p_fu.volume_res = uac2_opts->p_volume_res;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1245 }
eb9fecb9e69b0b drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1246 agdev->params.c_chmask = uac2_opts->c_chmask;
919a88c00fb3ce drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1247 memcpy(agdev->params.c_srates, uac2_opts->c_srates,
919a88c00fb3ce drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1248 sizeof(agdev->params.c_srates));
eb9fecb9e69b0b drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1249 agdev->params.c_ssize = uac2_opts->c_ssize;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1250 if (FUOUT_EN(uac2_opts)) {
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1251 agdev->params.c_fu.id = USB_OUT_FU_ID;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1252 agdev->params.c_fu.mute_present = uac2_opts->c_mute_present;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1253 agdev->params.c_fu.volume_present = uac2_opts->c_volume_present;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1254 agdev->params.c_fu.volume_min = uac2_opts->c_volume_min;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1255 agdev->params.c_fu.volume_max = uac2_opts->c_volume_max;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1256 agdev->params.c_fu.volume_res = uac2_opts->c_volume_res;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1257 }
eb9fecb9e69b0b drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1258 agdev->params.req_number = uac2_opts->req_number;
e89bb4288378b8 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1259 agdev->params.fb_max = uac2_opts->fb_max;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1260
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1261 if (FUOUT_EN(uac2_opts) || FUIN_EN(uac2_opts))
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1262 agdev->notify = afunc_notify;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1263
eb9fecb9e69b0b drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1264 ret = g_audio_setup(agdev, "UAC2 PCM", "UAC2_Gadget");
391aa852a37230 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1265 if (ret)
eb9fecb9e69b0b drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1266 goto err_free_descs;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1267
391aa852a37230 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1268 return 0;
d12a8727171c77 drivers/usb/gadget/function/f_uac2.c Pavitrakumar Managutte 2014-10-22 1269
f1d3861d63a5d7 drivers/usb/gadget/function/f_uac2.c Peter Chen 2016-11-08 1270 err_free_descs:
f1d3861d63a5d7 drivers/usb/gadget/function/f_uac2.c Peter Chen 2016-11-08 1271 usb_free_all_descriptors(fn);
7158b57a495635 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1272 agdev->gadget = NULL;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1273 err_free_fu:
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1274 kfree(out_feature_unit_desc);
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1275 out_feature_unit_desc = NULL;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1276 kfree(in_feature_unit_desc);
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1277 in_feature_unit_desc = NULL;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1278 return ret;
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1279 }
eaf6cbe0992052 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1280
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3 06/11] usb: gadget: f_uac2: Rename Clock Sources to fixed names
2022-01-09 11:59 ` [PATCH v3 06/11] usb: gadget: f_uac2: Rename Clock Sources to fixed names Pavel Hofman
@ 2022-01-09 17:40 ` kernel test robot
2022-01-09 17:40 ` kernel test robot
1 sibling, 0 replies; 15+ messages in thread
From: kernel test robot @ 2022-01-09 17:40 UTC (permalink / raw)
To: Pavel Hofman; +Cc: llvm, kbuild-all
Hi Pavel,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on usb/usb-testing]
[cannot apply to linus/master balbi-usb/testing/next peter-chen-usb/for-usb-next v5.16-rc8 next-20220107]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Pavel-Hofman/usb-gadget-audio-Multiple-rates-notify/20220109-200125
base: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
config: x86_64-randconfig-a015-20220109 (https://download.01.org/0day-ci/archive/20220110/202201100122.8amhCftR-lkp@intel.com/config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project f3a344d2125fa37e59bae1b0874442c650a19607)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/4c4a7d32bcd7aa57e015597497c80ead346c7385
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Pavel-Hofman/usb-gadget-audio-Multiple-rates-notify/20220109-200125
git checkout 4c4a7d32bcd7aa57e015597497c80ead346c7385
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash drivers/usb/gadget/function/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> drivers/usb/gadget/function/f_uac2.c:981:20: warning: variable 'init_c_srate' set but not used [-Wunused-but-set-variable]
int init_p_srate, init_c_srate;
^
>> drivers/usb/gadget/function/f_uac2.c:981:6: warning: variable 'init_p_srate' set but not used [-Wunused-but-set-variable]
int init_p_srate, init_c_srate;
^
2 warnings generated.
vim +/init_c_srate +981 drivers/usb/gadget/function/f_uac2.c
3713d5ceb04d5ab drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-03-01 969
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 970 static int
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 971 afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 972 {
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 973 struct f_uac2 *uac2 = func_to_uac2(fn);
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 974 struct g_audio *agdev = func_to_g_audio(fn);
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 975 struct usb_composite_dev *cdev = cfg->cdev;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 976 struct usb_gadget *gadget = cdev->gadget;
7158b57a495635c drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 977 struct device *dev = &gadget->dev;
3713d5ceb04d5ab drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-03-01 978 struct f_uac2_opts *uac2_opts = g_audio_to_uac2_opts(agdev);
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 979 struct usb_string *us;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 980 int ret;
919a88c00fb3ce7 drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 @981 int init_p_srate, init_c_srate;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 982
3713d5ceb04d5ab drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-03-01 983 ret = afunc_validate_opts(agdev, dev);
3713d5ceb04d5ab drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-03-01 984 if (ret)
3713d5ceb04d5ab drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-03-01 985 return ret;
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 986
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 987 us = usb_gstrings_attach(cdev, fn_strings, ARRAY_SIZE(strings_fn));
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 988 if (IS_ERR(us))
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 989 return PTR_ERR(us);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 990
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 991 if (FUOUT_EN(uac2_opts)) {
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 992 out_feature_unit_desc = build_fu_desc(uac2_opts->c_chmask);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 993 if (!out_feature_unit_desc)
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 994 return -ENOMEM;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 995 }
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 996 if (FUIN_EN(uac2_opts)) {
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 997 in_feature_unit_desc = build_fu_desc(uac2_opts->p_chmask);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 998 if (!in_feature_unit_desc) {
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 999 ret = -ENOMEM;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1000 goto err_free_fu;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1001 }
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1002 }
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1003
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1004 iad_desc.iFunction = us[STR_ASSOC].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1005 std_ac_if_desc.iInterface = us[STR_IF_CTRL].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1006 in_clk_src_desc.iClockSource = us[STR_CLKSRC_IN].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1007 out_clk_src_desc.iClockSource = us[STR_CLKSRC_OUT].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1008 usb_out_it_desc.iTerminal = us[STR_USB_IT].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1009 io_in_it_desc.iTerminal = us[STR_IO_IT].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1010 usb_in_ot_desc.iTerminal = us[STR_USB_OT].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1011 io_out_ot_desc.iTerminal = us[STR_IO_OT].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1012 std_as_out_if0_desc.iInterface = us[STR_AS_OUT_ALT0].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1013 std_as_out_if1_desc.iInterface = us[STR_AS_OUT_ALT1].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1014 std_as_in_if0_desc.iInterface = us[STR_AS_IN_ALT0].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1015 std_as_in_if1_desc.iInterface = us[STR_AS_IN_ALT1].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1016
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1017 if (FUOUT_EN(uac2_opts)) {
59e477af7b1a2a0 drivers/usb/gadget/function/f_uac2.c Colin Ian King 2021-08-04 1018 u8 *i_feature = (u8 *)out_feature_unit_desc +
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1019 out_feature_unit_desc->bLength - 1;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1020 *i_feature = us[STR_FU_OUT].id;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1021 }
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1022 if (FUIN_EN(uac2_opts)) {
59e477af7b1a2a0 drivers/usb/gadget/function/f_uac2.c Colin Ian King 2021-08-04 1023 u8 *i_feature = (u8 *)in_feature_unit_desc +
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1024 in_feature_unit_desc->bLength - 1;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1025 *i_feature = us[STR_FU_IN].id;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1026 }
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1027
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1028
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1029 /* Initialize the configurable parameters */
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1030 usb_out_it_desc.bNrChannels = num_channels(uac2_opts->c_chmask);
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1031 usb_out_it_desc.bmChannelConfig = cpu_to_le32(uac2_opts->c_chmask);
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1032 io_in_it_desc.bNrChannels = num_channels(uac2_opts->p_chmask);
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1033 io_in_it_desc.bmChannelConfig = cpu_to_le32(uac2_opts->p_chmask);
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1034 as_out_hdr_desc.bNrChannels = num_channels(uac2_opts->c_chmask);
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1035 as_out_hdr_desc.bmChannelConfig = cpu_to_le32(uac2_opts->c_chmask);
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1036 as_in_hdr_desc.bNrChannels = num_channels(uac2_opts->p_chmask);
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1037 as_in_hdr_desc.bmChannelConfig = cpu_to_le32(uac2_opts->p_chmask);
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1038 as_out_fmt1_desc.bSubslotSize = uac2_opts->c_ssize;
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1039 as_out_fmt1_desc.bBitResolution = uac2_opts->c_ssize * 8;
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1040 as_in_fmt1_desc.bSubslotSize = uac2_opts->p_ssize;
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1041 as_in_fmt1_desc.bBitResolution = uac2_opts->p_ssize * 8;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1042 if (FUOUT_EN(uac2_opts)) {
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1043 __le32 *bma = (__le32 *)&out_feature_unit_desc->bmaControls[0];
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1044 u32 control = 0;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1045
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1046 if (uac2_opts->c_mute_present)
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1047 control |= CONTROL_RDWR << FU_MUTE_CTRL;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1048 if (uac2_opts->c_volume_present)
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1049 control |= CONTROL_RDWR << FU_VOL_CTRL;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1050 *bma = cpu_to_le32(control);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1051 }
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1052 if (FUIN_EN(uac2_opts)) {
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1053 __le32 *bma = (__le32 *)&in_feature_unit_desc->bmaControls[0];
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1054 u32 control = 0;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1055
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1056 if (uac2_opts->p_mute_present)
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1057 control |= CONTROL_RDWR << FU_MUTE_CTRL;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1058 if (uac2_opts->p_volume_present)
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1059 control |= CONTROL_RDWR << FU_VOL_CTRL;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1060 *bma = cpu_to_le32(control);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1061 }
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1062
919a88c00fb3ce7 drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1063 init_p_srate = uac2_opts->p_srates[0];
919a88c00fb3ce7 drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1064 init_c_srate = uac2_opts->c_srates[0];
919a88c00fb3ce7 drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1065
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1066 ret = usb_interface_id(cfg, fn);
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1067 if (ret < 0) {
a8147dabe56f7e7 drivers/usb/gadget/function/f_uac2.c Daniel Mack 2014-08-27 1068 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1069 goto err_free_fu;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1070 }
8813a59ed892305 drivers/usb/gadget/function/f_uac2.c John Keeping 2018-01-12 1071 iad_desc.bFirstInterface = ret;
8813a59ed892305 drivers/usb/gadget/function/f_uac2.c John Keeping 2018-01-12 1072
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1073 std_ac_if_desc.bInterfaceNumber = ret;
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1074 uac2->ac_intf = ret;
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1075 uac2->ac_alt = 0;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1076
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1077 if (EPOUT_EN(uac2_opts)) {
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1078 ret = usb_interface_id(cfg, fn);
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1079 if (ret < 0) {
a8147dabe56f7e7 drivers/usb/gadget/function/f_uac2.c Daniel Mack 2014-08-27 1080 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1081 goto err_free_fu;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1082 }
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1083 std_as_out_if0_desc.bInterfaceNumber = ret;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1084 std_as_out_if1_desc.bInterfaceNumber = ret;
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1085 uac2->as_out_intf = ret;
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1086 uac2->as_out_alt = 0;
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1087
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1088 if (EPOUT_FBACK_IN_EN(uac2_opts)) {
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1089 fs_epout_desc.bmAttributes =
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1090 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC;
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1091 hs_epout_desc.bmAttributes =
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1092 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC;
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1093 ss_epout_desc.bmAttributes =
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1094 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC;
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1095 std_as_out_if1_desc.bNumEndpoints++;
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1096 } else {
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1097 fs_epout_desc.bmAttributes =
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1098 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ADAPTIVE;
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1099 hs_epout_desc.bmAttributes =
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1100 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ADAPTIVE;
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1101 ss_epout_desc.bmAttributes =
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1102 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ADAPTIVE;
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1103 }
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1104 }
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1105
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1106 if (EPIN_EN(uac2_opts)) {
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1107 ret = usb_interface_id(cfg, fn);
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1108 if (ret < 0) {
a8147dabe56f7e7 drivers/usb/gadget/function/f_uac2.c Daniel Mack 2014-08-27 1109 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1110 goto err_free_fu;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1111 }
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1112 std_as_in_if0_desc.bInterfaceNumber = ret;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1113 std_as_in_if1_desc.bInterfaceNumber = ret;
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1114 uac2->as_in_intf = ret;
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1115 uac2->as_in_alt = 0;
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1116 }
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1117
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1118 if (FUOUT_EN(uac2_opts) || FUIN_EN(uac2_opts)) {
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1119 uac2->int_ep = usb_ep_autoconfig(gadget, &fs_ep_int_desc);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1120 if (!uac2->int_ep) {
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1121 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1122 ret = -ENODEV;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1123 goto err_free_fu;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1124 }
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1125
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1126 std_ac_if_desc.bNumEndpoints = 1;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1127 }
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1128
0db56e43359c47f drivers/usb/gadget/function/f_uac2.c Sekhar Nori 2017-05-17 1129 /* Calculate wMaxPacketSize according to audio bandwidth */
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1130 ret = set_ep_max_packet_size(uac2_opts, &fs_epin_desc, USB_SPEED_FULL,
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1131 true);
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1132 if (ret < 0) {
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1133 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1134 return ret;
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1135 }
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1136
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1137 ret = set_ep_max_packet_size(uac2_opts, &fs_epout_desc, USB_SPEED_FULL,
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1138 false);
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1139 if (ret < 0) {
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1140 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1141 return ret;
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1142 }
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1143
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1144 ret = set_ep_max_packet_size(uac2_opts, &hs_epin_desc, USB_SPEED_HIGH,
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1145 true);
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1146 if (ret < 0) {
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1147 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1148 return ret;
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1149 }
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1150
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1151 ret = set_ep_max_packet_size(uac2_opts, &hs_epout_desc, USB_SPEED_HIGH,
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1152 false);
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1153 if (ret < 0) {
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1154 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1155 return ret;
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1156 }
0db56e43359c47f drivers/usb/gadget/function/f_uac2.c Sekhar Nori 2017-05-17 1157
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1158 ret = set_ep_max_packet_size(uac2_opts, &ss_epin_desc, USB_SPEED_SUPER,
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1159 true);
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1160 if (ret < 0) {
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1161 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1162 return ret;
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1163 }
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1164
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1165 ret = set_ep_max_packet_size(uac2_opts, &ss_epout_desc, USB_SPEED_SUPER,
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1166 false);
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1167 if (ret < 0) {
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1168 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1169 return ret;
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1170 }
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1171
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1172 if (EPOUT_EN(uac2_opts)) {
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1173 agdev->out_ep = usb_ep_autoconfig(gadget, &fs_epout_desc);
391aa852a372308 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1174 if (!agdev->out_ep) {
a8147dabe56f7e7 drivers/usb/gadget/function/f_uac2.c Daniel Mack 2014-08-27 1175 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1176 ret = -ENODEV;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1177 goto err_free_fu;
391aa852a372308 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1178 }
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1179 if (EPOUT_FBACK_IN_EN(uac2_opts)) {
24f779dac8f3efb drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1180 agdev->in_ep_fback = usb_ep_autoconfig(gadget,
24f779dac8f3efb drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1181 &fs_epin_fback_desc);
24f779dac8f3efb drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1182 if (!agdev->in_ep_fback) {
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1183 dev_err(dev, "%s:%d Error!\n",
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1184 __func__, __LINE__);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1185 ret = -ENODEV;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1186 goto err_free_fu;
24f779dac8f3efb drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1187 }
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1188 }
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1189 }
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1190
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1191 if (EPIN_EN(uac2_opts)) {
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1192 agdev->in_ep = usb_ep_autoconfig(gadget, &fs_epin_desc);
391aa852a372308 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1193 if (!agdev->in_ep) {
a8147dabe56f7e7 drivers/usb/gadget/function/f_uac2.c Daniel Mack 2014-08-27 1194 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1195 ret = -ENODEV;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1196 goto err_free_fu;
391aa852a372308 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1197 }
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1198 }
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1199
14e1d56cbea6c02 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-25 1200 agdev->in_ep_maxpsize = max_t(u16,
14e1d56cbea6c02 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-25 1201 le16_to_cpu(fs_epin_desc.wMaxPacketSize),
14e1d56cbea6c02 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-25 1202 le16_to_cpu(hs_epin_desc.wMaxPacketSize));
14e1d56cbea6c02 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-25 1203 agdev->out_ep_maxpsize = max_t(u16,
14e1d56cbea6c02 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-25 1204 le16_to_cpu(fs_epout_desc.wMaxPacketSize),
14e1d56cbea6c02 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-25 1205 le16_to_cpu(hs_epout_desc.wMaxPacketSize));
eb127cb519d73c0 drivers/usb/gadget/f_uac2.c Jassi Brar 2013-05-30 1206
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1207 agdev->in_ep_maxpsize = max_t(u16, agdev->in_ep_maxpsize,
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1208 le16_to_cpu(ss_epin_desc.wMaxPacketSize));
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1209 agdev->out_ep_maxpsize = max_t(u16, agdev->out_ep_maxpsize,
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1210 le16_to_cpu(ss_epout_desc.wMaxPacketSize));
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1211
f0e8a206a2a53a9 drivers/usb/gadget/function/f_uac2.c Jack Pham 2021-09-09 1212 ss_epin_desc_comp.wBytesPerInterval = ss_epin_desc.wMaxPacketSize;
f0e8a206a2a53a9 drivers/usb/gadget/function/f_uac2.c Jack Pham 2021-09-09 1213 ss_epout_desc_comp.wBytesPerInterval = ss_epout_desc.wMaxPacketSize;
f0e8a206a2a53a9 drivers/usb/gadget/function/f_uac2.c Jack Pham 2021-09-09 1214
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1215 // HS and SS endpoint addresses are copied from autoconfigured FS descriptors
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1216 hs_ep_int_desc.bEndpointAddress = fs_ep_int_desc.bEndpointAddress;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1217 hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress;
24f779dac8f3efb drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1218 hs_epin_fback_desc.bEndpointAddress = fs_epin_fback_desc.bEndpointAddress;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1219 hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress;
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1220 ss_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress;
24f779dac8f3efb drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1221 ss_epin_fback_desc.bEndpointAddress = fs_epin_fback_desc.bEndpointAddress;
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1222 ss_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1223 ss_ep_int_desc.bEndpointAddress = fs_ep_int_desc.bEndpointAddress;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1224
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1225 setup_descriptor(uac2_opts);
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1226
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1227 ret = usb_assign_descriptors(fn, fs_audio_desc, hs_audio_desc, ss_audio_desc,
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1228 ss_audio_desc);
10287baec761d33 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1229 if (ret)
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1230 goto err_free_fu;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1231
7158b57a495635c drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1232 agdev->gadget = gadget;
7158b57a495635c drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1233
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1234 agdev->params.p_chmask = uac2_opts->p_chmask;
919a88c00fb3ce7 drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1235 memcpy(agdev->params.p_srates, uac2_opts->p_srates,
919a88c00fb3ce7 drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1236 sizeof(agdev->params.p_srates));
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1237 agdev->params.p_ssize = uac2_opts->p_ssize;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1238 if (FUIN_EN(uac2_opts)) {
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1239 agdev->params.p_fu.id = USB_IN_FU_ID;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1240 agdev->params.p_fu.mute_present = uac2_opts->p_mute_present;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1241 agdev->params.p_fu.volume_present = uac2_opts->p_volume_present;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1242 agdev->params.p_fu.volume_min = uac2_opts->p_volume_min;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1243 agdev->params.p_fu.volume_max = uac2_opts->p_volume_max;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1244 agdev->params.p_fu.volume_res = uac2_opts->p_volume_res;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1245 }
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1246 agdev->params.c_chmask = uac2_opts->c_chmask;
919a88c00fb3ce7 drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1247 memcpy(agdev->params.c_srates, uac2_opts->c_srates,
919a88c00fb3ce7 drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1248 sizeof(agdev->params.c_srates));
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1249 agdev->params.c_ssize = uac2_opts->c_ssize;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1250 if (FUOUT_EN(uac2_opts)) {
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1251 agdev->params.c_fu.id = USB_OUT_FU_ID;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1252 agdev->params.c_fu.mute_present = uac2_opts->c_mute_present;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1253 agdev->params.c_fu.volume_present = uac2_opts->c_volume_present;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1254 agdev->params.c_fu.volume_min = uac2_opts->c_volume_min;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1255 agdev->params.c_fu.volume_max = uac2_opts->c_volume_max;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1256 agdev->params.c_fu.volume_res = uac2_opts->c_volume_res;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1257 }
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1258 agdev->params.req_number = uac2_opts->req_number;
e89bb4288378b85 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1259 agdev->params.fb_max = uac2_opts->fb_max;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1260
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1261 if (FUOUT_EN(uac2_opts) || FUIN_EN(uac2_opts))
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1262 agdev->notify = afunc_notify;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1263
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1264 ret = g_audio_setup(agdev, "UAC2 PCM", "UAC2_Gadget");
391aa852a372308 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1265 if (ret)
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1266 goto err_free_descs;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1267
391aa852a372308 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1268 return 0;
d12a8727171c770 drivers/usb/gadget/function/f_uac2.c Pavitrakumar Managutte 2014-10-22 1269
f1d3861d63a5d79 drivers/usb/gadget/function/f_uac2.c Peter Chen 2016-11-08 1270 err_free_descs:
f1d3861d63a5d79 drivers/usb/gadget/function/f_uac2.c Peter Chen 2016-11-08 1271 usb_free_all_descriptors(fn);
7158b57a495635c drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1272 agdev->gadget = NULL;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1273 err_free_fu:
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1274 kfree(out_feature_unit_desc);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1275 out_feature_unit_desc = NULL;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1276 kfree(in_feature_unit_desc);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1277 in_feature_unit_desc = NULL;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1278 return ret;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1279 }
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1280
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3 06/11] usb: gadget: f_uac2: Rename Clock Sources to fixed names
@ 2022-01-09 17:40 ` kernel test robot
0 siblings, 0 replies; 15+ messages in thread
From: kernel test robot @ 2022-01-09 17:40 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 42863 bytes --]
Hi Pavel,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on usb/usb-testing]
[cannot apply to linus/master balbi-usb/testing/next peter-chen-usb/for-usb-next v5.16-rc8 next-20220107]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Pavel-Hofman/usb-gadget-audio-Multiple-rates-notify/20220109-200125
base: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
config: x86_64-randconfig-a015-20220109 (https://download.01.org/0day-ci/archive/20220110/202201100122.8amhCftR-lkp(a)intel.com/config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project f3a344d2125fa37e59bae1b0874442c650a19607)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/4c4a7d32bcd7aa57e015597497c80ead346c7385
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Pavel-Hofman/usb-gadget-audio-Multiple-rates-notify/20220109-200125
git checkout 4c4a7d32bcd7aa57e015597497c80ead346c7385
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash drivers/usb/gadget/function/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> drivers/usb/gadget/function/f_uac2.c:981:20: warning: variable 'init_c_srate' set but not used [-Wunused-but-set-variable]
int init_p_srate, init_c_srate;
^
>> drivers/usb/gadget/function/f_uac2.c:981:6: warning: variable 'init_p_srate' set but not used [-Wunused-but-set-variable]
int init_p_srate, init_c_srate;
^
2 warnings generated.
vim +/init_c_srate +981 drivers/usb/gadget/function/f_uac2.c
3713d5ceb04d5ab drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-03-01 969
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 970 static int
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 971 afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 972 {
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 973 struct f_uac2 *uac2 = func_to_uac2(fn);
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 974 struct g_audio *agdev = func_to_g_audio(fn);
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 975 struct usb_composite_dev *cdev = cfg->cdev;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 976 struct usb_gadget *gadget = cdev->gadget;
7158b57a495635c drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 977 struct device *dev = &gadget->dev;
3713d5ceb04d5ab drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-03-01 978 struct f_uac2_opts *uac2_opts = g_audio_to_uac2_opts(agdev);
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 979 struct usb_string *us;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 980 int ret;
919a88c00fb3ce7 drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 @981 int init_p_srate, init_c_srate;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 982
3713d5ceb04d5ab drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-03-01 983 ret = afunc_validate_opts(agdev, dev);
3713d5ceb04d5ab drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-03-01 984 if (ret)
3713d5ceb04d5ab drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-03-01 985 return ret;
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 986
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 987 us = usb_gstrings_attach(cdev, fn_strings, ARRAY_SIZE(strings_fn));
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 988 if (IS_ERR(us))
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 989 return PTR_ERR(us);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 990
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 991 if (FUOUT_EN(uac2_opts)) {
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 992 out_feature_unit_desc = build_fu_desc(uac2_opts->c_chmask);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 993 if (!out_feature_unit_desc)
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 994 return -ENOMEM;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 995 }
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 996 if (FUIN_EN(uac2_opts)) {
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 997 in_feature_unit_desc = build_fu_desc(uac2_opts->p_chmask);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 998 if (!in_feature_unit_desc) {
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 999 ret = -ENOMEM;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1000 goto err_free_fu;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1001 }
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1002 }
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1003
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1004 iad_desc.iFunction = us[STR_ASSOC].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1005 std_ac_if_desc.iInterface = us[STR_IF_CTRL].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1006 in_clk_src_desc.iClockSource = us[STR_CLKSRC_IN].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1007 out_clk_src_desc.iClockSource = us[STR_CLKSRC_OUT].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1008 usb_out_it_desc.iTerminal = us[STR_USB_IT].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1009 io_in_it_desc.iTerminal = us[STR_IO_IT].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1010 usb_in_ot_desc.iTerminal = us[STR_USB_OT].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1011 io_out_ot_desc.iTerminal = us[STR_IO_OT].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1012 std_as_out_if0_desc.iInterface = us[STR_AS_OUT_ALT0].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1013 std_as_out_if1_desc.iInterface = us[STR_AS_OUT_ALT1].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1014 std_as_in_if0_desc.iInterface = us[STR_AS_IN_ALT0].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1015 std_as_in_if1_desc.iInterface = us[STR_AS_IN_ALT1].id;
f408757f819a579 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1016
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1017 if (FUOUT_EN(uac2_opts)) {
59e477af7b1a2a0 drivers/usb/gadget/function/f_uac2.c Colin Ian King 2021-08-04 1018 u8 *i_feature = (u8 *)out_feature_unit_desc +
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1019 out_feature_unit_desc->bLength - 1;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1020 *i_feature = us[STR_FU_OUT].id;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1021 }
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1022 if (FUIN_EN(uac2_opts)) {
59e477af7b1a2a0 drivers/usb/gadget/function/f_uac2.c Colin Ian King 2021-08-04 1023 u8 *i_feature = (u8 *)in_feature_unit_desc +
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1024 in_feature_unit_desc->bLength - 1;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1025 *i_feature = us[STR_FU_IN].id;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1026 }
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1027
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1028
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1029 /* Initialize the configurable parameters */
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1030 usb_out_it_desc.bNrChannels = num_channels(uac2_opts->c_chmask);
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1031 usb_out_it_desc.bmChannelConfig = cpu_to_le32(uac2_opts->c_chmask);
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1032 io_in_it_desc.bNrChannels = num_channels(uac2_opts->p_chmask);
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1033 io_in_it_desc.bmChannelConfig = cpu_to_le32(uac2_opts->p_chmask);
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1034 as_out_hdr_desc.bNrChannels = num_channels(uac2_opts->c_chmask);
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1035 as_out_hdr_desc.bmChannelConfig = cpu_to_le32(uac2_opts->c_chmask);
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1036 as_in_hdr_desc.bNrChannels = num_channels(uac2_opts->p_chmask);
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1037 as_in_hdr_desc.bmChannelConfig = cpu_to_le32(uac2_opts->p_chmask);
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1038 as_out_fmt1_desc.bSubslotSize = uac2_opts->c_ssize;
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1039 as_out_fmt1_desc.bBitResolution = uac2_opts->c_ssize * 8;
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1040 as_in_fmt1_desc.bSubslotSize = uac2_opts->p_ssize;
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1041 as_in_fmt1_desc.bBitResolution = uac2_opts->p_ssize * 8;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1042 if (FUOUT_EN(uac2_opts)) {
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1043 __le32 *bma = (__le32 *)&out_feature_unit_desc->bmaControls[0];
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1044 u32 control = 0;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1045
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1046 if (uac2_opts->c_mute_present)
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1047 control |= CONTROL_RDWR << FU_MUTE_CTRL;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1048 if (uac2_opts->c_volume_present)
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1049 control |= CONTROL_RDWR << FU_VOL_CTRL;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1050 *bma = cpu_to_le32(control);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1051 }
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1052 if (FUIN_EN(uac2_opts)) {
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1053 __le32 *bma = (__le32 *)&in_feature_unit_desc->bmaControls[0];
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1054 u32 control = 0;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1055
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1056 if (uac2_opts->p_mute_present)
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1057 control |= CONTROL_RDWR << FU_MUTE_CTRL;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1058 if (uac2_opts->p_volume_present)
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1059 control |= CONTROL_RDWR << FU_VOL_CTRL;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1060 *bma = cpu_to_le32(control);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1061 }
f8f93d244afad80 drivers/usb/gadget/function/f_uac2.c Andrzej Pietrasiewicz 2014-07-22 1062
919a88c00fb3ce7 drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1063 init_p_srate = uac2_opts->p_srates[0];
919a88c00fb3ce7 drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1064 init_c_srate = uac2_opts->c_srates[0];
919a88c00fb3ce7 drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1065
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1066 ret = usb_interface_id(cfg, fn);
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1067 if (ret < 0) {
a8147dabe56f7e7 drivers/usb/gadget/function/f_uac2.c Daniel Mack 2014-08-27 1068 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1069 goto err_free_fu;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1070 }
8813a59ed892305 drivers/usb/gadget/function/f_uac2.c John Keeping 2018-01-12 1071 iad_desc.bFirstInterface = ret;
8813a59ed892305 drivers/usb/gadget/function/f_uac2.c John Keeping 2018-01-12 1072
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1073 std_ac_if_desc.bInterfaceNumber = ret;
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1074 uac2->ac_intf = ret;
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1075 uac2->ac_alt = 0;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1076
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1077 if (EPOUT_EN(uac2_opts)) {
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1078 ret = usb_interface_id(cfg, fn);
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1079 if (ret < 0) {
a8147dabe56f7e7 drivers/usb/gadget/function/f_uac2.c Daniel Mack 2014-08-27 1080 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1081 goto err_free_fu;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1082 }
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1083 std_as_out_if0_desc.bInterfaceNumber = ret;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1084 std_as_out_if1_desc.bInterfaceNumber = ret;
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1085 uac2->as_out_intf = ret;
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1086 uac2->as_out_alt = 0;
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1087
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1088 if (EPOUT_FBACK_IN_EN(uac2_opts)) {
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1089 fs_epout_desc.bmAttributes =
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1090 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC;
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1091 hs_epout_desc.bmAttributes =
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1092 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC;
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1093 ss_epout_desc.bmAttributes =
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1094 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC;
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1095 std_as_out_if1_desc.bNumEndpoints++;
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1096 } else {
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1097 fs_epout_desc.bmAttributes =
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1098 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ADAPTIVE;
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1099 hs_epout_desc.bmAttributes =
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1100 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ADAPTIVE;
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1101 ss_epout_desc.bmAttributes =
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1102 USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ADAPTIVE;
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1103 }
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1104 }
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1105
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1106 if (EPIN_EN(uac2_opts)) {
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1107 ret = usb_interface_id(cfg, fn);
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1108 if (ret < 0) {
a8147dabe56f7e7 drivers/usb/gadget/function/f_uac2.c Daniel Mack 2014-08-27 1109 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1110 goto err_free_fu;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1111 }
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1112 std_as_in_if0_desc.bInterfaceNumber = ret;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1113 std_as_in_if1_desc.bInterfaceNumber = ret;
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1114 uac2->as_in_intf = ret;
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1115 uac2->as_in_alt = 0;
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1116 }
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1117
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1118 if (FUOUT_EN(uac2_opts) || FUIN_EN(uac2_opts)) {
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1119 uac2->int_ep = usb_ep_autoconfig(gadget, &fs_ep_int_desc);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1120 if (!uac2->int_ep) {
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1121 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1122 ret = -ENODEV;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1123 goto err_free_fu;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1124 }
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1125
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1126 std_ac_if_desc.bNumEndpoints = 1;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1127 }
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1128
0db56e43359c47f drivers/usb/gadget/function/f_uac2.c Sekhar Nori 2017-05-17 1129 /* Calculate wMaxPacketSize according to audio bandwidth */
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1130 ret = set_ep_max_packet_size(uac2_opts, &fs_epin_desc, USB_SPEED_FULL,
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1131 true);
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1132 if (ret < 0) {
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1133 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1134 return ret;
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1135 }
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1136
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1137 ret = set_ep_max_packet_size(uac2_opts, &fs_epout_desc, USB_SPEED_FULL,
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1138 false);
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1139 if (ret < 0) {
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1140 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1141 return ret;
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1142 }
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1143
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1144 ret = set_ep_max_packet_size(uac2_opts, &hs_epin_desc, USB_SPEED_HIGH,
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1145 true);
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1146 if (ret < 0) {
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1147 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1148 return ret;
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1149 }
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1150
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1151 ret = set_ep_max_packet_size(uac2_opts, &hs_epout_desc, USB_SPEED_HIGH,
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1152 false);
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1153 if (ret < 0) {
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1154 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1155 return ret;
9389044f27081d6 drivers/usb/gadget/function/f_uac2.c Jerome Brunet 2020-12-21 1156 }
0db56e43359c47f drivers/usb/gadget/function/f_uac2.c Sekhar Nori 2017-05-17 1157
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1158 ret = set_ep_max_packet_size(uac2_opts, &ss_epin_desc, USB_SPEED_SUPER,
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1159 true);
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1160 if (ret < 0) {
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1161 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1162 return ret;
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1163 }
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1164
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1165 ret = set_ep_max_packet_size(uac2_opts, &ss_epout_desc, USB_SPEED_SUPER,
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1166 false);
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1167 if (ret < 0) {
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1168 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1169 return ret;
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1170 }
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1171
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1172 if (EPOUT_EN(uac2_opts)) {
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1173 agdev->out_ep = usb_ep_autoconfig(gadget, &fs_epout_desc);
391aa852a372308 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1174 if (!agdev->out_ep) {
a8147dabe56f7e7 drivers/usb/gadget/function/f_uac2.c Daniel Mack 2014-08-27 1175 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1176 ret = -ENODEV;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1177 goto err_free_fu;
391aa852a372308 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1178 }
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1179 if (EPOUT_FBACK_IN_EN(uac2_opts)) {
24f779dac8f3efb drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1180 agdev->in_ep_fback = usb_ep_autoconfig(gadget,
24f779dac8f3efb drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1181 &fs_epin_fback_desc);
24f779dac8f3efb drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1182 if (!agdev->in_ep_fback) {
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1183 dev_err(dev, "%s:%d Error!\n",
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1184 __func__, __LINE__);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1185 ret = -ENODEV;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1186 goto err_free_fu;
24f779dac8f3efb drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1187 }
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1188 }
40c73b30546e759 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1189 }
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1190
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1191 if (EPIN_EN(uac2_opts)) {
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1192 agdev->in_ep = usb_ep_autoconfig(gadget, &fs_epin_desc);
391aa852a372308 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1193 if (!agdev->in_ep) {
a8147dabe56f7e7 drivers/usb/gadget/function/f_uac2.c Daniel Mack 2014-08-27 1194 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1195 ret = -ENODEV;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1196 goto err_free_fu;
391aa852a372308 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1197 }
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1198 }
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1199
14e1d56cbea6c02 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-25 1200 agdev->in_ep_maxpsize = max_t(u16,
14e1d56cbea6c02 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-25 1201 le16_to_cpu(fs_epin_desc.wMaxPacketSize),
14e1d56cbea6c02 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-25 1202 le16_to_cpu(hs_epin_desc.wMaxPacketSize));
14e1d56cbea6c02 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-25 1203 agdev->out_ep_maxpsize = max_t(u16,
14e1d56cbea6c02 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-25 1204 le16_to_cpu(fs_epout_desc.wMaxPacketSize),
14e1d56cbea6c02 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-25 1205 le16_to_cpu(hs_epout_desc.wMaxPacketSize));
eb127cb519d73c0 drivers/usb/gadget/f_uac2.c Jassi Brar 2013-05-30 1206
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1207 agdev->in_ep_maxpsize = max_t(u16, agdev->in_ep_maxpsize,
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1208 le16_to_cpu(ss_epin_desc.wMaxPacketSize));
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1209 agdev->out_ep_maxpsize = max_t(u16, agdev->out_ep_maxpsize,
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1210 le16_to_cpu(ss_epout_desc.wMaxPacketSize));
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1211
f0e8a206a2a53a9 drivers/usb/gadget/function/f_uac2.c Jack Pham 2021-09-09 1212 ss_epin_desc_comp.wBytesPerInterval = ss_epin_desc.wMaxPacketSize;
f0e8a206a2a53a9 drivers/usb/gadget/function/f_uac2.c Jack Pham 2021-09-09 1213 ss_epout_desc_comp.wBytesPerInterval = ss_epout_desc.wMaxPacketSize;
f0e8a206a2a53a9 drivers/usb/gadget/function/f_uac2.c Jack Pham 2021-09-09 1214
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1215 // HS and SS endpoint addresses are copied from autoconfigured FS descriptors
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1216 hs_ep_int_desc.bEndpointAddress = fs_ep_int_desc.bEndpointAddress;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1217 hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress;
24f779dac8f3efb drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1218 hs_epin_fback_desc.bEndpointAddress = fs_epin_fback_desc.bEndpointAddress;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1219 hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress;
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1220 ss_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress;
24f779dac8f3efb drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1221 ss_epin_fback_desc.bEndpointAddress = fs_epin_fback_desc.bEndpointAddress;
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1222 ss_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1223 ss_ep_int_desc.bEndpointAddress = fs_ep_int_desc.bEndpointAddress;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1224
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1225 setup_descriptor(uac2_opts);
3fa4eaa6c08206b drivers/usb/gadget/function/f_uac2.c Andreas Pape 2018-06-21 1226
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1227 ret = usb_assign_descriptors(fn, fs_audio_desc, hs_audio_desc, ss_audio_desc,
f8cb3d556be31d2 drivers/usb/gadget/function/f_uac2.c Pawel Laszczak 2021-03-10 1228 ss_audio_desc);
10287baec761d33 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1229 if (ret)
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1230 goto err_free_fu;
132fcb460839a87 drivers/usb/gadget/f_uac2.c Jassi Brar 2012-02-02 1231
7158b57a495635c drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1232 agdev->gadget = gadget;
7158b57a495635c drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1233
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1234 agdev->params.p_chmask = uac2_opts->p_chmask;
919a88c00fb3ce7 drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1235 memcpy(agdev->params.p_srates, uac2_opts->p_srates,
919a88c00fb3ce7 drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1236 sizeof(agdev->params.p_srates));
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1237 agdev->params.p_ssize = uac2_opts->p_ssize;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1238 if (FUIN_EN(uac2_opts)) {
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1239 agdev->params.p_fu.id = USB_IN_FU_ID;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1240 agdev->params.p_fu.mute_present = uac2_opts->p_mute_present;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1241 agdev->params.p_fu.volume_present = uac2_opts->p_volume_present;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1242 agdev->params.p_fu.volume_min = uac2_opts->p_volume_min;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1243 agdev->params.p_fu.volume_max = uac2_opts->p_volume_max;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1244 agdev->params.p_fu.volume_res = uac2_opts->p_volume_res;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1245 }
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1246 agdev->params.c_chmask = uac2_opts->c_chmask;
919a88c00fb3ce7 drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1247 memcpy(agdev->params.c_srates, uac2_opts->c_srates,
919a88c00fb3ce7 drivers/usb/gadget/function/f_uac2.c Julian Scheel 2022-01-09 1248 sizeof(agdev->params.c_srates));
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1249 agdev->params.c_ssize = uac2_opts->c_ssize;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1250 if (FUOUT_EN(uac2_opts)) {
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1251 agdev->params.c_fu.id = USB_OUT_FU_ID;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1252 agdev->params.c_fu.mute_present = uac2_opts->c_mute_present;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1253 agdev->params.c_fu.volume_present = uac2_opts->c_volume_present;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1254 agdev->params.c_fu.volume_min = uac2_opts->c_volume_min;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1255 agdev->params.c_fu.volume_max = uac2_opts->c_volume_max;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1256 agdev->params.c_fu.volume_res = uac2_opts->c_volume_res;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1257 }
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1258 agdev->params.req_number = uac2_opts->req_number;
e89bb4288378b85 drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-06-04 1259 agdev->params.fb_max = uac2_opts->fb_max;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1260
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1261 if (FUOUT_EN(uac2_opts) || FUIN_EN(uac2_opts))
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1262 agdev->notify = afunc_notify;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1263
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1264 ret = g_audio_setup(agdev, "UAC2 PCM", "UAC2_Gadget");
391aa852a372308 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1265 if (ret)
eb9fecb9e69b0be drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1266 goto err_free_descs;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1267
391aa852a372308 drivers/usb/gadget/f_uac2.c Sebastian Andrzej Siewior 2012-10-22 1268 return 0;
d12a8727171c770 drivers/usb/gadget/function/f_uac2.c Pavitrakumar Managutte 2014-10-22 1269
f1d3861d63a5d79 drivers/usb/gadget/function/f_uac2.c Peter Chen 2016-11-08 1270 err_free_descs:
f1d3861d63a5d79 drivers/usb/gadget/function/f_uac2.c Peter Chen 2016-11-08 1271 usb_free_all_descriptors(fn);
7158b57a495635c drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2017-06-18 1272 agdev->gadget = NULL;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1273 err_free_fu:
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1274 kfree(out_feature_unit_desc);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1275 out_feature_unit_desc = NULL;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1276 kfree(in_feature_unit_desc);
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1277 in_feature_unit_desc = NULL;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1278 return ret;
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1279 }
eaf6cbe0992052a drivers/usb/gadget/function/f_uac2.c Ruslan Bilovol 2021-07-12 1280
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2022-01-09 17:40 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-01-09 11:59 [PATCH v3 00/11] usb: gadget: audio: Multiple rates, notify Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 01/11] usb: gadget:audio: Replace deprecated macro S_IRUGO Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 02/11] usb: gadget: u_audio: Support multiple sampling rates Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 03/11] usb: gadget: u_audio: Move dynamic srate from params to rtd Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 04/11] usb: gadget: u_audio: Add capture/playback srate getter Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 05/11] usb: gadget: f_uac2: Support multiple sampling rates Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 06/11] usb: gadget: f_uac2: Rename Clock Sources to fixed names Pavel Hofman
2022-01-09 14:08 ` kernel test robot
2022-01-09 17:40 ` kernel test robot
2022-01-09 17:40 ` kernel test robot
2022-01-09 11:59 ` [PATCH v3 07/11] usb: gadget: f_uac1: Support multiple sampling rates Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 08/11] usb: gadget: u_audio: Rate ctl notifies about current srate (0=stopped) Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 09/11] usb: gadget: u_audio: Add suspend call Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 10/11] usb: gadget: f_uac2: Add suspend callback Pavel Hofman
2022-01-09 11:59 ` [PATCH v3 11/11] usb: gadget: f_uac1: " Pavel Hofman
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.