1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 * Driver for Digigram pcxhr soundcards
7 * Copyright (c) 2004 by Digigram <alsa@digigram.com>
10 #ifndef __SOUND_PCXHR_H
11 #define __SOUND_PCXHR_H
13 #include <linux/interrupt.h>
14 #include <linux/mutex.h>
15 #include <sound/pcm.h>
17 #define PCXHR_DRIVER_VERSION 0x000906 /* 0.9.6 */
18 #define PCXHR_DRIVER_VERSION_STRING "0.9.6" /* 0.9.6 */
21 #define PCXHR_MAX_CARDS 6
22 #define PCXHR_PLAYBACK_STREAMS 4
24 #define PCXHR_GRANULARITY 96 /* min 96 and multiple of 48 */
25 /* transfer granularity of pipes and the dsp time (MBOX4) */
26 #define PCXHR_GRANULARITY_MIN 96
27 /* TODO : granularity could be 64 or 128 */
28 #define PCXHR_GRANULARITY_HR22 192 /* granularity for stereo cards */
36 enum pcxhr_clock_type
{
37 PCXHR_CLOCK_TYPE_INTERNAL
= 0,
38 PCXHR_CLOCK_TYPE_WORD_CLOCK
,
39 PCXHR_CLOCK_TYPE_AES_SYNC
,
40 PCXHR_CLOCK_TYPE_AES_1
,
41 PCXHR_CLOCK_TYPE_AES_2
,
42 PCXHR_CLOCK_TYPE_AES_3
,
43 PCXHR_CLOCK_TYPE_AES_4
,
44 PCXHR_CLOCK_TYPE_MAX
= PCXHR_CLOCK_TYPE_AES_4
,
45 HR22_CLOCK_TYPE_INTERNAL
= PCXHR_CLOCK_TYPE_INTERNAL
,
46 HR22_CLOCK_TYPE_AES_SYNC
,
47 HR22_CLOCK_TYPE_AES_1
,
48 HR22_CLOCK_TYPE_MAX
= HR22_CLOCK_TYPE_AES_1
,
52 unsigned int num_cards
;
53 struct snd_pcxhr
*chip
[PCXHR_MAX_CARDS
];
61 /* card access with 1 mem bar and 2 io bar's */
62 unsigned long port
[3];
65 char name
[40]; /* name of this soundcard */
67 struct pcxhr_rmh
*prmh
;
69 struct mutex lock
; /* interrupt lock */
70 struct mutex msg_lock
; /* message lock */
72 struct mutex setup_mutex
; /* mutex used in hw_params, open and close */
73 struct mutex mixer_mutex
; /* mutex for mixer */
75 /* hardware interface */
76 unsigned int dsp_loaded
; /* bit flags of loaded dsp indices */
77 unsigned int dsp_version
; /* read from embedded once firmware is loaded */
82 unsigned int is_hr_stereo
:1;
83 unsigned int board_has_aes1
:1; /* if 1 board has AES1 plug and SRC */
84 unsigned int board_has_analog
:1; /* if 0 the board is digital only */
85 unsigned int board_has_mic
:1; /* if 1 the board has microphone input */
86 unsigned int board_aes_in_192k
:1;/* if 1 the aes input plugs do support 192kHz */
87 unsigned int mono_capture
:1; /* if 1 the board does mono capture */
88 unsigned int capture_ltc
:1; /* if 1 the board captures LTC input */
90 struct snd_dma_buffer hostport
;
92 enum pcxhr_clock_type use_clock_type
; /* clock type selected by mixer */
93 enum pcxhr_clock_type cur_clock_type
; /* current clock type synced */
96 int timer_toggle
; /* timer interrupt toggles between the two values 0x200 and 0x300 */
97 int dsp_time_last
; /* the last dsp time (read by interrupt) */
98 int dsp_time_err
; /* dsp time errors */
99 unsigned int src_it_dsp
; /* dsp interrupt source */
100 unsigned int io_num_reg_cont
; /* backup of IO_NUM_REG_CONT */
101 unsigned int codec_speed
; /* speed mode of the codecs */
102 unsigned int sample_rate_real
; /* current real sample rate */
104 int async_err_stream_xrun
;
105 int async_err_pipe_xrun
;
106 int async_err_other_last
;
108 unsigned char xlx_cfg
; /* copy of PCXHR_XLX_CFG register */
109 unsigned char xlx_selmic
; /* copy of PCXHR_XLX_SELMIC register */
110 unsigned char dsp_reset
; /* copy of PCXHR_DSP_RESET register */
114 enum pcxhr_stream_status
{
115 PCXHR_STREAM_STATUS_FREE
,
116 PCXHR_STREAM_STATUS_OPEN
,
117 PCXHR_STREAM_STATUS_SCHEDULE_RUN
,
118 PCXHR_STREAM_STATUS_STARTED
,
119 PCXHR_STREAM_STATUS_RUNNING
,
120 PCXHR_STREAM_STATUS_SCHEDULE_STOP
,
121 PCXHR_STREAM_STATUS_STOPPED
,
122 PCXHR_STREAM_STATUS_PAUSED
125 struct pcxhr_stream
{
126 struct snd_pcm_substream
*substream
;
127 snd_pcm_format_t format
;
128 struct pcxhr_pipe
*pipe
;
130 enum pcxhr_stream_status status
; /* free, open, running, draining, pause */
132 u_int64_t timer_abs_periods
; /* timer: samples elapsed since TRIGGER_START (multiple of period_size) */
133 u_int32_t timer_period_frag
; /* timer: samples elapsed since last call to snd_pcm_period_elapsed (0..period_size) */
134 u_int32_t timer_buf_periods
; /* nb of periods in the buffer that have already elapsed */
135 int timer_is_synced
; /* if(0) : timer needs to be resynced with real hardware pointer */
141 enum pcxhr_pipe_status
{
142 PCXHR_PIPE_UNDEFINED
,
147 enum pcxhr_pipe_status status
;
148 int is_capture
; /* this is a capture pipe */
149 int first_audio
; /* first audio num */
154 struct snd_card
*card
;
155 struct pcxhr_mgr
*mgr
;
156 int chip_idx
; /* zero based */
158 struct snd_pcm
*pcm
; /* PCM */
160 struct pcxhr_pipe playback_pipe
; /* 1 stereo pipe only */
161 struct pcxhr_pipe capture_pipe
[2]; /* 1 stereo or 2 mono pipes */
163 struct pcxhr_stream playback_stream
[PCXHR_PLAYBACK_STREAMS
];
164 struct pcxhr_stream capture_stream
[2]; /* 1 stereo or 2 mono streams */
168 int analog_playback_active
[2]; /* Mixer : Master Playback !mute */
169 int analog_playback_volume
[2]; /* Mixer : Master Playback Volume */
170 int analog_capture_volume
[2]; /* Mixer : Master Capture Volume */
171 int digital_playback_active
[PCXHR_PLAYBACK_STREAMS
][2];
172 int digital_playback_volume
[PCXHR_PLAYBACK_STREAMS
][2];
173 int digital_capture_volume
[2]; /* Mixer : Digital Capture Volume */
174 int monitoring_active
[2]; /* Mixer : Monitoring Active */
175 int monitoring_volume
[2]; /* Mixer : Monitoring Volume */
176 int audio_capture_source
; /* Mixer : Audio Capture Source */
177 int mic_volume
; /* used by cards with MIC only */
178 int mic_boost
; /* used by cards with MIC only */
179 int mic_active
; /* used by cards with MIC only */
180 int analog_capture_active
; /* used by cards with MIC only */
181 int phantom_power
; /* used by cards with MIC only */
183 unsigned char aes_bits
[5]; /* Mixer : IEC958_AES bits */
186 struct pcxhr_hostport
193 int pcxhr_create_pcm(struct snd_pcxhr
*chip
);
194 int pcxhr_set_clock(struct pcxhr_mgr
*mgr
, unsigned int rate
);
195 int pcxhr_get_external_clock(struct pcxhr_mgr
*mgr
,
196 enum pcxhr_clock_type clock_type
,
199 #endif /* __SOUND_PCXHR_H */