1bc700ab1SDaniel Mack /* 2bc700ab1SDaniel Mack * Edirol UA-101/UA-1000 driver 3bc700ab1SDaniel Mack * Copyright (c) Clemens Ladisch <clemens@ladisch.de> 4bc700ab1SDaniel Mack * 5bc700ab1SDaniel Mack * This driver is free software: you can redistribute it and/or modify 6bc700ab1SDaniel Mack * it under the terms of the GNU General Public License, version 2. 7bc700ab1SDaniel Mack * 8bc700ab1SDaniel Mack * This driver is distributed in the hope that it will be useful, 9bc700ab1SDaniel Mack * but WITHOUT ANY WARRANTY; without even the implied warranty of 10bc700ab1SDaniel Mack * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11bc700ab1SDaniel Mack * GNU General Public License for more details. 12bc700ab1SDaniel Mack * 13bc700ab1SDaniel Mack * You should have received a copy of the GNU General Public License 14bc700ab1SDaniel Mack * along with this driver. If not, see <http://www.gnu.org/licenses/>. 15bc700ab1SDaniel Mack */ 16bc700ab1SDaniel Mack 17bc700ab1SDaniel Mack #include <linux/init.h> 18bc700ab1SDaniel Mack #include <linux/module.h> 19bc700ab1SDaniel Mack #include <linux/slab.h> 20bc700ab1SDaniel Mack #include <linux/usb.h> 21bc700ab1SDaniel Mack #include <linux/usb/audio.h> 22bc700ab1SDaniel Mack #include <sound/core.h> 23bc700ab1SDaniel Mack #include <sound/initval.h> 24bc700ab1SDaniel Mack #include <sound/pcm.h> 25bc700ab1SDaniel Mack #include <sound/pcm_params.h> 26bc700ab1SDaniel Mack #include "../usbaudio.h" 27e5779998SDaniel Mack #include "../midi.h" 28bc700ab1SDaniel Mack 29bc700ab1SDaniel Mack MODULE_DESCRIPTION("Edirol UA-101/1000 driver"); 30bc700ab1SDaniel Mack MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>"); 31bc700ab1SDaniel Mack MODULE_LICENSE("GPL v2"); 32bc700ab1SDaniel Mack MODULE_SUPPORTED_DEVICE("{{Edirol,UA-101},{Edirol,UA-1000}}"); 33bc700ab1SDaniel Mack 34bc700ab1SDaniel Mack /* 35bc700ab1SDaniel Mack * Should not be lower than the minimum scheduling delay of the host 36bc700ab1SDaniel Mack * controller. Some Intel controllers need more than one frame; as long as 37bc700ab1SDaniel Mack * that driver doesn't tell us about this, use 1.5 frames just to be sure. 38bc700ab1SDaniel Mack */ 39bc700ab1SDaniel Mack #define MIN_QUEUE_LENGTH 12 40bc700ab1SDaniel Mack /* Somewhat random. */ 41bc700ab1SDaniel Mack #define MAX_QUEUE_LENGTH 30 42bc700ab1SDaniel Mack /* 43bc700ab1SDaniel Mack * This magic value optimizes memory usage efficiency for the UA-101's packet 44bc700ab1SDaniel Mack * sizes at all sample rates, taking into account the stupid cache pool sizes 457a9b1492SLinus Torvalds * that usb_alloc_coherent() uses. 46bc700ab1SDaniel Mack */ 47bc700ab1SDaniel Mack #define DEFAULT_QUEUE_LENGTH 21 48bc700ab1SDaniel Mack 49bc700ab1SDaniel Mack #define MAX_PACKET_SIZE 672 /* hardware specific */ 50bc700ab1SDaniel Mack #define MAX_MEMORY_BUFFERS DIV_ROUND_UP(MAX_QUEUE_LENGTH, \ 51bc700ab1SDaniel Mack PAGE_SIZE / MAX_PACKET_SIZE) 52bc700ab1SDaniel Mack 53bc700ab1SDaniel Mack static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; 54bc700ab1SDaniel Mack static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; 55bc700ab1SDaniel Mack static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; 56bc700ab1SDaniel Mack static unsigned int queue_length = 21; 57bc700ab1SDaniel Mack 58bc700ab1SDaniel Mack module_param_array(index, int, NULL, 0444); 59bc700ab1SDaniel Mack MODULE_PARM_DESC(index, "card index"); 60bc700ab1SDaniel Mack module_param_array(id, charp, NULL, 0444); 61bc700ab1SDaniel Mack MODULE_PARM_DESC(id, "ID string"); 62bc700ab1SDaniel Mack module_param_array(enable, bool, NULL, 0444); 63bc700ab1SDaniel Mack MODULE_PARM_DESC(enable, "enable card"); 64bc700ab1SDaniel Mack module_param(queue_length, uint, 0644); 65bc700ab1SDaniel Mack MODULE_PARM_DESC(queue_length, "USB queue length in microframes, " 66bc700ab1SDaniel Mack __stringify(MIN_QUEUE_LENGTH)"-"__stringify(MAX_QUEUE_LENGTH)); 67bc700ab1SDaniel Mack 68bc700ab1SDaniel Mack enum { 69bc700ab1SDaniel Mack INTF_PLAYBACK, 70bc700ab1SDaniel Mack INTF_CAPTURE, 71bc700ab1SDaniel Mack INTF_MIDI, 72bc700ab1SDaniel Mack 73bc700ab1SDaniel Mack INTF_COUNT 74bc700ab1SDaniel Mack }; 75bc700ab1SDaniel Mack 76bc700ab1SDaniel Mack /* bits in struct ua101::states */ 77bc700ab1SDaniel Mack enum { 78bc700ab1SDaniel Mack USB_CAPTURE_RUNNING, 79bc700ab1SDaniel Mack USB_PLAYBACK_RUNNING, 80bc700ab1SDaniel Mack ALSA_CAPTURE_OPEN, 81bc700ab1SDaniel Mack ALSA_PLAYBACK_OPEN, 82bc700ab1SDaniel Mack ALSA_CAPTURE_RUNNING, 83bc700ab1SDaniel Mack ALSA_PLAYBACK_RUNNING, 84bc700ab1SDaniel Mack CAPTURE_URB_COMPLETED, 85bc700ab1SDaniel Mack PLAYBACK_URB_COMPLETED, 86bc700ab1SDaniel Mack DISCONNECTED, 87bc700ab1SDaniel Mack }; 88bc700ab1SDaniel Mack 89bc700ab1SDaniel Mack struct ua101 { 90bc700ab1SDaniel Mack struct usb_device *dev; 91bc700ab1SDaniel Mack struct snd_card *card; 92bc700ab1SDaniel Mack struct usb_interface *intf[INTF_COUNT]; 93bc700ab1SDaniel Mack int card_index; 94bc700ab1SDaniel Mack struct snd_pcm *pcm; 95bc700ab1SDaniel Mack struct list_head midi_list; 96bc700ab1SDaniel Mack u64 format_bit; 97bc700ab1SDaniel Mack unsigned int rate; 98bc700ab1SDaniel Mack unsigned int packets_per_second; 99bc700ab1SDaniel Mack spinlock_t lock; 100bc700ab1SDaniel Mack struct mutex mutex; 101bc700ab1SDaniel Mack unsigned long states; 102bc700ab1SDaniel Mack 103bc700ab1SDaniel Mack /* FIFO to synchronize playback rate to capture rate */ 104bc700ab1SDaniel Mack unsigned int rate_feedback_start; 105bc700ab1SDaniel Mack unsigned int rate_feedback_count; 106bc700ab1SDaniel Mack u8 rate_feedback[MAX_QUEUE_LENGTH]; 107bc700ab1SDaniel Mack 108bc700ab1SDaniel Mack struct list_head ready_playback_urbs; 109bc700ab1SDaniel Mack struct tasklet_struct playback_tasklet; 110bc700ab1SDaniel Mack wait_queue_head_t alsa_capture_wait; 111bc700ab1SDaniel Mack wait_queue_head_t rate_feedback_wait; 112bc700ab1SDaniel Mack wait_queue_head_t alsa_playback_wait; 113bc700ab1SDaniel Mack struct ua101_stream { 114bc700ab1SDaniel Mack struct snd_pcm_substream *substream; 115bc700ab1SDaniel Mack unsigned int usb_pipe; 116bc700ab1SDaniel Mack unsigned int channels; 117bc700ab1SDaniel Mack unsigned int frame_bytes; 118bc700ab1SDaniel Mack unsigned int max_packet_bytes; 119bc700ab1SDaniel Mack unsigned int period_pos; 120bc700ab1SDaniel Mack unsigned int buffer_pos; 121bc700ab1SDaniel Mack unsigned int queue_length; 122bc700ab1SDaniel Mack struct ua101_urb { 123bc700ab1SDaniel Mack struct urb urb; 124bc700ab1SDaniel Mack struct usb_iso_packet_descriptor iso_frame_desc[1]; 125bc700ab1SDaniel Mack struct list_head ready_list; 126bc700ab1SDaniel Mack } *urbs[MAX_QUEUE_LENGTH]; 127bc700ab1SDaniel Mack struct { 128bc700ab1SDaniel Mack unsigned int size; 129bc700ab1SDaniel Mack void *addr; 130bc700ab1SDaniel Mack dma_addr_t dma; 131bc700ab1SDaniel Mack } buffers[MAX_MEMORY_BUFFERS]; 132bc700ab1SDaniel Mack } capture, playback; 133bc700ab1SDaniel Mack }; 134bc700ab1SDaniel Mack 135bc700ab1SDaniel Mack static DEFINE_MUTEX(devices_mutex); 136bc700ab1SDaniel Mack static unsigned int devices_used; 137bc700ab1SDaniel Mack static struct usb_driver ua101_driver; 138bc700ab1SDaniel Mack 139bc700ab1SDaniel Mack static void abort_alsa_playback(struct ua101 *ua); 140bc700ab1SDaniel Mack static void abort_alsa_capture(struct ua101 *ua); 141bc700ab1SDaniel Mack 142bc700ab1SDaniel Mack static const char *usb_error_string(int err) 143bc700ab1SDaniel Mack { 144bc700ab1SDaniel Mack switch (err) { 145bc700ab1SDaniel Mack case -ENODEV: 146bc700ab1SDaniel Mack return "no device"; 147bc700ab1SDaniel Mack case -ENOENT: 148bc700ab1SDaniel Mack return "endpoint not enabled"; 149bc700ab1SDaniel Mack case -EPIPE: 150bc700ab1SDaniel Mack return "endpoint stalled"; 151bc700ab1SDaniel Mack case -ENOSPC: 152bc700ab1SDaniel Mack return "not enough bandwidth"; 153bc700ab1SDaniel Mack case -ESHUTDOWN: 154bc700ab1SDaniel Mack return "device disabled"; 155bc700ab1SDaniel Mack case -EHOSTUNREACH: 156bc700ab1SDaniel Mack return "device suspended"; 157bc700ab1SDaniel Mack case -EINVAL: 158bc700ab1SDaniel Mack case -EAGAIN: 159bc700ab1SDaniel Mack case -EFBIG: 160bc700ab1SDaniel Mack case -EMSGSIZE: 161bc700ab1SDaniel Mack return "internal error"; 162bc700ab1SDaniel Mack default: 163bc700ab1SDaniel Mack return "unknown error"; 164bc700ab1SDaniel Mack } 165bc700ab1SDaniel Mack } 166bc700ab1SDaniel Mack 167bc700ab1SDaniel Mack static void abort_usb_capture(struct ua101 *ua) 168bc700ab1SDaniel Mack { 169bc700ab1SDaniel Mack if (test_and_clear_bit(USB_CAPTURE_RUNNING, &ua->states)) { 170bc700ab1SDaniel Mack wake_up(&ua->alsa_capture_wait); 171bc700ab1SDaniel Mack wake_up(&ua->rate_feedback_wait); 172bc700ab1SDaniel Mack } 173bc700ab1SDaniel Mack } 174bc700ab1SDaniel Mack 175bc700ab1SDaniel Mack static void abort_usb_playback(struct ua101 *ua) 176bc700ab1SDaniel Mack { 177bc700ab1SDaniel Mack if (test_and_clear_bit(USB_PLAYBACK_RUNNING, &ua->states)) 178bc700ab1SDaniel Mack wake_up(&ua->alsa_playback_wait); 179bc700ab1SDaniel Mack } 180bc700ab1SDaniel Mack 181bc700ab1SDaniel Mack static void playback_urb_complete(struct urb *usb_urb) 182bc700ab1SDaniel Mack { 183bc700ab1SDaniel Mack struct ua101_urb *urb = (struct ua101_urb *)usb_urb; 184bc700ab1SDaniel Mack struct ua101 *ua = urb->urb.context; 185bc700ab1SDaniel Mack unsigned long flags; 186bc700ab1SDaniel Mack 187bc700ab1SDaniel Mack if (unlikely(urb->urb.status == -ENOENT || /* unlinked */ 188bc700ab1SDaniel Mack urb->urb.status == -ENODEV || /* device removed */ 189bc700ab1SDaniel Mack urb->urb.status == -ECONNRESET || /* unlinked */ 190bc700ab1SDaniel Mack urb->urb.status == -ESHUTDOWN)) { /* device disabled */ 191bc700ab1SDaniel Mack abort_usb_playback(ua); 192bc700ab1SDaniel Mack abort_alsa_playback(ua); 193bc700ab1SDaniel Mack return; 194bc700ab1SDaniel Mack } 195bc700ab1SDaniel Mack 196bc700ab1SDaniel Mack if (test_bit(USB_PLAYBACK_RUNNING, &ua->states)) { 197bc700ab1SDaniel Mack /* append URB to FIFO */ 198bc700ab1SDaniel Mack spin_lock_irqsave(&ua->lock, flags); 199bc700ab1SDaniel Mack list_add_tail(&urb->ready_list, &ua->ready_playback_urbs); 200bc700ab1SDaniel Mack if (ua->rate_feedback_count > 0) 201bc700ab1SDaniel Mack tasklet_schedule(&ua->playback_tasklet); 202bc700ab1SDaniel Mack ua->playback.substream->runtime->delay -= 203bc700ab1SDaniel Mack urb->urb.iso_frame_desc[0].length / 204bc700ab1SDaniel Mack ua->playback.frame_bytes; 205bc700ab1SDaniel Mack spin_unlock_irqrestore(&ua->lock, flags); 206bc700ab1SDaniel Mack } 207bc700ab1SDaniel Mack } 208bc700ab1SDaniel Mack 209bc700ab1SDaniel Mack static void first_playback_urb_complete(struct urb *urb) 210bc700ab1SDaniel Mack { 211bc700ab1SDaniel Mack struct ua101 *ua = urb->context; 212bc700ab1SDaniel Mack 213bc700ab1SDaniel Mack urb->complete = playback_urb_complete; 214bc700ab1SDaniel Mack playback_urb_complete(urb); 215bc700ab1SDaniel Mack 216bc700ab1SDaniel Mack set_bit(PLAYBACK_URB_COMPLETED, &ua->states); 217bc700ab1SDaniel Mack wake_up(&ua->alsa_playback_wait); 218bc700ab1SDaniel Mack } 219bc700ab1SDaniel Mack 220bc700ab1SDaniel Mack /* copy data from the ALSA ring buffer into the URB buffer */ 221bc700ab1SDaniel Mack static bool copy_playback_data(struct ua101_stream *stream, struct urb *urb, 222bc700ab1SDaniel Mack unsigned int frames) 223bc700ab1SDaniel Mack { 224bc700ab1SDaniel Mack struct snd_pcm_runtime *runtime; 225bc700ab1SDaniel Mack unsigned int frame_bytes, frames1; 226bc700ab1SDaniel Mack const u8 *source; 227bc700ab1SDaniel Mack 228bc700ab1SDaniel Mack runtime = stream->substream->runtime; 229bc700ab1SDaniel Mack frame_bytes = stream->frame_bytes; 230bc700ab1SDaniel Mack source = runtime->dma_area + stream->buffer_pos * frame_bytes; 231bc700ab1SDaniel Mack if (stream->buffer_pos + frames <= runtime->buffer_size) { 232bc700ab1SDaniel Mack memcpy(urb->transfer_buffer, source, frames * frame_bytes); 233bc700ab1SDaniel Mack } else { 234bc700ab1SDaniel Mack /* wrap around at end of ring buffer */ 235bc700ab1SDaniel Mack frames1 = runtime->buffer_size - stream->buffer_pos; 236bc700ab1SDaniel Mack memcpy(urb->transfer_buffer, source, frames1 * frame_bytes); 237bc700ab1SDaniel Mack memcpy(urb->transfer_buffer + frames1 * frame_bytes, 238bc700ab1SDaniel Mack runtime->dma_area, (frames - frames1) * frame_bytes); 239bc700ab1SDaniel Mack } 240bc700ab1SDaniel Mack 241bc700ab1SDaniel Mack stream->buffer_pos += frames; 242bc700ab1SDaniel Mack if (stream->buffer_pos >= runtime->buffer_size) 243bc700ab1SDaniel Mack stream->buffer_pos -= runtime->buffer_size; 244bc700ab1SDaniel Mack stream->period_pos += frames; 245bc700ab1SDaniel Mack if (stream->period_pos >= runtime->period_size) { 246bc700ab1SDaniel Mack stream->period_pos -= runtime->period_size; 247bc700ab1SDaniel Mack return true; 248bc700ab1SDaniel Mack } 249bc700ab1SDaniel Mack return false; 250bc700ab1SDaniel Mack } 251bc700ab1SDaniel Mack 252bc700ab1SDaniel Mack static inline void add_with_wraparound(struct ua101 *ua, 253bc700ab1SDaniel Mack unsigned int *value, unsigned int add) 254bc700ab1SDaniel Mack { 255bc700ab1SDaniel Mack *value += add; 256bc700ab1SDaniel Mack if (*value >= ua->playback.queue_length) 257bc700ab1SDaniel Mack *value -= ua->playback.queue_length; 258bc700ab1SDaniel Mack } 259bc700ab1SDaniel Mack 260bc700ab1SDaniel Mack static void playback_tasklet(unsigned long data) 261bc700ab1SDaniel Mack { 262bc700ab1SDaniel Mack struct ua101 *ua = (void *)data; 263bc700ab1SDaniel Mack unsigned long flags; 264bc700ab1SDaniel Mack unsigned int frames; 265bc700ab1SDaniel Mack struct ua101_urb *urb; 266bc700ab1SDaniel Mack bool do_period_elapsed = false; 267bc700ab1SDaniel Mack int err; 268bc700ab1SDaniel Mack 269bc700ab1SDaniel Mack if (unlikely(!test_bit(USB_PLAYBACK_RUNNING, &ua->states))) 270bc700ab1SDaniel Mack return; 271bc700ab1SDaniel Mack 272bc700ab1SDaniel Mack /* 273bc700ab1SDaniel Mack * Synchronizing the playback rate to the capture rate is done by using 274bc700ab1SDaniel Mack * the same sequence of packet sizes for both streams. 275bc700ab1SDaniel Mack * Submitting a playback URB therefore requires both a ready URB and 276bc700ab1SDaniel Mack * the size of the corresponding capture packet, i.e., both playback 277bc700ab1SDaniel Mack * and capture URBs must have been completed. Since the USB core does 278bc700ab1SDaniel Mack * not guarantee that playback and capture complete callbacks are 279bc700ab1SDaniel Mack * called alternately, we use two FIFOs for packet sizes and read URBs; 280bc700ab1SDaniel Mack * submitting playback URBs is possible as long as both FIFOs are 281bc700ab1SDaniel Mack * nonempty. 282bc700ab1SDaniel Mack */ 283bc700ab1SDaniel Mack spin_lock_irqsave(&ua->lock, flags); 284bc700ab1SDaniel Mack while (ua->rate_feedback_count > 0 && 285bc700ab1SDaniel Mack !list_empty(&ua->ready_playback_urbs)) { 286bc700ab1SDaniel Mack /* take packet size out of FIFO */ 287bc700ab1SDaniel Mack frames = ua->rate_feedback[ua->rate_feedback_start]; 288bc700ab1SDaniel Mack add_with_wraparound(ua, &ua->rate_feedback_start, 1); 289bc700ab1SDaniel Mack ua->rate_feedback_count--; 290bc700ab1SDaniel Mack 291bc700ab1SDaniel Mack /* take URB out of FIFO */ 292bc700ab1SDaniel Mack urb = list_first_entry(&ua->ready_playback_urbs, 293bc700ab1SDaniel Mack struct ua101_urb, ready_list); 294bc700ab1SDaniel Mack list_del(&urb->ready_list); 295bc700ab1SDaniel Mack 296bc700ab1SDaniel Mack /* fill packet with data or silence */ 297bc700ab1SDaniel Mack urb->urb.iso_frame_desc[0].length = 298bc700ab1SDaniel Mack frames * ua->playback.frame_bytes; 299bc700ab1SDaniel Mack if (test_bit(ALSA_PLAYBACK_RUNNING, &ua->states)) 300bc700ab1SDaniel Mack do_period_elapsed |= copy_playback_data(&ua->playback, 301bc700ab1SDaniel Mack &urb->urb, 302bc700ab1SDaniel Mack frames); 303bc700ab1SDaniel Mack else 304bc700ab1SDaniel Mack memset(urb->urb.transfer_buffer, 0, 305bc700ab1SDaniel Mack urb->urb.iso_frame_desc[0].length); 306bc700ab1SDaniel Mack 307bc700ab1SDaniel Mack /* and off you go ... */ 308bc700ab1SDaniel Mack err = usb_submit_urb(&urb->urb, GFP_ATOMIC); 309bc700ab1SDaniel Mack if (unlikely(err < 0)) { 310bc700ab1SDaniel Mack spin_unlock_irqrestore(&ua->lock, flags); 311bc700ab1SDaniel Mack abort_usb_playback(ua); 312bc700ab1SDaniel Mack abort_alsa_playback(ua); 313bc700ab1SDaniel Mack dev_err(&ua->dev->dev, "USB request error %d: %s\n", 314bc700ab1SDaniel Mack err, usb_error_string(err)); 315bc700ab1SDaniel Mack return; 316bc700ab1SDaniel Mack } 317bc700ab1SDaniel Mack ua->playback.substream->runtime->delay += frames; 318bc700ab1SDaniel Mack } 319bc700ab1SDaniel Mack spin_unlock_irqrestore(&ua->lock, flags); 320bc700ab1SDaniel Mack if (do_period_elapsed) 321bc700ab1SDaniel Mack snd_pcm_period_elapsed(ua->playback.substream); 322bc700ab1SDaniel Mack } 323bc700ab1SDaniel Mack 324bc700ab1SDaniel Mack /* copy data from the URB buffer into the ALSA ring buffer */ 325bc700ab1SDaniel Mack static bool copy_capture_data(struct ua101_stream *stream, struct urb *urb, 326bc700ab1SDaniel Mack unsigned int frames) 327bc700ab1SDaniel Mack { 328bc700ab1SDaniel Mack struct snd_pcm_runtime *runtime; 329bc700ab1SDaniel Mack unsigned int frame_bytes, frames1; 330bc700ab1SDaniel Mack u8 *dest; 331bc700ab1SDaniel Mack 332bc700ab1SDaniel Mack runtime = stream->substream->runtime; 333bc700ab1SDaniel Mack frame_bytes = stream->frame_bytes; 334bc700ab1SDaniel Mack dest = runtime->dma_area + stream->buffer_pos * frame_bytes; 335bc700ab1SDaniel Mack if (stream->buffer_pos + frames <= runtime->buffer_size) { 336bc700ab1SDaniel Mack memcpy(dest, urb->transfer_buffer, frames * frame_bytes); 337bc700ab1SDaniel Mack } else { 338bc700ab1SDaniel Mack /* wrap around at end of ring buffer */ 339bc700ab1SDaniel Mack frames1 = runtime->buffer_size - stream->buffer_pos; 340bc700ab1SDaniel Mack memcpy(dest, urb->transfer_buffer, frames1 * frame_bytes); 341bc700ab1SDaniel Mack memcpy(runtime->dma_area, 342bc700ab1SDaniel Mack urb->transfer_buffer + frames1 * frame_bytes, 343bc700ab1SDaniel Mack (frames - frames1) * frame_bytes); 344bc700ab1SDaniel Mack } 345bc700ab1SDaniel Mack 346bc700ab1SDaniel Mack stream->buffer_pos += frames; 347bc700ab1SDaniel Mack if (stream->buffer_pos >= runtime->buffer_size) 348bc700ab1SDaniel Mack stream->buffer_pos -= runtime->buffer_size; 349bc700ab1SDaniel Mack stream->period_pos += frames; 350bc700ab1SDaniel Mack if (stream->period_pos >= runtime->period_size) { 351bc700ab1SDaniel Mack stream->period_pos -= runtime->period_size; 352bc700ab1SDaniel Mack return true; 353bc700ab1SDaniel Mack } 354bc700ab1SDaniel Mack return false; 355bc700ab1SDaniel Mack } 356bc700ab1SDaniel Mack 357bc700ab1SDaniel Mack static void capture_urb_complete(struct urb *urb) 358bc700ab1SDaniel Mack { 359bc700ab1SDaniel Mack struct ua101 *ua = urb->context; 360bc700ab1SDaniel Mack struct ua101_stream *stream = &ua->capture; 361bc700ab1SDaniel Mack unsigned long flags; 362bc700ab1SDaniel Mack unsigned int frames, write_ptr; 363bc700ab1SDaniel Mack bool do_period_elapsed; 364bc700ab1SDaniel Mack int err; 365bc700ab1SDaniel Mack 366bc700ab1SDaniel Mack if (unlikely(urb->status == -ENOENT || /* unlinked */ 367bc700ab1SDaniel Mack urb->status == -ENODEV || /* device removed */ 368bc700ab1SDaniel Mack urb->status == -ECONNRESET || /* unlinked */ 369bc700ab1SDaniel Mack urb->status == -ESHUTDOWN)) /* device disabled */ 370bc700ab1SDaniel Mack goto stream_stopped; 371bc700ab1SDaniel Mack 372bc700ab1SDaniel Mack if (urb->status >= 0 && urb->iso_frame_desc[0].status >= 0) 373bc700ab1SDaniel Mack frames = urb->iso_frame_desc[0].actual_length / 374bc700ab1SDaniel Mack stream->frame_bytes; 375bc700ab1SDaniel Mack else 376bc700ab1SDaniel Mack frames = 0; 377bc700ab1SDaniel Mack 378bc700ab1SDaniel Mack spin_lock_irqsave(&ua->lock, flags); 379bc700ab1SDaniel Mack 380bc700ab1SDaniel Mack if (frames > 0 && test_bit(ALSA_CAPTURE_RUNNING, &ua->states)) 381bc700ab1SDaniel Mack do_period_elapsed = copy_capture_data(stream, urb, frames); 382bc700ab1SDaniel Mack else 383bc700ab1SDaniel Mack do_period_elapsed = false; 384bc700ab1SDaniel Mack 385bc700ab1SDaniel Mack if (test_bit(USB_CAPTURE_RUNNING, &ua->states)) { 386bc700ab1SDaniel Mack err = usb_submit_urb(urb, GFP_ATOMIC); 387bc700ab1SDaniel Mack if (unlikely(err < 0)) { 388bc700ab1SDaniel Mack spin_unlock_irqrestore(&ua->lock, flags); 389bc700ab1SDaniel Mack dev_err(&ua->dev->dev, "USB request error %d: %s\n", 390bc700ab1SDaniel Mack err, usb_error_string(err)); 391bc700ab1SDaniel Mack goto stream_stopped; 392bc700ab1SDaniel Mack } 393bc700ab1SDaniel Mack 394bc700ab1SDaniel Mack /* append packet size to FIFO */ 395bc700ab1SDaniel Mack write_ptr = ua->rate_feedback_start; 396bc700ab1SDaniel Mack add_with_wraparound(ua, &write_ptr, ua->rate_feedback_count); 397bc700ab1SDaniel Mack ua->rate_feedback[write_ptr] = frames; 398bc700ab1SDaniel Mack if (ua->rate_feedback_count < ua->playback.queue_length) { 399bc700ab1SDaniel Mack ua->rate_feedback_count++; 400bc700ab1SDaniel Mack if (ua->rate_feedback_count == 401bc700ab1SDaniel Mack ua->playback.queue_length) 402bc700ab1SDaniel Mack wake_up(&ua->rate_feedback_wait); 403bc700ab1SDaniel Mack } else { 404bc700ab1SDaniel Mack /* 405bc700ab1SDaniel Mack * Ring buffer overflow; this happens when the playback 406bc700ab1SDaniel Mack * stream is not running. Throw away the oldest entry, 407bc700ab1SDaniel Mack * so that the playback stream, when it starts, sees 408bc700ab1SDaniel Mack * the most recent packet sizes. 409bc700ab1SDaniel Mack */ 410bc700ab1SDaniel Mack add_with_wraparound(ua, &ua->rate_feedback_start, 1); 411bc700ab1SDaniel Mack } 412bc700ab1SDaniel Mack if (test_bit(USB_PLAYBACK_RUNNING, &ua->states) && 413bc700ab1SDaniel Mack !list_empty(&ua->ready_playback_urbs)) 414bc700ab1SDaniel Mack tasklet_schedule(&ua->playback_tasklet); 415bc700ab1SDaniel Mack } 416bc700ab1SDaniel Mack 417bc700ab1SDaniel Mack spin_unlock_irqrestore(&ua->lock, flags); 418bc700ab1SDaniel Mack 419bc700ab1SDaniel Mack if (do_period_elapsed) 420bc700ab1SDaniel Mack snd_pcm_period_elapsed(stream->substream); 421bc700ab1SDaniel Mack 422bc700ab1SDaniel Mack return; 423bc700ab1SDaniel Mack 424bc700ab1SDaniel Mack stream_stopped: 425bc700ab1SDaniel Mack abort_usb_playback(ua); 426bc700ab1SDaniel Mack abort_usb_capture(ua); 427bc700ab1SDaniel Mack abort_alsa_playback(ua); 428bc700ab1SDaniel Mack abort_alsa_capture(ua); 429bc700ab1SDaniel Mack } 430bc700ab1SDaniel Mack 431bc700ab1SDaniel Mack static void first_capture_urb_complete(struct urb *urb) 432bc700ab1SDaniel Mack { 433bc700ab1SDaniel Mack struct ua101 *ua = urb->context; 434bc700ab1SDaniel Mack 435bc700ab1SDaniel Mack urb->complete = capture_urb_complete; 436bc700ab1SDaniel Mack capture_urb_complete(urb); 437bc700ab1SDaniel Mack 438bc700ab1SDaniel Mack set_bit(CAPTURE_URB_COMPLETED, &ua->states); 439bc700ab1SDaniel Mack wake_up(&ua->alsa_capture_wait); 440bc700ab1SDaniel Mack } 441bc700ab1SDaniel Mack 442bc700ab1SDaniel Mack static int submit_stream_urbs(struct ua101 *ua, struct ua101_stream *stream) 443bc700ab1SDaniel Mack { 444bc700ab1SDaniel Mack unsigned int i; 445bc700ab1SDaniel Mack 446bc700ab1SDaniel Mack for (i = 0; i < stream->queue_length; ++i) { 447bc700ab1SDaniel Mack int err = usb_submit_urb(&stream->urbs[i]->urb, GFP_KERNEL); 448bc700ab1SDaniel Mack if (err < 0) { 449bc700ab1SDaniel Mack dev_err(&ua->dev->dev, "USB request error %d: %s\n", 450bc700ab1SDaniel Mack err, usb_error_string(err)); 451bc700ab1SDaniel Mack return err; 452bc700ab1SDaniel Mack } 453bc700ab1SDaniel Mack } 454bc700ab1SDaniel Mack return 0; 455bc700ab1SDaniel Mack } 456bc700ab1SDaniel Mack 457bc700ab1SDaniel Mack static void kill_stream_urbs(struct ua101_stream *stream) 458bc700ab1SDaniel Mack { 459bc700ab1SDaniel Mack unsigned int i; 460bc700ab1SDaniel Mack 461bc700ab1SDaniel Mack for (i = 0; i < stream->queue_length; ++i) 462bc700ab1SDaniel Mack usb_kill_urb(&stream->urbs[i]->urb); 463bc700ab1SDaniel Mack } 464bc700ab1SDaniel Mack 465bc700ab1SDaniel Mack static int enable_iso_interface(struct ua101 *ua, unsigned int intf_index) 466bc700ab1SDaniel Mack { 467bc700ab1SDaniel Mack struct usb_host_interface *alts; 468bc700ab1SDaniel Mack 469bc700ab1SDaniel Mack alts = ua->intf[intf_index]->cur_altsetting; 470bc700ab1SDaniel Mack if (alts->desc.bAlternateSetting != 1) { 471bc700ab1SDaniel Mack int err = usb_set_interface(ua->dev, 472bc700ab1SDaniel Mack alts->desc.bInterfaceNumber, 1); 473bc700ab1SDaniel Mack if (err < 0) { 474bc700ab1SDaniel Mack dev_err(&ua->dev->dev, 475bc700ab1SDaniel Mack "cannot initialize interface; error %d: %s\n", 476bc700ab1SDaniel Mack err, usb_error_string(err)); 477bc700ab1SDaniel Mack return err; 478bc700ab1SDaniel Mack } 479bc700ab1SDaniel Mack } 480bc700ab1SDaniel Mack return 0; 481bc700ab1SDaniel Mack } 482bc700ab1SDaniel Mack 483bc700ab1SDaniel Mack static void disable_iso_interface(struct ua101 *ua, unsigned int intf_index) 484bc700ab1SDaniel Mack { 485bc700ab1SDaniel Mack struct usb_host_interface *alts; 486bc700ab1SDaniel Mack 487bc700ab1SDaniel Mack alts = ua->intf[intf_index]->cur_altsetting; 488bc700ab1SDaniel Mack if (alts->desc.bAlternateSetting != 0) { 489bc700ab1SDaniel Mack int err = usb_set_interface(ua->dev, 490bc700ab1SDaniel Mack alts->desc.bInterfaceNumber, 0); 491bc700ab1SDaniel Mack if (err < 0 && !test_bit(DISCONNECTED, &ua->states)) 492bc700ab1SDaniel Mack dev_warn(&ua->dev->dev, 493bc700ab1SDaniel Mack "interface reset failed; error %d: %s\n", 494bc700ab1SDaniel Mack err, usb_error_string(err)); 495bc700ab1SDaniel Mack } 496bc700ab1SDaniel Mack } 497bc700ab1SDaniel Mack 498bc700ab1SDaniel Mack static void stop_usb_capture(struct ua101 *ua) 499bc700ab1SDaniel Mack { 500bc700ab1SDaniel Mack clear_bit(USB_CAPTURE_RUNNING, &ua->states); 501bc700ab1SDaniel Mack 502bc700ab1SDaniel Mack kill_stream_urbs(&ua->capture); 503bc700ab1SDaniel Mack 504bc700ab1SDaniel Mack disable_iso_interface(ua, INTF_CAPTURE); 505bc700ab1SDaniel Mack } 506bc700ab1SDaniel Mack 507bc700ab1SDaniel Mack static int start_usb_capture(struct ua101 *ua) 508bc700ab1SDaniel Mack { 509bc700ab1SDaniel Mack int err; 510bc700ab1SDaniel Mack 511bc700ab1SDaniel Mack if (test_bit(DISCONNECTED, &ua->states)) 512bc700ab1SDaniel Mack return -ENODEV; 513bc700ab1SDaniel Mack 514bc700ab1SDaniel Mack if (test_bit(USB_CAPTURE_RUNNING, &ua->states)) 515bc700ab1SDaniel Mack return 0; 516bc700ab1SDaniel Mack 517bc700ab1SDaniel Mack kill_stream_urbs(&ua->capture); 518bc700ab1SDaniel Mack 519bc700ab1SDaniel Mack err = enable_iso_interface(ua, INTF_CAPTURE); 520bc700ab1SDaniel Mack if (err < 0) 521bc700ab1SDaniel Mack return err; 522bc700ab1SDaniel Mack 523bc700ab1SDaniel Mack clear_bit(CAPTURE_URB_COMPLETED, &ua->states); 524bc700ab1SDaniel Mack ua->capture.urbs[0]->urb.complete = first_capture_urb_complete; 525bc700ab1SDaniel Mack ua->rate_feedback_start = 0; 526bc700ab1SDaniel Mack ua->rate_feedback_count = 0; 527bc700ab1SDaniel Mack 528bc700ab1SDaniel Mack set_bit(USB_CAPTURE_RUNNING, &ua->states); 529bc700ab1SDaniel Mack err = submit_stream_urbs(ua, &ua->capture); 530bc700ab1SDaniel Mack if (err < 0) 531bc700ab1SDaniel Mack stop_usb_capture(ua); 532bc700ab1SDaniel Mack return err; 533bc700ab1SDaniel Mack } 534bc700ab1SDaniel Mack 535bc700ab1SDaniel Mack static void stop_usb_playback(struct ua101 *ua) 536bc700ab1SDaniel Mack { 537bc700ab1SDaniel Mack clear_bit(USB_PLAYBACK_RUNNING, &ua->states); 538bc700ab1SDaniel Mack 539bc700ab1SDaniel Mack kill_stream_urbs(&ua->playback); 540bc700ab1SDaniel Mack 541bc700ab1SDaniel Mack tasklet_kill(&ua->playback_tasklet); 542bc700ab1SDaniel Mack 543bc700ab1SDaniel Mack disable_iso_interface(ua, INTF_PLAYBACK); 544bc700ab1SDaniel Mack } 545bc700ab1SDaniel Mack 546bc700ab1SDaniel Mack static int start_usb_playback(struct ua101 *ua) 547bc700ab1SDaniel Mack { 548bc700ab1SDaniel Mack unsigned int i, frames; 549bc700ab1SDaniel Mack struct urb *urb; 550bc700ab1SDaniel Mack int err = 0; 551bc700ab1SDaniel Mack 552bc700ab1SDaniel Mack if (test_bit(DISCONNECTED, &ua->states)) 553bc700ab1SDaniel Mack return -ENODEV; 554bc700ab1SDaniel Mack 555bc700ab1SDaniel Mack if (test_bit(USB_PLAYBACK_RUNNING, &ua->states)) 556bc700ab1SDaniel Mack return 0; 557bc700ab1SDaniel Mack 558bc700ab1SDaniel Mack kill_stream_urbs(&ua->playback); 559bc700ab1SDaniel Mack tasklet_kill(&ua->playback_tasklet); 560bc700ab1SDaniel Mack 561bc700ab1SDaniel Mack err = enable_iso_interface(ua, INTF_PLAYBACK); 562bc700ab1SDaniel Mack if (err < 0) 563bc700ab1SDaniel Mack return err; 564bc700ab1SDaniel Mack 565bc700ab1SDaniel Mack clear_bit(PLAYBACK_URB_COMPLETED, &ua->states); 566bc700ab1SDaniel Mack ua->playback.urbs[0]->urb.complete = 567bc700ab1SDaniel Mack first_playback_urb_complete; 568bc700ab1SDaniel Mack spin_lock_irq(&ua->lock); 569bc700ab1SDaniel Mack INIT_LIST_HEAD(&ua->ready_playback_urbs); 570bc700ab1SDaniel Mack spin_unlock_irq(&ua->lock); 571bc700ab1SDaniel Mack 572bc700ab1SDaniel Mack /* 573bc700ab1SDaniel Mack * We submit the initial URBs all at once, so we have to wait for the 574bc700ab1SDaniel Mack * packet size FIFO to be full. 575bc700ab1SDaniel Mack */ 576bc700ab1SDaniel Mack wait_event(ua->rate_feedback_wait, 577bc700ab1SDaniel Mack ua->rate_feedback_count >= ua->playback.queue_length || 578bc700ab1SDaniel Mack !test_bit(USB_CAPTURE_RUNNING, &ua->states) || 579bc700ab1SDaniel Mack test_bit(DISCONNECTED, &ua->states)); 580bc700ab1SDaniel Mack if (test_bit(DISCONNECTED, &ua->states)) { 581bc700ab1SDaniel Mack stop_usb_playback(ua); 582bc700ab1SDaniel Mack return -ENODEV; 583bc700ab1SDaniel Mack } 584bc700ab1SDaniel Mack if (!test_bit(USB_CAPTURE_RUNNING, &ua->states)) { 585bc700ab1SDaniel Mack stop_usb_playback(ua); 586bc700ab1SDaniel Mack return -EIO; 587bc700ab1SDaniel Mack } 588bc700ab1SDaniel Mack 589bc700ab1SDaniel Mack for (i = 0; i < ua->playback.queue_length; ++i) { 590bc700ab1SDaniel Mack /* all initial URBs contain silence */ 591bc700ab1SDaniel Mack spin_lock_irq(&ua->lock); 592bc700ab1SDaniel Mack frames = ua->rate_feedback[ua->rate_feedback_start]; 593bc700ab1SDaniel Mack add_with_wraparound(ua, &ua->rate_feedback_start, 1); 594bc700ab1SDaniel Mack ua->rate_feedback_count--; 595bc700ab1SDaniel Mack spin_unlock_irq(&ua->lock); 596bc700ab1SDaniel Mack urb = &ua->playback.urbs[i]->urb; 597bc700ab1SDaniel Mack urb->iso_frame_desc[0].length = 598bc700ab1SDaniel Mack frames * ua->playback.frame_bytes; 599bc700ab1SDaniel Mack memset(urb->transfer_buffer, 0, 600bc700ab1SDaniel Mack urb->iso_frame_desc[0].length); 601bc700ab1SDaniel Mack } 602bc700ab1SDaniel Mack 603bc700ab1SDaniel Mack set_bit(USB_PLAYBACK_RUNNING, &ua->states); 604bc700ab1SDaniel Mack err = submit_stream_urbs(ua, &ua->playback); 605bc700ab1SDaniel Mack if (err < 0) 606bc700ab1SDaniel Mack stop_usb_playback(ua); 607bc700ab1SDaniel Mack return err; 608bc700ab1SDaniel Mack } 609bc700ab1SDaniel Mack 610bc700ab1SDaniel Mack static void abort_alsa_capture(struct ua101 *ua) 611bc700ab1SDaniel Mack { 612bc700ab1SDaniel Mack if (test_bit(ALSA_CAPTURE_RUNNING, &ua->states)) 613bc700ab1SDaniel Mack snd_pcm_stop(ua->capture.substream, SNDRV_PCM_STATE_XRUN); 614bc700ab1SDaniel Mack } 615bc700ab1SDaniel Mack 616bc700ab1SDaniel Mack static void abort_alsa_playback(struct ua101 *ua) 617bc700ab1SDaniel Mack { 618bc700ab1SDaniel Mack if (test_bit(ALSA_PLAYBACK_RUNNING, &ua->states)) 619bc700ab1SDaniel Mack snd_pcm_stop(ua->playback.substream, SNDRV_PCM_STATE_XRUN); 620bc700ab1SDaniel Mack } 621bc700ab1SDaniel Mack 622bc700ab1SDaniel Mack static int set_stream_hw(struct ua101 *ua, struct snd_pcm_substream *substream, 623bc700ab1SDaniel Mack unsigned int channels) 624bc700ab1SDaniel Mack { 625bc700ab1SDaniel Mack int err; 626bc700ab1SDaniel Mack 627bc700ab1SDaniel Mack substream->runtime->hw.info = 628bc700ab1SDaniel Mack SNDRV_PCM_INFO_MMAP | 629bc700ab1SDaniel Mack SNDRV_PCM_INFO_MMAP_VALID | 630bc700ab1SDaniel Mack SNDRV_PCM_INFO_BATCH | 631bc700ab1SDaniel Mack SNDRV_PCM_INFO_INTERLEAVED | 632bc700ab1SDaniel Mack SNDRV_PCM_INFO_BLOCK_TRANSFER | 633bc700ab1SDaniel Mack SNDRV_PCM_INFO_FIFO_IN_FRAMES; 634bc700ab1SDaniel Mack substream->runtime->hw.formats = ua->format_bit; 635bc700ab1SDaniel Mack substream->runtime->hw.rates = snd_pcm_rate_to_rate_bit(ua->rate); 636bc700ab1SDaniel Mack substream->runtime->hw.rate_min = ua->rate; 637bc700ab1SDaniel Mack substream->runtime->hw.rate_max = ua->rate; 638bc700ab1SDaniel Mack substream->runtime->hw.channels_min = channels; 639bc700ab1SDaniel Mack substream->runtime->hw.channels_max = channels; 640bc700ab1SDaniel Mack substream->runtime->hw.buffer_bytes_max = 45000 * 1024; 641bc700ab1SDaniel Mack substream->runtime->hw.period_bytes_min = 1; 642bc700ab1SDaniel Mack substream->runtime->hw.period_bytes_max = UINT_MAX; 643bc700ab1SDaniel Mack substream->runtime->hw.periods_min = 2; 644bc700ab1SDaniel Mack substream->runtime->hw.periods_max = UINT_MAX; 645bc700ab1SDaniel Mack err = snd_pcm_hw_constraint_minmax(substream->runtime, 646bc700ab1SDaniel Mack SNDRV_PCM_HW_PARAM_PERIOD_TIME, 647bc700ab1SDaniel Mack 1500000 / ua->packets_per_second, 648f4b1e98aSClemens Ladisch UINT_MAX); 649bc700ab1SDaniel Mack if (err < 0) 650bc700ab1SDaniel Mack return err; 651bc700ab1SDaniel Mack err = snd_pcm_hw_constraint_msbits(substream->runtime, 0, 32, 24); 652bc700ab1SDaniel Mack return err; 653bc700ab1SDaniel Mack } 654bc700ab1SDaniel Mack 655bc700ab1SDaniel Mack static int capture_pcm_open(struct snd_pcm_substream *substream) 656bc700ab1SDaniel Mack { 657bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 658bc700ab1SDaniel Mack int err; 659bc700ab1SDaniel Mack 660bc700ab1SDaniel Mack ua->capture.substream = substream; 661bc700ab1SDaniel Mack err = set_stream_hw(ua, substream, ua->capture.channels); 662bc700ab1SDaniel Mack if (err < 0) 663bc700ab1SDaniel Mack return err; 664bc700ab1SDaniel Mack substream->runtime->hw.fifo_size = 665bc700ab1SDaniel Mack DIV_ROUND_CLOSEST(ua->rate, ua->packets_per_second); 666bc700ab1SDaniel Mack substream->runtime->delay = substream->runtime->hw.fifo_size; 667bc700ab1SDaniel Mack 668bc700ab1SDaniel Mack mutex_lock(&ua->mutex); 669bc700ab1SDaniel Mack err = start_usb_capture(ua); 670bc700ab1SDaniel Mack if (err >= 0) 671bc700ab1SDaniel Mack set_bit(ALSA_CAPTURE_OPEN, &ua->states); 672bc700ab1SDaniel Mack mutex_unlock(&ua->mutex); 673bc700ab1SDaniel Mack return err; 674bc700ab1SDaniel Mack } 675bc700ab1SDaniel Mack 676bc700ab1SDaniel Mack static int playback_pcm_open(struct snd_pcm_substream *substream) 677bc700ab1SDaniel Mack { 678bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 679bc700ab1SDaniel Mack int err; 680bc700ab1SDaniel Mack 681bc700ab1SDaniel Mack ua->playback.substream = substream; 682bc700ab1SDaniel Mack err = set_stream_hw(ua, substream, ua->playback.channels); 683bc700ab1SDaniel Mack if (err < 0) 684bc700ab1SDaniel Mack return err; 685bc700ab1SDaniel Mack substream->runtime->hw.fifo_size = 686bc700ab1SDaniel Mack DIV_ROUND_CLOSEST(ua->rate * ua->playback.queue_length, 687bc700ab1SDaniel Mack ua->packets_per_second); 688bc700ab1SDaniel Mack 689bc700ab1SDaniel Mack mutex_lock(&ua->mutex); 690bc700ab1SDaniel Mack err = start_usb_capture(ua); 691bc700ab1SDaniel Mack if (err < 0) 692bc700ab1SDaniel Mack goto error; 693bc700ab1SDaniel Mack err = start_usb_playback(ua); 694bc700ab1SDaniel Mack if (err < 0) { 695bc700ab1SDaniel Mack if (!test_bit(ALSA_CAPTURE_OPEN, &ua->states)) 696bc700ab1SDaniel Mack stop_usb_capture(ua); 697bc700ab1SDaniel Mack goto error; 698bc700ab1SDaniel Mack } 699bc700ab1SDaniel Mack set_bit(ALSA_PLAYBACK_OPEN, &ua->states); 700bc700ab1SDaniel Mack error: 701bc700ab1SDaniel Mack mutex_unlock(&ua->mutex); 702bc700ab1SDaniel Mack return err; 703bc700ab1SDaniel Mack } 704bc700ab1SDaniel Mack 705bc700ab1SDaniel Mack static int capture_pcm_close(struct snd_pcm_substream *substream) 706bc700ab1SDaniel Mack { 707bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 708bc700ab1SDaniel Mack 709bc700ab1SDaniel Mack mutex_lock(&ua->mutex); 710bc700ab1SDaniel Mack clear_bit(ALSA_CAPTURE_OPEN, &ua->states); 711bc700ab1SDaniel Mack if (!test_bit(ALSA_PLAYBACK_OPEN, &ua->states)) 712bc700ab1SDaniel Mack stop_usb_capture(ua); 713bc700ab1SDaniel Mack mutex_unlock(&ua->mutex); 714bc700ab1SDaniel Mack return 0; 715bc700ab1SDaniel Mack } 716bc700ab1SDaniel Mack 717bc700ab1SDaniel Mack static int playback_pcm_close(struct snd_pcm_substream *substream) 718bc700ab1SDaniel Mack { 719bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 720bc700ab1SDaniel Mack 721bc700ab1SDaniel Mack mutex_lock(&ua->mutex); 722bc700ab1SDaniel Mack stop_usb_playback(ua); 723bc700ab1SDaniel Mack clear_bit(ALSA_PLAYBACK_OPEN, &ua->states); 724bc700ab1SDaniel Mack if (!test_bit(ALSA_CAPTURE_OPEN, &ua->states)) 725bc700ab1SDaniel Mack stop_usb_capture(ua); 726bc700ab1SDaniel Mack mutex_unlock(&ua->mutex); 727bc700ab1SDaniel Mack return 0; 728bc700ab1SDaniel Mack } 729bc700ab1SDaniel Mack 730bc700ab1SDaniel Mack static int capture_pcm_hw_params(struct snd_pcm_substream *substream, 731bc700ab1SDaniel Mack struct snd_pcm_hw_params *hw_params) 732bc700ab1SDaniel Mack { 733bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 734bc700ab1SDaniel Mack int err; 735bc700ab1SDaniel Mack 736bc700ab1SDaniel Mack mutex_lock(&ua->mutex); 737bc700ab1SDaniel Mack err = start_usb_capture(ua); 738bc700ab1SDaniel Mack mutex_unlock(&ua->mutex); 739bc700ab1SDaniel Mack if (err < 0) 740bc700ab1SDaniel Mack return err; 741bc700ab1SDaniel Mack 742bc700ab1SDaniel Mack return snd_pcm_lib_alloc_vmalloc_buffer(substream, 743bc700ab1SDaniel Mack params_buffer_bytes(hw_params)); 744bc700ab1SDaniel Mack } 745bc700ab1SDaniel Mack 746bc700ab1SDaniel Mack static int playback_pcm_hw_params(struct snd_pcm_substream *substream, 747bc700ab1SDaniel Mack struct snd_pcm_hw_params *hw_params) 748bc700ab1SDaniel Mack { 749bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 750bc700ab1SDaniel Mack int err; 751bc700ab1SDaniel Mack 752bc700ab1SDaniel Mack mutex_lock(&ua->mutex); 753bc700ab1SDaniel Mack err = start_usb_capture(ua); 754bc700ab1SDaniel Mack if (err >= 0) 755bc700ab1SDaniel Mack err = start_usb_playback(ua); 756bc700ab1SDaniel Mack mutex_unlock(&ua->mutex); 757bc700ab1SDaniel Mack if (err < 0) 758bc700ab1SDaniel Mack return err; 759bc700ab1SDaniel Mack 760bc700ab1SDaniel Mack return snd_pcm_lib_alloc_vmalloc_buffer(substream, 761bc700ab1SDaniel Mack params_buffer_bytes(hw_params)); 762bc700ab1SDaniel Mack } 763bc700ab1SDaniel Mack 764bc700ab1SDaniel Mack static int ua101_pcm_hw_free(struct snd_pcm_substream *substream) 765bc700ab1SDaniel Mack { 766bc700ab1SDaniel Mack return snd_pcm_lib_free_vmalloc_buffer(substream); 767bc700ab1SDaniel Mack } 768bc700ab1SDaniel Mack 769bc700ab1SDaniel Mack static int capture_pcm_prepare(struct snd_pcm_substream *substream) 770bc700ab1SDaniel Mack { 771bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 772bc700ab1SDaniel Mack int err; 773bc700ab1SDaniel Mack 774bc700ab1SDaniel Mack mutex_lock(&ua->mutex); 775bc700ab1SDaniel Mack err = start_usb_capture(ua); 776bc700ab1SDaniel Mack mutex_unlock(&ua->mutex); 777bc700ab1SDaniel Mack if (err < 0) 778bc700ab1SDaniel Mack return err; 779bc700ab1SDaniel Mack 780bc700ab1SDaniel Mack /* 781bc700ab1SDaniel Mack * The EHCI driver schedules the first packet of an iso stream at 10 ms 782bc700ab1SDaniel Mack * in the future, i.e., no data is actually captured for that long. 783bc700ab1SDaniel Mack * Take the wait here so that the stream is known to be actually 784bc700ab1SDaniel Mack * running when the start trigger has been called. 785bc700ab1SDaniel Mack */ 786bc700ab1SDaniel Mack wait_event(ua->alsa_capture_wait, 787bc700ab1SDaniel Mack test_bit(CAPTURE_URB_COMPLETED, &ua->states) || 788bc700ab1SDaniel Mack !test_bit(USB_CAPTURE_RUNNING, &ua->states)); 789bc700ab1SDaniel Mack if (test_bit(DISCONNECTED, &ua->states)) 790bc700ab1SDaniel Mack return -ENODEV; 791bc700ab1SDaniel Mack if (!test_bit(USB_CAPTURE_RUNNING, &ua->states)) 792bc700ab1SDaniel Mack return -EIO; 793bc700ab1SDaniel Mack 794bc700ab1SDaniel Mack ua->capture.period_pos = 0; 795bc700ab1SDaniel Mack ua->capture.buffer_pos = 0; 796bc700ab1SDaniel Mack return 0; 797bc700ab1SDaniel Mack } 798bc700ab1SDaniel Mack 799bc700ab1SDaniel Mack static int playback_pcm_prepare(struct snd_pcm_substream *substream) 800bc700ab1SDaniel Mack { 801bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 802bc700ab1SDaniel Mack int err; 803bc700ab1SDaniel Mack 804bc700ab1SDaniel Mack mutex_lock(&ua->mutex); 805bc700ab1SDaniel Mack err = start_usb_capture(ua); 806bc700ab1SDaniel Mack if (err >= 0) 807bc700ab1SDaniel Mack err = start_usb_playback(ua); 808bc700ab1SDaniel Mack mutex_unlock(&ua->mutex); 809bc700ab1SDaniel Mack if (err < 0) 810bc700ab1SDaniel Mack return err; 811bc700ab1SDaniel Mack 812bc700ab1SDaniel Mack /* see the comment in capture_pcm_prepare() */ 813bc700ab1SDaniel Mack wait_event(ua->alsa_playback_wait, 814bc700ab1SDaniel Mack test_bit(PLAYBACK_URB_COMPLETED, &ua->states) || 815bc700ab1SDaniel Mack !test_bit(USB_PLAYBACK_RUNNING, &ua->states)); 816bc700ab1SDaniel Mack if (test_bit(DISCONNECTED, &ua->states)) 817bc700ab1SDaniel Mack return -ENODEV; 818bc700ab1SDaniel Mack if (!test_bit(USB_PLAYBACK_RUNNING, &ua->states)) 819bc700ab1SDaniel Mack return -EIO; 820bc700ab1SDaniel Mack 821bc700ab1SDaniel Mack substream->runtime->delay = 0; 822bc700ab1SDaniel Mack ua->playback.period_pos = 0; 823bc700ab1SDaniel Mack ua->playback.buffer_pos = 0; 824bc700ab1SDaniel Mack return 0; 825bc700ab1SDaniel Mack } 826bc700ab1SDaniel Mack 827bc700ab1SDaniel Mack static int capture_pcm_trigger(struct snd_pcm_substream *substream, int cmd) 828bc700ab1SDaniel Mack { 829bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 830bc700ab1SDaniel Mack 831bc700ab1SDaniel Mack switch (cmd) { 832bc700ab1SDaniel Mack case SNDRV_PCM_TRIGGER_START: 833bc700ab1SDaniel Mack if (!test_bit(USB_CAPTURE_RUNNING, &ua->states)) 834bc700ab1SDaniel Mack return -EIO; 835bc700ab1SDaniel Mack set_bit(ALSA_CAPTURE_RUNNING, &ua->states); 836bc700ab1SDaniel Mack return 0; 837bc700ab1SDaniel Mack case SNDRV_PCM_TRIGGER_STOP: 838bc700ab1SDaniel Mack clear_bit(ALSA_CAPTURE_RUNNING, &ua->states); 839bc700ab1SDaniel Mack return 0; 840bc700ab1SDaniel Mack default: 841bc700ab1SDaniel Mack return -EINVAL; 842bc700ab1SDaniel Mack } 843bc700ab1SDaniel Mack } 844bc700ab1SDaniel Mack 845bc700ab1SDaniel Mack static int playback_pcm_trigger(struct snd_pcm_substream *substream, int cmd) 846bc700ab1SDaniel Mack { 847bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 848bc700ab1SDaniel Mack 849bc700ab1SDaniel Mack switch (cmd) { 850bc700ab1SDaniel Mack case SNDRV_PCM_TRIGGER_START: 851bc700ab1SDaniel Mack if (!test_bit(USB_PLAYBACK_RUNNING, &ua->states)) 852bc700ab1SDaniel Mack return -EIO; 853bc700ab1SDaniel Mack set_bit(ALSA_PLAYBACK_RUNNING, &ua->states); 854bc700ab1SDaniel Mack return 0; 855bc700ab1SDaniel Mack case SNDRV_PCM_TRIGGER_STOP: 856bc700ab1SDaniel Mack clear_bit(ALSA_PLAYBACK_RUNNING, &ua->states); 857bc700ab1SDaniel Mack return 0; 858bc700ab1SDaniel Mack default: 859bc700ab1SDaniel Mack return -EINVAL; 860bc700ab1SDaniel Mack } 861bc700ab1SDaniel Mack } 862bc700ab1SDaniel Mack 863bc700ab1SDaniel Mack static inline snd_pcm_uframes_t ua101_pcm_pointer(struct ua101 *ua, 864bc700ab1SDaniel Mack struct ua101_stream *stream) 865bc700ab1SDaniel Mack { 866bc700ab1SDaniel Mack unsigned long flags; 867bc700ab1SDaniel Mack unsigned int pos; 868bc700ab1SDaniel Mack 869bc700ab1SDaniel Mack spin_lock_irqsave(&ua->lock, flags); 870bc700ab1SDaniel Mack pos = stream->buffer_pos; 871bc700ab1SDaniel Mack spin_unlock_irqrestore(&ua->lock, flags); 872bc700ab1SDaniel Mack return pos; 873bc700ab1SDaniel Mack } 874bc700ab1SDaniel Mack 875bc700ab1SDaniel Mack static snd_pcm_uframes_t capture_pcm_pointer(struct snd_pcm_substream *subs) 876bc700ab1SDaniel Mack { 877bc700ab1SDaniel Mack struct ua101 *ua = subs->private_data; 878bc700ab1SDaniel Mack 879bc700ab1SDaniel Mack return ua101_pcm_pointer(ua, &ua->capture); 880bc700ab1SDaniel Mack } 881bc700ab1SDaniel Mack 882bc700ab1SDaniel Mack static snd_pcm_uframes_t playback_pcm_pointer(struct snd_pcm_substream *subs) 883bc700ab1SDaniel Mack { 884bc700ab1SDaniel Mack struct ua101 *ua = subs->private_data; 885bc700ab1SDaniel Mack 886bc700ab1SDaniel Mack return ua101_pcm_pointer(ua, &ua->playback); 887bc700ab1SDaniel Mack } 888bc700ab1SDaniel Mack 889bc700ab1SDaniel Mack static struct snd_pcm_ops capture_pcm_ops = { 890bc700ab1SDaniel Mack .open = capture_pcm_open, 891bc700ab1SDaniel Mack .close = capture_pcm_close, 892bc700ab1SDaniel Mack .ioctl = snd_pcm_lib_ioctl, 893bc700ab1SDaniel Mack .hw_params = capture_pcm_hw_params, 894bc700ab1SDaniel Mack .hw_free = ua101_pcm_hw_free, 895bc700ab1SDaniel Mack .prepare = capture_pcm_prepare, 896bc700ab1SDaniel Mack .trigger = capture_pcm_trigger, 897bc700ab1SDaniel Mack .pointer = capture_pcm_pointer, 898bc700ab1SDaniel Mack .page = snd_pcm_lib_get_vmalloc_page, 899bc700ab1SDaniel Mack .mmap = snd_pcm_lib_mmap_vmalloc, 900bc700ab1SDaniel Mack }; 901bc700ab1SDaniel Mack 902bc700ab1SDaniel Mack static struct snd_pcm_ops playback_pcm_ops = { 903bc700ab1SDaniel Mack .open = playback_pcm_open, 904bc700ab1SDaniel Mack .close = playback_pcm_close, 905bc700ab1SDaniel Mack .ioctl = snd_pcm_lib_ioctl, 906bc700ab1SDaniel Mack .hw_params = playback_pcm_hw_params, 907bc700ab1SDaniel Mack .hw_free = ua101_pcm_hw_free, 908bc700ab1SDaniel Mack .prepare = playback_pcm_prepare, 909bc700ab1SDaniel Mack .trigger = playback_pcm_trigger, 910bc700ab1SDaniel Mack .pointer = playback_pcm_pointer, 911bc700ab1SDaniel Mack .page = snd_pcm_lib_get_vmalloc_page, 912bc700ab1SDaniel Mack .mmap = snd_pcm_lib_mmap_vmalloc, 913bc700ab1SDaniel Mack }; 914bc700ab1SDaniel Mack 915bc700ab1SDaniel Mack static const struct uac_format_type_i_discrete_descriptor * 916bc700ab1SDaniel Mack find_format_descriptor(struct usb_interface *interface) 917bc700ab1SDaniel Mack { 918bc700ab1SDaniel Mack struct usb_host_interface *alt; 919bc700ab1SDaniel Mack u8 *extra; 920bc700ab1SDaniel Mack int extralen; 921bc700ab1SDaniel Mack 922bc700ab1SDaniel Mack if (interface->num_altsetting != 2) { 923bc700ab1SDaniel Mack dev_err(&interface->dev, "invalid num_altsetting\n"); 924bc700ab1SDaniel Mack return NULL; 925bc700ab1SDaniel Mack } 926bc700ab1SDaniel Mack 927bc700ab1SDaniel Mack alt = &interface->altsetting[0]; 928bc700ab1SDaniel Mack if (alt->desc.bNumEndpoints != 0) { 929bc700ab1SDaniel Mack dev_err(&interface->dev, "invalid bNumEndpoints\n"); 930bc700ab1SDaniel Mack return NULL; 931bc700ab1SDaniel Mack } 932bc700ab1SDaniel Mack 933bc700ab1SDaniel Mack alt = &interface->altsetting[1]; 934bc700ab1SDaniel Mack if (alt->desc.bNumEndpoints != 1) { 935bc700ab1SDaniel Mack dev_err(&interface->dev, "invalid bNumEndpoints\n"); 936bc700ab1SDaniel Mack return NULL; 937bc700ab1SDaniel Mack } 938bc700ab1SDaniel Mack 939bc700ab1SDaniel Mack extra = alt->extra; 940bc700ab1SDaniel Mack extralen = alt->extralen; 941bc700ab1SDaniel Mack while (extralen >= sizeof(struct usb_descriptor_header)) { 942bc700ab1SDaniel Mack struct uac_format_type_i_discrete_descriptor *desc; 943bc700ab1SDaniel Mack 944bc700ab1SDaniel Mack desc = (struct uac_format_type_i_discrete_descriptor *)extra; 945bc700ab1SDaniel Mack if (desc->bLength > extralen) { 946bc700ab1SDaniel Mack dev_err(&interface->dev, "descriptor overflow\n"); 947bc700ab1SDaniel Mack return NULL; 948bc700ab1SDaniel Mack } 949bc700ab1SDaniel Mack if (desc->bLength == UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(1) && 950bc700ab1SDaniel Mack desc->bDescriptorType == USB_DT_CS_INTERFACE && 951bc700ab1SDaniel Mack desc->bDescriptorSubtype == UAC_FORMAT_TYPE) { 952bc700ab1SDaniel Mack if (desc->bFormatType != UAC_FORMAT_TYPE_I_PCM || 953bc700ab1SDaniel Mack desc->bSamFreqType != 1) { 954bc700ab1SDaniel Mack dev_err(&interface->dev, 955bc700ab1SDaniel Mack "invalid format type\n"); 956bc700ab1SDaniel Mack return NULL; 957bc700ab1SDaniel Mack } 958bc700ab1SDaniel Mack return desc; 959bc700ab1SDaniel Mack } 960bc700ab1SDaniel Mack extralen -= desc->bLength; 961bc700ab1SDaniel Mack extra += desc->bLength; 962bc700ab1SDaniel Mack } 963bc700ab1SDaniel Mack dev_err(&interface->dev, "sample format descriptor not found\n"); 964bc700ab1SDaniel Mack return NULL; 965bc700ab1SDaniel Mack } 966bc700ab1SDaniel Mack 967bc700ab1SDaniel Mack static int detect_usb_format(struct ua101 *ua) 968bc700ab1SDaniel Mack { 969bc700ab1SDaniel Mack const struct uac_format_type_i_discrete_descriptor *fmt_capture; 970bc700ab1SDaniel Mack const struct uac_format_type_i_discrete_descriptor *fmt_playback; 971bc700ab1SDaniel Mack const struct usb_endpoint_descriptor *epd; 972bc700ab1SDaniel Mack unsigned int rate2; 973bc700ab1SDaniel Mack 974bc700ab1SDaniel Mack fmt_capture = find_format_descriptor(ua->intf[INTF_CAPTURE]); 975bc700ab1SDaniel Mack fmt_playback = find_format_descriptor(ua->intf[INTF_PLAYBACK]); 976bc700ab1SDaniel Mack if (!fmt_capture || !fmt_playback) 977bc700ab1SDaniel Mack return -ENXIO; 978bc700ab1SDaniel Mack 979bc700ab1SDaniel Mack switch (fmt_capture->bSubframeSize) { 980bc700ab1SDaniel Mack case 3: 981bc700ab1SDaniel Mack ua->format_bit = SNDRV_PCM_FMTBIT_S24_3LE; 982bc700ab1SDaniel Mack break; 983bc700ab1SDaniel Mack case 4: 984bc700ab1SDaniel Mack ua->format_bit = SNDRV_PCM_FMTBIT_S32_LE; 985bc700ab1SDaniel Mack break; 986bc700ab1SDaniel Mack default: 987bc700ab1SDaniel Mack dev_err(&ua->dev->dev, "sample width is not 24 or 32 bits\n"); 988bc700ab1SDaniel Mack return -ENXIO; 989bc700ab1SDaniel Mack } 990bc700ab1SDaniel Mack if (fmt_capture->bSubframeSize != fmt_playback->bSubframeSize) { 991bc700ab1SDaniel Mack dev_err(&ua->dev->dev, 992bc700ab1SDaniel Mack "playback/capture sample widths do not match\n"); 993bc700ab1SDaniel Mack return -ENXIO; 994bc700ab1SDaniel Mack } 995bc700ab1SDaniel Mack 996bc700ab1SDaniel Mack if (fmt_capture->bBitResolution != 24 || 997bc700ab1SDaniel Mack fmt_playback->bBitResolution != 24) { 998bc700ab1SDaniel Mack dev_err(&ua->dev->dev, "sample width is not 24 bits\n"); 999bc700ab1SDaniel Mack return -ENXIO; 1000bc700ab1SDaniel Mack } 1001bc700ab1SDaniel Mack 1002bc700ab1SDaniel Mack ua->rate = combine_triple(fmt_capture->tSamFreq[0]); 1003bc700ab1SDaniel Mack rate2 = combine_triple(fmt_playback->tSamFreq[0]); 1004bc700ab1SDaniel Mack if (ua->rate != rate2) { 1005bc700ab1SDaniel Mack dev_err(&ua->dev->dev, 1006bc700ab1SDaniel Mack "playback/capture rates do not match: %u/%u\n", 1007bc700ab1SDaniel Mack rate2, ua->rate); 1008bc700ab1SDaniel Mack return -ENXIO; 1009bc700ab1SDaniel Mack } 1010bc700ab1SDaniel Mack 1011bc700ab1SDaniel Mack switch (ua->dev->speed) { 1012bc700ab1SDaniel Mack case USB_SPEED_FULL: 1013bc700ab1SDaniel Mack ua->packets_per_second = 1000; 1014bc700ab1SDaniel Mack break; 1015bc700ab1SDaniel Mack case USB_SPEED_HIGH: 1016bc700ab1SDaniel Mack ua->packets_per_second = 8000; 1017bc700ab1SDaniel Mack break; 1018bc700ab1SDaniel Mack default: 1019bc700ab1SDaniel Mack dev_err(&ua->dev->dev, "unknown device speed\n"); 1020bc700ab1SDaniel Mack return -ENXIO; 1021bc700ab1SDaniel Mack } 1022bc700ab1SDaniel Mack 1023bc700ab1SDaniel Mack ua->capture.channels = fmt_capture->bNrChannels; 1024bc700ab1SDaniel Mack ua->playback.channels = fmt_playback->bNrChannels; 1025bc700ab1SDaniel Mack ua->capture.frame_bytes = 1026bc700ab1SDaniel Mack fmt_capture->bSubframeSize * ua->capture.channels; 1027bc700ab1SDaniel Mack ua->playback.frame_bytes = 1028bc700ab1SDaniel Mack fmt_playback->bSubframeSize * ua->playback.channels; 1029bc700ab1SDaniel Mack 1030bc700ab1SDaniel Mack epd = &ua->intf[INTF_CAPTURE]->altsetting[1].endpoint[0].desc; 1031bc700ab1SDaniel Mack if (!usb_endpoint_is_isoc_in(epd)) { 1032bc700ab1SDaniel Mack dev_err(&ua->dev->dev, "invalid capture endpoint\n"); 1033bc700ab1SDaniel Mack return -ENXIO; 1034bc700ab1SDaniel Mack } 1035bc700ab1SDaniel Mack ua->capture.usb_pipe = usb_rcvisocpipe(ua->dev, usb_endpoint_num(epd)); 1036bc700ab1SDaniel Mack ua->capture.max_packet_bytes = le16_to_cpu(epd->wMaxPacketSize); 1037bc700ab1SDaniel Mack 1038bc700ab1SDaniel Mack epd = &ua->intf[INTF_PLAYBACK]->altsetting[1].endpoint[0].desc; 1039bc700ab1SDaniel Mack if (!usb_endpoint_is_isoc_out(epd)) { 1040bc700ab1SDaniel Mack dev_err(&ua->dev->dev, "invalid playback endpoint\n"); 1041bc700ab1SDaniel Mack return -ENXIO; 1042bc700ab1SDaniel Mack } 1043bc700ab1SDaniel Mack ua->playback.usb_pipe = usb_sndisocpipe(ua->dev, usb_endpoint_num(epd)); 1044bc700ab1SDaniel Mack ua->playback.max_packet_bytes = le16_to_cpu(epd->wMaxPacketSize); 1045bc700ab1SDaniel Mack return 0; 1046bc700ab1SDaniel Mack } 1047bc700ab1SDaniel Mack 1048bc700ab1SDaniel Mack static int alloc_stream_buffers(struct ua101 *ua, struct ua101_stream *stream) 1049bc700ab1SDaniel Mack { 1050bc700ab1SDaniel Mack unsigned int remaining_packets, packets, packets_per_page, i; 1051bc700ab1SDaniel Mack size_t size; 1052bc700ab1SDaniel Mack 1053bc700ab1SDaniel Mack stream->queue_length = queue_length; 1054bc700ab1SDaniel Mack stream->queue_length = max(stream->queue_length, 1055bc700ab1SDaniel Mack (unsigned int)MIN_QUEUE_LENGTH); 1056bc700ab1SDaniel Mack stream->queue_length = min(stream->queue_length, 1057bc700ab1SDaniel Mack (unsigned int)MAX_QUEUE_LENGTH); 1058bc700ab1SDaniel Mack 1059bc700ab1SDaniel Mack /* 10607a9b1492SLinus Torvalds * The cache pool sizes used by usb_alloc_coherent() (128, 512, 2048) are 1061bc700ab1SDaniel Mack * quite bad when used with the packet sizes of this device (e.g. 280, 1062bc700ab1SDaniel Mack * 520, 624). Therefore, we allocate and subdivide entire pages, using 1063bc700ab1SDaniel Mack * a smaller buffer only for the last chunk. 1064bc700ab1SDaniel Mack */ 1065bc700ab1SDaniel Mack remaining_packets = stream->queue_length; 1066bc700ab1SDaniel Mack packets_per_page = PAGE_SIZE / stream->max_packet_bytes; 1067bc700ab1SDaniel Mack for (i = 0; i < ARRAY_SIZE(stream->buffers); ++i) { 1068bc700ab1SDaniel Mack packets = min(remaining_packets, packets_per_page); 1069bc700ab1SDaniel Mack size = packets * stream->max_packet_bytes; 1070bc700ab1SDaniel Mack stream->buffers[i].addr = 10717a9b1492SLinus Torvalds usb_alloc_coherent(ua->dev, size, GFP_KERNEL, 1072bc700ab1SDaniel Mack &stream->buffers[i].dma); 1073bc700ab1SDaniel Mack if (!stream->buffers[i].addr) 1074bc700ab1SDaniel Mack return -ENOMEM; 1075bc700ab1SDaniel Mack stream->buffers[i].size = size; 1076bc700ab1SDaniel Mack remaining_packets -= packets; 1077bc700ab1SDaniel Mack if (!remaining_packets) 1078bc700ab1SDaniel Mack break; 1079bc700ab1SDaniel Mack } 1080bc700ab1SDaniel Mack if (remaining_packets) { 1081bc700ab1SDaniel Mack dev_err(&ua->dev->dev, "too many packets\n"); 1082bc700ab1SDaniel Mack return -ENXIO; 1083bc700ab1SDaniel Mack } 1084bc700ab1SDaniel Mack return 0; 1085bc700ab1SDaniel Mack } 1086bc700ab1SDaniel Mack 1087bc700ab1SDaniel Mack static void free_stream_buffers(struct ua101 *ua, struct ua101_stream *stream) 1088bc700ab1SDaniel Mack { 1089bc700ab1SDaniel Mack unsigned int i; 1090bc700ab1SDaniel Mack 1091bc700ab1SDaniel Mack for (i = 0; i < ARRAY_SIZE(stream->buffers); ++i) 10927a9b1492SLinus Torvalds usb_free_coherent(ua->dev, 1093bc700ab1SDaniel Mack stream->buffers[i].size, 1094bc700ab1SDaniel Mack stream->buffers[i].addr, 1095bc700ab1SDaniel Mack stream->buffers[i].dma); 1096bc700ab1SDaniel Mack } 1097bc700ab1SDaniel Mack 1098bc700ab1SDaniel Mack static int alloc_stream_urbs(struct ua101 *ua, struct ua101_stream *stream, 1099bc700ab1SDaniel Mack void (*urb_complete)(struct urb *)) 1100bc700ab1SDaniel Mack { 1101bc700ab1SDaniel Mack unsigned max_packet_size = stream->max_packet_bytes; 1102bc700ab1SDaniel Mack struct ua101_urb *urb; 1103bc700ab1SDaniel Mack unsigned int b, u = 0; 1104bc700ab1SDaniel Mack 1105bc700ab1SDaniel Mack for (b = 0; b < ARRAY_SIZE(stream->buffers); ++b) { 1106bc700ab1SDaniel Mack unsigned int size = stream->buffers[b].size; 1107bc700ab1SDaniel Mack u8 *addr = stream->buffers[b].addr; 1108bc700ab1SDaniel Mack dma_addr_t dma = stream->buffers[b].dma; 1109bc700ab1SDaniel Mack 1110bc700ab1SDaniel Mack while (size >= max_packet_size) { 1111bc700ab1SDaniel Mack if (u >= stream->queue_length) 1112bc700ab1SDaniel Mack goto bufsize_error; 1113bc700ab1SDaniel Mack urb = kmalloc(sizeof(*urb), GFP_KERNEL); 1114bc700ab1SDaniel Mack if (!urb) 1115bc700ab1SDaniel Mack return -ENOMEM; 1116bc700ab1SDaniel Mack usb_init_urb(&urb->urb); 1117bc700ab1SDaniel Mack urb->urb.dev = ua->dev; 1118bc700ab1SDaniel Mack urb->urb.pipe = stream->usb_pipe; 1119bc700ab1SDaniel Mack urb->urb.transfer_flags = URB_ISO_ASAP | 1120bc700ab1SDaniel Mack URB_NO_TRANSFER_DMA_MAP; 1121bc700ab1SDaniel Mack urb->urb.transfer_buffer = addr; 1122bc700ab1SDaniel Mack urb->urb.transfer_dma = dma; 1123bc700ab1SDaniel Mack urb->urb.transfer_buffer_length = max_packet_size; 1124bc700ab1SDaniel Mack urb->urb.number_of_packets = 1; 1125bc700ab1SDaniel Mack urb->urb.interval = 1; 1126bc700ab1SDaniel Mack urb->urb.context = ua; 1127bc700ab1SDaniel Mack urb->urb.complete = urb_complete; 1128bc700ab1SDaniel Mack urb->urb.iso_frame_desc[0].offset = 0; 1129bc700ab1SDaniel Mack urb->urb.iso_frame_desc[0].length = max_packet_size; 1130bc700ab1SDaniel Mack stream->urbs[u++] = urb; 1131bc700ab1SDaniel Mack size -= max_packet_size; 1132bc700ab1SDaniel Mack addr += max_packet_size; 1133bc700ab1SDaniel Mack dma += max_packet_size; 1134bc700ab1SDaniel Mack } 1135bc700ab1SDaniel Mack } 1136bc700ab1SDaniel Mack if (u == stream->queue_length) 1137bc700ab1SDaniel Mack return 0; 1138bc700ab1SDaniel Mack bufsize_error: 1139bc700ab1SDaniel Mack dev_err(&ua->dev->dev, "internal buffer size error\n"); 1140bc700ab1SDaniel Mack return -ENXIO; 1141bc700ab1SDaniel Mack } 1142bc700ab1SDaniel Mack 1143bc700ab1SDaniel Mack static void free_stream_urbs(struct ua101_stream *stream) 1144bc700ab1SDaniel Mack { 1145bc700ab1SDaniel Mack unsigned int i; 1146bc700ab1SDaniel Mack 1147bc700ab1SDaniel Mack for (i = 0; i < stream->queue_length; ++i) 1148bc700ab1SDaniel Mack kfree(stream->urbs[i]); 1149bc700ab1SDaniel Mack } 1150bc700ab1SDaniel Mack 1151bc700ab1SDaniel Mack static void free_usb_related_resources(struct ua101 *ua, 1152bc700ab1SDaniel Mack struct usb_interface *interface) 1153bc700ab1SDaniel Mack { 1154bc700ab1SDaniel Mack unsigned int i; 1155bc700ab1SDaniel Mack 1156bc700ab1SDaniel Mack free_stream_urbs(&ua->capture); 1157bc700ab1SDaniel Mack free_stream_urbs(&ua->playback); 1158bc700ab1SDaniel Mack free_stream_buffers(ua, &ua->capture); 1159bc700ab1SDaniel Mack free_stream_buffers(ua, &ua->playback); 1160bc700ab1SDaniel Mack 1161bc700ab1SDaniel Mack for (i = 0; i < ARRAY_SIZE(ua->intf); ++i) 1162bc700ab1SDaniel Mack if (ua->intf[i]) { 1163bc700ab1SDaniel Mack usb_set_intfdata(ua->intf[i], NULL); 1164bc700ab1SDaniel Mack if (ua->intf[i] != interface) 1165bc700ab1SDaniel Mack usb_driver_release_interface(&ua101_driver, 1166bc700ab1SDaniel Mack ua->intf[i]); 1167bc700ab1SDaniel Mack } 1168bc700ab1SDaniel Mack } 1169bc700ab1SDaniel Mack 1170bc700ab1SDaniel Mack static void ua101_card_free(struct snd_card *card) 1171bc700ab1SDaniel Mack { 1172bc700ab1SDaniel Mack struct ua101 *ua = card->private_data; 1173bc700ab1SDaniel Mack 1174bc700ab1SDaniel Mack mutex_destroy(&ua->mutex); 1175bc700ab1SDaniel Mack } 1176bc700ab1SDaniel Mack 1177bc700ab1SDaniel Mack static int ua101_probe(struct usb_interface *interface, 1178bc700ab1SDaniel Mack const struct usb_device_id *usb_id) 1179bc700ab1SDaniel Mack { 1180bc700ab1SDaniel Mack static const struct snd_usb_midi_endpoint_info midi_ep = { 1181bc700ab1SDaniel Mack .out_cables = 0x0001, 1182bc700ab1SDaniel Mack .in_cables = 0x0001 1183bc700ab1SDaniel Mack }; 1184bc700ab1SDaniel Mack static const struct snd_usb_audio_quirk midi_quirk = { 1185bc700ab1SDaniel Mack .type = QUIRK_MIDI_FIXED_ENDPOINT, 1186bc700ab1SDaniel Mack .data = &midi_ep 1187bc700ab1SDaniel Mack }; 1188bc700ab1SDaniel Mack static const int intf_numbers[2][3] = { 1189bc700ab1SDaniel Mack { /* UA-101 */ 1190bc700ab1SDaniel Mack [INTF_PLAYBACK] = 0, 1191bc700ab1SDaniel Mack [INTF_CAPTURE] = 1, 1192bc700ab1SDaniel Mack [INTF_MIDI] = 2, 1193bc700ab1SDaniel Mack }, 1194bc700ab1SDaniel Mack { /* UA-1000 */ 1195bc700ab1SDaniel Mack [INTF_CAPTURE] = 1, 1196bc700ab1SDaniel Mack [INTF_PLAYBACK] = 2, 1197bc700ab1SDaniel Mack [INTF_MIDI] = 3, 1198bc700ab1SDaniel Mack }, 1199bc700ab1SDaniel Mack }; 1200bc700ab1SDaniel Mack struct snd_card *card; 1201bc700ab1SDaniel Mack struct ua101 *ua; 1202bc700ab1SDaniel Mack unsigned int card_index, i; 1203bc700ab1SDaniel Mack int is_ua1000; 1204bc700ab1SDaniel Mack const char *name; 1205bc700ab1SDaniel Mack char usb_path[32]; 1206bc700ab1SDaniel Mack int err; 1207bc700ab1SDaniel Mack 1208bc700ab1SDaniel Mack is_ua1000 = usb_id->idProduct == 0x0044; 1209bc700ab1SDaniel Mack 1210bc700ab1SDaniel Mack if (interface->altsetting->desc.bInterfaceNumber != 1211bc700ab1SDaniel Mack intf_numbers[is_ua1000][0]) 1212bc700ab1SDaniel Mack return -ENODEV; 1213bc700ab1SDaniel Mack 1214bc700ab1SDaniel Mack mutex_lock(&devices_mutex); 1215bc700ab1SDaniel Mack 1216bc700ab1SDaniel Mack for (card_index = 0; card_index < SNDRV_CARDS; ++card_index) 1217bc700ab1SDaniel Mack if (enable[card_index] && !(devices_used & (1 << card_index))) 1218bc700ab1SDaniel Mack break; 1219bc700ab1SDaniel Mack if (card_index >= SNDRV_CARDS) { 1220bc700ab1SDaniel Mack mutex_unlock(&devices_mutex); 1221bc700ab1SDaniel Mack return -ENOENT; 1222bc700ab1SDaniel Mack } 1223bc700ab1SDaniel Mack err = snd_card_create(index[card_index], id[card_index], THIS_MODULE, 1224bc700ab1SDaniel Mack sizeof(*ua), &card); 1225bc700ab1SDaniel Mack if (err < 0) { 1226bc700ab1SDaniel Mack mutex_unlock(&devices_mutex); 1227bc700ab1SDaniel Mack return err; 1228bc700ab1SDaniel Mack } 1229bc700ab1SDaniel Mack card->private_free = ua101_card_free; 1230bc700ab1SDaniel Mack ua = card->private_data; 1231bc700ab1SDaniel Mack ua->dev = interface_to_usbdev(interface); 1232bc700ab1SDaniel Mack ua->card = card; 1233bc700ab1SDaniel Mack ua->card_index = card_index; 1234bc700ab1SDaniel Mack INIT_LIST_HEAD(&ua->midi_list); 1235bc700ab1SDaniel Mack spin_lock_init(&ua->lock); 1236bc700ab1SDaniel Mack mutex_init(&ua->mutex); 1237bc700ab1SDaniel Mack INIT_LIST_HEAD(&ua->ready_playback_urbs); 1238bc700ab1SDaniel Mack tasklet_init(&ua->playback_tasklet, 1239bc700ab1SDaniel Mack playback_tasklet, (unsigned long)ua); 1240bc700ab1SDaniel Mack init_waitqueue_head(&ua->alsa_capture_wait); 1241bc700ab1SDaniel Mack init_waitqueue_head(&ua->rate_feedback_wait); 1242bc700ab1SDaniel Mack init_waitqueue_head(&ua->alsa_playback_wait); 1243bc700ab1SDaniel Mack 1244bc700ab1SDaniel Mack ua->intf[0] = interface; 1245bc700ab1SDaniel Mack for (i = 1; i < ARRAY_SIZE(ua->intf); ++i) { 1246bc700ab1SDaniel Mack ua->intf[i] = usb_ifnum_to_if(ua->dev, 1247bc700ab1SDaniel Mack intf_numbers[is_ua1000][i]); 1248bc700ab1SDaniel Mack if (!ua->intf[i]) { 1249bc700ab1SDaniel Mack dev_err(&ua->dev->dev, "interface %u not found\n", 1250bc700ab1SDaniel Mack intf_numbers[is_ua1000][i]); 1251bc700ab1SDaniel Mack err = -ENXIO; 1252bc700ab1SDaniel Mack goto probe_error; 1253bc700ab1SDaniel Mack } 1254bc700ab1SDaniel Mack err = usb_driver_claim_interface(&ua101_driver, 1255bc700ab1SDaniel Mack ua->intf[i], ua); 1256bc700ab1SDaniel Mack if (err < 0) { 1257bc700ab1SDaniel Mack ua->intf[i] = NULL; 1258bc700ab1SDaniel Mack err = -EBUSY; 1259bc700ab1SDaniel Mack goto probe_error; 1260bc700ab1SDaniel Mack } 1261bc700ab1SDaniel Mack } 1262bc700ab1SDaniel Mack 1263bc700ab1SDaniel Mack snd_card_set_dev(card, &interface->dev); 1264bc700ab1SDaniel Mack 1265bc700ab1SDaniel Mack err = detect_usb_format(ua); 1266bc700ab1SDaniel Mack if (err < 0) 1267bc700ab1SDaniel Mack goto probe_error; 1268bc700ab1SDaniel Mack 1269bc700ab1SDaniel Mack name = usb_id->idProduct == 0x0044 ? "UA-1000" : "UA-101"; 1270bc700ab1SDaniel Mack strcpy(card->driver, "UA-101"); 1271bc700ab1SDaniel Mack strcpy(card->shortname, name); 1272bc700ab1SDaniel Mack usb_make_path(ua->dev, usb_path, sizeof(usb_path)); 1273bc700ab1SDaniel Mack snprintf(ua->card->longname, sizeof(ua->card->longname), 1274bc700ab1SDaniel Mack "EDIROL %s (serial %s), %u Hz at %s, %s speed", name, 1275bc700ab1SDaniel Mack ua->dev->serial ? ua->dev->serial : "?", ua->rate, usb_path, 1276bc700ab1SDaniel Mack ua->dev->speed == USB_SPEED_HIGH ? "high" : "full"); 1277bc700ab1SDaniel Mack 1278bc700ab1SDaniel Mack err = alloc_stream_buffers(ua, &ua->capture); 1279bc700ab1SDaniel Mack if (err < 0) 1280bc700ab1SDaniel Mack goto probe_error; 1281bc700ab1SDaniel Mack err = alloc_stream_buffers(ua, &ua->playback); 1282bc700ab1SDaniel Mack if (err < 0) 1283bc700ab1SDaniel Mack goto probe_error; 1284bc700ab1SDaniel Mack 1285bc700ab1SDaniel Mack err = alloc_stream_urbs(ua, &ua->capture, capture_urb_complete); 1286bc700ab1SDaniel Mack if (err < 0) 1287bc700ab1SDaniel Mack goto probe_error; 1288bc700ab1SDaniel Mack err = alloc_stream_urbs(ua, &ua->playback, playback_urb_complete); 1289bc700ab1SDaniel Mack if (err < 0) 1290bc700ab1SDaniel Mack goto probe_error; 1291bc700ab1SDaniel Mack 1292bc700ab1SDaniel Mack err = snd_pcm_new(card, name, 0, 1, 1, &ua->pcm); 1293bc700ab1SDaniel Mack if (err < 0) 1294bc700ab1SDaniel Mack goto probe_error; 1295bc700ab1SDaniel Mack ua->pcm->private_data = ua; 1296bc700ab1SDaniel Mack strcpy(ua->pcm->name, name); 1297bc700ab1SDaniel Mack snd_pcm_set_ops(ua->pcm, SNDRV_PCM_STREAM_PLAYBACK, &playback_pcm_ops); 1298bc700ab1SDaniel Mack snd_pcm_set_ops(ua->pcm, SNDRV_PCM_STREAM_CAPTURE, &capture_pcm_ops); 1299bc700ab1SDaniel Mack 1300bc700ab1SDaniel Mack err = snd_usbmidi_create(card, ua->intf[INTF_MIDI], 1301bc700ab1SDaniel Mack &ua->midi_list, &midi_quirk); 1302bc700ab1SDaniel Mack if (err < 0) 1303bc700ab1SDaniel Mack goto probe_error; 1304bc700ab1SDaniel Mack 1305bc700ab1SDaniel Mack err = snd_card_register(card); 1306bc700ab1SDaniel Mack if (err < 0) 1307bc700ab1SDaniel Mack goto probe_error; 1308bc700ab1SDaniel Mack 1309bc700ab1SDaniel Mack usb_set_intfdata(interface, ua); 1310bc700ab1SDaniel Mack devices_used |= 1 << card_index; 1311bc700ab1SDaniel Mack 1312bc700ab1SDaniel Mack mutex_unlock(&devices_mutex); 1313bc700ab1SDaniel Mack return 0; 1314bc700ab1SDaniel Mack 1315bc700ab1SDaniel Mack probe_error: 1316bc700ab1SDaniel Mack free_usb_related_resources(ua, interface); 1317bc700ab1SDaniel Mack snd_card_free(card); 1318bc700ab1SDaniel Mack mutex_unlock(&devices_mutex); 1319bc700ab1SDaniel Mack return err; 1320bc700ab1SDaniel Mack } 1321bc700ab1SDaniel Mack 1322bc700ab1SDaniel Mack static void ua101_disconnect(struct usb_interface *interface) 1323bc700ab1SDaniel Mack { 1324bc700ab1SDaniel Mack struct ua101 *ua = usb_get_intfdata(interface); 1325bc700ab1SDaniel Mack struct list_head *midi; 1326bc700ab1SDaniel Mack 1327bc700ab1SDaniel Mack if (!ua) 1328bc700ab1SDaniel Mack return; 1329bc700ab1SDaniel Mack 1330bc700ab1SDaniel Mack mutex_lock(&devices_mutex); 1331bc700ab1SDaniel Mack 1332bc700ab1SDaniel Mack set_bit(DISCONNECTED, &ua->states); 1333bc700ab1SDaniel Mack wake_up(&ua->rate_feedback_wait); 1334bc700ab1SDaniel Mack 1335bc700ab1SDaniel Mack /* make sure that userspace cannot create new requests */ 1336bc700ab1SDaniel Mack snd_card_disconnect(ua->card); 1337bc700ab1SDaniel Mack 1338bc700ab1SDaniel Mack /* make sure that there are no pending USB requests */ 1339bc700ab1SDaniel Mack __list_for_each(midi, &ua->midi_list) 1340bc700ab1SDaniel Mack snd_usbmidi_disconnect(midi); 1341bc700ab1SDaniel Mack abort_alsa_playback(ua); 1342bc700ab1SDaniel Mack abort_alsa_capture(ua); 1343bc700ab1SDaniel Mack mutex_lock(&ua->mutex); 1344bc700ab1SDaniel Mack stop_usb_playback(ua); 1345bc700ab1SDaniel Mack stop_usb_capture(ua); 1346bc700ab1SDaniel Mack mutex_unlock(&ua->mutex); 1347bc700ab1SDaniel Mack 1348bc700ab1SDaniel Mack free_usb_related_resources(ua, interface); 1349bc700ab1SDaniel Mack 1350bc700ab1SDaniel Mack devices_used &= ~(1 << ua->card_index); 1351bc700ab1SDaniel Mack 1352bc700ab1SDaniel Mack snd_card_free_when_closed(ua->card); 1353bc700ab1SDaniel Mack 1354bc700ab1SDaniel Mack mutex_unlock(&devices_mutex); 1355bc700ab1SDaniel Mack } 1356bc700ab1SDaniel Mack 1357bc700ab1SDaniel Mack static struct usb_device_id ua101_ids[] = { 1358bc700ab1SDaniel Mack { USB_DEVICE(0x0582, 0x0044) }, /* UA-1000 high speed */ 1359bc700ab1SDaniel Mack { USB_DEVICE(0x0582, 0x007d) }, /* UA-101 high speed */ 1360bc700ab1SDaniel Mack { USB_DEVICE(0x0582, 0x008d) }, /* UA-101 full speed */ 1361bc700ab1SDaniel Mack { } 1362bc700ab1SDaniel Mack }; 1363bc700ab1SDaniel Mack MODULE_DEVICE_TABLE(usb, ua101_ids); 1364bc700ab1SDaniel Mack 1365bc700ab1SDaniel Mack static struct usb_driver ua101_driver = { 1366bc700ab1SDaniel Mack .name = "snd-ua101", 1367bc700ab1SDaniel Mack .id_table = ua101_ids, 1368bc700ab1SDaniel Mack .probe = ua101_probe, 1369bc700ab1SDaniel Mack .disconnect = ua101_disconnect, 1370bc700ab1SDaniel Mack #if 0 1371bc700ab1SDaniel Mack .suspend = ua101_suspend, 1372bc700ab1SDaniel Mack .resume = ua101_resume, 1373bc700ab1SDaniel Mack #endif 1374bc700ab1SDaniel Mack }; 1375bc700ab1SDaniel Mack 1376bc700ab1SDaniel Mack static int __init alsa_card_ua101_init(void) 1377bc700ab1SDaniel Mack { 1378bc700ab1SDaniel Mack return usb_register(&ua101_driver); 1379bc700ab1SDaniel Mack } 1380bc700ab1SDaniel Mack 1381bc700ab1SDaniel Mack static void __exit alsa_card_ua101_exit(void) 1382bc700ab1SDaniel Mack { 1383bc700ab1SDaniel Mack usb_deregister(&ua101_driver); 1384bc700ab1SDaniel Mack mutex_destroy(&devices_mutex); 1385bc700ab1SDaniel Mack } 1386bc700ab1SDaniel Mack 1387bc700ab1SDaniel Mack module_init(alsa_card_ua101_init); 1388bc700ab1SDaniel Mack module_exit(alsa_card_ua101_exit); 1389