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; 55a67ff6a5SRusty Russell static bool 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) 462862a6244SClemens Ladisch if (stream->urbs[i]) 463bc700ab1SDaniel Mack usb_kill_urb(&stream->urbs[i]->urb); 464bc700ab1SDaniel Mack } 465bc700ab1SDaniel Mack 466bc700ab1SDaniel Mack static int enable_iso_interface(struct ua101 *ua, unsigned int intf_index) 467bc700ab1SDaniel Mack { 468bc700ab1SDaniel Mack struct usb_host_interface *alts; 469bc700ab1SDaniel Mack 470bc700ab1SDaniel Mack alts = ua->intf[intf_index]->cur_altsetting; 471bc700ab1SDaniel Mack if (alts->desc.bAlternateSetting != 1) { 472bc700ab1SDaniel Mack int err = usb_set_interface(ua->dev, 473bc700ab1SDaniel Mack alts->desc.bInterfaceNumber, 1); 474bc700ab1SDaniel Mack if (err < 0) { 475bc700ab1SDaniel Mack dev_err(&ua->dev->dev, 476bc700ab1SDaniel Mack "cannot initialize interface; error %d: %s\n", 477bc700ab1SDaniel Mack err, usb_error_string(err)); 478bc700ab1SDaniel Mack return err; 479bc700ab1SDaniel Mack } 480bc700ab1SDaniel Mack } 481bc700ab1SDaniel Mack return 0; 482bc700ab1SDaniel Mack } 483bc700ab1SDaniel Mack 484bc700ab1SDaniel Mack static void disable_iso_interface(struct ua101 *ua, unsigned int intf_index) 485bc700ab1SDaniel Mack { 486bc700ab1SDaniel Mack struct usb_host_interface *alts; 487bc700ab1SDaniel Mack 488862a6244SClemens Ladisch if (!ua->intf[intf_index]) 489862a6244SClemens Ladisch return; 490862a6244SClemens Ladisch 491bc700ab1SDaniel Mack alts = ua->intf[intf_index]->cur_altsetting; 492bc700ab1SDaniel Mack if (alts->desc.bAlternateSetting != 0) { 493bc700ab1SDaniel Mack int err = usb_set_interface(ua->dev, 494bc700ab1SDaniel Mack alts->desc.bInterfaceNumber, 0); 495bc700ab1SDaniel Mack if (err < 0 && !test_bit(DISCONNECTED, &ua->states)) 496bc700ab1SDaniel Mack dev_warn(&ua->dev->dev, 497bc700ab1SDaniel Mack "interface reset failed; error %d: %s\n", 498bc700ab1SDaniel Mack err, usb_error_string(err)); 499bc700ab1SDaniel Mack } 500bc700ab1SDaniel Mack } 501bc700ab1SDaniel Mack 502bc700ab1SDaniel Mack static void stop_usb_capture(struct ua101 *ua) 503bc700ab1SDaniel Mack { 504bc700ab1SDaniel Mack clear_bit(USB_CAPTURE_RUNNING, &ua->states); 505bc700ab1SDaniel Mack 506bc700ab1SDaniel Mack kill_stream_urbs(&ua->capture); 507bc700ab1SDaniel Mack 508bc700ab1SDaniel Mack disable_iso_interface(ua, INTF_CAPTURE); 509bc700ab1SDaniel Mack } 510bc700ab1SDaniel Mack 511bc700ab1SDaniel Mack static int start_usb_capture(struct ua101 *ua) 512bc700ab1SDaniel Mack { 513bc700ab1SDaniel Mack int err; 514bc700ab1SDaniel Mack 515bc700ab1SDaniel Mack if (test_bit(DISCONNECTED, &ua->states)) 516bc700ab1SDaniel Mack return -ENODEV; 517bc700ab1SDaniel Mack 518bc700ab1SDaniel Mack if (test_bit(USB_CAPTURE_RUNNING, &ua->states)) 519bc700ab1SDaniel Mack return 0; 520bc700ab1SDaniel Mack 521bc700ab1SDaniel Mack kill_stream_urbs(&ua->capture); 522bc700ab1SDaniel Mack 523bc700ab1SDaniel Mack err = enable_iso_interface(ua, INTF_CAPTURE); 524bc700ab1SDaniel Mack if (err < 0) 525bc700ab1SDaniel Mack return err; 526bc700ab1SDaniel Mack 527bc700ab1SDaniel Mack clear_bit(CAPTURE_URB_COMPLETED, &ua->states); 528bc700ab1SDaniel Mack ua->capture.urbs[0]->urb.complete = first_capture_urb_complete; 529bc700ab1SDaniel Mack ua->rate_feedback_start = 0; 530bc700ab1SDaniel Mack ua->rate_feedback_count = 0; 531bc700ab1SDaniel Mack 532bc700ab1SDaniel Mack set_bit(USB_CAPTURE_RUNNING, &ua->states); 533bc700ab1SDaniel Mack err = submit_stream_urbs(ua, &ua->capture); 534bc700ab1SDaniel Mack if (err < 0) 535bc700ab1SDaniel Mack stop_usb_capture(ua); 536bc700ab1SDaniel Mack return err; 537bc700ab1SDaniel Mack } 538bc700ab1SDaniel Mack 539bc700ab1SDaniel Mack static void stop_usb_playback(struct ua101 *ua) 540bc700ab1SDaniel Mack { 541bc700ab1SDaniel Mack clear_bit(USB_PLAYBACK_RUNNING, &ua->states); 542bc700ab1SDaniel Mack 543bc700ab1SDaniel Mack kill_stream_urbs(&ua->playback); 544bc700ab1SDaniel Mack 545bc700ab1SDaniel Mack tasklet_kill(&ua->playback_tasklet); 546bc700ab1SDaniel Mack 547bc700ab1SDaniel Mack disable_iso_interface(ua, INTF_PLAYBACK); 548bc700ab1SDaniel Mack } 549bc700ab1SDaniel Mack 550bc700ab1SDaniel Mack static int start_usb_playback(struct ua101 *ua) 551bc700ab1SDaniel Mack { 552bc700ab1SDaniel Mack unsigned int i, frames; 553bc700ab1SDaniel Mack struct urb *urb; 554bc700ab1SDaniel Mack int err = 0; 555bc700ab1SDaniel Mack 556bc700ab1SDaniel Mack if (test_bit(DISCONNECTED, &ua->states)) 557bc700ab1SDaniel Mack return -ENODEV; 558bc700ab1SDaniel Mack 559bc700ab1SDaniel Mack if (test_bit(USB_PLAYBACK_RUNNING, &ua->states)) 560bc700ab1SDaniel Mack return 0; 561bc700ab1SDaniel Mack 562bc700ab1SDaniel Mack kill_stream_urbs(&ua->playback); 563bc700ab1SDaniel Mack tasklet_kill(&ua->playback_tasklet); 564bc700ab1SDaniel Mack 565bc700ab1SDaniel Mack err = enable_iso_interface(ua, INTF_PLAYBACK); 566bc700ab1SDaniel Mack if (err < 0) 567bc700ab1SDaniel Mack return err; 568bc700ab1SDaniel Mack 569bc700ab1SDaniel Mack clear_bit(PLAYBACK_URB_COMPLETED, &ua->states); 570bc700ab1SDaniel Mack ua->playback.urbs[0]->urb.complete = 571bc700ab1SDaniel Mack first_playback_urb_complete; 572bc700ab1SDaniel Mack spin_lock_irq(&ua->lock); 573bc700ab1SDaniel Mack INIT_LIST_HEAD(&ua->ready_playback_urbs); 574bc700ab1SDaniel Mack spin_unlock_irq(&ua->lock); 575bc700ab1SDaniel Mack 576bc700ab1SDaniel Mack /* 577bc700ab1SDaniel Mack * We submit the initial URBs all at once, so we have to wait for the 578bc700ab1SDaniel Mack * packet size FIFO to be full. 579bc700ab1SDaniel Mack */ 580bc700ab1SDaniel Mack wait_event(ua->rate_feedback_wait, 581bc700ab1SDaniel Mack ua->rate_feedback_count >= ua->playback.queue_length || 582bc700ab1SDaniel Mack !test_bit(USB_CAPTURE_RUNNING, &ua->states) || 583bc700ab1SDaniel Mack test_bit(DISCONNECTED, &ua->states)); 584bc700ab1SDaniel Mack if (test_bit(DISCONNECTED, &ua->states)) { 585bc700ab1SDaniel Mack stop_usb_playback(ua); 586bc700ab1SDaniel Mack return -ENODEV; 587bc700ab1SDaniel Mack } 588bc700ab1SDaniel Mack if (!test_bit(USB_CAPTURE_RUNNING, &ua->states)) { 589bc700ab1SDaniel Mack stop_usb_playback(ua); 590bc700ab1SDaniel Mack return -EIO; 591bc700ab1SDaniel Mack } 592bc700ab1SDaniel Mack 593bc700ab1SDaniel Mack for (i = 0; i < ua->playback.queue_length; ++i) { 594bc700ab1SDaniel Mack /* all initial URBs contain silence */ 595bc700ab1SDaniel Mack spin_lock_irq(&ua->lock); 596bc700ab1SDaniel Mack frames = ua->rate_feedback[ua->rate_feedback_start]; 597bc700ab1SDaniel Mack add_with_wraparound(ua, &ua->rate_feedback_start, 1); 598bc700ab1SDaniel Mack ua->rate_feedback_count--; 599bc700ab1SDaniel Mack spin_unlock_irq(&ua->lock); 600bc700ab1SDaniel Mack urb = &ua->playback.urbs[i]->urb; 601bc700ab1SDaniel Mack urb->iso_frame_desc[0].length = 602bc700ab1SDaniel Mack frames * ua->playback.frame_bytes; 603bc700ab1SDaniel Mack memset(urb->transfer_buffer, 0, 604bc700ab1SDaniel Mack urb->iso_frame_desc[0].length); 605bc700ab1SDaniel Mack } 606bc700ab1SDaniel Mack 607bc700ab1SDaniel Mack set_bit(USB_PLAYBACK_RUNNING, &ua->states); 608bc700ab1SDaniel Mack err = submit_stream_urbs(ua, &ua->playback); 609bc700ab1SDaniel Mack if (err < 0) 610bc700ab1SDaniel Mack stop_usb_playback(ua); 611bc700ab1SDaniel Mack return err; 612bc700ab1SDaniel Mack } 613bc700ab1SDaniel Mack 614bc700ab1SDaniel Mack static void abort_alsa_capture(struct ua101 *ua) 615bc700ab1SDaniel Mack { 6169538aa46STakashi Iwai unsigned long flags; 6179538aa46STakashi Iwai 6189538aa46STakashi Iwai if (test_bit(ALSA_CAPTURE_RUNNING, &ua->states)) { 6199538aa46STakashi Iwai snd_pcm_stream_lock_irqsave(ua->capture.substream, flags); 620bc700ab1SDaniel Mack snd_pcm_stop(ua->capture.substream, SNDRV_PCM_STATE_XRUN); 6219538aa46STakashi Iwai snd_pcm_stream_unlock_irqrestore(ua->capture.substream, flags); 6229538aa46STakashi Iwai } 623bc700ab1SDaniel Mack } 624bc700ab1SDaniel Mack 625bc700ab1SDaniel Mack static void abort_alsa_playback(struct ua101 *ua) 626bc700ab1SDaniel Mack { 6279538aa46STakashi Iwai unsigned long flags; 6289538aa46STakashi Iwai 6299538aa46STakashi Iwai if (test_bit(ALSA_PLAYBACK_RUNNING, &ua->states)) { 6309538aa46STakashi Iwai snd_pcm_stream_lock_irqsave(ua->playback.substream, flags); 631bc700ab1SDaniel Mack snd_pcm_stop(ua->playback.substream, SNDRV_PCM_STATE_XRUN); 6329538aa46STakashi Iwai snd_pcm_stream_unlock_irqrestore(ua->playback.substream, flags); 6339538aa46STakashi Iwai } 634bc700ab1SDaniel Mack } 635bc700ab1SDaniel Mack 636bc700ab1SDaniel Mack static int set_stream_hw(struct ua101 *ua, struct snd_pcm_substream *substream, 637bc700ab1SDaniel Mack unsigned int channels) 638bc700ab1SDaniel Mack { 639bc700ab1SDaniel Mack int err; 640bc700ab1SDaniel Mack 641bc700ab1SDaniel Mack substream->runtime->hw.info = 642bc700ab1SDaniel Mack SNDRV_PCM_INFO_MMAP | 643bc700ab1SDaniel Mack SNDRV_PCM_INFO_MMAP_VALID | 644bc700ab1SDaniel Mack SNDRV_PCM_INFO_BATCH | 645bc700ab1SDaniel Mack SNDRV_PCM_INFO_INTERLEAVED | 646bc700ab1SDaniel Mack SNDRV_PCM_INFO_BLOCK_TRANSFER | 647bc700ab1SDaniel Mack SNDRV_PCM_INFO_FIFO_IN_FRAMES; 648bc700ab1SDaniel Mack substream->runtime->hw.formats = ua->format_bit; 649bc700ab1SDaniel Mack substream->runtime->hw.rates = snd_pcm_rate_to_rate_bit(ua->rate); 650bc700ab1SDaniel Mack substream->runtime->hw.rate_min = ua->rate; 651bc700ab1SDaniel Mack substream->runtime->hw.rate_max = ua->rate; 652bc700ab1SDaniel Mack substream->runtime->hw.channels_min = channels; 653bc700ab1SDaniel Mack substream->runtime->hw.channels_max = channels; 654bc700ab1SDaniel Mack substream->runtime->hw.buffer_bytes_max = 45000 * 1024; 655bc700ab1SDaniel Mack substream->runtime->hw.period_bytes_min = 1; 656bc700ab1SDaniel Mack substream->runtime->hw.period_bytes_max = UINT_MAX; 657bc700ab1SDaniel Mack substream->runtime->hw.periods_min = 2; 658bc700ab1SDaniel Mack substream->runtime->hw.periods_max = UINT_MAX; 659bc700ab1SDaniel Mack err = snd_pcm_hw_constraint_minmax(substream->runtime, 660bc700ab1SDaniel Mack SNDRV_PCM_HW_PARAM_PERIOD_TIME, 661bc700ab1SDaniel Mack 1500000 / ua->packets_per_second, 662f4b1e98aSClemens Ladisch UINT_MAX); 663bc700ab1SDaniel Mack if (err < 0) 664bc700ab1SDaniel Mack return err; 665bc700ab1SDaniel Mack err = snd_pcm_hw_constraint_msbits(substream->runtime, 0, 32, 24); 666bc700ab1SDaniel Mack return err; 667bc700ab1SDaniel Mack } 668bc700ab1SDaniel Mack 669bc700ab1SDaniel Mack static int capture_pcm_open(struct snd_pcm_substream *substream) 670bc700ab1SDaniel Mack { 671bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 672bc700ab1SDaniel Mack int err; 673bc700ab1SDaniel Mack 674bc700ab1SDaniel Mack ua->capture.substream = substream; 675bc700ab1SDaniel Mack err = set_stream_hw(ua, substream, ua->capture.channels); 676bc700ab1SDaniel Mack if (err < 0) 677bc700ab1SDaniel Mack return err; 678bc700ab1SDaniel Mack substream->runtime->hw.fifo_size = 679bc700ab1SDaniel Mack DIV_ROUND_CLOSEST(ua->rate, ua->packets_per_second); 680bc700ab1SDaniel Mack substream->runtime->delay = substream->runtime->hw.fifo_size; 681bc700ab1SDaniel Mack 682bc700ab1SDaniel Mack mutex_lock(&ua->mutex); 683bc700ab1SDaniel Mack err = start_usb_capture(ua); 684bc700ab1SDaniel Mack if (err >= 0) 685bc700ab1SDaniel Mack set_bit(ALSA_CAPTURE_OPEN, &ua->states); 686bc700ab1SDaniel Mack mutex_unlock(&ua->mutex); 687bc700ab1SDaniel Mack return err; 688bc700ab1SDaniel Mack } 689bc700ab1SDaniel Mack 690bc700ab1SDaniel Mack static int playback_pcm_open(struct snd_pcm_substream *substream) 691bc700ab1SDaniel Mack { 692bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 693bc700ab1SDaniel Mack int err; 694bc700ab1SDaniel Mack 695bc700ab1SDaniel Mack ua->playback.substream = substream; 696bc700ab1SDaniel Mack err = set_stream_hw(ua, substream, ua->playback.channels); 697bc700ab1SDaniel Mack if (err < 0) 698bc700ab1SDaniel Mack return err; 699bc700ab1SDaniel Mack substream->runtime->hw.fifo_size = 700bc700ab1SDaniel Mack DIV_ROUND_CLOSEST(ua->rate * ua->playback.queue_length, 701bc700ab1SDaniel Mack ua->packets_per_second); 702bc700ab1SDaniel Mack 703bc700ab1SDaniel Mack mutex_lock(&ua->mutex); 704bc700ab1SDaniel Mack err = start_usb_capture(ua); 705bc700ab1SDaniel Mack if (err < 0) 706bc700ab1SDaniel Mack goto error; 707bc700ab1SDaniel Mack err = start_usb_playback(ua); 708bc700ab1SDaniel Mack if (err < 0) { 709bc700ab1SDaniel Mack if (!test_bit(ALSA_CAPTURE_OPEN, &ua->states)) 710bc700ab1SDaniel Mack stop_usb_capture(ua); 711bc700ab1SDaniel Mack goto error; 712bc700ab1SDaniel Mack } 713bc700ab1SDaniel Mack set_bit(ALSA_PLAYBACK_OPEN, &ua->states); 714bc700ab1SDaniel Mack error: 715bc700ab1SDaniel Mack mutex_unlock(&ua->mutex); 716bc700ab1SDaniel Mack return err; 717bc700ab1SDaniel Mack } 718bc700ab1SDaniel Mack 719bc700ab1SDaniel Mack static int capture_pcm_close(struct snd_pcm_substream *substream) 720bc700ab1SDaniel Mack { 721bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 722bc700ab1SDaniel Mack 723bc700ab1SDaniel Mack mutex_lock(&ua->mutex); 724bc700ab1SDaniel Mack clear_bit(ALSA_CAPTURE_OPEN, &ua->states); 725bc700ab1SDaniel Mack if (!test_bit(ALSA_PLAYBACK_OPEN, &ua->states)) 726bc700ab1SDaniel Mack stop_usb_capture(ua); 727bc700ab1SDaniel Mack mutex_unlock(&ua->mutex); 728bc700ab1SDaniel Mack return 0; 729bc700ab1SDaniel Mack } 730bc700ab1SDaniel Mack 731bc700ab1SDaniel Mack static int playback_pcm_close(struct snd_pcm_substream *substream) 732bc700ab1SDaniel Mack { 733bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 734bc700ab1SDaniel Mack 735bc700ab1SDaniel Mack mutex_lock(&ua->mutex); 736bc700ab1SDaniel Mack stop_usb_playback(ua); 737bc700ab1SDaniel Mack clear_bit(ALSA_PLAYBACK_OPEN, &ua->states); 738bc700ab1SDaniel Mack if (!test_bit(ALSA_CAPTURE_OPEN, &ua->states)) 739bc700ab1SDaniel Mack stop_usb_capture(ua); 740bc700ab1SDaniel Mack mutex_unlock(&ua->mutex); 741bc700ab1SDaniel Mack return 0; 742bc700ab1SDaniel Mack } 743bc700ab1SDaniel Mack 744bc700ab1SDaniel Mack static int capture_pcm_hw_params(struct snd_pcm_substream *substream, 745bc700ab1SDaniel Mack struct snd_pcm_hw_params *hw_params) 746bc700ab1SDaniel Mack { 747bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 748bc700ab1SDaniel Mack int err; 749bc700ab1SDaniel Mack 750bc700ab1SDaniel Mack mutex_lock(&ua->mutex); 751bc700ab1SDaniel Mack err = start_usb_capture(ua); 752bc700ab1SDaniel Mack mutex_unlock(&ua->mutex); 753bc700ab1SDaniel Mack if (err < 0) 754bc700ab1SDaniel Mack return err; 755bc700ab1SDaniel Mack 756bc700ab1SDaniel Mack return snd_pcm_lib_alloc_vmalloc_buffer(substream, 757bc700ab1SDaniel Mack params_buffer_bytes(hw_params)); 758bc700ab1SDaniel Mack } 759bc700ab1SDaniel Mack 760bc700ab1SDaniel Mack static int playback_pcm_hw_params(struct snd_pcm_substream *substream, 761bc700ab1SDaniel Mack struct snd_pcm_hw_params *hw_params) 762bc700ab1SDaniel Mack { 763bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 764bc700ab1SDaniel Mack int err; 765bc700ab1SDaniel Mack 766bc700ab1SDaniel Mack mutex_lock(&ua->mutex); 767bc700ab1SDaniel Mack err = start_usb_capture(ua); 768bc700ab1SDaniel Mack if (err >= 0) 769bc700ab1SDaniel Mack err = start_usb_playback(ua); 770bc700ab1SDaniel Mack mutex_unlock(&ua->mutex); 771bc700ab1SDaniel Mack if (err < 0) 772bc700ab1SDaniel Mack return err; 773bc700ab1SDaniel Mack 774bc700ab1SDaniel Mack return snd_pcm_lib_alloc_vmalloc_buffer(substream, 775bc700ab1SDaniel Mack params_buffer_bytes(hw_params)); 776bc700ab1SDaniel Mack } 777bc700ab1SDaniel Mack 778bc700ab1SDaniel Mack static int ua101_pcm_hw_free(struct snd_pcm_substream *substream) 779bc700ab1SDaniel Mack { 780bc700ab1SDaniel Mack return snd_pcm_lib_free_vmalloc_buffer(substream); 781bc700ab1SDaniel Mack } 782bc700ab1SDaniel Mack 783bc700ab1SDaniel Mack static int capture_pcm_prepare(struct snd_pcm_substream *substream) 784bc700ab1SDaniel Mack { 785bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 786bc700ab1SDaniel Mack int err; 787bc700ab1SDaniel Mack 788bc700ab1SDaniel Mack mutex_lock(&ua->mutex); 789bc700ab1SDaniel Mack err = start_usb_capture(ua); 790bc700ab1SDaniel Mack mutex_unlock(&ua->mutex); 791bc700ab1SDaniel Mack if (err < 0) 792bc700ab1SDaniel Mack return err; 793bc700ab1SDaniel Mack 794bc700ab1SDaniel Mack /* 795bc700ab1SDaniel Mack * The EHCI driver schedules the first packet of an iso stream at 10 ms 796bc700ab1SDaniel Mack * in the future, i.e., no data is actually captured for that long. 797bc700ab1SDaniel Mack * Take the wait here so that the stream is known to be actually 798bc700ab1SDaniel Mack * running when the start trigger has been called. 799bc700ab1SDaniel Mack */ 800bc700ab1SDaniel Mack wait_event(ua->alsa_capture_wait, 801bc700ab1SDaniel Mack test_bit(CAPTURE_URB_COMPLETED, &ua->states) || 802bc700ab1SDaniel Mack !test_bit(USB_CAPTURE_RUNNING, &ua->states)); 803bc700ab1SDaniel Mack if (test_bit(DISCONNECTED, &ua->states)) 804bc700ab1SDaniel Mack return -ENODEV; 805bc700ab1SDaniel Mack if (!test_bit(USB_CAPTURE_RUNNING, &ua->states)) 806bc700ab1SDaniel Mack return -EIO; 807bc700ab1SDaniel Mack 808bc700ab1SDaniel Mack ua->capture.period_pos = 0; 809bc700ab1SDaniel Mack ua->capture.buffer_pos = 0; 810bc700ab1SDaniel Mack return 0; 811bc700ab1SDaniel Mack } 812bc700ab1SDaniel Mack 813bc700ab1SDaniel Mack static int playback_pcm_prepare(struct snd_pcm_substream *substream) 814bc700ab1SDaniel Mack { 815bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 816bc700ab1SDaniel Mack int err; 817bc700ab1SDaniel Mack 818bc700ab1SDaniel Mack mutex_lock(&ua->mutex); 819bc700ab1SDaniel Mack err = start_usb_capture(ua); 820bc700ab1SDaniel Mack if (err >= 0) 821bc700ab1SDaniel Mack err = start_usb_playback(ua); 822bc700ab1SDaniel Mack mutex_unlock(&ua->mutex); 823bc700ab1SDaniel Mack if (err < 0) 824bc700ab1SDaniel Mack return err; 825bc700ab1SDaniel Mack 826bc700ab1SDaniel Mack /* see the comment in capture_pcm_prepare() */ 827bc700ab1SDaniel Mack wait_event(ua->alsa_playback_wait, 828bc700ab1SDaniel Mack test_bit(PLAYBACK_URB_COMPLETED, &ua->states) || 829bc700ab1SDaniel Mack !test_bit(USB_PLAYBACK_RUNNING, &ua->states)); 830bc700ab1SDaniel Mack if (test_bit(DISCONNECTED, &ua->states)) 831bc700ab1SDaniel Mack return -ENODEV; 832bc700ab1SDaniel Mack if (!test_bit(USB_PLAYBACK_RUNNING, &ua->states)) 833bc700ab1SDaniel Mack return -EIO; 834bc700ab1SDaniel Mack 835bc700ab1SDaniel Mack substream->runtime->delay = 0; 836bc700ab1SDaniel Mack ua->playback.period_pos = 0; 837bc700ab1SDaniel Mack ua->playback.buffer_pos = 0; 838bc700ab1SDaniel Mack return 0; 839bc700ab1SDaniel Mack } 840bc700ab1SDaniel Mack 841bc700ab1SDaniel Mack static int capture_pcm_trigger(struct snd_pcm_substream *substream, int cmd) 842bc700ab1SDaniel Mack { 843bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 844bc700ab1SDaniel Mack 845bc700ab1SDaniel Mack switch (cmd) { 846bc700ab1SDaniel Mack case SNDRV_PCM_TRIGGER_START: 847bc700ab1SDaniel Mack if (!test_bit(USB_CAPTURE_RUNNING, &ua->states)) 848bc700ab1SDaniel Mack return -EIO; 849bc700ab1SDaniel Mack set_bit(ALSA_CAPTURE_RUNNING, &ua->states); 850bc700ab1SDaniel Mack return 0; 851bc700ab1SDaniel Mack case SNDRV_PCM_TRIGGER_STOP: 852bc700ab1SDaniel Mack clear_bit(ALSA_CAPTURE_RUNNING, &ua->states); 853bc700ab1SDaniel Mack return 0; 854bc700ab1SDaniel Mack default: 855bc700ab1SDaniel Mack return -EINVAL; 856bc700ab1SDaniel Mack } 857bc700ab1SDaniel Mack } 858bc700ab1SDaniel Mack 859bc700ab1SDaniel Mack static int playback_pcm_trigger(struct snd_pcm_substream *substream, int cmd) 860bc700ab1SDaniel Mack { 861bc700ab1SDaniel Mack struct ua101 *ua = substream->private_data; 862bc700ab1SDaniel Mack 863bc700ab1SDaniel Mack switch (cmd) { 864bc700ab1SDaniel Mack case SNDRV_PCM_TRIGGER_START: 865bc700ab1SDaniel Mack if (!test_bit(USB_PLAYBACK_RUNNING, &ua->states)) 866bc700ab1SDaniel Mack return -EIO; 867bc700ab1SDaniel Mack set_bit(ALSA_PLAYBACK_RUNNING, &ua->states); 868bc700ab1SDaniel Mack return 0; 869bc700ab1SDaniel Mack case SNDRV_PCM_TRIGGER_STOP: 870bc700ab1SDaniel Mack clear_bit(ALSA_PLAYBACK_RUNNING, &ua->states); 871bc700ab1SDaniel Mack return 0; 872bc700ab1SDaniel Mack default: 873bc700ab1SDaniel Mack return -EINVAL; 874bc700ab1SDaniel Mack } 875bc700ab1SDaniel Mack } 876bc700ab1SDaniel Mack 877bc700ab1SDaniel Mack static inline snd_pcm_uframes_t ua101_pcm_pointer(struct ua101 *ua, 878bc700ab1SDaniel Mack struct ua101_stream *stream) 879bc700ab1SDaniel Mack { 880bc700ab1SDaniel Mack unsigned long flags; 881bc700ab1SDaniel Mack unsigned int pos; 882bc700ab1SDaniel Mack 883bc700ab1SDaniel Mack spin_lock_irqsave(&ua->lock, flags); 884bc700ab1SDaniel Mack pos = stream->buffer_pos; 885bc700ab1SDaniel Mack spin_unlock_irqrestore(&ua->lock, flags); 886bc700ab1SDaniel Mack return pos; 887bc700ab1SDaniel Mack } 888bc700ab1SDaniel Mack 889bc700ab1SDaniel Mack static snd_pcm_uframes_t capture_pcm_pointer(struct snd_pcm_substream *subs) 890bc700ab1SDaniel Mack { 891bc700ab1SDaniel Mack struct ua101 *ua = subs->private_data; 892bc700ab1SDaniel Mack 893bc700ab1SDaniel Mack return ua101_pcm_pointer(ua, &ua->capture); 894bc700ab1SDaniel Mack } 895bc700ab1SDaniel Mack 896bc700ab1SDaniel Mack static snd_pcm_uframes_t playback_pcm_pointer(struct snd_pcm_substream *subs) 897bc700ab1SDaniel Mack { 898bc700ab1SDaniel Mack struct ua101 *ua = subs->private_data; 899bc700ab1SDaniel Mack 900bc700ab1SDaniel Mack return ua101_pcm_pointer(ua, &ua->playback); 901bc700ab1SDaniel Mack } 902bc700ab1SDaniel Mack 903bc700ab1SDaniel Mack static struct snd_pcm_ops capture_pcm_ops = { 904bc700ab1SDaniel Mack .open = capture_pcm_open, 905bc700ab1SDaniel Mack .close = capture_pcm_close, 906bc700ab1SDaniel Mack .ioctl = snd_pcm_lib_ioctl, 907bc700ab1SDaniel Mack .hw_params = capture_pcm_hw_params, 908bc700ab1SDaniel Mack .hw_free = ua101_pcm_hw_free, 909bc700ab1SDaniel Mack .prepare = capture_pcm_prepare, 910bc700ab1SDaniel Mack .trigger = capture_pcm_trigger, 911bc700ab1SDaniel Mack .pointer = capture_pcm_pointer, 912bc700ab1SDaniel Mack .page = snd_pcm_lib_get_vmalloc_page, 913bc700ab1SDaniel Mack .mmap = snd_pcm_lib_mmap_vmalloc, 914bc700ab1SDaniel Mack }; 915bc700ab1SDaniel Mack 916bc700ab1SDaniel Mack static struct snd_pcm_ops playback_pcm_ops = { 917bc700ab1SDaniel Mack .open = playback_pcm_open, 918bc700ab1SDaniel Mack .close = playback_pcm_close, 919bc700ab1SDaniel Mack .ioctl = snd_pcm_lib_ioctl, 920bc700ab1SDaniel Mack .hw_params = playback_pcm_hw_params, 921bc700ab1SDaniel Mack .hw_free = ua101_pcm_hw_free, 922bc700ab1SDaniel Mack .prepare = playback_pcm_prepare, 923bc700ab1SDaniel Mack .trigger = playback_pcm_trigger, 924bc700ab1SDaniel Mack .pointer = playback_pcm_pointer, 925bc700ab1SDaniel Mack .page = snd_pcm_lib_get_vmalloc_page, 926bc700ab1SDaniel Mack .mmap = snd_pcm_lib_mmap_vmalloc, 927bc700ab1SDaniel Mack }; 928bc700ab1SDaniel Mack 929bc700ab1SDaniel Mack static const struct uac_format_type_i_discrete_descriptor * 930bc700ab1SDaniel Mack find_format_descriptor(struct usb_interface *interface) 931bc700ab1SDaniel Mack { 932bc700ab1SDaniel Mack struct usb_host_interface *alt; 933bc700ab1SDaniel Mack u8 *extra; 934bc700ab1SDaniel Mack int extralen; 935bc700ab1SDaniel Mack 936bc700ab1SDaniel Mack if (interface->num_altsetting != 2) { 937bc700ab1SDaniel Mack dev_err(&interface->dev, "invalid num_altsetting\n"); 938bc700ab1SDaniel Mack return NULL; 939bc700ab1SDaniel Mack } 940bc700ab1SDaniel Mack 941bc700ab1SDaniel Mack alt = &interface->altsetting[0]; 942bc700ab1SDaniel Mack if (alt->desc.bNumEndpoints != 0) { 943bc700ab1SDaniel Mack dev_err(&interface->dev, "invalid bNumEndpoints\n"); 944bc700ab1SDaniel Mack return NULL; 945bc700ab1SDaniel Mack } 946bc700ab1SDaniel Mack 947bc700ab1SDaniel Mack alt = &interface->altsetting[1]; 948bc700ab1SDaniel Mack if (alt->desc.bNumEndpoints != 1) { 949bc700ab1SDaniel Mack dev_err(&interface->dev, "invalid bNumEndpoints\n"); 950bc700ab1SDaniel Mack return NULL; 951bc700ab1SDaniel Mack } 952bc700ab1SDaniel Mack 953bc700ab1SDaniel Mack extra = alt->extra; 954bc700ab1SDaniel Mack extralen = alt->extralen; 955bc700ab1SDaniel Mack while (extralen >= sizeof(struct usb_descriptor_header)) { 956bc700ab1SDaniel Mack struct uac_format_type_i_discrete_descriptor *desc; 957bc700ab1SDaniel Mack 958bc700ab1SDaniel Mack desc = (struct uac_format_type_i_discrete_descriptor *)extra; 959bc700ab1SDaniel Mack if (desc->bLength > extralen) { 960bc700ab1SDaniel Mack dev_err(&interface->dev, "descriptor overflow\n"); 961bc700ab1SDaniel Mack return NULL; 962bc700ab1SDaniel Mack } 963bc700ab1SDaniel Mack if (desc->bLength == UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(1) && 964bc700ab1SDaniel Mack desc->bDescriptorType == USB_DT_CS_INTERFACE && 965bc700ab1SDaniel Mack desc->bDescriptorSubtype == UAC_FORMAT_TYPE) { 966bc700ab1SDaniel Mack if (desc->bFormatType != UAC_FORMAT_TYPE_I_PCM || 967bc700ab1SDaniel Mack desc->bSamFreqType != 1) { 968bc700ab1SDaniel Mack dev_err(&interface->dev, 969bc700ab1SDaniel Mack "invalid format type\n"); 970bc700ab1SDaniel Mack return NULL; 971bc700ab1SDaniel Mack } 972bc700ab1SDaniel Mack return desc; 973bc700ab1SDaniel Mack } 974bc700ab1SDaniel Mack extralen -= desc->bLength; 975bc700ab1SDaniel Mack extra += desc->bLength; 976bc700ab1SDaniel Mack } 977bc700ab1SDaniel Mack dev_err(&interface->dev, "sample format descriptor not found\n"); 978bc700ab1SDaniel Mack return NULL; 979bc700ab1SDaniel Mack } 980bc700ab1SDaniel Mack 981bc700ab1SDaniel Mack static int detect_usb_format(struct ua101 *ua) 982bc700ab1SDaniel Mack { 983bc700ab1SDaniel Mack const struct uac_format_type_i_discrete_descriptor *fmt_capture; 984bc700ab1SDaniel Mack const struct uac_format_type_i_discrete_descriptor *fmt_playback; 985bc700ab1SDaniel Mack const struct usb_endpoint_descriptor *epd; 986bc700ab1SDaniel Mack unsigned int rate2; 987bc700ab1SDaniel Mack 988bc700ab1SDaniel Mack fmt_capture = find_format_descriptor(ua->intf[INTF_CAPTURE]); 989bc700ab1SDaniel Mack fmt_playback = find_format_descriptor(ua->intf[INTF_PLAYBACK]); 990bc700ab1SDaniel Mack if (!fmt_capture || !fmt_playback) 991bc700ab1SDaniel Mack return -ENXIO; 992bc700ab1SDaniel Mack 993bc700ab1SDaniel Mack switch (fmt_capture->bSubframeSize) { 994bc700ab1SDaniel Mack case 3: 995bc700ab1SDaniel Mack ua->format_bit = SNDRV_PCM_FMTBIT_S24_3LE; 996bc700ab1SDaniel Mack break; 997bc700ab1SDaniel Mack case 4: 998bc700ab1SDaniel Mack ua->format_bit = SNDRV_PCM_FMTBIT_S32_LE; 999bc700ab1SDaniel Mack break; 1000bc700ab1SDaniel Mack default: 1001bc700ab1SDaniel Mack dev_err(&ua->dev->dev, "sample width is not 24 or 32 bits\n"); 1002bc700ab1SDaniel Mack return -ENXIO; 1003bc700ab1SDaniel Mack } 1004bc700ab1SDaniel Mack if (fmt_capture->bSubframeSize != fmt_playback->bSubframeSize) { 1005bc700ab1SDaniel Mack dev_err(&ua->dev->dev, 1006bc700ab1SDaniel Mack "playback/capture sample widths do not match\n"); 1007bc700ab1SDaniel Mack return -ENXIO; 1008bc700ab1SDaniel Mack } 1009bc700ab1SDaniel Mack 1010bc700ab1SDaniel Mack if (fmt_capture->bBitResolution != 24 || 1011bc700ab1SDaniel Mack fmt_playback->bBitResolution != 24) { 1012bc700ab1SDaniel Mack dev_err(&ua->dev->dev, "sample width is not 24 bits\n"); 1013bc700ab1SDaniel Mack return -ENXIO; 1014bc700ab1SDaniel Mack } 1015bc700ab1SDaniel Mack 1016bc700ab1SDaniel Mack ua->rate = combine_triple(fmt_capture->tSamFreq[0]); 1017bc700ab1SDaniel Mack rate2 = combine_triple(fmt_playback->tSamFreq[0]); 1018bc700ab1SDaniel Mack if (ua->rate != rate2) { 1019bc700ab1SDaniel Mack dev_err(&ua->dev->dev, 1020bc700ab1SDaniel Mack "playback/capture rates do not match: %u/%u\n", 1021bc700ab1SDaniel Mack rate2, ua->rate); 1022bc700ab1SDaniel Mack return -ENXIO; 1023bc700ab1SDaniel Mack } 1024bc700ab1SDaniel Mack 1025bc700ab1SDaniel Mack switch (ua->dev->speed) { 1026bc700ab1SDaniel Mack case USB_SPEED_FULL: 1027bc700ab1SDaniel Mack ua->packets_per_second = 1000; 1028bc700ab1SDaniel Mack break; 1029bc700ab1SDaniel Mack case USB_SPEED_HIGH: 1030bc700ab1SDaniel Mack ua->packets_per_second = 8000; 1031bc700ab1SDaniel Mack break; 1032bc700ab1SDaniel Mack default: 1033bc700ab1SDaniel Mack dev_err(&ua->dev->dev, "unknown device speed\n"); 1034bc700ab1SDaniel Mack return -ENXIO; 1035bc700ab1SDaniel Mack } 1036bc700ab1SDaniel Mack 1037bc700ab1SDaniel Mack ua->capture.channels = fmt_capture->bNrChannels; 1038bc700ab1SDaniel Mack ua->playback.channels = fmt_playback->bNrChannels; 1039bc700ab1SDaniel Mack ua->capture.frame_bytes = 1040bc700ab1SDaniel Mack fmt_capture->bSubframeSize * ua->capture.channels; 1041bc700ab1SDaniel Mack ua->playback.frame_bytes = 1042bc700ab1SDaniel Mack fmt_playback->bSubframeSize * ua->playback.channels; 1043bc700ab1SDaniel Mack 1044bc700ab1SDaniel Mack epd = &ua->intf[INTF_CAPTURE]->altsetting[1].endpoint[0].desc; 1045bc700ab1SDaniel Mack if (!usb_endpoint_is_isoc_in(epd)) { 1046bc700ab1SDaniel Mack dev_err(&ua->dev->dev, "invalid capture endpoint\n"); 1047bc700ab1SDaniel Mack return -ENXIO; 1048bc700ab1SDaniel Mack } 1049bc700ab1SDaniel Mack ua->capture.usb_pipe = usb_rcvisocpipe(ua->dev, usb_endpoint_num(epd)); 1050bc700ab1SDaniel Mack ua->capture.max_packet_bytes = le16_to_cpu(epd->wMaxPacketSize); 1051bc700ab1SDaniel Mack 1052bc700ab1SDaniel Mack epd = &ua->intf[INTF_PLAYBACK]->altsetting[1].endpoint[0].desc; 1053bc700ab1SDaniel Mack if (!usb_endpoint_is_isoc_out(epd)) { 1054bc700ab1SDaniel Mack dev_err(&ua->dev->dev, "invalid playback endpoint\n"); 1055bc700ab1SDaniel Mack return -ENXIO; 1056bc700ab1SDaniel Mack } 1057bc700ab1SDaniel Mack ua->playback.usb_pipe = usb_sndisocpipe(ua->dev, usb_endpoint_num(epd)); 1058bc700ab1SDaniel Mack ua->playback.max_packet_bytes = le16_to_cpu(epd->wMaxPacketSize); 1059bc700ab1SDaniel Mack return 0; 1060bc700ab1SDaniel Mack } 1061bc700ab1SDaniel Mack 1062bc700ab1SDaniel Mack static int alloc_stream_buffers(struct ua101 *ua, struct ua101_stream *stream) 1063bc700ab1SDaniel Mack { 1064bc700ab1SDaniel Mack unsigned int remaining_packets, packets, packets_per_page, i; 1065bc700ab1SDaniel Mack size_t size; 1066bc700ab1SDaniel Mack 1067bc700ab1SDaniel Mack stream->queue_length = queue_length; 1068bc700ab1SDaniel Mack stream->queue_length = max(stream->queue_length, 1069bc700ab1SDaniel Mack (unsigned int)MIN_QUEUE_LENGTH); 1070bc700ab1SDaniel Mack stream->queue_length = min(stream->queue_length, 1071bc700ab1SDaniel Mack (unsigned int)MAX_QUEUE_LENGTH); 1072bc700ab1SDaniel Mack 1073bc700ab1SDaniel Mack /* 10747a9b1492SLinus Torvalds * The cache pool sizes used by usb_alloc_coherent() (128, 512, 2048) are 1075bc700ab1SDaniel Mack * quite bad when used with the packet sizes of this device (e.g. 280, 1076bc700ab1SDaniel Mack * 520, 624). Therefore, we allocate and subdivide entire pages, using 1077bc700ab1SDaniel Mack * a smaller buffer only for the last chunk. 1078bc700ab1SDaniel Mack */ 1079bc700ab1SDaniel Mack remaining_packets = stream->queue_length; 1080bc700ab1SDaniel Mack packets_per_page = PAGE_SIZE / stream->max_packet_bytes; 1081bc700ab1SDaniel Mack for (i = 0; i < ARRAY_SIZE(stream->buffers); ++i) { 1082bc700ab1SDaniel Mack packets = min(remaining_packets, packets_per_page); 1083bc700ab1SDaniel Mack size = packets * stream->max_packet_bytes; 1084bc700ab1SDaniel Mack stream->buffers[i].addr = 10857a9b1492SLinus Torvalds usb_alloc_coherent(ua->dev, size, GFP_KERNEL, 1086bc700ab1SDaniel Mack &stream->buffers[i].dma); 1087bc700ab1SDaniel Mack if (!stream->buffers[i].addr) 1088bc700ab1SDaniel Mack return -ENOMEM; 1089bc700ab1SDaniel Mack stream->buffers[i].size = size; 1090bc700ab1SDaniel Mack remaining_packets -= packets; 1091bc700ab1SDaniel Mack if (!remaining_packets) 1092bc700ab1SDaniel Mack break; 1093bc700ab1SDaniel Mack } 1094bc700ab1SDaniel Mack if (remaining_packets) { 1095bc700ab1SDaniel Mack dev_err(&ua->dev->dev, "too many packets\n"); 1096bc700ab1SDaniel Mack return -ENXIO; 1097bc700ab1SDaniel Mack } 1098bc700ab1SDaniel Mack return 0; 1099bc700ab1SDaniel Mack } 1100bc700ab1SDaniel Mack 1101bc700ab1SDaniel Mack static void free_stream_buffers(struct ua101 *ua, struct ua101_stream *stream) 1102bc700ab1SDaniel Mack { 1103bc700ab1SDaniel Mack unsigned int i; 1104bc700ab1SDaniel Mack 1105bc700ab1SDaniel Mack for (i = 0; i < ARRAY_SIZE(stream->buffers); ++i) 11067a9b1492SLinus Torvalds usb_free_coherent(ua->dev, 1107bc700ab1SDaniel Mack stream->buffers[i].size, 1108bc700ab1SDaniel Mack stream->buffers[i].addr, 1109bc700ab1SDaniel Mack stream->buffers[i].dma); 1110bc700ab1SDaniel Mack } 1111bc700ab1SDaniel Mack 1112bc700ab1SDaniel Mack static int alloc_stream_urbs(struct ua101 *ua, struct ua101_stream *stream, 1113bc700ab1SDaniel Mack void (*urb_complete)(struct urb *)) 1114bc700ab1SDaniel Mack { 1115bc700ab1SDaniel Mack unsigned max_packet_size = stream->max_packet_bytes; 1116bc700ab1SDaniel Mack struct ua101_urb *urb; 1117bc700ab1SDaniel Mack unsigned int b, u = 0; 1118bc700ab1SDaniel Mack 1119bc700ab1SDaniel Mack for (b = 0; b < ARRAY_SIZE(stream->buffers); ++b) { 1120bc700ab1SDaniel Mack unsigned int size = stream->buffers[b].size; 1121bc700ab1SDaniel Mack u8 *addr = stream->buffers[b].addr; 1122bc700ab1SDaniel Mack dma_addr_t dma = stream->buffers[b].dma; 1123bc700ab1SDaniel Mack 1124bc700ab1SDaniel Mack while (size >= max_packet_size) { 1125bc700ab1SDaniel Mack if (u >= stream->queue_length) 1126bc700ab1SDaniel Mack goto bufsize_error; 1127bc700ab1SDaniel Mack urb = kmalloc(sizeof(*urb), GFP_KERNEL); 1128bc700ab1SDaniel Mack if (!urb) 1129bc700ab1SDaniel Mack return -ENOMEM; 1130bc700ab1SDaniel Mack usb_init_urb(&urb->urb); 1131bc700ab1SDaniel Mack urb->urb.dev = ua->dev; 1132bc700ab1SDaniel Mack urb->urb.pipe = stream->usb_pipe; 1133c75c5ab5SClemens Ladisch urb->urb.transfer_flags = URB_NO_TRANSFER_DMA_MAP; 1134bc700ab1SDaniel Mack urb->urb.transfer_buffer = addr; 1135bc700ab1SDaniel Mack urb->urb.transfer_dma = dma; 1136bc700ab1SDaniel Mack urb->urb.transfer_buffer_length = max_packet_size; 1137bc700ab1SDaniel Mack urb->urb.number_of_packets = 1; 1138bc700ab1SDaniel Mack urb->urb.interval = 1; 1139bc700ab1SDaniel Mack urb->urb.context = ua; 1140bc700ab1SDaniel Mack urb->urb.complete = urb_complete; 1141bc700ab1SDaniel Mack urb->urb.iso_frame_desc[0].offset = 0; 1142bc700ab1SDaniel Mack urb->urb.iso_frame_desc[0].length = max_packet_size; 1143bc700ab1SDaniel Mack stream->urbs[u++] = urb; 1144bc700ab1SDaniel Mack size -= max_packet_size; 1145bc700ab1SDaniel Mack addr += max_packet_size; 1146bc700ab1SDaniel Mack dma += max_packet_size; 1147bc700ab1SDaniel Mack } 1148bc700ab1SDaniel Mack } 1149bc700ab1SDaniel Mack if (u == stream->queue_length) 1150bc700ab1SDaniel Mack return 0; 1151bc700ab1SDaniel Mack bufsize_error: 1152bc700ab1SDaniel Mack dev_err(&ua->dev->dev, "internal buffer size error\n"); 1153bc700ab1SDaniel Mack return -ENXIO; 1154bc700ab1SDaniel Mack } 1155bc700ab1SDaniel Mack 1156bc700ab1SDaniel Mack static void free_stream_urbs(struct ua101_stream *stream) 1157bc700ab1SDaniel Mack { 1158bc700ab1SDaniel Mack unsigned int i; 1159bc700ab1SDaniel Mack 1160862a6244SClemens Ladisch for (i = 0; i < stream->queue_length; ++i) { 1161bc700ab1SDaniel Mack kfree(stream->urbs[i]); 1162862a6244SClemens Ladisch stream->urbs[i] = NULL; 1163862a6244SClemens Ladisch } 1164bc700ab1SDaniel Mack } 1165bc700ab1SDaniel Mack 1166bc700ab1SDaniel Mack static void free_usb_related_resources(struct ua101 *ua, 1167bc700ab1SDaniel Mack struct usb_interface *interface) 1168bc700ab1SDaniel Mack { 1169bc700ab1SDaniel Mack unsigned int i; 1170862a6244SClemens Ladisch struct usb_interface *intf; 1171bc700ab1SDaniel Mack 1172862a6244SClemens Ladisch mutex_lock(&ua->mutex); 1173bc700ab1SDaniel Mack free_stream_urbs(&ua->capture); 1174bc700ab1SDaniel Mack free_stream_urbs(&ua->playback); 1175862a6244SClemens Ladisch mutex_unlock(&ua->mutex); 1176bc700ab1SDaniel Mack free_stream_buffers(ua, &ua->capture); 1177bc700ab1SDaniel Mack free_stream_buffers(ua, &ua->playback); 1178bc700ab1SDaniel Mack 1179862a6244SClemens Ladisch for (i = 0; i < ARRAY_SIZE(ua->intf); ++i) { 1180862a6244SClemens Ladisch mutex_lock(&ua->mutex); 1181862a6244SClemens Ladisch intf = ua->intf[i]; 1182862a6244SClemens Ladisch ua->intf[i] = NULL; 1183862a6244SClemens Ladisch mutex_unlock(&ua->mutex); 1184862a6244SClemens Ladisch if (intf) { 1185862a6244SClemens Ladisch usb_set_intfdata(intf, NULL); 1186862a6244SClemens Ladisch if (intf != interface) 1187bc700ab1SDaniel Mack usb_driver_release_interface(&ua101_driver, 1188862a6244SClemens Ladisch intf); 1189862a6244SClemens Ladisch } 1190bc700ab1SDaniel Mack } 1191bc700ab1SDaniel Mack } 1192bc700ab1SDaniel Mack 1193bc700ab1SDaniel Mack static void ua101_card_free(struct snd_card *card) 1194bc700ab1SDaniel Mack { 1195bc700ab1SDaniel Mack struct ua101 *ua = card->private_data; 1196bc700ab1SDaniel Mack 1197bc700ab1SDaniel Mack mutex_destroy(&ua->mutex); 1198bc700ab1SDaniel Mack } 1199bc700ab1SDaniel Mack 1200bc700ab1SDaniel Mack static int ua101_probe(struct usb_interface *interface, 1201bc700ab1SDaniel Mack const struct usb_device_id *usb_id) 1202bc700ab1SDaniel Mack { 1203bc700ab1SDaniel Mack static const struct snd_usb_midi_endpoint_info midi_ep = { 1204bc700ab1SDaniel Mack .out_cables = 0x0001, 1205bc700ab1SDaniel Mack .in_cables = 0x0001 1206bc700ab1SDaniel Mack }; 1207bc700ab1SDaniel Mack static const struct snd_usb_audio_quirk midi_quirk = { 1208bc700ab1SDaniel Mack .type = QUIRK_MIDI_FIXED_ENDPOINT, 1209bc700ab1SDaniel Mack .data = &midi_ep 1210bc700ab1SDaniel Mack }; 1211bc700ab1SDaniel Mack static const int intf_numbers[2][3] = { 1212bc700ab1SDaniel Mack { /* UA-101 */ 1213bc700ab1SDaniel Mack [INTF_PLAYBACK] = 0, 1214bc700ab1SDaniel Mack [INTF_CAPTURE] = 1, 1215bc700ab1SDaniel Mack [INTF_MIDI] = 2, 1216bc700ab1SDaniel Mack }, 1217bc700ab1SDaniel Mack { /* UA-1000 */ 1218bc700ab1SDaniel Mack [INTF_CAPTURE] = 1, 1219bc700ab1SDaniel Mack [INTF_PLAYBACK] = 2, 1220bc700ab1SDaniel Mack [INTF_MIDI] = 3, 1221bc700ab1SDaniel Mack }, 1222bc700ab1SDaniel Mack }; 1223bc700ab1SDaniel Mack struct snd_card *card; 1224bc700ab1SDaniel Mack struct ua101 *ua; 1225bc700ab1SDaniel Mack unsigned int card_index, i; 1226bc700ab1SDaniel Mack int is_ua1000; 1227bc700ab1SDaniel Mack const char *name; 1228bc700ab1SDaniel Mack char usb_path[32]; 1229bc700ab1SDaniel Mack int err; 1230bc700ab1SDaniel Mack 1231bc700ab1SDaniel Mack is_ua1000 = usb_id->idProduct == 0x0044; 1232bc700ab1SDaniel Mack 1233bc700ab1SDaniel Mack if (interface->altsetting->desc.bInterfaceNumber != 1234bc700ab1SDaniel Mack intf_numbers[is_ua1000][0]) 1235bc700ab1SDaniel Mack return -ENODEV; 1236bc700ab1SDaniel Mack 1237bc700ab1SDaniel Mack mutex_lock(&devices_mutex); 1238bc700ab1SDaniel Mack 1239bc700ab1SDaniel Mack for (card_index = 0; card_index < SNDRV_CARDS; ++card_index) 1240bc700ab1SDaniel Mack if (enable[card_index] && !(devices_used & (1 << card_index))) 1241bc700ab1SDaniel Mack break; 1242bc700ab1SDaniel Mack if (card_index >= SNDRV_CARDS) { 1243bc700ab1SDaniel Mack mutex_unlock(&devices_mutex); 1244bc700ab1SDaniel Mack return -ENOENT; 1245bc700ab1SDaniel Mack } 1246874b8d42STakashi Iwai err = snd_card_new(&interface->dev, 1247874b8d42STakashi Iwai index[card_index], id[card_index], THIS_MODULE, 1248bc700ab1SDaniel Mack sizeof(*ua), &card); 1249bc700ab1SDaniel Mack if (err < 0) { 1250bc700ab1SDaniel Mack mutex_unlock(&devices_mutex); 1251bc700ab1SDaniel Mack return err; 1252bc700ab1SDaniel Mack } 1253bc700ab1SDaniel Mack card->private_free = ua101_card_free; 1254bc700ab1SDaniel Mack ua = card->private_data; 1255bc700ab1SDaniel Mack ua->dev = interface_to_usbdev(interface); 1256bc700ab1SDaniel Mack ua->card = card; 1257bc700ab1SDaniel Mack ua->card_index = card_index; 1258bc700ab1SDaniel Mack INIT_LIST_HEAD(&ua->midi_list); 1259bc700ab1SDaniel Mack spin_lock_init(&ua->lock); 1260bc700ab1SDaniel Mack mutex_init(&ua->mutex); 1261bc700ab1SDaniel Mack INIT_LIST_HEAD(&ua->ready_playback_urbs); 1262bc700ab1SDaniel Mack tasklet_init(&ua->playback_tasklet, 1263bc700ab1SDaniel Mack playback_tasklet, (unsigned long)ua); 1264bc700ab1SDaniel Mack init_waitqueue_head(&ua->alsa_capture_wait); 1265bc700ab1SDaniel Mack init_waitqueue_head(&ua->rate_feedback_wait); 1266bc700ab1SDaniel Mack init_waitqueue_head(&ua->alsa_playback_wait); 1267bc700ab1SDaniel Mack 1268bc700ab1SDaniel Mack ua->intf[0] = interface; 1269bc700ab1SDaniel Mack for (i = 1; i < ARRAY_SIZE(ua->intf); ++i) { 1270bc700ab1SDaniel Mack ua->intf[i] = usb_ifnum_to_if(ua->dev, 1271bc700ab1SDaniel Mack intf_numbers[is_ua1000][i]); 1272bc700ab1SDaniel Mack if (!ua->intf[i]) { 1273bc700ab1SDaniel Mack dev_err(&ua->dev->dev, "interface %u not found\n", 1274bc700ab1SDaniel Mack intf_numbers[is_ua1000][i]); 1275bc700ab1SDaniel Mack err = -ENXIO; 1276bc700ab1SDaniel Mack goto probe_error; 1277bc700ab1SDaniel Mack } 1278bc700ab1SDaniel Mack err = usb_driver_claim_interface(&ua101_driver, 1279bc700ab1SDaniel Mack ua->intf[i], ua); 1280bc700ab1SDaniel Mack if (err < 0) { 1281bc700ab1SDaniel Mack ua->intf[i] = NULL; 1282bc700ab1SDaniel Mack err = -EBUSY; 1283bc700ab1SDaniel Mack goto probe_error; 1284bc700ab1SDaniel Mack } 1285bc700ab1SDaniel Mack } 1286bc700ab1SDaniel Mack 1287bc700ab1SDaniel Mack err = detect_usb_format(ua); 1288bc700ab1SDaniel Mack if (err < 0) 1289bc700ab1SDaniel Mack goto probe_error; 1290bc700ab1SDaniel Mack 1291bc700ab1SDaniel Mack name = usb_id->idProduct == 0x0044 ? "UA-1000" : "UA-101"; 1292bc700ab1SDaniel Mack strcpy(card->driver, "UA-101"); 1293bc700ab1SDaniel Mack strcpy(card->shortname, name); 1294bc700ab1SDaniel Mack usb_make_path(ua->dev, usb_path, sizeof(usb_path)); 1295bc700ab1SDaniel Mack snprintf(ua->card->longname, sizeof(ua->card->longname), 1296bc700ab1SDaniel Mack "EDIROL %s (serial %s), %u Hz at %s, %s speed", name, 1297bc700ab1SDaniel Mack ua->dev->serial ? ua->dev->serial : "?", ua->rate, usb_path, 1298bc700ab1SDaniel Mack ua->dev->speed == USB_SPEED_HIGH ? "high" : "full"); 1299bc700ab1SDaniel Mack 1300bc700ab1SDaniel Mack err = alloc_stream_buffers(ua, &ua->capture); 1301bc700ab1SDaniel Mack if (err < 0) 1302bc700ab1SDaniel Mack goto probe_error; 1303bc700ab1SDaniel Mack err = alloc_stream_buffers(ua, &ua->playback); 1304bc700ab1SDaniel Mack if (err < 0) 1305bc700ab1SDaniel Mack goto probe_error; 1306bc700ab1SDaniel Mack 1307bc700ab1SDaniel Mack err = alloc_stream_urbs(ua, &ua->capture, capture_urb_complete); 1308bc700ab1SDaniel Mack if (err < 0) 1309bc700ab1SDaniel Mack goto probe_error; 1310bc700ab1SDaniel Mack err = alloc_stream_urbs(ua, &ua->playback, playback_urb_complete); 1311bc700ab1SDaniel Mack if (err < 0) 1312bc700ab1SDaniel Mack goto probe_error; 1313bc700ab1SDaniel Mack 1314bc700ab1SDaniel Mack err = snd_pcm_new(card, name, 0, 1, 1, &ua->pcm); 1315bc700ab1SDaniel Mack if (err < 0) 1316bc700ab1SDaniel Mack goto probe_error; 1317bc700ab1SDaniel Mack ua->pcm->private_data = ua; 1318bc700ab1SDaniel Mack strcpy(ua->pcm->name, name); 1319bc700ab1SDaniel Mack snd_pcm_set_ops(ua->pcm, SNDRV_PCM_STREAM_PLAYBACK, &playback_pcm_ops); 1320bc700ab1SDaniel Mack snd_pcm_set_ops(ua->pcm, SNDRV_PCM_STREAM_CAPTURE, &capture_pcm_ops); 1321bc700ab1SDaniel Mack 1322bc700ab1SDaniel Mack err = snd_usbmidi_create(card, ua->intf[INTF_MIDI], 1323bc700ab1SDaniel Mack &ua->midi_list, &midi_quirk); 1324bc700ab1SDaniel Mack if (err < 0) 1325bc700ab1SDaniel Mack goto probe_error; 1326bc700ab1SDaniel Mack 1327bc700ab1SDaniel Mack err = snd_card_register(card); 1328bc700ab1SDaniel Mack if (err < 0) 1329bc700ab1SDaniel Mack goto probe_error; 1330bc700ab1SDaniel Mack 1331bc700ab1SDaniel Mack usb_set_intfdata(interface, ua); 1332bc700ab1SDaniel Mack devices_used |= 1 << card_index; 1333bc700ab1SDaniel Mack 1334bc700ab1SDaniel Mack mutex_unlock(&devices_mutex); 1335bc700ab1SDaniel Mack return 0; 1336bc700ab1SDaniel Mack 1337bc700ab1SDaniel Mack probe_error: 1338bc700ab1SDaniel Mack free_usb_related_resources(ua, interface); 1339bc700ab1SDaniel Mack snd_card_free(card); 1340bc700ab1SDaniel Mack mutex_unlock(&devices_mutex); 1341bc700ab1SDaniel Mack return err; 1342bc700ab1SDaniel Mack } 1343bc700ab1SDaniel Mack 1344bc700ab1SDaniel Mack static void ua101_disconnect(struct usb_interface *interface) 1345bc700ab1SDaniel Mack { 1346bc700ab1SDaniel Mack struct ua101 *ua = usb_get_intfdata(interface); 1347bc700ab1SDaniel Mack struct list_head *midi; 1348bc700ab1SDaniel Mack 1349bc700ab1SDaniel Mack if (!ua) 1350bc700ab1SDaniel Mack return; 1351bc700ab1SDaniel Mack 1352bc700ab1SDaniel Mack mutex_lock(&devices_mutex); 1353bc700ab1SDaniel Mack 1354bc700ab1SDaniel Mack set_bit(DISCONNECTED, &ua->states); 1355bc700ab1SDaniel Mack wake_up(&ua->rate_feedback_wait); 1356bc700ab1SDaniel Mack 1357bc700ab1SDaniel Mack /* make sure that userspace cannot create new requests */ 1358bc700ab1SDaniel Mack snd_card_disconnect(ua->card); 1359bc700ab1SDaniel Mack 1360bc700ab1SDaniel Mack /* make sure that there are no pending USB requests */ 1361cd1199edSDave Jones list_for_each(midi, &ua->midi_list) 1362bc700ab1SDaniel Mack snd_usbmidi_disconnect(midi); 1363bc700ab1SDaniel Mack abort_alsa_playback(ua); 1364bc700ab1SDaniel Mack abort_alsa_capture(ua); 1365bc700ab1SDaniel Mack mutex_lock(&ua->mutex); 1366bc700ab1SDaniel Mack stop_usb_playback(ua); 1367bc700ab1SDaniel Mack stop_usb_capture(ua); 1368bc700ab1SDaniel Mack mutex_unlock(&ua->mutex); 1369bc700ab1SDaniel Mack 1370bc700ab1SDaniel Mack free_usb_related_resources(ua, interface); 1371bc700ab1SDaniel Mack 1372bc700ab1SDaniel Mack devices_used &= ~(1 << ua->card_index); 1373bc700ab1SDaniel Mack 1374bc700ab1SDaniel Mack snd_card_free_when_closed(ua->card); 1375bc700ab1SDaniel Mack 1376bc700ab1SDaniel Mack mutex_unlock(&devices_mutex); 1377bc700ab1SDaniel Mack } 1378bc700ab1SDaniel Mack 1379bc700ab1SDaniel Mack static struct usb_device_id ua101_ids[] = { 1380bc700ab1SDaniel Mack { USB_DEVICE(0x0582, 0x0044) }, /* UA-1000 high speed */ 1381bc700ab1SDaniel Mack { USB_DEVICE(0x0582, 0x007d) }, /* UA-101 high speed */ 1382bc700ab1SDaniel Mack { USB_DEVICE(0x0582, 0x008d) }, /* UA-101 full speed */ 1383bc700ab1SDaniel Mack { } 1384bc700ab1SDaniel Mack }; 1385bc700ab1SDaniel Mack MODULE_DEVICE_TABLE(usb, ua101_ids); 1386bc700ab1SDaniel Mack 1387bc700ab1SDaniel Mack static struct usb_driver ua101_driver = { 1388bc700ab1SDaniel Mack .name = "snd-ua101", 1389bc700ab1SDaniel Mack .id_table = ua101_ids, 1390bc700ab1SDaniel Mack .probe = ua101_probe, 1391bc700ab1SDaniel Mack .disconnect = ua101_disconnect, 1392bc700ab1SDaniel Mack #if 0 1393bc700ab1SDaniel Mack .suspend = ua101_suspend, 1394bc700ab1SDaniel Mack .resume = ua101_resume, 1395bc700ab1SDaniel Mack #endif 1396bc700ab1SDaniel Mack }; 1397bc700ab1SDaniel Mack 1398424f0750SGreg Kroah-Hartman module_usb_driver(ua101_driver); 1399