Home | History | Annotate | Line # | Download | only in i2c
      1 /* $NetBSD: adm1026.c,v 1.17 2026/05/27 10:30:27 jdc Exp $ */
      2 
      3 /*-
      4  * Copyright (c) 2015 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Julian Coleman.
      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  *
     19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  * POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 #include <sys/cdefs.h>
     33 __KERNEL_RCSID(0, "$NetBSD: adm1026.c,v 1.17 2026/05/27 10:30:27 jdc Exp $");
     34 
     35 #include <sys/param.h>
     36 #include <sys/systm.h>
     37 #include <sys/device.h>
     38 #include <sys/kernel.h>
     39 #include <sys/sysctl.h>
     40 
     41 #include <dev/sysmon/sysmonvar.h>
     42 
     43 #include <dev/i2c/i2cvar.h>
     44 #include <dev/i2c/adm1026reg.h>
     45 
     46 /* Temperature sensors descriptions and registers */
     47 struct adm1026_temp_info {
     48 	const char* desc;
     49 	uint8_t v_reg, t_reg, h_reg, l_reg, check_tdm2;
     50 };
     51 
     52 static struct adm1026_temp_info adm1026_temps_table[] = {
     53 	{ "internal", ADM1026_INT_TEMP_VAL, ADM1026_INT_THERM_HIGH,
     54 	    ADM1026_INT_TEMP_HIGH, ADM1026_INT_TEMP_LOW, 0 },
     55 	{ "external 1", ADM1026_TDM1_VAL, ADM1026_TDM1_THERM_HIGH,
     56 	    ADM1026_TDM1_HIGH, ADM1026_TDM1_LOW, 0 },
     57 	{ "external 2", ADM1026_TDM2_AIN9_VAL, ADM1026_TDM2_THERM_HIGH,
     58 	    ADM1026_TDM2_AIN9_HIGH, ADM1026_TDM2_AIN9_LOW, 1 },
     59 };
     60 
     61 /* Voltage/analog sensors descriptions and registers */
     62 struct adm1026_volts_info {
     63 	const char* desc;
     64 	int incr, offset;
     65 	uint8_t v_reg, h_reg, l_reg, check_tdm2;
     66 };
     67 
     68 /* Voltage maximums (in mV) from datasheet table 7 divided by 254 increments */
     69 static struct adm1026_volts_info adm1026_volts_table[] = {
     70 	{ "Vbatt", 15685, 0, ADM1026_VBAT_VAL,
     71 	    ADM1026_VBATT_HIGH, ADM1026_VBATT_LOW, 0 },
     72 	{ "V3.3 standby", 17413, 0, ADM1026_33VSTBY_VAL,
     73 	    ADM1026_33V_STBY_HIGH, ADM1026_33V_STBY_LOW, 0 },
     74 	{ "V3.3 main", 17413, 0, ADM1026_33VMAIN_VAL,
     75 	    ADM1026_33V_MAIN_HIGH, ADM1026_33V_MAIN_LOW, 0 },
     76 	{ "V5.0", 26145, 0, ADM1026_50V_VAL,
     77 	    ADM1026_50V_HIGH, ADM1026_50V_LOW, 0 },
     78 	{ "Vccp", 11763, 0, ADM1026_VCCP_VAL,
     79 	    ADM1026_VCCP_HIGH, ADM1026_VCCP_LOW, 0 },
     80 	{ "V+12", 62748, 0, ADM1026_12V_VAL,
     81 	    ADM1026_12V_HIGH, ADM1026_12V_LOW, 0 },
     82 	{ "V-12", 72268, -15928000, ADM1026_N12V_VAL,
     83 	    ADM1026_N12V_HIGH, ADM1026_N12V_LOW,0 },
     84 	{ "V3.0 0", 11763, 0, ADM1026_AIN_VAL(0),
     85 	    ADM1026_AIN_HIGH(0), ADM1026_AIN_LOW(0), 0 },
     86 	{ "V3.0 1", 11763, 0, ADM1026_AIN_VAL(1),
     87 	    ADM1026_AIN_HIGH(1), ADM1026_AIN_LOW(1), 0 },
     88 	{ "V3.0 2", 11763, 0, ADM1026_AIN_VAL(2),
     89 	    ADM1026_AIN_HIGH(2), ADM1026_AIN_LOW(2), 0 },
     90 	{ "V3.0 3", 11763, 0, ADM1026_AIN_VAL(3),
     91 	    ADM1026_AIN_HIGH(3), ADM1026_AIN_LOW(3), 0 },
     92 	{ "V3.0 4", 11763, 0, ADM1026_AIN_VAL(4),
     93 	    ADM1026_AIN_HIGH(4), ADM1026_AIN_LOW(4), 0 },
     94 	{ "V3.0 5", 11763, 0, ADM1026_AIN_VAL(5),
     95 	    ADM1026_AIN_HIGH(5), ADM1026_AIN_LOW(5), 0 },
     96 	{ "V2.5 0", 9803, 0, ADM1026_AIN_VAL(6),
     97 	    ADM1026_AIN_HIGH(6), ADM1026_AIN_LOW(6), 0 },
     98 	{ "V2.5 1", 9803, 0, ADM1026_AIN_VAL(7),
     99 	    ADM1026_AIN_HIGH(7), ADM1026_AIN_LOW(7), 0 },
    100 	{ "V2.5 2", 9803, 0, ADM1026_AIN8_VAL,
    101 	    ADM1026_AIN8_HIGH, ADM1026_AIN8_LOW, 1 },
    102 	{ "V2.5 3", 9803, 0, ADM1026_TDM2_AIN9_VAL,
    103 	    ADM1026_TDM2_AIN9_HIGH, ADM1026_TDM2_AIN9_LOW, 1 },
    104 };
    105 
    106 #define VBATT_NUM	0	/* Vbatt is first in the table */
    107 #define VBATT_MIN	0x60	/* 1.5V is the minimum valid reading */
    108 
    109 /* Maximum number of each type of sensor */
    110 #define ADM1026_MAX_FANS	8
    111 #define ADM1026_MAX_TEMPS	3
    112 #define ADM1026_MAX_VOLTS	(sizeof(adm1026_volts_table) / \
    113 				    sizeof (adm1026_volts_table[0]))
    114 #define ADM1026_MAX_SENSORS	\
    115     (ADM1026_MAX_FANS + ADM1026_MAX_TEMPS + ADM1026_MAX_VOLTS)
    116 
    117 /* Fan/temp/volt sensor offsets */
    118 #define ADM1026_FAN_NUM(x)	(x)
    119 #define ADM1026_TEMP_NUM(x)	(x + ADM1026_MAX_FANS)
    120 #define ADM1026_VOLT_NUM(x)	(x + ADM1026_MAX_FANS + ADM1026_MAX_TEMPS)
    121 
    122 /* Fan conversions */
    123 #define VAL_TO_SPEED(val, div)	(1350000 / (val * div))
    124 #define SPEED_TO_VAL(spd, div)	((1350000 / (spd * div)) & 0xff)
    125 
    126 /* Temperature conversions */
    127 #define VAL_TO_TEMP(val)	(val & 0x80 ? \
    128     145150000 + 1000000 * (val & 0x7f) : /* -128C */ \
    129     273150000 + 1000000 * val)
    130 #define TEMP_TO_VAL(temp)	((temp < 273150000 ? \
    131     ((temp - 145150000) / 1000000) ^ 0x80 : \
    132     (temp - 273150000) / 1000000) & 0xff)
    133 
    134 /* Voltage conversions */
    135 #define VAL_TO_VOLT(val, num)	(val * adm1026_volts_table[num].incr + \
    136     adm1026_volts_table[num].offset)
    137 #define VOLT_TO_VAL(volt, num)	(((volt - adm1026_volts_table[num].offset) / \
    138     adm1026_volts_table[num].incr) & 0xff)
    139 
    140 
    141 struct adm1026_softc {
    142 	device_t sc_dev;
    143 	i2c_tag_t sc_tag;
    144 	int sc_address;
    145 	bool sc_monitor;
    146 
    147 	uint8_t sc_cfg[2];
    148 	int sc_fandiv[ADM1026_MAX_FANS];
    149 	int sc_nfans, sc_ntemps, sc_nvolts;
    150 	int sc_map[ADM1026_MAX_SENSORS];  /* Map sysmon numbers to sensors */
    151 	struct sysmon_envsys *sc_sme;
    152 	envsys_data_t sc_sensor[ADM1026_MAX_SENSORS];
    153 	uint8_t sc_thermlim[ADM1026_MAX_SENSORS];
    154 	uint8_t sc_highlim[ADM1026_MAX_SENSORS];
    155 	uint8_t sc_lowlim[ADM1026_MAX_SENSORS];
    156 };
    157 
    158 static int adm1026_match(device_t, cfdata_t, void *);
    159 static int adm1026_ident(i2c_tag_t, i2c_addr_t, int, uint8_t*);
    160 static void adm1026_attach(device_t, device_t, void *);
    161 static int adm1026_detach(device_t, int);
    162 bool adm1026_pmf_suspend(device_t, const pmf_qual_t *);
    163 bool adm1026_pmf_resume(device_t, const pmf_qual_t *);
    164 
    165 static int adm1026_start_monitor(struct adm1026_softc *, int, uint8_t);
    166 static int adm1026_stop_monitor(struct adm1026_softc *);
    167 static int adm1026_setup_fans(struct adm1026_softc *, int, uint8_t);
    168 static int adm1026_setup_temps(struct adm1026_softc *);
    169 static int adm1026_setup_volts(struct adm1026_softc *);
    170 
    171 void adm1026_refresh(struct sysmon_envsys *, envsys_data_t *);
    172 static void adm1026_read_fan_val(struct adm1026_softc *, envsys_data_t *);
    173 static void adm1026_read_temp_val(struct adm1026_softc *, envsys_data_t *);
    174 static void adm1026_read_volt_val(struct adm1026_softc *, envsys_data_t *);
    175 
    176 void adm1026_get_limits(struct sysmon_envsys *, envsys_data_t *,
    177     sysmon_envsys_lim_t *, uint32_t *);
    178 void adm1026_set_limits(struct sysmon_envsys *, envsys_data_t *,
    179     sysmon_envsys_lim_t *, uint32_t *);
    180 static void adm1026_get_fan_limits(struct adm1026_softc *,
    181     envsys_data_t *, sysmon_envsys_lim_t *, uint32_t *);
    182 static void adm1026_get_temp_limits(struct adm1026_softc *,
    183     envsys_data_t *, sysmon_envsys_lim_t *, uint32_t *);
    184 static void adm1026_get_volt_limits(struct adm1026_softc *,
    185     envsys_data_t *, sysmon_envsys_lim_t *, uint32_t *);
    186 static void adm1026_set_fan_limits(struct adm1026_softc *,
    187     envsys_data_t *, sysmon_envsys_lim_t *, uint32_t *);
    188 static void adm1026_set_temp_limits(struct adm1026_softc *,
    189     envsys_data_t *, sysmon_envsys_lim_t *, uint32_t *);
    190 static void adm1026_set_volt_limits(struct adm1026_softc *,
    191     envsys_data_t *, sysmon_envsys_lim_t *, uint32_t *);
    192 
    193 static int adm1026_read_reg_int(i2c_tag_t, i2c_addr_t, uint8_t, uint8_t *);
    194 static int adm1026_write_reg(struct adm1026_softc *, uint8_t, uint8_t);
    195 
    196 static inline int
    197 adm1026_read_reg(struct adm1026_softc *sc, uint8_t reg, uint8_t *val)
    198 {
    199 	return adm1026_read_reg_int(sc->sc_tag, sc->sc_address, reg, val);
    200 }
    201 
    202 CFATTACH_DECL_NEW(adm1026hm, sizeof(struct adm1026_softc),
    203 	adm1026_match, adm1026_attach, adm1026_detach, NULL);
    204 
    205 static const struct device_compatible_entry compat_data[] = {
    206 	{ .compat = "i2c-adm1026" },
    207 	DEVICE_COMPAT_EOL
    208 };
    209 
    210 static int
    211 adm1026_match(device_t parent, cfdata_t cf, void *aux)
    212 {
    213 	struct i2c_attach_args *ia = aux;
    214 	int match_result;
    215 	uint8_t rev;
    216 
    217 	if (iic_use_direct_match(ia, cf, compat_data, &match_result))
    218 		return match_result;
    219 
    220 	if (ia->ia_addr == ADM1026_ADDR1
    221 	    && adm1026_ident(ia->ia_tag, ia->ia_addr, 1, &rev))
    222 		return I2C_MATCH_ADDRESS_AND_PROBE;
    223 
    224 	return 0;
    225 }
    226 
    227 static int
    228 adm1026_ident(i2c_tag_t tag, i2c_addr_t addr, int probe_only, uint8_t *rev)
    229 {
    230 	uint8_t reg, val;
    231 	int err;
    232 
    233 	/* Manufacturer ID and revision/stepping */
    234 	reg = ADM1026_ID;
    235 	err = adm1026_read_reg_int(tag, addr, reg, &val);
    236 	if (err || val != ADM1026_MANF_ID) {
    237 		if (!probe_only)
    238 			aprint_verbose("adm1026_ident: "
    239 			    "manufacturer ID invalid or missing\n");
    240 		return 0;
    241 	}
    242 	reg = ADM1026_REV;
    243 	err = adm1026_read_reg_int(tag, addr, reg, rev);
    244 	if (err || ADM1026_REVISION(*rev) != ADM1026_MANF_REV) {
    245 		if (!probe_only)
    246 			aprint_verbose("adm1026_ident: "
    247 			    "manufacturer revision invalid or missing\n");
    248 		return 0;
    249 	}
    250 	return 1;
    251 }
    252 
    253 static void
    254 adm1026_attach(device_t parent, device_t self, void *aux)
    255 {
    256 	struct adm1026_softc *sc = device_private(self);
    257 	struct i2c_attach_args *ia = aux;
    258 	prop_dictionary_t props = device_properties(self);
    259 	uint8_t reg, val, rev, fan_div2, fan_mask;
    260 	int div2_val;
    261 
    262 	sc->sc_tag = ia->ia_tag;
    263 	sc->sc_address = ia->ia_addr;
    264 	sc->sc_dev = self;
    265 
    266 	if (prop_dictionary_get_uint8(props, "fan_div2", &fan_div2) != 0)
    267 		div2_val = fan_div2;
    268 	else
    269 		div2_val = -1;
    270 	if (prop_dictionary_get_uint8(props, "fan_mask", &fan_mask) == 0)
    271 		fan_mask = 0x00;	/* 4 + 4 fans */
    272 
    273 	(void) adm1026_ident(sc->sc_tag, sc->sc_address, 0, &rev);
    274 	aprint_normal(": ADM1026 hardware monitor: rev. 0x%x, step. 0x%x\n",
    275 	    ADM1026_REVISION(rev), ADM1026_STEPPING(rev));
    276 
    277 #if 0	/* ADM1026_DEBUG */
    278         do {
    279 		int i;
    280 
    281 		printf("Register dump\n");
    282 		for (i = 0; i < 0x70; i++) {
    283 			if (i == 0x14 || i == 0x15)
    284 				/* Don't read test registers */
    285 				continue;
    286 			adm1026_read_reg(sc, i, &val);
    287 			printf("reg %02x: %02x\n", i, val);
    288 		}
    289 	} while (0);
    290 #endif
    291 
    292 	/*
    293 	 * Start monitoring if not already monitoring.
    294 	 * Wait 1.8s for the fan readings to stabilise.
    295 	 */
    296 	reg = ADM1026_CONF1;
    297 	if (adm1026_read_reg(sc, reg, &val) != 0) {
    298 		aprint_error_dev(sc->sc_dev, ": unable to read conf1\n");
    299 		return;
    300 	}
    301 	if (!(val & ADM1026_CONF1_MONITOR)) {
    302 		sc->sc_monitor = 1;
    303 		aprint_normal_dev(sc->sc_dev,
    304 		    ": starting monitoring, waiting 1.8s for readings\n");
    305 		val |= ADM1026_CONF1_MONITOR;
    306 		if (adm1026_start_monitor(sc, 0, val))
    307 			return;
    308 	} else
    309 		sc->sc_monitor = 0;
    310 	sc->sc_cfg[0] = val;
    311 
    312 	sc->sc_sme = sysmon_envsys_create();
    313 
    314 	sc->sc_nfans = 0;
    315 	sc->sc_ntemps = 0;
    316 	sc->sc_nvolts = 0;
    317 	if (adm1026_setup_fans(sc, div2_val, fan_mask))
    318 		goto bad;
    319 	if (adm1026_setup_temps(sc))
    320 		goto bad;
    321 	if (adm1026_setup_volts(sc))
    322 		goto bad;
    323 	aprint_normal_dev(self, "%d fans, %d temperatures, %d voltages\n",
    324 	    sc->sc_nfans, sc->sc_ntemps, sc->sc_nvolts);
    325 
    326 	sc->sc_sme->sme_name = device_xname(self);
    327 	sc->sc_sme->sme_cookie = sc;
    328 	sc->sc_sme->sme_refresh = adm1026_refresh;
    329 	sc->sc_sme->sme_get_limits = adm1026_get_limits;
    330 	sc->sc_sme->sme_set_limits = adm1026_set_limits;
    331 	if (sysmon_envsys_register(sc->sc_sme)) {
    332 		aprint_error_dev(self,
    333 		    "unable to register with sysmon\n");
    334 		goto bad;
    335 	}
    336 
    337 	if (!pmf_device_register(self, adm1026_pmf_suspend, adm1026_pmf_resume))
    338 		aprint_error_dev(self, "couldn't establish power handler\n");
    339 
    340 	return;
    341 
    342 bad:
    343 	sysmon_envsys_destroy(sc->sc_sme);
    344 	sc->sc_sme = NULL;
    345 	return;
    346 }
    347 
    348 /* Stop (suspend/detach) and restart (resume) monitoring, if we started it. */
    349 bool
    350 adm1026_pmf_suspend(device_t dev, const pmf_qual_t *qual)
    351 {
    352 
    353 	struct adm1026_softc *sc = device_private(dev);
    354 
    355 	if (sc->sc_monitor == 1) {
    356 		if (adm1026_stop_monitor(sc))
    357 			return false;
    358 	}
    359 	return true;
    360 }
    361 
    362 bool
    363 adm1026_pmf_resume(device_t dev, const pmf_qual_t *qual)
    364 {
    365 	struct adm1026_softc *sc = device_private(dev);
    366 
    367 	if (sc->sc_monitor == 1) {
    368 		if (adm1026_start_monitor(sc, 1, 0))
    369 			return false;
    370 	}
    371 	return true;
    372 }
    373 
    374 static int
    375 adm1026_detach(device_t self, int flags)
    376 {
    377 	struct adm1026_softc *sc = device_private(self);
    378 
    379 	pmf_device_deregister(self);
    380 
    381 	if (sc->sc_sme != NULL)
    382 		sysmon_envsys_unregister(sc->sc_sme);
    383 
    384 	if (sc->sc_monitor == 1) {
    385 		if (!adm1026_stop_monitor(sc))
    386 			return 1;
    387 	}
    388 	return 0;
    389 }
    390 
    391 static int adm1026_start_monitor(struct adm1026_softc *sc, int do_read,
    392 	uint8_t newval)
    393 {
    394 	uint8_t reg, val;
    395 
    396 	reg = ADM1026_CONF1;
    397 	if (do_read) {
    398 		if (adm1026_read_reg(sc, reg, &val) != 0) {
    399 			aprint_error_dev(sc->sc_dev,
    400 			    ": unable to read conf1\n");
    401 			return 1;
    402 		}
    403 		val |= ADM1026_CONF1_MONITOR;
    404 	} else
    405 		val = newval;
    406 
    407 	if (adm1026_write_reg(sc, reg, val) != 0) {
    408 		aprint_error_dev(sc->sc_dev, ": unable to write conf1\n");
    409 		return 1;
    410 	}
    411 
    412 	delay(1800000);
    413 
    414 	return 0;
    415 }
    416 
    417 static int adm1026_stop_monitor(struct adm1026_softc *sc)
    418 {
    419 	uint8_t reg, val;
    420 
    421 	reg = ADM1026_CONF1;
    422 	if (adm1026_read_reg(sc, reg, &val) != 0) {
    423 		device_printf(sc->sc_dev, ": unable to read conf1\n");
    424 		return 1;
    425 	}
    426 
    427 	val &= ~ADM1026_CONF1_MONITOR;
    428 	if (adm1026_write_reg(sc, reg, val) != 0) {
    429 		device_printf(sc->sc_dev, ": unable to write conf1\n");
    430 		return 1;
    431 	}
    432 	return 0;
    433 }
    434 
    435 static int
    436 adm1026_setup_fans(struct adm1026_softc *sc, int div2_val, uint8_t fan_mask)
    437 {
    438 	int i, map, snum;
    439 	uint8_t reg, div1, div2, val;
    440 
    441 	/* Read fan-related registers (configuration and divisors) */
    442 	reg = ADM1026_CONF2;
    443 	if (adm1026_read_reg(sc, reg, &sc->sc_cfg[1]) != 0) {
    444 		aprint_error_dev(sc->sc_dev, "unable to read conf2\n");
    445 		return 1;
    446 	}
    447 	reg = ADM1026_FAN_DIV1;
    448 	if (adm1026_read_reg(sc, reg, &div1) != 0) {
    449 		aprint_error_dev(sc->sc_dev, "unable to read fan_div1\n");
    450 		return 1;
    451 	}
    452 	sc->sc_fandiv[0] = 1 << ADM1026_FAN0_DIV(div1);
    453 	sc->sc_fandiv[1] = 1 << ADM1026_FAN1_DIV(div1);
    454 	sc->sc_fandiv[2] = 1 << ADM1026_FAN2_DIV(div1);
    455 	sc->sc_fandiv[3] = 1 << ADM1026_FAN3_DIV(div1);
    456 	if (div2_val < 0) {
    457 		reg = ADM1026_FAN_DIV2;
    458 		if (adm1026_read_reg(sc, reg, &div2) != 0) {
    459 			aprint_error_dev(sc->sc_dev,
    460 			    "unable to read fan_div2\n");
    461 			return 1;
    462 		}
    463 	} else
    464 		div2 = div2_val;
    465 	sc->sc_fandiv[4] = 1 << ADM1026_FAN4_DIV(div2);
    466 	sc->sc_fandiv[5] = 1 << ADM1026_FAN5_DIV(div2);
    467 	sc->sc_fandiv[6] = 1 << ADM1026_FAN6_DIV(div2);
    468 	sc->sc_fandiv[7] = 1 << ADM1026_FAN7_DIV(div2);
    469 	for (i = 0; i < ADM1026_MAX_FANS; i++)
    470 		if (sc->sc_fandiv[i] < 1)
    471 			sc->sc_fandiv[i] = 1;
    472 
    473 	/*
    474 	 * Check configuration2 register to see which pins are fans.
    475 	 * This can be overridden by the fan_mask property to tell us
    476 	 * how many fans are present in each group (numbers 0-3 and 4-7).
    477 	 */
    478 	for (i = 0; i < ADM1026_MAX_FANS; i++) {
    479 		/* Check configuration2 register to see which pins are fans. */
    480 		if (!ADM1026_PIN_IS_FAN(sc->sc_cfg[1], i))
    481 			continue;
    482 		/* Check mask property to override configuration. */
    483 		if (!ADM1026_PIN_IS_FAN(fan_mask, i))
    484 			continue;
    485 
    486 		snum = ADM1026_FAN_NUM(i);
    487 
    488 		/* Store initial limit */
    489 		reg = ADM1026_FAN_HIGH(i);
    490 		if (adm1026_read_reg(sc, reg, &val) != 0) {
    491 			aprint_error_dev(sc->sc_dev,
    492 			    "unable to read fan %d limit\n", i);
    493 			return 1;
    494 		}
    495 		sc->sc_highlim[snum] = val;
    496 
    497 		/* Set up sysmon sensor */
    498 		sc->sc_sensor[snum].units = ENVSYS_SFANRPM;
    499 		sc->sc_sensor[snum].state = ENVSYS_SINVALID;
    500 		sc->sc_sensor[snum].flags = ENVSYS_FMONLIMITS;
    501 		snprintf(sc->sc_sensor[snum].desc,
    502 		    sizeof(sc->sc_sensor[snum].desc), "fan %d", snum);
    503 		if (sysmon_envsys_sensor_attach(
    504 		    sc->sc_sme, &sc->sc_sensor[snum])) {
    505 			aprint_error_dev(sc->sc_dev,
    506 			    "unable to attach fan %d at sysmon\n", i);
    507 			return 1;
    508 		}
    509 
    510 		map = sc->sc_sensor[snum].sensor;
    511 		sc->sc_map[map] = i;
    512 		sc->sc_nfans++;
    513 	}
    514 	return 0;
    515 }
    516 
    517 static int
    518 adm1026_setup_temps(struct adm1026_softc *sc)
    519 {
    520 	int i, map, snum;
    521 	uint8_t reg, val;
    522 
    523 	for (i = 0; i < ADM1026_MAX_TEMPS; i++) {
    524 		/* Check configuration1 register to see if TDM2 is configured */
    525 		if (adm1026_temps_table[i].check_tdm2 &&
    526 		    !ADM1026_PIN_IS_TDM2(sc->sc_cfg[0]))
    527 			continue;
    528 
    529 		snum = ADM1026_TEMP_NUM(i);
    530 
    531 		/* Store initial limits */
    532 		reg = adm1026_temps_table[i].t_reg;
    533 		if (adm1026_read_reg(sc, reg, &val) != 0) {
    534 			aprint_error_dev(sc->sc_dev,
    535 			    "unable to read temp %d therm limit\n", i);
    536 			return 1;
    537 		}
    538 		sc->sc_thermlim[snum] = val;
    539 
    540 		reg = adm1026_temps_table[i].h_reg;
    541 		if (adm1026_read_reg(sc, reg, &val) != 0) {
    542 			aprint_error_dev(sc->sc_dev,
    543 			    "unable to read temp %d high limit\n", i);
    544 			return 1;
    545 		}
    546 		sc->sc_highlim[snum] = val;
    547 
    548 		reg = adm1026_temps_table[i].l_reg;
    549 		if (adm1026_read_reg(sc, reg, &val) != 0) {
    550 			aprint_error_dev(sc->sc_dev,
    551 			    "unable to read temp %d low limit\n", i);
    552 			return 1;
    553 		}
    554 		sc->sc_lowlim[snum] = val;
    555 
    556 		/* Set up sysmon sensor */
    557 		strlcpy(sc->sc_sensor[snum].desc,
    558 		    adm1026_temps_table[i].desc,
    559 		    sizeof(sc->sc_sensor[snum].desc));
    560 		sc->sc_sensor[snum].units = ENVSYS_STEMP;
    561 		sc->sc_sensor[snum].state = ENVSYS_SINVALID;
    562 		sc->sc_sensor[snum].flags =
    563 		    ENVSYS_FMONLIMITS | ENVSYS_FHAS_ENTROPY;
    564 		if (sysmon_envsys_sensor_attach(
    565 		    sc->sc_sme, &sc->sc_sensor[snum])) {
    566 			aprint_error_dev(sc->sc_dev,
    567 			    "unable to attach temp %d at sysmon\n", i);
    568 			return 1;
    569 		}
    570 		map = sc->sc_sensor[snum].sensor;
    571 		sc->sc_map[map] = i;
    572 		sc->sc_ntemps++;
    573 	}
    574 	return 0;
    575 }
    576 
    577 static int
    578 adm1026_setup_volts(struct adm1026_softc *sc)
    579 {
    580 	int i, map, snum;
    581 	uint8_t reg, val;
    582 
    583 	for (i = 0; i < ADM1026_MAX_VOLTS; i++) {
    584 		/* Check configuration1 register to see if TDM2 is configured */
    585 		if (adm1026_volts_table[i].check_tdm2 &&
    586 		    ADM1026_PIN_IS_TDM2(sc->sc_cfg[0]))
    587 			continue;
    588 
    589 		snum = ADM1026_VOLT_NUM(i);
    590 
    591 		/* Store initial limits */
    592 		reg = adm1026_volts_table[i].h_reg;
    593 		if (adm1026_read_reg(sc, reg, &val) != 0) {
    594 			aprint_error_dev(sc->sc_dev,
    595 			    "unable to read volt %d high limit\n", i);
    596 			return 1;
    597 		}
    598 		sc->sc_highlim[snum] = val;
    599 
    600 		reg = adm1026_volts_table[i].l_reg;
    601 		if (adm1026_read_reg(sc, reg, &val) != 0) {
    602 			aprint_error_dev(sc->sc_dev,
    603 			    "unable to read volt %d low limit\n", i);
    604 			return 1;
    605 		}
    606 		sc->sc_lowlim[snum] = val;
    607 
    608 		/* Set up sysmon sensor */
    609 		strlcpy(sc->sc_sensor[snum].desc,
    610 		    adm1026_volts_table[i].desc,
    611 		    sizeof(sc->sc_sensor[snum].desc));
    612 		sc->sc_sensor[snum].units = ENVSYS_SVOLTS_DC;
    613 		sc->sc_sensor[snum].state = ENVSYS_SINVALID;
    614 		sc->sc_sensor[snum].flags = ENVSYS_FMONLIMITS;
    615 		if (sysmon_envsys_sensor_attach(
    616 		    sc->sc_sme, &sc->sc_sensor[snum])) {
    617 			sysmon_envsys_destroy(sc->sc_sme);
    618 			return 1;
    619 		}
    620 		map = sc->sc_sensor[snum].sensor;
    621 		sc->sc_map[map] = i;
    622 		sc->sc_nvolts++;
    623 	}
    624 	return 0;
    625 }
    626 
    627 void
    628 adm1026_refresh(struct sysmon_envsys *sme, envsys_data_t *edata)
    629 {
    630 	struct adm1026_softc *sc = sme->sme_cookie;
    631 
    632 	if (edata->sensor < sc->sc_nfans)
    633 		adm1026_read_fan_val(sc, edata);
    634 	else if (edata->sensor < sc->sc_nfans + sc->sc_ntemps)
    635 		adm1026_read_temp_val(sc, edata);
    636 	else
    637 		adm1026_read_volt_val(sc, edata);
    638 }
    639 
    640 static void
    641 adm1026_read_fan_val(struct adm1026_softc *sc, envsys_data_t *edata)
    642 {
    643 	int fan = sc->sc_map[edata->sensor];
    644 	uint8_t	reg, val;
    645 
    646 	reg = ADM1026_FAN_VAL(fan);
    647 	if (adm1026_read_reg(sc, reg, &val) != 0) {
    648 		edata->state = ENVSYS_SINVALID;
    649 		return;
    650 	}
    651 	if (val == 0xff || val == 0x00)	/* Fan missing or stopped */
    652 		edata->value_cur = 0;
    653 	else
    654 		edata->value_cur = VAL_TO_SPEED(val, sc->sc_fandiv[fan]);
    655 	edata->state = ENVSYS_SVALID;
    656 }
    657 
    658 static void
    659 adm1026_read_temp_val(struct adm1026_softc *sc, envsys_data_t *edata)
    660 {
    661 	int temp = sc->sc_map[edata->sensor];
    662 	uint8_t	reg, val;
    663 
    664 	reg = adm1026_temps_table[temp].v_reg;
    665 	if (adm1026_read_reg(sc, reg, &val) != 0) {
    666 		edata->state = ENVSYS_SINVALID;
    667 		return;
    668 	}
    669 
    670 	edata->value_cur = VAL_TO_TEMP(val);
    671 	edata->state = ENVSYS_SVALID;
    672 }
    673 
    674 static void
    675 adm1026_read_volt_val(struct adm1026_softc *sc, envsys_data_t *edata)
    676 {
    677 	int volt = sc->sc_map[edata->sensor];
    678 	uint8_t	reg, val;
    679 
    680 	reg = adm1026_volts_table[volt].v_reg;
    681 	if (adm1026_read_reg(sc, reg, &val) != 0) {
    682 		edata->state = ENVSYS_SINVALID;
    683 		return;
    684 	}
    685 	/* Vbatt is not valid for < 1.5V */
    686 	if (volt == VBATT_NUM && val < VBATT_MIN)
    687 		edata->state = ENVSYS_SINVALID;
    688 	edata->value_cur = VAL_TO_VOLT(val, volt);
    689 	edata->state = ENVSYS_SVALID;
    690 }
    691 
    692 void
    693 adm1026_get_limits(struct sysmon_envsys *sme, envsys_data_t *edata,
    694 	sysmon_envsys_lim_t *limits, uint32_t *props)
    695 {
    696 	struct adm1026_softc *sc = sme->sme_cookie;
    697 
    698 	if (edata->sensor < sc->sc_nfans)
    699 		adm1026_get_fan_limits(sc, edata, limits, props);
    700 	else if (edata->sensor < sc->sc_nfans + sc->sc_ntemps)
    701 		adm1026_get_temp_limits(sc, edata, limits, props);
    702 	else
    703 		adm1026_get_volt_limits(sc, edata, limits, props);
    704 }
    705 
    706 static void
    707 adm1026_get_fan_limits(struct adm1026_softc *sc, envsys_data_t *edata,
    708 	sysmon_envsys_lim_t *limits, uint32_t *props)
    709 {
    710 	int fan = sc->sc_map[edata->sensor];
    711 	uint8_t	reg, val;
    712 
    713 	/* The chip measures intervals, so the high limit is for low speed. */
    714 	*props &= ~PROP_WARNMIN;
    715 
    716 	reg = ADM1026_FAN_HIGH(fan);
    717 	if (adm1026_read_reg(sc, reg, &val) != 0)
    718 		return;
    719 	if (val == 0x00)	/* No limit */
    720 		return;
    721 	limits->sel_warnmin = VAL_TO_SPEED(val, sc->sc_fandiv[fan]);
    722 	*props |= PROP_WARNMIN;
    723 }
    724 
    725 static void
    726 adm1026_get_temp_limits(struct adm1026_softc *sc, envsys_data_t *edata,
    727 	sysmon_envsys_lim_t *limits, uint32_t *props)
    728 {
    729 	int temp = sc->sc_map[edata->sensor];
    730 	uint8_t	reg, val;
    731 
    732 	*props &= ~(PROP_CRITMAX | PROP_WARNMAX | PROP_WARNMIN);
    733 
    734 	reg = adm1026_temps_table[temp].t_reg;
    735 	if (adm1026_read_reg(sc, reg, &val) != 0)
    736 		return;
    737 	limits->sel_critmax = VAL_TO_TEMP(val);
    738 	*props |= PROP_CRITMAX;
    739 
    740 	reg = adm1026_temps_table[temp].h_reg;
    741 	if (adm1026_read_reg(sc, reg, &val) != 0)
    742 		return;
    743 	limits->sel_warnmax = VAL_TO_TEMP(val);
    744 	*props |= PROP_WARNMAX;
    745 
    746 	reg = adm1026_temps_table[temp].l_reg;
    747 	if (adm1026_read_reg(sc, reg, &val) != 0)
    748 		return;
    749 	limits->sel_warnmin = VAL_TO_TEMP(val);
    750 	*props |= PROP_WARNMIN;
    751 }
    752 
    753 static void
    754 adm1026_get_volt_limits(struct adm1026_softc *sc, envsys_data_t *edata,
    755 	sysmon_envsys_lim_t *limits, uint32_t *props)
    756 {
    757 	int volt = sc->sc_map[edata->sensor];
    758 	uint8_t	reg, val;
    759 
    760 	*props &= ~(PROP_WARNMAX | PROP_WARNMIN);
    761 
    762 	reg = adm1026_volts_table[volt].h_reg;
    763 	if (adm1026_read_reg(sc, reg, &val) != 0)
    764 		return;
    765 	limits->sel_warnmax = VAL_TO_VOLT(val, volt);
    766 	*props |= PROP_WARNMAX;
    767 
    768 	reg = adm1026_volts_table[volt].l_reg;
    769 	if (adm1026_read_reg(sc, reg, &val) != 0)
    770 		return;
    771 	limits->sel_warnmin = VAL_TO_VOLT(val, volt);
    772 	*props |= PROP_WARNMIN;
    773 }
    774 
    775 void
    776 adm1026_set_limits(struct sysmon_envsys *sme, envsys_data_t *edata,
    777 	sysmon_envsys_lim_t *limits, uint32_t *props)
    778 {
    779 	struct adm1026_softc *sc = sme->sme_cookie;
    780 
    781 	if (edata->sensor < sc->sc_nfans)
    782 		adm1026_set_fan_limits(sc, edata, limits, props);
    783 	else if (edata->sensor < sc->sc_nfans + sc->sc_ntemps)
    784 		adm1026_set_temp_limits(sc, edata, limits, props);
    785 	else
    786 		adm1026_set_volt_limits(sc, edata, limits, props);
    787 }
    788 
    789 static void
    790 adm1026_set_fan_limits(struct adm1026_softc *sc, envsys_data_t *edata,
    791 	sysmon_envsys_lim_t *limits, uint32_t *props)
    792 {
    793 	int fan, snum;
    794 	uint8_t	reg, val;
    795 
    796 	fan = sc->sc_map[edata->sensor];
    797 	snum = ADM1026_FAN_NUM(fan);
    798 
    799 	if (limits == NULL || *props & PROP_WARNMIN) {
    800 		if (limits == NULL)	/* Restore defaults */
    801 			val = sc->sc_highlim[snum];
    802 		else {
    803 			if (limits->sel_warnmin == 0)
    804 				val = 0xff;
    805 			else
    806 				val = SPEED_TO_VAL(limits->sel_warnmin,
    807 				    sc->sc_fandiv[fan]);
    808 		}
    809 		reg = ADM1026_FAN_HIGH(fan);
    810 		adm1026_write_reg(sc, reg, val);
    811 	}
    812 }
    813 
    814 static void
    815 adm1026_set_temp_limits(struct adm1026_softc *sc, envsys_data_t *edata,
    816 	sysmon_envsys_lim_t *limits, uint32_t *props)
    817 {
    818 	int temp, snum;
    819 	uint8_t	reg, val;
    820 
    821 	temp = sc->sc_map[edata->sensor];
    822 	snum = ADM1026_TEMP_NUM(temp);
    823 
    824 	if (limits == NULL || *props & PROP_CRITMAX) {
    825 		if (limits == NULL)	/* Restore defaults */
    826 			val = sc->sc_highlim[snum];
    827 		else {
    828 			val = TEMP_TO_VAL(limits->sel_critmax);
    829 		}
    830 		reg = adm1026_temps_table[temp].h_reg;
    831 		adm1026_write_reg(sc, reg, val);
    832 	}
    833 
    834 	if (limits == NULL || *props & PROP_WARNMAX) {
    835 		if (limits == NULL)	/* Restore defaults */
    836 			val = sc->sc_thermlim[snum];
    837 		else {
    838 			val = TEMP_TO_VAL(limits->sel_warnmax);
    839 		}
    840 		reg = adm1026_temps_table[temp].t_reg;
    841 		adm1026_write_reg(sc, reg, val);
    842 	}
    843 
    844 	if (limits == NULL || *props & PROP_WARNMIN) {
    845 		if (limits == NULL)	/* Restore defaults */
    846 			val = sc->sc_lowlim[snum];
    847 		else {
    848 			val = TEMP_TO_VAL(limits->sel_warnmin);
    849 		}
    850 		reg = adm1026_temps_table[temp].l_reg;
    851 		adm1026_write_reg(sc, reg, val);
    852 	}
    853 }
    854 
    855 static void
    856 adm1026_set_volt_limits(struct adm1026_softc *sc, envsys_data_t *edata,
    857 	sysmon_envsys_lim_t *limits, uint32_t *props)
    858 {
    859 	int volt, snum;
    860 	uint8_t	reg, val;
    861 
    862 	volt = sc->sc_map[edata->sensor];
    863 	snum = ADM1026_VOLT_NUM(volt);
    864 
    865 	if (limits == NULL || *props & PROP_WARNMAX) {
    866 		if (limits == NULL)	/* Restore defaults */
    867 			val = sc->sc_highlim[snum];
    868 		else {
    869 			val = VOLT_TO_VAL(limits->sel_warnmax, volt);
    870 		}
    871 		reg = adm1026_volts_table[volt].h_reg;
    872 		adm1026_write_reg(sc, reg, val);
    873 	}
    874 
    875 	if (limits == NULL || *props & PROP_WARNMIN) {
    876 		if (limits == NULL)	/* Restore defaults */
    877 			val = sc->sc_lowlim[snum];
    878 		else {
    879 			val = VOLT_TO_VAL(limits->sel_warnmin, volt);
    880 		}
    881 		reg = adm1026_volts_table[volt].l_reg;
    882 		adm1026_write_reg(sc, reg, val);
    883 	}
    884 }
    885 
    886 static int
    887 adm1026_read_reg_int(i2c_tag_t tag, i2c_addr_t addr, uint8_t reg, uint8_t *val)
    888 {
    889 	int err = 0;
    890 
    891 	if ((err = iic_acquire_bus(tag, 0)) != 0)
    892 		return err;
    893 	err = iic_exec(tag, I2C_OP_READ_WITH_STOP, addr, &reg, 1, val, 1, 0);
    894 	iic_release_bus(tag, 0);
    895 	return err;
    896 }
    897 
    898 static int
    899 adm1026_write_reg(struct adm1026_softc *sc, uint8_t reg, uint8_t val)
    900 {
    901 	int err = 0;
    902 
    903 	if ((err = iic_acquire_bus(sc->sc_tag, 0)) != 0)
    904 		return err;
    905 	err = iic_exec(sc->sc_tag, I2C_OP_WRITE_WITH_STOP, sc->sc_address,
    906 	    &reg, 1, &val, 1, 0);
    907 	iic_release_bus(sc->sc_tag, 0);
    908 	return err;
    909 }
    910