Module Name: src Committed By: nonaka Date: Sat Jul 3 04:44:16 UTC 2021
Modified Files: src/sys/dev/isa: itesio_isa.c itesio_isavar.h Log Message: itesio(4): Added IT8625E support. To generate a diff of this commit: cvs rdiff -u -r1.28 -r1.29 src/sys/dev/isa/itesio_isa.c cvs rdiff -u -r1.13 -r1.14 src/sys/dev/isa/itesio_isavar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/isa/itesio_isa.c diff -u src/sys/dev/isa/itesio_isa.c:1.28 src/sys/dev/isa/itesio_isa.c:1.29 --- src/sys/dev/isa/itesio_isa.c:1.28 Tue Jul 23 09:38:53 2019 +++ src/sys/dev/isa/itesio_isa.c Sat Jul 3 04:44:16 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: itesio_isa.c,v 1.28 2019/07/23 09:38:53 msaitoh Exp $ */ +/* $NetBSD: itesio_isa.c,v 1.29 2021/07/03 04:44:16 nonaka Exp $ */ /* Derived from $OpenBSD: it.c,v 1.19 2006/04/10 00:57:54 deraadt Exp $ */ /* @@ -34,13 +34,14 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: itesio_isa.c,v 1.28 2019/07/23 09:38:53 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: itesio_isa.c,v 1.29 2021/07/03 04:44:16 nonaka Exp $"); #include <sys/param.h> #include <sys/kernel.h> #include <sys/device.h> #include <sys/module.h> #include <sys/bus.h> +#include <sys/kmem.h> #include <dev/isa/isareg.h> #include <dev/isa/isavar.h> @@ -52,6 +53,11 @@ __KERNEL_RCSID(0, "$NetBSD: itesio_isa.c #define IT_VOLTSTART_IDX 3 /* voltage start index */ #define IT_FANSTART_IDX 12 /* fan start index */ +/* IT8625: 3 temps, 10 volts, 6 fans */ +#define IT8625_NUM_SENSORS 19 +#define IT8625_VOLTSTART_IDX 3 /* voltage start index */ +#define IT8625_FANSTART_IDX 13 /* fan start index */ + #if defined(ITESIO_DEBUG) #define DPRINTF(x) do { printf x; } while (0) #else @@ -90,6 +96,13 @@ static void itesio_refresh_temp(struct i static void itesio_refresh_volts(struct itesio_softc *, envsys_data_t *); static void itesio_refresh_fans(struct itesio_softc *, envsys_data_t *); static void itesio_refresh(struct sysmon_envsys *, envsys_data_t *); +static void itesio_refresh_it8705_fans(struct itesio_softc *, + envsys_data_t *); +static void itesio_setup_it8625_sensors(struct itesio_softc *); +static void itesio_refresh_it8625_volts(struct itesio_softc *, + envsys_data_t *); +static void itesio_refresh_it8625_fans(struct itesio_softc *, + envsys_data_t *); /* sysmon_wdog glue */ static bool itesio_wdt_suspend(device_t, const pmf_qual_t *); @@ -109,11 +122,58 @@ static const int itesio_vrfact[] = { RFACT_NONE /* VBAT */ }; +static const struct itesio_config itesio_config[] = { + { + .chipid = ITESIO_ID8625, + .no_wdt = true, + .num_sensors = IT8625_NUM_SENSORS, + .voltstart_idx = IT8625_VOLTSTART_IDX, + .fanstart_idx = IT8625_FANSTART_IDX, + .setup_sensors = itesio_setup_it8625_sensors, + .refresh_volts = itesio_refresh_it8625_volts, + .refresh_fans = itesio_refresh_it8625_fans, + }, + { .chipid = ITESIO_ID8628, }, + { .chipid = ITESIO_ID8655, }, + { + .chipid = ITESIO_ID8705, + .no_wdt = true, + .refresh_fans = itesio_refresh_it8705_fans, + }, + { + .chipid = ITESIO_ID8712, + .refresh_fans = itesio_refresh_it8705_fans, + }, + { .chipid = ITESIO_ID8716, }, + { .chipid = ITESIO_ID8718, }, + { .chipid = ITESIO_ID8720, }, + { .chipid = ITESIO_ID8721, }, + { .chipid = ITESIO_ID8726, }, + { .chipid = ITESIO_ID8728, }, + { .chipid = ITESIO_ID8771, }, + { .chipid = ITESIO_ID8772, }, +}; + +static const struct itesio_config * +itesio_isa_find_config(uint16_t chipid) +{ + const struct itesio_config *ic; + size_t i; + + for (i = 0; i < __arraycount(itesio_config); i++) { + ic = &itesio_config[i]; + if (chipid == ic->chipid) + return ic; + } + return NULL; +} + static int itesio_isa_match(device_t parent, cfdata_t match, void *aux) { struct isa_attach_args *ia = aux; bus_space_handle_t ioh; + const struct itesio_config *ic; uint16_t cr; /* Must supply an address */ @@ -135,28 +195,16 @@ itesio_isa_match(device_t parent, cfdata itesio_exit(ia->ia_iot, ioh); bus_space_unmap(ia->ia_iot, ioh, 2); - switch (cr) { - case ITESIO_ID8628: - case ITESIO_ID8655: - case ITESIO_ID8705: - case ITESIO_ID8712: - case ITESIO_ID8716: - case ITESIO_ID8718: - case ITESIO_ID8720: - case ITESIO_ID8721: - case ITESIO_ID8726: - case ITESIO_ID8728: - case ITESIO_ID8771: - case ITESIO_ID8772: - ia->ia_nio = 1; - ia->ia_io[0].ir_size = 2; - ia->ia_niomem = 0; - ia->ia_nirq = 0; - ia->ia_ndrq = 0; - return 1; - default: + ic = itesio_isa_find_config(cr); + if (ic == NULL) return 0; - } + + ia->ia_nio = 1; + ia->ia_io[0].ir_size = 2; + ia->ia_niomem = 0; + ia->ia_nirq = 0; + ia->ia_ndrq = 0; + return 1; } static void @@ -164,7 +212,9 @@ itesio_isa_attach(device_t parent, devic { struct itesio_softc *sc = device_private(self); struct isa_attach_args *ia = aux; - int i; + const struct itesio_config *ic; + uint32_t i; + int error; uint8_t cr; sc->sc_iot = ia->ia_iot; @@ -205,6 +255,27 @@ itesio_isa_attach(device_t parent, devic */ itesio_exit(sc->sc_iot, sc->sc_pnp_ioh); + ic = itesio_isa_find_config(sc->sc_chipid); + if (ic == NULL) { + aprint_error(": unknown chipid: %04x", sc->sc_chipid); + goto out2; + } + sc->sc_config = *ic; + if (sc->sc_config.num_sensors == 0) + sc->sc_config.num_sensors = IT_NUM_SENSORS; + if (sc->sc_config.voltstart_idx == 0) + sc->sc_config.voltstart_idx = IT_VOLTSTART_IDX; + if (sc->sc_config.fanstart_idx == 0) + sc->sc_config.fanstart_idx = IT_FANSTART_IDX; + if (sc->sc_config.setup_sensors == NULL) + sc->sc_config.setup_sensors = itesio_setup_sensors; + if (sc->sc_config.refresh_temp == NULL) + sc->sc_config.refresh_temp = itesio_refresh_temp; + if (sc->sc_config.refresh_volts == NULL) + sc->sc_config.refresh_volts = itesio_refresh_volts; + if (sc->sc_config.refresh_fans == NULL) + sc->sc_config.refresh_fans = itesio_refresh_fans; + aprint_normal(": iTE IT%4xF Super I/O (rev %d)\n", sc->sc_chipid, sc->sc_devrev); aprint_normal_dev(self, "Hardware Monitor registers at 0x%x\n", @@ -234,9 +305,9 @@ itesio_isa_attach(device_t parent, devic /* * Initialize and attach sensors. */ - itesio_setup_sensors(sc); + (*sc->sc_config.setup_sensors)(sc); sc->sc_sme = sysmon_envsys_create(); - for (i = 0; i < IT_NUM_SENSORS; i++) { + for (i = 0; i < sc->sc_config.num_sensors; i++) { if (sysmon_envsys_sensor_attach(sc->sc_sme, &sc->sc_sensor[i])) { sysmon_envsys_destroy(sc->sc_sme); @@ -250,9 +321,9 @@ itesio_isa_attach(device_t parent, devic sc->sc_sme->sme_cookie = sc; sc->sc_sme->sme_refresh = itesio_refresh; - if ((i = sysmon_envsys_register(sc->sc_sme))) { + if ((error = sysmon_envsys_register(sc->sc_sme))) { aprint_error_dev(self, - "unable to register with sysmon (%d)\n", i); + "unable to register with sysmon (%d)\n", error); sysmon_envsys_destroy(sc->sc_sme); goto out; } @@ -261,8 +332,8 @@ itesio_isa_attach(device_t parent, devic if (!pmf_device_register(self, NULL, NULL)) aprint_error_dev(self, "couldn't establish power handler\n"); - /* The IT8705 doesn't support the WDT */ - if (sc->sc_chipid == ITESIO_ID8705) + /* Some chips don't support the WDT */ + if (sc->sc_config.no_wdt) goto out2; /* @@ -307,6 +378,11 @@ itesio_isa_detach(device_t self, int fla bus_space_unmap(sc->sc_iot, sc->sc_pnp_ioh, 2); } + if (sc->sc_sensor != NULL) { + kmem_free(sc->sc_sensor, + sizeof(sc->sc_sensor[0]) * sc->sc_config.num_sensors); + } + return 0; } @@ -380,24 +456,46 @@ itesio_exit(bus_space_tag_t iot, bus_spa * sysmon_envsys(9) glue. */ static void -itesio_setup_sensors(struct itesio_softc *sc) +itesio_setup_sensors_common(struct itesio_softc *sc) { - int i; + const struct itesio_config *ic = &sc->sc_config; + size_t allocsz; + uint32_t i; + + allocsz = sizeof(sc->sc_sensor[0]) * ic->num_sensors; + sc->sc_sensor = kmem_zalloc(allocsz, KM_SLEEP); /* temperatures */ - for (i = 0; i < IT_VOLTSTART_IDX; i++) + for (i = 0; i < ic->voltstart_idx; i++) sc->sc_sensor[i].units = ENVSYS_STEMP; - COPYDESCR(sc->sc_sensor[0].desc, "CPU Temp"); - COPYDESCR(sc->sc_sensor[1].desc, "System Temp"); - COPYDESCR(sc->sc_sensor[2].desc, "Aux Temp"); - /* voltages */ - for (i = IT_VOLTSTART_IDX; i < IT_FANSTART_IDX; i++) { + for (i = ic->voltstart_idx; i < ic->fanstart_idx; i++) { sc->sc_sensor[i].units = ENVSYS_SVOLTS_DC; sc->sc_sensor[i].flags = ENVSYS_FCHANGERFACT; } + /* fans */ + for (i = ic->fanstart_idx; i < ic->num_sensors; i++) + sc->sc_sensor[i].units = ENVSYS_SFANRPM; + + /* all */ + for (i = 0; i < ic->num_sensors; i++) + sc->sc_sensor[i].state = ENVSYS_SINVALID; +} + +static void +itesio_setup_sensors(struct itesio_softc *sc) +{ + + itesio_setup_sensors_common(sc); + + /* temperatures */ + COPYDESCR(sc->sc_sensor[0].desc, "CPU Temp"); + COPYDESCR(sc->sc_sensor[1].desc, "System Temp"); + COPYDESCR(sc->sc_sensor[2].desc, "Aux Temp"); + + /* voltages */ COPYDESCR(sc->sc_sensor[3].desc, "VCORE_A"); COPYDESCR(sc->sc_sensor[4].desc, "VCORE_B"); COPYDESCR(sc->sc_sensor[5].desc, "+3.3V"); @@ -409,16 +507,41 @@ itesio_setup_sensors(struct itesio_softc COPYDESCR(sc->sc_sensor[11].desc, "VBAT"); /* fans */ - for (i = IT_FANSTART_IDX; i < IT_NUM_SENSORS; i++) - sc->sc_sensor[i].units = ENVSYS_SFANRPM; - COPYDESCR(sc->sc_sensor[12].desc, "CPU Fan"); COPYDESCR(sc->sc_sensor[13].desc, "System Fan"); COPYDESCR(sc->sc_sensor[14].desc, "Aux Fan"); +} - /* all */ - for (i = 0; i < IT_NUM_SENSORS; i++) - sc->sc_sensor[i].state = ENVSYS_SINVALID; +static void +itesio_setup_it8625_sensors(struct itesio_softc *sc) +{ + + itesio_setup_sensors_common(sc); + + /* temperatures */ + COPYDESCR(sc->sc_sensor[0].desc, "Temp0"); + COPYDESCR(sc->sc_sensor[1].desc, "Temp1"); + COPYDESCR(sc->sc_sensor[2].desc, "Temp2"); + + /* voltages */ + COPYDESCR(sc->sc_sensor[3].desc, "VIN0"); + COPYDESCR(sc->sc_sensor[4].desc, "VIN1"); + COPYDESCR(sc->sc_sensor[5].desc, "VIN2"); + COPYDESCR(sc->sc_sensor[6].desc, "VIN3"); + COPYDESCR(sc->sc_sensor[7].desc, "VIN4"); + COPYDESCR(sc->sc_sensor[8].desc, "VIN5"); + COPYDESCR(sc->sc_sensor[9].desc, "VIN6"); + COPYDESCR(sc->sc_sensor[10].desc, "Internal 3VSB"); + COPYDESCR(sc->sc_sensor[11].desc, "VBAT"); + COPYDESCR(sc->sc_sensor[12].desc, "Internal AVCC3"); + + /* fans */ + COPYDESCR(sc->sc_sensor[13].desc, "Fan0"); + COPYDESCR(sc->sc_sensor[14].desc, "Fan1"); + COPYDESCR(sc->sc_sensor[15].desc, "Fan2"); + COPYDESCR(sc->sc_sensor[16].desc, "Fan3"); + COPYDESCR(sc->sc_sensor[17].desc, "Fan4"); + COPYDESCR(sc->sc_sensor[18].desc, "Fan5"); } #undef COPYDESCR @@ -446,7 +569,7 @@ itesio_refresh_volts(struct itesio_softc uint8_t vbatcr = 0; int i, sdata; - i = edata->sensor - IT_VOLTSTART_IDX; + i = edata->sensor - sc->sc_config.voltstart_idx; sdata = itesio_ecreadreg(sc, ITESIO_EC_SENSORVOLTBASE + i); /* not connected */ @@ -486,63 +609,148 @@ itesio_refresh_volts(struct itesio_softc } static void +itesio_refresh_it8625_volts(struct itesio_softc *sc, envsys_data_t *edata) +{ + int i, sdata; + + i = edata->sensor - sc->sc_config.voltstart_idx; + + if (i < 9) + sdata = itesio_ecreadreg(sc, ITESIO_EC_SENSORVOLTBASE + i); + else + sdata = itesio_ecreadreg(sc, + ITESIO_EC_SENSORVOLTEXTBASE + i - 9); + /* not connected */ + if (sdata == 0 || sdata == 0xff) { + edata->state = ENVSYS_SINVALID; + return; + } + + DPRINTF(("%s: sdata[volt%d] 0x%x\n", __func__, i, sdata)); + + if (i == 7) { + /* Internal 3VSB: reading value * 2 * 10.9mV */ + edata->value_cur = sdata * 2 * 109; + } else { + /* other: reading value * 10.9mV */ + edata->value_cur = sdata * 109; + } + /* rfact is (factor * 10^4) */ + if (edata->rfact) + edata->value_cur *= edata->rfact; + else + edata->value_cur *= RFACT_NONE; + /* division by 100 gets us back to uVDC */ + edata->value_cur /= 100; + edata->state = ENVSYS_SVALID; +} + +static void itesio_refresh_fans(struct itesio_softc *sc, envsys_data_t *edata) { - uint8_t mode = 0; - uint16_t sdata = 0; + uint8_t mode; + uint16_t sdata; + int i; + + i = edata->sensor - sc->sc_config.fanstart_idx; + + mode = itesio_ecreadreg(sc, ITESIO_EC_FAN16_CER); + sdata = itesio_ecreadreg(sc, ITESIO_EC_SENSORFANBASE + i); + if (mode & (1 << i)) + sdata += (itesio_ecreadreg(sc, + ITESIO_EC_SENSORFANEXTBASE + i) << 8); + edata->state = ENVSYS_SVALID; + if (sdata == 0 || + sdata == ((mode & (1 << i)) ? 0xffff : 0xff)) + edata->state = ENVSYS_SINVALID; + else { + edata->value_cur = 1350000 / 2 / sdata; + edata->state = ENVSYS_SVALID; + } + DPRINTF(("%s: 16bit sdata[fan%d] 0x%x\n", __func__, i, sdata)); +} + +static void +itesio_refresh_it8705_fans(struct itesio_softc *sc, envsys_data_t *edata) +{ + uint16_t sdata; int i, divisor, odivisor, ndivisor; - i = edata->sensor - IT_FANSTART_IDX; - divisor = odivisor = ndivisor = 0; + i = edata->sensor - sc->sc_config.fanstart_idx; - if (sc->sc_chipid == ITESIO_ID8705 || sc->sc_chipid == ITESIO_ID8712) { - /* - * Use the Fan Tachometer Divisor Register for - * IT8705F and IT8712F. - */ - divisor = odivisor = ndivisor = - itesio_ecreadreg(sc, ITESIO_EC_FAN_TDR); - sdata = itesio_ecreadreg(sc, ITESIO_EC_SENSORFANBASE + i); - if (sdata == 0xff) { - edata->state = ENVSYS_SINVALID; - if (i == 2) - ndivisor |= 0x40; - else { - ndivisor &= ~(7 << (i * 3)); - ndivisor |= ((divisor + 1) & 7) << (i * 3); - } - } else { - if (i == 2) - divisor = divisor & 1 ? 3 : 1; - - if ((sdata << (divisor & 7)) == 0) - edata->state = ENVSYS_SINVALID; - else { - edata->value_cur = - 1350000 / (sdata << (divisor & 7)); - edata->state = ENVSYS_SVALID; - } + /* + * Use the Fan Tachometer Divisor Register for + * IT8705F and IT8712F. + */ + divisor = odivisor = ndivisor = + itesio_ecreadreg(sc, ITESIO_EC_FAN_TDR); + sdata = itesio_ecreadreg(sc, ITESIO_EC_SENSORFANBASE + i); + if (sdata == 0xff) { + edata->state = ENVSYS_SINVALID; + if (i == 2) + ndivisor |= 0x40; + else { + ndivisor &= ~(7 << (i * 3)); + ndivisor |= ((divisor + 1) & 7) << (i * 3); } - DPRINTF(("%s: 8bit sdata[fan%d] 0x%x div: 0x%x\n", __func__, - i, sdata, divisor)); - if (ndivisor != odivisor) - itesio_ecwritereg(sc, ITESIO_EC_FAN_TDR, ndivisor); } else { - mode = itesio_ecreadreg(sc, ITESIO_EC_FAN16_CER); - sdata = itesio_ecreadreg(sc, ITESIO_EC_SENSORFANBASE + i); - if (mode & (1 << i)) - sdata += (itesio_ecreadreg(sc, - ITESIO_EC_SENSORFANEXTBASE + i) << 8); - edata->state = ENVSYS_SVALID; - if (sdata == 0 || - sdata == ((mode & (1 << i)) ? 0xffff : 0xff)) + if (i == 2) + divisor = divisor & 1 ? 3 : 1; + + if ((sdata << (divisor & 7)) == 0) edata->state = ENVSYS_SINVALID; else { - edata->value_cur = 1350000 / 2 / sdata; + edata->value_cur = + 1350000 / (sdata << (divisor & 7)); edata->state = ENVSYS_SVALID; } - DPRINTF(("%s: 16bit sdata[fan%d] 0x%x\n", __func__, i, sdata)); } + DPRINTF(("%s: 8bit sdata[fan%d] 0x%x div: 0x%x\n", __func__, + i, sdata, divisor)); + if (ndivisor != odivisor) + itesio_ecwritereg(sc, ITESIO_EC_FAN_TDR, ndivisor); +} + +static void +itesio_refresh_it8625_fans(struct itesio_softc *sc, envsys_data_t *edata) +{ + uint16_t sdata; + int i; + + i = edata->sensor - sc->sc_config.fanstart_idx; + + switch (i) { + case 0: + case 1: + case 2: + sdata = itesio_ecreadreg(sc, ITESIO_EC_SENSORFANBASE + i); + sdata += (itesio_ecreadreg(sc, + ITESIO_EC_SENSORFANEXTBASE + i) << 8); + break; + case 3: + sdata = itesio_ecreadreg(sc, IT8625_EC_SENSORFAN4_LSB); + sdata += itesio_ecreadreg(sc, IT8625_EC_SENSORFAN4_MSB) << 8; + break; + case 4: + sdata = itesio_ecreadreg(sc, IT8625_EC_SENSORFAN5_LSB); + sdata += itesio_ecreadreg(sc, IT8625_EC_SENSORFAN5_MSB) << 8; + break; + case 5: + sdata = itesio_ecreadreg(sc, IT8625_EC_SENSORFAN6_LSB); + sdata += itesio_ecreadreg(sc, IT8625_EC_SENSORFAN6_MSB) << 8; + break; + default: + edata->state = ENVSYS_SINVALID; + return; + } + edata->state = ENVSYS_SVALID; + if (sdata == 0 || sdata == 0xffff) + edata->state = ENVSYS_SINVALID; + else { + edata->value_cur = 1350000 / 2 / sdata; + edata->state = ENVSYS_SVALID; + } + DPRINTF(("%s: 16bit sdata[fan%d] 0x%x\n", __func__, i, sdata)); } static void @@ -550,13 +758,13 @@ itesio_refresh(struct sysmon_envsys *sme { struct itesio_softc *sc = sme->sme_cookie; - if (edata->sensor < IT_VOLTSTART_IDX) - itesio_refresh_temp(sc, edata); - else if (edata->sensor >= IT_VOLTSTART_IDX && - edata->sensor < IT_FANSTART_IDX) - itesio_refresh_volts(sc, edata); + if (edata->sensor < sc->sc_config.voltstart_idx) + (*sc->sc_config.refresh_temp)(sc, edata); + else if (edata->sensor >= sc->sc_config.voltstart_idx && + edata->sensor < sc->sc_config.fanstart_idx) + (*sc->sc_config.refresh_volts)(sc, edata); else - itesio_refresh_fans(sc, edata); + (*sc->sc_config.refresh_fans)(sc, edata); } static int Index: src/sys/dev/isa/itesio_isavar.h diff -u src/sys/dev/isa/itesio_isavar.h:1.13 src/sys/dev/isa/itesio_isavar.h:1.14 --- src/sys/dev/isa/itesio_isavar.h:1.13 Sat Jun 5 01:40:53 2021 +++ src/sys/dev/isa/itesio_isavar.h Sat Jul 3 04:44:16 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: itesio_isavar.h,v 1.13 2021/06/05 01:40:53 nonaka Exp $ */ +/* $NetBSD: itesio_isavar.h,v 1.14 2021/07/03 04:44:16 nonaka Exp $ */ /* $OpenBSD: itvar.h,v 1.2 2003/11/05 20:57:10 grange Exp $ */ /* @@ -103,6 +103,7 @@ #define ITESIO_EC_SENSORFANEXTBASE 0x18 /* Fan (MSB) from 0x18 to 0x1A */ #define ITESIO_EC_SENSORVOLTBASE 0x20 /* Voltage from 0x20 to 0x28 */ #define ITESIO_EC_SENSORTEMPBASE 0x29 /* Temperature from 0x29 to 0x2b */ +#define ITESIO_EC_SENSORVOLTEXTBASE 0x2f /* Extra Voltage 0x2f */ #define ITESIO_EC_VIN0 0x20 #define ITESIO_EC_VIN1 0x21 @@ -143,17 +144,42 @@ #define ITESIO_EC_TEMP2_HIGH_LIMIT 0x44 #define ITESIO_EC_TEMP2_LOW_LIMIT 0x45 +#define IT8625_EC_SENSORFAN4_LSB 0x80 +#define IT8625_EC_SENSORFAN4_MSB 0x81 +#define IT8625_EC_SENSORFAN5_LSB 0x82 +#define IT8625_EC_SENSORFAN5_MSB 0x83 +#define IT8625_EC_SENSORFAN6_LSB 0x93 +#define IT8625_EC_SENSORFAN6_MSB 0x94 + #define ITESIO_EC_VREF (4096) /* Vref = 4.096 V */ +struct itesio_softc; +struct itesio_config { + uint16_t chipid; + bool no_wdt; + uint32_t num_sensors; + uint32_t voltstart_idx; + uint32_t fanstart_idx; + void (*setup_sensors)(struct itesio_softc *); + void (*refresh_temp)(struct itesio_softc *, + envsys_data_t *); + void (*refresh_volts)(struct itesio_softc *, + envsys_data_t *); + void (*refresh_fans)(struct itesio_softc *, + envsys_data_t *); +}; + struct itesio_softc { bus_space_tag_t sc_iot; bus_space_handle_t sc_pnp_ioh; bus_space_handle_t sc_ec_ioh; + struct itesio_config sc_config; + struct sysmon_wdog sc_smw; struct sysmon_envsys *sc_sme; - envsys_data_t sc_sensor[IT_NUM_SENSORS]; + envsys_data_t *sc_sensor; uint16_t sc_hwmon_baseaddr; bool sc_hwmon_mapped;