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