]> nv-tegra.nvidia Code Review - linux-2.6.git/blob - sound/usb/pcm.c
Revert "Merge commit 'main-jb-2012.08.03-B4' into t114-0806"
[linux-2.6.git] / sound / usb / pcm.c
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
15  */
16
17 #include <linux/init.h>
18 #include <linux/slab.h>
19 #include <linux/usb.h>
20 #include <linux/usb/audio.h>
21 #include <linux/usb/audio-v2.h>
22
23 #include <sound/core.h>
24 #include <sound/pcm.h>
25 #include <sound/pcm_params.h>
26
27 #include "usbaudio.h"
28 #include "card.h"
29 #include "quirks.h"
30 #include "debug.h"
31 #include "endpoint.h"
32 #include "helper.h"
33 #include "pcm.h"
34 #include "clock.h"
35 #include "power.h"
36
37 /* return the estimated delay based on USB frame counters */
38 snd_pcm_uframes_t snd_usb_pcm_delay(struct snd_usb_substream *subs,
39                                     unsigned int rate)
40 {
41         int current_frame_number;
42         int frame_diff;
43         int est_delay;
44
45         current_frame_number = usb_get_current_frame_number(subs->dev);
46         /*
47          * HCD implementations use different widths, use lower 8 bits.
48          * The delay will be managed up to 256ms, which is more than
49          * enough
50          */
51         frame_diff = (current_frame_number - subs->last_frame_number) & 0xff;
52
53         /* Approximation based on number of samples per USB frame (ms),
54            some truncation for 44.1 but the estimate is good enough */
55         est_delay =  subs->last_delay - (frame_diff * rate / 1000);
56         if (est_delay < 0)
57                 est_delay = 0;
58         return est_delay;
59 }
60
61 /*
62  * return the current pcm pointer.  just based on the hwptr_done value.
63  */
64 static snd_pcm_uframes_t snd_usb_pcm_pointer(struct snd_pcm_substream *substream)
65 {
66         struct snd_usb_substream *subs;
67         unsigned int hwptr_done;
68
69         subs = (struct snd_usb_substream *)substream->runtime->private_data;
70         spin_lock(&subs->lock);
71         hwptr_done = subs->hwptr_done;
72         substream->runtime->delay = snd_usb_pcm_delay(subs,
73                                                 substream->runtime->rate);
74         spin_unlock(&subs->lock);
75         return hwptr_done / (substream->runtime->frame_bits >> 3);
76 }
77
78 /*
79  * find a matching audio format
80  */
81 static struct audioformat *find_format(struct snd_usb_substream *subs, unsigned int format,
82                                        unsigned int rate, unsigned int channels)
83 {
84         struct list_head *p;
85         struct audioformat *found = NULL;
86         int cur_attr = 0, attr;
87
88         list_for_each(p, &subs->fmt_list) {
89                 struct audioformat *fp;
90                 fp = list_entry(p, struct audioformat, list);
91                 if (!(fp->formats & (1uLL << format)))
92                         continue;
93                 if (fp->channels != channels)
94                         continue;
95                 if (rate < fp->rate_min || rate > fp->rate_max)
96                         continue;
97                 if (! (fp->rates & SNDRV_PCM_RATE_CONTINUOUS)) {
98                         unsigned int i;
99                         for (i = 0; i < fp->nr_rates; i++)
100                                 if (fp->rate_table[i] == rate)
101                                         break;
102                         if (i >= fp->nr_rates)
103                                 continue;
104                 }
105                 attr = fp->ep_attr & USB_ENDPOINT_SYNCTYPE;
106                 if (! found) {
107                         found = fp;
108                         cur_attr = attr;
109                         continue;
110                 }
111                 /* avoid async out and adaptive in if the other method
112                  * supports the same format.
113                  * this is a workaround for the case like
114                  * M-audio audiophile USB.
115                  */
116                 if (attr != cur_attr) {
117                         if ((attr == USB_ENDPOINT_SYNC_ASYNC &&
118                              subs->direction == SNDRV_PCM_STREAM_PLAYBACK) ||
119                             (attr == USB_ENDPOINT_SYNC_ADAPTIVE &&
120                              subs->direction == SNDRV_PCM_STREAM_CAPTURE))
121                                 continue;
122                         if ((cur_attr == USB_ENDPOINT_SYNC_ASYNC &&
123                              subs->direction == SNDRV_PCM_STREAM_PLAYBACK) ||
124                             (cur_attr == USB_ENDPOINT_SYNC_ADAPTIVE &&
125                              subs->direction == SNDRV_PCM_STREAM_CAPTURE)) {
126                                 found = fp;
127                                 cur_attr = attr;
128                                 continue;
129                         }
130                 }
131                 /* find the format with the largest max. packet size */
132                 if (fp->maxpacksize > found->maxpacksize) {
133                         found = fp;
134                         cur_attr = attr;
135                 }
136         }
137         return found;
138 }
139
140 static int init_pitch_v1(struct snd_usb_audio *chip, int iface,
141                          struct usb_host_interface *alts,
142                          struct audioformat *fmt)
143 {
144         struct usb_device *dev = chip->dev;
145         unsigned int ep;
146         unsigned char data[1];
147         int err;
148
149         ep = get_endpoint(alts, 0)->bEndpointAddress;
150
151         data[0] = 1;
152         if ((err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), UAC_SET_CUR,
153                                    USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT,
154                                    UAC_EP_CS_ATTR_PITCH_CONTROL << 8, ep,
155                                    data, sizeof(data))) < 0) {
156                 snd_printk(KERN_ERR "%d:%d:%d: cannot set enable PITCH\n",
157                            dev->devnum, iface, ep);
158                 return err;
159         }
160
161         return 0;
162 }
163
164 static int init_pitch_v2(struct snd_usb_audio *chip, int iface,
165                          struct usb_host_interface *alts,
166                          struct audioformat *fmt)
167 {
168         struct usb_device *dev = chip->dev;
169         unsigned char data[1];
170         unsigned int ep;
171         int err;
172
173         ep = get_endpoint(alts, 0)->bEndpointAddress;
174
175         data[0] = 1;
176         if ((err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), UAC2_CS_CUR,
177                                    USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_OUT,
178                                    UAC2_EP_CS_PITCH << 8, 0,
179                                    data, sizeof(data))) < 0) {
180                 snd_printk(KERN_ERR "%d:%d:%d: cannot set enable PITCH (v2)\n",
181                            dev->devnum, iface, fmt->altsetting);
182                 return err;
183         }
184
185         return 0;
186 }
187
188 /*
189  * initialize the pitch control and sample rate
190  */
191 int snd_usb_init_pitch(struct snd_usb_audio *chip, int iface,
192                        struct usb_host_interface *alts,
193                        struct audioformat *fmt)
194 {
195         struct usb_interface_descriptor *altsd = get_iface_desc(alts);
196
197         /* if endpoint doesn't have pitch control, bail out */
198         if (!(fmt->attributes & UAC_EP_CS_ATTR_PITCH_CONTROL))
199                 return 0;
200
201         switch (altsd->bInterfaceProtocol) {
202         case UAC_VERSION_1:
203         default:
204                 return init_pitch_v1(chip, iface, alts, fmt);
205
206         case UAC_VERSION_2:
207                 return init_pitch_v2(chip, iface, alts, fmt);
208         }
209 }
210
211 /*
212  * find a matching format and set up the interface
213  */
214 static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt)
215 {
216         struct usb_device *dev = subs->dev;
217         struct usb_host_interface *alts;
218         struct usb_interface_descriptor *altsd;
219         struct usb_interface *iface;
220         unsigned int ep, attr;
221         int is_playback = subs->direction == SNDRV_PCM_STREAM_PLAYBACK;
222         int err;
223
224         iface = usb_ifnum_to_if(dev, fmt->iface);
225         if (WARN_ON(!iface))
226                 return -EINVAL;
227         alts = &iface->altsetting[fmt->altset_idx];
228         altsd = get_iface_desc(alts);
229         if (WARN_ON(altsd->bAlternateSetting != fmt->altsetting))
230                 return -EINVAL;
231
232         if (fmt == subs->cur_audiofmt)
233                 return 0;
234
235         /* close the old interface */
236         if (subs->interface >= 0 && subs->interface != fmt->iface) {
237                 if (usb_set_interface(subs->dev, subs->interface, 0) < 0) {
238                         snd_printk(KERN_ERR "%d:%d:%d: return to setting 0 failed\n",
239                                 dev->devnum, fmt->iface, fmt->altsetting);
240                         return -EIO;
241                 }
242                 subs->interface = -1;
243                 subs->altset_idx = 0;
244         }
245
246         /* set interface */
247         if (subs->interface != fmt->iface || subs->altset_idx != fmt->altset_idx) {
248                 if (usb_set_interface(dev, fmt->iface, fmt->altsetting) < 0) {
249                         snd_printk(KERN_ERR "%d:%d:%d: usb_set_interface failed\n",
250                                    dev->devnum, fmt->iface, fmt->altsetting);
251                         return -EIO;
252                 }
253                 snd_printdd(KERN_INFO "setting usb interface %d:%d\n", fmt->iface, fmt->altsetting);
254                 subs->interface = fmt->iface;
255                 subs->altset_idx = fmt->altset_idx;
256         }
257
258         /* create a data pipe */
259         ep = fmt->endpoint & USB_ENDPOINT_NUMBER_MASK;
260         if (is_playback)
261                 subs->datapipe = usb_sndisocpipe(dev, ep);
262         else
263                 subs->datapipe = usb_rcvisocpipe(dev, ep);
264         subs->datainterval = fmt->datainterval;
265         subs->syncpipe = subs->syncinterval = 0;
266         subs->maxpacksize = fmt->maxpacksize;
267         subs->syncmaxsize = 0;
268         subs->fill_max = 0;
269
270         /* we need a sync pipe in async OUT or adaptive IN mode */
271         /* check the number of EP, since some devices have broken
272          * descriptors which fool us.  if it has only one EP,
273          * assume it as adaptive-out or sync-in.
274          */
275         attr = fmt->ep_attr & USB_ENDPOINT_SYNCTYPE;
276         if (((is_playback && attr == USB_ENDPOINT_SYNC_ASYNC) ||
277              (! is_playback && attr == USB_ENDPOINT_SYNC_ADAPTIVE)) &&
278             altsd->bNumEndpoints >= 2) {
279                 /* check sync-pipe endpoint */
280                 /* ... and check descriptor size before accessing bSynchAddress
281                    because there is a version of the SB Audigy 2 NX firmware lacking
282                    the audio fields in the endpoint descriptors */
283                 if ((get_endpoint(alts, 1)->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != 0x01 ||
284                     (get_endpoint(alts, 1)->bLength >= USB_DT_ENDPOINT_AUDIO_SIZE &&
285                      get_endpoint(alts, 1)->bSynchAddress != 0)) {
286                         snd_printk(KERN_ERR "%d:%d:%d : invalid synch pipe\n",
287                                    dev->devnum, fmt->iface, fmt->altsetting);
288                         return -EINVAL;
289                 }
290                 ep = get_endpoint(alts, 1)->bEndpointAddress;
291                 if (get_endpoint(alts, 0)->bLength >= USB_DT_ENDPOINT_AUDIO_SIZE &&
292                     (( is_playback && ep != (unsigned int)(get_endpoint(alts, 0)->bSynchAddress | USB_DIR_IN)) ||
293                      (!is_playback && ep != (unsigned int)(get_endpoint(alts, 0)->bSynchAddress & ~USB_DIR_IN)))) {
294                         snd_printk(KERN_ERR "%d:%d:%d : invalid synch pipe\n",
295                                    dev->devnum, fmt->iface, fmt->altsetting);
296                         return -EINVAL;
297                 }
298                 ep &= USB_ENDPOINT_NUMBER_MASK;
299                 if (is_playback)
300                         subs->syncpipe = usb_rcvisocpipe(dev, ep);
301                 else
302                         subs->syncpipe = usb_sndisocpipe(dev, ep);
303                 if (get_endpoint(alts, 1)->bLength >= USB_DT_ENDPOINT_AUDIO_SIZE &&
304                     get_endpoint(alts, 1)->bRefresh >= 1 &&
305                     get_endpoint(alts, 1)->bRefresh <= 9)
306                         subs->syncinterval = get_endpoint(alts, 1)->bRefresh;
307                 else if (snd_usb_get_speed(subs->dev) == USB_SPEED_FULL)
308                         subs->syncinterval = 1;
309                 else if (get_endpoint(alts, 1)->bInterval >= 1 &&
310                          get_endpoint(alts, 1)->bInterval <= 16)
311                         subs->syncinterval = get_endpoint(alts, 1)->bInterval - 1;
312                 else
313                         subs->syncinterval = 3;
314                 subs->syncmaxsize = le16_to_cpu(get_endpoint(alts, 1)->wMaxPacketSize);
315         }
316
317         /* always fill max packet size */
318         if (fmt->attributes & UAC_EP_CS_ATTR_FILL_MAX)
319                 subs->fill_max = 1;
320
321         if ((err = snd_usb_init_pitch(subs->stream->chip, subs->interface, alts, fmt)) < 0)
322                 return err;
323
324         subs->cur_audiofmt = fmt;
325
326         snd_usb_set_format_quirk(subs, fmt);
327
328 #if 0
329         printk(KERN_DEBUG
330                "setting done: format = %d, rate = %d..%d, channels = %d\n",
331                fmt->format, fmt->rate_min, fmt->rate_max, fmt->channels);
332         printk(KERN_DEBUG
333                "  datapipe = 0x%0x, syncpipe = 0x%0x\n",
334                subs->datapipe, subs->syncpipe);
335 #endif
336
337         return 0;
338 }
339
340 /*
341  * hw_params callback
342  *
343  * allocate a buffer and set the given audio format.
344  *
345  * so far we use a physically linear buffer although packetize transfer
346  * doesn't need a continuous area.
347  * if sg buffer is supported on the later version of alsa, we'll follow
348  * that.
349  */
350 static int snd_usb_hw_params(struct snd_pcm_substream *substream,
351                              struct snd_pcm_hw_params *hw_params)
352 {
353         struct snd_usb_substream *subs = substream->runtime->private_data;
354         struct audioformat *fmt;
355         unsigned int channels, rate, format;
356         int ret, changed;
357
358         ret = snd_pcm_lib_alloc_vmalloc_buffer(substream,
359                                                params_buffer_bytes(hw_params));
360         if (ret < 0)
361                 return ret;
362
363         format = params_format(hw_params);
364         rate = params_rate(hw_params);
365         channels = params_channels(hw_params);
366         fmt = find_format(subs, format, rate, channels);
367         if (!fmt) {
368                 snd_printd(KERN_DEBUG "cannot set format: format = %#x, rate = %d, channels = %d\n",
369                            format, rate, channels);
370                 return -EINVAL;
371         }
372
373         changed = subs->cur_audiofmt != fmt ||
374                 subs->period_bytes != params_period_bytes(hw_params) ||
375                 subs->cur_rate != rate;
376         if ((ret = set_format(subs, fmt)) < 0)
377                 return ret;
378
379         if (subs->cur_rate != rate) {
380                 struct usb_host_interface *alts;
381                 struct usb_interface *iface;
382                 iface = usb_ifnum_to_if(subs->dev, fmt->iface);
383                 alts = &iface->altsetting[fmt->altset_idx];
384                 ret = snd_usb_init_sample_rate(subs->stream->chip, subs->interface, alts, fmt, rate);
385                 if (ret < 0)
386                         return ret;
387                 subs->cur_rate = rate;
388         }
389
390         if (changed) {
391                 mutex_lock(&subs->stream->chip->shutdown_mutex);
392                 /* format changed */
393                 snd_usb_release_substream_urbs(subs, 0);
394                 /* influenced: period_bytes, channels, rate, format, */
395                 ret = snd_usb_init_substream_urbs(subs, params_period_bytes(hw_params),
396                                                   params_rate(hw_params),
397                                                   snd_pcm_format_physical_width(params_format(hw_params)) *
398                                                         params_channels(hw_params));
399                 mutex_unlock(&subs->stream->chip->shutdown_mutex);
400         }
401
402         return ret;
403 }
404
405 /*
406  * hw_free callback
407  *
408  * reset the audio format and release the buffer
409  */
410 static int snd_usb_hw_free(struct snd_pcm_substream *substream)
411 {
412         struct snd_usb_substream *subs = substream->runtime->private_data;
413
414         subs->cur_audiofmt = NULL;
415         subs->cur_rate = 0;
416         subs->period_bytes = 0;
417         mutex_lock(&subs->stream->chip->shutdown_mutex);
418         snd_usb_release_substream_urbs(subs, 0);
419         mutex_unlock(&subs->stream->chip->shutdown_mutex);
420         return snd_pcm_lib_free_vmalloc_buffer(substream);
421 }
422
423 /*
424  * prepare callback
425  *
426  * only a few subtle things...
427  */
428 static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream)
429 {
430         struct snd_pcm_runtime *runtime = substream->runtime;
431         struct snd_usb_substream *subs = runtime->private_data;
432
433         if (! subs->cur_audiofmt) {
434                 snd_printk(KERN_ERR "usbaudio: no format is specified!\n");
435                 return -ENXIO;
436         }
437
438         /* some unit conversions in runtime */
439         subs->maxframesize = bytes_to_frames(runtime, subs->maxpacksize);
440         subs->curframesize = bytes_to_frames(runtime, subs->curpacksize);
441
442         /* reset the pointer */
443         subs->hwptr_done = 0;
444         subs->transfer_done = 0;
445         subs->phase = 0;
446         subs->last_delay = 0;
447         subs->last_frame_number = 0;
448         runtime->delay = 0;
449
450         return snd_usb_substream_prepare(subs, runtime);
451 }
452
453 static struct snd_pcm_hardware snd_usb_hardware =
454 {
455         .info =                 SNDRV_PCM_INFO_MMAP |
456                                 SNDRV_PCM_INFO_MMAP_VALID |
457                                 SNDRV_PCM_INFO_BATCH |
458                                 SNDRV_PCM_INFO_INTERLEAVED |
459                                 SNDRV_PCM_INFO_BLOCK_TRANSFER |
460                                 SNDRV_PCM_INFO_PAUSE,
461         .buffer_bytes_max =     1024 * 1024,
462         .period_bytes_min =     64,
463         .period_bytes_max =     512 * 1024,
464         .periods_min =          2,
465         .periods_max =          1024,
466 };
467
468 static int hw_check_valid_format(struct snd_usb_substream *subs,
469                                  struct snd_pcm_hw_params *params,
470                                  struct audioformat *fp)
471 {
472         struct snd_interval *it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
473         struct snd_interval *ct = hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
474         struct snd_mask *fmts = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
475         struct snd_interval *pt = hw_param_interval(params, SNDRV_PCM_HW_PARAM_PERIOD_TIME);
476         struct snd_mask check_fmts;
477         unsigned int ptime;
478
479         /* check the format */
480         snd_mask_none(&check_fmts);
481         check_fmts.bits[0] = (u32)fp->formats;
482         check_fmts.bits[1] = (u32)(fp->formats >> 32);
483         snd_mask_intersect(&check_fmts, fmts);
484         if (snd_mask_empty(&check_fmts)) {
485                 hwc_debug("   > check: no supported format %d\n", fp->format);
486                 return 0;
487         }
488         /* check the channels */
489         if (fp->channels < ct->min || fp->channels > ct->max) {
490                 hwc_debug("   > check: no valid channels %d (%d/%d)\n", fp->channels, ct->min, ct->max);
491                 return 0;
492         }
493         /* check the rate is within the range */
494         if (fp->rate_min > it->max || (fp->rate_min == it->max && it->openmax)) {
495                 hwc_debug("   > check: rate_min %d > max %d\n", fp->rate_min, it->max);
496                 return 0;
497         }
498         if (fp->rate_max < it->min || (fp->rate_max == it->min && it->openmin)) {
499                 hwc_debug("   > check: rate_max %d < min %d\n", fp->rate_max, it->min);
500                 return 0;
501         }
502         /* check whether the period time is >= the data packet interval */
503         if (snd_usb_get_speed(subs->dev) != USB_SPEED_FULL) {
504                 ptime = 125 * (1 << fp->datainterval);
505                 if (ptime > pt->max || (ptime == pt->max && pt->openmax)) {
506                         hwc_debug("   > check: ptime %u > max %u\n", ptime, pt->max);
507                         return 0;
508                 }
509         }
510         return 1;
511 }
512
513 static int hw_rule_rate(struct snd_pcm_hw_params *params,
514                         struct snd_pcm_hw_rule *rule)
515 {
516         struct snd_usb_substream *subs = rule->private;
517         struct list_head *p;
518         struct snd_interval *it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
519         unsigned int rmin, rmax;
520         int changed;
521
522         hwc_debug("hw_rule_rate: (%d,%d)\n", it->min, it->max);
523         changed = 0;
524         rmin = rmax = 0;
525         list_for_each(p, &subs->fmt_list) {
526                 struct audioformat *fp;
527                 fp = list_entry(p, struct audioformat, list);
528                 if (!hw_check_valid_format(subs, params, fp))
529                         continue;
530                 if (changed++) {
531                         if (rmin > fp->rate_min)
532                                 rmin = fp->rate_min;
533                         if (rmax < fp->rate_max)
534                                 rmax = fp->rate_max;
535                 } else {
536                         rmin = fp->rate_min;
537                         rmax = fp->rate_max;
538                 }
539         }
540
541         if (!changed) {
542                 hwc_debug("  --> get empty\n");
543                 it->empty = 1;
544                 return -EINVAL;
545         }
546
547         changed = 0;
548         if (it->min < rmin) {
549                 it->min = rmin;
550                 it->openmin = 0;
551                 changed = 1;
552         }
553         if (it->max > rmax) {
554                 it->max = rmax;
555                 it->openmax = 0;
556                 changed = 1;
557         }
558         if (snd_interval_checkempty(it)) {
559                 it->empty = 1;
560                 return -EINVAL;
561         }
562         hwc_debug("  --> (%d, %d) (changed = %d)\n", it->min, it->max, changed);
563         return changed;
564 }
565
566
567 static int hw_rule_channels(struct snd_pcm_hw_params *params,
568                             struct snd_pcm_hw_rule *rule)
569 {
570         struct snd_usb_substream *subs = rule->private;
571         struct list_head *p;
572         struct snd_interval *it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
573         unsigned int rmin, rmax;
574         int changed;
575
576         hwc_debug("hw_rule_channels: (%d,%d)\n", it->min, it->max);
577         changed = 0;
578         rmin = rmax = 0;
579         list_for_each(p, &subs->fmt_list) {
580                 struct audioformat *fp;
581                 fp = list_entry(p, struct audioformat, list);
582                 if (!hw_check_valid_format(subs, params, fp))
583                         continue;
584                 if (changed++) {
585                         if (rmin > fp->channels)
586                                 rmin = fp->channels;
587                         if (rmax < fp->channels)
588                                 rmax = fp->channels;
589                 } else {
590                         rmin = fp->channels;
591                         rmax = fp->channels;
592                 }
593         }
594
595         if (!changed) {
596                 hwc_debug("  --> get empty\n");
597                 it->empty = 1;
598                 return -EINVAL;
599         }
600
601         changed = 0;
602         if (it->min < rmin) {
603                 it->min = rmin;
604                 it->openmin = 0;
605                 changed = 1;
606         }
607         if (it->max > rmax) {
608                 it->max = rmax;
609                 it->openmax = 0;
610                 changed = 1;
611         }
612         if (snd_interval_checkempty(it)) {
613                 it->empty = 1;
614                 return -EINVAL;
615         }
616         hwc_debug("  --> (%d, %d) (changed = %d)\n", it->min, it->max, changed);
617         return changed;
618 }
619
620 static int hw_rule_format(struct snd_pcm_hw_params *params,
621                           struct snd_pcm_hw_rule *rule)
622 {
623         struct snd_usb_substream *subs = rule->private;
624         struct list_head *p;
625         struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
626         u64 fbits;
627         u32 oldbits[2];
628         int changed;
629
630         hwc_debug("hw_rule_format: %x:%x\n", fmt->bits[0], fmt->bits[1]);
631         fbits = 0;
632         list_for_each(p, &subs->fmt_list) {
633                 struct audioformat *fp;
634                 fp = list_entry(p, struct audioformat, list);
635                 if (!hw_check_valid_format(subs, params, fp))
636                         continue;
637                 fbits |= fp->formats;
638         }
639
640         oldbits[0] = fmt->bits[0];
641         oldbits[1] = fmt->bits[1];
642         fmt->bits[0] &= (u32)fbits;
643         fmt->bits[1] &= (u32)(fbits >> 32);
644         if (!fmt->bits[0] && !fmt->bits[1]) {
645                 hwc_debug("  --> get empty\n");
646                 return -EINVAL;
647         }
648         changed = (oldbits[0] != fmt->bits[0] || oldbits[1] != fmt->bits[1]);
649         hwc_debug("  --> %x:%x (changed = %d)\n", fmt->bits[0], fmt->bits[1], changed);
650         return changed;
651 }
652
653 static int hw_rule_period_time(struct snd_pcm_hw_params *params,
654                                struct snd_pcm_hw_rule *rule)
655 {
656         struct snd_usb_substream *subs = rule->private;
657         struct audioformat *fp;
658         struct snd_interval *it;
659         unsigned char min_datainterval;
660         unsigned int pmin;
661         int changed;
662
663         it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_PERIOD_TIME);
664         hwc_debug("hw_rule_period_time: (%u,%u)\n", it->min, it->max);
665         min_datainterval = 0xff;
666         list_for_each_entry(fp, &subs->fmt_list, list) {
667                 if (!hw_check_valid_format(subs, params, fp))
668                         continue;
669                 min_datainterval = min(min_datainterval, fp->datainterval);
670         }
671         if (min_datainterval == 0xff) {
672                 hwc_debug("  --> get empty\n");
673                 it->empty = 1;
674                 return -EINVAL;
675         }
676         pmin = 125 * (1 << min_datainterval);
677         changed = 0;
678         if (it->min < pmin) {
679                 it->min = pmin;
680                 it->openmin = 0;
681                 changed = 1;
682         }
683         if (snd_interval_checkempty(it)) {
684                 it->empty = 1;
685                 return -EINVAL;
686         }
687         hwc_debug("  --> (%u,%u) (changed = %d)\n", it->min, it->max, changed);
688         return changed;
689 }
690
691 /*
692  *  If the device supports unusual bit rates, does the request meet these?
693  */
694 static int snd_usb_pcm_check_knot(struct snd_pcm_runtime *runtime,
695                                   struct snd_usb_substream *subs)
696 {
697         struct audioformat *fp;
698         int *rate_list;
699         int count = 0, needs_knot = 0;
700         int err;
701
702         kfree(subs->rate_list.list);
703         subs->rate_list.list = NULL;
704
705         list_for_each_entry(fp, &subs->fmt_list, list) {
706                 if (fp->rates & SNDRV_PCM_RATE_CONTINUOUS)
707                         return 0;
708                 count += fp->nr_rates;
709                 if (fp->rates & SNDRV_PCM_RATE_KNOT)
710                         needs_knot = 1;
711         }
712         if (!needs_knot)
713                 return 0;
714
715         subs->rate_list.list = rate_list =
716                 kmalloc(sizeof(int) * count, GFP_KERNEL);
717         if (!subs->rate_list.list)
718                 return -ENOMEM;
719         subs->rate_list.count = count;
720         subs->rate_list.mask = 0;
721         count = 0;
722         list_for_each_entry(fp, &subs->fmt_list, list) {
723                 int i;
724                 for (i = 0; i < fp->nr_rates; i++)
725                         rate_list[count++] = fp->rate_table[i];
726         }
727         err = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
728                                          &subs->rate_list);
729         if (err < 0)
730                 return err;
731
732         return 0;
733 }
734
735
736 /*
737  * set up the runtime hardware information.
738  */
739
740 static int setup_hw_info(struct snd_pcm_runtime *runtime, struct snd_usb_substream *subs)
741 {
742         struct list_head *p;
743         unsigned int pt, ptmin;
744         int param_period_time_if_needed;
745         int err;
746
747         runtime->hw.formats = subs->formats;
748
749         runtime->hw.rate_min = 0x7fffffff;
750         runtime->hw.rate_max = 0;
751         runtime->hw.channels_min = 256;
752         runtime->hw.channels_max = 0;
753         runtime->hw.rates = 0;
754         ptmin = UINT_MAX;
755         /* check min/max rates and channels */
756         list_for_each(p, &subs->fmt_list) {
757                 struct audioformat *fp;
758                 fp = list_entry(p, struct audioformat, list);
759                 runtime->hw.rates |= fp->rates;
760                 if (runtime->hw.rate_min > fp->rate_min)
761                         runtime->hw.rate_min = fp->rate_min;
762                 if (runtime->hw.rate_max < fp->rate_max)
763                         runtime->hw.rate_max = fp->rate_max;
764                 if (runtime->hw.channels_min > fp->channels)
765                         runtime->hw.channels_min = fp->channels;
766                 if (runtime->hw.channels_max < fp->channels)
767                         runtime->hw.channels_max = fp->channels;
768                 if (fp->fmt_type == UAC_FORMAT_TYPE_II && fp->frame_size > 0) {
769                         /* FIXME: there might be more than one audio formats... */
770                         runtime->hw.period_bytes_min = runtime->hw.period_bytes_max =
771                                 fp->frame_size;
772                 }
773                 pt = 125 * (1 << fp->datainterval);
774                 ptmin = min(ptmin, pt);
775         }
776         err = snd_usb_autoresume(subs->stream->chip);
777         if (err < 0)
778                 return err;
779
780         param_period_time_if_needed = SNDRV_PCM_HW_PARAM_PERIOD_TIME;
781         if (snd_usb_get_speed(subs->dev) == USB_SPEED_FULL)
782                 /* full speed devices have fixed data packet interval */
783                 ptmin = 1000;
784         if (ptmin == 1000)
785                 /* if period time doesn't go below 1 ms, no rules needed */
786                 param_period_time_if_needed = -1;
787         snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_TIME,
788                                      ptmin, UINT_MAX);
789
790         if ((err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
791                                        hw_rule_rate, subs,
792                                        SNDRV_PCM_HW_PARAM_FORMAT,
793                                        SNDRV_PCM_HW_PARAM_CHANNELS,
794                                        param_period_time_if_needed,
795                                        -1)) < 0)
796                 goto rep_err;
797         if ((err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
798                                        hw_rule_channels, subs,
799                                        SNDRV_PCM_HW_PARAM_FORMAT,
800                                        SNDRV_PCM_HW_PARAM_RATE,
801                                        param_period_time_if_needed,
802                                        -1)) < 0)
803                 goto rep_err;
804         if ((err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_FORMAT,
805                                        hw_rule_format, subs,
806                                        SNDRV_PCM_HW_PARAM_RATE,
807                                        SNDRV_PCM_HW_PARAM_CHANNELS,
808                                        param_period_time_if_needed,
809                                        -1)) < 0)
810                 goto rep_err;
811         if (param_period_time_if_needed >= 0) {
812                 err = snd_pcm_hw_rule_add(runtime, 0,
813                                           SNDRV_PCM_HW_PARAM_PERIOD_TIME,
814                                           hw_rule_period_time, subs,
815                                           SNDRV_PCM_HW_PARAM_FORMAT,
816                                           SNDRV_PCM_HW_PARAM_CHANNELS,
817                                           SNDRV_PCM_HW_PARAM_RATE,
818                                           -1);
819                 if (err < 0)
820                         goto rep_err;
821         }
822         if ((err = snd_usb_pcm_check_knot(runtime, subs)) < 0)
823                 goto rep_err;
824         return 0;
825
826 rep_err:
827         snd_usb_autosuspend(subs->stream->chip);
828         return err;
829 }
830
831 static int snd_usb_pcm_open(struct snd_pcm_substream *substream, int direction)
832 {
833         struct snd_usb_stream *as = snd_pcm_substream_chip(substream);
834         struct snd_pcm_runtime *runtime = substream->runtime;
835         struct snd_usb_substream *subs = &as->substream[direction];
836
837         subs->interface = -1;
838         subs->altset_idx = 0;
839         runtime->hw = snd_usb_hardware;
840         runtime->private_data = subs;
841         subs->pcm_substream = substream;
842         /* runtime PM is also done there */
843         return setup_hw_info(runtime, subs);
844 }
845
846 static int snd_usb_pcm_close(struct snd_pcm_substream *substream, int direction)
847 {
848         struct snd_usb_stream *as = snd_pcm_substream_chip(substream);
849         struct snd_usb_substream *subs = &as->substream[direction];
850
851         if (!as->chip->shutdown && subs->interface >= 0) {
852                 usb_set_interface(subs->dev, subs->interface, 0);
853                 subs->interface = -1;
854         }
855         subs->pcm_substream = NULL;
856         snd_usb_autosuspend(subs->stream->chip);
857         return 0;
858 }
859
860 static int snd_usb_playback_open(struct snd_pcm_substream *substream)
861 {
862         return snd_usb_pcm_open(substream, SNDRV_PCM_STREAM_PLAYBACK);
863 }
864
865 static int snd_usb_playback_close(struct snd_pcm_substream *substream)
866 {
867         return snd_usb_pcm_close(substream, SNDRV_PCM_STREAM_PLAYBACK);
868 }
869
870 static int snd_usb_capture_open(struct snd_pcm_substream *substream)
871 {
872         return snd_usb_pcm_open(substream, SNDRV_PCM_STREAM_CAPTURE);
873 }
874
875 static int snd_usb_capture_close(struct snd_pcm_substream *substream)
876 {
877         return snd_usb_pcm_close(substream, SNDRV_PCM_STREAM_CAPTURE);
878 }
879
880 static struct snd_pcm_ops snd_usb_playback_ops = {
881         .open =         snd_usb_playback_open,
882         .close =        snd_usb_playback_close,
883         .ioctl =        snd_pcm_lib_ioctl,
884         .hw_params =    snd_usb_hw_params,
885         .hw_free =      snd_usb_hw_free,
886         .prepare =      snd_usb_pcm_prepare,
887         .trigger =      snd_usb_substream_playback_trigger,
888         .pointer =      snd_usb_pcm_pointer,
889         .page =         snd_pcm_lib_get_vmalloc_page,
890         .mmap =         snd_pcm_lib_mmap_vmalloc,
891 };
892
893 static struct snd_pcm_ops snd_usb_capture_ops = {
894         .open =         snd_usb_capture_open,
895         .close =        snd_usb_capture_close,
896         .ioctl =        snd_pcm_lib_ioctl,
897         .hw_params =    snd_usb_hw_params,
898         .hw_free =      snd_usb_hw_free,
899         .prepare =      snd_usb_pcm_prepare,
900         .trigger =      snd_usb_substream_capture_trigger,
901         .pointer =      snd_usb_pcm_pointer,
902         .page =         snd_pcm_lib_get_vmalloc_page,
903         .mmap =         snd_pcm_lib_mmap_vmalloc,
904 };
905
906 void snd_usb_set_pcm_ops(struct snd_pcm *pcm, int stream)
907 {
908         snd_pcm_set_ops(pcm, stream,
909                         stream == SNDRV_PCM_STREAM_PLAYBACK ?
910                         &snd_usb_playback_ops : &snd_usb_capture_ops);
911 }