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

Annotation of sys/arch/armish/dev/i80321_mainbus.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: i80321_mainbus.c,v 1.10 2006/09/15 23:36:11 drahn Exp $ */
        !             2: /*     $NetBSD: i80321_mainbus.c,v 1.16 2005/12/15 01:44:00 briggs Exp $ */
        !             3:
        !             4: /*
        !             5:  * Copyright (c) 2001, 2002 Wasabi Systems, Inc.
        !             6:  * All rights reserved.
        !             7:  *
        !             8:  * Written by Jason R. Thorpe for Wasabi Systems, Inc.
        !             9:  *
        !            10:  * Redistribution and use in source and binary forms, with or without
        !            11:  * modification, are permitted provided that the following conditions
        !            12:  * are met:
        !            13:  * 1. Redistributions of source code must retain the above copyright
        !            14:  *    notice, this list of conditions and the following disclaimer.
        !            15:  * 2. Redistributions in binary form must reproduce the above copyright
        !            16:  *    notice, this list of conditions and the following disclaimer in the
        !            17:  *    documentation and/or other materials provided with the distribution.
        !            18:  * 3. All advertising materials mentioning features or use of this software
        !            19:  *    must display the following acknowledgement:
        !            20:  *     This product includes software developed for the NetBSD Project by
        !            21:  *     Wasabi Systems, Inc.
        !            22:  * 4. The name of Wasabi Systems, Inc. may not be used to endorse
        !            23:  *    or promote products derived from this software without specific prior
        !            24:  *    written permission.
        !            25:  *
        !            26:  * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
        !            27:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
        !            28:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
        !            29:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
        !            30:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
        !            31:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
        !            32:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
        !            33:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
        !            34:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
        !            35:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            36:  * POSSIBILITY OF SUCH DAMAGE.
        !            37:  */
        !            38:
        !            39: /*
        !            40:  * IQ80321 front-end for the i80321 I/O Processor.  We take care
        !            41:  * of setting up the i80321 memory map, PCI interrupt routing, etc.,
        !            42:  * which are all specific to the board the i80321 is wired up to.
        !            43:  */
        !            44:
        !            45: #include <sys/param.h>
        !            46: #include <sys/systm.h>
        !            47: #include <sys/device.h>
        !            48: #include <sys/gpio.h>
        !            49:
        !            50: #include <machine/bus.h>
        !            51:
        !            52: #include <arm/mainbus/mainbus.h>
        !            53: #include <armish/dev/iq80321reg.h>
        !            54: #include <armish/dev/iq80321var.h>
        !            55:
        !            56: #include <arm/xscale/i80321reg.h>
        !            57: #include <arm/xscale/i80321var.h>
        !            58:
        !            59: #include <dev/pci/pcireg.h>
        !            60: #include <dev/pci/pcidevs.h>
        !            61: #include <dev/gpio/gpiovar.h>
        !            62:
        !            63: #include "gpio.h"
        !            64:
        !            65: int    i80321_mainbus_match(struct device *, void *, void *);
        !            66: void   i80321_mainbus_attach(struct device *, struct device *, void *);
        !            67:
        !            68: void i80321_gpio_init (struct i80321_softc *sc);
        !            69: int i80321_gpio_pin_read (void *, int);
        !            70: void i80321_gpio_pin_write (void *, int, int);
        !            71: void i80321_gpio_pin_ctl (void *, int, int);
        !            72:
        !            73: /* XXX */
        !            74: #define I80219_REG_GPOE        0x7C4
        !            75: #define I80219_REG_GPID 0x7C8
        !            76: #define I80219_REG_GPOD 0x7CC
        !            77:
        !            78: struct cfattach iopxs_mainbus_ca = {
        !            79:        sizeof(struct i80321_softc), i80321_mainbus_match,
        !            80:        i80321_mainbus_attach
        !            81: };
        !            82:
        !            83: struct cfdriver iopxs_cd = {
        !            84:        NULL, "iopxs", DV_DULL
        !            85: };
        !            86:
        !            87:
        !            88: /* There can be only one. */
        !            89: int    i80321_mainbus_found;
        !            90:
        !            91: int
        !            92: i80321_mainbus_match(struct device *parent, void *match, void *aux)
        !            93: {
        !            94:        struct mainbus_attach_args *ma = aux;
        !            95:        struct cfdata *cf = match;
        !            96:
        !            97:        if (i80321_mainbus_found)
        !            98:                return (0);
        !            99:
        !           100:        if (strcmp(cf->cf_driver->cd_name, ma->ma_name) == 0)
        !           101:                return (1);
        !           102:
        !           103:        return (0);
        !           104: }
        !           105:
        !           106: /* XXX */
        !           107: bus_space_handle_t sc_pld_sh;
        !           108:
        !           109: void
        !           110: i80321_mainbus_attach(struct device *parent, struct device *self, void *aux)
        !           111: {
        !           112:        struct i80321_softc *sc = (void *) self;
        !           113:         struct gpiobus_attach_args gba;
        !           114:        pcireg_t b0u, b0l, b1u, b1l;
        !           115:        paddr_t memstart;
        !           116:        psize_t memsize;
        !           117:        pcireg_t atumembase;
        !           118:        pcireg_t atuiobase;
        !           119:
        !           120:        i80321_mainbus_found = 1;
        !           121:
        !           122:        /*
        !           123:         * Fill in the space tag for the i80321's own devices,
        !           124:         * and hand-craft the space handle for it (the device
        !           125:         * was mapped during early bootstrap).
        !           126:         */
        !           127:        i80321_bs_init(&i80321_bs_tag, sc);
        !           128:        sc->sc_st = &i80321_bs_tag;
        !           129:        if (bus_space_map(sc->sc_st, VERDE_PMMR_BASE, VERDE_PMMR_SIZE, 0,
        !           130:            &sc->sc_sh))
        !           131:                panic("%s: unable to map VERDE registers", sc->sc_dev.dv_xname);
        !           132:
        !           133:        /*
        !           134:         * Slice off a subregion for the Memory Controller -- we need it
        !           135:         * here in order read the memory size.
        !           136:         */
        !           137:        if (bus_space_subregion(sc->sc_st, sc->sc_sh, VERDE_MCU_BASE,
        !           138:            VERDE_MCU_SIZE, &sc->sc_mcu_sh))
        !           139:                panic("%s: unable to subregion MCU registers",
        !           140:                    sc->sc_dev.dv_xname);
        !           141:
        !           142:        if (bus_space_subregion(sc->sc_st, sc->sc_sh, VERDE_ATU_BASE,
        !           143:            VERDE_ATU_SIZE, &sc->sc_atu_sh))
        !           144:                panic("%s: unable to subregion ATU registers",
        !           145:                    sc->sc_dev.dv_xname);
        !           146:
        !           147:        if(bus_space_map(sc->sc_st, VERDE_OUT_XLATE_IO_WIN0_BASE,
        !           148:            VERDE_OUT_XLATE_IO_WIN_SIZE, 0, &sc->sc_io_sh))
        !           149:                panic("%s: unable to map IOW registers", sc->sc_dev.dv_xname);
        !           150:
        !           151: //     printf ("PIRSR %x\n", bus_space_read_4(sc->sc_st, sc->sc_sh, ICU_PIRSR));
        !           152:
        !           153: //     printf("mapping bus io to %x - %x\n", sc->sc_io_sh, sc->sc_io_sh+VERDE_OUT_XLATE_IO_WIN_SIZE);
        !           154:
        !           155:        /*
        !           156:         * Initialize the interrupt part of our PCI chipset tag.
        !           157:         */
        !           158:        iq80321_pci_init(&sc->sc_pci_chipset, sc);
        !           159:
        !           160:        /* Initialize the PCI chipset tag. */
        !           161:        i80321_pci_init(&sc->sc_pci_chipset, sc);
        !           162:
        !           163:        iq80321_pci_init2(&sc->sc_pci_chipset, sc);
        !           164:
        !           165:        atumembase = bus_space_read_4(sc->sc_st, sc->sc_atu_sh,
        !           166:            PCI_MAPREG_START + 0x08);
        !           167:        atuiobase = bus_space_read_4(sc->sc_st, sc->sc_atu_sh,
        !           168:            ATU_OIOWTVR);
        !           169:
        !           170:        sc->sc_membus_space.bus_base = PCI_MAPREG_MEM_ADDR(atumembase);
        !           171:        sc->sc_membus_space.bus_size = 0x04000000;
        !           172:        sc->sc_iobus_space.bus_base = PCI_MAPREG_IO_ADDR(atuiobase);
        !           173:        sc->sc_iobus_space.bus_size = 0x00010000;
        !           174:        pci_addr_fixup(sc, 2/*XXX*/);
        !           175:
        !           176:        /*
        !           177:         * Check the configuration of the ATU to see if another BIOS
        !           178:         * has configured us.  If a PC BIOS didn't configure us, then:
        !           179:         *      IQ80321: BAR0 00000000.0000000c BAR1 is 00000000.8000000c.
        !           180:         *      IQ31244: BAR0 00000000.00000004 BAR1 is 00000000.0000000c.
        !           181:         * If a BIOS has configured us, at least one of those should be
        !           182:         * different.  This is pretty fragile, but it's not clear what
        !           183:         * would work better.
        !           184:         */
        !           185:        b0l = bus_space_read_4(sc->sc_st, sc->sc_atu_sh, PCI_MAPREG_START+0x0);
        !           186:        b0u = bus_space_read_4(sc->sc_st, sc->sc_atu_sh, PCI_MAPREG_START+0x4);
        !           187:        b1l = bus_space_read_4(sc->sc_st, sc->sc_atu_sh, PCI_MAPREG_START+0x8);
        !           188:        b1u = bus_space_read_4(sc->sc_st, sc->sc_atu_sh, PCI_MAPREG_START+0xc);
        !           189:        b0l &= PCI_MAPREG_MEM_ADDR_MASK;
        !           190:        b0u &= PCI_MAPREG_MEM_ADDR_MASK;
        !           191:        b1l &= PCI_MAPREG_MEM_ADDR_MASK;
        !           192:        b1u &= PCI_MAPREG_MEM_ADDR_MASK;
        !           193:
        !           194:        printf(": i80321 I/O Processor\n");
        !           195:
        !           196:        i80321_sdram_bounds(sc->sc_st, sc->sc_mcu_sh, &memstart, &memsize);
        !           197:
        !           198:        /*
        !           199:         * We set up the Inbound Windows as follows:
        !           200:         *
        !           201:         *      0       Access to i80321 PMMRs
        !           202:         *
        !           203:         *      1       Reserve space for private devices
        !           204:         *
        !           205:         *      2       RAM access
        !           206:         *
        !           207:         *      3       Unused.
        !           208:         *
        !           209:         * This chunk needs to be customized for each IOP321 application.
        !           210:         */
        !           211:
        !           212:        atumembase = bus_space_read_4(sc->sc_st, sc->sc_atu_sh,
        !           213:            PCI_MAPREG_START + 0x08);
        !           214:
        !           215:        if (atumembase == 0x8000000c) {
        !           216:                /* iodata: intel std config */
        !           217:
        !           218:                /* map device registers */
        !           219:                sc->sc_iwin[0].iwin_base_lo =   0x00000004;
        !           220:                sc->sc_iwin[0].iwin_base_hi =   0x00000000;
        !           221:                sc->sc_iwin[0].iwin_xlate =     0xff000000;
        !           222:                sc->sc_iwin[0].iwin_size =      0x01000000;
        !           223:
        !           224:                /* Map PCI:Local 1:1. */
        !           225:                sc->sc_iwin[1].iwin_base_lo = VERDE_OUT_XLATE_MEM_WIN0_BASE |
        !           226:                    PCI_MAPREG_MEM_PREFETCHABLE_MASK |
        !           227:                    PCI_MAPREG_MEM_TYPE_64BIT;
        !           228:                sc->sc_iwin[1].iwin_base_hi = 0;
        !           229:
        !           230:                sc->sc_iwin[1].iwin_xlate = VERDE_OUT_XLATE_MEM_WIN0_BASE;
        !           231:                sc->sc_iwin[1].iwin_size = VERDE_OUT_XLATE_MEM_WIN_SIZE;
        !           232:
        !           233:
        !           234:                sc->sc_iwin[2].iwin_base_lo = memstart |
        !           235:                    PCI_MAPREG_MEM_PREFETCHABLE_MASK |
        !           236:                    PCI_MAPREG_MEM_TYPE_64BIT;
        !           237:                sc->sc_iwin[2].iwin_base_hi = 0;
        !           238:
        !           239:                sc->sc_iwin[2].iwin_xlate = memstart;
        !           240:                sc->sc_iwin[2].iwin_size = memsize;
        !           241:
        !           242:                sc->sc_iwin[3].iwin_base_lo = 0;
        !           243: #if 0
        !           244:                    PCI_MAPREG_MEM_PREFETCHABLE_MASK |
        !           245:                    PCI_MAPREG_MEM_TYPE_64BIT;
        !           246: #endif
        !           247:
        !           248:                sc->sc_iwin[3].iwin_base_hi = 0;
        !           249:                sc->sc_iwin[3].iwin_xlate = 0;
        !           250:                sc->sc_iwin[3].iwin_size = 0;
        !           251:
        !           252:                /*
        !           253:                 * We set up the Outbound Windows as follows:
        !           254:                 *
        !           255:                 *      0       Access to private PCI space.
        !           256:                 *
        !           257:                 *      1       Unused.
        !           258:                 */
        !           259:                sc->sc_owin[0].owin_xlate_lo =
        !           260:                    PCI_MAPREG_MEM_ADDR(sc->sc_iwin[1].iwin_base_lo);
        !           261:                sc->sc_owin[0].owin_xlate_hi = sc->sc_iwin[1].iwin_base_hi;
        !           262:
        !           263:                /*
        !           264:                 * Set the Secondary Outbound I/O window to map
        !           265:                 * to PCI address 0 for all 64K of the I/O space.
        !           266:                 */
        !           267:                sc->sc_ioout_xlate = 0x90000000;
        !           268:                sc->sc_ioout_xlate_offset = 0x1000;
        !           269:        } else if (atumembase == 0x40000004) {
        !           270:                /* thecus */
        !           271:
        !           272:                /* dont map device registers */
        !           273:                sc->sc_iwin[0].iwin_base_lo = 0;
        !           274:                sc->sc_iwin[0].iwin_base_hi = 0;
        !           275:                sc->sc_iwin[0].iwin_xlate = 0;
        !           276:                sc->sc_iwin[0].iwin_size = 0;
        !           277:
        !           278:                /* Map PCI:Local 1:1. */
        !           279:                sc->sc_iwin[1].iwin_base_lo = 0x40000000 |
        !           280:        #if 0
        !           281:                    PCI_MAPREG_MEM_PREFETCHABLE_MASK |
        !           282:                    PCI_MAPREG_MEM_TYPE_64BIT;
        !           283:        #else
        !           284:                    0;
        !           285:        #endif
        !           286:                sc->sc_iwin[1].iwin_base_hi = 0;
        !           287:
        !           288:                sc->sc_iwin[1].iwin_xlate = 0;
        !           289:                sc->sc_iwin[1].iwin_size = 0x08000000;
        !           290:
        !           291:                sc->sc_iwin[2].iwin_base_lo = 0 |
        !           292:                    PCI_MAPREG_MEM_PREFETCHABLE_MASK |
        !           293:                    PCI_MAPREG_MEM_TYPE_64BIT;
        !           294:                sc->sc_iwin[2].iwin_base_hi = 0;
        !           295:
        !           296:                sc->sc_iwin[2].iwin_xlate = memstart;
        !           297:                sc->sc_iwin[2].iwin_size = memsize;
        !           298:
        !           299:                sc->sc_iwin[3].iwin_base_lo = 0;
        !           300:                sc->sc_iwin[3].iwin_base_hi = 0;
        !           301:                sc->sc_iwin[3].iwin_xlate = 0;
        !           302:                sc->sc_iwin[3].iwin_size = 0;
        !           303:
        !           304:                /*
        !           305:                 * We set up the Outbound Windows as follows:
        !           306:                 *
        !           307:                 *      0       Access to private PCI space.
        !           308:                 *
        !           309:                 *      1       Unused.
        !           310:                 */
        !           311:                sc->sc_owin[0].owin_xlate_lo =
        !           312:                    PCI_MAPREG_MEM_ADDR(sc->sc_iwin[1].iwin_base_lo);
        !           313:                sc->sc_owin[0].owin_xlate_hi = sc->sc_iwin[1].iwin_base_hi;
        !           314:
        !           315:                /*
        !           316:                 * Set the Secondary Outbound I/O window to map
        !           317:                 * to PCI address 0 for all 64K of the I/O space.
        !           318:                 */
        !           319:                sc->sc_ioout_xlate = 0x90000000;
        !           320:                sc->sc_ioout_xlate_offset = 0x1000;
        !           321:
        !           322:        }
        !           323:
        !           324:        i80321_attach(sc);
        !           325:
        !           326:        i80321_gpio_init (sc);
        !           327:
        !           328:        /* if 80219 */ {
        !           329:                gba.gba_name = "gpio";
        !           330:                gba.gba_gc = &sc->sc_gpio_gc;
        !           331:                gba.gba_pins = sc->sc_gpio_pins;
        !           332:                gba.gba_npins = I80219_GPIO_NPINS;
        !           333: #if NGPIO > 0
        !           334:                config_found(&sc->sc_dev, &gba, gpiobus_print);
        !           335: #endif
        !           336:        }
        !           337:        {
        !           338: #define I80321_PLD 0xfe8d0000UL
        !           339: #define I80321_PLD_SIZE 0x1000
        !           340:
        !           341: #define        PLD_LED         0
        !           342: #define        PLD_PLED        1
        !           343: #define        PLD_BTN         2
        !           344: #define        PLD_INTEN       3
        !           345: #define        PLD_PWRMNG      4
        !           346:
        !           347: #if 0
        !           348:        uint8_t val;
        !           349: #endif
        !           350:
        !           351:                if (bus_space_map(sc->sc_st, I80321_PLD, I80321_PLD_SIZE, 0,
        !           352:                    /* &sc->sc_pld_sh */ &sc_pld_sh))
        !           353:                        panic("%s: unable to map PLD registers",
        !           354:                            sc->sc_dev.dv_xname);
        !           355:
        !           356: #if 0
        !           357:                printf("dlectl %x\n", bus_space_read_1(sc->sc_st, sc_pld_sh,
        !           358:                    PLD_LED));
        !           359:                val = bus_space_read_1(sc->sc_st, sc_pld_sh, PLD_LED);
        !           360:                val |= 0x3;
        !           361:                bus_space_write_1(sc->sc_st, sc_pld_sh, PLD_LED, val);
        !           362:                printf("dlectl %x\n", bus_space_read_1(sc->sc_st, sc_pld_sh,
        !           363:                    PLD_PLED));
        !           364:                printf("dlectl %x\n", bus_space_read_1(sc->sc_st, sc_pld_sh,
        !           365:                    PLD_BTN));
        !           366: #endif
        !           367:        }
        !           368:        {
        !           369:                extern struct cfdriver pcaled_cd;
        !           370:                void pcaled_gpio_pin_write(void *arg, int pin, int value);
        !           371:                if (pcaled_cd.cd_ndevs > 0 && pcaled_cd.cd_devs[0] != NULL) {
        !           372:                        pcaled_gpio_pin_write(pcaled_cd.cd_devs[0], 13, 0);
        !           373:                        pcaled_gpio_pin_write(pcaled_cd.cd_devs[0], 14, 0);
        !           374:                }
        !           375:        }
        !           376: }
        !           377:
        !           378: void
        !           379: i80321_gpio_init (struct i80321_softc *sc)
        !           380: {
        !           381:        int i;
        !           382:        for (i = 0; i < I80219_GPIO_NPINS; i++) {
        !           383:                sc->sc_gpio_pins[i].pin_num = i;
        !           384:                sc->sc_gpio_pins[i].pin_caps = GPIO_PIN_INPUT | GPIO_PIN_OUTPUT;
        !           385:
        !           386:                sc->sc_gpio_pins[i].pin_flags =
        !           387:                    bus_space_read_4(sc->sc_st, sc->sc_sh, I80219_REG_GPOE) &
        !           388:                    (1 << i) ? GPIO_PIN_INPUT :  GPIO_PIN_OUTPUT;
        !           389:                sc->sc_gpio_pins[i].pin_state = i80321_gpio_pin_read(sc, i) ?
        !           390:                    GPIO_PIN_HIGH : GPIO_PIN_LOW;
        !           391:        }
        !           392:        sc->sc_gpio_gc.gp_cookie = sc;
        !           393:        sc->sc_gpio_gc.gp_pin_read = i80321_gpio_pin_read;
        !           394:        sc->sc_gpio_gc.gp_pin_write = i80321_gpio_pin_write;
        !           395:        sc->sc_gpio_gc.gp_pin_ctl = i80321_gpio_pin_ctl;
        !           396: }
        !           397:
        !           398: int
        !           399: i80321_gpio_pin_read (void *arg, int pin)
        !           400: {
        !           401:        struct i80321_softc *sc = arg;
        !           402:        u_int32_t regval;
        !           403:        int reg;
        !           404:
        !           405:        if (bus_space_read_4(sc->sc_st, sc->sc_sh, I80219_REG_GPOE)
        !           406:            & (1 << pin)) {
        !           407:                reg = I80219_REG_GPID;
        !           408:        } else {
        !           409:                reg = I80219_REG_GPOD;
        !           410:        }
        !           411:        regval =  bus_space_read_4(sc->sc_st, sc->sc_sh, reg);
        !           412: #if 0
        !           413:        printf("read %x gpio %x\n", reg);
        !           414:        printf("gpio state %x %x %x\n",
        !           415:            bus_space_read_4(sc->sc_st, sc->sc_sh, I80219_REG_GPID),
        !           416:            bus_space_read_4(sc->sc_st, sc->sc_sh, I80219_REG_GPOD),
        !           417:            bus_space_read_4(sc->sc_st, sc->sc_sh, I80219_REG_GPOE));
        !           418: #endif
        !           419:        return ((regval >> pin) & 1);
        !           420: }
        !           421:
        !           422: void
        !           423: i80321_gpio_pin_write (void *arg, int pin, int value)
        !           424: {
        !           425:        struct i80321_softc *sc = arg;
        !           426:        u_int32_t regval;
        !           427:
        !           428:        regval =  bus_space_read_4(sc->sc_st, sc->sc_sh, I80219_REG_GPOD);
        !           429:        regval = (regval & ~(1 << pin)) | ((value & 1) << pin);
        !           430: #if 0
        !           431:        printf("writing %x to gpioO %x\n", regval);
        !           432: #endif
        !           433:        bus_space_write_4(sc->sc_st, sc->sc_sh, I80219_REG_GPOD, regval);
        !           434: }
        !           435: void
        !           436: i80321_gpio_pin_ctl (void *arg, int pin, int flags)
        !           437: {
        !           438:        struct i80321_softc *sc = arg;
        !           439:        u_int32_t regval;
        !           440:        int value = (flags == GPIO_PIN_INPUT) ? 1 : 0;
        !           441:
        !           442:        regval =  bus_space_read_4(sc->sc_st, sc->sc_sh, I80219_REG_GPOE);
        !           443:        regval = (regval & ~(1 << pin)) | ((value & 1) << pin);
        !           444: #if 0
        !           445:        printf("writing %x to ctl %x\n", regval, value);
        !           446: #endif
        !           447:        bus_space_write_4(sc->sc_st, sc->sc_sh, I80219_REG_GPOE, regval);
        !           448: }
        !           449:
        !           450:
        !           451: void board_reset(void); /* XXX */
        !           452: void
        !           453: board_reset()
        !           454: {
        !           455:        struct i80321_softc *sc = i80321_softc;
        !           456:        uint32_t val;
        !           457:
        !           458:        printf("attempting reset\n");
        !           459:        val = bus_space_read_4(sc->sc_st, sc->sc_sh, 0x7CC);
        !           460:        val &=  ~0x10;
        !           461:        bus_space_write_4(sc->sc_st, sc->sc_sh, 0x7CC, val);
        !           462:        val = bus_space_read_4(sc->sc_st, sc->sc_sh, 0x7C4);
        !           463:        val &=  ~0x10;
        !           464:        bus_space_write_4(sc->sc_st, sc->sc_sh, 0x7C4, val);
        !           465:
        !           466:        bus_space_write_1(sc->sc_st, sc_pld_sh, PLD_PWRMNG, 0x2);
        !           467:
        !           468: }
        !           469:
        !           470: void board_powerdown(void); /* XXX */
        !           471: void
        !           472: board_powerdown(void)
        !           473: {
        !           474:        void pcaled_gpio_pin_write(void *arg, int pin, int value);
        !           475:        extern struct cfdriver pcaled_cd;
        !           476:
        !           477:        if (pcaled_cd.cd_ndevs > 0 && pcaled_cd.cd_devs[0] != NULL) {
        !           478:                pcaled_gpio_pin_write(pcaled_cd.cd_devs[0], 8, 1);
        !           479:                delay(500000);
        !           480:        }
        !           481: }

CVSweb