0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef __SOUND_PCXHR_H
0011 #define __SOUND_PCXHR_H
0012
0013 #include <linux/interrupt.h>
0014 #include <linux/mutex.h>
0015 #include <sound/pcm.h>
0016
0017 #define PCXHR_DRIVER_VERSION 0x000906
0018 #define PCXHR_DRIVER_VERSION_STRING "0.9.6"
0019
0020
0021 #define PCXHR_MAX_CARDS 6
0022 #define PCXHR_PLAYBACK_STREAMS 4
0023
0024 #define PCXHR_GRANULARITY 96
0025
0026 #define PCXHR_GRANULARITY_MIN 96
0027
0028 #define PCXHR_GRANULARITY_HR22 192
0029
0030 struct snd_pcxhr;
0031 struct pcxhr_mgr;
0032
0033 struct pcxhr_stream;
0034 struct pcxhr_pipe;
0035
0036 enum pcxhr_clock_type {
0037 PCXHR_CLOCK_TYPE_INTERNAL = 0,
0038 PCXHR_CLOCK_TYPE_WORD_CLOCK,
0039 PCXHR_CLOCK_TYPE_AES_SYNC,
0040 PCXHR_CLOCK_TYPE_AES_1,
0041 PCXHR_CLOCK_TYPE_AES_2,
0042 PCXHR_CLOCK_TYPE_AES_3,
0043 PCXHR_CLOCK_TYPE_AES_4,
0044 PCXHR_CLOCK_TYPE_MAX = PCXHR_CLOCK_TYPE_AES_4,
0045 HR22_CLOCK_TYPE_INTERNAL = PCXHR_CLOCK_TYPE_INTERNAL,
0046 HR22_CLOCK_TYPE_AES_SYNC,
0047 HR22_CLOCK_TYPE_AES_1,
0048 HR22_CLOCK_TYPE_MAX = HR22_CLOCK_TYPE_AES_1,
0049 };
0050
0051 struct pcxhr_mgr {
0052 unsigned int num_cards;
0053 struct snd_pcxhr *chip[PCXHR_MAX_CARDS];
0054
0055 struct pci_dev *pci;
0056
0057 int irq;
0058
0059 int granularity;
0060
0061
0062 unsigned long port[3];
0063
0064
0065 char name[40];
0066
0067 struct pcxhr_rmh *prmh;
0068
0069 struct mutex lock;
0070 struct mutex msg_lock;
0071
0072 struct mutex setup_mutex;
0073 struct mutex mixer_mutex;
0074
0075
0076 unsigned int dsp_loaded;
0077 unsigned int dsp_version;
0078 int playback_chips;
0079 int capture_chips;
0080 int fw_file_set;
0081 int firmware_num;
0082 unsigned int is_hr_stereo:1;
0083 unsigned int board_has_aes1:1;
0084 unsigned int board_has_analog:1;
0085 unsigned int board_has_mic:1;
0086 unsigned int board_aes_in_192k:1;
0087 unsigned int mono_capture:1;
0088 unsigned int capture_ltc:1;
0089
0090 struct snd_dma_buffer hostport;
0091
0092 enum pcxhr_clock_type use_clock_type;
0093 enum pcxhr_clock_type cur_clock_type;
0094 int sample_rate;
0095 int ref_count_rate;
0096 int timer_toggle;
0097 int dsp_time_last;
0098 int dsp_time_err;
0099 unsigned int src_it_dsp;
0100 unsigned int io_num_reg_cont;
0101 unsigned int codec_speed;
0102 unsigned int sample_rate_real;
0103 int last_reg_stat;
0104 int async_err_stream_xrun;
0105 int async_err_pipe_xrun;
0106 int async_err_other_last;
0107
0108 unsigned char xlx_cfg;
0109 unsigned char xlx_selmic;
0110 unsigned char dsp_reset;
0111 };
0112
0113
0114 enum pcxhr_stream_status {
0115 PCXHR_STREAM_STATUS_FREE,
0116 PCXHR_STREAM_STATUS_OPEN,
0117 PCXHR_STREAM_STATUS_SCHEDULE_RUN,
0118 PCXHR_STREAM_STATUS_STARTED,
0119 PCXHR_STREAM_STATUS_RUNNING,
0120 PCXHR_STREAM_STATUS_SCHEDULE_STOP,
0121 PCXHR_STREAM_STATUS_STOPPED,
0122 PCXHR_STREAM_STATUS_PAUSED
0123 };
0124
0125 struct pcxhr_stream {
0126 struct snd_pcm_substream *substream;
0127 snd_pcm_format_t format;
0128 struct pcxhr_pipe *pipe;
0129
0130 enum pcxhr_stream_status status;
0131
0132 u_int64_t timer_abs_periods;
0133 u_int32_t timer_period_frag;
0134 u_int32_t timer_buf_periods;
0135 int timer_is_synced;
0136
0137 int channels;
0138 };
0139
0140
0141 enum pcxhr_pipe_status {
0142 PCXHR_PIPE_UNDEFINED,
0143 PCXHR_PIPE_DEFINED
0144 };
0145
0146 struct pcxhr_pipe {
0147 enum pcxhr_pipe_status status;
0148 int is_capture;
0149 int first_audio;
0150 };
0151
0152
0153 struct snd_pcxhr {
0154 struct snd_card *card;
0155 struct pcxhr_mgr *mgr;
0156 int chip_idx;
0157
0158 struct snd_pcm *pcm;
0159
0160 struct pcxhr_pipe playback_pipe;
0161 struct pcxhr_pipe capture_pipe[2];
0162
0163 struct pcxhr_stream playback_stream[PCXHR_PLAYBACK_STREAMS];
0164 struct pcxhr_stream capture_stream[2];
0165 int nb_streams_play;
0166 int nb_streams_capt;
0167
0168 int analog_playback_active[2];
0169 int analog_playback_volume[2];
0170 int analog_capture_volume[2];
0171 int digital_playback_active[PCXHR_PLAYBACK_STREAMS][2];
0172 int digital_playback_volume[PCXHR_PLAYBACK_STREAMS][2];
0173 int digital_capture_volume[2];
0174 int monitoring_active[2];
0175 int monitoring_volume[2];
0176 int audio_capture_source;
0177 int mic_volume;
0178 int mic_boost;
0179 int mic_active;
0180 int analog_capture_active;
0181 int phantom_power;
0182
0183 unsigned char aes_bits[5];
0184 };
0185
0186 struct pcxhr_hostport
0187 {
0188 char purgebuffer[6];
0189 char reserved[2];
0190 };
0191
0192
0193 int pcxhr_create_pcm(struct snd_pcxhr *chip);
0194 int pcxhr_set_clock(struct pcxhr_mgr *mgr, unsigned int rate);
0195 int pcxhr_get_external_clock(struct pcxhr_mgr *mgr,
0196 enum pcxhr_clock_type clock_type,
0197 int *sample_rate);
0198
0199 #endif