1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* -*- linux-c -*- * 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * ALSA driver for the digigram lx6464es interface 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (c) 2009 Tim Blechmann <tim@klingt.org> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef LX6464ES_H 10*4882a593Smuzhiyun #define LX6464ES_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/spinlock.h> 13*4882a593Smuzhiyun #include <linux/atomic.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #include <sound/core.h> 16*4882a593Smuzhiyun #include <sound/pcm.h> 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #include "lx_core.h" 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define LXP "LX6464ES: " 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun enum { 23*4882a593Smuzhiyun ES_cmd_free = 0, /* no command executing */ 24*4882a593Smuzhiyun ES_cmd_processing = 1, /* execution of a read/write command */ 25*4882a593Smuzhiyun ES_read_pending = 2, /* a asynchron read command is pending */ 26*4882a593Smuzhiyun ES_read_finishing = 3, /* a read command has finished waiting (set by 27*4882a593Smuzhiyun * Interrupt or CancelIrp) */ 28*4882a593Smuzhiyun }; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun enum lx_stream_status { 31*4882a593Smuzhiyun LX_STREAM_STATUS_FREE, 32*4882a593Smuzhiyun /* LX_STREAM_STATUS_OPEN, */ 33*4882a593Smuzhiyun LX_STREAM_STATUS_SCHEDULE_RUN, 34*4882a593Smuzhiyun /* LX_STREAM_STATUS_STARTED, */ 35*4882a593Smuzhiyun LX_STREAM_STATUS_RUNNING, 36*4882a593Smuzhiyun LX_STREAM_STATUS_SCHEDULE_STOP, 37*4882a593Smuzhiyun /* LX_STREAM_STATUS_STOPPED, */ 38*4882a593Smuzhiyun /* LX_STREAM_STATUS_PAUSED */ 39*4882a593Smuzhiyun }; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun struct lx_stream { 43*4882a593Smuzhiyun struct snd_pcm_substream *stream; 44*4882a593Smuzhiyun snd_pcm_uframes_t frame_pos; 45*4882a593Smuzhiyun enum lx_stream_status status; /* free, open, running, draining 46*4882a593Smuzhiyun * pause */ 47*4882a593Smuzhiyun unsigned int is_capture:1; 48*4882a593Smuzhiyun }; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun struct lx6464es { 52*4882a593Smuzhiyun struct snd_card *card; 53*4882a593Smuzhiyun struct pci_dev *pci; 54*4882a593Smuzhiyun int irq; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun u8 mac_address[6]; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun struct mutex lock; /* interrupt lock */ 59*4882a593Smuzhiyun struct mutex setup_mutex; /* mutex used in hw_params, open 60*4882a593Smuzhiyun * and close */ 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /* ports */ 63*4882a593Smuzhiyun unsigned long port_plx; /* io port (size=256) */ 64*4882a593Smuzhiyun void __iomem *port_plx_remapped; /* remapped plx port */ 65*4882a593Smuzhiyun void __iomem *port_dsp_bar; /* memory port (32-bit, 66*4882a593Smuzhiyun * non-prefetchable, 67*4882a593Smuzhiyun * size=8K) */ 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun /* messaging */ 70*4882a593Smuzhiyun struct mutex msg_lock; /* message lock */ 71*4882a593Smuzhiyun struct lx_rmh rmh; 72*4882a593Smuzhiyun u32 irqsrc; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun /* configuration */ 75*4882a593Smuzhiyun uint freq_ratio : 2; 76*4882a593Smuzhiyun uint playback_mute : 1; 77*4882a593Smuzhiyun uint hardware_running[2]; 78*4882a593Smuzhiyun u32 board_sample_rate; /* sample rate read from 79*4882a593Smuzhiyun * board */ 80*4882a593Smuzhiyun u16 pcm_granularity; /* board blocksize */ 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /* dma */ 83*4882a593Smuzhiyun struct snd_dma_buffer capture_dma_buf; 84*4882a593Smuzhiyun struct snd_dma_buffer playback_dma_buf; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* pcm */ 87*4882a593Smuzhiyun struct snd_pcm *pcm; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* streams */ 90*4882a593Smuzhiyun struct lx_stream capture_stream; 91*4882a593Smuzhiyun struct lx_stream playback_stream; 92*4882a593Smuzhiyun }; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun #endif /* LX6464ES_H */ 96