2 * Driver for Digigram pcxhr soundcards
6 * Copyright (c) 2004 by Digigram <alsa@digigram.com>
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.
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.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #ifndef __SOUND_PCXHR_H
24 #define __SOUND_PCXHR_H
26 #include <linux/interrupt.h>
27 #include <linux/mutex.h>
28 #include <sound/pcm.h>
30 #define PCXHR_DRIVER_VERSION 0x000906 /* 0.9.6 */
31 #define PCXHR_DRIVER_VERSION_STRING "0.9.6" /* 0.9.6 */
34 #define PCXHR_MAX_CARDS 6
35 #define PCXHR_PLAYBACK_STREAMS 4
37 #define PCXHR_GRANULARITY 96 /* min 96 and multiple of 48 */
38 /* transfer granularity of pipes and the dsp time (MBOX4) */
39 #define PCXHR_GRANULARITY_MIN 96
40 /* TODO : granularity could be 64 or 128 */
41 #define PCXHR_GRANULARITY_HR22 192 /* granularity for stereo cards */
49 enum pcxhr_clock_type
{
50 PCXHR_CLOCK_TYPE_INTERNAL
= 0,
51 PCXHR_CLOCK_TYPE_WORD_CLOCK
,
52 PCXHR_CLOCK_TYPE_AES_SYNC
,
53 PCXHR_CLOCK_TYPE_AES_1
,
54 PCXHR_CLOCK_TYPE_AES_2
,
55 PCXHR_CLOCK_TYPE_AES_3
,
56 PCXHR_CLOCK_TYPE_AES_4
,
57 PCXHR_CLOCK_TYPE_MAX
= PCXHR_CLOCK_TYPE_AES_4
,
58 HR22_CLOCK_TYPE_INTERNAL
= PCXHR_CLOCK_TYPE_INTERNAL
,
59 HR22_CLOCK_TYPE_AES_SYNC
,
60 HR22_CLOCK_TYPE_AES_1
,
61 HR22_CLOCK_TYPE_MAX
= HR22_CLOCK_TYPE_AES_1
,
65 unsigned int num_cards
;
66 struct snd_pcxhr
*chip
[PCXHR_MAX_CARDS
];
74 /* card access with 1 mem bar and 2 io bar's */
75 unsigned long port
[3];
78 char shortname
[32]; /* short name of this soundcard */
79 char longname
[96]; /* name of this soundcard */
81 struct pcxhr_rmh
*prmh
;
83 struct mutex lock
; /* interrupt lock */
84 struct mutex msg_lock
; /* message lock */
86 struct mutex setup_mutex
; /* mutex used in hw_params, open and close */
87 struct mutex mixer_mutex
; /* mutex for mixer */
89 /* hardware interface */
90 unsigned int dsp_loaded
; /* bit flags of loaded dsp indices */
91 unsigned int dsp_version
; /* read from embedded once firmware is loaded */
96 unsigned int is_hr_stereo
:1;
97 unsigned int board_has_aes1
:1; /* if 1 board has AES1 plug and SRC */
98 unsigned int board_has_analog
:1; /* if 0 the board is digital only */
99 unsigned int board_has_mic
:1; /* if 1 the board has microphone input */
100 unsigned int board_aes_in_192k
:1;/* if 1 the aes input plugs do support 192kHz */
101 unsigned int mono_capture
:1; /* if 1 the board does mono capture */
102 unsigned int capture_ltc
:1; /* if 1 the board captures LTC input */
104 struct snd_dma_buffer hostport
;
106 enum pcxhr_clock_type use_clock_type
; /* clock type selected by mixer */
107 enum pcxhr_clock_type cur_clock_type
; /* current clock type synced */
110 int timer_toggle
; /* timer interrupt toggles between the two values 0x200 and 0x300 */
111 int dsp_time_last
; /* the last dsp time (read by interrupt) */
112 int dsp_time_err
; /* dsp time errors */
113 unsigned int src_it_dsp
; /* dsp interrupt source */
114 unsigned int io_num_reg_cont
; /* backup of IO_NUM_REG_CONT */
115 unsigned int codec_speed
; /* speed mode of the codecs */
116 unsigned int sample_rate_real
; /* current real sample rate */
118 int async_err_stream_xrun
;
119 int async_err_pipe_xrun
;
120 int async_err_other_last
;
122 unsigned char xlx_cfg
; /* copy of PCXHR_XLX_CFG register */
123 unsigned char xlx_selmic
; /* copy of PCXHR_XLX_SELMIC register */
124 unsigned char dsp_reset
; /* copy of PCXHR_DSP_RESET register */
128 enum pcxhr_stream_status
{
129 PCXHR_STREAM_STATUS_FREE
,
130 PCXHR_STREAM_STATUS_OPEN
,
131 PCXHR_STREAM_STATUS_SCHEDULE_RUN
,
132 PCXHR_STREAM_STATUS_STARTED
,
133 PCXHR_STREAM_STATUS_RUNNING
,
134 PCXHR_STREAM_STATUS_SCHEDULE_STOP
,
135 PCXHR_STREAM_STATUS_STOPPED
,
136 PCXHR_STREAM_STATUS_PAUSED
139 struct pcxhr_stream
{
140 struct snd_pcm_substream
*substream
;
141 snd_pcm_format_t format
;
142 struct pcxhr_pipe
*pipe
;
144 enum pcxhr_stream_status status
; /* free, open, running, draining, pause */
146 u_int64_t timer_abs_periods
; /* timer: samples elapsed since TRIGGER_START (multiple of period_size) */
147 u_int32_t timer_period_frag
; /* timer: samples elapsed since last call to snd_pcm_period_elapsed (0..period_size) */
148 u_int32_t timer_buf_periods
; /* nb of periods in the buffer that have already elapsed */
149 int timer_is_synced
; /* if(0) : timer needs to be resynced with real hardware pointer */
155 enum pcxhr_pipe_status
{
156 PCXHR_PIPE_UNDEFINED
,
161 enum pcxhr_pipe_status status
;
162 int is_capture
; /* this is a capture pipe */
163 int first_audio
; /* first audio num */
168 struct snd_card
*card
;
169 struct pcxhr_mgr
*mgr
;
170 int chip_idx
; /* zero based */
172 struct snd_pcm
*pcm
; /* PCM */
174 struct pcxhr_pipe playback_pipe
; /* 1 stereo pipe only */
175 struct pcxhr_pipe capture_pipe
[2]; /* 1 stereo or 2 mono pipes */
177 struct pcxhr_stream playback_stream
[PCXHR_PLAYBACK_STREAMS
];
178 struct pcxhr_stream capture_stream
[2]; /* 1 stereo or 2 mono streams */
182 int analog_playback_active
[2]; /* Mixer : Master Playback !mute */
183 int analog_playback_volume
[2]; /* Mixer : Master Playback Volume */
184 int analog_capture_volume
[2]; /* Mixer : Master Capture Volume */
185 int digital_playback_active
[PCXHR_PLAYBACK_STREAMS
][2];
186 int digital_playback_volume
[PCXHR_PLAYBACK_STREAMS
][2];
187 int digital_capture_volume
[2]; /* Mixer : Digital Capture Volume */
188 int monitoring_active
[2]; /* Mixer : Monitoring Active */
189 int monitoring_volume
[2]; /* Mixer : Monitoring Volume */
190 int audio_capture_source
; /* Mixer : Audio Capture Source */
191 int mic_volume
; /* used by cards with MIC only */
192 int mic_boost
; /* used by cards with MIC only */
193 int mic_active
; /* used by cards with MIC only */
194 int analog_capture_active
; /* used by cards with MIC only */
195 int phantom_power
; /* used by cards with MIC only */
197 unsigned char aes_bits
[5]; /* Mixer : IEC958_AES bits */
200 struct pcxhr_hostport
207 int pcxhr_create_pcm(struct snd_pcxhr
*chip
);
208 int pcxhr_set_clock(struct pcxhr_mgr
*mgr
, unsigned int rate
);
209 int pcxhr_get_external_clock(struct pcxhr_mgr
*mgr
,
210 enum pcxhr_clock_type clock_type
,
213 #endif /* __SOUND_PCXHR_H */