Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | #ifndef __SOUND_SB16_CSP_H |
2 | #define __SOUND_SB16_CSP_H | |
3 | ||
4 | /* | |
5 | * Copyright (c) 1999 by Uros Bizjak <uros@kss-loka.si> | |
6 | * Takashi Iwai <tiwai@suse.de> | |
7 | * | |
8 | * SB16ASP/AWE32 CSP control | |
9 | * | |
10 | * This program is free software; you can redistribute it and/or modify | |
11 | * it under the terms of the GNU General Public License as published by | |
12 | * the Free Software Foundation; either version 2 of the License, or | |
13 | * (at your option) any later version. | |
14 | * | |
15 | * This program is distributed in the hope that it will be useful, | |
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 | * GNU General Public License for more details. | |
19 | * | |
20 | * You should have received a copy of the GNU General Public License | |
21 | * along with this program; if not, write to the Free Software | |
22 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
23 | * | |
24 | */ | |
25 | ||
26 | /* CSP modes */ | |
27 | #define SNDRV_SB_CSP_MODE_NONE 0x00 | |
28 | #define SNDRV_SB_CSP_MODE_DSP_READ 0x01 /* Record from DSP */ | |
29 | #define SNDRV_SB_CSP_MODE_DSP_WRITE 0x02 /* Play to DSP */ | |
30 | #define SNDRV_SB_CSP_MODE_QSOUND 0x04 /* QSound */ | |
31 | ||
32 | /* CSP load flags */ | |
33 | #define SNDRV_SB_CSP_LOAD_FROMUSER 0x01 | |
34 | #define SNDRV_SB_CSP_LOAD_INITBLOCK 0x02 | |
35 | ||
36 | /* CSP sample width */ | |
37 | #define SNDRV_SB_CSP_SAMPLE_8BIT 0x01 | |
38 | #define SNDRV_SB_CSP_SAMPLE_16BIT 0x02 | |
39 | ||
40 | /* CSP channels */ | |
41 | #define SNDRV_SB_CSP_MONO 0x01 | |
42 | #define SNDRV_SB_CSP_STEREO 0x02 | |
43 | ||
44 | /* CSP rates */ | |
45 | #define SNDRV_SB_CSP_RATE_8000 0x01 | |
46 | #define SNDRV_SB_CSP_RATE_11025 0x02 | |
47 | #define SNDRV_SB_CSP_RATE_22050 0x04 | |
48 | #define SNDRV_SB_CSP_RATE_44100 0x08 | |
49 | #define SNDRV_SB_CSP_RATE_ALL 0x0f | |
50 | ||
51 | /* CSP running state */ | |
52 | #define SNDRV_SB_CSP_ST_IDLE 0x00 | |
53 | #define SNDRV_SB_CSP_ST_LOADED 0x01 | |
54 | #define SNDRV_SB_CSP_ST_RUNNING 0x02 | |
55 | #define SNDRV_SB_CSP_ST_PAUSED 0x04 | |
56 | #define SNDRV_SB_CSP_ST_AUTO 0x08 | |
57 | #define SNDRV_SB_CSP_ST_QSOUND 0x10 | |
58 | ||
59 | /* maximum QSound value (180 degrees right) */ | |
60 | #define SNDRV_SB_CSP_QSOUND_MAX_RIGHT 0x20 | |
61 | ||
62 | /* maximum microcode RIFF file size */ | |
63 | #define SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE 0x3000 | |
64 | ||
65 | /* microcode header */ | |
029d64b0 | 66 | struct snd_sb_csp_mc_header { |
1da177e4 LT |
67 | char codec_name[16]; /* id name of codec */ |
68 | unsigned short func_req; /* requested function */ | |
029d64b0 | 69 | }; |
1da177e4 LT |
70 | |
71 | /* microcode to be loaded */ | |
029d64b0 TI |
72 | struct snd_sb_csp_microcode { |
73 | struct snd_sb_csp_mc_header info; | |
1da177e4 | 74 | unsigned char data[SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE]; |
029d64b0 | 75 | }; |
1da177e4 LT |
76 | |
77 | /* start CSP with sample_width in mono/stereo */ | |
029d64b0 | 78 | struct snd_sb_csp_start { |
1da177e4 LT |
79 | int sample_width; /* sample width, look above */ |
80 | int channels; /* channels, look above */ | |
029d64b0 | 81 | }; |
1da177e4 LT |
82 | |
83 | /* CSP information */ | |
029d64b0 | 84 | struct snd_sb_csp_info { |
1da177e4 LT |
85 | char codec_name[16]; /* id name of codec */ |
86 | unsigned short func_nr; /* function number */ | |
87 | unsigned int acc_format; /* accepted PCM formats */ | |
88 | unsigned short acc_channels; /* accepted channels */ | |
89 | unsigned short acc_width; /* accepted sample width */ | |
90 | unsigned short acc_rates; /* accepted sample rates */ | |
91 | unsigned short csp_mode; /* CSP mode, see above */ | |
92 | unsigned short run_channels; /* current channels */ | |
93 | unsigned short run_width; /* current sample width */ | |
94 | unsigned short version; /* version id: 0x10 - 0x1f */ | |
95 | unsigned short state; /* state bits */ | |
029d64b0 | 96 | }; |
1da177e4 LT |
97 | |
98 | /* HWDEP controls */ | |
99 | /* get CSP information */ | |
029d64b0 | 100 | #define SNDRV_SB_CSP_IOCTL_INFO _IOR('H', 0x10, struct snd_sb_csp_info) |
1da177e4 | 101 | /* load microcode to CSP */ |
4f3c7a18 TI |
102 | /* NOTE: struct snd_sb_csp_microcode overflows the max size (13 bits) |
103 | * defined for some architectures like MIPS, and it leads to build errors. | |
104 | * (x86 and co have 14-bit size, thus it's valid, though.) | |
105 | * As a workaround for skipping the size-limit check, here we don't use the | |
106 | * normal _IOW() macro but _IOC() with the manual argument. | |
107 | */ | |
108 | #define SNDRV_SB_CSP_IOCTL_LOAD_CODE \ | |
109 | _IOC(_IOC_WRITE, 'H', 0x11, sizeof(struct snd_sb_csp_microcode)) | |
1da177e4 LT |
110 | /* unload microcode from CSP */ |
111 | #define SNDRV_SB_CSP_IOCTL_UNLOAD_CODE _IO('H', 0x12) | |
112 | /* start CSP */ | |
029d64b0 | 113 | #define SNDRV_SB_CSP_IOCTL_START _IOW('H', 0x13, struct snd_sb_csp_start) |
1da177e4 LT |
114 | /* stop CSP */ |
115 | #define SNDRV_SB_CSP_IOCTL_STOP _IO('H', 0x14) | |
116 | /* pause CSP and DMA transfer */ | |
117 | #define SNDRV_SB_CSP_IOCTL_PAUSE _IO('H', 0x15) | |
118 | /* restart CSP and DMA transfer */ | |
119 | #define SNDRV_SB_CSP_IOCTL_RESTART _IO('H', 0x16) | |
120 | ||
121 | #ifdef __KERNEL__ | |
122 | #include "sb.h" | |
123 | #include "hwdep.h" | |
de66d53e | 124 | #include <linux/firmware.h> |
1da177e4 | 125 | |
029d64b0 | 126 | struct snd_sb_csp; |
1da177e4 | 127 | |
de66d53e CL |
128 | /* indices for the known CSP programs */ |
129 | enum { | |
130 | CSP_PROGRAM_MULAW, | |
131 | CSP_PROGRAM_ALAW, | |
132 | CSP_PROGRAM_ADPCM_INIT, | |
133 | CSP_PROGRAM_ADPCM_PLAYBACK, | |
134 | CSP_PROGRAM_ADPCM_CAPTURE, | |
135 | ||
136 | CSP_PROGRAM_COUNT | |
137 | }; | |
138 | ||
1da177e4 LT |
139 | /* |
140 | * CSP operators | |
141 | */ | |
029d64b0 TI |
142 | struct snd_sb_csp_ops { |
143 | int (*csp_use) (struct snd_sb_csp * p); | |
144 | int (*csp_unuse) (struct snd_sb_csp * p); | |
145 | int (*csp_autoload) (struct snd_sb_csp * p, int pcm_sfmt, int play_rec_mode); | |
146 | int (*csp_start) (struct snd_sb_csp * p, int sample_width, int channels); | |
147 | int (*csp_stop) (struct snd_sb_csp * p); | |
148 | int (*csp_qsound_transfer) (struct snd_sb_csp * p); | |
149 | }; | |
1da177e4 LT |
150 | |
151 | /* | |
152 | * CSP private data | |
153 | */ | |
154 | struct snd_sb_csp { | |
029d64b0 | 155 | struct snd_sb *chip; /* SB16 DSP */ |
1da177e4 LT |
156 | int used; /* usage flag - exclusive */ |
157 | char codec_name[16]; /* name of codec */ | |
158 | unsigned short func_nr; /* function number */ | |
159 | unsigned int acc_format; /* accepted PCM formats */ | |
160 | int acc_channels; /* accepted channels */ | |
161 | int acc_width; /* accepted sample width */ | |
162 | int acc_rates; /* accepted sample rates */ | |
163 | int mode; /* MODE */ | |
164 | int run_channels; /* current CSP channels */ | |
165 | int run_width; /* current sample width */ | |
166 | int version; /* CSP version (0x10 - 0x1f) */ | |
167 | int running; /* running state */ | |
168 | ||
029d64b0 | 169 | struct snd_sb_csp_ops ops; /* operators */ |
1da177e4 LT |
170 | |
171 | spinlock_t q_lock; /* locking */ | |
172 | int q_enabled; /* enabled flag */ | |
173 | int qpos_left; /* left position */ | |
174 | int qpos_right; /* right position */ | |
175 | int qpos_changed; /* position changed flag */ | |
176 | ||
029d64b0 TI |
177 | struct snd_kcontrol *qsound_switch; |
178 | struct snd_kcontrol *qsound_space; | |
1da177e4 | 179 | |
8b7547f9 | 180 | struct mutex access_mutex; /* locking */ |
de66d53e CL |
181 | |
182 | const struct firmware *csp_programs[CSP_PROGRAM_COUNT]; | |
1da177e4 LT |
183 | }; |
184 | ||
029d64b0 | 185 | int snd_sb_csp_new(struct snd_sb *chip, int device, struct snd_hwdep ** rhwdep); |
1da177e4 LT |
186 | #endif |
187 | ||
188 | #endif /* __SOUND_SB16_CSP */ |