Annotation of Gnu-Mach/chips/isdn_79c30_hdw.c, revision 1.1.1.1

1.1       root        1: /* 
                      2:  * Mach Operating System
                      3:  * Copyright (c) 1992 Carnegie Mellon University
                      4:  * All Rights Reserved.
                      5:  * 
                      6:  * Permission to use, copy, modify and distribute this software and its
                      7:  * documentation is hereby granted, provided that both the copyright
                      8:  * notice and this permission notice appear in all copies of the
                      9:  * software, derivative works or modified versions, and any portions
                     10:  * thereof, and that both notices appear in supporting documentation.
                     11:  * 
                     12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     15:  * 
                     16:  * Carnegie Mellon requests users of this software to return to
                     17:  * 
                     18:  *  Software Distribution Coordinator  or  [email protected]
                     19:  *  School of Computer Science
                     20:  *  Carnegie Mellon University
                     21:  *  Pittsburgh PA 15213-3890
                     22:  * 
                     23:  * any improvements or extensions that they make and grant Carnegie Mellon
                     24:  * the rights to redistribute these changes.
                     25:  */
                     26: /*
                     27:  *     File: isdn_79c30_hdw.c
                     28:  *     Author: Alessandro Forin, Carnegie Mellon University
                     29:  *     Date:   1/92
                     30:  *
                     31:  *     Driver for the AMD 79c30 ISDN (Integrated Speech and
                     32:  *     Data Network) controller chip.
                     33:  */
                     34: 
                     35: /*-
                     36:  * Copyright (c) 1991, 1992 The Regents of the University of California.
                     37:  * All rights reserved.
                     38:  *
                     39:  * Redistribution and use in source and binary forms, with or without
                     40:  * modification, are permitted provided that the following conditions
                     41:  * are met:
                     42:  * 1. Redistributions of source code must retain the above copyright
                     43:  *    notice, this list of conditions and the following disclaimer.
                     44:  * 2. Redistributions in binary form must reproduce the above copyright
                     45:  *    notice, this list of conditions and the following disclaimer in the
                     46:  *    documentation and/or other materials provided with the distribution.
                     47:  * 3. All advertising materials mentioning features or use of this software
                     48:  *    must display the following acknowledgement:
                     49:  *     This product includes software developed by the Computer Systems
                     50:  *     Engineering Group at Lawrence Berkeley Laboratory.
                     51:  * 4. The name of the Laboratory may not be used to endorse or promote 
                     52:  *    products derived from this software without specific prior written 
                     53:  *    permission.
                     54:  *
                     55:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     56:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     57:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     58:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     59:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     60:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     61:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     62:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     63:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     64:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     65:  * SUCH DAMAGE.
                     66:  */
                     67: 
                     68: #include <isdn.h>
                     69: #if    NISDN > 0
                     70: 
                     71: #include <platforms.h>
                     72: 
                     73: #include <mach/std_types.h>
                     74: #include <machine/machspl.h>
                     75: #include <sys/ioctl.h> /* for Sun compat */
                     76: #include <chips/busses.h>
                     77: 
                     78: #include <device/device_types.h>
                     79: #include <device/io_req.h>
                     80: #include <device/audio_status.h>
                     81: #include <chips/audio_defs.h>
                     82: 
                     83: #include <chips/isdn_79c30.h>
                     84: 
                     85: #include <chips/audio_config.h>                /* machdep config */
                     86: 
                     87: #define private static
                     88: 
                     89: /*
                     90:  * Autoconf info
                     91:  */
                     92: private int isdn_probe (vm_offset_t reg, struct bus_ctlr *ui);
                     93: private void isdn_attach ( struct bus_device *ui);
                     94: 
                     95: private vm_offset_t isdn_std[NISDN] = { 0 };
                     96: private struct bus_device *isdn_info[NISDN];
                     97: 
                     98: struct bus_driver isdn_driver =
                     99:        { isdn_probe, 0, isdn_attach, 0, isdn_std, "isdn", isdn_info, };
                    100: 
                    101: 
                    102: /*
                    103:  * Externally visible functions and data
                    104:  */
                    105: int    isdn_intr();
                    106: 
                    107: 
                    108: /*
                    109:  * Status bookeeping and globals
                    110:  */
                    111: typedef struct {
                    112:        amd79c30_padded_regs_t *regs;
                    113:        void            *audio_status;  /* for upcalls */
                    114:        struct mapreg   sc_map;         /* MAP status */
                    115:        /*
                    116:         * keep track of levels so we don't have to convert back from
                    117:         * MAP gain constants
                    118:         */
                    119:        int     sc_rlevel;              /* record level */
                    120:        int     sc_plevel;              /* play level */
                    121:        int     sc_mlevel;              /* monitor level */
                    122: } isdn_softc_t;
                    123: 
                    124: isdn_softc_t   isdn_softc_data[NISDN];
                    125: isdn_softc_t   *isdn_softc[NISDN];
                    126: 
                    127: private int audio_default_level = 150;
                    128: 
                    129: 
                    130: /*
                    131:  * Forward decls
                    132:  */
                    133: audio_switch_t isdn_ops;
                    134: 
                    135: private void isdn_init( isdn_softc_t *sc );
                    136: 
                    137: private void isdn_set_mmr2(
                    138:                register amd79c30_padded_regs_t *regs,
                    139:                register int                    mmr2);
                    140: 
                    141: private void isdn_setgains(
                    142:                isdn_softc_t    *sc,
                    143:                int             pgain,
                    144:                int             rgain,
                    145:                int             mgain);
                    146: 
                    147: /*
                    148:  * Probe chip to see if it is there
                    149:  */
                    150: private isdn_probe(
                    151:        vm_offset_t     reg,
                    152:        struct bus_ctlr *ui)
                    153: {
                    154:        isdn_softc_t    *sc = &isdn_softc_data[ui->unit];
                    155: 
                    156:        isdn_softc[ui->unit] = sc;
                    157:        sc->regs = (amd79c30_padded_regs_t *)reg;
                    158: 
                    159:        return 1;
                    160: }
                    161: 
                    162: /*
                    163:  * Attach device to chip-indep driver(s)
                    164:  */
                    165: private void
                    166: isdn_attach(
                    167:        struct bus_device *ui)
                    168: {
                    169:        register isdn_softc_t   *sc = isdn_softc[ui->unit];
                    170:        register amd79c30_padded_regs_t *regs = sc->regs;
                    171: 
                    172:        /* disable interrupts */
                    173:        write_reg(regs->cr, AMDR_INIT);
                    174:        write_reg(regs->dr, AMD_INIT_PMS_ACTIVE | AMD_INIT_INT_DISABLE);
                    175: 
                    176:        /*
                    177:         * Initialize the mux unit.  We use MCR3 to route audio (MAP)
                    178:         * through channel Bb.  MCR1 and MCR2 are unused.
                    179:         * Setting the INT enable bit in MCR4 will generate an interrupt
                    180:         * on each converted audio sample.
                    181:         */
                    182:        write_reg(regs->cr, AMDR_MUX_1_4);
                    183:        write_reg(regs->dr, 0);
                    184:        write_reg(regs->dr, 0);
                    185:        write_reg(regs->dr, (AMD_MCRCHAN_BB << 4) | AMD_MCRCHAN_BA);
                    186:        write_reg(regs->dr, AMD_MCR4_INT_ENABLE);
                    187: 
                    188:        printf(" AMD 79C30A/79C32A");
                    189: 
                    190:        audio_attach( sc, &isdn_ops, &sc->audio_status );
                    191: }
                    192: 
                    193: /*
                    194:  * Chip re-initialization
                    195:  */
                    196: private void
                    197: isdn_init(
                    198:        isdn_softc_t    *sc)
                    199: {
                    200:        register amd79c30_padded_regs_t *regs;
                    201:        
                    202:        bzero((char *)&sc->sc_map, sizeof sc->sc_map);
                    203:        /* default to speaker */
                    204:        sc->sc_map.mr_mmr2 = AMD_MMR2_AINB | AMD_MMR2_LS;
                    205:        
                    206:        /* enable interrupts and set parameters established above */
                    207:        regs = sc->regs;
                    208:        isdn_set_mmr2 (regs, sc->sc_map.mr_mmr2);
                    209:        isdn_setgains (sc, audio_default_level, audio_default_level, 0);
                    210:        write_reg(regs->cr, AMDR_INIT);
                    211:        write_reg(regs->dr, AMD_INIT_PMS_ACTIVE);
                    212: }
                    213: 
                    214: /*
                    215:  * Chip shutdown
                    216:  */
                    217: private void
                    218: isdn_close(
                    219:        isdn_softc_t    *sc)
                    220: {
                    221:        register amd79c30_padded_regs_t *regs;
                    222: 
                    223:        regs = sc->regs;
                    224:        write_reg(regs->cr, AMDR_INIT);
                    225:        write_reg(regs->dr, AMD_INIT_PMS_ACTIVE | AMD_INIT_INT_DISABLE);
                    226: }
                    227: 
                    228: /*
                    229:  * Audio port selection
                    230:  */
                    231: private void
                    232: isdn_setport(
                    233:        isdn_softc_t    *sc,
                    234:        int             port)
                    235: {
                    236:        if (port == AUDIO_SPEAKER) {
                    237:                sc->sc_map.mr_mmr2 |= AMD_MMR2_LS;
                    238:                isdn_set_mmr2(sc->regs, sc->sc_map.mr_mmr2);
                    239:        } else if (port == AUDIO_HEADPHONE) {
                    240:                sc->sc_map.mr_mmr2 &=~ AMD_MMR2_LS;
                    241:                isdn_set_mmr2(sc->regs, sc->sc_map.mr_mmr2);
                    242:        }
                    243: }
                    244: 
                    245: private int
                    246: isdn_getport(
                    247:        isdn_softc_t    *sc)
                    248: {
                    249:        return (sc->sc_map.mr_mmr2 & AMD_MMR2_LS) ?
                    250:                AUDIO_SPEAKER : AUDIO_HEADPHONE;
                    251: }
                    252: 
                    253: /*
                    254:  * Volume control
                    255:  */
                    256: private void
                    257: isdn_setgains(
                    258:        isdn_softc_t    *sc,
                    259:        int             pgain,
                    260:        int             rgain,
                    261:        int             mgain)
                    262: {
                    263:        private void isdn_set_pgain(), isdn_set_rgain(), isdn_set_mgain();
                    264: 
                    265:        if (pgain != ~0)
                    266:                isdn_set_pgain(sc, pgain);
                    267:        if (rgain != ~0)
                    268:                isdn_set_rgain(sc, rgain);
                    269:        if (mgain != ~0)
                    270:                isdn_set_mgain(sc, mgain);
                    271: 
                    272: }
                    273: 
                    274: private void
                    275: isdn_getgains(
                    276:        isdn_softc_t    *sc,
                    277:        int             *pgain,
                    278:        int             *rgain,
                    279:        int             *mgain)
                    280: {
                    281:        *mgain = sc->sc_mlevel;
                    282:        *rgain = sc->sc_rlevel;
                    283:        *pgain = sc->sc_plevel;
                    284: }
                    285: 
                    286: 
                    287: /*
                    288:  * User control over MAP processor
                    289:  */
                    290: private io_return_t
                    291: isdn_setstate(
                    292:        isdn_softc_t    *sc,
                    293:        dev_flavor_t    flavor,
                    294:        register struct mapreg *map,
                    295:        natural_t       n_ints)
                    296: {
                    297:        register amd79c30_padded_regs_t *regs = sc->regs;
                    298:        register int i, v;
                    299:        spl_t s;
                    300: 
                    301:        /* Sun compat */
                    302:        if (flavor == AUDIOSETREG) {
                    303:                register struct audio_ioctl *a = (struct audio_ioctl *)map;
                    304:                s = splaudio();
                    305:                write_reg(regs->cr, (a->control >> 8) & 0xff);
                    306:                for (i = 0; i < (a->control & 0xff); i++) {
                    307:                    write_reg(regs->dr, a->data[i]);
                    308:                }
                    309:                splx(s);
                    310:                return D_SUCCESS;
                    311:        }
                    312: 
                    313:        if (flavor != AUDIO_SETMAP)
                    314:                return D_INVALID_OPERATION;
                    315: 
                    316:        if ((n_ints * sizeof(int)) < sizeof(*map))
                    317:                return D_INVALID_SIZE;
                    318: 
                    319:        bcopy(map, &sc->sc_map, sizeof(sc->sc_map));
                    320:        sc->sc_map.mr_mmr2 &= 0x7f;
                    321: 
                    322:        s = splaudio();
                    323:        write_reg(regs->cr, AMDR_MAP_1_10);
                    324:        for (i = 0; i < 8; i++) {
                    325:                v = map->mr_x[i];
                    326:                WAMD16(regs, v);
                    327:        }
                    328:        for (i = 0; i < 8; ++i) {
                    329:                v = map->mr_r[i];
                    330:                WAMD16(regs, v);
                    331:        }
                    332:        v = map->mr_gx; WAMD16(regs, v);
                    333:        v = map->mr_gr; WAMD16(regs, v);
                    334:        v = map->mr_ger; WAMD16(regs, v);
                    335:        v = map->mr_stgr; WAMD16(regs, v);
                    336:        v = map->mr_ftgr; WAMD16(regs, v);
                    337:        v = map->mr_atgr; WAMD16(regs, v);
                    338:        write_reg(regs->dr, map->mr_mmr1);
                    339:        write_reg(regs->dr, map->mr_mmr2);
                    340:        splx(s);
                    341:        return D_SUCCESS;
                    342: }
                    343: 
                    344: private io_return_t
                    345: isdn_getstate(
                    346:        isdn_softc_t    *sc,
                    347:        dev_flavor_t    flavor,
                    348:        register struct mapreg *map,
                    349:        natural_t       *count)
                    350: {
                    351:        register amd79c30_padded_regs_t *regs = sc->regs;
                    352:        spl_t s;
                    353:        int i;
                    354: 
                    355:        /* Sun compat */
                    356:        if (flavor == AUDIOGETREG) {
                    357:                register struct audio_ioctl *a = (struct audio_ioctl *)map;
                    358:                s = splaudio();
                    359:                write_reg(regs->cr, (a->control >> 8) & 0xff);
                    360:                for (i = 0; i < (a->control & 0xff); i++) {
                    361:                    read_reg(regs->dr,a->data[i]);
                    362:                }
                    363:                splx(s);
                    364:                *count = sizeof(*a) / sizeof(int);
                    365:                return D_SUCCESS;
                    366:        }
                    367: 
                    368:        if ( (*count * sizeof(int)) < sizeof(*map))
                    369:                return D_INVALID_SIZE;
                    370:        bcopy(&sc->sc_map, map, sizeof(sc->sc_map));
                    371:        *count = sizeof(*map) / sizeof(int);
                    372:        return D_SUCCESS;
                    373: }
                    374: 
                    375: 
                    376: 
                    377: /*
                    378:  * Set the mmr1 register and one other 16 bit register in the audio chip.
                    379:  * The other register is indicated by op and val.
                    380:  */
                    381: private void
                    382: isdn_set_mmr1(
                    383:        register amd79c30_padded_regs_t *regs,
                    384:        register int mmr1,
                    385:        register int op,
                    386:        register int val)
                    387: {
                    388:        register int s = splaudio();
                    389: 
                    390:        write_reg(regs->cr, AMDR_MAP_MMR1);
                    391:        write_reg(regs->dr, mmr1);
                    392:        write_reg(regs->cr, op);
                    393:        WAMD16(regs, val);
                    394:        splx(s);
                    395: }
                    396: 
                    397: /*
                    398:  * Set the mmr2 register.
                    399:  */
                    400: private void
                    401: isdn_set_mmr2(
                    402:        register amd79c30_padded_regs_t *regs,
                    403:        register int                    mmr2)
                    404: {
                    405:        register int s = splaudio();
                    406: 
                    407:        write_reg(regs->cr, AMDR_MAP_MMR2);
                    408:        write_reg(regs->dr, mmr2);
                    409:        splx(s);
                    410: }
                    411: 
                    412: /*
                    413:  * gx, gr & stg gains.  this table must contain 256 elements with
                    414:  * the 0th being "infinity" (the magic value 9008).  The remaining
                    415:  * elements match sun's gain curve (but with higher resolution):
                    416:  * -18 to 0dB in .16dB steps then 0 to 12dB in .08dB steps.
                    417:  */
                    418: private const unsigned short gx_coeff[256] = {
                    419:        0x9008, 0x8b7c, 0x8b51, 0x8b45, 0x8b42, 0x8b3b, 0x8b36, 0x8b33,
                    420:        0x8b32, 0x8b2a, 0x8b2b, 0x8b2c, 0x8b25, 0x8b23, 0x8b22, 0x8b22,
                    421:        0x9122, 0x8b1a, 0x8aa3, 0x8aa3, 0x8b1c, 0x8aa6, 0x912d, 0x912b,
                    422:        0x8aab, 0x8b12, 0x8aaa, 0x8ab2, 0x9132, 0x8ab4, 0x913c, 0x8abb,
                    423:        0x9142, 0x9144, 0x9151, 0x8ad5, 0x8aeb, 0x8a79, 0x8a5a, 0x8a4a,
                    424:        0x8b03, 0x91c2, 0x91bb, 0x8a3f, 0x8a33, 0x91b2, 0x9212, 0x9213,
                    425:        0x8a2c, 0x921d, 0x8a23, 0x921a, 0x9222, 0x9223, 0x922d, 0x9231,
                    426:        0x9234, 0x9242, 0x925b, 0x92dd, 0x92c1, 0x92b3, 0x92ab, 0x92a4,
                    427:        0x92a2, 0x932b, 0x9341, 0x93d3, 0x93b2, 0x93a2, 0x943c, 0x94b2,
                    428:        0x953a, 0x9653, 0x9782, 0x9e21, 0x9d23, 0x9cd2, 0x9c23, 0x9baa,
                    429:        0x9bde, 0x9b33, 0x9b22, 0x9b1d, 0x9ab2, 0xa142, 0xa1e5, 0x9a3b,
                    430:        0xa213, 0xa1a2, 0xa231, 0xa2eb, 0xa313, 0xa334, 0xa421, 0xa54b,
                    431:        0xada4, 0xac23, 0xab3b, 0xaaab, 0xaa5c, 0xb1a3, 0xb2ca, 0xb3bd,
                    432:        0xbe24, 0xbb2b, 0xba33, 0xc32b, 0xcb5a, 0xd2a2, 0xe31d, 0x0808,
                    433:        0x72ba, 0x62c2, 0x5c32, 0x52db, 0x513e, 0x4cce, 0x43b2, 0x4243,
                    434:        0x41b4, 0x3b12, 0x3bc3, 0x3df2, 0x34bd, 0x3334, 0x32c2, 0x3224,
                    435:        0x31aa, 0x2a7b, 0x2aaa, 0x2b23, 0x2bba, 0x2c42, 0x2e23, 0x25bb,
                    436:        0x242b, 0x240f, 0x231a, 0x22bb, 0x2241, 0x2223, 0x221f, 0x1a33,
                    437:        0x1a4a, 0x1acd, 0x2132, 0x1b1b, 0x1b2c, 0x1b62, 0x1c12, 0x1c32,
                    438:        0x1d1b, 0x1e71, 0x16b1, 0x1522, 0x1434, 0x1412, 0x1352, 0x1323,
                    439:        0x1315, 0x12bc, 0x127a, 0x1235, 0x1226, 0x11a2, 0x1216, 0x0a2a,
                    440:        0x11bc, 0x11d1, 0x1163, 0x0ac2, 0x0ab2, 0x0aab, 0x0b1b, 0x0b23,
                    441:        0x0b33, 0x0c0f, 0x0bb3, 0x0c1b, 0x0c3e, 0x0cb1, 0x0d4c, 0x0ec1,
                    442:        0x079a, 0x0614, 0x0521, 0x047c, 0x0422, 0x03b1, 0x03e3, 0x0333,
                    443:        0x0322, 0x031c, 0x02aa, 0x02ba, 0x02f2, 0x0242, 0x0232, 0x0227,
                    444:        0x0222, 0x021b, 0x01ad, 0x0212, 0x01b2, 0x01bb, 0x01cb, 0x01f6,
                    445:        0x0152, 0x013a, 0x0133, 0x0131, 0x012c, 0x0123, 0x0122, 0x00a2,
                    446:        0x011b, 0x011e, 0x0114, 0x00b1, 0x00aa, 0x00b3, 0x00bd, 0x00ba,
                    447:        0x00c5, 0x00d3, 0x00f3, 0x0062, 0x0051, 0x0042, 0x003b, 0x0033,
                    448:        0x0032, 0x002a, 0x002c, 0x0025, 0x0023, 0x0022, 0x001a, 0x0021,
                    449:        0x001b, 0x001b, 0x001d, 0x0015, 0x0013, 0x0013, 0x0012, 0x0012,
                    450:        0x000a, 0x000a, 0x0011, 0x0011, 0x000b, 0x000b, 0x000c, 0x000e,
                    451: };
                    452: 
                    453: /*
                    454:  * second stage play gain.
                    455:  */
                    456: private const unsigned short ger_coeff[] = {
                    457:        0x431f, /* 5. dB */
                    458:        0x331f, /* 5.5 dB */
                    459:        0x40dd, /* 6. dB */
                    460:        0x11dd, /* 6.5 dB */
                    461:        0x440f, /* 7. dB */
                    462:        0x411f, /* 7.5 dB */
                    463:        0x311f, /* 8. dB */
                    464:        0x5520, /* 8.5 dB */
                    465:        0x10dd, /* 9. dB */
                    466:        0x4211, /* 9.5 dB */
                    467:        0x410f, /* 10. dB */
                    468:        0x111f, /* 10.5 dB */
                    469:        0x600b, /* 11. dB */
                    470:        0x00dd, /* 11.5 dB */
                    471:        0x4210, /* 12. dB */
                    472:        0x110f, /* 13. dB */
                    473:        0x7200, /* 14. dB */
                    474:        0x2110, /* 15. dB */
                    475:        0x2200, /* 15.9 dB */
                    476:        0x000b, /* 16.9 dB */
                    477:        0x000f  /* 18. dB */
                    478: #define NGER (sizeof(ger_coeff) / sizeof(ger_coeff[0]))
                    479: };
                    480: 
                    481: private void
                    482: isdn_set_rgain(
                    483:        register isdn_softc_t   *sc,
                    484:        register int            level)
                    485: {
                    486:        level &= 0xff;
                    487:        sc->sc_rlevel = level;
                    488:        sc->sc_map.mr_mmr1 |= AMD_MMR1_GX;
                    489:        sc->sc_map.mr_gx = gx_coeff[level];
                    490:        isdn_set_mmr1(sc->regs, sc->sc_map.mr_mmr1,
                    491:                      AMDR_MAP_GX, sc->sc_map.mr_gx);
                    492: }
                    493: 
                    494: private void
                    495: isdn_set_pgain(
                    496:        register isdn_softc_t   *sc,
                    497:        register int            level)
                    498: {
                    499:        register int gi, s;
                    500:        register amd79c30_padded_regs_t *regs;
                    501: 
                    502:        level &= 0xff;
                    503:        sc->sc_plevel = level;
                    504:        sc->sc_map.mr_mmr1 |= AMD_MMR1_GER|AMD_MMR1_GR;
                    505:        level *= 256 + NGER;
                    506:        level >>= 8;
                    507:        if (level >= 256) {
                    508:                gi = level - 256;
                    509:                level = 255;
                    510:        } else
                    511:                gi = 0;
                    512:        sc->sc_map.mr_ger = ger_coeff[gi];
                    513:        sc->sc_map.mr_gr = gx_coeff[level];
                    514: 
                    515:        regs = sc->regs;
                    516:        s = splaudio();
                    517:        write_reg(regs->cr, AMDR_MAP_MMR1);
                    518:        write_reg(regs->dr, sc->sc_map.mr_mmr1);
                    519:        write_reg(regs->cr, AMDR_MAP_GR);
                    520:        gi =  sc->sc_map.mr_gr;
                    521:        WAMD16(regs, gi);
                    522:        write_reg(regs->cr, AMDR_MAP_GER);
                    523:        gi =  sc->sc_map.mr_ger;
                    524:        WAMD16(regs, gi);
                    525:        splx(s);
                    526: }
                    527: 
                    528: private void
                    529: isdn_set_mgain(
                    530:        register isdn_softc_t   *sc,
                    531:        register int            level)
                    532: {
                    533:        level &= 0xff;
                    534:        sc->sc_mlevel = level;
                    535:        sc->sc_map.mr_mmr1 |= AMD_MMR1_STG;
                    536:        sc->sc_map.mr_stgr = gx_coeff[level];
                    537:        isdn_set_mmr1(sc->regs, sc->sc_map.mr_mmr1,
                    538:                      AMDR_MAP_STG, sc->sc_map.mr_stgr);
                    539: }
                    540: 
                    541: /*
                    542:  * Interrupt routine
                    543:  */
                    544: #if    old
                    545: isdn_intr (unit, spllevel)
                    546:        spl_t   spllevel;
                    547: {
                    548: #ifdef MAXINE
                    549:        xine_enable_interrupt(7, 0, 0);
                    550: #endif
                    551: #ifdef FLAMINGO
                    552:        kn15aa_enable_interrupt(12, 0, 0);
                    553: #endif
                    554:        printf("ISDN interrupt");
                    555: }
                    556: #else
                    557: isdn_intr (unit, spllevel)
                    558:        spl_t   spllevel;
                    559: {
                    560:        isdn_softc_t    *sc = isdn_softc[unit];
                    561:        amd79c30_padded_regs_t *regs = sc->regs;
                    562:        register int i;
                    563:        unsigned int c;
                    564: 
                    565:        read_reg(regs->ir, i); mb();    /* clear interrupt, now */
                    566: #if mips
                    567:        splx(spllevel);         /* drop priority */
                    568: #endif
                    569: 
                    570: #if 0
                    571:        if (..this is an audio interrupt..)
                    572: #endif
                    573:        {
                    574:                read_reg(regs->bbrb, c);
                    575:                if (audio_hwintr(sc->audio_status, c, &c))
                    576:                        write_reg(regs->bbtb, c);
                    577:        }
                    578: }
                    579: #endif
                    580: 
                    581: 
                    582: 
                    583: /*
                    584:  *  Standard operations vector
                    585:  */
                    586: audio_switch_t isdn_ops = {
                    587:        isdn_init,
                    588:        isdn_close,
                    589:        isdn_setport,
                    590:        isdn_getport,
                    591:        isdn_setgains,
                    592:        isdn_getgains,
                    593:        isdn_setstate,
                    594:        isdn_getstate
                    595: };
                    596: 
                    597: #if 1
                    598: write_an_int(int *where, int what) { *where = what;}
                    599: read_an_int(int *where) { return *where;}
                    600: #endif
                    601: 
                    602: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.