The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/isa/ess.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: 030cafd8d986d8369b241a68616f0a58


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.