[BACK]Return to itesio_isa.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / dev / isa

Annotation of src/sys/dev/isa/itesio_isa.c, Revision 1.4.4.4

1.4.4.4 ! mjf         1: /*     $NetBSD: itesio_isa.c,v 1.8 2007/12/13 15:36:29 xtraeme Exp $ */
1.4.4.2   mjf         2: /*     Derived from $OpenBSD: it.c,v 1.19 2006/04/10 00:57:54 deraadt Exp $    */
                      3:
                      4: /*
                      5:  * Copyright (c) 2006-2007 Juan Romero Pardines <juan@xtrarom.org>
                      6:  * Copyright (c) 2003 Julien Bordet <zejames@greyhats.org>
                      7:  * All rights reserved.
                      8:  *
                      9:  * Redistribution and use in source and binary forms, with or without
                     10:  * modification, are permitted provided that the following conditions
                     11:  * are met:
                     12:  * 1. Redistributions of source code must retain the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer.
                     14:  * 2. Redistributions in binary form must reproduce the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer in the
                     16:  *    documentation and/or other materials provided with the distribution.
                     17:  *
                     18:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     19:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITD TO, THE IMPLIED WARRANTIES
                     20:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     21:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     22:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     23:  * NOT LIMITD TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     24:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     25:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     26:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     27:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     28:  */
                     29:
                     30: /*
                     31:  * Driver for the iTE IT87xxF Super I/O. Currently supporting
                     32:  * the Hardware monitor part in the Environmental Controller.
                     33:  */
                     34:
                     35: #include <sys/cdefs.h>
