162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Linux driver for TerraTec DMX 6Fire USB 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Author: Torsten Schenk <torsten.schenk@zoho.com> 662306a36Sopenharmony_ci * Created: Jan 01, 2011 762306a36Sopenharmony_ci * Copyright: (C) Torsten Schenk 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef USB6FIRE_PCM_H 1162306a36Sopenharmony_ci#define USB6FIRE_PCM_H 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <sound/pcm.h> 1462306a36Sopenharmony_ci#include <linux/mutex.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#include "common.h" 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cienum /* settings for pcm */ 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci /* maximum of EP_W_MAX_PACKET_SIZE[] (see firmware.c) */ 2162306a36Sopenharmony_ci PCM_N_URBS = 16, PCM_N_PACKETS_PER_URB = 8, PCM_MAX_PACKET_SIZE = 604 2262306a36Sopenharmony_ci}; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cistruct pcm_urb { 2562306a36Sopenharmony_ci struct sfire_chip *chip; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci /* BEGIN DO NOT SEPARATE */ 2862306a36Sopenharmony_ci struct urb instance; 2962306a36Sopenharmony_ci struct usb_iso_packet_descriptor packets[PCM_N_PACKETS_PER_URB]; 3062306a36Sopenharmony_ci /* END DO NOT SEPARATE */ 3162306a36Sopenharmony_ci u8 *buffer; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci struct pcm_urb *peer; 3462306a36Sopenharmony_ci}; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistruct pcm_substream { 3762306a36Sopenharmony_ci spinlock_t lock; 3862306a36Sopenharmony_ci struct snd_pcm_substream *instance; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci bool active; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci snd_pcm_uframes_t dma_off; /* current position in alsa dma_area */ 4362306a36Sopenharmony_ci snd_pcm_uframes_t period_off; /* current position in current period */ 4462306a36Sopenharmony_ci}; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistruct pcm_runtime { 4762306a36Sopenharmony_ci struct sfire_chip *chip; 4862306a36Sopenharmony_ci struct snd_pcm *instance; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci struct pcm_substream playback; 5162306a36Sopenharmony_ci struct pcm_substream capture; 5262306a36Sopenharmony_ci bool panic; /* if set driver won't do anymore pcm on device */ 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci struct pcm_urb in_urbs[PCM_N_URBS]; 5562306a36Sopenharmony_ci struct pcm_urb out_urbs[PCM_N_URBS]; 5662306a36Sopenharmony_ci int in_packet_size; 5762306a36Sopenharmony_ci int out_packet_size; 5862306a36Sopenharmony_ci int in_n_analog; /* number of analog channels soundcard sends */ 5962306a36Sopenharmony_ci int out_n_analog; /* number of analog channels soundcard receives */ 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci struct mutex stream_mutex; 6262306a36Sopenharmony_ci u8 stream_state; /* one of STREAM_XXX (pcm.c) */ 6362306a36Sopenharmony_ci u8 rate; /* one of PCM_RATE_XXX */ 6462306a36Sopenharmony_ci wait_queue_head_t stream_wait_queue; 6562306a36Sopenharmony_ci bool stream_wait_cond; 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ciint usb6fire_pcm_init(struct sfire_chip *chip); 6962306a36Sopenharmony_civoid usb6fire_pcm_abort(struct sfire_chip *chip); 7062306a36Sopenharmony_civoid usb6fire_pcm_destroy(struct sfire_chip *chip); 7162306a36Sopenharmony_ci#endif /* USB6FIRE_PCM_H */ 72