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