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