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 <linux/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 unsigned 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 u8 mac_address[6]; 73 74 spinlock_t lock; /* interrupt spinlock */ 75 struct mutex setup_mutex; /* mutex used in hw_params, open 76 * and close */ 77 78 struct tasklet_struct trigger_tasklet; /* trigger tasklet */ 79 struct tasklet_struct tasklet_capture; 80 struct tasklet_struct tasklet_playback; 81 82 /* ports */ 83 unsigned long port_plx; /* io port (size=256) */ 84 void __iomem *port_plx_remapped; /* remapped plx port */ 85 void __iomem *port_dsp_bar; /* memory port (32-bit, 86 * non-prefetchable, 87 * size=8K) */ 88 89 /* messaging */ 90 spinlock_t msg_lock; /* message spinlock */ 91 struct lx_rmh rmh; 92 93 /* configuration */ 94 uint freq_ratio : 2; 95 uint playback_mute : 1; 96 uint hardware_running[2]; 97 u32 board_sample_rate; /* sample rate read from 98 * board */ 99 u16 pcm_granularity; /* board blocksize */ 100 101 /* dma */ 102 struct snd_dma_buffer capture_dma_buf; 103 struct snd_dma_buffer playback_dma_buf; 104 105 /* pcm */ 106 struct snd_pcm *pcm; 107 108 /* streams */ 109 struct lx_stream capture_stream; 110 struct lx_stream playback_stream; 111 }; 112 113 114 #endif /* LX6464ES_H */ 115