[BACK]Return to apio.c CVS log [TXT][DIR] Up to [local] / sys / dev / sbus

Annotation of sys/dev/sbus/apio.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: apio.c,v 1.7 2003/06/27 01:50:52 jason Exp $  */
        !             2:
        !             3: /*
        !             4:  * Copyright (c) 2002 Jason L. Wright (jason@thought.net)
        !             5:  * All rights reserved.
        !             6:  *
        !             7:  * Redistribution and use in source and binary forms, with or without
        !             8:  * modification, are permitted provided that the following conditions
        !             9:  * are met:
        !            10:  * 1. Redistributions of source code must retain the above copyright
        !            11:  *    notice, this list of conditions and the following disclaimer.
        !            12:  * 2. Redistributions in binary form must reproduce the above copyright
        !            13:  *    notice, this list of conditions and the following disclaimer in the
        !            14:  *    documentation and/or other materials provided with the distribution.
        !            15:  *
        !            16:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            17:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
        !            18:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
        !            19:  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
        !            20:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
        !            21:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
        !            22:  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            23:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
        !            24:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
        !            25:  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            26:  * POSSIBILITY OF SUCH DAMAGE.
        !            27:  *
        !            28:  * Effort sponsored in part by the Defense Advanced Research Projects
        !            29:  * Agency (DARPA) and Air Force Research Laboratory, Air Force
        !            30:  * Materiel Command, USAF, under agreement number F30602-01-2-0537.
        !            31:  *
        !            32:  */
        !            33:
        !            34: /*
        !            35:  * Driver for Aurora 210SJ parallel ports.
        !            36:  */
        !            37:
        !            38: #include <sys/types.h>
        !            39: #include <sys/param.h>
        !            40: #include <sys/systm.h>
        !            41: #include <sys/kernel.h>
        !            42: #include <sys/device.h>
        !            43: #include <sys/conf.h>
        !            44: #include <sys/timeout.h>
        !            45: #include <sys/tty.h>
        !            46:
        !            47: #include <machine/bus.h>
        !            48: #include <machine/autoconf.h>
        !            49: #include <machine/openfirm.h>
        !            50:
        !            51: #include <dev/sbus/sbusvar.h>
        !            52: #include <dev/sbus/asioreg.h>
        !            53: #include <dev/ic/lptvar.h>
        !            54: #include "apio.h"
        !            55: #include "lpt.h"
        !            56:
        !            57: struct apio_softc {
        !            58:        struct device           sc_dev;
        !            59:        bus_space_tag_t         sc_bt;
        !            60:        bus_space_handle_t      sc_csr_h;
        !            61:        bus_space_handle_t      sc_clk_h;
        !            62:        bus_space_handle_t      sc_lpt_h;
        !            63:        void                    *sc_ih;
        !            64:        struct device           *sc_port;
        !            65: };
        !            66:
        !            67: struct apio_attach_args {
        !            68:        char *aaa_name;
        !            69:        bus_space_tag_t aaa_iot;
        !            70:        bus_space_handle_t aaa_ioh;
        !            71:        bus_space_handle_t aaa_clkh;
        !            72:        u_int32_t aaa_pri;
        !            73:        u_int8_t aaa_inten;
        !            74: };
        !            75:
        !            76: int    apio_match(struct device *, void *, void *);
        !            77: void   apio_attach(struct device *, struct device *, void *);
        !            78: int    apio_print(void *, const char *);
        !            79: void   apio_intr_enable(struct device *, u_int8_t);
        !            80:
        !            81: struct cfattach apio_ca = {
        !            82:        sizeof(struct apio_softc), apio_match, apio_attach
        !            83: };
        !            84:
        !            85: struct cfdriver apio_cd = {
        !            86:        NULL, "apio", DV_DULL
        !            87: };
        !            88:
        !            89: int
        !            90: apio_match(struct device *parent, void *match, void *aux)
        !            91: {
        !            92:        struct sbus_attach_args *sa = aux;
        !            93:
        !            94:        if (strcmp(sa->sa_name, "pio1") == 0)
        !            95:                return (1);
        !            96:        return (0);
        !            97: }
        !            98:
        !            99: void
        !           100: apio_attach(struct device *parent, struct device *self, void *aux)
        !           101: {
        !           102:        struct apio_softc *sc = (void *)self;
        !           103:        struct sbus_attach_args *sa = aux;
        !           104:        struct apio_attach_args aaa;
        !           105:        char *model;
        !           106:
        !           107:        sc->sc_bt = sa->sa_bustag;
        !           108:
        !           109:        model = getpropstring(sa->sa_node, "model");
        !           110:        if (model == NULL) {
        !           111:                printf(": empty model, unsupported\n");
        !           112:                return;
        !           113:        }
        !           114:        if (strcmp(model, "210sj") != 0) {
        !           115:                printf(": unsupported model %s\n", model);
        !           116:                return;
        !           117:        }
        !           118:
        !           119:        if (sa->sa_nreg < 3) {
        !           120:                printf(": %d registers expected, got %d\n",
        !           121:                    3, sa->sa_nreg);
        !           122:                return;
        !           123:        }
        !           124:
        !           125:        if (sbus_bus_map(sa->sa_bustag, sa->sa_reg[0].sbr_slot,
        !           126:            sa->sa_reg[0].sbr_offset, sa->sa_reg[0].sbr_size,
        !           127:            0, 0, &sc->sc_csr_h)) {
        !           128:                printf(": couldn't map csr\n");
        !           129:                return;
        !           130:        }
        !           131:
        !           132:        if (sbus_bus_map(sa->sa_bustag, sa->sa_reg[1].sbr_slot,
        !           133:            sa->sa_reg[1].sbr_offset, sa->sa_reg[1].sbr_size,
        !           134:            0, 0, &sc->sc_clk_h)) {
        !           135:                printf(": couldn't map clk\n");
        !           136:                return;
        !           137:        }
        !           138:
        !           139:        if (sbus_bus_map(sa->sa_bustag, sa->sa_reg[2].sbr_slot,
        !           140:            sa->sa_reg[2].sbr_offset, sa->sa_reg[2].sbr_size,
        !           141:            0, 0, &sc->sc_lpt_h)) {
        !           142:                printf(": couldn't map clk\n");
        !           143:                return;
        !           144:        }
        !           145:
        !           146:        printf(": %s\n", model);
        !           147:
        !           148:        aaa.aaa_name = "lpt";
        !           149:        aaa.aaa_iot = sc->sc_bt;
        !           150:        aaa.aaa_ioh = sc->sc_lpt_h;
        !           151:        aaa.aaa_clkh = sc->sc_clk_h;
        !           152:        aaa.aaa_inten = ASIO_CSR_SJ_PAR_INTEN;
        !           153:        aaa.aaa_pri = sa->sa_intr[0].sbi_pri;
        !           154:        sc->sc_port = config_found(self, &aaa, apio_print);
        !           155: }
        !           156:
        !           157: int
        !           158: apio_print(void *aux, const char *name)
        !           159: {
        !           160:        struct apio_attach_args *aaa = aux;
        !           161:
        !           162:        if (name != NULL)
        !           163:                printf("%s at %s", aaa->aaa_name, name);
        !           164:        return (UNCONF);
        !           165: }
        !           166:
        !           167: #if NLPT_APIO > 0
        !           168: int    lpt_apio_match(struct device *, void *, void *);
        !           169: void   lpt_apio_attach(struct device *, struct device *, void *);
        !           170: int    lpt_apio_intr(void *);
        !           171:
        !           172: struct lpt_apio_softc {
        !           173:        struct lpt_softc sc_lpt;
        !           174:        bus_space_handle_t sc_clk_h;
        !           175:        void *sc_ih;
        !           176: };
        !           177:
        !           178: struct cfattach lpt_apio_ca = {
        !           179:        sizeof(struct lpt_apio_softc), lpt_apio_match, lpt_apio_attach
        !           180: };
        !           181:
        !           182: void
        !           183: apio_intr_enable(struct device *dv, u_int8_t en)
        !           184: {
        !           185:        struct apio_softc *sc = (struct apio_softc *)dv;
        !           186:        u_int8_t csr;
        !           187:
        !           188:        csr = bus_space_read_1(sc->sc_bt, sc->sc_csr_h, 0);
        !           189:        csr &= ~(ASIO_CSR_SBUS_INT7 | ASIO_CSR_SBUS_INT6);
        !           190:        csr |= ASIO_CSR_SBUS_INT5 | en;
        !           191:        bus_space_write_1(sc->sc_bt, sc->sc_csr_h, 0, csr);
        !           192: }
        !           193:
        !           194: int
        !           195: lpt_apio_match(struct device *parent, void *match, void *aux)
        !           196: {
        !           197:        return (1);
        !           198: }
        !           199:
        !           200: void
        !           201: lpt_apio_attach(struct device *parent, struct device *self, void *aux)
        !           202: {
        !           203:        struct lpt_apio_softc *sc = (struct lpt_apio_softc *)self;
        !           204:        struct apio_attach_args *aaa = aux;
        !           205:
        !           206:        sc->sc_lpt.sc_state = 0;
        !           207:        sc->sc_lpt.sc_iot = aaa->aaa_iot;
        !           208:        sc->sc_lpt.sc_ioh = aaa->aaa_ioh;
        !           209:        sc->sc_clk_h = aaa->aaa_clkh;
        !           210:        sc->sc_ih = bus_intr_establish(aaa->aaa_iot, aaa->aaa_pri,
        !           211:            IPL_TTY, 0, lpt_apio_intr, sc, self->dv_xname);
        !           212:        if (sc->sc_ih == NULL) {
        !           213:                printf(": cannot allocate intr\n");
        !           214:                return;
        !           215:        }
        !           216:        apio_intr_enable(parent, aaa->aaa_inten);
        !           217:
        !           218:        lpt_attach_common(&sc->sc_lpt);
        !           219: }
        !           220:
        !           221: int
        !           222: lpt_apio_intr(void *vsc)
        !           223: {
        !           224:        struct lpt_apio_softc *sc = vsc;
        !           225:        int r;
        !           226:
        !           227:        r = lptintr(&sc->sc_lpt);
        !           228:        bus_space_read_1(sc->sc_lpt.sc_iot, sc->sc_clk_h, 0);
        !           229:        return (r);
        !           230: }
        !           231: #endif

CVSweb