ess.c revision 1.2 1 1.2 augustss /* $NetBSD: ess.c,v 1.2 1998/07/30 14:11:44 augustss Exp $ */
2 1.1 augustss
3 1.1 augustss /*
4 1.1 augustss * Copyright 1997
5 1.1 augustss * Digital Equipment Corporation. All rights reserved.
6 1.1 augustss *
7 1.1 augustss * This software is furnished under license and may be used and
8 1.1 augustss * copied only in accordance with the following terms and conditions.
9 1.1 augustss * Subject to these conditions, you may download, copy, install,
10 1.1 augustss * use, modify and distribute this software in source and/or binary
11 1.1 augustss * form. No title or ownership is transferred hereby.
12 1.1 augustss *
13 1.1 augustss * 1) Any source code used, modified or distributed must reproduce
14 1.1 augustss * and retain this copyright notice and list of conditions as
15 1.1 augustss * they appear in the source file.
16 1.1 augustss *
17 1.1 augustss * 2) No right is granted to use any trade name, trademark, or logo of
18 1.1 augustss * Digital Equipment Corporation. Neither the "Digital Equipment
19 1.1 augustss * Corporation" name nor any trademark or logo of Digital Equipment
20 1.1 augustss * Corporation may be used to endorse or promote products derived
21 1.1 augustss * from this software without the prior written permission of
22 1.1 augustss * Digital Equipment Corporation.
23 1.1 augustss *
24 1.1 augustss * 3) This software is provided "AS-IS" and any express or implied
25 1.1 augustss * warranties, including but not limited to, any implied warranties
26 1.1 augustss * of merchantability, fitness for a particular purpose, or
27 1.1 augustss * non-infringement are disclaimed. In no event shall DIGITAL be
28 1.1 augustss * liable for any damages whatsoever, and in particular, DIGITAL
29 1.1 augustss * shall not be liable for special, indirect, consequential, or
30 1.1 augustss * incidental damages or damages for lost profits, loss of
31 1.1 augustss * revenue or loss of use, whether such damages arise in contract,
32 1.1 augustss * negligence, tort, under statute, in equity, at law or otherwise,
33 1.1 augustss * even if advised of the possibility of such damage.
34 1.1 augustss */
35 1.1 augustss
36 1.1 augustss /*
37 1.1 augustss **++
38 1.1 augustss **
39 1.1 augustss ** ess.c
40 1.1 augustss **
41 1.1 augustss ** FACILITY:
42 1.1 augustss **
43 1.1 augustss ** DIGITAL Network Appliance Reference Design (DNARD)
44 1.1 augustss **
45 1.1 augustss ** MODULE DESCRIPTION:
46 1.1 augustss **
47 1.1 augustss ** This module contains the device driver for the ESS
48 1.1 augustss ** Technologies 1888/1887/888 sound chip. The code in sbdsp.c was
49 1.1 augustss ** used as a reference point when implementing this driver.
50 1.1 augustss **
51 1.1 augustss ** AUTHORS:
52 1.1 augustss **
53 1.1 augustss ** Blair Fidler Software Engineering Australia
54 1.1 augustss ** Gold Coast, Australia.
55 1.1 augustss **
56 1.1 augustss ** CREATION DATE:
57 1.1 augustss **
58 1.1 augustss ** March 10, 1997.
59 1.1 augustss **
60 1.1 augustss ** MODIFICATION HISTORY:
61 1.1 augustss **
62 1.1 augustss **--
63 1.1 augustss */
64 1.1 augustss
65 1.1 augustss /*
66 1.1 augustss * Modification by Lennart Augustsson:
67 1.1 augustss * Adapt for bus dma.
68 1.1 augustss * Change to 1.3 audio interface.
69 1.1 augustss */
70 1.1 augustss
71 1.1 augustss /*
72 1.1 augustss * TODO (falling priority):
73 1.1 augustss * - test and get it to run.
74 1.1 augustss * - add looping DMA (copy from sbdsp.c).
75 1.1 augustss * - avoid using wired in IRQ/DRQ levels.
76 1.1 augustss * - look over how the two channels are set up, it's rather messy now.
77 1.1 augustss * - make a lot of #define for magic constants in the code.
78 1.1 augustss */
79 1.1 augustss
80 1.1 augustss #include <sys/param.h>
81 1.1 augustss #include <sys/systm.h>
82 1.1 augustss #include <sys/errno.h>
83 1.1 augustss #include <sys/ioctl.h>
84 1.1 augustss #include <sys/syslog.h>
85 1.1 augustss #include <sys/device.h>
86 1.1 augustss #include <sys/proc.h>
87 1.1 augustss
88 1.1 augustss #include <machine/cpu.h>
89 1.1 augustss #include <machine/intr.h>
90 1.1 augustss #include <machine/pio.h>
91 1.1 augustss
92 1.1 augustss #include <sys/audioio.h>
93 1.1 augustss #include <dev/audio_if.h>
94 1.1 augustss #include <dev/auconv.h>
95 1.1 augustss #include <dev/mulaw.h>
96 1.1 augustss
97 1.1 augustss #include <dev/isa/isavar.h>
98 1.1 augustss #include <dev/isa/isadmavar.h>
99 1.1 augustss
100 1.1 augustss #include <dev/isa/essvar.h>
101 1.1 augustss #include <dev/isa/essreg.h>
102 1.1 augustss
103 1.1 augustss #ifdef AUDIO_DEBUG
104 1.1 augustss #define DPRINTF(x) if (essdebug) printf x
105 1.2 augustss #define DPRINTFN(n,x) if (essdebug>(n)) printf x
106 1.1 augustss int essdebug = 0;
107 1.1 augustss #else
108 1.1 augustss #define DPRINTF(x)
109 1.2 augustss #define DPRINTFN(n,x)
110 1.1 augustss #endif
111 1.1 augustss
112 1.2 augustss #if 0
113 1.2 augustss unsigned uuu;
114 1.2 augustss #define EREAD1(t, h, a) (uuu=bus_space_read_1(t, h, a),printf("EREAD %02x=%02x\n", ((int)h&0xfff)+a, uuu),uuu)
115 1.2 augustss #define EWRITE1(t, h, a, d) (printf("EWRITE %02x=%02x\n", ((int)h & 0xfff)+a, d), bus_space_write_1(t, h, a, d))
116 1.2 augustss #else
117 1.2 augustss #define EREAD1(t, h, a) bus_space_read_1(t, h, a)
118 1.2 augustss #define EWRITE1(t, h, a, d) bus_space_write_1(t, h, a, d)
119 1.2 augustss #endif
120 1.1 augustss
121 1.2 augustss
122 1.2 augustss int ess_setup_sc __P((struct ess_softc *, int));
123 1.1 augustss
124 1.1 augustss int ess_open __P((void *, int));
125 1.1 augustss void ess_close __P((void *));
126 1.1 augustss int ess_getdev __P((void *, struct audio_device *));
127 1.1 augustss int ess_drain __P((void *));
128 1.1 augustss
129 1.1 augustss int ess_query_encoding __P((void *, struct audio_encoding *));
130 1.1 augustss
131 1.1 augustss int ess_set_params __P((void *, int, int, struct audio_params *,
132 1.1 augustss struct audio_params *));
133 1.1 augustss int ess_set_in_sr __P((void *, u_long));
134 1.1 augustss int ess_set_out_sr __P((void *, u_long));
135 1.1 augustss int ess_set_in_precision __P((void *, u_int));
136 1.1 augustss int ess_set_out_precision __P((void *, u_int));
137 1.1 augustss int ess_set_in_channels __P((void *, int));
138 1.1 augustss int ess_set_out_channels __P((void *, int));
139 1.1 augustss
140 1.1 augustss int ess_round_blocksize __P((void *, int));
141 1.1 augustss
142 1.1 augustss int ess_dma_output __P((void *, void *, int, void (*)(void *), void *));
143 1.1 augustss int ess_dma_input __P((void *, void *, int, void (*)(void *), void *));
144 1.1 augustss int ess_halt_output __P((void *));
145 1.1 augustss int ess_halt_input __P((void *));
146 1.1 augustss
147 1.1 augustss int ess_intr_output __P((void *));
148 1.1 augustss int ess_intr_input __P((void *));
149 1.1 augustss
150 1.1 augustss int ess_speaker_ctl __P((void *, int));
151 1.1 augustss
152 1.1 augustss int ess_getdev __P((void *, struct audio_device *));
153 1.1 augustss
154 1.1 augustss int ess_set_port __P((void *, mixer_ctrl_t *));
155 1.1 augustss int ess_get_port __P((void *, mixer_ctrl_t *));
156 1.1 augustss
157 1.1 augustss int ess_query_devinfo __P((void *, mixer_devinfo_t *));
158 1.1 augustss int ess_get_props __P((void *));
159 1.1 augustss
160 1.1 augustss
161 1.1 augustss int ess_config_addr __P((struct ess_softc *));
162 1.1 augustss void ess_config_intr __P((struct ess_softc *));
163 1.1 augustss int ess_identify __P((struct ess_softc *));
164 1.1 augustss
165 1.1 augustss int ess_reset __P((struct ess_softc *));
166 1.1 augustss void ess_set_gain __P((struct ess_softc *, int, int));
167 1.1 augustss int ess_set_in_ports __P((struct ess_softc *, int));
168 1.1 augustss void ess_speaker_on __P((struct ess_softc *));
169 1.1 augustss void ess_speaker_off __P((struct ess_softc *));
170 1.1 augustss u_int ess_srtotc __P((u_int));
171 1.1 augustss u_int ess_srtofc __P((u_int));
172 1.1 augustss u_char ess_get_dsp_status __P((struct ess_softc *));
173 1.1 augustss u_char ess_dsp_read_ready __P((struct ess_softc *));
174 1.1 augustss u_char ess_dsp_write_ready __P((struct ess_softc *sc));
175 1.1 augustss int ess_rdsp __P((struct ess_softc *));
176 1.1 augustss int ess_wdsp __P((struct ess_softc *, u_char));
177 1.1 augustss u_char ess_read_x_reg __P((struct ess_softc *, u_char));
178 1.1 augustss int ess_write_x_reg __P((struct ess_softc *, u_char, u_char));
179 1.1 augustss void ess_clear_xreg_bits __P((struct ess_softc *, u_char, u_char));
180 1.1 augustss void ess_set_xreg_bits __P((struct ess_softc *, u_char, u_char));
181 1.1 augustss u_char ess_read_mix_reg __P((struct ess_softc *, u_char));
182 1.1 augustss void ess_write_mix_reg __P((struct ess_softc *, u_char, u_char));
183 1.1 augustss void ess_clear_mreg_bits __P((struct ess_softc *, u_char, u_char));
184 1.1 augustss void ess_set_mreg_bits __P((struct ess_softc *, u_char, u_char));
185 1.1 augustss
186 1.1 augustss static char *essmodel[] = {
187 1.1 augustss "unsupported",
188 1.1 augustss "1888",
189 1.1 augustss "1887",
190 1.1 augustss "888"
191 1.1 augustss };
192 1.1 augustss
193 1.1 augustss struct audio_device ess_device = {
194 1.1 augustss "ESS Technology",
195 1.1 augustss "x",
196 1.1 augustss "ess"
197 1.1 augustss };
198 1.1 augustss
199 1.1 augustss /*
200 1.1 augustss * Define our interface to the higher level audio driver.
201 1.1 augustss */
202 1.1 augustss
203 1.1 augustss struct audio_hw_if ess_hw_if = {
204 1.1 augustss ess_open,
205 1.1 augustss ess_close,
206 1.1 augustss NULL,
207 1.1 augustss ess_query_encoding,
208 1.1 augustss ess_set_params,
209 1.1 augustss ess_round_blocksize,
210 1.1 augustss NULL,
211 1.1 augustss NULL,
212 1.1 augustss NULL,
213 1.1 augustss ess_dma_output,
214 1.1 augustss ess_dma_input,
215 1.1 augustss ess_halt_output,
216 1.1 augustss ess_halt_input,
217 1.1 augustss ess_speaker_ctl,
218 1.1 augustss ess_getdev,
219 1.1 augustss NULL,
220 1.1 augustss ess_set_port,
221 1.1 augustss ess_get_port,
222 1.1 augustss ess_query_devinfo,
223 1.1 augustss NULL,
224 1.1 augustss NULL,
225 1.1 augustss NULL,
226 1.1 augustss NULL,
227 1.1 augustss ess_get_props,
228 1.1 augustss };
229 1.1 augustss
230 1.1 augustss #ifdef AUDIO_DEBUG
231 1.1 augustss void ess_printsc __P((struct ess_softc *));
232 1.1 augustss void ess_dump_mixer __P((struct ess_softc *));
233 1.1 augustss
234 1.1 augustss void
235 1.1 augustss ess_printsc(sc)
236 1.1 augustss struct ess_softc *sc;
237 1.1 augustss {
238 1.1 augustss int i;
239 1.1 augustss
240 1.1 augustss printf("open %d iobase 0x%x outport %u inport %u speaker %s\n",
241 1.1 augustss (int)sc->sc_open, sc->sc_iobase, sc->out_port,
242 1.1 augustss sc->in_port, sc->spkr_state ? "on" : "off");
243 1.1 augustss
244 1.1 augustss printf("play: dmachan %d irq %d nintr %lu intr %p arg %p\n",
245 1.1 augustss sc->sc_out.drq, sc->sc_out.irq, sc->sc_out.nintr,
246 1.1 augustss sc->sc_out.intr, sc->sc_out.arg);
247 1.1 augustss
248 1.1 augustss printf("record: dmachan %d irq %d nintr %lu intr %p arg %p\n",
249 1.1 augustss sc->sc_in.drq, sc->sc_in.irq, sc->sc_in.nintr,
250 1.1 augustss sc->sc_in.intr, sc->sc_in.arg);
251 1.1 augustss
252 1.1 augustss printf("gain:");
253 1.1 augustss for (i = 0; i < ESS_NDEVS; i++)
254 1.1 augustss printf(" %u,%u", sc->gain[i][ESS_LEFT], sc->gain[i][ESS_RIGHT]);
255 1.1 augustss printf("\n");
256 1.1 augustss }
257 1.1 augustss
258 1.1 augustss void
259 1.1 augustss ess_dump_mixer(sc)
260 1.1 augustss struct ess_softc *sc;
261 1.1 augustss {
262 1.1 augustss printf("ESS_DAC_PLAY_VOL: mix reg 0x%02x=0x%02x\n",
263 1.1 augustss 0x7C, ess_read_mix_reg(sc, 0x7C));
264 1.1 augustss printf("ESS_MIC_PLAY_VOL: mix reg 0x%02x=0x%02x\n",
265 1.1 augustss 0x1A, ess_read_mix_reg(sc, 0x1A));
266 1.1 augustss printf("ESS_LINE_PLAY_VOL: mix reg 0x%02x=0x%02x\n",
267 1.1 augustss 0x3E, ess_read_mix_reg(sc, 0x3E));
268 1.1 augustss printf("ESS_SYNTH_PLAY_VOL: mix reg 0x%02x=0x%02x\n",
269 1.1 augustss 0x36, ess_read_mix_reg(sc, 0x36));
270 1.1 augustss printf("ESS_CD_PLAY_VOL: mix reg 0x%02x=0x%02x\n",
271 1.1 augustss 0x38, ess_read_mix_reg(sc, 0x38));
272 1.1 augustss printf("ESS_AUXB_PLAY_VOL: mix reg 0x%02x=0x%02x\n",
273 1.1 augustss 0x3A, ess_read_mix_reg(sc, 0x3A));
274 1.1 augustss printf("ESS_MASTER_VOL: mix reg 0x%02x=0x%02x\n",
275 1.1 augustss 0x32, ess_read_mix_reg(sc, 0x32));
276 1.1 augustss printf("ESS_PCSPEAKER_VOL: mix reg 0x%02x=0x%02x\n",
277 1.1 augustss 0x3C, ess_read_mix_reg(sc, 0x3C));
278 1.1 augustss printf("ESS_DAC_REC_VOL: mix reg 0x%02x=0x%02x\n",
279 1.1 augustss 0x69, ess_read_mix_reg(sc, 0x69));
280 1.1 augustss printf("ESS_MIC_REC_VOL: mix reg 0x%02x=0x%02x\n",
281 1.1 augustss 0x68, ess_read_mix_reg(sc, 0x68));
282 1.1 augustss printf("ESS_LINE_REC_VOL: mix reg 0x%02x=0x%02x\n",
283 1.1 augustss 0x6E, ess_read_mix_reg(sc, 0x6E));
284 1.1 augustss printf("ESS_SYNTH_REC_VOL: mix reg 0x%02x=0x%02x\n",
285 1.1 augustss 0x6B, ess_read_mix_reg(sc, 0x6B));
286 1.1 augustss printf("ESS_CD_REC_VOL: mix reg 0x%02x=0x%02x\n",
287 1.1 augustss 0x6A, ess_read_mix_reg(sc, 0x6A));
288 1.1 augustss printf("ESS_AUXB_REC_VOL: mix reg 0x%02x=0x%02x\n",
289 1.1 augustss 0x6C, ess_read_mix_reg(sc, 0x6C));
290 1.1 augustss printf("ESS_RECORD_VOL: x reg 0x%02x=0x%02x\n",
291 1.1 augustss 0xB4, ess_read_x_reg(sc, 0xB4));
292 1.1 augustss printf("Audio 1 play vol (unused): mix reg 0x%02x=0x%02x\n",
293 1.1 augustss 0x14, ess_read_mix_reg(sc, 0x14));
294 1.1 augustss
295 1.1 augustss printf("ESS_MIC_PREAMP: x reg 0x%02x=0x%02x\n",
296 1.1 augustss ESS_XCMD_PREAMP_CTRL, ess_read_x_reg(sc, ESS_XCMD_PREAMP_CTRL));
297 1.1 augustss printf("ESS_RECORD_MONITOR: x reg 0x%02x=0x%02x\n",
298 1.1 augustss ESS_XCMD_AUDIO_CTRL, ess_read_x_reg(sc, ESS_XCMD_AUDIO_CTRL));
299 1.1 augustss printf("Record source: mix reg 0x%02x=0x%02x, 0x%02x=0x%02x\n",
300 1.1 augustss 0x1c, ess_read_mix_reg(sc, 0x1c),
301 1.1 augustss 0x7a, ess_read_mix_reg(sc, 0x7a));
302 1.1 augustss }
303 1.1 augustss
304 1.1 augustss #endif
305 1.1 augustss
306 1.1 augustss /*
307 1.1 augustss * Configure the ESS chip for the desired audio base address.
308 1.1 augustss */
309 1.1 augustss int
310 1.1 augustss ess_config_addr(sc)
311 1.1 augustss struct ess_softc *sc;
312 1.1 augustss {
313 1.1 augustss int iobase = sc->sc_iobase;
314 1.1 augustss bus_space_tag_t iot = sc->sc_iot;
315 1.1 augustss
316 1.1 augustss /* XXX make this a runtime choice */
317 1.1 augustss #ifdef ESS_AMODE_LOW
318 1.1 augustss /*
319 1.1 augustss * Configure using the Read-Sequence-Key method. This method
320 1.1 augustss * is used when the AMODE line is tied low, which is the case
321 1.1 augustss * for the evaluation board, but not for the Shark. First we
322 1.1 augustss * read a magic sequence of registers, then we read from the
323 1.1 augustss * desired base addresses. See page 21 of ES1887 data sheet
324 1.1 augustss * for details.
325 1.1 augustss */
326 1.1 augustss
327 1.1 augustss bus_space_handle_t ioh;
328 1.1 augustss
329 1.1 augustss /*
330 1.1 augustss * Get a mapping for the configuration key registers.
331 1.1 augustss */
332 1.1 augustss if (bus_space_map(iot, ESS_CONFIG_KEY_BASE, ESS_CONFIG_KEY_PORTS,
333 1.1 augustss 0, &ioh)) {
334 1.1 augustss printf("ess: can't map configuration key registers\n");
335 1.1 augustss return (1);
336 1.1 augustss }
337 1.1 augustss
338 1.1 augustss /*
339 1.1 augustss * Read the magic key sequence.
340 1.1 augustss */
341 1.2 augustss EREAD1(iot, ioh, 0);
342 1.2 augustss EREAD1(iot, ioh, 0);
343 1.2 augustss EREAD1(iot, ioh, 0);
344 1.2 augustss
345 1.2 augustss EREAD1(iot, ioh, 2);
346 1.2 augustss EREAD1(iot, ioh, 0);
347 1.2 augustss EREAD1(iot, ioh, 2);
348 1.2 augustss EREAD1(iot, ioh, 0);
349 1.2 augustss EREAD1(iot, ioh, 0);
350 1.2 augustss EREAD1(iot, ioh, 2);
351 1.2 augustss EREAD1(iot, ioh, 0);
352 1.1 augustss
353 1.1 augustss /*
354 1.1 augustss * Unmap the configuration key registers.
355 1.1 augustss */
356 1.1 augustss bus_space_unmap(iot, ioh, ESS_CONFIG_KEY_PORTS);
357 1.1 augustss
358 1.1 augustss
359 1.1 augustss /*
360 1.1 augustss * Get a mapping for the audio base address.
361 1.1 augustss */
362 1.1 augustss if (bus_space_map(iot, iobase, 1, 0, &ioh)) {
363 1.1 augustss printf("ess: can't map audio base address (0x%x)\n", iobase);
364 1.1 augustss return (1);
365 1.1 augustss }
366 1.1 augustss
367 1.1 augustss /*
368 1.1 augustss * Read from the audio base address.
369 1.1 augustss */
370 1.2 augustss EREAD1(iot, ioh, 0);
371 1.1 augustss
372 1.1 augustss /*
373 1.1 augustss * Unmap the audio base address
374 1.1 augustss */
375 1.1 augustss bus_space_unmap(iot, ioh, 1);
376 1.1 augustss #else
377 1.1 augustss /*
378 1.1 augustss * Configure using the System Control Register method. This
379 1.1 augustss * method is used when the AMODE line is tied high, which is
380 1.1 augustss * the case for the Shark, but not for the evaluation board.
381 1.1 augustss */
382 1.1 augustss
383 1.1 augustss bus_space_handle_t scr_access_ioh;
384 1.1 augustss bus_space_handle_t scr_ioh;
385 1.1 augustss u_short scr_value;
386 1.1 augustss
387 1.1 augustss /*
388 1.1 augustss * Set the SCR bit to enable audio.
389 1.1 augustss */
390 1.1 augustss scr_value = ESS_SCR_AUDIO_ENABLE;
391 1.1 augustss
392 1.1 augustss /*
393 1.1 augustss * Set the SCR bits necessary to select the specified audio
394 1.1 augustss * base address.
395 1.1 augustss */
396 1.1 augustss switch(iobase) {
397 1.1 augustss case 0x220:
398 1.1 augustss scr_value |= ESS_SCR_AUDIO_220;
399 1.1 augustss break;
400 1.1 augustss case 0x230:
401 1.1 augustss scr_value |= ESS_SCR_AUDIO_230;
402 1.1 augustss break;
403 1.1 augustss case 0x240:
404 1.1 augustss scr_value |= ESS_SCR_AUDIO_240;
405 1.1 augustss break;
406 1.1 augustss case 0x250:
407 1.1 augustss scr_value |= ESS_SCR_AUDIO_250;
408 1.1 augustss break;
409 1.1 augustss default:
410 1.1 augustss printf("ess: configured iobase 0x%x invalid\n", iobase);
411 1.1 augustss return (1);
412 1.1 augustss break;
413 1.1 augustss }
414 1.1 augustss
415 1.1 augustss /*
416 1.1 augustss * Get a mapping for the System Control Register (SCR) access
417 1.1 augustss * registers and the SCR data registers.
418 1.1 augustss */
419 1.1 augustss if (bus_space_map(iot, ESS_SCR_ACCESS_BASE, ESS_SCR_ACCESS_PORTS,
420 1.1 augustss 0, &scr_access_ioh)) {
421 1.1 augustss printf("ess: can't map SCR access registers\n");
422 1.1 augustss return (1);
423 1.1 augustss }
424 1.1 augustss if (bus_space_map(iot, ESS_SCR_BASE, ESS_SCR_PORTS,
425 1.1 augustss 0, &scr_ioh)) {
426 1.1 augustss printf("ess: can't map SCR registers\n");
427 1.1 augustss bus_space_unmap(iot, scr_access_ioh, ESS_SCR_ACCESS_PORTS);
428 1.1 augustss return (1);
429 1.1 augustss }
430 1.1 augustss
431 1.1 augustss /* Unlock the SCR. */
432 1.2 augustss EWRITE1(iot, scr_access_ioh, ESS_SCR_UNLOCK, 0);
433 1.1 augustss
434 1.1 augustss /* Write the base address information into SCR[0]. */
435 1.2 augustss EWRITE1(iot, scr_ioh, ESS_SCR_INDEX, 0);
436 1.2 augustss EWRITE1(iot, scr_ioh, ESS_SCR_DATA, scr_value);
437 1.1 augustss
438 1.1 augustss /* Lock the SCR. */
439 1.2 augustss EWRITE1(iot, scr_access_ioh, ESS_SCR_LOCK, 0);
440 1.1 augustss
441 1.1 augustss /* Unmap the SCR access ports and the SCR data ports. */
442 1.1 augustss bus_space_unmap(iot, scr_access_ioh, ESS_SCR_ACCESS_PORTS);
443 1.1 augustss bus_space_unmap(iot, scr_ioh, ESS_SCR_PORTS);
444 1.1 augustss #endif
445 1.1 augustss
446 1.1 augustss return 0;
447 1.1 augustss }
448 1.1 augustss
449 1.1 augustss
450 1.1 augustss /*
451 1.1 augustss * Configure the ESS chip for the desired IRQ and DMA channels.
452 1.2 augustss * Shark interrupt mapping
453 1.2 augustss * ESS ISA
454 1.2 augustss * --------
455 1.2 augustss * IRQA irq9
456 1.2 augustss * IRQB irq5
457 1.2 augustss * IRQC irq7
458 1.2 augustss * IRQD irq10
459 1.2 augustss * IRQE irq15
460 1.2 augustss * DRQA drq0
461 1.2 augustss * DRQB drq1
462 1.2 augustss * DRQC drq3
463 1.2 augustss * DRQD drq5
464 1.1 augustss */
465 1.1 augustss void
466 1.1 augustss ess_config_intr(sc)
467 1.1 augustss struct ess_softc *sc;
468 1.1 augustss {
469 1.2 augustss int v = 0;
470 1.1 augustss
471 1.2 augustss /* Configure Audio 1 (record) for the appropriate IRQ line. */
472 1.1 augustss switch(sc->sc_in.irq) {
473 1.1 augustss case 5:
474 1.1 augustss v = 0x54;
475 1.1 augustss break;
476 1.1 augustss case 7:
477 1.1 augustss v = 0x58;
478 1.1 augustss break;
479 1.1 augustss case 9:
480 1.1 augustss v = 0x50;
481 1.1 augustss break;
482 1.1 augustss case 10:
483 1.1 augustss v = 0x5c;
484 1.1 augustss break;
485 1.2 augustss #ifdef DIAGNOSTIC
486 1.1 augustss default:
487 1.1 augustss printf("ess: configured irq %d not supported for Audio 1\n",
488 1.1 augustss sc->sc_in.irq);
489 1.1 augustss return;
490 1.2 augustss #endif
491 1.1 augustss }
492 1.2 augustss ess_write_x_reg(sc, 0xb1, v);
493 1.1 augustss
494 1.1 augustss /*
495 1.2 augustss * XXX: Does bit 4 really need to be set? Reading the data
496 1.1 augustss * sheet, it seems that this is only necessary for
497 1.1 augustss * compatibility mode.
498 1.1 augustss */
499 1.2 augustss /* Configure Audio 1 (record) for DMA on the appropriate channel. */
500 1.2 augustss switch(sc->sc_in.drq) {
501 1.1 augustss case 0:
502 1.1 augustss v = 0x54;
503 1.1 augustss break;
504 1.1 augustss case 1:
505 1.1 augustss v = 0x58;
506 1.1 augustss break;
507 1.1 augustss case 3:
508 1.1 augustss v = 0x5c;
509 1.1 augustss break;
510 1.2 augustss #ifdef DIAGNOSTIC
511 1.1 augustss default:
512 1.1 augustss printf("essdsp: configured dma chan %d not supported for Audio 1\n",
513 1.1 augustss sc->sc_in.drq);
514 1.1 augustss return;
515 1.1 augustss }
516 1.2 augustss #endif
517 1.2 augustss ess_write_x_reg(sc, 0xb2, v);
518 1.2 augustss
519 1.2 augustss /* XXX hardcode audio2 to irq15 and drq1 since this is a mess anyway */
520 1.2 augustss /* XXX assume 1887 */
521 1.2 augustss ess_set_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL2, 0x60);
522 1.2 augustss ess_write_mix_reg(sc, 0x7d, 0x05); /* DRQB */
523 1.2 augustss ess_write_mix_reg(sc, 0x7f, 0x00); /* 1888 method */
524 1.1 augustss }
525 1.1 augustss
526 1.1 augustss /*
527 1.1 augustss * Determine the model of ESS chip we are talking to. Currently we
528 1.1 augustss * only support ES1888, ES1887 and ES888. The method of determining
529 1.1 augustss * the chip is based on the information on page 27 of the ES1887 data
530 1.1 augustss * sheet.
531 1.1 augustss *
532 1.1 augustss * This routine sets the values of sc->sc_model and sc->sc_version.
533 1.1 augustss */
534 1.1 augustss int
535 1.1 augustss ess_identify(sc)
536 1.1 augustss struct ess_softc *sc;
537 1.1 augustss {
538 1.1 augustss u_char reg1;
539 1.1 augustss u_char reg2;
540 1.1 augustss u_char reg3;
541 1.1 augustss
542 1.1 augustss sc->sc_model = ESS_UNSUPPORTED;
543 1.1 augustss sc->sc_version = 0;
544 1.1 augustss
545 1.1 augustss
546 1.1 augustss /*
547 1.1 augustss * 1. Check legacy ID bytes. These should be 0x68 0x8n, where
548 1.1 augustss * n >= 8 for an ES1887 or an ES888. Other values indicate
549 1.1 augustss * earlier (unsupported) chips.
550 1.1 augustss */
551 1.1 augustss ess_wdsp(sc, ESS_ACMD_LEGACY_ID);
552 1.1 augustss
553 1.1 augustss if ((reg1 = ess_rdsp(sc)) != 0x68) {
554 1.1 augustss printf("ess: First ID byte wrong (0x%02x)\n", reg1);
555 1.1 augustss return 1;
556 1.1 augustss }
557 1.1 augustss
558 1.1 augustss reg2 = ess_rdsp(sc);
559 1.1 augustss if (((reg2 & 0xf0) != 0x80) ||
560 1.1 augustss ((reg2 & 0x0f) < 8)) {
561 1.1 augustss printf("ess: Second ID byte wrong (0x%02x)\n", reg2);
562 1.1 augustss return 1;
563 1.1 augustss }
564 1.1 augustss
565 1.1 augustss /*
566 1.1 augustss * Store the ID bytes as the version.
567 1.1 augustss */
568 1.1 augustss sc->sc_version = (reg1 << 8) + reg2;
569 1.1 augustss
570 1.1 augustss
571 1.1 augustss /*
572 1.1 augustss * 2. Verify we can change bit 2 in mixer register 0x64. This
573 1.1 augustss * should be possible on all supported chips.
574 1.1 augustss */
575 1.1 augustss reg1 = ess_read_mix_reg(sc, 0x64);
576 1.1 augustss reg2 = reg1 ^ 0x04; /* toggle bit 2 */
577 1.1 augustss
578 1.1 augustss ess_write_mix_reg(sc, 0x64, reg2);
579 1.1 augustss
580 1.1 augustss if (ess_read_mix_reg(sc, 0x64) != reg2) {
581 1.1 augustss printf("ess: Hardware error (unable to toggle bit 2 of mixer register 0x64)\n");
582 1.1 augustss return 1;
583 1.1 augustss }
584 1.1 augustss
585 1.1 augustss /*
586 1.1 augustss * Restore the original value of mixer register 0x64.
587 1.1 augustss */
588 1.1 augustss ess_write_mix_reg(sc, 0x64, reg1);
589 1.1 augustss
590 1.1 augustss
591 1.1 augustss /*
592 1.1 augustss * 3. Verify we can change the value of mixer register 0x70.
593 1.1 augustss * This should be possible on all supported chips.
594 1.1 augustss */
595 1.1 augustss reg1 = ess_read_mix_reg(sc, 0x70);
596 1.1 augustss reg2 = reg1 ^ 0xff; /* toggle all bits */
597 1.1 augustss
598 1.1 augustss ess_write_mix_reg(sc, 0x70, reg2);
599 1.1 augustss
600 1.1 augustss if (ess_read_mix_reg(sc, 0x70) != reg2) {
601 1.1 augustss printf("ess: Hardware error (unable to change mixer register 0x70)\n");
602 1.1 augustss return 1;
603 1.1 augustss }
604 1.1 augustss
605 1.1 augustss /*
606 1.1 augustss * It is not necessary to restore the value of mixer register 0x70.
607 1.1 augustss */
608 1.1 augustss
609 1.1 augustss
610 1.1 augustss /*
611 1.1 augustss * 4. Determine if we can change bit 5 in mixer register 0x64.
612 1.1 augustss * This determines whether we have an ES1887:
613 1.1 augustss *
614 1.1 augustss * - can change indicates ES1887
615 1.1 augustss * - can't change indicates ES1888 or ES888
616 1.1 augustss */
617 1.1 augustss reg1 = ess_read_mix_reg(sc, 0x64);
618 1.1 augustss reg2 = reg1 ^ 0x20; /* toggle bit 5 */
619 1.1 augustss
620 1.1 augustss ess_write_mix_reg(sc, 0x64, reg2);
621 1.1 augustss
622 1.1 augustss if (ess_read_mix_reg(sc, 0x64) == reg2) {
623 1.1 augustss sc->sc_model = ESS_1887;
624 1.1 augustss
625 1.1 augustss /*
626 1.1 augustss * Restore the original value of mixer register 0x64.
627 1.1 augustss */
628 1.1 augustss ess_write_mix_reg(sc, 0x64, reg1);
629 1.1 augustss } else {
630 1.1 augustss /*
631 1.1 augustss * 5. Determine if we can change the value of mixer
632 1.1 augustss * register 0x69 independently of mixer register
633 1.1 augustss * 0x68. This determines which chip we have:
634 1.1 augustss *
635 1.1 augustss * - can modify idependently indicates ES888
636 1.1 augustss * - register 0x69 is an alias of 0x68 indicates ES1888
637 1.1 augustss */
638 1.1 augustss reg1 = ess_read_mix_reg(sc, 0x68);
639 1.1 augustss reg2 = ess_read_mix_reg(sc, 0x69);
640 1.1 augustss reg3 = reg2 ^ 0xff; /* toggle all bits */
641 1.1 augustss
642 1.1 augustss /*
643 1.1 augustss * Write different values to each register.
644 1.1 augustss */
645 1.1 augustss ess_write_mix_reg(sc, 0x68, reg2);
646 1.1 augustss ess_write_mix_reg(sc, 0x69, reg3);
647 1.1 augustss
648 1.1 augustss if (ess_read_mix_reg(sc, 0x68) == reg2)
649 1.1 augustss sc->sc_model = ESS_888;
650 1.1 augustss else
651 1.1 augustss sc->sc_model = ESS_1888;
652 1.1 augustss
653 1.1 augustss /*
654 1.1 augustss * Restore the original value of the registers.
655 1.1 augustss */
656 1.1 augustss ess_write_mix_reg(sc, 0x68, reg1);
657 1.1 augustss ess_write_mix_reg(sc, 0x69, reg2);
658 1.1 augustss }
659 1.1 augustss
660 1.1 augustss return 0;
661 1.1 augustss }
662 1.1 augustss
663 1.1 augustss
664 1.1 augustss /*
665 1.1 augustss * Probe / attach routines.
666 1.1 augustss */
667 1.1 augustss
668 1.1 augustss int
669 1.2 augustss ess_setup_sc(sc, doinit)
670 1.1 augustss struct ess_softc *sc;
671 1.1 augustss int doinit;
672 1.1 augustss {
673 1.1 augustss /* Configure the ESS chip for the desired audio base address. */
674 1.1 augustss if (doinit && ess_config_addr(sc))
675 1.1 augustss return (1);
676 1.1 augustss
677 1.1 augustss /* Reset the chip. */
678 1.1 augustss if (ess_reset(sc) < 0) {
679 1.1 augustss DPRINTF(("ess_config_addr: couldn't reset chip\n"));
680 1.1 augustss return (1);
681 1.1 augustss }
682 1.1 augustss
683 1.1 augustss /* Identify the ESS chip, and check that it is supported. */
684 1.1 augustss if (ess_identify(sc)) {
685 1.1 augustss DPRINTF(("ess_setup_sc: couldn't identify\n"));
686 1.1 augustss return (1);
687 1.1 augustss }
688 1.1 augustss
689 1.1 augustss return (0);
690 1.1 augustss }
691 1.1 augustss
692 1.1 augustss /*
693 1.1 augustss * Probe for the ESS hardware.
694 1.1 augustss */
695 1.1 augustss int
696 1.2 augustss essmatch(sc)
697 1.2 augustss struct ess_softc *sc;
698 1.1 augustss {
699 1.2 augustss if (!ESS_BASE_VALID(sc->sc_iobase)) {
700 1.2 augustss printf("ess: configured iobase 0x%x invalid\n", sc->sc_iobase);
701 1.1 augustss return (0);
702 1.1 augustss }
703 1.1 augustss
704 1.2 augustss if (ess_setup_sc(sc, 1))
705 1.2 augustss return (0);
706 1.1 augustss
707 1.1 augustss if (sc->sc_model == ESS_UNSUPPORTED) {
708 1.1 augustss DPRINTF(("ess: Unsupported model\n"));
709 1.1 augustss goto ret0;
710 1.1 augustss }
711 1.1 augustss
712 1.1 augustss /* Check that requested DMA channels are valid and different. */
713 1.1 augustss if (!ESS_DRQ1_VALID(sc->sc_in.drq, sc->sc_model)) {
714 1.1 augustss printf("ess: record dma chan %d invalid\n", sc->sc_in.drq);
715 1.1 augustss goto ret0;
716 1.1 augustss }
717 1.1 augustss if (!ESS_DRQ2_VALID(sc->sc_out.drq, sc->sc_model)) {
718 1.1 augustss printf("ess: play dma chan %d invalid\n", sc->sc_out.drq);
719 1.1 augustss goto ret0;
720 1.1 augustss }
721 1.1 augustss if (sc->sc_in.drq == sc->sc_out.drq) {
722 1.1 augustss printf("ess: play and record dma chan both %d\n",
723 1.1 augustss sc->sc_in.drq);
724 1.1 augustss goto ret0;
725 1.1 augustss }
726 1.1 augustss
727 1.1 augustss /* Check that requested IRQ lines are valid and different. */
728 1.1 augustss if (!ESS_IRQ1_VALID(sc->sc_in.irq, sc->sc_model)) {
729 1.1 augustss printf("ess: record irq %d invalid\n", sc->sc_in.irq);
730 1.1 augustss goto ret0;
731 1.1 augustss }
732 1.1 augustss if (!ESS_IRQ2_VALID(sc->sc_out.irq, sc->sc_model)) {
733 1.1 augustss printf("ess: play irq %d invalid\n", sc->sc_out.irq);
734 1.1 augustss goto ret0;
735 1.1 augustss }
736 1.1 augustss if (sc->sc_in.irq == sc->sc_out.irq) {
737 1.1 augustss printf("ess: play and record irq both %d\n",
738 1.1 augustss sc->sc_in.irq);
739 1.1 augustss goto ret0;
740 1.1 augustss }
741 1.1 augustss
742 1.1 augustss /* Check that the DRQs are free. */
743 1.1 augustss if (!isa_drq_isfree(sc->sc_ic, sc->sc_in.drq) ||
744 1.1 augustss !isa_drq_isfree(sc->sc_ic, sc->sc_out.drq))
745 1.1 augustss goto ret0;
746 1.1 augustss /* XXX should we check IRQs as well? */
747 1.1 augustss
748 1.2 augustss return (1);
749 1.1 augustss
750 1.1 augustss ret0:
751 1.2 augustss return (0);
752 1.1 augustss }
753 1.1 augustss
754 1.1 augustss
755 1.1 augustss /*
756 1.1 augustss * Attach hardware to driver, attach hardware driver to audio
757 1.1 augustss * pseudo-device driver .
758 1.1 augustss */
759 1.1 augustss void
760 1.2 augustss essattach(sc)
761 1.2 augustss struct ess_softc *sc;
762 1.1 augustss {
763 1.1 augustss struct audio_params pparams, rparams;
764 1.1 augustss int i;
765 1.1 augustss u_int v;
766 1.1 augustss
767 1.2 augustss if (ess_setup_sc(sc, 0)) {
768 1.1 augustss printf("%s: setup failed\n", sc->sc_dev.dv_xname);
769 1.1 augustss return;
770 1.1 augustss }
771 1.1 augustss
772 1.1 augustss /*
773 1.1 augustss * Establish interrupt handlers for Audio 1 (record) and
774 1.1 augustss * Audio 2 (playback). (This must be done before configuring
775 1.1 augustss * the chip for interrupts, otherwise we might get a stray
776 1.1 augustss * interrupt.
777 1.1 augustss */
778 1.2 augustss sc->sc_out.ih = isa_intr_establish(sc->sc_ic, sc->sc_out.irq,
779 1.2 augustss sc->sc_out.ist, IPL_AUDIO,
780 1.1 augustss ess_intr_output, sc);
781 1.2 augustss sc->sc_in.ih = isa_intr_establish(sc->sc_ic, sc->sc_in.irq,
782 1.2 augustss sc->sc_in.ist, IPL_AUDIO,
783 1.1 augustss ess_intr_input, sc);
784 1.1 augustss
785 1.1 augustss /* Create our DMA maps. */
786 1.1 augustss if (isa_dmamap_create(sc->sc_ic, sc->sc_in.drq,
787 1.1 augustss MAX_ISADMA, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW)) {
788 1.1 augustss printf("%s: can't create map for drq %d\n",
789 1.1 augustss sc->sc_dev.dv_xname, sc->sc_in.drq);
790 1.1 augustss return;
791 1.1 augustss }
792 1.1 augustss if (isa_dmamap_create(sc->sc_ic, sc->sc_out.drq,
793 1.1 augustss MAX_ISADMA, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW)) {
794 1.1 augustss printf("%s: can't create map for drq %d\n",
795 1.1 augustss sc->sc_dev.dv_xname, sc->sc_out.drq);
796 1.1 augustss return;
797 1.1 augustss }
798 1.1 augustss
799 1.1 augustss printf(" ESS Technology ES%s [version 0x%04x]\n",
800 1.1 augustss essmodel[sc->sc_model], sc->sc_version);
801 1.1 augustss
802 1.1 augustss /*
803 1.1 augustss * Set record and play parameters to default values defined in
804 1.1 augustss * generic audio driver.
805 1.1 augustss */
806 1.1 augustss pparams = audio_default;
807 1.1 augustss rparams = audio_default;
808 1.1 augustss ess_set_params(sc, AUMODE_RECORD|AUMODE_PLAY, 0, &pparams, &rparams);
809 1.1 augustss
810 1.1 augustss /* Do a hardware reset on the mixer. */
811 1.1 augustss ess_write_mix_reg(sc, ESS_MIX_RESET, ESS_MIX_RESET);
812 1.1 augustss
813 1.1 augustss /*
814 1.1 augustss * Set volume of Audio 1 to zero and disable Audio 1 DAC input
815 1.1 augustss * to playback mixer, since playback is always through Audio 2.
816 1.1 augustss */
817 1.1 augustss ess_write_mix_reg(sc, 0x14, 0);
818 1.1 augustss ess_wdsp(sc, ESS_ACMD_DISABLE_SPKR);
819 1.1 augustss
820 1.1 augustss /*
821 1.1 augustss * Set hardware record source to use output of the record
822 1.1 augustss * mixer. We do the selection of record source in software by
823 1.1 augustss * setting the gain of the unused sources to zero. (See
824 1.1 augustss * ess_set_in_ports.)
825 1.1 augustss */
826 1.1 augustss ess_set_mreg_bits(sc, 0x1c, 0x07);
827 1.1 augustss ess_clear_mreg_bits(sc, 0x7a, 0x10);
828 1.1 augustss ess_set_mreg_bits(sc, 0x7a, 0x08);
829 1.1 augustss
830 1.1 augustss /*
831 1.1 augustss * Set gain on each mixer device to a sensible value.
832 1.1 augustss * Devices not normally used are turned off, and other devices
833 1.1 augustss * are set to 75% volume.
834 1.1 augustss */
835 1.1 augustss for (i = 0; i < ESS_NDEVS; i++) {
836 1.1 augustss switch(i) {
837 1.1 augustss case ESS_MIC_PLAY_VOL:
838 1.1 augustss case ESS_LINE_PLAY_VOL:
839 1.1 augustss case ESS_CD_PLAY_VOL:
840 1.1 augustss case ESS_AUXB_PLAY_VOL:
841 1.1 augustss case ESS_DAC_REC_VOL:
842 1.1 augustss case ESS_LINE_REC_VOL:
843 1.1 augustss case ESS_SYNTH_REC_VOL:
844 1.1 augustss case ESS_CD_REC_VOL:
845 1.1 augustss case ESS_AUXB_REC_VOL:
846 1.1 augustss v = 0;
847 1.1 augustss break;
848 1.1 augustss default:
849 1.1 augustss v = ESS_4BIT_GAIN(AUDIO_MAX_GAIN * 3 / 4);
850 1.1 augustss break;
851 1.1 augustss }
852 1.1 augustss sc->gain[i][ESS_LEFT] = sc->gain[i][ESS_RIGHT] = v;
853 1.1 augustss ess_set_gain(sc, i, 1);
854 1.1 augustss }
855 1.1 augustss
856 1.2 augustss /* Set up IRQs and DRQs. */
857 1.2 augustss ess_config_intr(sc);
858 1.2 augustss
859 1.1 augustss /* Disable the speaker until the device is opened. */
860 1.1 augustss ess_speaker_off(sc);
861 1.1 augustss sc->spkr_state = SPKR_OFF;
862 1.1 augustss
863 1.1 augustss sprintf(ess_device.name, "ES%s", essmodel[sc->sc_model]);
864 1.1 augustss sprintf(ess_device.version, "0x%04x", sc->sc_version);
865 1.1 augustss
866 1.1 augustss audio_attach_mi(&ess_hw_if, 0, sc, &sc->sc_dev);
867 1.2 augustss
868 1.2 augustss #ifdef AUDIO_DEBUG
869 1.2 augustss ess_printsc(sc);
870 1.2 augustss #endif
871 1.1 augustss }
872 1.1 augustss
873 1.1 augustss /*
874 1.1 augustss * Various routines to interface to higher level audio driver
875 1.1 augustss */
876 1.1 augustss
877 1.1 augustss int
878 1.1 augustss ess_open(addr, flags)
879 1.1 augustss void *addr;
880 1.1 augustss int flags;
881 1.1 augustss {
882 1.1 augustss struct ess_softc *sc = addr;
883 1.1 augustss
884 1.1 augustss DPRINTF(("ess_open: sc=%p\n", sc));
885 1.1 augustss
886 1.1 augustss if (sc->sc_open != 0 || ess_reset(sc) != 0)
887 1.1 augustss return ENXIO;
888 1.1 augustss
889 1.1 augustss ess_config_intr(sc);
890 1.1 augustss
891 1.1 augustss sc->sc_open = 1;
892 1.1 augustss
893 1.1 augustss DPRINTF(("ess_open: opened\n"));
894 1.1 augustss
895 1.1 augustss return (0);
896 1.1 augustss }
897 1.1 augustss
898 1.1 augustss void
899 1.1 augustss ess_close(addr)
900 1.1 augustss void *addr;
901 1.1 augustss {
902 1.1 augustss struct ess_softc *sc = addr;
903 1.1 augustss
904 1.1 augustss DPRINTF(("ess_close: sc=%p\n", sc));
905 1.1 augustss
906 1.1 augustss sc->sc_open = 0;
907 1.1 augustss ess_speaker_off(sc);
908 1.1 augustss sc->spkr_state = SPKR_OFF;
909 1.1 augustss sc->sc_in.intr = 0;
910 1.1 augustss sc->sc_out.intr = 0;
911 1.1 augustss ess_halt_output(sc);
912 1.1 augustss ess_halt_input(sc);
913 1.1 augustss
914 1.1 augustss DPRINTF(("ess_close: closed\n"));
915 1.1 augustss }
916 1.1 augustss
917 1.1 augustss int
918 1.1 augustss ess_getdev(addr, retp)
919 1.1 augustss void *addr;
920 1.1 augustss struct audio_device *retp;
921 1.1 augustss {
922 1.1 augustss *retp = ess_device;
923 1.1 augustss return (0);
924 1.1 augustss }
925 1.1 augustss
926 1.1 augustss int
927 1.1 augustss ess_query_encoding(addr, fp)
928 1.1 augustss void *addr;
929 1.1 augustss struct audio_encoding *fp;
930 1.1 augustss {
931 1.1 augustss /*struct ess_softc *sc = addr;*/
932 1.1 augustss
933 1.1 augustss switch (fp->index) {
934 1.1 augustss case 0:
935 1.1 augustss strcpy(fp->name, AudioEulinear);
936 1.1 augustss fp->encoding = AUDIO_ENCODING_ULINEAR;
937 1.1 augustss fp->precision = 8;
938 1.1 augustss fp->flags = 0;
939 1.1 augustss return (0);
940 1.1 augustss case 1:
941 1.1 augustss strcpy(fp->name, AudioEmulaw);
942 1.1 augustss fp->encoding = AUDIO_ENCODING_ULAW;
943 1.1 augustss fp->precision = 8;
944 1.1 augustss fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
945 1.1 augustss return (0);
946 1.1 augustss case 2:
947 1.1 augustss strcpy(fp->name, AudioEalaw);
948 1.1 augustss fp->encoding = AUDIO_ENCODING_ULAW;
949 1.1 augustss fp->precision = 8;
950 1.1 augustss fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
951 1.1 augustss return (0);
952 1.1 augustss case 3:
953 1.1 augustss strcpy(fp->name, AudioEulinear);
954 1.1 augustss fp->encoding = AUDIO_ENCODING_ULINEAR;
955 1.1 augustss fp->precision = 8;
956 1.1 augustss fp->flags = 0;
957 1.1 augustss return (0);
958 1.1 augustss case 4:
959 1.1 augustss strcpy(fp->name, AudioEslinear_le);
960 1.1 augustss fp->encoding = AUDIO_ENCODING_SLINEAR_LE;
961 1.1 augustss fp->precision = 16;
962 1.1 augustss fp->flags = 0;
963 1.1 augustss return (0);
964 1.1 augustss case 5:
965 1.1 augustss strcpy(fp->name, AudioEulinear_le);
966 1.1 augustss fp->encoding = AUDIO_ENCODING_ULINEAR_LE;
967 1.1 augustss fp->precision = 16;
968 1.1 augustss fp->flags = 0;
969 1.1 augustss return (0);
970 1.1 augustss case 6:
971 1.1 augustss strcpy(fp->name, AudioEslinear_be);
972 1.1 augustss fp->encoding = AUDIO_ENCODING_SLINEAR_BE;
973 1.1 augustss fp->precision = 16;
974 1.1 augustss fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
975 1.1 augustss return (0);
976 1.1 augustss case 7:
977 1.1 augustss strcpy(fp->name, AudioEulinear_be);
978 1.1 augustss fp->encoding = AUDIO_ENCODING_ULINEAR_BE;
979 1.1 augustss fp->precision = 16;
980 1.1 augustss fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
981 1.1 augustss return (0);
982 1.1 augustss default:
983 1.1 augustss return EINVAL;
984 1.1 augustss }
985 1.1 augustss return (0);
986 1.1 augustss }
987 1.1 augustss
988 1.1 augustss int
989 1.1 augustss ess_set_params(addr, setmode, usemode, p, q)
990 1.1 augustss void *addr;
991 1.1 augustss int setmode;
992 1.1 augustss int usemode;
993 1.1 augustss struct audio_params *p;
994 1.1 augustss struct audio_params *q;
995 1.1 augustss {
996 1.1 augustss struct ess_softc *sc = addr;
997 1.1 augustss void (*swcode) __P((void *, u_char *buf, int cnt));
998 1.1 augustss int mode = setmode; /* XXX */
999 1.1 augustss
1000 1.1 augustss /* Set first record info, then play info */
1001 1.1 augustss for(mode = AUMODE_RECORD; mode != -1;
1002 1.1 augustss mode = mode == AUMODE_RECORD ? AUMODE_PLAY : -1) {
1003 1.1 augustss if ((setmode & mode) == 0)
1004 1.1 augustss continue;
1005 1.1 augustss
1006 1.1 augustss switch (mode) {
1007 1.1 augustss case AUMODE_PLAY:
1008 1.1 augustss if (ess_set_out_sr(sc, p->sample_rate) != 0 ||
1009 1.1 augustss ess_set_out_precision(sc, p->precision) != 0 ||
1010 1.1 augustss ess_set_out_channels(sc, p->channels) != 0) {
1011 1.1 augustss return EINVAL;
1012 1.1 augustss }
1013 1.1 augustss break;
1014 1.1 augustss
1015 1.1 augustss case AUMODE_RECORD:
1016 1.1 augustss if (ess_set_in_sr(sc, p->sample_rate) != 0 ||
1017 1.1 augustss ess_set_in_precision(sc, p->precision) != 0 ||
1018 1.1 augustss ess_set_in_channels(sc, p->channels) != 0) {
1019 1.1 augustss return EINVAL;
1020 1.1 augustss }
1021 1.1 augustss break;
1022 1.1 augustss
1023 1.1 augustss default:
1024 1.1 augustss return EINVAL;
1025 1.1 augustss break;
1026 1.1 augustss }
1027 1.1 augustss
1028 1.1 augustss swcode = 0;
1029 1.1 augustss
1030 1.1 augustss switch (p->encoding) {
1031 1.1 augustss case AUDIO_ENCODING_SLINEAR_BE:
1032 1.1 augustss if (p->precision == 16)
1033 1.1 augustss swcode = swap_bytes;
1034 1.1 augustss /* fall into */
1035 1.1 augustss case AUDIO_ENCODING_SLINEAR_LE:
1036 1.1 augustss if (mode == AUMODE_PLAY)
1037 1.1 augustss ess_set_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL2,
1038 1.1 augustss ESS_AUDIO2_CTRL2_FIFO_SIGNED);
1039 1.1 augustss else
1040 1.1 augustss ess_set_xreg_bits(sc, ESS_XCMD_AUDIO1_CTRL1,
1041 1.1 augustss ESS_AUDIO1_CTRL1_FIFO_SIGNED);
1042 1.1 augustss break;
1043 1.1 augustss case AUDIO_ENCODING_ULINEAR_BE:
1044 1.1 augustss if (p->precision == 16)
1045 1.1 augustss swcode = swap_bytes;
1046 1.1 augustss /* fall into */
1047 1.1 augustss case AUDIO_ENCODING_ULINEAR_LE:
1048 1.1 augustss if (mode == AUMODE_PLAY)
1049 1.1 augustss ess_clear_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL2,
1050 1.1 augustss ESS_AUDIO2_CTRL2_FIFO_SIGNED);
1051 1.1 augustss else
1052 1.1 augustss ess_clear_xreg_bits(sc, ESS_XCMD_AUDIO1_CTRL1,
1053 1.1 augustss ESS_AUDIO1_CTRL1_FIFO_SIGNED);
1054 1.1 augustss break;
1055 1.1 augustss case AUDIO_ENCODING_ULAW:
1056 1.1 augustss swcode = mode == AUMODE_PLAY ?
1057 1.1 augustss mulaw_to_ulinear8 : ulinear8_to_mulaw;
1058 1.1 augustss if (mode == AUMODE_PLAY)
1059 1.1 augustss ess_clear_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL2,
1060 1.1 augustss ESS_AUDIO2_CTRL2_FIFO_SIGNED);
1061 1.1 augustss else
1062 1.1 augustss ess_clear_xreg_bits(sc, ESS_XCMD_AUDIO1_CTRL1,
1063 1.1 augustss ESS_AUDIO1_CTRL1_FIFO_SIGNED);
1064 1.1 augustss break;
1065 1.1 augustss case AUDIO_ENCODING_ALAW:
1066 1.1 augustss swcode = mode == AUMODE_PLAY ?
1067 1.1 augustss alaw_to_ulinear8 : ulinear8_to_alaw;
1068 1.1 augustss if (mode == AUMODE_PLAY)
1069 1.1 augustss ess_clear_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL2,
1070 1.1 augustss ESS_AUDIO2_CTRL2_FIFO_SIGNED);
1071 1.1 augustss else
1072 1.1 augustss ess_clear_xreg_bits(sc, ESS_XCMD_AUDIO1_CTRL1,
1073 1.1 augustss ESS_AUDIO1_CTRL1_FIFO_SIGNED);
1074 1.1 augustss break;
1075 1.1 augustss default:
1076 1.1 augustss return EINVAL;
1077 1.1 augustss }
1078 1.1 augustss p->sw_code = swcode;
1079 1.1 augustss }
1080 1.1 augustss
1081 1.1 augustss sc->sc_in.active = 0;
1082 1.1 augustss sc->sc_out.active = 0;
1083 1.1 augustss
1084 1.1 augustss return (0);
1085 1.1 augustss }
1086 1.1 augustss int
1087 1.1 augustss ess_set_in_sr(addr, sr)
1088 1.1 augustss void *addr;
1089 1.1 augustss u_long sr;
1090 1.1 augustss {
1091 1.1 augustss struct ess_softc *sc = addr;
1092 1.1 augustss
1093 1.1 augustss if (sr < ESS_MINRATE || sr > ESS_MAXRATE)
1094 1.1 augustss return (EINVAL);
1095 1.1 augustss /*
1096 1.1 augustss * Program the sample rate and filter clock for the record
1097 1.1 augustss * channel (Audio 1).
1098 1.1 augustss */
1099 1.1 augustss ess_write_x_reg(sc, ESS_XCMD_SAMPLE_RATE, ess_srtotc(sr));
1100 1.1 augustss ess_write_x_reg(sc, ESS_XCMD_FILTER_CLOCK, ess_srtofc(sr));
1101 1.1 augustss
1102 1.1 augustss return (0);
1103 1.1 augustss }
1104 1.1 augustss
1105 1.1 augustss int
1106 1.1 augustss ess_set_out_sr(addr, sr)
1107 1.1 augustss void *addr;
1108 1.1 augustss u_long sr;
1109 1.1 augustss {
1110 1.1 augustss struct ess_softc *sc = addr;
1111 1.1 augustss
1112 1.1 augustss if (sr < ESS_MINRATE || sr > ESS_MAXRATE)
1113 1.1 augustss return (EINVAL);
1114 1.1 augustss /*
1115 1.1 augustss * Program the sample rate and filter clock for the playback
1116 1.1 augustss * channel (Audio 2).
1117 1.1 augustss */
1118 1.1 augustss ess_write_mix_reg(sc, 0x70, ess_srtotc(sr));
1119 1.1 augustss ess_write_mix_reg(sc, 0x72, ess_srtofc(sr));
1120 1.1 augustss
1121 1.1 augustss return (0);
1122 1.1 augustss }
1123 1.1 augustss
1124 1.1 augustss int
1125 1.1 augustss ess_set_in_precision(addr, precision)
1126 1.1 augustss void *addr;
1127 1.1 augustss u_int precision;
1128 1.1 augustss {
1129 1.1 augustss struct ess_softc *sc = addr;
1130 1.1 augustss int error = 0;
1131 1.1 augustss
1132 1.1 augustss /*
1133 1.1 augustss * REVISIT: Should we set DMA transfer type to 2-byte or
1134 1.1 augustss * 4-byte demand? This would probably better be done
1135 1.1 augustss * when configuring the DMA channel. See xreg 0xB9.
1136 1.1 augustss */
1137 1.1 augustss switch (precision) {
1138 1.1 augustss case 8:
1139 1.1 augustss ess_clear_xreg_bits(sc, ESS_XCMD_AUDIO1_CTRL1,
1140 1.1 augustss ESS_AUDIO1_CTRL1_FIFO_SIZE);
1141 1.1 augustss break;
1142 1.1 augustss
1143 1.1 augustss case 16:
1144 1.1 augustss ess_set_xreg_bits(sc, ESS_XCMD_AUDIO1_CTRL1,
1145 1.1 augustss ESS_AUDIO1_CTRL1_FIFO_SIZE);
1146 1.1 augustss break;
1147 1.1 augustss
1148 1.1 augustss default:
1149 1.1 augustss error = EINVAL;
1150 1.1 augustss break;
1151 1.1 augustss }
1152 1.1 augustss return error;
1153 1.1 augustss }
1154 1.1 augustss
1155 1.1 augustss int
1156 1.1 augustss ess_set_out_precision(addr, precision)
1157 1.1 augustss void *addr;
1158 1.1 augustss u_int precision;
1159 1.1 augustss {
1160 1.1 augustss struct ess_softc *sc = addr;
1161 1.1 augustss int error = 0;
1162 1.1 augustss switch (precision) {
1163 1.1 augustss case 8:
1164 1.1 augustss ess_clear_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL2,
1165 1.1 augustss ESS_AUDIO2_CTRL2_FIFO_SIZE);
1166 1.1 augustss break;
1167 1.1 augustss
1168 1.1 augustss case 16:
1169 1.1 augustss ess_set_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL2,
1170 1.1 augustss ESS_AUDIO2_CTRL2_FIFO_SIZE);
1171 1.1 augustss break;
1172 1.1 augustss
1173 1.1 augustss default:
1174 1.1 augustss error = EINVAL;
1175 1.1 augustss break;
1176 1.1 augustss }
1177 1.1 augustss
1178 1.1 augustss /*
1179 1.1 augustss * REVISIT: This actually sets transfer size to 16
1180 1.1 augustss * bits. Should this really be hard-coded? This would
1181 1.1 augustss * probably better be done when configuring the DMA
1182 1.1 augustss * channel.
1183 1.1 augustss */
1184 1.1 augustss ess_set_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL1,
1185 1.1 augustss ESS_AUDIO2_CTRL1_XFER_SIZE);
1186 1.1 augustss
1187 1.1 augustss #if 0
1188 1.1 augustss /*
1189 1.1 augustss * REVISIT: Should we set DMA transfer type to 2-byte,
1190 1.1 augustss * 4-byte, or 8-byte demand? (Following does 8-byte.)
1191 1.1 augustss * This would probably better be done when
1192 1.1 augustss * configuring the DMA channel.
1193 1.1 augustss */
1194 1.1 augustss ess_set_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL1,
1195 1.1 augustss 0xc0);
1196 1.1 augustss #endif
1197 1.1 augustss return error;
1198 1.1 augustss }
1199 1.1 augustss
1200 1.1 augustss int
1201 1.1 augustss ess_set_in_channels(addr, channels)
1202 1.1 augustss void *addr;
1203 1.1 augustss int channels;
1204 1.1 augustss {
1205 1.1 augustss struct ess_softc *sc = addr;
1206 1.1 augustss int error = 0;
1207 1.1 augustss
1208 1.1 augustss switch(channels) {
1209 1.1 augustss case 1:
1210 1.1 augustss ess_set_xreg_bits(sc, ESS_XCMD_AUDIO_CTRL,
1211 1.1 augustss ESS_AUDIO_CTRL_MONO);
1212 1.1 augustss ess_clear_xreg_bits(sc, ESS_XCMD_AUDIO_CTRL,
1213 1.1 augustss ESS_AUDIO_CTRL_STEREO);
1214 1.1 augustss break;
1215 1.1 augustss
1216 1.1 augustss case 2:
1217 1.1 augustss ess_set_xreg_bits(sc, ESS_XCMD_AUDIO_CTRL,
1218 1.1 augustss ESS_AUDIO_CTRL_STEREO);
1219 1.1 augustss ess_clear_xreg_bits(sc, ESS_XCMD_AUDIO_CTRL,
1220 1.1 augustss ESS_AUDIO_CTRL_MONO);
1221 1.1 augustss break;
1222 1.1 augustss
1223 1.1 augustss default:
1224 1.1 augustss error = EINVAL;
1225 1.1 augustss break;
1226 1.1 augustss }
1227 1.1 augustss
1228 1.1 augustss sc->sc_in.active = 0;
1229 1.1 augustss sc->sc_in.channels = channels;
1230 1.1 augustss
1231 1.1 augustss return error;
1232 1.1 augustss }
1233 1.1 augustss
1234 1.1 augustss int
1235 1.1 augustss ess_set_out_channels(addr, channels)
1236 1.1 augustss void *addr;
1237 1.1 augustss int channels;
1238 1.1 augustss {
1239 1.1 augustss struct ess_softc *sc = addr;
1240 1.1 augustss int error = 0;
1241 1.1 augustss
1242 1.1 augustss switch(channels) {
1243 1.1 augustss case 1:
1244 1.1 augustss ess_clear_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL2,
1245 1.1 augustss ESS_AUDIO2_CTRL2_CHANNELS);
1246 1.1 augustss break;
1247 1.1 augustss
1248 1.1 augustss case 2:
1249 1.1 augustss ess_set_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL2,
1250 1.1 augustss ESS_AUDIO2_CTRL2_CHANNELS);
1251 1.1 augustss break;
1252 1.1 augustss
1253 1.1 augustss default:
1254 1.1 augustss error = EINVAL;
1255 1.1 augustss break;
1256 1.1 augustss }
1257 1.1 augustss
1258 1.1 augustss sc->sc_out.active = 0;
1259 1.1 augustss sc->sc_out.channels = channels;
1260 1.1 augustss
1261 1.1 augustss return error;
1262 1.1 augustss }
1263 1.1 augustss
1264 1.1 augustss int
1265 1.1 augustss ess_dma_output(addr, p, cc, intr, arg)
1266 1.1 augustss void *addr;
1267 1.1 augustss void *p;
1268 1.1 augustss int cc;
1269 1.1 augustss void (*intr) __P((void *));
1270 1.1 augustss void *arg;
1271 1.1 augustss {
1272 1.1 augustss struct ess_softc *sc = addr;
1273 1.1 augustss
1274 1.2 augustss DPRINTFN(1,("ess_dma_output: cc=%d %p (%p)\n", cc, intr, arg));
1275 1.1 augustss #ifdef DIAGNOSTIC
1276 1.1 augustss if (sc->sc_out.channels == 2 && (cc & 1)) {
1277 1.1 augustss DPRINTF(("stereo playback odd bytes (%d)\n", cc));
1278 1.1 augustss return EIO;
1279 1.1 augustss }
1280 1.1 augustss #endif
1281 1.1 augustss
1282 1.1 augustss isa_dmastart(sc->sc_ic, sc->sc_out.drq, p, cc,
1283 1.1 augustss NULL, DMAMODE_WRITE, BUS_DMA_NOWAIT);
1284 1.2 augustss
1285 1.1 augustss sc->sc_out.active = 1;
1286 1.1 augustss sc->sc_out.intr = intr;
1287 1.1 augustss sc->sc_out.arg = arg;
1288 1.1 augustss sc->sc_out.dmaflags = DMAMODE_WRITE;
1289 1.1 augustss sc->sc_out.dmaaddr = p;
1290 1.1 augustss
1291 1.1 augustss if (sc->sc_out.dmacnt != cc) {
1292 1.1 augustss sc->sc_out.dmacnt = cc;
1293 1.1 augustss
1294 1.1 augustss /*
1295 1.1 augustss * If doing 16-bit DMA transfers, then the number of
1296 1.1 augustss * transfers required is half the number of bytes to
1297 1.1 augustss * be transferred.
1298 1.1 augustss */
1299 1.1 augustss if (sc->sc_out.mode == ESS_MODE_16BIT)
1300 1.1 augustss cc >>= 1;
1301 1.1 augustss
1302 1.1 augustss /*
1303 1.1 augustss * Program transfer count registers with 2's
1304 1.1 augustss * complement of count.
1305 1.1 augustss */
1306 1.1 augustss cc = -cc;
1307 1.1 augustss ess_write_mix_reg(sc, ESS_MREG_XFER_COUNTLO, cc);
1308 1.1 augustss ess_write_mix_reg(sc, ESS_MREG_XFER_COUNTHI, cc >> 8);
1309 1.1 augustss }
1310 1.1 augustss
1311 1.1 augustss /* REVISIT: is it really necessary to clear then set these bits to get
1312 1.1 augustss the next lot of DMA to happen? Would it be sufficient to set the bits
1313 1.1 augustss the first time round and leave it at that? (No, because the chip automatically clears the FIFO_ENABLE bit after the DMA is complete.)
1314 1.1 augustss */
1315 1.1 augustss ess_set_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL1,
1316 1.1 augustss ESS_AUDIO2_CTRL1_DAC_ENABLE);/* REVISIT: once only */
1317 1.1 augustss ess_set_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL1,
1318 1.1 augustss ESS_AUDIO2_CTRL1_FIFO_ENABLE);
1319 1.1 augustss #if 1
1320 1.1 augustss /* REVISIT: seems like the 888 and 1888 have an interlock that
1321 1.1 augustss * prevents audio2 channel from working if audio1 channel is not
1322 1.1 augustss * connected to the FIFO.
1323 1.1 augustss */
1324 1.1 augustss ess_set_xreg_bits(sc, 0xB7, 0x80);
1325 1.1 augustss #endif
1326 1.1 augustss return (0);
1327 1.1 augustss
1328 1.1 augustss }
1329 1.1 augustss
1330 1.1 augustss int
1331 1.1 augustss ess_dma_input(addr, p, cc, intr, arg)
1332 1.1 augustss void *addr;
1333 1.1 augustss void *p;
1334 1.1 augustss int cc;
1335 1.1 augustss void (*intr) __P((void *));
1336 1.1 augustss void *arg;
1337 1.1 augustss {
1338 1.1 augustss struct ess_softc *sc = addr;
1339 1.1 augustss
1340 1.2 augustss DPRINTFN(1,("ess_dma_input: cc=%d %p (%p)\n", cc, intr, arg));
1341 1.1 augustss /* REVISIT: Hack to enable Audio1 FIFO connection to CODEC. */
1342 1.1 augustss ess_set_xreg_bits(sc, 0xB7, 0x80);
1343 1.1 augustss
1344 1.1 augustss #ifdef DIAGNOSTIC
1345 1.1 augustss if (sc->sc_in.channels == 2 && (cc & 1)) {
1346 1.1 augustss DPRINTF(("stereo record odd bytes (%d)\n", cc));
1347 1.1 augustss return EIO;
1348 1.1 augustss }
1349 1.1 augustss #endif
1350 1.1 augustss
1351 1.1 augustss isa_dmastart(sc->sc_ic, sc->sc_in.drq, p,
1352 1.1 augustss cc, NULL, DMAMODE_READ, BUS_DMA_NOWAIT);
1353 1.1 augustss sc->sc_in.active = 1;
1354 1.1 augustss sc->sc_in.intr = intr;
1355 1.1 augustss sc->sc_in.arg = arg;
1356 1.1 augustss sc->sc_in.dmaflags = DMAMODE_READ;
1357 1.1 augustss sc->sc_in.dmaaddr = p;
1358 1.1 augustss
1359 1.1 augustss if (sc->sc_in.dmacnt != cc)
1360 1.1 augustss {
1361 1.1 augustss sc->sc_in.dmacnt = cc;
1362 1.1 augustss
1363 1.1 augustss /*
1364 1.1 augustss * If doing 16-bit DMA transfers, then the number of
1365 1.1 augustss * transfers required is half the number of bytes to
1366 1.1 augustss * be transferred.
1367 1.1 augustss */
1368 1.1 augustss if (sc->sc_in.mode == ESS_MODE_16BIT)
1369 1.1 augustss {
1370 1.1 augustss cc >>= 1;
1371 1.1 augustss }
1372 1.1 augustss
1373 1.1 augustss /*
1374 1.1 augustss * Program transfer count registers with 2's
1375 1.1 augustss * complement of count.
1376 1.1 augustss */
1377 1.1 augustss cc = -cc;
1378 1.1 augustss ess_write_x_reg(sc, ESS_XCMD_XFER_COUNTLO, cc);
1379 1.1 augustss ess_write_x_reg(sc, ESS_XCMD_XFER_COUNTHI, cc >> 8);
1380 1.1 augustss }
1381 1.1 augustss
1382 1.1 augustss /* REVISIT: is it really necessary to clear then set these bits to get
1383 1.1 augustss the next lot of DMA to happen? Would it be sufficient to set the bits
1384 1.1 augustss the first time round and leave it at that? (No, because the chip automatically clears the FIFO_ENABLE bit after the DMA is complete.)
1385 1.1 augustss */
1386 1.1 augustss ess_set_xreg_bits(sc, ESS_XCMD_AUDIO1_CTRL2,
1387 1.1 augustss ESS_AUDIO1_CTRL2_DMA_READ | /* REVISIT: once only */
1388 1.1 augustss ESS_AUDIO1_CTRL2_ADC_ENABLE |/* REVISIT: once only */
1389 1.1 augustss ESS_AUDIO1_CTRL2_FIFO_ENABLE);
1390 1.1 augustss
1391 1.1 augustss return (0);
1392 1.1 augustss
1393 1.1 augustss }
1394 1.1 augustss
1395 1.1 augustss int
1396 1.1 augustss ess_halt_output(addr)
1397 1.1 augustss void *addr;
1398 1.1 augustss {
1399 1.1 augustss struct ess_softc *sc = addr;
1400 1.1 augustss
1401 1.1 augustss DPRINTF(("ess_halt_output: sc=%p\n", sc));
1402 1.1 augustss
1403 1.1 augustss ess_clear_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL2,
1404 1.1 augustss ESS_AUDIO2_CTRL2_DMA_ENABLE);
1405 1.1 augustss return (0);
1406 1.1 augustss }
1407 1.1 augustss
1408 1.1 augustss int
1409 1.1 augustss ess_halt_input(addr)
1410 1.1 augustss void *addr;
1411 1.1 augustss {
1412 1.1 augustss struct ess_softc *sc = addr;
1413 1.1 augustss
1414 1.1 augustss DPRINTF(("ess_halt_input: sc=%p\n", sc));
1415 1.1 augustss
1416 1.1 augustss ess_clear_xreg_bits(sc, ESS_XCMD_AUDIO1_CTRL2,
1417 1.1 augustss ESS_AUDIO1_CTRL2_FIFO_ENABLE);
1418 1.1 augustss return (0);
1419 1.1 augustss }
1420 1.1 augustss
1421 1.1 augustss int
1422 1.1 augustss ess_speaker_ctl(addr, newstate)
1423 1.1 augustss void *addr;
1424 1.1 augustss int newstate;
1425 1.1 augustss {
1426 1.1 augustss struct ess_softc *sc = addr;
1427 1.1 augustss
1428 1.1 augustss if ((newstate == SPKR_ON) && (sc->spkr_state == SPKR_OFF)) {
1429 1.1 augustss ess_speaker_on(sc);
1430 1.1 augustss sc->spkr_state = SPKR_ON;
1431 1.1 augustss }
1432 1.1 augustss if ((newstate == SPKR_OFF) && (sc->spkr_state == SPKR_ON)) {
1433 1.1 augustss ess_speaker_off(sc);
1434 1.1 augustss sc->spkr_state = SPKR_OFF;
1435 1.1 augustss }
1436 1.1 augustss return (0);
1437 1.1 augustss }
1438 1.1 augustss
1439 1.1 augustss int
1440 1.1 augustss ess_intr_output(arg)
1441 1.1 augustss void *arg;
1442 1.1 augustss {
1443 1.1 augustss struct ess_softc *sc = arg;
1444 1.1 augustss
1445 1.2 augustss DPRINTFN(1,("ess_intr_output: intr=%p\n", sc->sc_out.intr));
1446 1.1 augustss
1447 1.1 augustss /* clear interrupt on Audio channel 2*/
1448 1.1 augustss ess_clear_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL2, 0x80);
1449 1.1 augustss
1450 1.1 augustss sc->sc_out.nintr++;
1451 1.1 augustss
1452 1.1 augustss if (sc->sc_out.intr != 0) {
1453 1.1 augustss isa_dmadone(sc->sc_ic, sc->sc_out.drq);
1454 1.1 augustss (*sc->sc_out.intr)(sc->sc_out.arg);
1455 1.1 augustss } else
1456 1.1 augustss return 1; /* revisit: was 0 */
1457 1.1 augustss
1458 1.1 augustss return 1;
1459 1.1 augustss }
1460 1.1 augustss
1461 1.1 augustss int
1462 1.1 augustss ess_intr_input(arg)
1463 1.1 augustss void *arg;
1464 1.1 augustss {
1465 1.1 augustss struct ess_softc *sc = arg;
1466 1.1 augustss u_char x;
1467 1.1 augustss
1468 1.2 augustss DPRINTFN(1,("ess_intr_input: intr=%p\n", sc->sc_in.intr));
1469 1.1 augustss
1470 1.1 augustss /*
1471 1.1 augustss * Disable DMA for Audio 1; it will be enabled again the next
1472 1.1 augustss * time ess_dma_input is called. Note that for single DMAs,
1473 1.1 augustss * this bit must be toggled for each DMA. For auto-initialize
1474 1.1 augustss * DMAs, this bit should be left high.
1475 1.1 augustss */
1476 1.1 augustss ess_clear_xreg_bits(sc, ESS_XCMD_AUDIO1_CTRL2,
1477 1.1 augustss ESS_AUDIO1_CTRL2_FIFO_ENABLE);
1478 1.1 augustss
1479 1.1 augustss /* clear interrupt on Audio channel 1*/
1480 1.2 augustss x = EREAD1(sc->sc_iot, sc->sc_ioh, ESS_CLEAR_INTR);
1481 1.1 augustss
1482 1.1 augustss sc->sc_in.nintr++;
1483 1.1 augustss
1484 1.1 augustss if (sc->sc_in.intr != 0) {
1485 1.1 augustss isa_dmadone(sc->sc_ic, sc->sc_in.drq);
1486 1.1 augustss (*sc->sc_in.intr)(sc->sc_in.arg);
1487 1.1 augustss } else
1488 1.1 augustss return (1);
1489 1.1 augustss
1490 1.1 augustss return (1);
1491 1.1 augustss }
1492 1.1 augustss
1493 1.1 augustss int
1494 1.1 augustss ess_round_blocksize(addr, blk)
1495 1.1 augustss void *addr;
1496 1.1 augustss int blk;
1497 1.1 augustss {
1498 1.1 augustss return (blk & -4);
1499 1.1 augustss }
1500 1.1 augustss
1501 1.1 augustss int
1502 1.1 augustss ess_set_port(addr, cp)
1503 1.1 augustss void *addr;
1504 1.1 augustss mixer_ctrl_t *cp;
1505 1.1 augustss {
1506 1.1 augustss struct ess_softc *sc = addr;
1507 1.1 augustss int lgain, rgain;
1508 1.1 augustss
1509 1.1 augustss DPRINTF(("ess_set_port: port=%d num_channels=%d\n",
1510 1.1 augustss cp->dev, cp->un.value.num_channels));
1511 1.1 augustss
1512 1.1 augustss switch (cp->dev) {
1513 1.1 augustss /*
1514 1.1 augustss * The following mixer ports are all stereo. If we get a
1515 1.1 augustss * single-channel gain value passed in, then we duplicate it
1516 1.1 augustss * to both left and right channels.
1517 1.1 augustss */
1518 1.1 augustss case ESS_MASTER_VOL:
1519 1.1 augustss case ESS_DAC_PLAY_VOL:
1520 1.1 augustss case ESS_MIC_PLAY_VOL:
1521 1.1 augustss case ESS_LINE_PLAY_VOL:
1522 1.1 augustss case ESS_SYNTH_PLAY_VOL:
1523 1.1 augustss case ESS_CD_PLAY_VOL:
1524 1.1 augustss case ESS_AUXB_PLAY_VOL:
1525 1.1 augustss case ESS_DAC_REC_VOL:
1526 1.1 augustss case ESS_MIC_REC_VOL:
1527 1.1 augustss case ESS_LINE_REC_VOL:
1528 1.1 augustss case ESS_SYNTH_REC_VOL:
1529 1.1 augustss case ESS_CD_REC_VOL:
1530 1.1 augustss case ESS_AUXB_REC_VOL:
1531 1.1 augustss case ESS_RECORD_VOL:
1532 1.1 augustss if (cp->type != AUDIO_MIXER_VALUE)
1533 1.1 augustss return EINVAL;
1534 1.1 augustss
1535 1.1 augustss switch (cp->un.value.num_channels) {
1536 1.1 augustss case 1:
1537 1.1 augustss lgain = rgain = ESS_4BIT_GAIN(
1538 1.1 augustss cp->un.value.level[AUDIO_MIXER_LEVEL_MONO]);
1539 1.1 augustss break;
1540 1.1 augustss case 2:
1541 1.1 augustss lgain = ESS_4BIT_GAIN(
1542 1.1 augustss cp->un.value.level[AUDIO_MIXER_LEVEL_LEFT]);
1543 1.1 augustss rgain = ESS_4BIT_GAIN(
1544 1.1 augustss cp->un.value.level[AUDIO_MIXER_LEVEL_RIGHT]);
1545 1.1 augustss break;
1546 1.1 augustss default:
1547 1.1 augustss return EINVAL;
1548 1.1 augustss }
1549 1.1 augustss
1550 1.1 augustss sc->gain[cp->dev][ESS_LEFT] = lgain;
1551 1.1 augustss sc->gain[cp->dev][ESS_RIGHT] = rgain;
1552 1.1 augustss
1553 1.1 augustss ess_set_gain(sc, cp->dev, 1);
1554 1.1 augustss break;
1555 1.1 augustss
1556 1.1 augustss
1557 1.1 augustss /*
1558 1.1 augustss * The PC speaker port is mono. If we get a stereo gain value
1559 1.1 augustss * passed in, then we return EINVAL.
1560 1.1 augustss */
1561 1.1 augustss case ESS_PCSPEAKER_VOL:
1562 1.1 augustss if (cp->un.value.num_channels != 1)
1563 1.1 augustss return EINVAL;
1564 1.1 augustss
1565 1.1 augustss sc->gain[cp->dev][ESS_LEFT] = sc->gain[cp->dev][ESS_RIGHT] =
1566 1.1 augustss ESS_3BIT_GAIN(cp->un.value.level[AUDIO_MIXER_LEVEL_MONO]);
1567 1.1 augustss ess_set_gain(sc, cp->dev, 1);
1568 1.1 augustss break;
1569 1.1 augustss
1570 1.1 augustss
1571 1.1 augustss case ESS_MIC_PREAMP:
1572 1.1 augustss if (cp->type != AUDIO_MIXER_ENUM)
1573 1.1 augustss return EINVAL;
1574 1.1 augustss
1575 1.1 augustss if (cp->un.ord)
1576 1.1 augustss /* Enable microphone preamp */
1577 1.1 augustss ess_set_xreg_bits(sc, ESS_XCMD_PREAMP_CTRL,
1578 1.1 augustss ESS_PREAMP_CTRL_ENABLE);
1579 1.1 augustss else
1580 1.1 augustss /* Disable microphone preamp */
1581 1.1 augustss ess_clear_xreg_bits(sc, ESS_XCMD_PREAMP_CTRL,
1582 1.1 augustss ESS_PREAMP_CTRL_ENABLE);
1583 1.1 augustss break;
1584 1.1 augustss
1585 1.1 augustss case ESS_RECORD_SOURCE:
1586 1.1 augustss if (cp->type == AUDIO_MIXER_SET)
1587 1.1 augustss return ess_set_in_ports(sc, cp->un.mask);
1588 1.1 augustss else
1589 1.1 augustss return EINVAL;
1590 1.1 augustss break;
1591 1.1 augustss
1592 1.1 augustss case ESS_RECORD_MONITOR:
1593 1.1 augustss if (cp->type != AUDIO_MIXER_ENUM)
1594 1.1 augustss return EINVAL;
1595 1.1 augustss
1596 1.1 augustss if (cp->un.ord)
1597 1.1 augustss /* Enable monitor */
1598 1.1 augustss ess_set_xreg_bits(sc, ESS_XCMD_AUDIO_CTRL,
1599 1.1 augustss ESS_AUDIO_CTRL_MONITOR);
1600 1.1 augustss else
1601 1.1 augustss /* Disable monitor */
1602 1.1 augustss ess_clear_xreg_bits(sc, ESS_XCMD_AUDIO_CTRL,
1603 1.1 augustss ESS_AUDIO_CTRL_MONITOR);
1604 1.1 augustss break;
1605 1.1 augustss
1606 1.1 augustss default:
1607 1.1 augustss return EINVAL;
1608 1.1 augustss }
1609 1.1 augustss
1610 1.1 augustss return (0);
1611 1.1 augustss }
1612 1.1 augustss
1613 1.1 augustss int
1614 1.1 augustss ess_get_port(addr, cp)
1615 1.1 augustss void *addr;
1616 1.1 augustss mixer_ctrl_t *cp;
1617 1.1 augustss {
1618 1.1 augustss struct ess_softc *sc = addr;
1619 1.1 augustss
1620 1.1 augustss DPRINTF(("ess_get_port: port=%d\n", cp->dev));
1621 1.1 augustss
1622 1.1 augustss switch (cp->dev) {
1623 1.1 augustss case ESS_DAC_PLAY_VOL:
1624 1.1 augustss case ESS_MIC_PLAY_VOL:
1625 1.1 augustss case ESS_LINE_PLAY_VOL:
1626 1.1 augustss case ESS_SYNTH_PLAY_VOL:
1627 1.1 augustss case ESS_CD_PLAY_VOL:
1628 1.1 augustss case ESS_AUXB_PLAY_VOL:
1629 1.1 augustss case ESS_MASTER_VOL:
1630 1.1 augustss case ESS_PCSPEAKER_VOL:
1631 1.1 augustss case ESS_DAC_REC_VOL:
1632 1.1 augustss case ESS_MIC_REC_VOL:
1633 1.1 augustss case ESS_LINE_REC_VOL:
1634 1.1 augustss case ESS_SYNTH_REC_VOL:
1635 1.1 augustss case ESS_CD_REC_VOL:
1636 1.1 augustss case ESS_AUXB_REC_VOL:
1637 1.1 augustss case ESS_RECORD_VOL:
1638 1.1 augustss if (cp->dev == ESS_PCSPEAKER_VOL &&
1639 1.1 augustss cp->un.value.num_channels != 1)
1640 1.1 augustss return EINVAL;
1641 1.1 augustss
1642 1.1 augustss switch (cp->un.value.num_channels) {
1643 1.1 augustss case 1:
1644 1.1 augustss cp->un.value.level[AUDIO_MIXER_LEVEL_MONO] =
1645 1.1 augustss sc->gain[cp->dev][ESS_LEFT];
1646 1.1 augustss break;
1647 1.1 augustss case 2:
1648 1.1 augustss cp->un.value.level[AUDIO_MIXER_LEVEL_LEFT] =
1649 1.1 augustss sc->gain[cp->dev][ESS_LEFT];
1650 1.1 augustss cp->un.value.level[AUDIO_MIXER_LEVEL_RIGHT] =
1651 1.1 augustss sc->gain[cp->dev][ESS_RIGHT];
1652 1.1 augustss break;
1653 1.1 augustss default:
1654 1.1 augustss return EINVAL;
1655 1.1 augustss }
1656 1.1 augustss break;
1657 1.1 augustss
1658 1.1 augustss case ESS_MIC_PREAMP:
1659 1.1 augustss cp->un.ord = (ess_read_x_reg(sc, ESS_XCMD_PREAMP_CTRL) &
1660 1.1 augustss ESS_PREAMP_CTRL_ENABLE) ? 1 : 0;
1661 1.1 augustss break;
1662 1.1 augustss
1663 1.1 augustss case ESS_RECORD_SOURCE:
1664 1.1 augustss cp->un.mask = sc->in_mask;
1665 1.1 augustss break;
1666 1.1 augustss
1667 1.1 augustss case ESS_RECORD_MONITOR:
1668 1.1 augustss cp->un.ord = (ess_read_x_reg(sc, ESS_XCMD_AUDIO_CTRL) &
1669 1.1 augustss ESS_AUDIO_CTRL_MONITOR) ? 1 : 0;
1670 1.1 augustss break;
1671 1.1 augustss
1672 1.1 augustss default:
1673 1.1 augustss return EINVAL;
1674 1.1 augustss }
1675 1.1 augustss
1676 1.1 augustss return (0);
1677 1.1 augustss }
1678 1.1 augustss
1679 1.1 augustss int
1680 1.1 augustss ess_query_devinfo(addr, dip)
1681 1.1 augustss void *addr;
1682 1.1 augustss mixer_devinfo_t *dip;
1683 1.1 augustss {
1684 1.1 augustss struct ess_softc *sc = addr;
1685 1.1 augustss
1686 1.1 augustss DPRINTF(("ess_query_devinfo: model=%d index=%d\n",
1687 1.1 augustss sc->sc_model, dip->index));
1688 1.1 augustss
1689 1.1 augustss /*
1690 1.1 augustss * REVISIT: There are some slight differences between the
1691 1.1 augustss * mixers on the different ESS chips, which can
1692 1.1 augustss * be sorted out using the chip model rather than a
1693 1.1 augustss * separate mixer model.
1694 1.1 augustss * This is currently coded assuming an ES1887; we
1695 1.1 augustss * need to work out which bits are not applicable to
1696 1.1 augustss * the other models (1888 and 888).
1697 1.1 augustss */
1698 1.1 augustss switch (dip->index) {
1699 1.1 augustss case ESS_DAC_PLAY_VOL:
1700 1.1 augustss dip->type = AUDIO_MIXER_VALUE;
1701 1.1 augustss dip->mixer_class = ESS_INPUT_CLASS;
1702 1.1 augustss dip->prev = AUDIO_MIXER_LAST;
1703 1.1 augustss dip->next = AUDIO_MIXER_LAST;
1704 1.1 augustss strcpy(dip->label.name, AudioNdac);
1705 1.1 augustss dip->un.v.num_channels = 2;
1706 1.1 augustss strcpy(dip->un.v.units.name, AudioNvolume);
1707 1.1 augustss return (0);
1708 1.1 augustss
1709 1.1 augustss case ESS_MIC_PLAY_VOL:
1710 1.1 augustss dip->type = AUDIO_MIXER_VALUE;
1711 1.1 augustss dip->mixer_class = ESS_INPUT_CLASS;
1712 1.1 augustss dip->prev = AUDIO_MIXER_LAST;
1713 1.1 augustss dip->next = AUDIO_MIXER_LAST;
1714 1.1 augustss strcpy(dip->label.name, AudioNmicrophone);
1715 1.1 augustss dip->un.v.num_channels = 2;
1716 1.1 augustss strcpy(dip->un.v.units.name, AudioNvolume);
1717 1.1 augustss return (0);
1718 1.1 augustss
1719 1.1 augustss case ESS_LINE_PLAY_VOL:
1720 1.1 augustss dip->type = AUDIO_MIXER_VALUE;
1721 1.1 augustss dip->mixer_class = ESS_INPUT_CLASS;
1722 1.1 augustss dip->prev = AUDIO_MIXER_LAST;
1723 1.1 augustss dip->next = AUDIO_MIXER_LAST;
1724 1.1 augustss strcpy(dip->label.name, AudioNline);
1725 1.1 augustss dip->un.v.num_channels = 2;
1726 1.1 augustss strcpy(dip->un.v.units.name, AudioNvolume);
1727 1.1 augustss return (0);
1728 1.1 augustss
1729 1.1 augustss case ESS_SYNTH_PLAY_VOL:
1730 1.1 augustss dip->type = AUDIO_MIXER_VALUE;
1731 1.1 augustss dip->mixer_class = ESS_INPUT_CLASS;
1732 1.1 augustss dip->prev = AUDIO_MIXER_LAST;
1733 1.1 augustss dip->next = AUDIO_MIXER_LAST;
1734 1.1 augustss strcpy(dip->label.name, AudioNfmsynth);
1735 1.1 augustss dip->un.v.num_channels = 2;
1736 1.1 augustss strcpy(dip->un.v.units.name, AudioNvolume);
1737 1.1 augustss return (0);
1738 1.1 augustss
1739 1.1 augustss case ESS_CD_PLAY_VOL:
1740 1.1 augustss dip->type = AUDIO_MIXER_VALUE;
1741 1.1 augustss dip->mixer_class = ESS_INPUT_CLASS;
1742 1.1 augustss dip->prev = AUDIO_MIXER_LAST;
1743 1.1 augustss dip->next = AUDIO_MIXER_LAST;
1744 1.1 augustss strcpy(dip->label.name, AudioNcd);
1745 1.1 augustss dip->un.v.num_channels = 2;
1746 1.1 augustss strcpy(dip->un.v.units.name, AudioNvolume);
1747 1.1 augustss return (0);
1748 1.1 augustss
1749 1.1 augustss case ESS_AUXB_PLAY_VOL:
1750 1.1 augustss dip->type = AUDIO_MIXER_VALUE;
1751 1.1 augustss dip->mixer_class = ESS_INPUT_CLASS;
1752 1.1 augustss dip->prev = AUDIO_MIXER_LAST;
1753 1.1 augustss dip->next = AUDIO_MIXER_LAST;
1754 1.1 augustss strcpy(dip->label.name, "auxb");
1755 1.1 augustss dip->un.v.num_channels = 2;
1756 1.1 augustss strcpy(dip->un.v.units.name, AudioNvolume);
1757 1.1 augustss return (0);
1758 1.1 augustss
1759 1.1 augustss case ESS_INPUT_CLASS:
1760 1.1 augustss dip->type = AUDIO_MIXER_CLASS;
1761 1.1 augustss dip->mixer_class = ESS_INPUT_CLASS;
1762 1.1 augustss dip->next = dip->prev = AUDIO_MIXER_LAST;
1763 1.1 augustss strcpy(dip->label.name, AudioCinputs);
1764 1.1 augustss return (0);
1765 1.1 augustss
1766 1.1 augustss
1767 1.1 augustss case ESS_MASTER_VOL:
1768 1.1 augustss dip->type = AUDIO_MIXER_VALUE;
1769 1.1 augustss dip->mixer_class = ESS_OUTPUT_CLASS;
1770 1.1 augustss dip->prev = dip->next = AUDIO_MIXER_LAST;
1771 1.1 augustss strcpy(dip->label.name, AudioNmaster);
1772 1.1 augustss dip->un.v.num_channels = 2;
1773 1.1 augustss strcpy(dip->un.v.units.name, AudioNvolume);
1774 1.1 augustss return (0);
1775 1.1 augustss
1776 1.1 augustss case ESS_PCSPEAKER_VOL:
1777 1.1 augustss dip->type = AUDIO_MIXER_VALUE;
1778 1.1 augustss dip->mixer_class = ESS_OUTPUT_CLASS;
1779 1.1 augustss dip->prev = AUDIO_MIXER_LAST;
1780 1.1 augustss dip->next = AUDIO_MIXER_LAST;
1781 1.1 augustss strcpy(dip->label.name, "pc_speaker");
1782 1.1 augustss dip->un.v.num_channels = 1;
1783 1.1 augustss strcpy(dip->un.v.units.name, AudioNvolume);
1784 1.1 augustss return (0);
1785 1.1 augustss
1786 1.1 augustss case ESS_OUTPUT_CLASS:
1787 1.1 augustss dip->type = AUDIO_MIXER_CLASS;
1788 1.1 augustss dip->mixer_class = ESS_OUTPUT_CLASS;
1789 1.1 augustss dip->next = dip->prev = AUDIO_MIXER_LAST;
1790 1.1 augustss strcpy(dip->label.name, AudioCoutputs);
1791 1.1 augustss return (0);
1792 1.1 augustss
1793 1.1 augustss
1794 1.1 augustss case ESS_DAC_REC_VOL:
1795 1.1 augustss dip->type = AUDIO_MIXER_VALUE;
1796 1.1 augustss dip->mixer_class = ESS_RECORD_CLASS;
1797 1.1 augustss dip->prev = AUDIO_MIXER_LAST;
1798 1.1 augustss dip->next = AUDIO_MIXER_LAST;
1799 1.1 augustss strcpy(dip->label.name, AudioNdac);
1800 1.1 augustss dip->un.v.num_channels = 2;
1801 1.1 augustss strcpy(dip->un.v.units.name, AudioNvolume);
1802 1.1 augustss return (0);
1803 1.1 augustss
1804 1.1 augustss case ESS_MIC_REC_VOL:
1805 1.1 augustss dip->type = AUDIO_MIXER_VALUE;
1806 1.1 augustss dip->mixer_class = ESS_RECORD_CLASS;
1807 1.1 augustss dip->prev = AUDIO_MIXER_LAST;
1808 1.1 augustss dip->next = ESS_MIC_PREAMP;
1809 1.1 augustss strcpy(dip->label.name, AudioNmicrophone);
1810 1.1 augustss dip->un.v.num_channels = 2;
1811 1.1 augustss strcpy(dip->un.v.units.name, AudioNvolume);
1812 1.1 augustss return (0);
1813 1.1 augustss
1814 1.1 augustss case ESS_LINE_REC_VOL:
1815 1.1 augustss dip->type = AUDIO_MIXER_VALUE;
1816 1.1 augustss dip->mixer_class = ESS_RECORD_CLASS;
1817 1.1 augustss dip->prev = AUDIO_MIXER_LAST;
1818 1.1 augustss dip->next = AUDIO_MIXER_LAST;
1819 1.1 augustss strcpy(dip->label.name, AudioNline);
1820 1.1 augustss dip->un.v.num_channels = 2;
1821 1.1 augustss strcpy(dip->un.v.units.name, AudioNvolume);
1822 1.1 augustss return (0);
1823 1.1 augustss
1824 1.1 augustss case ESS_SYNTH_REC_VOL:
1825 1.1 augustss dip->type = AUDIO_MIXER_VALUE;
1826 1.1 augustss dip->mixer_class = ESS_RECORD_CLASS;
1827 1.1 augustss dip->prev = AUDIO_MIXER_LAST;
1828 1.1 augustss dip->next = AUDIO_MIXER_LAST;
1829 1.1 augustss strcpy(dip->label.name, AudioNfmsynth);
1830 1.1 augustss dip->un.v.num_channels = 2;
1831 1.1 augustss strcpy(dip->un.v.units.name, AudioNvolume);
1832 1.1 augustss return (0);
1833 1.1 augustss
1834 1.1 augustss case ESS_CD_REC_VOL:
1835 1.1 augustss dip->type = AUDIO_MIXER_VALUE;
1836 1.1 augustss dip->mixer_class = ESS_RECORD_CLASS;
1837 1.1 augustss dip->prev = AUDIO_MIXER_LAST;
1838 1.1 augustss dip->next = AUDIO_MIXER_LAST;
1839 1.1 augustss strcpy(dip->label.name, AudioNcd);
1840 1.1 augustss dip->un.v.num_channels = 2;
1841 1.1 augustss strcpy(dip->un.v.units.name, AudioNvolume);
1842 1.1 augustss return (0);
1843 1.1 augustss
1844 1.1 augustss case ESS_AUXB_REC_VOL:
1845 1.1 augustss dip->type = AUDIO_MIXER_VALUE;
1846 1.1 augustss dip->mixer_class = ESS_RECORD_CLASS;
1847 1.1 augustss dip->prev = AUDIO_MIXER_LAST;
1848 1.1 augustss dip->next = AUDIO_MIXER_LAST;
1849 1.1 augustss strcpy(dip->label.name, "auxb");
1850 1.1 augustss dip->un.v.num_channels = 2;
1851 1.1 augustss strcpy(dip->un.v.units.name, AudioNvolume);
1852 1.1 augustss return (0);
1853 1.1 augustss
1854 1.1 augustss case ESS_MIC_PREAMP:
1855 1.1 augustss dip->type = AUDIO_MIXER_ENUM;
1856 1.1 augustss dip->mixer_class = ESS_RECORD_CLASS;
1857 1.1 augustss dip->prev = ESS_MIC_REC_VOL;
1858 1.1 augustss dip->next = AUDIO_MIXER_LAST;
1859 1.1 augustss strcpy(dip->label.name, AudioNenhanced);
1860 1.1 augustss dip->un.e.num_mem = 2;
1861 1.1 augustss strcpy(dip->un.e.member[0].label.name, AudioNoff);
1862 1.1 augustss dip->un.e.member[0].ord = 0;
1863 1.1 augustss strcpy(dip->un.e.member[1].label.name, AudioNon);
1864 1.1 augustss dip->un.e.member[1].ord = 1;
1865 1.1 augustss return (0);
1866 1.1 augustss
1867 1.1 augustss case ESS_RECORD_VOL:
1868 1.1 augustss dip->type = AUDIO_MIXER_VALUE;
1869 1.1 augustss dip->mixer_class = ESS_RECORD_CLASS;
1870 1.1 augustss dip->prev = AUDIO_MIXER_LAST;
1871 1.1 augustss dip->next = AUDIO_MIXER_LAST;
1872 1.1 augustss strcpy(dip->label.name, AudioNrecord);
1873 1.1 augustss dip->un.v.num_channels = 2;
1874 1.1 augustss strcpy(dip->un.v.units.name, AudioNvolume);
1875 1.1 augustss return (0);
1876 1.1 augustss
1877 1.1 augustss case ESS_RECORD_SOURCE:
1878 1.1 augustss dip->mixer_class = ESS_RECORD_CLASS;
1879 1.1 augustss dip->prev = dip->next = AUDIO_MIXER_LAST;
1880 1.1 augustss strcpy(dip->label.name, AudioNsource);
1881 1.1 augustss dip->type = AUDIO_MIXER_SET;
1882 1.1 augustss dip->un.s.num_mem = 6;
1883 1.1 augustss strcpy(dip->un.s.member[0].label.name, AudioNdac);
1884 1.1 augustss dip->un.s.member[0].mask = 1 << ESS_DAC_REC_VOL;
1885 1.1 augustss strcpy(dip->un.s.member[1].label.name, AudioNmicrophone);
1886 1.1 augustss dip->un.s.member[1].mask = 1 << ESS_MIC_REC_VOL;
1887 1.1 augustss strcpy(dip->un.s.member[2].label.name, AudioNline);
1888 1.1 augustss dip->un.s.member[2].mask = 1 << ESS_LINE_REC_VOL;
1889 1.1 augustss strcpy(dip->un.s.member[3].label.name, AudioNfmsynth);
1890 1.1 augustss dip->un.s.member[3].mask = 1 << ESS_SYNTH_REC_VOL;
1891 1.1 augustss strcpy(dip->un.s.member[4].label.name, AudioNcd);
1892 1.1 augustss dip->un.s.member[4].mask = 1 << ESS_CD_REC_VOL;
1893 1.1 augustss strcpy(dip->un.s.member[5].label.name, "auxb");
1894 1.1 augustss dip->un.s.member[5].mask = 1 << ESS_AUXB_REC_VOL;
1895 1.1 augustss return (0);
1896 1.1 augustss
1897 1.1 augustss case ESS_RECORD_CLASS:
1898 1.1 augustss dip->type = AUDIO_MIXER_CLASS;
1899 1.1 augustss dip->mixer_class = ESS_RECORD_CLASS;
1900 1.1 augustss dip->next = dip->prev = AUDIO_MIXER_LAST;
1901 1.1 augustss strcpy(dip->label.name, AudioCrecord);
1902 1.1 augustss return (0);
1903 1.1 augustss
1904 1.1 augustss
1905 1.1 augustss case ESS_RECORD_MONITOR:
1906 1.1 augustss dip->mixer_class = ESS_MONITOR_CLASS;
1907 1.1 augustss dip->prev = dip->next = AUDIO_MIXER_LAST;
1908 1.1 augustss strcpy(dip->label.name, AudioNmonitor);
1909 1.1 augustss dip->type = AUDIO_MIXER_ENUM;
1910 1.1 augustss dip->un.e.num_mem = 2;
1911 1.1 augustss strcpy(dip->un.e.member[0].label.name, AudioNoff);
1912 1.1 augustss dip->un.e.member[0].ord = 0;
1913 1.1 augustss strcpy(dip->un.e.member[1].label.name, AudioNon);
1914 1.1 augustss dip->un.e.member[1].ord = 1;
1915 1.1 augustss return (0);
1916 1.1 augustss
1917 1.1 augustss case ESS_MONITOR_CLASS:
1918 1.1 augustss dip->type = AUDIO_MIXER_CLASS;
1919 1.1 augustss dip->mixer_class = ESS_MONITOR_CLASS;
1920 1.1 augustss dip->next = dip->prev = AUDIO_MIXER_LAST;
1921 1.1 augustss strcpy(dip->label.name, AudioCmonitor);
1922 1.1 augustss return (0);
1923 1.1 augustss }
1924 1.1 augustss
1925 1.1 augustss return ENXIO;
1926 1.1 augustss }
1927 1.1 augustss
1928 1.1 augustss int
1929 1.1 augustss ess_get_props(addr)
1930 1.1 augustss void *addr;
1931 1.1 augustss {
1932 1.1 augustss /*struct ess_softc *sc = addr;*/
1933 1.1 augustss return (0);
1934 1.1 augustss }
1935 1.1 augustss
1936 1.1 augustss /* ============================================
1937 1.1 augustss * Generic functions for ess, not used by audio h/w i/f
1938 1.1 augustss * =============================================
1939 1.1 augustss */
1940 1.1 augustss
1941 1.1 augustss /*
1942 1.1 augustss * Reset the chip.
1943 1.1 augustss * Return non-zero if the chip isn't detected.
1944 1.1 augustss */
1945 1.1 augustss int
1946 1.1 augustss ess_reset(sc)
1947 1.1 augustss struct ess_softc *sc;
1948 1.1 augustss {
1949 1.1 augustss /* REVISIT: currently just copied from sbdsp.c */
1950 1.1 augustss bus_space_tag_t iot = sc->sc_iot;
1951 1.1 augustss bus_space_handle_t ioh = sc->sc_ioh;
1952 1.1 augustss
1953 1.1 augustss sc->sc_in.intr = 0;
1954 1.1 augustss sc->sc_in.dmacnt = 0;
1955 1.1 augustss if (sc->sc_in.active) {
1956 1.1 augustss isa_dmaabort(sc->sc_ic, sc->sc_in.drq);
1957 1.1 augustss sc->sc_in.active = 0;
1958 1.1 augustss }
1959 1.1 augustss
1960 1.1 augustss sc->sc_out.intr = 0;
1961 1.1 augustss sc->sc_out.dmacnt = 0;
1962 1.1 augustss if (sc->sc_out.active) {
1963 1.1 augustss isa_dmaabort(sc->sc_ic, sc->sc_out.drq);
1964 1.1 augustss sc->sc_out.active = 0;
1965 1.1 augustss }
1966 1.1 augustss
1967 1.1 augustss /*
1968 1.1 augustss * See SBK, section 11.3.
1969 1.1 augustss * We pulse a reset signal into the card.
1970 1.1 augustss * Gee, what a brilliant hardware design.
1971 1.1 augustss */
1972 1.1 augustss /* REVISIT: need to properly document the use of 3 below */
1973 1.2 augustss EWRITE1(iot, ioh, ESS_DSP_RESET, 3);
1974 1.1 augustss delay(10000);
1975 1.2 augustss EWRITE1(iot, ioh, ESS_DSP_RESET, 0);
1976 1.1 augustss delay(30000);
1977 1.1 augustss if (ess_rdsp(sc) != ESS_MAGIC)
1978 1.1 augustss return -1;
1979 1.1 augustss
1980 1.1 augustss /*
1981 1.1 augustss * Enable access to the ESS extension commands, which are
1982 1.1 augustss * disabled by each reset.
1983 1.1 augustss */
1984 1.1 augustss ess_wdsp(sc, ESS_ACMD_ENABLE_EXT);
1985 1.1 augustss
1986 1.1 augustss return (0);
1987 1.1 augustss }
1988 1.1 augustss
1989 1.1 augustss void
1990 1.1 augustss ess_set_gain(sc, port, on)
1991 1.1 augustss struct ess_softc *sc;
1992 1.1 augustss int port;
1993 1.1 augustss int on;
1994 1.1 augustss {
1995 1.1 augustss int gain, left, right;
1996 1.1 augustss int mix;
1997 1.1 augustss int src;
1998 1.1 augustss int stereo;
1999 1.1 augustss
2000 1.1 augustss /*
2001 1.1 augustss * Most gain controls are found in the mixer registers and
2002 1.1 augustss * are stereo. Any that are not, must set mix and stereo as
2003 1.1 augustss * required.
2004 1.1 augustss */
2005 1.1 augustss mix = 1;
2006 1.1 augustss stereo = 1;
2007 1.1 augustss
2008 1.1 augustss switch (port) {
2009 1.1 augustss case ESS_MASTER_VOL:
2010 1.1 augustss src = 0x32;
2011 1.1 augustss break;
2012 1.1 augustss case ESS_DAC_PLAY_VOL:
2013 1.1 augustss src = 0x7C;
2014 1.1 augustss break;
2015 1.1 augustss case ESS_MIC_PLAY_VOL:
2016 1.1 augustss src = 0x1A;
2017 1.1 augustss break;
2018 1.1 augustss case ESS_LINE_PLAY_VOL:
2019 1.1 augustss src = 0x3E;
2020 1.1 augustss break;
2021 1.1 augustss case ESS_SYNTH_PLAY_VOL:
2022 1.1 augustss src = 0x36;
2023 1.1 augustss break;
2024 1.1 augustss case ESS_CD_PLAY_VOL:
2025 1.1 augustss src = 0x38;
2026 1.1 augustss break;
2027 1.1 augustss case ESS_AUXB_PLAY_VOL:
2028 1.1 augustss src = 0x3A;
2029 1.1 augustss break;
2030 1.1 augustss case ESS_PCSPEAKER_VOL:
2031 1.1 augustss src = 0x3C;
2032 1.1 augustss stereo = 0;
2033 1.1 augustss break;
2034 1.1 augustss case ESS_DAC_REC_VOL:
2035 1.1 augustss src = 0x69;
2036 1.1 augustss break;
2037 1.1 augustss case ESS_MIC_REC_VOL:
2038 1.1 augustss src = 0x68;
2039 1.1 augustss break;
2040 1.1 augustss case ESS_LINE_REC_VOL:
2041 1.1 augustss src = 0x6E;
2042 1.1 augustss break;
2043 1.1 augustss case ESS_SYNTH_REC_VOL:
2044 1.1 augustss src = 0x6B;
2045 1.1 augustss break;
2046 1.1 augustss case ESS_CD_REC_VOL:
2047 1.1 augustss src = 0x6A;
2048 1.1 augustss break;
2049 1.1 augustss case ESS_AUXB_REC_VOL:
2050 1.1 augustss src = 0x6C;
2051 1.1 augustss break;
2052 1.1 augustss case ESS_RECORD_VOL:
2053 1.1 augustss src = 0xB4;
2054 1.1 augustss mix = 0;
2055 1.1 augustss break;
2056 1.1 augustss default:
2057 1.1 augustss return;
2058 1.1 augustss }
2059 1.1 augustss
2060 1.1 augustss if (on) {
2061 1.1 augustss left = sc->gain[port][ESS_LEFT];
2062 1.1 augustss right = sc->gain[port][ESS_RIGHT];
2063 1.1 augustss } else {
2064 1.1 augustss left = right = 0;
2065 1.1 augustss }
2066 1.1 augustss
2067 1.1 augustss if (stereo)
2068 1.1 augustss gain = ESS_STEREO_GAIN(left, right);
2069 1.1 augustss else
2070 1.1 augustss gain = ESS_MONO_GAIN(left);
2071 1.1 augustss
2072 1.1 augustss if (mix)
2073 1.1 augustss ess_write_mix_reg(sc, src, gain);
2074 1.1 augustss else
2075 1.1 augustss ess_write_x_reg(sc, src, gain);
2076 1.1 augustss }
2077 1.1 augustss
2078 1.1 augustss int
2079 1.1 augustss ess_set_in_ports(sc, mask)
2080 1.1 augustss struct ess_softc *sc;
2081 1.1 augustss int mask;
2082 1.1 augustss {
2083 1.1 augustss mixer_devinfo_t di;
2084 1.1 augustss int i;
2085 1.1 augustss int port;
2086 1.1 augustss int tmp;
2087 1.1 augustss
2088 1.1 augustss DPRINTF(("ess_set_in_ports: mask=0x%x\n", mask));
2089 1.1 augustss
2090 1.1 augustss /*
2091 1.1 augustss * Get the device info for the record source control,
2092 1.1 augustss * including the list of available sources.
2093 1.1 augustss */
2094 1.1 augustss di.index = ESS_RECORD_SOURCE;
2095 1.1 augustss if (ess_query_devinfo(sc, &di))
2096 1.1 augustss return EINVAL;
2097 1.1 augustss
2098 1.1 augustss /*
2099 1.1 augustss * Set or disable the record volume control for each of the
2100 1.1 augustss * possible sources.
2101 1.1 augustss */
2102 1.1 augustss for (i = 0; i < di.un.s.num_mem; i++)
2103 1.1 augustss {
2104 1.1 augustss /*
2105 1.1 augustss * Calculate the source port number from its mask.
2106 1.1 augustss */
2107 1.1 augustss tmp = di.un.s.member[i].mask >> 1;
2108 1.1 augustss for (port = 0; tmp; port++) {
2109 1.1 augustss tmp >>= 1;
2110 1.1 augustss }
2111 1.1 augustss
2112 1.1 augustss /*
2113 1.1 augustss * Set the source gain:
2114 1.1 augustss * to the current value if source is enabled
2115 1.1 augustss * to zero if source is disabled
2116 1.1 augustss */
2117 1.1 augustss ess_set_gain(sc, port, mask & di.un.s.member[i].mask);
2118 1.1 augustss }
2119 1.1 augustss
2120 1.1 augustss sc->in_mask = mask;
2121 1.1 augustss
2122 1.1 augustss /*
2123 1.1 augustss * We have to fake a single port since the upper layer expects
2124 1.1 augustss * one only. We choose the lowest numbered port that is enabled.
2125 1.1 augustss */
2126 1.1 augustss for(i = 0; i < ESS_NPORT; i++) {
2127 1.1 augustss if (mask & (1 << i)) {
2128 1.1 augustss sc->in_port = i;
2129 1.1 augustss break;
2130 1.1 augustss }
2131 1.1 augustss }
2132 1.1 augustss
2133 1.1 augustss return (0);
2134 1.1 augustss }
2135 1.1 augustss
2136 1.1 augustss void
2137 1.1 augustss ess_speaker_on(sc)
2138 1.1 augustss struct ess_softc *sc;
2139 1.1 augustss {
2140 1.1 augustss /* Disable mute on left- and right-master volume. */
2141 1.1 augustss ess_clear_mreg_bits(sc, 0x60, 0x40);
2142 1.1 augustss ess_clear_mreg_bits(sc, 0x62, 0x40);
2143 1.1 augustss }
2144 1.1 augustss
2145 1.1 augustss void
2146 1.1 augustss ess_speaker_off(sc)
2147 1.1 augustss struct ess_softc *sc;
2148 1.1 augustss {
2149 1.1 augustss /* Enable mute on left- and right-master volume. */
2150 1.1 augustss ess_set_mreg_bits(sc, 0x60, 0x40);
2151 1.1 augustss ess_set_mreg_bits(sc, 0x62, 0x40);
2152 1.1 augustss }
2153 1.1 augustss
2154 1.1 augustss /*
2155 1.1 augustss * Calculate the time constant for the requested sampling rate.
2156 1.1 augustss */
2157 1.1 augustss u_int
2158 1.1 augustss ess_srtotc(rate)
2159 1.1 augustss u_int rate;
2160 1.1 augustss {
2161 1.1 augustss u_int tc;
2162 1.1 augustss
2163 1.1 augustss /* The following formulae are from the ESS data sheet. */
2164 1.1 augustss if (rate < 22050)
2165 1.1 augustss tc = 128 - 397700L / rate;
2166 1.1 augustss else
2167 1.1 augustss tc = 256 - 795500L / rate;
2168 1.1 augustss
2169 1.1 augustss return (tc);
2170 1.1 augustss }
2171 1.1 augustss
2172 1.1 augustss
2173 1.1 augustss /*
2174 1.1 augustss * Calculate the filter constant for the reuqested sampling rate.
2175 1.1 augustss */
2176 1.1 augustss u_int
2177 1.1 augustss ess_srtofc(rate)
2178 1.1 augustss u_int rate;
2179 1.1 augustss {
2180 1.1 augustss /*
2181 1.1 augustss * The following formula is derived from the information in
2182 1.1 augustss * the ES1887 data sheet, based on a roll-off frequency of
2183 1.1 augustss * 87%.
2184 1.1 augustss */
2185 1.1 augustss return (256 - 200279L / rate);
2186 1.1 augustss }
2187 1.1 augustss
2188 1.1 augustss
2189 1.1 augustss /*
2190 1.1 augustss * Return the status of the DSP.
2191 1.1 augustss */
2192 1.1 augustss u_char
2193 1.1 augustss ess_get_dsp_status(sc)
2194 1.1 augustss struct ess_softc *sc;
2195 1.1 augustss {
2196 1.1 augustss bus_space_tag_t iot = sc->sc_iot;
2197 1.1 augustss bus_space_handle_t ioh = sc->sc_ioh;
2198 1.1 augustss
2199 1.2 augustss return (EREAD1(iot, ioh, ESS_DSP_RW_STATUS));
2200 1.1 augustss }
2201 1.1 augustss
2202 1.1 augustss
2203 1.1 augustss /*
2204 1.1 augustss * Return the read status of the DSP: 1 -> DSP ready for reading
2205 1.1 augustss * 0 -> DSP not ready for reading
2206 1.1 augustss */
2207 1.1 augustss u_char
2208 1.1 augustss ess_dsp_read_ready(sc)
2209 1.1 augustss struct ess_softc *sc;
2210 1.1 augustss {
2211 1.1 augustss return (((ess_get_dsp_status(sc) & ESS_DSP_READ_MASK) ==
2212 1.1 augustss ESS_DSP_READ_READY) ? 1 : 0);
2213 1.1 augustss }
2214 1.1 augustss
2215 1.1 augustss
2216 1.1 augustss /*
2217 1.1 augustss * Return the write status of the DSP: 1 -> DSP ready for writing
2218 1.1 augustss * 0 -> DSP not ready for writing
2219 1.1 augustss */
2220 1.1 augustss u_char
2221 1.1 augustss ess_dsp_write_ready(sc)
2222 1.1 augustss struct ess_softc *sc;
2223 1.1 augustss {
2224 1.1 augustss return (((ess_get_dsp_status(sc) & ESS_DSP_WRITE_MASK) ==
2225 1.1 augustss ESS_DSP_WRITE_READY) ? 1 : 0);
2226 1.1 augustss }
2227 1.1 augustss
2228 1.1 augustss
2229 1.1 augustss /*
2230 1.1 augustss * Read a byte from the DSP.
2231 1.1 augustss */
2232 1.1 augustss int
2233 1.1 augustss ess_rdsp(sc)
2234 1.1 augustss struct ess_softc *sc;
2235 1.1 augustss {
2236 1.1 augustss bus_space_tag_t iot = sc->sc_iot;
2237 1.1 augustss bus_space_handle_t ioh = sc->sc_ioh;
2238 1.1 augustss int i;
2239 1.1 augustss
2240 1.1 augustss for (i = ESS_READ_TIMEOUT; i > 0; --i) {
2241 1.1 augustss if (ess_dsp_read_ready(sc)) {
2242 1.2 augustss i = EREAD1(iot, ioh, ESS_DSP_READ);
2243 1.2 augustss DPRINTFN(8,("ess_rdsp() = 0x%02x\n", i));
2244 1.1 augustss return i;
2245 1.1 augustss } else
2246 1.1 augustss delay(10);
2247 1.1 augustss }
2248 1.1 augustss
2249 1.1 augustss DPRINTF(("ess_rdsp: timed out\n"));
2250 1.1 augustss return (-1);
2251 1.1 augustss }
2252 1.1 augustss
2253 1.1 augustss /*
2254 1.1 augustss * Write a byte to the DSP.
2255 1.1 augustss */
2256 1.1 augustss int
2257 1.1 augustss ess_wdsp(sc, v)
2258 1.1 augustss struct ess_softc *sc;
2259 1.1 augustss u_char v;
2260 1.1 augustss {
2261 1.1 augustss bus_space_tag_t iot = sc->sc_iot;
2262 1.1 augustss bus_space_handle_t ioh = sc->sc_ioh;
2263 1.1 augustss int i;
2264 1.2 augustss
2265 1.2 augustss DPRINTFN(8,("ess_wdsp(0x%02x)\n", v));
2266 1.2 augustss
2267 1.1 augustss for (i = ESS_WRITE_TIMEOUT; i > 0; --i) {
2268 1.1 augustss if (ess_dsp_write_ready(sc)) {
2269 1.2 augustss EWRITE1(iot, ioh, ESS_DSP_WRITE, v);
2270 1.1 augustss return (0);
2271 1.1 augustss } else
2272 1.1 augustss delay(10);
2273 1.1 augustss }
2274 1.1 augustss
2275 1.1 augustss DPRINTF(("ess_wdsp(0x%02x): timed out\n", v));
2276 1.1 augustss return (-1);
2277 1.1 augustss }
2278 1.1 augustss
2279 1.1 augustss /*
2280 1.1 augustss * Write a value to one of the ESS extended registers.
2281 1.1 augustss */
2282 1.1 augustss int
2283 1.1 augustss ess_write_x_reg(sc, reg, val)
2284 1.1 augustss struct ess_softc *sc;
2285 1.1 augustss u_char reg;
2286 1.1 augustss u_char val;
2287 1.1 augustss {
2288 1.1 augustss int error;
2289 1.1 augustss
2290 1.2 augustss DPRINTFN(2,("ess_write_x_reg: %02x=%02x\n", reg, val));
2291 1.1 augustss if ((error = ess_wdsp(sc, reg)) == 0)
2292 1.1 augustss error = ess_wdsp(sc, val);
2293 1.1 augustss
2294 1.1 augustss return error;
2295 1.1 augustss }
2296 1.1 augustss
2297 1.1 augustss /*
2298 1.1 augustss * Read the value of one of the ESS extended registers.
2299 1.1 augustss */
2300 1.1 augustss u_char
2301 1.1 augustss ess_read_x_reg(sc, reg)
2302 1.1 augustss struct ess_softc *sc;
2303 1.1 augustss u_char reg;
2304 1.1 augustss {
2305 1.1 augustss int error;
2306 1.2 augustss int val;
2307 1.1 augustss
2308 1.1 augustss if ((error = ess_wdsp(sc, 0xC0)) == 0)
2309 1.1 augustss error = ess_wdsp(sc, reg);
2310 1.1 augustss if (error)
2311 1.1 augustss DPRINTF(("Error reading extended register 0x%02x\n", reg));
2312 1.1 augustss /* REVISIT: what if an error is returned above? */
2313 1.2 augustss val = ess_rdsp(sc);
2314 1.2 augustss DPRINTFN(2,("ess_write_x_reg: %02x=%02x\n", reg, val));
2315 1.2 augustss return val;
2316 1.1 augustss }
2317 1.1 augustss
2318 1.1 augustss void
2319 1.1 augustss ess_clear_xreg_bits(sc, reg, mask)
2320 1.1 augustss struct ess_softc *sc;
2321 1.1 augustss u_char reg;
2322 1.1 augustss u_char mask;
2323 1.1 augustss {
2324 1.1 augustss if (ess_write_x_reg(sc, reg, ess_read_x_reg(sc, reg) & ~mask) == -1)
2325 1.1 augustss DPRINTF(("Error clearing bits in extended register 0x%02x\n",
2326 1.1 augustss reg));
2327 1.1 augustss }
2328 1.1 augustss
2329 1.1 augustss void
2330 1.1 augustss ess_set_xreg_bits(sc, reg, mask)
2331 1.1 augustss struct ess_softc *sc;
2332 1.1 augustss u_char reg;
2333 1.1 augustss u_char mask;
2334 1.1 augustss {
2335 1.1 augustss if (ess_write_x_reg(sc, reg, ess_read_x_reg(sc, reg) | mask) == -1)
2336 1.1 augustss DPRINTF(("Error setting bits in extended register 0x%02x\n",
2337 1.1 augustss reg));
2338 1.1 augustss }
2339 1.1 augustss
2340 1.1 augustss
2341 1.1 augustss /*
2342 1.1 augustss * Write a value to one of the ESS mixer registers.
2343 1.1 augustss */
2344 1.1 augustss void
2345 1.1 augustss ess_write_mix_reg(sc, reg, val)
2346 1.1 augustss struct ess_softc *sc;
2347 1.1 augustss u_char reg;
2348 1.1 augustss u_char val;
2349 1.1 augustss {
2350 1.1 augustss bus_space_tag_t iot = sc->sc_iot;
2351 1.1 augustss bus_space_handle_t ioh = sc->sc_ioh;
2352 1.1 augustss int s;
2353 1.1 augustss
2354 1.2 augustss DPRINTFN(2,("ess_write_mix_reg: %x=%x\n", reg, val));
2355 1.1 augustss s = splaudio();
2356 1.1 augustss
2357 1.1 augustss /*
2358 1.1 augustss * Select the register to be written.
2359 1.1 augustss */
2360 1.2 augustss EWRITE1(iot, ioh, ESS_MIX_REG_SELECT, reg);
2361 1.1 augustss
2362 1.1 augustss /*
2363 1.1 augustss * Write the desired value.
2364 1.1 augustss */
2365 1.2 augustss EWRITE1(iot, ioh, ESS_MIX_REG_DATA, val);
2366 1.1 augustss
2367 1.1 augustss splx(s);
2368 1.1 augustss }
2369 1.1 augustss
2370 1.1 augustss /*
2371 1.1 augustss * Read the value of one of the ESS mixer registers.
2372 1.1 augustss */
2373 1.1 augustss u_char
2374 1.1 augustss ess_read_mix_reg(sc, reg)
2375 1.1 augustss struct ess_softc *sc;
2376 1.1 augustss u_char reg;
2377 1.1 augustss {
2378 1.1 augustss bus_space_tag_t iot = sc->sc_iot;
2379 1.1 augustss bus_space_handle_t ioh = sc->sc_ioh;
2380 1.1 augustss int s;
2381 1.1 augustss u_char val;
2382 1.1 augustss
2383 1.1 augustss s = splaudio();
2384 1.1 augustss
2385 1.1 augustss /* Select the register to be read. */
2386 1.2 augustss EWRITE1(iot, ioh, ESS_MIX_REG_SELECT, reg);
2387 1.1 augustss
2388 1.1 augustss /* Read the current value. */
2389 1.2 augustss val = EREAD1(iot, ioh, ESS_MIX_REG_DATA);
2390 1.1 augustss
2391 1.1 augustss splx(s);
2392 1.2 augustss DPRINTFN(2,("ess_read_mix_reg: %x=%x\n", reg, val));
2393 1.1 augustss return val;
2394 1.1 augustss }
2395 1.1 augustss
2396 1.1 augustss void
2397 1.1 augustss ess_clear_mreg_bits(sc, reg, mask)
2398 1.1 augustss struct ess_softc *sc;
2399 1.1 augustss u_char reg;
2400 1.1 augustss u_char mask;
2401 1.1 augustss {
2402 1.1 augustss ess_write_mix_reg(sc, reg, ess_read_mix_reg(sc, reg) & ~mask);
2403 1.1 augustss }
2404 1.1 augustss
2405 1.1 augustss void
2406 1.1 augustss ess_set_mreg_bits(sc, reg, mask)
2407 1.1 augustss struct ess_softc *sc;
2408 1.1 augustss u_char reg;
2409 1.1 augustss u_char mask;
2410 1.1 augustss {
2411 1.1 augustss ess_write_mix_reg(sc, reg, ess_read_mix_reg(sc, reg) | mask);
2412 1.1 augustss }
2413