1 /* -*- linux-c -*- * 2 * 3 * ALSA driver for the digigram lx6464es interface 4 * 5 * Copyright (c) 2009 Tim Blechmann <tim@klingt.org> 6 * 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; see the file COPYING. If not, write to 20 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 21 * Boston, MA 02111-1307, USA. 22 * 23 */ 24 25 #ifndef LX6464ES_H 26 #define LX6464ES_H 27 28 #include <linux/spinlock.h> 29 #include <asm/atomic.h> 30 31 #include <sound/core.h> 32 #include <sound/pcm.h> 33 34 #include "lx_core.h" 35 36 #define LXP "LX6464ES: " 37 38 enum { 39 ES_cmd_free = 0, /* no command executing */ 40 ES_cmd_processing = 1, /* execution of a read/write command */ 41 ES_read_pending = 2, /* a asynchron read command is pending */ 42 ES_read_finishing = 3, /* a read command has finished waiting (set by 43 * Interrupt or CancelIrp) */ 44 }; 45 46 enum lx_stream_status { 47 LX_STREAM_STATUS_FREE, 48 /* LX_STREAM_STATUS_OPEN, */ 49 LX_STREAM_STATUS_SCHEDULE_RUN, 50 /* LX_STREAM_STATUS_STARTED, */ 51 LX_STREAM_STATUS_RUNNING, 52 LX_STREAM_STATUS_SCHEDULE_STOP, 53 /* LX_STREAM_STATUS_STOPPED, */ 54 /* LX_STREAM_STATUS_PAUSED */ 55 }; 56 57 58 struct lx_stream { 59 struct snd_pcm_substream *stream; 60 snd_pcm_uframes_t frame_pos; 61 enum lx_stream_status status; /* free, open, running, draining 62 * pause */ 63 int is_capture:1; 64 }; 65 66 67 struct lx6464es { 68 struct snd_card *card; 69 struct pci_dev *pci; 70 int irq; 71 72 spinlock_t lock; /* interrupt spinlock */ 73 struct mutex setup_mutex; /* mutex used in hw_params, open 74 * and close */ 75 76 struct tasklet_struct trigger_tasklet; /* trigger tasklet */ 77 struct tasklet_struct tasklet_capture; 78 struct tasklet_struct tasklet_playback; 79 80 /* ports */ 81 unsigned long port_plx; /* io port (size=256) */ 82 void __iomem *port_plx_remapped; /* remapped plx port */ 83 void __iomem *port_dsp_bar; /* memory port (32-bit, 84 * non-prefetchable, 85 * size=8K) */ 86 87 /* messaging */ 88 spinlock_t msg_lock; /* message spinlock */ 89 struct lx_rmh rmh; 90 91 /* configuration */ 92 uint freq_ratio : 2; 93 uint playback_mute : 1; 94 uint hardware_running[2]; 95 u32 board_sample_rate; /* sample rate read from 96 * board */ 97 u16 pcm_granularity; /* board blocksize */ 98 99 /* dma */ 100 struct snd_dma_buffer capture_dma_buf; 101 struct snd_dma_buffer playback_dma_buf; 102 103 /* pcm */ 104 struct snd_pcm *pcm; 105 106 /* streams */ 107 struct lx_stream capture_stream; 108 struct lx_stream playback_stream; 109 }; 110 111 112 #endif /* LX6464ES_H */ 113