~ [ 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-6.1.114)


** Warning: Cannot open xref database.

  1 // SPDX-License-Identifier: GPL-2.0-or-later        1 
  2 /*                                                
  3  */                                               
  4                                                   
  5                                                   
  6 #include <linux/init.h>                           
  7 #include <linux/slab.h>                           
  8 #include <linux/usb.h>                            
  9 #include <linux/usb/audio.h>                      
 10 #include <linux/usb/audio-v2.h>                   
 11 #include <linux/usb/audio-v3.h>                   
 12                                                   
 13 #include <sound/core.h>                           
 14 #include <sound/pcm.h>                            
 15 #include <sound/control.h>                        
 16 #include <sound/tlv.h>                            
 17                                                   
 18 #include "usbaudio.h"                             
 19 #include "card.h"                                 
 20 #include "proc.h"                                 
 21 #include "quirks.h"                               
 22 #include "endpoint.h"                             
 23 #include "pcm.h"                                  
 24 #include "helper.h"                               
 25 #include "format.h"                               
 26 #include "clock.h"                                
 27 #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 /*                                                
 40  * free a substream                               
 41  */                                               
 42 static void free_substream(struct snd_usb_subs    
 43 {                                                 
 44         struct audioformat *fp, *n;               
 45                                                   
 46         if (!subs->num_formats)                   
 47                 return; /* not initialized */     
 48         list_for_each_entry_safe(fp, n, &subs-    
 49                 audioformat_free(fp);             
 50         kfree(subs->str_pd);                      
 51         snd_media_stream_delete(subs);            
 52 }                                                 
 53                                                   
 54                                                   
 55 /*                                                
 56  * free a usb stream instance                     
 57  */                                               
 58 static void snd_usb_audio_stream_free(struct s    
 59 {                                                 
 60         free_substream(&stream->substream[0]);    
 61         free_substream(&stream->substream[1]);    
 62         list_del(&stream->list);                  
 63         kfree(stream);                            
 64 }                                                 
 65                                                   
 66 static void snd_usb_audio_pcm_free(struct snd_    
 67 {                                                 
 68         struct snd_usb_stream *stream = pcm->p    
 69         if (stream) {                             
 70                 stream->pcm = NULL;               
 71                 snd_usb_audio_stream_free(stre    
 72         }                                         
 73 }                                                 
 74                                                   
 75 /*                                                
 76  * initialize the substream instance.             
 77  */                                               
 78                                                   
 79 static void snd_usb_init_substream(struct snd_    
 80                                    int stream,    
 81                                    struct audi    
 82                                    struct snd_    
 83 {                                                 
 84         struct snd_usb_substream *subs = &as->    
 85                                                   
 86         INIT_LIST_HEAD(&subs->fmt_list);          
 87         spin_lock_init(&subs->lock);              
 88                                                   
 89         subs->stream = as;                        
 90         subs->direction = stream;                 
 91         subs->dev = as->chip->dev;                
 92         subs->txfr_quirk = !!(as->chip->quirk_    
 93         subs->tx_length_quirk = !!(as->chip->q    
 94         subs->speed = snd_usb_get_speed(subs->    
 95         subs->pkt_offset_adj = 0;                 
 96         subs->stream_offset_adj = 0;              
 97                                                   
 98         snd_usb_set_pcm_ops(as->pcm, stream);     
 99                                                   
100         list_add_tail(&fp->list, &subs->fmt_li    
101         subs->formats |= fp->formats;             
102         subs->num_formats++;                      
103         subs->fmt_type = fp->fmt_type;            
104         subs->ep_num = fp->endpoint;              
105         if (fp->channels > subs->channels_max)    
106                 subs->channels_max = fp->chann    
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 }                                                 
117                                                   
118 /* kctl callbacks for usb-audio channel maps *    
119 static int usb_chmap_ctl_info(struct snd_kcont    
120                               struct snd_ctl_e    
121 {                                                 
122         struct snd_pcm_chmap *info = snd_kcont    
123         struct snd_usb_substream *subs = info-    
124                                                   
125         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTE    
126         uinfo->count = subs->channels_max;        
127         uinfo->value.integer.min = 0;             
128         uinfo->value.integer.max = SNDRV_CHMAP    
129         return 0;                                 
130 }                                                 
131                                                   
132 /* check whether a duplicated entry exists in     
133 static bool have_dup_chmap(struct snd_usb_subs    
134                            struct audioformat     
135 {                                                 
136         struct audioformat *prev = fp;            
137                                                   
138         list_for_each_entry_continue_reverse(p    
139                 if (prev->chmap &&                
140                     !memcmp(prev->chmap, fp->c    
141                         return true;              
142         }                                         
143         return false;                             
144 }                                                 
145                                                   
146 static int usb_chmap_ctl_tlv(struct snd_kcontr    
147                              unsigned int size    
148 {                                                 
149         struct snd_pcm_chmap *info = snd_kcont    
150         struct snd_usb_substream *subs = info-    
151         struct audioformat *fp;                   
152         unsigned int __user *dst;                 
153         int count = 0;                            
154                                                   
155         if (size < 8)                             
156                 return -ENOMEM;                   
157         if (put_user(SNDRV_CTL_TLVT_CONTAINER,    
158                 return -EFAULT;                   
159         size -= 8;                                
160         dst = tlv + 2;                            
161         list_for_each_entry(fp, &subs->fmt_lis    
162                 int i, ch_bytes;                  
163                                                   
164                 if (!fp->chmap)                   
165                         continue;                 
166                 if (have_dup_chmap(subs, fp))     
167                         continue;                 
168                 /* copy the entry */              
169                 ch_bytes = fp->chmap->channels    
170                 if (size < 8 + ch_bytes)          
171                         return -ENOMEM;           
172                 if (put_user(SNDRV_CTL_TLVT_CH    
173                     put_user(ch_bytes, dst + 1    
174                         return -EFAULT;           
175                 dst += 2;                         
176                 for (i = 0; i < fp->chmap->cha    
177                         if (put_user(fp->chmap    
178                                 return -EFAULT    
179                 }                                 
180                                                   
181                 count += 8 + ch_bytes;            
182                 size -= 8 + ch_bytes;             
183         }                                         
184         if (put_user(count, tlv + 1))             
185                 return -EFAULT;                   
186         return 0;                                 
187 }                                                 
188                                                   
189 static int usb_chmap_ctl_get(struct snd_kcontr    
190                              struct snd_ctl_el    
191 {                                                 
192         struct snd_pcm_chmap *info = snd_kcont    
193         struct snd_usb_substream *subs = info-    
194         struct snd_pcm_chmap_elem *chmap = NUL    
195         int i = 0;                                
196                                                   
197         if (subs->cur_audiofmt)                   
198                 chmap = subs->cur_audiofmt->ch    
199         if (chmap) {                              
200                 for (i = 0; i < chmap->channel    
201                         ucontrol->value.intege    
202         }                                         
203         for (; i < subs->channels_max; i++)       
204                 ucontrol->value.integer.value[    
205         return 0;                                 
206 }                                                 
207                                                   
208 /* create a chmap kctl assigned to the given U    
209 static int add_chmap(struct snd_pcm *pcm, int     
210                      struct snd_usb_substream     
211 {                                                 
212         struct audioformat *fp;                   
213         struct snd_pcm_chmap *chmap;              
214         struct snd_kcontrol *kctl;                
215         int err;                                  
216                                                   
217         list_for_each_entry(fp, &subs->fmt_lis    
218                 if (fp->chmap)                    
219                         goto ok;                  
220         /* no chmap is found */                   
221         return 0;                                 
222                                                   
223  ok:                                              
224         err = snd_pcm_add_chmap_ctls(pcm, stre    
225         if (err < 0)                              
226                 return err;                       
227                                                   
228         /* override handlers */                   
229         chmap->private_data = subs;               
230         kctl = chmap->kctl;                       
231         kctl->info = usb_chmap_ctl_info;          
232         kctl->get = usb_chmap_ctl_get;            
233         kctl->tlv.c = usb_chmap_ctl_tlv;          
234                                                   
235         return 0;                                 
236 }                                                 
237                                                   
238 /* convert from USB ChannelConfig bits to ALSA    
239 static struct snd_pcm_chmap_elem *convert_chma    
240                                                   
241 {                                                 
242         static const unsigned int uac1_maps[]     
243                 SNDRV_CHMAP_FL,         /* lef    
244                 SNDRV_CHMAP_FR,         /* rig    
245                 SNDRV_CHMAP_FC,         /* cen    
246                 SNDRV_CHMAP_LFE,        /* LFE    
247                 SNDRV_CHMAP_RL,         /* lef    
248                 SNDRV_CHMAP_RR,         /* rig    
249                 SNDRV_CHMAP_FLC,        /* lef    
250                 SNDRV_CHMAP_FRC,        /* rig    
251                 SNDRV_CHMAP_RC,         /* sur    
252                 SNDRV_CHMAP_SL,         /* sid    
253                 SNDRV_CHMAP_SR,         /* sid    
254                 SNDRV_CHMAP_TC,         /* top    
255                 0 /* terminator */                
256         };                                        
257         static const unsigned int uac2_maps[]     
258                 SNDRV_CHMAP_FL,         /* fro    
259                 SNDRV_CHMAP_FR,         /* fro    
260                 SNDRV_CHMAP_FC,         /* fro    
261                 SNDRV_CHMAP_LFE,        /* LFE    
262                 SNDRV_CHMAP_RL,         /* bac    
263                 SNDRV_CHMAP_RR,         /* bac    
264                 SNDRV_CHMAP_FLC,        /* fro    
265                 SNDRV_CHMAP_FRC,        /* fro    
266                 SNDRV_CHMAP_RC,         /* bac    
267                 SNDRV_CHMAP_SL,         /* sid    
268                 SNDRV_CHMAP_SR,         /* sid    
269                 SNDRV_CHMAP_TC,         /* top    
270                 SNDRV_CHMAP_TFL,        /* top    
271                 SNDRV_CHMAP_TFC,        /* top    
272                 SNDRV_CHMAP_TFR,        /* top    
273                 SNDRV_CHMAP_TRL,        /* top    
274                 SNDRV_CHMAP_TRC,        /* top    
275                 SNDRV_CHMAP_TRR,        /* top    
276                 SNDRV_CHMAP_TFLC,       /* top    
277                 SNDRV_CHMAP_TFRC,       /* top    
278                 SNDRV_CHMAP_LLFE,       /* lef    
279                 SNDRV_CHMAP_RLFE,       /* rig    
280                 SNDRV_CHMAP_TSL,        /* top    
281                 SNDRV_CHMAP_TSR,        /* top    
282                 SNDRV_CHMAP_BC,         /* bot    
283                 SNDRV_CHMAP_RLC,        /* bac    
284                 SNDRV_CHMAP_RRC,        /* bac    
285                 0 /* terminator */                
286         };                                        
287         struct snd_pcm_chmap_elem *chmap;         
288         const unsigned int *maps;                 
289         int c;                                    
290                                                   
291         if (channels > ARRAY_SIZE(chmap->map))    
292                 return NULL;                      
293                                                   
294         chmap = kzalloc(sizeof(*chmap), GFP_KE    
295         if (!chmap)                               
296                 return NULL;                      
297                                                   
298         maps = protocol == UAC_VERSION_2 ? uac    
299         chmap->channels = channels;               
300         c = 0;                                    
301                                                   
302         if (bits) {                               
303                 for (; bits && *maps; maps++,     
304                         if (bits & 1)             
305                                 chmap->map[c++    
306                         if (c == chmap->channe    
307                                 break;            
308                 }                                 
309         } else {                                  
310                 /* If we're missing wChannelCo    
311                     to make sure the channel m    
312                 if (channels == 1)                
313                         chmap->map[c++] = SNDR    
314                 else                              
315                         for (; c < channels &&    
316                                 chmap->map[c++    
317         }                                         
318                                                   
319         for (; c < channels; c++)                 
320                 chmap->map[c] = SNDRV_CHMAP_UN    
321                                                   
322         return chmap;                             
323 }                                                 
324                                                   
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 /*                                                
473  * add this endpoint to the chip instance.        
474  * if a stream with the same endpoint already     
475  * if not, create a new pcm stream. note, fp i    
476  * fmt_list and will be freed on the chip inst    
477  * fp or do remove it from the substream fmt_l    
478  */                                               
479 static int __snd_usb_add_audio_stream(struct s    
480                                       int stre    
481                                       struct a    
482                                       struct s    
483                                                   
484 {                                                 
485         struct snd_usb_stream *as;                
486         struct snd_usb_substream *subs;           
487         struct snd_pcm *pcm;                      
488         int err;                                  
489                                                   
490         list_for_each_entry(as, &chip->pcm_lis    
491                 if (as->fmt_type != fp->fmt_ty    
492                         continue;                 
493                 subs = &as->substream[stream];    
494                 if (subs->ep_num == fp->endpoi    
495                         list_add_tail(&fp->lis    
496                         subs->num_formats++;      
497                         subs->formats |= fp->f    
498                         return 0;                 
499                 }                                 
500         }                                         
501                                                   
502         if (chip->card->registered)               
503                 chip->need_delayed_register =     
504                                                   
505         /* look for an empty stream */            
506         list_for_each_entry(as, &chip->pcm_lis    
507                 if (as->fmt_type != fp->fmt_ty    
508                         continue;                 
509                 subs = &as->substream[stream];    
510                 if (subs->ep_num)                 
511                         continue;                 
512                 err = snd_pcm_new_stream(as->p    
513                 if (err < 0)                      
514                         return err;               
515                 snd_usb_init_substream(as, str    
516                 return add_chmap(as->pcm, stre    
517         }                                         
518                                                   
519         /* create a new pcm */                    
520         as = kzalloc(sizeof(*as), GFP_KERNEL);    
521         if (!as)                                  
522                 return -ENOMEM;                   
523         as->pcm_index = chip->pcm_devs;           
524         as->chip = chip;                          
525         as->fmt_type = fp->fmt_type;              
526         err = snd_pcm_new(chip->card, "USB Aud    
527                           stream == SNDRV_PCM_    
528                           stream == SNDRV_PCM_    
529                           &pcm);                  
530         if (err < 0) {                            
531                 kfree(as);                        
532                 return err;                       
533         }                                         
534         as->pcm = pcm;                            
535         pcm->private_data = as;                   
536         pcm->private_free = snd_usb_audio_pcm_    
537         pcm->info_flags = 0;                      
538         if (chip->pcm_devs > 0)                   
539                 sprintf(pcm->name, "USB Audio     
540         else                                      
541                 strcpy(pcm->name, "USB Audio")    
542                                                   
543         snd_usb_init_substream(as, stream, fp,    
544                                                   
545         /*                                        
546          * Keep using head insertion for M-Aud    
547          * fix to swap capture stream order in    
548          */                                       
549         if (chip->usb_id == USB_ID(0x0763, 0x2    
550                 list_add(&as->list, &chip->pcm    
551         else                                      
552                 list_add_tail(&as->list, &chip    
553                                                   
554         chip->pcm_devs++;                         
555                                                   
556         snd_usb_proc_pcm_format_add(as);          
557                                                   
558         return add_chmap(pcm, stream, &as->sub    
559 }                                                 
560                                                   
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    
577                                          struc    
578                                          int p    
579 {                                                 
580         /* parsed with a v1 header here. that'    
581          * header first which is the same for     
582         struct uac_iso_endpoint_descriptor *cs    
583         struct usb_interface_descriptor *altsd    
584         int attributes = 0;                       
585                                                   
586         csep = snd_usb_find_desc(alts->endpoin    
587                                                   
588         /* Creamware Noah has this descriptor     
589         if (!csep && altsd->bNumEndpoints >= 2    
590                 csep = snd_usb_find_desc(alts-    
591                                                   
592         /*                                        
593          * If we can't locate the USB_DT_CS_EN    
594          * bytes after the first endpoint, go     
595          * Some devices have it directly *befo    
596          */                                       
597         if (!csep)                                
598                 csep = snd_usb_find_desc(alts-    
599                                                   
600         if (!csep || csep->bLength < 7 ||         
601             csep->bDescriptorSubtype != UAC_EP    
602                 goto error;                       
603                                                   
604         if (protocol == UAC_VERSION_1) {          
605                 attributes = csep->bmAttribute    
606         } else if (protocol == UAC_VERSION_2)     
607                 struct uac2_iso_endpoint_descr    
608                         (struct uac2_iso_endpo    
609                                                   
610                 if (csep2->bLength < sizeof(*c    
611                         goto error;               
612                 attributes = csep->bmAttribute    
613                                                   
614                 /* emulate the endpoint attrib    
615                 if (csep2->bmControls & UAC2_C    
616                         attributes |= UAC_EP_C    
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         }                                         
627                                                   
628         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 }                                                 
636                                                   
637 /* find an input terminal descriptor (either U    
638  * terminal id                                    
639  */                                               
640 static void *                                     
641 snd_usb_find_input_terminal_descriptor(struct     
642                                        int ter    
643 {                                                 
644         struct uac2_input_terminal_descriptor     
645                                                   
646         while ((term = snd_usb_find_csint_desc    
647                                                   
648                                                   
649                 if (!snd_usb_validate_audio_de    
650                         continue;                 
651                 if (term->bTerminalID == termi    
652                         return term;              
653         }                                         
654                                                   
655         return NULL;                              
656 }                                                 
657                                                   
658 static void *                                     
659 snd_usb_find_output_terminal_descriptor(struct    
660                                         int te    
661 {                                                 
662         /* OK to use with both UAC2 and UAC3 *    
663         struct uac2_output_terminal_descriptor    
664                                                   
665         while ((term = snd_usb_find_csint_desc    
666                                                   
667                                                   
668                 if (!snd_usb_validate_audio_de    
669                         continue;                 
670                 if (term->bTerminalID == termi    
671                         return term;              
672         }                                         
673                                                   
674         return NULL;                              
675 }                                                 
676                                                   
677 static struct audioformat *                       
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 {                                                
1098         struct usb_device *dev;                  
1099         struct usb_interface *iface;             
1100         struct usb_host_interface *alts;         
1101         struct usb_interface_descriptor *alts    
1102         int i, altno, err, stream;               
1103         struct audioformat *fp = NULL;           
1104         struct snd_usb_power_domain *pd = NUL    
1105         bool set_iface_first;                    
1106         int num, protocol;                       
1107                                                  
1108         dev = chip->dev;                         
1109                                                  
1110         /* parse the interface's altsettings     
1111         iface = usb_ifnum_to_if(dev, iface_no    
1112                                                  
1113         num = iface->num_altsetting;             
1114                                                  
1115         /*                                       
1116          * Dallas DS4201 workaround: It prese    
1117          * one misses syncpipe, and does not     
1118          */                                      
1119         if (chip->usb_id == USB_ID(0x04fa, 0x    
1120                 num = 4;                         
1121                                                  
1122         for (i = 0; i < num; i++) {              
1123                 alts = &iface->altsetting[i];    
1124                 altsd = get_iface_desc(alts);    
1125                 protocol = altsd->bInterfaceP    
1126                 /* skip invalid one */           
1127                 if (((altsd->bInterfaceClass     
1128                       (altsd->bInterfaceSubCl    
1129                        altsd->bInterfaceSubCl    
1130                      altsd->bInterfaceClass !    
1131                     altsd->bNumEndpoints < 1     
1132                     le16_to_cpu(get_endpoint(    
1133                         continue;                
1134                 /* must be isochronous */        
1135                 if ((get_endpoint(alts, 0)->b    
1136                     USB_ENDPOINT_XFER_ISOC)      
1137                         continue;                
1138                 /* check direction */            
1139                 stream = (get_endpoint(alts,     
1140                         SNDRV_PCM_STREAM_CAPT    
1141                 altno = altsd->bAlternateSett    
1142                                                  
1143                 if (snd_usb_apply_interface_q    
1144                         continue;                
1145                                                  
1146                 /*                               
1147                  * Roland audio streaming int    
1148                  * 0/1/2, but are UAC 1 compa    
1149                  */                              
1150                 if (USB_ID_VENDOR(chip->usb_i    
1151                     altsd->bInterfaceClass ==    
1152                     protocol <= 2)               
1153                         protocol = UAC_VERSIO    
1154                                                  
1155                 switch (protocol) {              
1156                 default:                         
1157                         dev_dbg(&dev->dev, "%    
1158                                 iface_no, alt    
1159                         protocol = UAC_VERSIO    
1160                         fallthrough;             
1161                 case UAC_VERSION_1:              
1162                 case UAC_VERSION_2: {            
1163                         int bm_quirk = 0;        
1164                                                  
1165                         /*                       
1166                          * Blue Microphones w    
1167                          * identical with the    
1168                          * packet size, but i    
1169                          * setting; ignore it    
1170                          *                       
1171                          * Part 1: prepare qu    
1172                          */                      
1173                         if (altno == 2 && num    
1174                             fp && fp->altsett    
1175                             fp->formats == SN    
1176                             protocol == UAC_V    
1177                             le16_to_cpu(get_e    
1178                                                  
1179                                 bm_quirk = 1;    
1180                                                  
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;                   
1190                 }                                
1191                                                  
1192                 if (!fp)                         
1193                         continue;                
1194                 else if (IS_ERR(fp))             
1195                         return PTR_ERR(fp);      
1196                                                  
1197                 if (fp->fmt_type != UAC_FORMA    
1198                         *has_non_pcm = true;     
1199                 if ((fp->fmt_type == UAC_FORM    
1200                         audioformat_free(fp);    
1201                         kfree(pd);               
1202                         fp = NULL;               
1203                         pd = NULL;               
1204                         continue;                
1205                 }                                
1206                                                  
1207                 snd_usb_audioformat_set_sync_    
1208                                                  
1209                 dev_dbg(&dev->dev, "%u:%d: ad    
1210                 if (protocol == UAC_VERSION_3    
1211                         err = snd_usb_add_aud    
1212                 else                             
1213                         err = snd_usb_add_aud    
1214                                                  
1215                 if (err < 0) {                   
1216                         audioformat_free(fp);    
1217                         kfree(pd);               
1218                         return err;              
1219                 }                                
1220                                                  
1221                 /* add endpoints */              
1222                 err = snd_usb_add_endpoint(ch    
1223                                            SN    
1224                 if (err < 0)                     
1225                         return err;              
1226                                                  
1227                 if (fp->sync_ep) {               
1228                         err = snd_usb_add_end    
1229                                                  
1230                                                  
1231                                                  
1232                         if (err < 0)             
1233                                 return err;      
1234                 }                                
1235                                                  
1236                 set_iface_first = false;         
1237                 if (protocol == UAC_VERSION_1    
1238                     (chip->quirk_flags & QUIR    
1239                         set_iface_first = tru    
1240                                                  
1241                 /* try to set the interface..    
1242                 usb_set_interface(chip->dev,     
1243                 if (set_iface_first)             
1244                         usb_set_interface(chi    
1245                 snd_usb_init_pitch(chip, fp);    
1246                 snd_usb_init_sample_rate(chip    
1247                 if (!set_iface_first)            
1248                         usb_set_interface(chi    
1249         }                                        
1250         return 0;                                
1251 }                                                
1252                                                  
1253 int snd_usb_parse_audio_interface(struct snd_    
1254 {                                                
1255         int err;                                 
1256         bool has_non_pcm = false;                
1257                                                  
1258         /* parse PCM formats */                  
1259         err = __snd_usb_parse_audio_interface    
1260         if (err < 0)                             
1261                 return err;                      
1262                                                  
1263         if (has_non_pcm) {                       
1264                 /* parse non-PCM formats */      
1265                 err = __snd_usb_parse_audio_i    
1266                 if (err < 0)                     
1267                         return err;              
1268         }                                        
1269                                                  
1270         return 0;                                
1271 }                                                
1272                                                  
1273                                                  

~ [ 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