[BACK]Return to auxio.c CVS log [TXT][DIR] Up to [local] / sys / arch / sparc64 / dev

Annotation of sys/arch/sparc64/dev/auxio.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: auxio.c,v 1.7 2005/03/09 18:41:48 miod Exp $  */
                      2: /*     $NetBSD: auxio.c,v 1.1 2000/04/15 03:08:13 mrg Exp $    */
                      3:
                      4: /*
                      5:  * Copyright (c) 2000 Matthew R. Green
                      6:  * All rights reserved.
                      7:  *
                      8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  * 3. The name of the author may not be used to endorse or promote products
                     17:  *    derived from this software without specific prior written permission.
                     18:  *
                     19:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     20:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     21:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     22:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     23:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
                     24:  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
                     25:  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
                     26:  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
                     27:  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     28:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     29:  * SUCH DAMAGE.
                     30:  */
                     31:
                     32: /*
                     33:  * AUXIO registers support on the sbus & ebus2.
                     34:  */
                     35:
                     36: #include <sys/param.h>
                     37: #include <sys/systm.h>
                     38: #include <sys/errno.h>
                     39: #include <sys/device.h>
                     40: #include <sys/timeout.h>
                     41: #include <sys/kernel.h>
                     42:
                     43: #include <machine/autoconf.h>
                     44: #include <machine/cpu.h>
                     45:
                     46: #include <sparc64/dev/ebusreg.h>
                     47: #include <sparc64/dev/ebusvar.h>
                     48: #include <sparc64/dev/sbusvar.h>
                     49: #include <sparc64/dev/auxioreg.h>
                     50: #include <sparc64/dev/auxiovar.h>
                     51:
                     52: #define        AUXIO_ROM_NAME          "auxio"
                     53:
                     54: /*
                     55:  * ebus code.
                     56:  */
                     57: int    auxio_ebus_match(struct device *, void *, void *);
                     58: void   auxio_ebus_attach(struct device *, struct device *, void *);
                     59: int    auxio_sbus_match(struct device *, void *, void *);
                     60: void   auxio_sbus_attach(struct device *, struct device *, void *);
                     61: void   auxio_attach_common(struct auxio_softc *);
                     62:
                     63: struct cfattach auxio_ebus_ca = {
                     64:        sizeof(struct auxio_softc), auxio_ebus_match, auxio_ebus_attach
                     65: };
                     66:
                     67: struct cfattach auxio_sbus_ca = {
                     68:        sizeof(struct auxio_softc), auxio_sbus_match, auxio_sbus_attach
                     69: };
                     70:
                     71: struct cfdriver auxio_cd = {
                     72:        NULL, "auxio", DV_DULL
                     73: };
                     74:
                     75: void auxio_led_blink(void *, int);
                     76:
                     77: int
                     78: auxio_ebus_match(parent, cf, aux)
                     79:        struct device *parent;
                     80:        void *cf;
                     81:        void *aux;
                     82: {
                     83:        struct ebus_attach_args *ea = aux;
                     84:
                     85:        return (strcmp(AUXIO_ROM_NAME, ea->ea_name) == 0);
                     86: }
                     87:
                     88: void
                     89: auxio_ebus_attach(parent, self, aux)
                     90:        struct device *parent, *self;
                     91:        void *aux;
                     92: {
                     93:        struct auxio_softc *sc = (struct auxio_softc *)self;
                     94:        struct ebus_attach_args *ea = aux;
                     95:
                     96:        if (ea->ea_nregs < 1 || ea->ea_nvaddrs < 1) {
                     97:                printf(": no registers??\n");
                     98:                return;
                     99:        }
                    100:
                    101:        sc->sc_tag = ea->ea_memtag;
                    102:
                    103:        if (ea->ea_nregs != 5 || ea->ea_nvaddrs != 5) {
                    104:                printf(": not 5 (%d) registers, only setting led",
                    105:                    ea->ea_nregs);
                    106:                sc->sc_flags = AUXIO_LEDONLY|AUXIO_EBUS;
                    107:        } else {
                    108:                sc->sc_flags = AUXIO_EBUS;
                    109:                if (bus_space_map(sc->sc_tag, ea->ea_vaddrs[2],
                    110:                    sizeof(u_int32_t), BUS_SPACE_MAP_PROMADDRESS,
                    111:                    &sc->sc_freq)) {
                    112:                        printf(": unable to map freq\n");
                    113:                        return;
                    114:                }
                    115:                if (bus_space_map(sc->sc_tag, ea->ea_vaddrs[3],
                    116:                    sizeof(u_int32_t), BUS_SPACE_MAP_PROMADDRESS,
                    117:                    &sc->sc_scsi)) {
                    118:                        printf(": unable to map SCSI\n");
                    119:                        return;
                    120:                }
                    121:                if (bus_space_map(sc->sc_tag, ea->ea_vaddrs[4],
                    122:                    sizeof(u_int32_t), BUS_SPACE_MAP_PROMADDRESS,
                    123:                    &sc->sc_temp)) {
                    124:                        printf(": unable to map temp\n");
                    125:                        return;
                    126:                }
                    127:        }
                    128:
                    129:        if (bus_space_map(sc->sc_tag, ea->ea_vaddrs[0], sizeof(u_int32_t),
                    130:            BUS_SPACE_MAP_PROMADDRESS, &sc->sc_led)) {
                    131:                printf(": unable to map LED\n");
                    132:                return;
                    133:        }
                    134:
                    135:        auxio_attach_common(sc);
                    136: }
                    137:
                    138: int
                    139: auxio_sbus_match(parent, cf, aux)
                    140:        struct device *parent;
                    141:        void *cf;
                    142:        void *aux;
                    143: {
                    144:        struct sbus_attach_args *sa = aux;
                    145:
                    146:        return (strcmp(AUXIO_ROM_NAME, sa->sa_name) == 0);
                    147: }
                    148:
                    149: void
                    150: auxio_sbus_attach(parent, self, aux)
                    151:        struct device *parent, *self;
                    152:        void *aux;
                    153: {
                    154:        struct auxio_softc *sc = (struct auxio_softc *)self;
                    155:        struct sbus_attach_args *sa = aux;
                    156:
                    157:        sc->sc_tag = sa->sa_bustag;
                    158:
                    159:        if (sa->sa_nreg < 1 || sa->sa_npromvaddrs < 1) {
                    160:                printf(": no registers??\n");
                    161:                return;
                    162:        }
                    163:
                    164:        if (sa->sa_nreg != 1 || sa->sa_npromvaddrs != 1) {
                    165:                printf(": not 1 (%d/%d) registers??", sa->sa_nreg, sa->sa_npromvaddrs);
                    166:                return;
                    167:        }
                    168:
                    169:        /* sbus auxio only has one set of registers */
                    170:        sc->sc_flags = AUXIO_LEDONLY|AUXIO_SBUS;
                    171:        if (bus_space_map(sc->sc_tag, sa->sa_promvaddr, 1,
                    172:            BUS_SPACE_MAP_PROMADDRESS, &sc->sc_led)) {
                    173:                printf(": couldn't map registers\n");
                    174:                return;
                    175:        }
                    176:
                    177:        auxio_attach_common(sc);
                    178: }
                    179:
                    180: void
                    181: auxio_attach_common(sc)
                    182:        struct auxio_softc *sc;
                    183: {
                    184:        sc->sc_blink.bl_func = auxio_led_blink;
                    185:        sc->sc_blink.bl_arg = sc;
                    186:        blink_led_register(&sc->sc_blink);
                    187:        printf("\n");
                    188: }
                    189:
                    190: void
                    191: auxio_led_blink(void *vsc, int on)
                    192: {
                    193:        struct auxio_softc *sc = vsc;
                    194:        u_int32_t led;
                    195:        int s;
                    196:
                    197:        s = splhigh();
                    198:
                    199:        if (sc->sc_flags & AUXIO_EBUS)
                    200:                led = letoh32(bus_space_read_4(sc->sc_tag, sc->sc_led, 0));
                    201:        else
                    202:                led = bus_space_read_1(sc->sc_tag, sc->sc_led, 0);
                    203:
                    204:        if (on)
                    205:                led |= AUXIO_LED_LED;
                    206:        else
                    207:                led &= ~AUXIO_LED_LED;
                    208:
                    209:        if (sc->sc_flags & AUXIO_EBUS)
                    210:                bus_space_write_4(sc->sc_tag, sc->sc_led, 0, htole32(led));
                    211:        else
                    212:                bus_space_write_1(sc->sc_tag, sc->sc_led, 0, led);
                    213:
                    214:        splx(s);
                    215: }
                    216:
                    217: int
                    218: auxio_fd_control(u_int32_t bits)
                    219: {
                    220:        struct auxio_softc *sc;
                    221:        u_int32_t led;
                    222:
                    223:        if (auxio_cd.cd_ndevs == 0) {
                    224:                return ENXIO;
                    225:        }
                    226:
                    227:        /*
                    228:         * XXX This does not handle > 1 auxio correctly.
                    229:         * We'll assume the floppy drive is tied to first auxio found.
                    230:         */
                    231:        sc = (struct auxio_softc *)auxio_cd.cd_devs[0];
                    232:        if (sc->sc_flags & AUXIO_EBUS)
                    233:                led = letoh32(bus_space_read_4(sc->sc_tag, sc->sc_led, 0));
                    234:        else
                    235:                led = bus_space_read_1(sc->sc_tag, sc->sc_led, 0);
                    236:
                    237:        led = (led & ~AUXIO_LED_FLOPPY_MASK) | bits;
                    238:
                    239:        if (sc->sc_flags & AUXIO_EBUS)
                    240:                bus_space_write_4(sc->sc_tag, sc->sc_led, 0, htole32(led));
                    241:        else
                    242:                bus_space_write_1(sc->sc_tag, sc->sc_led, 0, led);
                    243:
                    244:        return 0;
                    245: }

CVSweb