18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Linux driver for TerraTec DMX 6Fire USB 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Author: Torsten Schenk <torsten.schenk@zoho.com> 68c2ecf20Sopenharmony_ci * Created: Jan 01, 2011 78c2ecf20Sopenharmony_ci * Copyright: (C) Torsten Schenk 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#ifndef USB6FIRE_PCM_H 118c2ecf20Sopenharmony_ci#define USB6FIRE_PCM_H 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include <sound/pcm.h> 148c2ecf20Sopenharmony_ci#include <linux/mutex.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#include "common.h" 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_cienum /* settings for pcm */ 198c2ecf20Sopenharmony_ci{ 208c2ecf20Sopenharmony_ci /* maximum of EP_W_MAX_PACKET_SIZE[] (see firmware.c) */ 218c2ecf20Sopenharmony_ci PCM_N_URBS = 16, PCM_N_PACKETS_PER_URB = 8, PCM_MAX_PACKET_SIZE = 604 228c2ecf20Sopenharmony_ci}; 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_cistruct pcm_urb { 258c2ecf20Sopenharmony_ci struct sfire_chip *chip; 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci /* BEGIN DO NOT SEPARATE */ 288c2ecf20Sopenharmony_ci struct urb instance; 298c2ecf20Sopenharmony_ci struct usb_iso_packet_descriptor packets[PCM_N_PACKETS_PER_URB]; 308c2ecf20Sopenharmony_ci /* END DO NOT SEPARATE */ 318c2ecf20Sopenharmony_ci u8 *buffer; 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci struct pcm_urb *peer; 348c2ecf20Sopenharmony_ci}; 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_cistruct pcm_substream { 378c2ecf20Sopenharmony_ci spinlock_t lock; 388c2ecf20Sopenharmony_ci struct snd_pcm_substream *instance; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci bool active; 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci snd_pcm_uframes_t dma_off; /* current position in alsa dma_area */ 438c2ecf20Sopenharmony_ci snd_pcm_uframes_t period_off; /* current position in current period */ 448c2ecf20Sopenharmony_ci}; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_cistruct pcm_runtime { 478c2ecf20Sopenharmony_ci struct sfire_chip *chip; 488c2ecf20Sopenharmony_ci struct snd_pcm *instance; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci struct pcm_substream playback; 518c2ecf20Sopenharmony_ci struct pcm_substream capture; 528c2ecf20Sopenharmony_ci bool panic; /* if set driver won't do anymore pcm on device */ 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci struct pcm_urb in_urbs[PCM_N_URBS]; 558c2ecf20Sopenharmony_ci struct pcm_urb out_urbs[PCM_N_URBS]; 568c2ecf20Sopenharmony_ci int in_packet_size; 578c2ecf20Sopenharmony_ci int out_packet_size; 588c2ecf20Sopenharmony_ci int in_n_analog; /* number of analog channels soundcard sends */ 598c2ecf20Sopenharmony_ci int out_n_analog; /* number of analog channels soundcard receives */ 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci struct mutex stream_mutex; 628c2ecf20Sopenharmony_ci u8 stream_state; /* one of STREAM_XXX (pcm.c) */ 638c2ecf20Sopenharmony_ci u8 rate; /* one of PCM_RATE_XXX */ 648c2ecf20Sopenharmony_ci wait_queue_head_t stream_wait_queue; 658c2ecf20Sopenharmony_ci bool stream_wait_cond; 668c2ecf20Sopenharmony_ci}; 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ciint usb6fire_pcm_init(struct sfire_chip *chip); 698c2ecf20Sopenharmony_civoid usb6fire_pcm_abort(struct sfire_chip *chip); 708c2ecf20Sopenharmony_civoid usb6fire_pcm_destroy(struct sfire_chip *chip); 718c2ecf20Sopenharmony_ci#endif /* USB6FIRE_PCM_H */ 72