1.4.4.4 ! mjf        36: __KERNEL_RCSID(0, "$NetBSD: itesio_isa.c,v 1.8 2007/12/13 15:36:29 xtraeme Exp $");
1.4.4.2   mjf        37:
                     38: #include <sys/param.h>
                     39: #include <sys/kernel.h>
                     40: #include <sys/device.h>
                     41:
                     42: #include <sys/bus.h>
                     43:
                     44: #include <dev/isa/isareg.h>
                     45: #include <dev/isa/isavar.h>
                     46:
                     47: #include <dev/sysmon/sysmonvar.h>
                     48:
                     49: #include <dev/isa/itesio_isavar.h>
                     50:
                     51: #define IT_VOLTSTART_IDX       3       /* voltage start index */
                     52: #define IT_FANSTART_IDX        12      /* fan start index */
                     53:
                     54: #if defined(ITESIO_DEBUG)
                     55: #define DPRINTF(x)             do { printf x; } while (0)
                     56: #else
                     57: #define DPRINTF(x)
                     58: #endif
                     59:
                     60: /*
                     61:  * IT87-compatible chips can typically measure voltages up to 4.096 V.
                     62:  * To measure higher voltages the input is attenuated with (external)
                     63:  * resistors.  Negative voltages are measured using a reference
                     64:  * voltage.  So we have to convert the sensor values back to real
                     65:  * voltages by applying the appropriate resistor factor.
                     66:  */
                     67: #define RFACT_NONE     10000
                     68: #define RFACT(x, y)    (RFACT_NONE * ((x) + (y)) / (y))
                     69:
                     70: /* autoconf(9) functions */
                     71: static int     itesio_isa_match(device_t, struct cfdata *, void *);
                     72: static void    itesio_isa_attach(device_t, device_t, void *);
                     73: static int     itesio_isa_detach(device_t, int);
                     74:
                     75: CFATTACH_DECL_NEW(itesio, sizeof(struct itesio_softc),
                     76:     itesio_isa_match, itesio_isa_attach, itesio_isa_detach, NULL);
                     77:
                     78: /* driver functions */
                     79: static uint8_t itesio_ecreadreg(struct itesio_softc *, int);
                     80: static void    itesio_ecwritereg(struct itesio_softc *, int, int);
                     81: static uint8_t itesio_readreg(bus_space_tag_t, bus_space_handle_t, int);
                     82: static void    itesio_writereg(bus_space_tag_t, bus_space_handle_t, int, int);
                     83: static void    itesio_enter(bus_space_tag_t, bus_space_handle_t);
                     84: static void    itesio_exit(bus_space_tag_t, bus_space_handle_t);
                     85:
                     86: /* envsys(9) glue */
                     87: static void    itesio_setup_sensors(struct itesio_softc *);
                     88: static void    itesio_refresh_temp(struct itesio_softc *, envsys_data_t *);
                     89: static void    itesio_refresh_volts(struct itesio_softc *, envsys_data_t *);
                     90: static void    itesio_refresh_fans(struct itesio_softc *, envsys_data_t *);
                     91: static void    itesio_refresh(struct sysmon_envsys *, envsys_data_t *);
                     92:
                     93: /* rfact values for voltage sensors */
                     94: static const int itesio_vrfact[] = {
                     95:        RFACT_NONE,     /* VCORE_A      */
                     96:        RFACT_NONE,     /* VCORE_B      */
                     97:        RFACT_NONE,     /* +3.3V        */
                     98:        RFACT(68, 100), /* +5V          */
                     99:        RFACT(30, 10),  /* +12V         */
                    100:        RFACT(21, 10),  /* -12V         */
                    101:        RFACT(83, 20),  /* -5V          */
                    102:        RFACT(68, 100), /* STANDBY      */
                    103:        RFACT_NONE      /* VBAT         */
                    104: };
                    105:
                    106: static int
                    107: itesio_isa_match(device_t parent, struct cfdata *match, void *aux)
                    108: {
                    109:        struct isa_attach_args *ia = aux;
                    110:        bus_space_handle_t ioh;
                    111:        uint16_t cr;
                    112:
                    113:        /* Must supply an address */
                    114:        if (ia->ia_nio < 1)
                    115:                return 0;
                    116:
                    117:        if (ISA_DIRECT_CONFIG(ia))
                    118:                return 0;
                    119:
                    120:        if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT)
                    121:                return 0;
                    122:
                    123:        if (bus_space_map(ia->ia_iot, ia->ia_io[0].ir_addr, 2, 0, &ioh))
                    124:                return 0;
                    125:
                    126:        itesio_enter(ia->ia_iot, ioh);
                    127:        cr = (itesio_readreg(ia->ia_iot, ioh, ITESIO_CHIPID1) << 8);
                    128:        cr |= itesio_readreg(ia->ia_iot, ioh, ITESIO_CHIPID2);
                    129:        itesio_exit(ia->ia_iot, ioh);
                    130:        bus_space_unmap(ia->ia_iot, ioh, 2);
                    131:
                    132:        switch (cr) {
                    133:        case ITESIO_ID8705:
                    134:        case ITESIO_ID8712:
                    135:        case ITESIO_ID8716:
                    136:        case ITESIO_ID8718:
                    137:                ia->ia_nio = 1;
                    138:                ia->ia_io[0].ir_size = 2;
                    139:                ia->ia_niomem = 0;
                    140:                ia->ia_nirq = 0;
                    141:                ia->ia_ndrq = 0;
                    142:                return 1;
                    143:        default:
                    144:                return 0;
                    145:        }
                    146: }
                    147:
                    148: static void
                    149: itesio_isa_attach(device_t parent, device_t self, void *aux)
                    150: {
                    151:        struct itesio_softc *sc = device_private(self);
                    152:        struct isa_attach_args *ia = aux;
                    153:        bus_space_handle_t ioh;
                    154:        int i;
                    155:        uint8_t cr;
                    156:
                    157:        ia->ia_iot = sc->sc_iot;
                    158:
                    159:        if (bus_space_map(sc->sc_iot, ia->ia_io[0].ir_addr, 2, 0, &ioh)) {
                    160:                aprint_error(": can't map i/o space\n");
                    161:                return;
                    162:        }
1.4.4.3   mjf       163:
                    164:        aprint_naive("\n");
                    165:
1.4.4.2   mjf       166:        /*
                    167:         * Enter to the Super I/O MB PNP mode.
                    168:         */
                    169:        itesio_enter(ia->ia_iot, ioh);
                    170:        /*
                    171:         * Get info from the Super I/O Global Configuration Registers:
                    172:         * Chip IDs and Device Revision.
                    173:         */
                    174:        sc->sc_chipid = (itesio_readreg(ia->ia_iot, ioh, ITESIO_CHIPID1) << 8);
                    175:        sc->sc_chipid |= itesio_readreg(ia->ia_iot, ioh, ITESIO_CHIPID2);
                    176:        sc->sc_devrev = (itesio_readreg(ia->ia_iot, ioh, ITESIO_DEVREV) & 0x0f);
                    177:        /*
                    178:         * Select the EC LDN to get the Base Address.
                    179:         */
                    180:        itesio_writereg(ia->ia_iot, ioh, ITESIO_LDNSEL, ITESIO_EC_LDN);
                    181:        sc->sc_hwmon_baseaddr =
                    182:            (itesio_readreg(ia->ia_iot, ioh, ITESIO_EC_MSB) << 8);
                    183:        sc->sc_hwmon_baseaddr |= itesio_readreg(ia->ia_iot, ioh, ITESIO_EC_LSB);
                    184:        /*
                    185:         * We are done, exit MB PNP mode and unmap I/O space.
                    186:         */
                    187:        itesio_exit(ia->ia_iot, ioh);
                    188:        bus_space_unmap(sc->sc_iot, ioh, 2);
                    189:
                    190:        aprint_normal(": iTE IT%4xF Super I/O (rev %d)\n",
                    191:            sc->sc_chipid, sc->sc_devrev);
                    192:        aprint_normal_dev(self, "Hardware Monitor registers at 0x%x\n",
                    193:            sc->sc_hwmon_baseaddr);
                    194:
                    195:        if (bus_space_map(sc->sc_iot, sc->sc_hwmon_baseaddr, 8, 0,
                    196:            &sc->sc_ioh)) {
                    197:                aprint_error_dev(self, "cannot map hwmon i/o space\n");
                    198:                return;
                    199:        }
                    200:
                    201:        sc->sc_hwmon_mapped = true;
                    202:
                    203:        /* Activate monitoring */
                    204:        cr = itesio_ecreadreg(sc, ITESIO_EC_CONFIG);
                    205:        SET(cr, 0x01);
                    206:        itesio_ecwritereg(sc, ITESIO_EC_CONFIG, cr);
                    207:
                    208: #ifdef notyet
                    209:        /* Enable beep alarms */
                    210:        cr = itesio_ecreadreg(sc, ITESIO_EC_BEEPEER);
                    211:        SET(cr, 0x02);  /* Voltage exceeds limit */
                    212:        SET(cr, 0x04);  /* Temperature exceeds limit */
                    213:        itesio_ecwritereg(sc, ITESIO_EC_BEEPEER, cr);
                    214: #endif
                    215:
                    216:        /*
                    217:         * Initialize and attach sensors.
                    218:         */
                    219:        itesio_setup_sensors(sc);
                    220:        sc->sc_sme = sysmon_envsys_create();
                    221:        for (i = 0; i < IT_NUM_SENSORS; i++) {
                    222:                if (sysmon_envsys_sensor_attach(sc->sc_sme,
                    223:                                                &sc->sc_sensor[i])) {
                    224:                        sysmon_envsys_destroy(sc->sc_sme);
                    225:                        return;
                    226:                }
                    227:        }
                    228:        /*
                    229:         * Hook into the system monitor.
                    230:         */
                    231:        sc->sc_sme->sme_name = device_xname(self);
                    232:        sc->sc_sme->sme_cookie = sc;
                    233:        sc->sc_sme->sme_refresh = itesio_refresh;
                    234:
1.4.4.3   mjf       235:        if ((i = sysmon_envsys_register(sc->sc_sme))) {
                    236:                aprint_error_dev(self,
                    237:                    "unable to register with sysmon (%d)\n", i);
1.4.4.2   mjf       238:                sysmon_envsys_destroy(sc->sc_sme);
                    239:                bus_space_unmap(sc->sc_iot, sc->sc_ioh, 8);
1.4.4.3   mjf       240:                return;
1.4.4.2   mjf       241:        }
                    242:        sc->sc_hwmon_enabled = true;
1.4.4.4 ! mjf       243:        if (!pmf_device_register(self, NULL, NULL))
        !           244:                aprint_error_dev(self, "couldn't establish power handler\n");
1.4.4.2   mjf       245: }
                    246:
                    247: static int
                    248: itesio_isa_detach(device_t self, int flags)
                    249: {
                    250:        struct itesio_softc *sc = device_private(self);
                    251:
                    252:        if (sc->sc_hwmon_enabled)
                    253:                sysmon_envsys_unregister(sc->sc_sme);
                    254:        if (sc->sc_hwmon_mapped)
                    255:                bus_space_unmap(sc->sc_iot, sc->sc_ioh, 8);
                    256:        return 0;
                    257: }
                    258:
                    259: /*
                    260:  * Functions to read/write to the Environmental Controller.
                    261:  */
                    262: static uint8_t
                    263: itesio_ecreadreg(struct itesio_softc *sc, int reg)
                    264: {
                    265:        bus_space_write_1(sc->sc_iot, sc->sc_ioh, ITESIO_EC_ADDR, reg);
                    266:        return bus_space_read_1(sc->sc_iot, sc->sc_ioh, ITESIO_EC_DATA);
                    267: }
                    268:
                    269: static void
                    270: itesio_ecwritereg(struct itesio_softc *sc, int reg, int val)
                    271: {
                    272:        bus_space_write_1(sc->sc_iot, sc->sc_ioh, ITESIO_EC_ADDR, reg);
                    273:        bus_space_write_1(sc->sc_iot, sc->sc_ioh, ITESIO_EC_DATA, val);
                    274: }
                    275:
                    276: /*
                    277:  * Functions to enter/exit/read/write to the Super I/O.
                    278:  */
                    279: static uint8_t
                    280: itesio_readreg(bus_space_tag_t iot, bus_space_handle_t ioh, int reg)
                    281: {
                    282:        bus_space_write_1(iot, ioh, ITESIO_ADDR, reg);
                    283:        return bus_space_read_1(iot, ioh, ITESIO_DATA);
                    284: }
                    285:
                    286: static void
                    287: itesio_writereg(bus_space_tag_t iot, bus_space_handle_t ioh, int reg, int val)
                    288: {
                    289:        bus_space_write_1(iot, ioh, ITESIO_ADDR, reg);
                    290:        bus_space_write_1(iot, ioh, ITESIO_DATA, val);
                    291: }
                    292:
                    293: static void
                    294: itesio_enter(bus_space_tag_t iot, bus_space_handle_t ioh)
                    295: {
                    296:        bus_space_write_1(iot, ioh, ITESIO_ADDR, 0x87);
                    297:        bus_space_write_1(iot, ioh, ITESIO_ADDR, 0x01);
                    298:        bus_space_write_1(iot, ioh, ITESIO_ADDR, 0x55);
                    299:        bus_space_write_1(iot, ioh, ITESIO_ADDR, 0x55);
                    300: }
                    301:
                    302: static void
                    303: itesio_exit(bus_space_tag_t iot, bus_space_handle_t ioh)
                    304: {
                    305:        bus_space_write_1(iot, ioh, ITESIO_ADDR, 0x02);
                    306:        bus_space_write_1(iot, ioh, ITESIO_DATA, 0x02);
                    307: }
                    308:
                    309:
                    310: #define COPYDESCR(x, y)                                \
                    311:        do {                                    \
                    312:                strlcpy((x), (y), sizeof(x));   \
                    313:        } while (0)
                    314: /*
                    315:  * sysmon_envsys(9) glue.
                    316:  */
                    317: static void
                    318: itesio_setup_sensors(struct itesio_softc *sc)
                    319: {
                    320:        int i;
                    321:
                    322:        /* temperatures */
                    323:        for (i = 0; i < IT_VOLTSTART_IDX; i++)
                    324:                sc->sc_sensor[i].units = ENVSYS_STEMP;
                    325:
                    326:        COPYDESCR(sc->sc_sensor[0].desc, "CPU Temp");
                    327:        COPYDESCR(sc->sc_sensor[1].desc, "System Temp");
                    328:        COPYDESCR(sc->sc_sensor[2].desc, "Aux Temp");
                    329:
                    330:        /* voltages */
                    331:        for (i = IT_VOLTSTART_IDX; i < IT_FANSTART_IDX; i++) {
                    332:                sc->sc_sensor[i].units = ENVSYS_SVOLTS_DC;
                    333:                sc->sc_sensor[i].flags = ENVSYS_FCHANGERFACT;
                    334:        }
                    335:
                    336:        COPYDESCR(sc->sc_sensor[3].desc, "VCORE_A");
                    337:        COPYDESCR(sc->sc_sensor[4].desc, "VCORE_B");
                    338:        COPYDESCR(sc->sc_sensor[5].desc, "+3.3V");
                    339:        COPYDESCR(sc->sc_sensor[6].desc, "+5V");
                    340:        COPYDESCR(sc->sc_sensor[7].desc, "+12V");
                    341:        COPYDESCR(sc->sc_sensor[8].desc, "-12V");
                    342:        COPYDESCR(sc->sc_sensor[9].desc, "-5V");
                    343:        COPYDESCR(sc->sc_sensor[10].desc, "STANDBY");
                    344:        COPYDESCR(sc->sc_sensor[11].desc, "VBAT");
                    345:
                    346:        /* fans */
                    347:        for (i = IT_FANSTART_IDX; i < IT_NUM_SENSORS; i++)
                    348:                sc->sc_sensor[i].units = ENVSYS_SFANRPM;
                    349:
                    350:        COPYDESCR(sc->sc_sensor[12].desc, "CPU Fan");
                    351:        COPYDESCR(sc->sc_sensor[13].desc, "System Fan");
                    352:        COPYDESCR(sc->sc_sensor[14].desc, "Aux Fan");
                    353: }
                    354: #undef COPYDESCR
                    355:
                    356: static void
                    357: itesio_refresh_temp(struct itesio_softc *sc, envsys_data_t *edata)
                    358: {
                    359:        int sdata;
                    360:
                    361:        sdata = itesio_ecreadreg(sc, ITESIO_EC_SENSORTEMPBASE + edata->sensor);
                    362:        /* sensor is not connected or reporting invalid data */
                    363:        if (sdata == 0 || sdata >= 0xfa) {
                    364:                edata->state = ENVSYS_SINVALID;
                    365:                return;
                    366:        }
                    367:
                    368:        DPRINTF(("%s: sdata[temp%d] 0x%x\n", __func__, edata->sensor, sdata));
                    369:        /* Convert temperature to uK */
                    370:        edata->value_cur = sdata * 1000000 + 273150000;
                    371:        edata->state = ENVSYS_SVALID;
                    372: }
                    373:
                    374: static void
                    375: itesio_refresh_volts(struct itesio_softc *sc, envsys_data_t *edata)
                    376: {
                    377:        uint8_t vbatcr = 0;
                    378:        int i, sdata;
                    379:
                    380:        i = edata->sensor - IT_VOLTSTART_IDX;
                    381:
                    382:        sdata = itesio_ecreadreg(sc, ITESIO_EC_SENSORVOLTBASE + i);
                    383:        /* not connected */
                    384:        if (sdata == 0 || sdata == 0xff) {
                    385:                edata->state = ENVSYS_SINVALID;
                    386:                return;
                    387:        }
                    388:
                    389:        /*
                    390:         * update VBAT voltage reading every time we read it, to get
                    391:         * latest value.
                    392:         */
                    393:        if (i == 8) {
                    394:                vbatcr = itesio_ecreadreg(sc, ITESIO_EC_CONFIG);
                    395:                SET(vbatcr, ITESIO_EC_UPDATEVBAT);
                    396:                itesio_ecwritereg(sc, ITESIO_EC_CONFIG, vbatcr);
                    397:        }
                    398:
                    399:        DPRINTF(("%s: sdata[volt%d] 0x%x\n", __func__, i, sdata));
                    400:
                    401:        /* voltage returned as (mV << 4) */
                    402:        edata->value_cur = (sdata << 4);
                    403:        /* rfact is (factor * 10^4) */
                    404:        edata->value_cur *= itesio_vrfact[i];
                    405:
                    406:        if (edata->rfact)
                    407:                edata->value_cur += edata->rfact;
                    408:        else
                    409:                edata->rfact = itesio_vrfact[i];
                    410:
                    411:        /* division by 10 gets us back to uVDC */
                    412:        edata->value_cur /= 10;
                    413:        edata->state = ENVSYS_SVALID;
                    414: }
                    415:
                    416: static void
                    417: itesio_refresh_fans(struct itesio_softc *sc, envsys_data_t *edata)
                    418: {
                    419:        uint8_t mode = 0;
                    420:        uint16_t sdata = 0;
                    421:        int i, divisor, odivisor, ndivisor;
                    422:
                    423:        i = edata->sensor - IT_FANSTART_IDX;
                    424:        divisor = odivisor = ndivisor = 0;
                    425:
                    426:        if (sc->sc_chipid == ITESIO_ID8705 || sc->sc_chipid == ITESIO_ID8712) {
                    427:                /*
                    428:                 * Use the Fan Tachometer Divisor Register for
                    429:                 * IT8705F and IT8712F.
                    430:                 */
                    431:                divisor = odivisor = ndivisor =
                    432:                    itesio_ecreadreg(sc, ITESIO_EC_FAN_TDR);
                    433:                sdata = itesio_ecreadreg(sc, ITESIO_EC_SENSORFANBASE + i);
                    434:                if (sdata == 0xff) {
                    435:                        edata->state = ENVSYS_SINVALID;
                    436:                        if (i == 2)
                    437:                                ndivisor |= 0x40;
                    438:                        else {
                    439:                                ndivisor &= ~(7 << (i * 3));
                    440:                                ndivisor |= ((divisor + 1) & 7) << (i * 3);
                    441:                        }
                    442:                } else {
                    443:                        if (i == 2)
                    444:                                divisor = divisor & 1 ? 3 : 1;
                    445:
                    446:                        if ((sdata << (divisor & 7)) == 0)
                    447:                                edata->state = ENVSYS_SINVALID;
                    448:                        else {
                    449:                                edata->value_cur =
                    450:                                    1350000 / (sdata << (divisor & 7));
                    451:                                edata->state = ENVSYS_SVALID;
                    452:                        }
                    453:                }
                    454:                DPRINTF(("%s: 8bit sdata[fan%d] 0x%x div: 0x%x\n", __func__,
                    455:                    i, sdata, divisor));
                    456:                if (ndivisor != odivisor)
                    457:                        itesio_ecwritereg(sc, ITESIO_EC_FAN_TDR, ndivisor);
                    458:        } else {
                    459:                mode = itesio_ecreadreg(sc, ITESIO_EC_FAN16_CER);
                    460:                sdata = itesio_ecreadreg(sc, ITESIO_EC_SENSORFANBASE + i);
                    461:                if (mode & (1 << i))
                    462:                        sdata += (itesio_ecreadreg(sc,
                    463:                            ITESIO_EC_SENSORFANEXTBASE + i) << 8);
                    464:                edata->state = ENVSYS_SVALID;
                    465:                if (sdata == 0 ||
                    466:                    sdata == ((mode & (1 << i)) ? 0xffff : 0xff))
                    467:                        edata->state = ENVSYS_SINVALID;
                    468:                else {
                    469:                        edata->value_cur = 1350000 / 2 / sdata;
                    470:                        edata->state = ENVSYS_SVALID;
                    471:                }
                    472:                DPRINTF(("%s: 16bit sdata[fan%d] 0x%x\n", __func__, i, sdata));
                    473:        }
                    474: }
                    475:
                    476: static void
                    477: itesio_refresh(struct sysmon_envsys *sme, struct envsys_data *edata)
                    478: {
                    479:        struct itesio_softc *sc = sme->sme_cookie;
                    480:
                    481:        if (edata->sensor < IT_VOLTSTART_IDX)
                    482:                itesio_refresh_temp(sc, edata);
                    483:        else if (edata->sensor >= IT_VOLTSTART_IDX &&
                    484:                 edata->sensor < IT_FANSTART_IDX)
                    485:                itesio_refresh_volts(sc, edata);
                    486:        else
                    487:                itesio_refresh_fans(sc, edata);
                    488: }

CVSweb <webmaster@jp.NetBSD.org>