1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#ifndef __SOUND_PCXHR_H
24#define __SOUND_PCXHR_H
25
26#include <linux/interrupt.h>
27#include <linux/mutex.h>
28#include <sound/pcm.h>
29
30#define PCXHR_DRIVER_VERSION 0x000906
31#define PCXHR_DRIVER_VERSION_STRING "0.9.6"
32
33
34#define PCXHR_MAX_CARDS 6
35#define PCXHR_PLAYBACK_STREAMS 4
36
37#define PCXHR_GRANULARITY 96
38
39#define PCXHR_GRANULARITY_MIN 96
40
41#define PCXHR_GRANULARITY_HR22 192
42
43struct snd_pcxhr;
44struct pcxhr_mgr;
45
46struct pcxhr_stream;
47struct pcxhr_pipe;
48
49enum 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,
62};
63
64struct pcxhr_mgr {
65 unsigned int num_cards;
66 struct snd_pcxhr *chip[PCXHR_MAX_CARDS];
67
68 struct pci_dev *pci;
69
70 int irq;
71
72 int granularity;
73
74
75 unsigned long port[3];
76
77
78 char shortname[32];
79 char longname[96];
80
81 struct pcxhr_rmh *prmh;
82
83 struct mutex lock;
84 struct mutex msg_lock;
85
86 struct mutex setup_mutex;
87 struct mutex mixer_mutex;
88
89
90 unsigned int dsp_loaded;
91 unsigned int dsp_version;
92 int playback_chips;
93 int capture_chips;
94 int fw_file_set;
95 int firmware_num;
96 unsigned int is_hr_stereo:1;
97 unsigned int board_has_aes1:1;
98 unsigned int board_has_analog:1;
99 unsigned int board_has_mic:1;
100 unsigned int board_aes_in_192k:1;
101 unsigned int mono_capture:1;
102 unsigned int capture_ltc:1;
103
104 struct snd_dma_buffer hostport;
105
106 enum pcxhr_clock_type use_clock_type;
107 enum pcxhr_clock_type cur_clock_type;
108 int sample_rate;
109 int ref_count_rate;
110 int timer_toggle;
111 int dsp_time_last;
112 int dsp_time_err;
113 unsigned int src_it_dsp;
114 unsigned int io_num_reg_cont;
115 unsigned int codec_speed;
116 unsigned int sample_rate_real;
117 int last_reg_stat;
118 int async_err_stream_xrun;
119 int async_err_pipe_xrun;
120 int async_err_other_last;
121
122 unsigned char xlx_cfg;
123 unsigned char xlx_selmic;
124 unsigned char dsp_reset;
125};
126
127
128enum 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
137};
138
139struct pcxhr_stream {
140 struct snd_pcm_substream *substream;
141 snd_pcm_format_t format;
142 struct pcxhr_pipe *pipe;
143
144 enum pcxhr_stream_status status;
145
146 u_int64_t timer_abs_periods;
147 u_int32_t timer_period_frag;
148 u_int32_t timer_buf_periods;
149 int timer_is_synced;
150
151 int channels;
152};
153
154
155enum pcxhr_pipe_status {
156 PCXHR_PIPE_UNDEFINED,
157 PCXHR_PIPE_DEFINED
158};
159
160struct pcxhr_pipe {
161 enum pcxhr_pipe_status status;
162 int is_capture;
163 int first_audio;
164};
165
166
167struct snd_pcxhr {
168 struct snd_card *card;
169 struct pcxhr_mgr *mgr;
170 int chip_idx;
171
172 struct snd_pcm *pcm;
173
174 struct pcxhr_pipe playback_pipe;
175 struct pcxhr_pipe capture_pipe[2];
176
177 struct pcxhr_stream playback_stream[PCXHR_PLAYBACK_STREAMS];
178 struct pcxhr_stream capture_stream[2];
179 int nb_streams_play;
180 int nb_streams_capt;
181
182 int analog_playback_active[2];
183 int analog_playback_volume[2];
184 int analog_capture_volume[2];
185 int digital_playback_active[PCXHR_PLAYBACK_STREAMS][2];
186 int digital_playback_volume[PCXHR_PLAYBACK_STREAMS][2];
187 int digital_capture_volume[2];
188 int monitoring_active[2];
189 int monitoring_volume[2];
190 int audio_capture_source;
191 int mic_volume;
192 int mic_boost;
193 int mic_active;
194 int analog_capture_active;
195 int phantom_power;
196
197 unsigned char aes_bits[5];
198};
199
200struct pcxhr_hostport
201{
202 char purgebuffer[6];
203 char reserved[2];
204};
205
206
207int pcxhr_create_pcm(struct snd_pcxhr *chip);
208int pcxhr_set_clock(struct pcxhr_mgr *mgr, unsigned int rate);
209int pcxhr_get_external_clock(struct pcxhr_mgr *mgr,
210 enum pcxhr_clock_type clock_type,
211 int *sample_rate);
212
213#endif
214