~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/sound/usb/stream.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /sound/usb/stream.c (Version linux-6.12-rc7) and /sound/usb/stream.c (Version linux-4.12.14)


  1 // SPDX-License-Identifier: GPL-2.0-or-later   << 
  2 /*                                                  1 /*
                                                   >>   2  *   This program is free software; you can redistribute it and/or modify
                                                   >>   3  *   it under the terms of the GNU General Public License as published by
                                                   >>   4  *   the Free Software Foundation; either version 2 of the License, or
                                                   >>   5  *   (at your option) any later version.
                                                   >>   6  *
                                                   >>   7  *   This program is distributed in the hope that it will be useful,
                                                   >>   8  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
                                                   >>   9  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                                                   >>  10  *   GNU General Public License for more details.
                                                   >>  11  *
                                                   >>  12  *   You should have received a copy of the GNU General Public License
                                                   >>  13  *   along with this program; if not, write to the Free Software
                                                   >>  14  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  3  */                                                15  */
  4                                                    16 
  5                                                    17 
  6 #include <linux/init.h>                            18 #include <linux/init.h>
  7 #include <linux/slab.h>                            19 #include <linux/slab.h>
  8 #include <linux/usb.h>                             20 #include <linux/usb.h>
  9 #include <linux/usb/audio.h>                       21 #include <linux/usb/audio.h>
 10 #include <linux/usb/audio-v2.h>                    22 #include <linux/usb/audio-v2.h>
 11 #include <linux/usb/audio-v3.h>                << 
 12                                                    23 
 13 #include <sound/core.h>                            24 #include <sound/core.h>
 14 #include <sound/pcm.h>                             25 #include <sound/pcm.h>
 15 #include <sound/control.h>                         26 #include <sound/control.h>
 16 #include <sound/tlv.h>                             27 #include <sound/tlv.h>
 17                                                    28 
 18 #include "usbaudio.h"                              29 #include "usbaudio.h"
 19 #include "card.h"                                  30 #include "card.h"
 20 #include "proc.h"                                  31 #include "proc.h"
 21 #include "quirks.h"                                32 #include "quirks.h"
 22 #include "endpoint.h"                              33 #include "endpoint.h"
 23 #include "pcm.h"                                   34 #include "pcm.h"
 24 #include "helper.h"                                35 #include "helper.h"
 25 #include "format.h"                                36 #include "format.h"
 26 #include "clock.h"                                 37 #include "clock.h"
 27 #include "stream.h"                                38 #include "stream.h"
 28 #include "power.h"                             << 
 29 #include "media.h"                             << 
 30                                                << 
 31 static void audioformat_free(struct audioforma << 
 32 {                                              << 
 33         list_del(&fp->list); /* unlink for avo << 
 34         kfree(fp->rate_table);                 << 
 35         kfree(fp->chmap);                      << 
 36         kfree(fp);                             << 
 37 }                                              << 
 38                                                    39 
 39 /*                                                 40 /*
 40  * free a substream                                41  * free a substream
 41  */                                                42  */
 42 static void free_substream(struct snd_usb_subs     43 static void free_substream(struct snd_usb_substream *subs)
 43 {                                                  44 {
 44         struct audioformat *fp, *n;                45         struct audioformat *fp, *n;
 45                                                    46 
 46         if (!subs->num_formats)                    47         if (!subs->num_formats)
 47                 return; /* not initialized */      48                 return; /* not initialized */
 48         list_for_each_entry_safe(fp, n, &subs- !!  49         list_for_each_entry_safe(fp, n, &subs->fmt_list, list) {
 49                 audioformat_free(fp);          !!  50                 kfree(fp->rate_table);
 50         kfree(subs->str_pd);                   !!  51                 kfree(fp->chmap);
 51         snd_media_stream_delete(subs);         !!  52                 kfree(fp);
                                                   >>  53         }
                                                   >>  54         kfree(subs->rate_list.list);
 52 }                                                  55 }
 53                                                    56 
 54                                                    57 
 55 /*                                                 58 /*
 56  * free a usb stream instance                      59  * free a usb stream instance
 57  */                                                60  */
 58 static void snd_usb_audio_stream_free(struct s     61 static void snd_usb_audio_stream_free(struct snd_usb_stream *stream)
 59 {                                                  62 {
 60         free_substream(&stream->substream[0]);     63         free_substream(&stream->substream[0]);
 61         free_substream(&stream->substream[1]);     64         free_substream(&stream->substream[1]);
 62         list_del(&stream->list);                   65         list_del(&stream->list);
 63         kfree(stream);                             66         kfree(stream);
 64 }                                                  67 }
 65                                                    68 
 66 static void snd_usb_audio_pcm_free(struct snd_     69 static void snd_usb_audio_pcm_free(struct snd_pcm *pcm)
 67 {                                                  70 {
 68         struct snd_usb_stream *stream = pcm->p     71         struct snd_usb_stream *stream = pcm->private_data;
 69         if (stream) {                              72         if (stream) {
 70                 stream->pcm = NULL;                73                 stream->pcm = NULL;
 71                 snd_usb_audio_stream_free(stre     74                 snd_usb_audio_stream_free(stream);
 72         }                                          75         }
 73 }                                                  76 }
 74                                                    77 
 75 /*                                                 78 /*
 76  * initialize the substream instance.              79  * initialize the substream instance.
 77  */                                                80  */
 78                                                    81 
 79 static void snd_usb_init_substream(struct snd_     82 static void snd_usb_init_substream(struct snd_usb_stream *as,
 80                                    int stream,     83                                    int stream,
 81                                    struct audi !!  84                                    struct audioformat *fp)
 82                                    struct snd_ << 
 83 {                                                  85 {
 84         struct snd_usb_substream *subs = &as->     86         struct snd_usb_substream *subs = &as->substream[stream];
 85                                                    87 
 86         INIT_LIST_HEAD(&subs->fmt_list);           88         INIT_LIST_HEAD(&subs->fmt_list);
 87         spin_lock_init(&subs->lock);               89         spin_lock_init(&subs->lock);
 88                                                    90 
 89         subs->stream = as;                         91         subs->stream = as;
 90         subs->direction = stream;                  92         subs->direction = stream;
 91         subs->dev = as->chip->dev;                 93         subs->dev = as->chip->dev;
 92         subs->txfr_quirk = !!(as->chip->quirk_ !!  94         subs->txfr_quirk = as->chip->txfr_quirk;
 93         subs->tx_length_quirk = !!(as->chip->q !!  95         subs->tx_length_quirk = as->chip->tx_length_quirk;
 94         subs->speed = snd_usb_get_speed(subs->     96         subs->speed = snd_usb_get_speed(subs->dev);
 95         subs->pkt_offset_adj = 0;                  97         subs->pkt_offset_adj = 0;
 96         subs->stream_offset_adj = 0;           << 
 97                                                    98 
 98         snd_usb_set_pcm_ops(as->pcm, stream);      99         snd_usb_set_pcm_ops(as->pcm, stream);
 99                                                   100 
100         list_add_tail(&fp->list, &subs->fmt_li    101         list_add_tail(&fp->list, &subs->fmt_list);
101         subs->formats |= fp->formats;             102         subs->formats |= fp->formats;
102         subs->num_formats++;                      103         subs->num_formats++;
103         subs->fmt_type = fp->fmt_type;            104         subs->fmt_type = fp->fmt_type;
104         subs->ep_num = fp->endpoint;              105         subs->ep_num = fp->endpoint;
105         if (fp->channels > subs->channels_max)    106         if (fp->channels > subs->channels_max)
106                 subs->channels_max = fp->chann    107                 subs->channels_max = fp->channels;
107                                                << 
108         if (pd) {                              << 
109                 subs->str_pd = pd;             << 
110                 /* Initialize Power Domain to  << 
111                 snd_usb_power_domain_set(subs- << 
112                                          UAC3_ << 
113         }                                      << 
114                                                << 
115         snd_usb_preallocate_buffer(subs);      << 
116 }                                                 108 }
117                                                   109 
118 /* kctl callbacks for usb-audio channel maps *    110 /* kctl callbacks for usb-audio channel maps */
119 static int usb_chmap_ctl_info(struct snd_kcont    111 static int usb_chmap_ctl_info(struct snd_kcontrol *kcontrol,
120                               struct snd_ctl_e    112                               struct snd_ctl_elem_info *uinfo)
121 {                                                 113 {
122         struct snd_pcm_chmap *info = snd_kcont    114         struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
123         struct snd_usb_substream *subs = info-    115         struct snd_usb_substream *subs = info->private_data;
124                                                   116 
125         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTE    117         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
126         uinfo->count = subs->channels_max;        118         uinfo->count = subs->channels_max;
127         uinfo->value.integer.min = 0;             119         uinfo->value.integer.min = 0;
128         uinfo->value.integer.max = SNDRV_CHMAP    120         uinfo->value.integer.max = SNDRV_CHMAP_LAST;
129         return 0;                                 121         return 0;
130 }                                                 122 }
131                                                   123 
132 /* check whether a duplicated entry exists in     124 /* check whether a duplicated entry exists in the audiofmt list */
133 static bool have_dup_chmap(struct snd_usb_subs    125 static bool have_dup_chmap(struct snd_usb_substream *subs,
134                            struct audioformat     126                            struct audioformat *fp)
135 {                                                 127 {
136         struct audioformat *prev = fp;            128         struct audioformat *prev = fp;
137                                                   129 
138         list_for_each_entry_continue_reverse(p    130         list_for_each_entry_continue_reverse(prev, &subs->fmt_list, list) {
139                 if (prev->chmap &&                131                 if (prev->chmap &&
140                     !memcmp(prev->chmap, fp->c    132                     !memcmp(prev->chmap, fp->chmap, sizeof(*fp->chmap)))
141                         return true;              133                         return true;
142         }                                         134         }
143         return false;                             135         return false;
144 }                                                 136 }
145                                                   137 
146 static int usb_chmap_ctl_tlv(struct snd_kcontr    138 static int usb_chmap_ctl_tlv(struct snd_kcontrol *kcontrol, int op_flag,
147                              unsigned int size    139                              unsigned int size, unsigned int __user *tlv)
148 {                                                 140 {
149         struct snd_pcm_chmap *info = snd_kcont    141         struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
150         struct snd_usb_substream *subs = info-    142         struct snd_usb_substream *subs = info->private_data;
151         struct audioformat *fp;                   143         struct audioformat *fp;
152         unsigned int __user *dst;                 144         unsigned int __user *dst;
153         int count = 0;                            145         int count = 0;
154                                                   146 
155         if (size < 8)                             147         if (size < 8)
156                 return -ENOMEM;                   148                 return -ENOMEM;
157         if (put_user(SNDRV_CTL_TLVT_CONTAINER,    149         if (put_user(SNDRV_CTL_TLVT_CONTAINER, tlv))
158                 return -EFAULT;                   150                 return -EFAULT;
159         size -= 8;                                151         size -= 8;
160         dst = tlv + 2;                            152         dst = tlv + 2;
161         list_for_each_entry(fp, &subs->fmt_lis    153         list_for_each_entry(fp, &subs->fmt_list, list) {
162                 int i, ch_bytes;                  154                 int i, ch_bytes;
163                                                   155 
164                 if (!fp->chmap)                   156                 if (!fp->chmap)
165                         continue;                 157                         continue;
166                 if (have_dup_chmap(subs, fp))     158                 if (have_dup_chmap(subs, fp))
167                         continue;                 159                         continue;
168                 /* copy the entry */              160                 /* copy the entry */
169                 ch_bytes = fp->chmap->channels    161                 ch_bytes = fp->chmap->channels * 4;
170                 if (size < 8 + ch_bytes)          162                 if (size < 8 + ch_bytes)
171                         return -ENOMEM;           163                         return -ENOMEM;
172                 if (put_user(SNDRV_CTL_TLVT_CH    164                 if (put_user(SNDRV_CTL_TLVT_CHMAP_FIXED, dst) ||
173                     put_user(ch_bytes, dst + 1    165                     put_user(ch_bytes, dst + 1))
174                         return -EFAULT;           166                         return -EFAULT;
175                 dst += 2;                         167                 dst += 2;
176                 for (i = 0; i < fp->chmap->cha    168                 for (i = 0; i < fp->chmap->channels; i++, dst++) {
177                         if (put_user(fp->chmap    169                         if (put_user(fp->chmap->map[i], dst))
178                                 return -EFAULT    170                                 return -EFAULT;
179                 }                                 171                 }
180                                                   172 
181                 count += 8 + ch_bytes;            173                 count += 8 + ch_bytes;
182                 size -= 8 + ch_bytes;             174                 size -= 8 + ch_bytes;
183         }                                         175         }
184         if (put_user(count, tlv + 1))             176         if (put_user(count, tlv + 1))
185                 return -EFAULT;                   177                 return -EFAULT;
186         return 0;                                 178         return 0;
187 }                                                 179 }
188                                                   180 
189 static int usb_chmap_ctl_get(struct snd_kcontr    181 static int usb_chmap_ctl_get(struct snd_kcontrol *kcontrol,
190                              struct snd_ctl_el    182                              struct snd_ctl_elem_value *ucontrol)
191 {                                                 183 {
192         struct snd_pcm_chmap *info = snd_kcont    184         struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
193         struct snd_usb_substream *subs = info-    185         struct snd_usb_substream *subs = info->private_data;
194         struct snd_pcm_chmap_elem *chmap = NUL    186         struct snd_pcm_chmap_elem *chmap = NULL;
195         int i = 0;                             !! 187         int i;
196                                                   188 
                                                   >> 189         memset(ucontrol->value.integer.value, 0,
                                                   >> 190                sizeof(ucontrol->value.integer.value));
197         if (subs->cur_audiofmt)                   191         if (subs->cur_audiofmt)
198                 chmap = subs->cur_audiofmt->ch    192                 chmap = subs->cur_audiofmt->chmap;
199         if (chmap) {                              193         if (chmap) {
200                 for (i = 0; i < chmap->channel    194                 for (i = 0; i < chmap->channels; i++)
201                         ucontrol->value.intege    195                         ucontrol->value.integer.value[i] = chmap->map[i];
202         }                                         196         }
203         for (; i < subs->channels_max; i++)    << 
204                 ucontrol->value.integer.value[ << 
205         return 0;                                 197         return 0;
206 }                                                 198 }
207                                                   199 
208 /* create a chmap kctl assigned to the given U    200 /* create a chmap kctl assigned to the given USB substream */
209 static int add_chmap(struct snd_pcm *pcm, int     201 static int add_chmap(struct snd_pcm *pcm, int stream,
210                      struct snd_usb_substream     202                      struct snd_usb_substream *subs)
211 {                                                 203 {
212         struct audioformat *fp;                   204         struct audioformat *fp;
213         struct snd_pcm_chmap *chmap;              205         struct snd_pcm_chmap *chmap;
214         struct snd_kcontrol *kctl;                206         struct snd_kcontrol *kctl;
215         int err;                                  207         int err;
216                                                   208 
217         list_for_each_entry(fp, &subs->fmt_lis    209         list_for_each_entry(fp, &subs->fmt_list, list)
218                 if (fp->chmap)                    210                 if (fp->chmap)
219                         goto ok;                  211                         goto ok;
220         /* no chmap is found */                   212         /* no chmap is found */
221         return 0;                                 213         return 0;
222                                                   214 
223  ok:                                              215  ok:
224         err = snd_pcm_add_chmap_ctls(pcm, stre    216         err = snd_pcm_add_chmap_ctls(pcm, stream, NULL, 0, 0, &chmap);
225         if (err < 0)                              217         if (err < 0)
226                 return err;                       218                 return err;
227                                                   219 
228         /* override handlers */                   220         /* override handlers */
229         chmap->private_data = subs;               221         chmap->private_data = subs;
230         kctl = chmap->kctl;                       222         kctl = chmap->kctl;
231         kctl->info = usb_chmap_ctl_info;          223         kctl->info = usb_chmap_ctl_info;
232         kctl->get = usb_chmap_ctl_get;            224         kctl->get = usb_chmap_ctl_get;
233         kctl->tlv.c = usb_chmap_ctl_tlv;          225         kctl->tlv.c = usb_chmap_ctl_tlv;
234                                                   226 
235         return 0;                                 227         return 0;
236 }                                                 228 }
237                                                   229 
238 /* convert from USB ChannelConfig bits to ALSA    230 /* convert from USB ChannelConfig bits to ALSA chmap element */
239 static struct snd_pcm_chmap_elem *convert_chma    231 static struct snd_pcm_chmap_elem *convert_chmap(int channels, unsigned int bits,
240                                                   232                                                 int protocol)
241 {                                                 233 {
242         static const unsigned int uac1_maps[]  !! 234         static unsigned int uac1_maps[] = {
243                 SNDRV_CHMAP_FL,         /* lef    235                 SNDRV_CHMAP_FL,         /* left front */
244                 SNDRV_CHMAP_FR,         /* rig    236                 SNDRV_CHMAP_FR,         /* right front */
245                 SNDRV_CHMAP_FC,         /* cen    237                 SNDRV_CHMAP_FC,         /* center front */
246                 SNDRV_CHMAP_LFE,        /* LFE    238                 SNDRV_CHMAP_LFE,        /* LFE */
247                 SNDRV_CHMAP_RL,         /* lef !! 239                 SNDRV_CHMAP_SL,         /* left surround */
248                 SNDRV_CHMAP_RR,         /* rig !! 240                 SNDRV_CHMAP_SR,         /* right surround */
249                 SNDRV_CHMAP_FLC,        /* lef    241                 SNDRV_CHMAP_FLC,        /* left of center */
250                 SNDRV_CHMAP_FRC,        /* rig    242                 SNDRV_CHMAP_FRC,        /* right of center */
251                 SNDRV_CHMAP_RC,         /* sur    243                 SNDRV_CHMAP_RC,         /* surround */
252                 SNDRV_CHMAP_SL,         /* sid    244                 SNDRV_CHMAP_SL,         /* side left */
253                 SNDRV_CHMAP_SR,         /* sid    245                 SNDRV_CHMAP_SR,         /* side right */
254                 SNDRV_CHMAP_TC,         /* top    246                 SNDRV_CHMAP_TC,         /* top */
255                 0 /* terminator */                247                 0 /* terminator */
256         };                                        248         };
257         static const unsigned int uac2_maps[]  !! 249         static unsigned int uac2_maps[] = {
258                 SNDRV_CHMAP_FL,         /* fro    250                 SNDRV_CHMAP_FL,         /* front left */
259                 SNDRV_CHMAP_FR,         /* fro    251                 SNDRV_CHMAP_FR,         /* front right */
260                 SNDRV_CHMAP_FC,         /* fro    252                 SNDRV_CHMAP_FC,         /* front center */
261                 SNDRV_CHMAP_LFE,        /* LFE    253                 SNDRV_CHMAP_LFE,        /* LFE */
262                 SNDRV_CHMAP_RL,         /* bac    254                 SNDRV_CHMAP_RL,         /* back left */
263                 SNDRV_CHMAP_RR,         /* bac    255                 SNDRV_CHMAP_RR,         /* back right */
264                 SNDRV_CHMAP_FLC,        /* fro    256                 SNDRV_CHMAP_FLC,        /* front left of center */
265                 SNDRV_CHMAP_FRC,        /* fro    257                 SNDRV_CHMAP_FRC,        /* front right of center */
266                 SNDRV_CHMAP_RC,         /* bac    258                 SNDRV_CHMAP_RC,         /* back center */
267                 SNDRV_CHMAP_SL,         /* sid    259                 SNDRV_CHMAP_SL,         /* side left */
268                 SNDRV_CHMAP_SR,         /* sid    260                 SNDRV_CHMAP_SR,         /* side right */
269                 SNDRV_CHMAP_TC,         /* top    261                 SNDRV_CHMAP_TC,         /* top center */
270                 SNDRV_CHMAP_TFL,        /* top    262                 SNDRV_CHMAP_TFL,        /* top front left */
271                 SNDRV_CHMAP_TFC,        /* top    263                 SNDRV_CHMAP_TFC,        /* top front center */
272                 SNDRV_CHMAP_TFR,        /* top    264                 SNDRV_CHMAP_TFR,        /* top front right */
273                 SNDRV_CHMAP_TRL,        /* top    265                 SNDRV_CHMAP_TRL,        /* top back left */
274                 SNDRV_CHMAP_TRC,        /* top    266                 SNDRV_CHMAP_TRC,        /* top back center */
275                 SNDRV_CHMAP_TRR,        /* top    267                 SNDRV_CHMAP_TRR,        /* top back right */
276                 SNDRV_CHMAP_TFLC,       /* top    268                 SNDRV_CHMAP_TFLC,       /* top front left of center */
277                 SNDRV_CHMAP_TFRC,       /* top    269                 SNDRV_CHMAP_TFRC,       /* top front right of center */
278                 SNDRV_CHMAP_LLFE,       /* lef    270                 SNDRV_CHMAP_LLFE,       /* left LFE */
279                 SNDRV_CHMAP_RLFE,       /* rig    271                 SNDRV_CHMAP_RLFE,       /* right LFE */
280                 SNDRV_CHMAP_TSL,        /* top    272                 SNDRV_CHMAP_TSL,        /* top side left */
281                 SNDRV_CHMAP_TSR,        /* top    273                 SNDRV_CHMAP_TSR,        /* top side right */
282                 SNDRV_CHMAP_BC,         /* bot    274                 SNDRV_CHMAP_BC,         /* bottom center */
283                 SNDRV_CHMAP_RLC,        /* bac    275                 SNDRV_CHMAP_RLC,        /* back left of center */
284                 SNDRV_CHMAP_RRC,        /* bac    276                 SNDRV_CHMAP_RRC,        /* back right of center */
285                 0 /* terminator */                277                 0 /* terminator */
286         };                                        278         };
287         struct snd_pcm_chmap_elem *chmap;         279         struct snd_pcm_chmap_elem *chmap;
288         const unsigned int *maps;                 280         const unsigned int *maps;
289         int c;                                    281         int c;
290                                                   282 
291         if (channels > ARRAY_SIZE(chmap->map))    283         if (channels > ARRAY_SIZE(chmap->map))
292                 return NULL;                      284                 return NULL;
293                                                   285 
294         chmap = kzalloc(sizeof(*chmap), GFP_KE    286         chmap = kzalloc(sizeof(*chmap), GFP_KERNEL);
295         if (!chmap)                               287         if (!chmap)
296                 return NULL;                      288                 return NULL;
297                                                   289 
298         maps = protocol == UAC_VERSION_2 ? uac    290         maps = protocol == UAC_VERSION_2 ? uac2_maps : uac1_maps;
299         chmap->channels = channels;               291         chmap->channels = channels;
300         c = 0;                                    292         c = 0;
301                                                   293 
302         if (bits) {                               294         if (bits) {
303                 for (; bits && *maps; maps++,  !! 295                 for (; bits && *maps; maps++, bits >>= 1)
304                         if (bits & 1)             296                         if (bits & 1)
305                                 chmap->map[c++    297                                 chmap->map[c++] = *maps;
306                         if (c == chmap->channe << 
307                                 break;         << 
308                 }                              << 
309         } else {                                  298         } else {
310                 /* If we're missing wChannelCo    299                 /* If we're missing wChannelConfig, then guess something
311                     to make sure the channel m    300                     to make sure the channel map is not skipped entirely */
312                 if (channels == 1)                301                 if (channels == 1)
313                         chmap->map[c++] = SNDR    302                         chmap->map[c++] = SNDRV_CHMAP_MONO;
314                 else                              303                 else
315                         for (; c < channels &&    304                         for (; c < channels && *maps; maps++)
316                                 chmap->map[c++    305                                 chmap->map[c++] = *maps;
317         }                                         306         }
318                                                   307 
319         for (; c < channels; c++)                 308         for (; c < channels; c++)
320                 chmap->map[c] = SNDRV_CHMAP_UN    309                 chmap->map[c] = SNDRV_CHMAP_UNKNOWN;
321                                                   310 
322         return chmap;                             311         return chmap;
323 }                                                 312 }
324                                                   313 
325 /* UAC3 device stores channels information in  << 
326 static struct                                  << 
327 snd_pcm_chmap_elem *convert_chmap_v3(struct ua << 
328                                                << 
329 {                                              << 
330         unsigned int channels = cluster->bNrCh << 
331         struct snd_pcm_chmap_elem *chmap;      << 
332         void *p = cluster;                     << 
333         int len, c;                            << 
334                                                << 
335         if (channels > ARRAY_SIZE(chmap->map)) << 
336                 return NULL;                   << 
337                                                << 
338         chmap = kzalloc(sizeof(*chmap), GFP_KE << 
339         if (!chmap)                            << 
340                 return NULL;                   << 
341                                                << 
342         len = le16_to_cpu(cluster->wLength);   << 
343         c = 0;                                 << 
344         p += sizeof(struct uac3_cluster_header << 
345                                                << 
346         while (((p - (void *)cluster) < len) & << 
347                 struct uac3_cluster_segment_de << 
348                 u16 cs_len;                    << 
349                 u8 cs_type;                    << 
350                                                << 
351                 cs_len = le16_to_cpu(cs_desc-> << 
352                 cs_type = cs_desc->bSegmentTyp << 
353                                                << 
354                 if (cs_type == UAC3_CHANNEL_IN << 
355                         struct uac3_cluster_in << 
356                         unsigned char map;     << 
357                                                << 
358                         /*                     << 
359                          * TODO: this conversi << 
360                          * after adding UAC3 v << 
361                          */                    << 
362                         switch (is->bChRelatio << 
363                         case UAC3_CH_MONO:     << 
364                                 map = SNDRV_CH << 
365                                 break;         << 
366                         case UAC3_CH_LEFT:     << 
367                         case UAC3_CH_FRONT_LEF << 
368                         case UAC3_CH_HEADPHONE << 
369                                 map = SNDRV_CH << 
370                                 break;         << 
371                         case UAC3_CH_RIGHT:    << 
372                         case UAC3_CH_FRONT_RIG << 
373                         case UAC3_CH_HEADPHONE << 
374                                 map = SNDRV_CH << 
375                                 break;         << 
376                         case UAC3_CH_FRONT_CEN << 
377                                 map = SNDRV_CH << 
378                                 break;         << 
379                         case UAC3_CH_FRONT_LEF << 
380                                 map = SNDRV_CH << 
381                                 break;         << 
382                         case UAC3_CH_FRONT_RIG << 
383                                 map = SNDRV_CH << 
384                                 break;         << 
385                         case UAC3_CH_SIDE_LEFT << 
386                                 map = SNDRV_CH << 
387                                 break;         << 
388                         case UAC3_CH_SIDE_RIGH << 
389                                 map = SNDRV_CH << 
390                                 break;         << 
391                         case UAC3_CH_BACK_LEFT << 
392                                 map = SNDRV_CH << 
393                                 break;         << 
394                         case UAC3_CH_BACK_RIGH << 
395                                 map = SNDRV_CH << 
396                                 break;         << 
397                         case UAC3_CH_BACK_CENT << 
398                                 map = SNDRV_CH << 
399                                 break;         << 
400                         case UAC3_CH_BACK_LEFT << 
401                                 map = SNDRV_CH << 
402                                 break;         << 
403                         case UAC3_CH_BACK_RIGH << 
404                                 map = SNDRV_CH << 
405                                 break;         << 
406                         case UAC3_CH_TOP_CENTE << 
407                                 map = SNDRV_CH << 
408                                 break;         << 
409                         case UAC3_CH_TOP_FRONT << 
410                                 map = SNDRV_CH << 
411                                 break;         << 
412                         case UAC3_CH_TOP_FRONT << 
413                                 map = SNDRV_CH << 
414                                 break;         << 
415                         case UAC3_CH_TOP_FRONT << 
416                                 map = SNDRV_CH << 
417                                 break;         << 
418                         case UAC3_CH_TOP_FRONT << 
419                                 map = SNDRV_CH << 
420                                 break;         << 
421                         case UAC3_CH_TOP_FRONT << 
422                                 map = SNDRV_CH << 
423                                 break;         << 
424                         case UAC3_CH_TOP_SIDE_ << 
425                                 map = SNDRV_CH << 
426                                 break;         << 
427                         case UAC3_CH_TOP_SIDE_ << 
428                                 map = SNDRV_CH << 
429                                 break;         << 
430                         case UAC3_CH_TOP_BACK_ << 
431                                 map = SNDRV_CH << 
432                                 break;         << 
433                         case UAC3_CH_TOP_BACK_ << 
434                                 map = SNDRV_CH << 
435                                 break;         << 
436                         case UAC3_CH_TOP_BACK_ << 
437                                 map = SNDRV_CH << 
438                                 break;         << 
439                         case UAC3_CH_BOTTOM_CE << 
440                                 map = SNDRV_CH << 
441                                 break;         << 
442                         case UAC3_CH_LOW_FREQU << 
443                                 map = SNDRV_CH << 
444                                 break;         << 
445                         case UAC3_CH_LFE_LEFT: << 
446                                 map = SNDRV_CH << 
447                                 break;         << 
448                         case UAC3_CH_LFE_RIGHT << 
449                                 map = SNDRV_CH << 
450                                 break;         << 
451                         case UAC3_CH_RELATIONS << 
452                         default:               << 
453                                 map = SNDRV_CH << 
454                                 break;         << 
455                         }                      << 
456                         chmap->map[c++] = map; << 
457                 }                              << 
458                 p += cs_len;                   << 
459         }                                      << 
460                                                << 
461         if (channels < c)                      << 
462                 pr_err("%s: channel number mis << 
463                                                << 
464         chmap->channels = channels;            << 
465                                                << 
466         for (; c < channels; c++)              << 
467                 chmap->map[c] = SNDRV_CHMAP_UN << 
468                                                << 
469         return chmap;                          << 
470 }                                              << 
471                                                << 
472 /*                                                314 /*
473  * add this endpoint to the chip instance.        315  * add this endpoint to the chip instance.
474  * if a stream with the same endpoint already     316  * if a stream with the same endpoint already exists, append to it.
475  * if not, create a new pcm stream. note, fp i    317  * if not, create a new pcm stream. note, fp is added to the substream
476  * fmt_list and will be freed on the chip inst    318  * fmt_list and will be freed on the chip instance release. do not free
477  * fp or do remove it from the substream fmt_l    319  * fp or do remove it from the substream fmt_list to avoid double-free.
478  */                                               320  */
479 static int __snd_usb_add_audio_stream(struct s !! 321 int snd_usb_add_audio_stream(struct snd_usb_audio *chip,
480                                       int stre !! 322                              int stream,
481                                       struct a !! 323                              struct audioformat *fp)
482                                       struct s << 
483                                                << 
484 {                                                 324 {
485         struct snd_usb_stream *as;                325         struct snd_usb_stream *as;
486         struct snd_usb_substream *subs;           326         struct snd_usb_substream *subs;
487         struct snd_pcm *pcm;                      327         struct snd_pcm *pcm;
488         int err;                                  328         int err;
489                                                   329 
490         list_for_each_entry(as, &chip->pcm_lis    330         list_for_each_entry(as, &chip->pcm_list, list) {
491                 if (as->fmt_type != fp->fmt_ty    331                 if (as->fmt_type != fp->fmt_type)
492                         continue;                 332                         continue;
493                 subs = &as->substream[stream];    333                 subs = &as->substream[stream];
494                 if (subs->ep_num == fp->endpoi    334                 if (subs->ep_num == fp->endpoint) {
495                         list_add_tail(&fp->lis    335                         list_add_tail(&fp->list, &subs->fmt_list);
496                         subs->num_formats++;      336                         subs->num_formats++;
497                         subs->formats |= fp->f    337                         subs->formats |= fp->formats;
498                         return 0;                 338                         return 0;
499                 }                                 339                 }
500         }                                         340         }
501                                                << 
502         if (chip->card->registered)            << 
503                 chip->need_delayed_register =  << 
504                                                << 
505         /* look for an empty stream */            341         /* look for an empty stream */
506         list_for_each_entry(as, &chip->pcm_lis    342         list_for_each_entry(as, &chip->pcm_list, list) {
507                 if (as->fmt_type != fp->fmt_ty    343                 if (as->fmt_type != fp->fmt_type)
508                         continue;                 344                         continue;
509                 subs = &as->substream[stream];    345                 subs = &as->substream[stream];
510                 if (subs->ep_num)                 346                 if (subs->ep_num)
511                         continue;                 347                         continue;
512                 err = snd_pcm_new_stream(as->p    348                 err = snd_pcm_new_stream(as->pcm, stream, 1);
513                 if (err < 0)                      349                 if (err < 0)
514                         return err;               350                         return err;
515                 snd_usb_init_substream(as, str !! 351                 snd_usb_init_substream(as, stream, fp);
516                 return add_chmap(as->pcm, stre    352                 return add_chmap(as->pcm, stream, subs);
517         }                                         353         }
518                                                   354 
519         /* create a new pcm */                    355         /* create a new pcm */
520         as = kzalloc(sizeof(*as), GFP_KERNEL);    356         as = kzalloc(sizeof(*as), GFP_KERNEL);
521         if (!as)                                  357         if (!as)
522                 return -ENOMEM;                   358                 return -ENOMEM;
523         as->pcm_index = chip->pcm_devs;           359         as->pcm_index = chip->pcm_devs;
524         as->chip = chip;                          360         as->chip = chip;
525         as->fmt_type = fp->fmt_type;              361         as->fmt_type = fp->fmt_type;
526         err = snd_pcm_new(chip->card, "USB Aud    362         err = snd_pcm_new(chip->card, "USB Audio", chip->pcm_devs,
527                           stream == SNDRV_PCM_    363                           stream == SNDRV_PCM_STREAM_PLAYBACK ? 1 : 0,
528                           stream == SNDRV_PCM_    364                           stream == SNDRV_PCM_STREAM_PLAYBACK ? 0 : 1,
529                           &pcm);                  365                           &pcm);
530         if (err < 0) {                            366         if (err < 0) {
531                 kfree(as);                        367                 kfree(as);
532                 return err;                       368                 return err;
533         }                                         369         }
534         as->pcm = pcm;                            370         as->pcm = pcm;
535         pcm->private_data = as;                   371         pcm->private_data = as;
536         pcm->private_free = snd_usb_audio_pcm_    372         pcm->private_free = snd_usb_audio_pcm_free;
537         pcm->info_flags = 0;                      373         pcm->info_flags = 0;
538         if (chip->pcm_devs > 0)                   374         if (chip->pcm_devs > 0)
539                 sprintf(pcm->name, "USB Audio     375                 sprintf(pcm->name, "USB Audio #%d", chip->pcm_devs);
540         else                                      376         else
541                 strcpy(pcm->name, "USB Audio")    377                 strcpy(pcm->name, "USB Audio");
542                                                   378 
543         snd_usb_init_substream(as, stream, fp, !! 379         snd_usb_init_substream(as, stream, fp);
544                                                   380 
545         /*                                        381         /*
546          * Keep using head insertion for M-Aud    382          * Keep using head insertion for M-Audio Audiophile USB (tm) which has a
547          * fix to swap capture stream order in    383          * fix to swap capture stream order in conf/cards/USB-audio.conf
548          */                                       384          */
549         if (chip->usb_id == USB_ID(0x0763, 0x2    385         if (chip->usb_id == USB_ID(0x0763, 0x2003))
550                 list_add(&as->list, &chip->pcm    386                 list_add(&as->list, &chip->pcm_list);
551         else                                      387         else
552                 list_add_tail(&as->list, &chip    388                 list_add_tail(&as->list, &chip->pcm_list);
553                                                   389 
554         chip->pcm_devs++;                         390         chip->pcm_devs++;
555                                                   391 
556         snd_usb_proc_pcm_format_add(as);          392         snd_usb_proc_pcm_format_add(as);
557                                                   393 
558         return add_chmap(pcm, stream, &as->sub    394         return add_chmap(pcm, stream, &as->substream[stream]);
559 }                                                 395 }
560                                                   396 
561 int snd_usb_add_audio_stream(struct snd_usb_au << 
562                              int stream,       << 
563                              struct audioforma << 
564 {                                              << 
565         return __snd_usb_add_audio_stream(chip << 
566 }                                              << 
567                                                << 
568 static int snd_usb_add_audio_stream_v3(struct  << 
569                                        int str << 
570                                        struct  << 
571                                        struct  << 
572 {                                              << 
573         return __snd_usb_add_audio_stream(chip << 
574 }                                              << 
575                                                << 
576 static int parse_uac_endpoint_attributes(struc    397 static int parse_uac_endpoint_attributes(struct snd_usb_audio *chip,
577                                          struc    398                                          struct usb_host_interface *alts,
578                                          int p    399                                          int protocol, int iface_no)
579 {                                                 400 {
580         /* parsed with a v1 header here. that'    401         /* parsed with a v1 header here. that's ok as we only look at the
581          * header first which is the same for     402          * header first which is the same for both versions */
582         struct uac_iso_endpoint_descriptor *cs    403         struct uac_iso_endpoint_descriptor *csep;
583         struct usb_interface_descriptor *altsd    404         struct usb_interface_descriptor *altsd = get_iface_desc(alts);
584         int attributes = 0;                       405         int attributes = 0;
585                                                   406 
586         csep = snd_usb_find_desc(alts->endpoin    407         csep = snd_usb_find_desc(alts->endpoint[0].extra, alts->endpoint[0].extralen, NULL, USB_DT_CS_ENDPOINT);
587                                                   408 
588         /* Creamware Noah has this descriptor     409         /* Creamware Noah has this descriptor after the 2nd endpoint */
589         if (!csep && altsd->bNumEndpoints >= 2    410         if (!csep && altsd->bNumEndpoints >= 2)
590                 csep = snd_usb_find_desc(alts-    411                 csep = snd_usb_find_desc(alts->endpoint[1].extra, alts->endpoint[1].extralen, NULL, USB_DT_CS_ENDPOINT);
591                                                   412 
592         /*                                        413         /*
593          * If we can't locate the USB_DT_CS_EN    414          * If we can't locate the USB_DT_CS_ENDPOINT descriptor in the extra
594          * bytes after the first endpoint, go     415          * bytes after the first endpoint, go search the entire interface.
595          * Some devices have it directly *befo    416          * Some devices have it directly *before* the standard endpoint.
596          */                                       417          */
597         if (!csep)                                418         if (!csep)
598                 csep = snd_usb_find_desc(alts-    419                 csep = snd_usb_find_desc(alts->extra, alts->extralen, NULL, USB_DT_CS_ENDPOINT);
599                                                   420 
600         if (!csep || csep->bLength < 7 ||         421         if (!csep || csep->bLength < 7 ||
601             csep->bDescriptorSubtype != UAC_EP !! 422             csep->bDescriptorSubtype != UAC_EP_GENERAL) {
602                 goto error;                    !! 423                 usb_audio_warn(chip,
                                                   >> 424                                "%u:%d : no or invalid class specific endpoint descriptor\n",
                                                   >> 425                                iface_no, altsd->bAlternateSetting);
                                                   >> 426                 return 0;
                                                   >> 427         }
603                                                   428 
604         if (protocol == UAC_VERSION_1) {          429         if (protocol == UAC_VERSION_1) {
605                 attributes = csep->bmAttribute    430                 attributes = csep->bmAttributes;
606         } else if (protocol == UAC_VERSION_2)  !! 431         } else {
607                 struct uac2_iso_endpoint_descr    432                 struct uac2_iso_endpoint_descriptor *csep2 =
608                         (struct uac2_iso_endpo    433                         (struct uac2_iso_endpoint_descriptor *) csep;
609                                                   434 
610                 if (csep2->bLength < sizeof(*c << 
611                         goto error;            << 
612                 attributes = csep->bmAttribute    435                 attributes = csep->bmAttributes & UAC_EP_CS_ATTR_FILL_MAX;
613                                                   436 
614                 /* emulate the endpoint attrib    437                 /* emulate the endpoint attributes of a v1 device */
615                 if (csep2->bmControls & UAC2_C    438                 if (csep2->bmControls & UAC2_CONTROL_PITCH)
616                         attributes |= UAC_EP_C    439                         attributes |= UAC_EP_CS_ATTR_PITCH_CONTROL;
617         } else { /* UAC_VERSION_3 */           << 
618                 struct uac3_iso_endpoint_descr << 
619                         (struct uac3_iso_endpo << 
620                                                << 
621                 if (csep3->bLength < sizeof(*c << 
622                         goto error;            << 
623                 /* emulate the endpoint attrib << 
624                 if (le32_to_cpu(csep3->bmContr << 
625                         attributes |= UAC_EP_C << 
626         }                                         440         }
627                                                   441 
628         return attributes;                        442         return attributes;
629                                                << 
630  error:                                        << 
631         usb_audio_warn(chip,                   << 
632                        "%u:%d : no or invalid  << 
633                        iface_no, altsd->bAlter << 
634         return 0;                              << 
635 }                                                 443 }
636                                                   444 
637 /* find an input terminal descriptor (either U    445 /* find an input terminal descriptor (either UAC1 or UAC2) with the given
638  * terminal id                                    446  * terminal id
639  */                                               447  */
640 static void *                                     448 static void *
641 snd_usb_find_input_terminal_descriptor(struct     449 snd_usb_find_input_terminal_descriptor(struct usb_host_interface *ctrl_iface,
642                                        int ter !! 450                                                int terminal_id)
643 {                                                 451 {
644         struct uac2_input_terminal_descriptor     452         struct uac2_input_terminal_descriptor *term = NULL;
645                                                   453 
646         while ((term = snd_usb_find_csint_desc    454         while ((term = snd_usb_find_csint_desc(ctrl_iface->extra,
647                                                   455                                                ctrl_iface->extralen,
648                                                   456                                                term, UAC_INPUT_TERMINAL))) {
649                 if (!snd_usb_validate_audio_de << 
650                         continue;              << 
651                 if (term->bTerminalID == termi    457                 if (term->bTerminalID == terminal_id)
652                         return term;              458                         return term;
653         }                                         459         }
654                                                   460 
655         return NULL;                              461         return NULL;
656 }                                                 462 }
657                                                   463 
658 static void *                                  !! 464 static struct uac2_output_terminal_descriptor *
659 snd_usb_find_output_terminal_descriptor(struct !! 465         snd_usb_find_output_terminal_descriptor(struct usb_host_interface *ctrl_iface,
660                                         int te !! 466                                                 int terminal_id)
661 {                                                 467 {
662         /* OK to use with both UAC2 and UAC3 * << 
663         struct uac2_output_terminal_descriptor    468         struct uac2_output_terminal_descriptor *term = NULL;
664                                                   469 
665         while ((term = snd_usb_find_csint_desc    470         while ((term = snd_usb_find_csint_desc(ctrl_iface->extra,
666                                                   471                                                ctrl_iface->extralen,
667                                                   472                                                term, UAC_OUTPUT_TERMINAL))) {
668                 if (!snd_usb_validate_audio_de << 
669                         continue;              << 
670                 if (term->bTerminalID == termi    473                 if (term->bTerminalID == terminal_id)
671                         return term;              474                         return term;
672         }                                         475         }
673                                                   476 
674         return NULL;                              477         return NULL;
675 }                                                 478 }
676                                                   479 
677 static struct audioformat *                    !! 480 int snd_usb_parse_audio_interface(struct snd_usb_audio *chip, int iface_no)
678 audio_format_alloc_init(struct snd_usb_audio * << 
679                        struct usb_host_interfa << 
680                        int protocol, int iface << 
681                        int altno, int num_chan << 
682 {                                              << 
683         struct audioformat *fp;                << 
684                                                << 
685         fp = kzalloc(sizeof(*fp), GFP_KERNEL); << 
686         if (!fp)                               << 
687                 return NULL;                   << 
688                                                << 
689         fp->iface = iface_no;                  << 
690         fp->altsetting = altno;                << 
691         fp->altset_idx = altset_idx;           << 
692         fp->endpoint = get_endpoint(alts, 0)-> << 
693         fp->ep_attr = get_endpoint(alts, 0)->b << 
694         fp->datainterval = snd_usb_parse_datai << 
695         fp->protocol = protocol;               << 
696         fp->maxpacksize = le16_to_cpu(get_endp << 
697         fp->channels = num_channels;           << 
698         if (snd_usb_get_speed(chip->dev) == US << 
699                 fp->maxpacksize = (((fp->maxpa << 
700                                 * (fp->maxpack << 
701         fp->clock = clock;                     << 
702         INIT_LIST_HEAD(&fp->list);             << 
703                                                << 
704         return fp;                             << 
705 }                                              << 
706                                                << 
707 static struct audioformat *                    << 
708 snd_usb_get_audioformat_uac12(struct snd_usb_a << 
709                               struct usb_host_ << 
710                               int protocol, in << 
711                               int altno, int s << 
712 {                                              << 
713         struct usb_device *dev = chip->dev;    << 
714         struct uac_format_type_i_continuous_de << 
715         unsigned int num_channels = 0, chconfi << 
716         struct usb_host_interface *ctrl_intf;  << 
717         struct audioformat *fp;                << 
718         int clock = 0;                         << 
719         u64 format;                            << 
720                                                << 
721         ctrl_intf = snd_usb_find_ctrl_interfac << 
722                                                << 
723         /* get audio formats */                << 
724         if (protocol == UAC_VERSION_1) {       << 
725                 struct uac1_as_header_descript << 
726                         snd_usb_find_csint_des << 
727                                                << 
728                 struct uac_input_terminal_desc << 
729                                                << 
730                 if (!as) {                     << 
731                         dev_err(&dev->dev,     << 
732                                 "%u:%d : UAC_A << 
733                                 iface_no, altn << 
734                         return NULL;           << 
735                 }                              << 
736                                                << 
737                 if (as->bLength < sizeof(*as)) << 
738                         dev_err(&dev->dev,     << 
739                                 "%u:%d : inval << 
740                                 iface_no, altn << 
741                         return NULL;           << 
742                 }                              << 
743                                                << 
744                 format = le16_to_cpu(as->wForm << 
745                                                << 
746                 iterm = snd_usb_find_input_ter << 
747                                                << 
748                                                << 
749                 if (iterm) {                   << 
750                         num_channels = iterm-> << 
751                         chconfig = le16_to_cpu << 
752                 }                              << 
753         } else { /* UAC_VERSION_2 */           << 
754                 struct uac2_input_terminal_des << 
755                 struct uac2_output_terminal_de << 
756                 struct uac2_as_header_descript << 
757                         snd_usb_find_csint_des << 
758                                                << 
759                                                << 
760                 if (!as) {                     << 
761                         dev_err(&dev->dev,     << 
762                                 "%u:%d : UAC_A << 
763                                 iface_no, altn << 
764                         return NULL;           << 
765                 }                              << 
766                                                << 
767                 if (as->bLength < sizeof(*as)) << 
768                         dev_err(&dev->dev,     << 
769                                 "%u:%d : inval << 
770                                 iface_no, altn << 
771                         return NULL;           << 
772                 }                              << 
773                                                << 
774                 num_channels = as->bNrChannels << 
775                 format = le32_to_cpu(as->bmFor << 
776                 chconfig = le32_to_cpu(as->bmC << 
777                                                << 
778                 /*                             << 
779                  * lookup the terminal associa << 
780                  * to extract the clock        << 
781                  */                            << 
782                 input_term = snd_usb_find_inpu << 
783                                                << 
784                                                << 
785                 if (input_term) {              << 
786                         clock = input_term->bC << 
787                         if (!chconfig && (num_ << 
788                                 chconfig = le3 << 
789                         goto found_clock;      << 
790                 }                              << 
791                                                << 
792                 output_term = snd_usb_find_out << 
793                                                << 
794                                                << 
795                 if (output_term) {             << 
796                         clock = output_term->b << 
797                         goto found_clock;      << 
798                 }                              << 
799                                                << 
800                 dev_err(&dev->dev,             << 
801                         "%u:%d : bogus bTermin << 
802                         iface_no, altno, as->b << 
803                 return NULL;                   << 
804         }                                      << 
805                                                << 
806 found_clock:                                   << 
807         /* get format type */                  << 
808         fmt = snd_usb_find_csint_desc(alts->ex << 
809                                       NULL, UA << 
810         if (!fmt) {                            << 
811                 dev_err(&dev->dev,             << 
812                         "%u:%d : no UAC_FORMAT << 
813                         iface_no, altno);      << 
814                 return NULL;                   << 
815         }                                      << 
816         if (((protocol == UAC_VERSION_1) && (f << 
817                         || ((protocol == UAC_V << 
818                                         (fmt-> << 
819                 dev_err(&dev->dev,             << 
820                         "%u:%d : invalid UAC_F << 
821                         iface_no, altno);      << 
822                 return NULL;                   << 
823         }                                      << 
824                                                << 
825         /*                                     << 
826          * Blue Microphones workaround: The la << 
827          * identical with the previous one, ex << 
828          * packet size, but is actually a misl << 
829          * setting; ignore it.                 << 
830          *                                     << 
831          * Part 2: analyze quirk flag and form << 
832          */                                    << 
833         if (bm_quirk && fmt->bNrChannels == 1  << 
834                 return NULL;                   << 
835                                                << 
836         fp = audio_format_alloc_init(chip, alt << 
837                                      altset_id << 
838         if (!fp)                               << 
839                 return ERR_PTR(-ENOMEM);       << 
840                                                << 
841         fp->attributes = parse_uac_endpoint_at << 
842                                                << 
843                                                << 
844         /* some quirks for attributes here */  << 
845         snd_usb_audioformat_attributes_quirk(c << 
846                                                << 
847         /* ok, let's parse further... */       << 
848         if (snd_usb_parse_audio_format(chip, f << 
849                                         fmt, s << 
850                 audioformat_free(fp);          << 
851                 return NULL;                   << 
852         }                                      << 
853                                                << 
854         /* Create chmap */                     << 
855         if (fp->channels != num_channels)      << 
856                 chconfig = 0;                  << 
857                                                << 
858         fp->chmap = convert_chmap(fp->channels << 
859                                                << 
860         return fp;                             << 
861 }                                              << 
862                                                << 
863 static struct audioformat *                    << 
864 snd_usb_get_audioformat_uac3(struct snd_usb_au << 
865                              struct usb_host_i << 
866                              struct snd_usb_po << 
867                              int iface_no, int << 
868                              int altno, int st << 
869 {                                              << 
870         struct usb_device *dev = chip->dev;    << 
871         struct uac3_input_terminal_descriptor  << 
872         struct uac3_output_terminal_descriptor << 
873         struct uac3_cluster_header_descriptor  << 
874         struct uac3_as_header_descriptor *as = << 
875         struct uac3_hc_descriptor_header hc_he << 
876         struct usb_host_interface *ctrl_intf;  << 
877         struct snd_pcm_chmap_elem *chmap;      << 
878         struct snd_usb_power_domain *pd;       << 
879         unsigned char badd_profile;            << 
880         u64 badd_formats = 0;                  << 
881         unsigned int num_channels;             << 
882         struct audioformat *fp;                << 
883         u16 cluster_id, wLength;               << 
884         int clock = 0;                         << 
885         int err;                               << 
886                                                << 
887         badd_profile = chip->badd_profile;     << 
888         ctrl_intf = snd_usb_find_ctrl_interfac << 
889                                                << 
890         if (badd_profile >= UAC3_FUNCTION_SUBC << 
891                 unsigned int maxpacksize =     << 
892                         le16_to_cpu(get_endpoi << 
893                                                << 
894                 switch (maxpacksize) {         << 
895                 default:                       << 
896                         dev_err(&dev->dev,     << 
897                                 "%u:%d : incor << 
898                                 iface_no, altn << 
899                         return NULL;           << 
900                 case UAC3_BADD_EP_MAXPSIZE_SYN << 
901                 case UAC3_BADD_EP_MAXPSIZE_ASY << 
902                         badd_formats = SNDRV_P << 
903                         num_channels = 1;      << 
904                         break;                 << 
905                 case UAC3_BADD_EP_MAXPSIZE_SYN << 
906                 case UAC3_BADD_EP_MAXPSIZE_ASY << 
907                         badd_formats = SNDRV_P << 
908                         num_channels = 1;      << 
909                         break;                 << 
910                 case UAC3_BADD_EP_MAXPSIZE_SYN << 
911                 case UAC3_BADD_EP_MAXPSIZE_ASY << 
912                         badd_formats = SNDRV_P << 
913                         num_channels = 2;      << 
914                         break;                 << 
915                 case UAC3_BADD_EP_MAXPSIZE_SYN << 
916                 case UAC3_BADD_EP_MAXPSIZE_ASY << 
917                         badd_formats = SNDRV_P << 
918                         num_channels = 2;      << 
919                         break;                 << 
920                 }                              << 
921                                                << 
922                 chmap = kzalloc(sizeof(*chmap) << 
923                 if (!chmap)                    << 
924                         return ERR_PTR(-ENOMEM << 
925                                                << 
926                 if (num_channels == 1) {       << 
927                         chmap->map[0] = SNDRV_ << 
928                 } else {                       << 
929                         chmap->map[0] = SNDRV_ << 
930                         chmap->map[1] = SNDRV_ << 
931                 }                              << 
932                                                << 
933                 chmap->channels = num_channels << 
934                 clock = UAC3_BADD_CS_ID9;      << 
935                 goto found_clock;              << 
936         }                                      << 
937                                                << 
938         as = snd_usb_find_csint_desc(alts->ext << 
939                                      NULL, UAC << 
940         if (!as) {                             << 
941                 dev_err(&dev->dev,             << 
942                         "%u:%d : UAC_AS_GENERA << 
943                         iface_no, altno);      << 
944                 return NULL;                   << 
945         }                                      << 
946                                                << 
947         if (as->bLength < sizeof(*as)) {       << 
948                 dev_err(&dev->dev,             << 
949                         "%u:%d : invalid UAC_A << 
950                         iface_no, altno);      << 
951                 return NULL;                   << 
952         }                                      << 
953                                                << 
954         cluster_id = le16_to_cpu(as->wClusterD << 
955         if (!cluster_id) {                     << 
956                 dev_err(&dev->dev,             << 
957                         "%u:%d : no cluster de << 
958                         iface_no, altno);      << 
959                 return NULL;                   << 
960         }                                      << 
961                                                << 
962         /*                                     << 
963          * Get number of channels and channel  << 
964          * High Capability Cluster Descriptor  << 
965          *                                     << 
966          * First step: get High Capability hea << 
967          * read size of Cluster Descriptor     << 
968          */                                    << 
969         err = snd_usb_ctl_msg(chip->dev,       << 
970                         usb_rcvctrlpipe(chip-> << 
971                         UAC3_CS_REQ_HIGH_CAPAB << 
972                         USB_RECIP_INTERFACE |  << 
973                         cluster_id,            << 
974                         snd_usb_ctrl_intf(ctrl << 
975                         &hc_header, sizeof(hc_ << 
976         if (err < 0)                           << 
977                 return ERR_PTR(err);           << 
978         else if (err != sizeof(hc_header)) {   << 
979                 dev_err(&dev->dev,             << 
980                         "%u:%d : can't get Hig << 
981                         iface_no, altno);      << 
982                 return ERR_PTR(-EIO);          << 
983         }                                      << 
984                                                << 
985         /*                                     << 
986          * Second step: allocate needed amount << 
987          * and request Cluster Descriptor      << 
988          */                                    << 
989         wLength = le16_to_cpu(hc_header.wLengt << 
990         cluster = kzalloc(wLength, GFP_KERNEL) << 
991         if (!cluster)                          << 
992                 return ERR_PTR(-ENOMEM);       << 
993         err = snd_usb_ctl_msg(chip->dev,       << 
994                         usb_rcvctrlpipe(chip-> << 
995                         UAC3_CS_REQ_HIGH_CAPAB << 
996                         USB_RECIP_INTERFACE |  << 
997                         cluster_id,            << 
998                         snd_usb_ctrl_intf(ctrl << 
999                         cluster, wLength);     << 
1000         if (err < 0) {                        << 
1001                 kfree(cluster);               << 
1002                 return ERR_PTR(err);          << 
1003         } else if (err != wLength) {          << 
1004                 dev_err(&dev->dev,            << 
1005                         "%u:%d : can't get Cl << 
1006                         iface_no, altno);     << 
1007                 kfree(cluster);               << 
1008                 return ERR_PTR(-EIO);         << 
1009         }                                     << 
1010                                               << 
1011         num_channels = cluster->bNrChannels;  << 
1012         chmap = convert_chmap_v3(cluster);    << 
1013         kfree(cluster);                       << 
1014                                               << 
1015         /*                                    << 
1016          * lookup the terminal associated to  << 
1017          * to extract the clock               << 
1018          */                                   << 
1019         input_term = snd_usb_find_input_termi << 
1020                                               << 
1021                                               << 
1022         if (input_term) {                     << 
1023                 clock = input_term->bCSourceI << 
1024                 goto found_clock;             << 
1025         }                                     << 
1026                                               << 
1027         output_term = snd_usb_find_output_ter << 
1028                                               << 
1029                                               << 
1030         if (output_term) {                    << 
1031                 clock = output_term->bCSource << 
1032                 goto found_clock;             << 
1033         }                                     << 
1034                                               << 
1035         dev_err(&dev->dev, "%u:%d : bogus bTe << 
1036                         iface_no, altno, as-> << 
1037         kfree(chmap);                         << 
1038         return NULL;                          << 
1039                                               << 
1040 found_clock:                                  << 
1041         fp = audio_format_alloc_init(chip, al << 
1042                                      altset_i << 
1043         if (!fp) {                            << 
1044                 kfree(chmap);                 << 
1045                 return ERR_PTR(-ENOMEM);      << 
1046         }                                     << 
1047                                               << 
1048         fp->chmap = chmap;                    << 
1049                                               << 
1050         if (badd_profile >= UAC3_FUNCTION_SUB << 
1051                 fp->attributes = 0; /* No att << 
1052                                               << 
1053                 fp->fmt_type = UAC_FORMAT_TYP << 
1054                 fp->formats = badd_formats;   << 
1055                                               << 
1056                 fp->nr_rates = 0;       /* SN << 
1057                 fp->rate_min = UAC3_BADD_SAMP << 
1058                 fp->rate_max = UAC3_BADD_SAMP << 
1059                 fp->rates = SNDRV_PCM_RATE_CO << 
1060                                               << 
1061                 pd = kzalloc(sizeof(*pd), GFP << 
1062                 if (!pd) {                    << 
1063                         audioformat_free(fp); << 
1064                         return NULL;          << 
1065                 }                             << 
1066                 pd->pd_id = (stream == SNDRV_ << 
1067                                         UAC3_ << 
1068                 pd->pd_d1d0_rec = UAC3_BADD_P << 
1069                 pd->pd_d2d0_rec = UAC3_BADD_P << 
1070                 pd->ctrl_iface = ctrl_intf;   << 
1071                                               << 
1072         } else {                              << 
1073                 fp->attributes = parse_uac_en << 
1074                                               << 
1075                                               << 
1076                                               << 
1077                 pd = snd_usb_find_power_domai << 
1078                                               << 
1079                                               << 
1080                 /* ok, let's parse further... << 
1081                 if (snd_usb_parse_audio_forma << 
1082                         kfree(pd);            << 
1083                         audioformat_free(fp); << 
1084                         return NULL;          << 
1085                 }                             << 
1086         }                                     << 
1087                                               << 
1088         if (pd)                               << 
1089                 *pd_out = pd;                 << 
1090                                               << 
1091         return fp;                            << 
1092 }                                             << 
1093                                               << 
1094 static int __snd_usb_parse_audio_interface(st << 
1095                                            in << 
1096                                            bo << 
1097 {                                                481 {
1098         struct usb_device *dev;                  482         struct usb_device *dev;
1099         struct usb_interface *iface;             483         struct usb_interface *iface;
1100         struct usb_host_interface *alts;         484         struct usb_host_interface *alts;
1101         struct usb_interface_descriptor *alts    485         struct usb_interface_descriptor *altsd;
1102         int i, altno, err, stream;               486         int i, altno, err, stream;
                                                   >> 487         unsigned int format = 0, num_channels = 0;
1103         struct audioformat *fp = NULL;           488         struct audioformat *fp = NULL;
1104         struct snd_usb_power_domain *pd = NUL !! 489         int num, protocol, clock = 0;
1105         bool set_iface_first;                 !! 490         struct uac_format_type_i_continuous_descriptor *fmt;
1106         int num, protocol;                    !! 491         unsigned int chconfig;
1107                                                  492 
1108         dev = chip->dev;                         493         dev = chip->dev;
1109                                                  494 
1110         /* parse the interface's altsettings     495         /* parse the interface's altsettings */
1111         iface = usb_ifnum_to_if(dev, iface_no    496         iface = usb_ifnum_to_if(dev, iface_no);
1112                                                  497 
1113         num = iface->num_altsetting;             498         num = iface->num_altsetting;
1114                                                  499 
1115         /*                                       500         /*
1116          * Dallas DS4201 workaround: It prese    501          * Dallas DS4201 workaround: It presents 5 altsettings, but the last
1117          * one misses syncpipe, and does not     502          * one misses syncpipe, and does not produce any sound.
1118          */                                      503          */
1119         if (chip->usb_id == USB_ID(0x04fa, 0x !! 504         if (chip->usb_id == USB_ID(0x04fa, 0x4201))
1120                 num = 4;                         505                 num = 4;
1121                                                  506 
1122         for (i = 0; i < num; i++) {              507         for (i = 0; i < num; i++) {
1123                 alts = &iface->altsetting[i];    508                 alts = &iface->altsetting[i];
1124                 altsd = get_iface_desc(alts);    509                 altsd = get_iface_desc(alts);
1125                 protocol = altsd->bInterfaceP    510                 protocol = altsd->bInterfaceProtocol;
1126                 /* skip invalid one */           511                 /* skip invalid one */
1127                 if (((altsd->bInterfaceClass     512                 if (((altsd->bInterfaceClass != USB_CLASS_AUDIO ||
1128                       (altsd->bInterfaceSubCl    513                       (altsd->bInterfaceSubClass != USB_SUBCLASS_AUDIOSTREAMING &&
1129                        altsd->bInterfaceSubCl    514                        altsd->bInterfaceSubClass != USB_SUBCLASS_VENDOR_SPEC)) &&
1130                      altsd->bInterfaceClass !    515                      altsd->bInterfaceClass != USB_CLASS_VENDOR_SPEC) ||
1131                     altsd->bNumEndpoints < 1     516                     altsd->bNumEndpoints < 1 ||
1132                     le16_to_cpu(get_endpoint(    517                     le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize) == 0)
1133                         continue;                518                         continue;
1134                 /* must be isochronous */        519                 /* must be isochronous */
1135                 if ((get_endpoint(alts, 0)->b    520                 if ((get_endpoint(alts, 0)->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) !=
1136                     USB_ENDPOINT_XFER_ISOC)      521                     USB_ENDPOINT_XFER_ISOC)
1137                         continue;                522                         continue;
1138                 /* check direction */            523                 /* check direction */
1139                 stream = (get_endpoint(alts,     524                 stream = (get_endpoint(alts, 0)->bEndpointAddress & USB_DIR_IN) ?
1140                         SNDRV_PCM_STREAM_CAPT    525                         SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK;
1141                 altno = altsd->bAlternateSett    526                 altno = altsd->bAlternateSetting;
1142                                                  527 
1143                 if (snd_usb_apply_interface_q    528                 if (snd_usb_apply_interface_quirk(chip, iface_no, altno))
1144                         continue;                529                         continue;
1145                                                  530 
1146                 /*                               531                 /*
1147                  * Roland audio streaming int    532                  * Roland audio streaming interfaces are marked with protocols
1148                  * 0/1/2, but are UAC 1 compa    533                  * 0/1/2, but are UAC 1 compatible.
1149                  */                              534                  */
1150                 if (USB_ID_VENDOR(chip->usb_i    535                 if (USB_ID_VENDOR(chip->usb_id) == 0x0582 &&
1151                     altsd->bInterfaceClass ==    536                     altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC &&
1152                     protocol <= 2)               537                     protocol <= 2)
1153                         protocol = UAC_VERSIO    538                         protocol = UAC_VERSION_1;
1154                                                  539 
                                                   >> 540                 chconfig = 0;
                                                   >> 541                 /* get audio formats */
1155                 switch (protocol) {              542                 switch (protocol) {
1156                 default:                         543                 default:
1157                         dev_dbg(&dev->dev, "%    544                         dev_dbg(&dev->dev, "%u:%d: unknown interface protocol %#02x, assuming v1\n",
1158                                 iface_no, alt    545                                 iface_no, altno, protocol);
1159                         protocol = UAC_VERSIO    546                         protocol = UAC_VERSION_1;
1160                         fallthrough;          !! 547                         /* fall through */
1161                 case UAC_VERSION_1:           << 
1162                 case UAC_VERSION_2: {         << 
1163                         int bm_quirk = 0;     << 
1164                                                  548 
1165                         /*                    !! 549                 case UAC_VERSION_1: {
1166                          * Blue Microphones w !! 550                         struct uac1_as_header_descriptor *as =
1167                          * identical with the !! 551                                 snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, UAC_AS_GENERAL);
1168                          * packet size, but i !! 552                         struct uac_input_terminal_descriptor *iterm;
1169                          * setting; ignore it !! 553 
1170                          *                    !! 554                         if (!as) {
1171                          * Part 1: prepare qu !! 555                                 dev_err(&dev->dev,
1172                          */                   !! 556                                         "%u:%d : UAC_AS_GENERAL descriptor not found\n",
1173                         if (altno == 2 && num !! 557                                         iface_no, altno);
1174                             fp && fp->altsett !! 558                                 continue;
1175                             fp->formats == SN !! 559                         }
1176                             protocol == UAC_V !! 560 
1177                             le16_to_cpu(get_e !! 561                         if (as->bLength < sizeof(*as)) {
1178                                               !! 562                                 dev_err(&dev->dev,
1179                                 bm_quirk = 1; !! 563                                         "%u:%d : invalid UAC_AS_GENERAL desc\n",
                                                   >> 564                                         iface_no, altno);
                                                   >> 565                                 continue;
                                                   >> 566                         }
                                                   >> 567 
                                                   >> 568                         format = le16_to_cpu(as->wFormatTag); /* remember the format value */
                                                   >> 569 
                                                   >> 570                         iterm = snd_usb_find_input_terminal_descriptor(chip->ctrl_intf,
                                                   >> 571                                                                        as->bTerminalLink);
                                                   >> 572                         if (iterm) {
                                                   >> 573                                 num_channels = iterm->bNrChannels;
                                                   >> 574                                 chconfig = le16_to_cpu(iterm->wChannelConfig);
                                                   >> 575                         }
1180                                                  576 
1181                         fp = snd_usb_get_audi << 
1182                                               << 
1183                                               << 
1184                         break;                << 
1185                 }                             << 
1186                 case UAC_VERSION_3:           << 
1187                         fp = snd_usb_get_audi << 
1188                                               << 
1189                         break;                   577                         break;
1190                 }                                578                 }
1191                                                  579 
1192                 if (!fp)                      !! 580                 case UAC_VERSION_2: {
1193                         continue;             !! 581                         struct uac2_input_terminal_descriptor *input_term;
1194                 else if (IS_ERR(fp))          !! 582                         struct uac2_output_terminal_descriptor *output_term;
1195                         return PTR_ERR(fp);   !! 583                         struct uac2_as_header_descriptor *as =
                                                   >> 584                                 snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, UAC_AS_GENERAL);
                                                   >> 585 
                                                   >> 586                         if (!as) {
                                                   >> 587                                 dev_err(&dev->dev,
                                                   >> 588                                         "%u:%d : UAC_AS_GENERAL descriptor not found\n",
                                                   >> 589                                         iface_no, altno);
                                                   >> 590                                 continue;
                                                   >> 591                         }
1196                                                  592 
1197                 if (fp->fmt_type != UAC_FORMA !! 593                         if (as->bLength < sizeof(*as)) {
1198                         *has_non_pcm = true;  !! 594                                 dev_err(&dev->dev,
1199                 if ((fp->fmt_type == UAC_FORM !! 595                                         "%u:%d : invalid UAC_AS_GENERAL desc\n",
1200                         audioformat_free(fp); !! 596                                         iface_no, altno);
1201                         kfree(pd);            !! 597                                 continue;
1202                         fp = NULL;            !! 598                         }
1203                         pd = NULL;            << 
1204                         continue;             << 
1205                 }                             << 
1206                                                  599 
1207                 snd_usb_audioformat_set_sync_ !! 600                         num_channels = as->bNrChannels;
                                                   >> 601                         format = le32_to_cpu(as->bmFormats);
                                                   >> 602                         chconfig = le32_to_cpu(as->bmChannelConfig);
                                                   >> 603 
                                                   >> 604                         /* lookup the terminal associated to this interface
                                                   >> 605                          * to extract the clock */
                                                   >> 606                         input_term = snd_usb_find_input_terminal_descriptor(chip->ctrl_intf,
                                                   >> 607                                                                             as->bTerminalLink);
                                                   >> 608                         if (input_term) {
                                                   >> 609                                 clock = input_term->bCSourceID;
                                                   >> 610                                 if (!chconfig && (num_channels == input_term->bNrChannels))
                                                   >> 611                                         chconfig = le32_to_cpu(input_term->bmChannelConfig);
                                                   >> 612                                 break;
                                                   >> 613                         }
1208                                                  614 
1209                 dev_dbg(&dev->dev, "%u:%d: ad !! 615                         output_term = snd_usb_find_output_terminal_descriptor(chip->ctrl_intf,
1210                 if (protocol == UAC_VERSION_3 !! 616                                                                               as->bTerminalLink);
1211                         err = snd_usb_add_aud !! 617                         if (output_term) {
1212                 else                          !! 618                                 clock = output_term->bCSourceID;
1213                         err = snd_usb_add_aud !! 619                                 break;
                                                   >> 620                         }
1214                                                  621 
1215                 if (err < 0) {                !! 622                         dev_err(&dev->dev,
1216                         audioformat_free(fp); !! 623                                 "%u:%d : bogus bTerminalLink %d\n",
1217                         kfree(pd);            !! 624                                 iface_no, altno, as->bTerminalLink);
1218                         return err;           !! 625                         continue;
                                                   >> 626                 }
1219                 }                                627                 }
1220                                                  628 
1221                 /* add endpoints */           !! 629                 /* get format type */
1222                 err = snd_usb_add_endpoint(ch !! 630                 fmt = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, UAC_FORMAT_TYPE);
1223                                            SN !! 631                 if (!fmt) {
1224                 if (err < 0)                  !! 632                         dev_err(&dev->dev,
1225                         return err;           !! 633                                 "%u:%d : no UAC_FORMAT_TYPE desc\n",
1226                                               !! 634                                 iface_no, altno);
1227                 if (fp->sync_ep) {            !! 635                         continue;
1228                         err = snd_usb_add_end !! 636                 }
1229                                               !! 637                 if (((protocol == UAC_VERSION_1) && (fmt->bLength < 8)) ||
1230                                               !! 638                     ((protocol == UAC_VERSION_2) && (fmt->bLength < 6))) {
1231                                               !! 639                         dev_err(&dev->dev,
1232                         if (err < 0)          !! 640                                 "%u:%d : invalid UAC_FORMAT_TYPE desc\n",
1233                                 return err;   !! 641                                 iface_no, altno);
                                                   >> 642                         continue;
1234                 }                                643                 }
1235                                                  644 
1236                 set_iface_first = false;      !! 645                 /*
1237                 if (protocol == UAC_VERSION_1 !! 646                  * Blue Microphones workaround: The last altsetting is identical
1238                     (chip->quirk_flags & QUIR !! 647                  * with the previous one, except for a larger packet size, but
1239                         set_iface_first = tru !! 648                  * is actually a mislabeled two-channel setting; ignore it.
                                                   >> 649                  */
                                                   >> 650                 if (fmt->bNrChannels == 1 &&
                                                   >> 651                     fmt->bSubframeSize == 2 &&
                                                   >> 652                     altno == 2 && num == 3 &&
                                                   >> 653                     fp && fp->altsetting == 1 && fp->channels == 1 &&
                                                   >> 654                     fp->formats == SNDRV_PCM_FMTBIT_S16_LE &&
                                                   >> 655                     protocol == UAC_VERSION_1 &&
                                                   >> 656                     le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize) ==
                                                   >> 657                                                         fp->maxpacksize * 2)
                                                   >> 658                         continue;
1240                                                  659 
1241                 /* try to set the interface.. !! 660                 fp = kzalloc(sizeof(*fp), GFP_KERNEL);
1242                 usb_set_interface(chip->dev,  !! 661                 if (! fp) {
1243                 if (set_iface_first)          !! 662                         dev_err(&dev->dev, "cannot malloc\n");
1244                         usb_set_interface(chi !! 663                         return -ENOMEM;
1245                 snd_usb_init_pitch(chip, fp); !! 664                 }
1246                 snd_usb_init_sample_rate(chip << 
1247                 if (!set_iface_first)         << 
1248                         usb_set_interface(chi << 
1249         }                                     << 
1250         return 0;                             << 
1251 }                                             << 
1252                                                  665 
1253 int snd_usb_parse_audio_interface(struct snd_ !! 666                 fp->iface = iface_no;
1254 {                                             !! 667                 fp->altsetting = altno;
1255         int err;                              !! 668                 fp->altset_idx = i;
1256         bool has_non_pcm = false;             !! 669                 fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress;
                                                   >> 670                 fp->ep_attr = get_endpoint(alts, 0)->bmAttributes;
                                                   >> 671                 fp->datainterval = snd_usb_parse_datainterval(chip, alts);
                                                   >> 672                 fp->protocol = protocol;
                                                   >> 673                 fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);
                                                   >> 674                 fp->channels = num_channels;
                                                   >> 675                 if (snd_usb_get_speed(dev) == USB_SPEED_HIGH)
                                                   >> 676                         fp->maxpacksize = (((fp->maxpacksize >> 11) & 3) + 1)
                                                   >> 677                                         * (fp->maxpacksize & 0x7ff);
                                                   >> 678                 fp->attributes = parse_uac_endpoint_attributes(chip, alts, protocol, iface_no);
                                                   >> 679                 fp->clock = clock;
                                                   >> 680                 INIT_LIST_HEAD(&fp->list);
                                                   >> 681 
                                                   >> 682                 /* some quirks for attributes here */
                                                   >> 683 
                                                   >> 684                 switch (chip->usb_id) {
                                                   >> 685                 case USB_ID(0x0a92, 0x0053): /* AudioTrak Optoplay */
                                                   >> 686                         /* Optoplay sets the sample rate attribute although
                                                   >> 687                          * it seems not supporting it in fact.
                                                   >> 688                          */
                                                   >> 689                         fp->attributes &= ~UAC_EP_CS_ATTR_SAMPLE_RATE;
                                                   >> 690                         break;
                                                   >> 691                 case USB_ID(0x041e, 0x3020): /* Creative SB Audigy 2 NX */
                                                   >> 692                 case USB_ID(0x0763, 0x2003): /* M-Audio Audiophile USB */
                                                   >> 693                         /* doesn't set the sample rate attribute, but supports it */
                                                   >> 694                         fp->attributes |= UAC_EP_CS_ATTR_SAMPLE_RATE;
                                                   >> 695                         break;
                                                   >> 696                 case USB_ID(0x0763, 0x2001):  /* M-Audio Quattro USB */
                                                   >> 697                 case USB_ID(0x0763, 0x2012):  /* M-Audio Fast Track Pro USB */
                                                   >> 698                 case USB_ID(0x047f, 0x0ca1): /* plantronics headset */
                                                   >> 699                 case USB_ID(0x077d, 0x07af): /* Griffin iMic (note that there is
                                                   >> 700                                                 an older model 77d:223) */
                                                   >> 701                 /*
                                                   >> 702                  * plantronics headset and Griffin iMic have set adaptive-in
                                                   >> 703                  * although it's really not...
                                                   >> 704                  */
                                                   >> 705                         fp->ep_attr &= ~USB_ENDPOINT_SYNCTYPE;
                                                   >> 706                         if (stream == SNDRV_PCM_STREAM_PLAYBACK)
                                                   >> 707                                 fp->ep_attr |= USB_ENDPOINT_SYNC_ADAPTIVE;
                                                   >> 708                         else
                                                   >> 709                                 fp->ep_attr |= USB_ENDPOINT_SYNC_SYNC;
                                                   >> 710                         break;
                                                   >> 711                 }
1257                                                  712 
1258         /* parse PCM formats */               !! 713                 /* ok, let's parse further... */
1259         err = __snd_usb_parse_audio_interface !! 714                 if (snd_usb_parse_audio_format(chip, fp, format, fmt, stream) < 0) {
1260         if (err < 0)                          !! 715                         kfree(fp->rate_table);
1261                 return err;                   !! 716                         kfree(fp);
                                                   >> 717                         fp = NULL;
                                                   >> 718                         continue;
                                                   >> 719                 }
1262                                                  720 
1263         if (has_non_pcm) {                    !! 721                 /* Create chmap */
1264                 /* parse non-PCM formats */   !! 722                 if (fp->channels != num_channels)
1265                 err = __snd_usb_parse_audio_i !! 723                         chconfig = 0;
1266                 if (err < 0)                  !! 724                 fp->chmap = convert_chmap(fp->channels, chconfig, protocol);
                                                   >> 725 
                                                   >> 726                 dev_dbg(&dev->dev, "%u:%d: add audio endpoint %#x\n", iface_no, altno, fp->endpoint);
                                                   >> 727                 err = snd_usb_add_audio_stream(chip, stream, fp);
                                                   >> 728                 if (err < 0) {
                                                   >> 729                         list_del(&fp->list); /* unlink for avoiding double-free */
                                                   >> 730                         kfree(fp->rate_table);
                                                   >> 731                         kfree(fp->chmap);
                                                   >> 732                         kfree(fp);
1267                         return err;              733                         return err;
                                                   >> 734                 }
                                                   >> 735                 /* try to set the interface... */
                                                   >> 736                 usb_set_interface(chip->dev, iface_no, altno);
                                                   >> 737                 snd_usb_init_pitch(chip, iface_no, alts, fp);
                                                   >> 738                 snd_usb_init_sample_rate(chip, iface_no, alts, fp, fp->rate_max);
1268         }                                        739         }
1269                                               << 
1270         return 0;                                740         return 0;
1271 }                                                741 }
1272                                                  742 
1273                                                  743 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php