• Home
  • Raw
  • Download

Lines Matching +full:sub +full:- +full:device

4  * Copyright 2012-2013 (C) M2TECH S.r.l and Amarula Solutions B.V.
57 bool panic; /* if set driver won't do anymore pcm on device */
118 struct usb_device *device = rt->chip->dev; in hiface_pcm_set_rate() local
151 dev_err(&device->dev, "Unsupported rate %d\n", rate); in hiface_pcm_set_rate()
152 return -EINVAL; in hiface_pcm_set_rate()
163 ret = usb_control_msg(device, usb_sndctrlpipe(device, 0), in hiface_pcm_set_rate()
168 dev_err(&device->dev, "Error setting samplerate %d.\n", rate); in hiface_pcm_set_rate()
179 struct device *device = &rt->chip->dev->dev; in hiface_pcm_get_substream() local
181 if (alsa_sub->stream == SNDRV_PCM_STREAM_PLAYBACK) in hiface_pcm_get_substream()
182 return &rt->playback; in hiface_pcm_get_substream()
184 dev_err(device, "Error getting pcm substream slot.\n"); in hiface_pcm_get_substream()
193 if (rt->stream_state != STREAM_DISABLED) { in hiface_pcm_stream_stop()
194 rt->stream_state = STREAM_STOPPING; in hiface_pcm_stream_stop()
198 &rt->out_urbs[i].submitted, 100); in hiface_pcm_stream_stop()
201 &rt->out_urbs[i].submitted); in hiface_pcm_stream_stop()
202 usb_kill_urb(&rt->out_urbs[i].instance); in hiface_pcm_stream_stop()
205 rt->stream_state = STREAM_DISABLED; in hiface_pcm_stream_stop()
215 if (rt->stream_state == STREAM_DISABLED) { in hiface_pcm_stream_start()
218 rt->panic = false; in hiface_pcm_stream_start()
221 rt->stream_state = STREAM_STARTING; in hiface_pcm_stream_start()
223 memset(rt->out_urbs[i].buffer, 0, PCM_PACKET_SIZE); in hiface_pcm_stream_start()
224 usb_anchor_urb(&rt->out_urbs[i].instance, in hiface_pcm_stream_start()
225 &rt->out_urbs[i].submitted); in hiface_pcm_stream_start()
226 ret = usb_submit_urb(&rt->out_urbs[i].instance, in hiface_pcm_stream_start()
235 wait_event_timeout(rt->stream_wait_queue, rt->stream_wait_cond, in hiface_pcm_stream_start()
237 if (rt->stream_wait_cond) { in hiface_pcm_stream_start()
238 struct device *device = &rt->chip->dev->dev; in hiface_pcm_stream_start() local
239 dev_dbg(device, "%s: Stream is running wakeup event\n", in hiface_pcm_stream_start()
241 rt->stream_state = STREAM_RUNNING; in hiface_pcm_stream_start()
244 return -EIO; in hiface_pcm_stream_start()
250 /* The hardware wants word-swapped 32-bit values */
261 static bool hiface_pcm_playback(struct pcm_substream *sub, struct pcm_urb *urb) in hiface_pcm_playback() argument
263 struct snd_pcm_runtime *alsa_rt = sub->instance->runtime; in hiface_pcm_playback()
264 struct device *device = &urb->chip->dev->dev; in hiface_pcm_playback() local
268 WARN_ON(alsa_rt->format != SNDRV_PCM_FORMAT_S32_LE); in hiface_pcm_playback()
270 pcm_buffer_size = snd_pcm_lib_buffer_bytes(sub->instance); in hiface_pcm_playback()
272 if (sub->dma_off + PCM_PACKET_SIZE <= pcm_buffer_size) { in hiface_pcm_playback()
273 dev_dbg(device, "%s: (1) buffer_size %#x dma_offset %#x\n", __func__, in hiface_pcm_playback()
275 (unsigned int) sub->dma_off); in hiface_pcm_playback()
277 source = alsa_rt->dma_area + sub->dma_off; in hiface_pcm_playback()
278 memcpy_swahw32(urb->buffer, source, PCM_PACKET_SIZE); in hiface_pcm_playback()
283 dev_dbg(device, "%s: (2) buffer_size %#x dma_offset %#x\n", __func__, in hiface_pcm_playback()
285 (unsigned int) sub->dma_off); in hiface_pcm_playback()
287 len = pcm_buffer_size - sub->dma_off; in hiface_pcm_playback()
289 source = alsa_rt->dma_area + sub->dma_off; in hiface_pcm_playback()
290 memcpy_swahw32(urb->buffer, source, len); in hiface_pcm_playback()
292 source = alsa_rt->dma_area; in hiface_pcm_playback()
293 memcpy_swahw32(urb->buffer + len, source, in hiface_pcm_playback()
294 PCM_PACKET_SIZE - len); in hiface_pcm_playback()
296 sub->dma_off += PCM_PACKET_SIZE; in hiface_pcm_playback()
297 if (sub->dma_off >= pcm_buffer_size) in hiface_pcm_playback()
298 sub->dma_off -= pcm_buffer_size; in hiface_pcm_playback()
300 sub->period_off += PCM_PACKET_SIZE; in hiface_pcm_playback()
301 if (sub->period_off >= alsa_rt->period_size) { in hiface_pcm_playback()
302 sub->period_off %= alsa_rt->period_size; in hiface_pcm_playback()
310 struct pcm_urb *out_urb = usb_urb->context; in hiface_pcm_out_urb_handler()
311 struct pcm_runtime *rt = out_urb->chip->pcm; in hiface_pcm_out_urb_handler()
312 struct pcm_substream *sub; in hiface_pcm_out_urb_handler() local
317 if (rt->panic || rt->stream_state == STREAM_STOPPING) in hiface_pcm_out_urb_handler()
320 if (unlikely(usb_urb->status == -ENOENT || /* unlinked */ in hiface_pcm_out_urb_handler()
321 usb_urb->status == -ENODEV || /* device removed */ in hiface_pcm_out_urb_handler()
322 usb_urb->status == -ECONNRESET || /* unlinked */ in hiface_pcm_out_urb_handler()
323 usb_urb->status == -ESHUTDOWN)) { /* device disabled */ in hiface_pcm_out_urb_handler()
327 if (rt->stream_state == STREAM_STARTING) { in hiface_pcm_out_urb_handler()
328 rt->stream_wait_cond = true; in hiface_pcm_out_urb_handler()
329 wake_up(&rt->stream_wait_queue); in hiface_pcm_out_urb_handler()
333 sub = &rt->playback; in hiface_pcm_out_urb_handler()
334 spin_lock_irqsave(&sub->lock, flags); in hiface_pcm_out_urb_handler()
335 if (sub->active) in hiface_pcm_out_urb_handler()
336 do_period_elapsed = hiface_pcm_playback(sub, out_urb); in hiface_pcm_out_urb_handler()
338 memset(out_urb->buffer, 0, PCM_PACKET_SIZE); in hiface_pcm_out_urb_handler()
340 spin_unlock_irqrestore(&sub->lock, flags); in hiface_pcm_out_urb_handler()
343 snd_pcm_period_elapsed(sub->instance); in hiface_pcm_out_urb_handler()
345 ret = usb_submit_urb(&out_urb->instance, GFP_ATOMIC); in hiface_pcm_out_urb_handler()
352 rt->panic = true; in hiface_pcm_out_urb_handler()
358 struct pcm_substream *sub = NULL; in hiface_pcm_open() local
359 struct snd_pcm_runtime *alsa_rt = alsa_sub->runtime; in hiface_pcm_open()
362 if (rt->panic) in hiface_pcm_open()
363 return -EPIPE; in hiface_pcm_open()
365 mutex_lock(&rt->stream_mutex); in hiface_pcm_open()
366 alsa_rt->hw = pcm_hw; in hiface_pcm_open()
368 if (alsa_sub->stream == SNDRV_PCM_STREAM_PLAYBACK) in hiface_pcm_open()
369 sub = &rt->playback; in hiface_pcm_open()
371 if (!sub) { in hiface_pcm_open()
372 struct device *device = &rt->chip->dev->dev; in hiface_pcm_open() local
373 mutex_unlock(&rt->stream_mutex); in hiface_pcm_open()
374 dev_err(device, "Invalid stream type\n"); in hiface_pcm_open()
375 return -EINVAL; in hiface_pcm_open()
378 if (rt->extra_freq) { in hiface_pcm_open()
379 alsa_rt->hw.rates |= SNDRV_PCM_RATE_KNOT; in hiface_pcm_open()
380 alsa_rt->hw.rate_max = 384000; in hiface_pcm_open()
383 ret = snd_pcm_hw_constraint_list(alsa_sub->runtime, 0, in hiface_pcm_open()
387 mutex_unlock(&rt->stream_mutex); in hiface_pcm_open()
392 sub->instance = alsa_sub; in hiface_pcm_open()
393 sub->active = false; in hiface_pcm_open()
394 mutex_unlock(&rt->stream_mutex); in hiface_pcm_open()
401 struct pcm_substream *sub = hiface_pcm_get_substream(alsa_sub); in hiface_pcm_close() local
404 if (rt->panic) in hiface_pcm_close()
407 mutex_lock(&rt->stream_mutex); in hiface_pcm_close()
408 if (sub) { in hiface_pcm_close()
412 spin_lock_irqsave(&sub->lock, flags); in hiface_pcm_close()
413 sub->instance = NULL; in hiface_pcm_close()
414 sub->active = false; in hiface_pcm_close()
415 spin_unlock_irqrestore(&sub->lock, flags); in hiface_pcm_close()
418 mutex_unlock(&rt->stream_mutex); in hiface_pcm_close()
437 struct pcm_substream *sub = hiface_pcm_get_substream(alsa_sub); in hiface_pcm_prepare() local
438 struct snd_pcm_runtime *alsa_rt = alsa_sub->runtime; in hiface_pcm_prepare()
441 if (rt->panic) in hiface_pcm_prepare()
442 return -EPIPE; in hiface_pcm_prepare()
443 if (!sub) in hiface_pcm_prepare()
444 return -ENODEV; in hiface_pcm_prepare()
446 mutex_lock(&rt->stream_mutex); in hiface_pcm_prepare()
450 sub->dma_off = 0; in hiface_pcm_prepare()
451 sub->period_off = 0; in hiface_pcm_prepare()
453 if (rt->stream_state == STREAM_DISABLED) { in hiface_pcm_prepare()
455 ret = hiface_pcm_set_rate(rt, alsa_rt->rate); in hiface_pcm_prepare()
457 mutex_unlock(&rt->stream_mutex); in hiface_pcm_prepare()
462 mutex_unlock(&rt->stream_mutex); in hiface_pcm_prepare()
466 mutex_unlock(&rt->stream_mutex); in hiface_pcm_prepare()
472 struct pcm_substream *sub = hiface_pcm_get_substream(alsa_sub); in hiface_pcm_trigger() local
475 if (rt->panic) in hiface_pcm_trigger()
476 return -EPIPE; in hiface_pcm_trigger()
477 if (!sub) in hiface_pcm_trigger()
478 return -ENODEV; in hiface_pcm_trigger()
483 spin_lock_irq(&sub->lock); in hiface_pcm_trigger()
484 sub->active = true; in hiface_pcm_trigger()
485 spin_unlock_irq(&sub->lock); in hiface_pcm_trigger()
490 spin_lock_irq(&sub->lock); in hiface_pcm_trigger()
491 sub->active = false; in hiface_pcm_trigger()
492 spin_unlock_irq(&sub->lock); in hiface_pcm_trigger()
496 return -EINVAL; in hiface_pcm_trigger()
502 struct pcm_substream *sub = hiface_pcm_get_substream(alsa_sub); in hiface_pcm_pointer() local
507 if (rt->panic || !sub) in hiface_pcm_pointer()
510 spin_lock_irqsave(&sub->lock, flags); in hiface_pcm_pointer()
511 dma_offset = sub->dma_off; in hiface_pcm_pointer()
512 spin_unlock_irqrestore(&sub->lock, flags); in hiface_pcm_pointer()
513 return bytes_to_frames(alsa_sub->runtime, dma_offset); in hiface_pcm_pointer()
533 urb->chip = chip; in hiface_pcm_init_urb()
534 usb_init_urb(&urb->instance); in hiface_pcm_init_urb()
536 urb->buffer = kzalloc(PCM_PACKET_SIZE, GFP_KERNEL); in hiface_pcm_init_urb()
537 if (!urb->buffer) in hiface_pcm_init_urb()
538 return -ENOMEM; in hiface_pcm_init_urb()
540 usb_fill_bulk_urb(&urb->instance, chip->dev, in hiface_pcm_init_urb()
541 usb_sndbulkpipe(chip->dev, ep), (void *)urb->buffer, in hiface_pcm_init_urb()
543 if (usb_urb_ep_type_check(&urb->instance)) in hiface_pcm_init_urb()
544 return -EINVAL; in hiface_pcm_init_urb()
545 init_usb_anchor(&urb->submitted); in hiface_pcm_init_urb()
552 struct pcm_runtime *rt = chip->pcm; in hiface_pcm_abort()
555 rt->panic = true; in hiface_pcm_abort()
557 mutex_lock(&rt->stream_mutex); in hiface_pcm_abort()
559 mutex_unlock(&rt->stream_mutex); in hiface_pcm_abort()
565 struct pcm_runtime *rt = chip->pcm; in hiface_pcm_destroy()
569 kfree(rt->out_urbs[i].buffer); in hiface_pcm_destroy()
571 kfree(chip->pcm); in hiface_pcm_destroy()
572 chip->pcm = NULL; in hiface_pcm_destroy()
577 struct pcm_runtime *rt = pcm->private_data; in hiface_pcm_free()
580 hiface_pcm_destroy(rt->chip); in hiface_pcm_free()
592 return -ENOMEM; in hiface_pcm_init()
594 rt->chip = chip; in hiface_pcm_init()
595 rt->stream_state = STREAM_DISABLED; in hiface_pcm_init()
597 rt->extra_freq = 1; in hiface_pcm_init()
599 init_waitqueue_head(&rt->stream_wait_queue); in hiface_pcm_init()
600 mutex_init(&rt->stream_mutex); in hiface_pcm_init()
601 spin_lock_init(&rt->playback.lock); in hiface_pcm_init()
604 ret = hiface_pcm_init_urb(&rt->out_urbs[i], chip, OUT_EP, in hiface_pcm_init()
610 ret = snd_pcm_new(chip->card, "USB-SPDIF Audio", 0, 1, 0, &pcm); in hiface_pcm_init()
612 dev_err(&chip->dev->dev, "Cannot create pcm instance\n"); in hiface_pcm_init()
616 pcm->private_data = rt; in hiface_pcm_init()
617 pcm->private_free = hiface_pcm_free; in hiface_pcm_init()
619 strlcpy(pcm->name, "USB-SPDIF Audio", sizeof(pcm->name)); in hiface_pcm_init()
622 rt->instance = pcm; in hiface_pcm_init()
624 chip->pcm = rt; in hiface_pcm_init()
629 kfree(rt->out_urbs[i].buffer); in hiface_pcm_init()