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