xref: /openbsd-src/sys/dev/isa/uguru.c (revision d095f71341fedbadd002e8f3b7308751f716f065)
1*d095f713Snaddy /*	$OpenBSD: uguru.c,v 1.7 2022/04/08 15:02:28 naddy Exp $	*/
23a1bedeaSderaadt 
33a1bedeaSderaadt /*
43a1bedeaSderaadt  * Copyright (c) 2010 Mikko Tolmunen <oskari@sefirosu.org>
53a1bedeaSderaadt  *
63a1bedeaSderaadt  * Permission to use, copy, modify, and distribute this software for any
73a1bedeaSderaadt  * purpose with or without fee is hereby granted, provided that the above
83a1bedeaSderaadt  * copyright notice and this permission notice appear in all copies.
93a1bedeaSderaadt  *
103a1bedeaSderaadt  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
113a1bedeaSderaadt  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
123a1bedeaSderaadt  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
133a1bedeaSderaadt  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
143a1bedeaSderaadt  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
153a1bedeaSderaadt  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
163a1bedeaSderaadt  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
173a1bedeaSderaadt  */
183a1bedeaSderaadt 
193a1bedeaSderaadt #include <sys/param.h>
203a1bedeaSderaadt #include <sys/systm.h>
213a1bedeaSderaadt #include <sys/device.h>
223a1bedeaSderaadt #include <sys/sensors.h>
233a1bedeaSderaadt 
243a1bedeaSderaadt #include <machine/bus.h>
253a1bedeaSderaadt 
263a1bedeaSderaadt #include <dev/isa/isavar.h>
273a1bedeaSderaadt 
283a1bedeaSderaadt #ifdef UGURU_DEBUG
293a1bedeaSderaadt int	uguru_dbg = 0;
303a1bedeaSderaadt #define DPRINTF(lvl, fmt...)	\
313a1bedeaSderaadt 	if (uguru_dbg >= lvl)	\
323a1bedeaSderaadt 		printf(fmt);
333a1bedeaSderaadt #else
343a1bedeaSderaadt #define DPRINTF(lvl, fmt...)
353a1bedeaSderaadt #endif
363a1bedeaSderaadt 
373a1bedeaSderaadt #define UGURU_READ(iot, ioh, reg)	\
383a1bedeaSderaadt     bus_space_read_1((iot), (ioh), (reg))
393a1bedeaSderaadt #define UGURU_WRITE(iot, ioh, reg, val) \
403a1bedeaSderaadt     bus_space_write_1((iot), (ioh), (reg), (val))
413a1bedeaSderaadt 
423a1bedeaSderaadt #define UGURU_DATA		0x00	/* configuration data register */
433a1bedeaSderaadt #define UGURU_INDEX		0x04	/* configuration index register */
445c375225Sderaadt #define UGURU_IOSIZE		0x08
453a1bedeaSderaadt 
463a1bedeaSderaadt #define UGURU_DUMMY		0x00	/* dummy zero bit */
473a1bedeaSderaadt #define UGURU_ITM_DATA		0x21	/* temp/volt readings */
483a1bedeaSderaadt #define UGURU_ITM_CTRL		0x22	/* temp/volt settings */
493a1bedeaSderaadt #define UGURU_FAN_DATA		0x26	/* fan readings */
503a1bedeaSderaadt #define UGURU_FAN_CTRL		0x27	/* fan settings */
513a1bedeaSderaadt #define UGURU_PRODID		0x44	/* product ID */
523a1bedeaSderaadt 
533a1bedeaSderaadt #define UGURU_VENDID_ABIT	0x147b	/* ABIT */
543a1bedeaSderaadt #define UGURU_DEVID1		0x2003	/* AC2003 */
553a1bedeaSderaadt #define UGURU_DEVID2		0x2005	/* AC2005 */
563a1bedeaSderaadt 
573a1bedeaSderaadt #define ABIT_SYSID_KV01		0x0301
583a1bedeaSderaadt #define ABIT_SYSID_AI01		0x0302
593a1bedeaSderaadt #define ABIT_SYSID_AN01		0x0303
603a1bedeaSderaadt #define ABIT_SYSID_AA01		0x0304
613a1bedeaSderaadt #define ABIT_SYSID_AG01		0x0305
623a1bedeaSderaadt #define ABIT_SYSID_AV01		0x0306
633a1bedeaSderaadt #define ABIT_SYSID_KVP1		0x0307
643a1bedeaSderaadt #define ABIT_SYSID_AS01		0x0308
653a1bedeaSderaadt #define ABIT_SYSID_AX01		0x0309
663a1bedeaSderaadt #define ABIT_SYSID_M401		0x030a
673a1bedeaSderaadt #define ABIT_SYSID_AN02		0x030b
683a1bedeaSderaadt #define ABIT_SYSID_AU01		0x050c
693a1bedeaSderaadt #define ABIT_SYSID_AW01		0x050d
703a1bedeaSderaadt #define ABIT_SYSID_AL01		0x050e
713a1bedeaSderaadt #define ABIT_SYSID_BL01		0x050f
723a1bedeaSderaadt #define ABIT_SYSID_NI01		0x0510
733a1bedeaSderaadt #define ABIT_SYSID_AT01		0x0511
743a1bedeaSderaadt #define ABIT_SYSID_AN03		0x0512
753a1bedeaSderaadt #define ABIT_SYSID_AW02		0x0513
763a1bedeaSderaadt #define ABIT_SYSID_AB01		0x0514
773a1bedeaSderaadt #define ABIT_SYSID_AN04		0x0515
783a1bedeaSderaadt #define ABIT_SYSID_AW03		0x0516
793a1bedeaSderaadt #define ABIT_SYSID_AT02		0x0517
803a1bedeaSderaadt #define ABIT_SYSID_AB02		0x0518
813a1bedeaSderaadt #define ABIT_SYSID_IN01		0x0519
823a1bedeaSderaadt #define ABIT_SYSID_IP01		0x051a
833a1bedeaSderaadt #define ABIT_SYSID_IX01		0x051b
843a1bedeaSderaadt #define ABIT_SYSID_IX02		0x051c
853a1bedeaSderaadt 
863a1bedeaSderaadt #define UGURU_INTERVAL		5
873a1bedeaSderaadt #define UGURU_MAX_SENSORS	27
883a1bedeaSderaadt 
893a1bedeaSderaadt #define RFACT_NONE		13700
903a1bedeaSderaadt #define RFACT_NONE2		10000
913a1bedeaSderaadt #define RFACT(x, y)		(RFACT_NONE * ((x) + (y)) / (y))
923a1bedeaSderaadt #define RFACT2(x, y)		(RFACT_NONE2 * ((x) + (y)) / (y))
933a1bedeaSderaadt 
943a1bedeaSderaadt struct uguru_softc {
953a1bedeaSderaadt 	struct device		 sc_dev;
963a1bedeaSderaadt 
973a1bedeaSderaadt 	bus_space_tag_t		 sc_iot;
983a1bedeaSderaadt 	bus_space_handle_t	 sc_ioh;
993a1bedeaSderaadt 
1003a1bedeaSderaadt 	struct ksensor		 sc_sensors[UGURU_MAX_SENSORS];
1013a1bedeaSderaadt 	struct ksensordev	 sc_sensordev;
1023a1bedeaSderaadt 	int			 sc_numsensors;
103*d095f713Snaddy 	const struct uguru_sensor *uguru_sensors;
1043a1bedeaSderaadt 	struct {
1053a1bedeaSderaadt 		uint8_t		 reading;
1063a1bedeaSderaadt /*		uint8_t		 flags; */
1073a1bedeaSderaadt 		uint8_t		 lower;
1083a1bedeaSderaadt 		uint8_t		 upper;
1093a1bedeaSderaadt 	} cs;
1103a1bedeaSderaadt 	int			(*read)(struct uguru_softc *, int);
1113a1bedeaSderaadt };
1123a1bedeaSderaadt 
1133a1bedeaSderaadt struct uguru_sensor {
1143a1bedeaSderaadt 	char			*desc;
1153a1bedeaSderaadt 	enum sensor_type	 type;
1163a1bedeaSderaadt 	void			(*refresh)(struct uguru_softc *, int);
1173a1bedeaSderaadt 	uint8_t			 reg;
1183a1bedeaSderaadt 	int			 rfact;
1193a1bedeaSderaadt };
1203a1bedeaSderaadt 
1213a1bedeaSderaadt void	 uguru_refresh_temp(struct uguru_softc *, int);
1223a1bedeaSderaadt void	 uguru_refresh_volt(struct uguru_softc *, int);
1233a1bedeaSderaadt void	 uguru_refresh_fan(struct uguru_softc *, int);
1243a1bedeaSderaadt 
1253a1bedeaSderaadt #define UGURU_R_TEMP	uguru_refresh_temp
1263a1bedeaSderaadt #define UGURU_R_VOLT	uguru_refresh_volt
1273a1bedeaSderaadt #define UGURU_R_FAN	uguru_refresh_fan
1283a1bedeaSderaadt 
129*d095f713Snaddy const struct uguru_sensor abitkv_sensors[] = {
1303a1bedeaSderaadt 	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
1313a1bedeaSderaadt 	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
1323a1bedeaSderaadt 	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f },
1333a1bedeaSderaadt 
1343a1bedeaSderaadt 	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE },
1353a1bedeaSderaadt 	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) },
1363a1bedeaSderaadt 	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) },
1373a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT(2800, 887) },
1383a1bedeaSderaadt 	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) },
1393a1bedeaSderaadt 	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE },
1403a1bedeaSderaadt 	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
1413a1bedeaSderaadt 
1423a1bedeaSderaadt 	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
1433a1bedeaSderaadt 	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
1443a1bedeaSderaadt 	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
1453a1bedeaSderaadt 	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
1463a1bedeaSderaadt 	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 },
1473a1bedeaSderaadt 
1483a1bedeaSderaadt 	{ NULL }
1493a1bedeaSderaadt };
1503a1bedeaSderaadt 
151*d095f713Snaddy const struct uguru_sensor abitaa_sensors[] = {
1523a1bedeaSderaadt 	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
1533a1bedeaSderaadt 	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
1543a1bedeaSderaadt 	{ "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x0f },
1553a1bedeaSderaadt 	{ "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x0c },
1563a1bedeaSderaadt 
1573a1bedeaSderaadt 	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE },
1583a1bedeaSderaadt 	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) },
1593a1bedeaSderaadt 	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) },
1603a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT(2800, 888) },
1613a1bedeaSderaadt 	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) },
1623a1bedeaSderaadt 	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE },
1633a1bedeaSderaadt 	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
1643a1bedeaSderaadt 	{ "FSBVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE },
1653a1bedeaSderaadt 	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE },
1663a1bedeaSderaadt 	{ "NB +2.5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE },
1673a1bedeaSderaadt 
1683a1bedeaSderaadt 	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
1693a1bedeaSderaadt 	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
1703a1bedeaSderaadt 	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
1713a1bedeaSderaadt 	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
1723a1bedeaSderaadt 	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 },
1733a1bedeaSderaadt 
1743a1bedeaSderaadt 	{ NULL }
1753a1bedeaSderaadt };
1763a1bedeaSderaadt 
177*d095f713Snaddy const struct uguru_sensor abitav_sensors[] = {
1783a1bedeaSderaadt 	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
1793a1bedeaSderaadt 	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
1803a1bedeaSderaadt 	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f },
1813a1bedeaSderaadt 
1823a1bedeaSderaadt 	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE },
1833a1bedeaSderaadt 	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) },
1843a1bedeaSderaadt 	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) },
1853a1bedeaSderaadt 	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) },
1863a1bedeaSderaadt 	{ "+3.3VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT(100, 402) },
1873a1bedeaSderaadt 	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE },
1883a1bedeaSderaadt 	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
1893a1bedeaSderaadt 	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT_NONE },
1903a1bedeaSderaadt 	{ "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE },
1913a1bedeaSderaadt 	{ "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE },
1923a1bedeaSderaadt 	{ "AGP", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE },
1933a1bedeaSderaadt 
1943a1bedeaSderaadt 	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
1953a1bedeaSderaadt 	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
1963a1bedeaSderaadt 	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
1973a1bedeaSderaadt 	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
1983a1bedeaSderaadt 	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 },
1993a1bedeaSderaadt 
2003a1bedeaSderaadt 	{ NULL }
2013a1bedeaSderaadt };
2023a1bedeaSderaadt 
203*d095f713Snaddy const struct uguru_sensor abitas_sensors[] = {
2043a1bedeaSderaadt 	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
2053a1bedeaSderaadt 	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
2063a1bedeaSderaadt 	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f },
2073a1bedeaSderaadt 
2083a1bedeaSderaadt 	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE },
2093a1bedeaSderaadt 	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) },
2103a1bedeaSderaadt 	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) },
2113a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT(2800, 884) },
2123a1bedeaSderaadt 	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) },
2133a1bedeaSderaadt 	{ "+3.3VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT(100, 402) },
2143a1bedeaSderaadt 	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE },
2153a1bedeaSderaadt 	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
2163a1bedeaSderaadt 	{ "FSBVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE },
2173a1bedeaSderaadt 	{ "NB/AGP", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE },
2183a1bedeaSderaadt 	{ "GMCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE },
2193a1bedeaSderaadt 
2203a1bedeaSderaadt 	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
2213a1bedeaSderaadt 	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
2223a1bedeaSderaadt 	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
2233a1bedeaSderaadt 	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
2243a1bedeaSderaadt 	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 },
2253a1bedeaSderaadt 
2263a1bedeaSderaadt 	{ NULL }
2273a1bedeaSderaadt };
2283a1bedeaSderaadt 
229*d095f713Snaddy const struct uguru_sensor abitax_sensors[] = {
2303a1bedeaSderaadt 	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
2313a1bedeaSderaadt 	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
2323a1bedeaSderaadt 	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f },
2333a1bedeaSderaadt 
2343a1bedeaSderaadt 	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE },
2353a1bedeaSderaadt 	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) },
2363a1bedeaSderaadt 	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) },
2373a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT(2800, 888) },
2383a1bedeaSderaadt 	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) },
2393a1bedeaSderaadt 	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE },
2403a1bedeaSderaadt 	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
2413a1bedeaSderaadt 	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT_NONE },
2423a1bedeaSderaadt 	{ "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE },
2433a1bedeaSderaadt 	{ "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE },
2443a1bedeaSderaadt 
2453a1bedeaSderaadt 	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
2463a1bedeaSderaadt 	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
2473a1bedeaSderaadt 	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
2483a1bedeaSderaadt 	{ "AUX", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
2493a1bedeaSderaadt 
2503a1bedeaSderaadt 	{ NULL }
2513a1bedeaSderaadt };
2523a1bedeaSderaadt 
253*d095f713Snaddy const struct uguru_sensor abitm4_sensors[] = {
2543a1bedeaSderaadt 	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
2553a1bedeaSderaadt 	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
2563a1bedeaSderaadt 	{ "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x02 },
2573a1bedeaSderaadt 	{ "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x03 },
2583a1bedeaSderaadt 	{ "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x04 },
2593a1bedeaSderaadt 	{ "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x05 },
2603a1bedeaSderaadt 
2613a1bedeaSderaadt 	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT_NONE },
2623a1bedeaSderaadt 	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x13, RFACT(100, 402) },
2633a1bedeaSderaadt 	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x12, RFACT(442, 560) },
2643a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x11, RFACT(2800, 884) },
2653a1bedeaSderaadt 	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x10, RFACT(442, 560) },
2663a1bedeaSderaadt 	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE },
2673a1bedeaSderaadt 	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
2683a1bedeaSderaadt 	{ "FSBVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT_NONE },
2693a1bedeaSderaadt 	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT_NONE },
2703a1bedeaSderaadt 	{ "NB +2.5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0c, RFACT_NONE },
2713a1bedeaSderaadt 
2723a1bedeaSderaadt 	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
2733a1bedeaSderaadt 	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
2743a1bedeaSderaadt 	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
2753a1bedeaSderaadt 	{ "OTES1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
2763a1bedeaSderaadt 	{ "OTES2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 },
2773a1bedeaSderaadt 
2783a1bedeaSderaadt 	{ NULL }
2793a1bedeaSderaadt };
2803a1bedeaSderaadt 
281*d095f713Snaddy const struct uguru_sensor abitan_sensors[] = {
2823a1bedeaSderaadt 	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
2833a1bedeaSderaadt 	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
2843a1bedeaSderaadt 	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f },
2853a1bedeaSderaadt 
2863a1bedeaSderaadt 	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE },
2873a1bedeaSderaadt 	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) },
2883a1bedeaSderaadt 	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) },
2893a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT(2800, 844) },
2903a1bedeaSderaadt 	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) },
2913a1bedeaSderaadt 	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE },
2923a1bedeaSderaadt 	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
2933a1bedeaSderaadt 	{ "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE },
2943a1bedeaSderaadt 	{ "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE },
2953a1bedeaSderaadt 	{ "MCP", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE },
2963a1bedeaSderaadt 	{ "MCP SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT_NONE },
2973a1bedeaSderaadt 
2983a1bedeaSderaadt 	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
2993a1bedeaSderaadt 	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
3003a1bedeaSderaadt 	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
3013a1bedeaSderaadt 	{ "AUX", SENSOR_FANRPM, UGURU_R_FAN, 0x05 },
3023a1bedeaSderaadt 	{ "OTES1", SENSOR_FANRPM, UGURU_R_FAN, 0x04 },
3033a1bedeaSderaadt 	{ "OTES2", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
3043a1bedeaSderaadt 
3053a1bedeaSderaadt 	{ NULL }
3063a1bedeaSderaadt };
3073a1bedeaSderaadt 
308*d095f713Snaddy const struct uguru_sensor abital_sensors[] = {
3093a1bedeaSderaadt 	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
3103a1bedeaSderaadt 	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
3113a1bedeaSderaadt 	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
3123a1bedeaSderaadt 
3133a1bedeaSderaadt 	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
3143a1bedeaSderaadt 	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
3153a1bedeaSderaadt 	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
3163a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
3173a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
3183a1bedeaSderaadt 	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
3193a1bedeaSderaadt 	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT_NONE2 },
3203a1bedeaSderaadt 	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
3213a1bedeaSderaadt 	{ "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
3223a1bedeaSderaadt 	{ "MCH/PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
3233a1bedeaSderaadt 	{ "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) },
3243a1bedeaSderaadt 	{ "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
3253a1bedeaSderaadt 
3263a1bedeaSderaadt 	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
3273a1bedeaSderaadt 	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
3283a1bedeaSderaadt 	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
3293a1bedeaSderaadt 	{ "AUX", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
3303a1bedeaSderaadt 
3313a1bedeaSderaadt 	{ NULL }
3323a1bedeaSderaadt };
3333a1bedeaSderaadt 
334*d095f713Snaddy const struct uguru_sensor abitaw_sensors[] = {
3353a1bedeaSderaadt 	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
3363a1bedeaSderaadt 	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
3373a1bedeaSderaadt 	{ "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
3383a1bedeaSderaadt 	{ "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x1b },
3393a1bedeaSderaadt 	{ "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x1c },
3403a1bedeaSderaadt 	{ "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x1d },
3413a1bedeaSderaadt 
3423a1bedeaSderaadt 	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
3433a1bedeaSderaadt 	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
3443a1bedeaSderaadt 	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
3453a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
3463a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
3473a1bedeaSderaadt 	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
3483a1bedeaSderaadt 	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT_NONE2 },
3493a1bedeaSderaadt 	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
3503a1bedeaSderaadt 	{ "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
3513a1bedeaSderaadt 	{ "MCH/PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
3523a1bedeaSderaadt 	{ "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) },
3533a1bedeaSderaadt 	{ "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
3543a1bedeaSderaadt 
3553a1bedeaSderaadt 	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
3563a1bedeaSderaadt 	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
3573a1bedeaSderaadt 	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
3583a1bedeaSderaadt 	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
3593a1bedeaSderaadt 	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
3603a1bedeaSderaadt 	{ "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
3613a1bedeaSderaadt 	{ "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x26 },
3623a1bedeaSderaadt 	{ "AUX5", SENSOR_FANRPM, UGURU_R_FAN, 0x27 },
3633a1bedeaSderaadt 
3643a1bedeaSderaadt 	{ NULL }
3653a1bedeaSderaadt };
3663a1bedeaSderaadt 
367*d095f713Snaddy const struct uguru_sensor abitni_sensors[] = {
3683a1bedeaSderaadt 	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
3693a1bedeaSderaadt 	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
3703a1bedeaSderaadt 	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
3713a1bedeaSderaadt 
3723a1bedeaSderaadt 	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
3733a1bedeaSderaadt 	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
3743a1bedeaSderaadt 	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
3753a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
3763a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
3773a1bedeaSderaadt 	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
3783a1bedeaSderaadt 	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT_NONE2 },
3793a1bedeaSderaadt 	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
3803a1bedeaSderaadt 	{ "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
3813a1bedeaSderaadt 	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
3823a1bedeaSderaadt 	{ "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
3833a1bedeaSderaadt 
3843a1bedeaSderaadt 	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
3853a1bedeaSderaadt 	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
3863a1bedeaSderaadt 	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
3873a1bedeaSderaadt 	{ "AUX", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
3883a1bedeaSderaadt 	{ "OTES1", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
3893a1bedeaSderaadt 	{ "OTES2", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
3903a1bedeaSderaadt 
3913a1bedeaSderaadt 	{ NULL }
3923a1bedeaSderaadt };
3933a1bedeaSderaadt 
394*d095f713Snaddy const struct uguru_sensor abitat_sensors[] = {
3953a1bedeaSderaadt 	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
3963a1bedeaSderaadt 	{ "NB", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
3973a1bedeaSderaadt 	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
3983a1bedeaSderaadt 	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1b },
3993a1bedeaSderaadt 
4003a1bedeaSderaadt 	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
4013a1bedeaSderaadt 	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
4023a1bedeaSderaadt 	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
4033a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
4043a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
4053a1bedeaSderaadt 	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
4063a1bedeaSderaadt 	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) },
4073a1bedeaSderaadt 	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
4083a1bedeaSderaadt 	{ "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT2(34, 34) },
4093a1bedeaSderaadt 	{ "PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0c, RFACT_NONE2 },
4103a1bedeaSderaadt 	{ "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
4113a1bedeaSderaadt 	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT_NONE2 },
4123a1bedeaSderaadt 	{ "NB +1.8V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
4133a1bedeaSderaadt 	{ "NB +1.8V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 },
4143a1bedeaSderaadt 
4153a1bedeaSderaadt 	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
4163a1bedeaSderaadt 	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
4173a1bedeaSderaadt 	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
4183a1bedeaSderaadt 	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
4193a1bedeaSderaadt 	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
4203a1bedeaSderaadt 	{ "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
4213a1bedeaSderaadt 
4223a1bedeaSderaadt 	{ NULL }
4233a1bedeaSderaadt };
4243a1bedeaSderaadt 
425*d095f713Snaddy const struct uguru_sensor abitan2_sensors[] = {
4263a1bedeaSderaadt 	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
4273a1bedeaSderaadt 	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
4283a1bedeaSderaadt 	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
4293a1bedeaSderaadt 
4303a1bedeaSderaadt 	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
4313a1bedeaSderaadt 	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
4323a1bedeaSderaadt 	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
4333a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
4343a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
4353a1bedeaSderaadt 	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
4363a1bedeaSderaadt 	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) },
4373a1bedeaSderaadt 	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
4383a1bedeaSderaadt 	{ "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) },
4393a1bedeaSderaadt 	{ "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
4403a1bedeaSderaadt 	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
4413a1bedeaSderaadt 	{ "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
4423a1bedeaSderaadt 
4433a1bedeaSderaadt 	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
4443a1bedeaSderaadt 	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
4453a1bedeaSderaadt 	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
4463a1bedeaSderaadt 	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
4473a1bedeaSderaadt 	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
4483a1bedeaSderaadt 
4493a1bedeaSderaadt 	{ NULL }
4503a1bedeaSderaadt };
4513a1bedeaSderaadt 
452*d095f713Snaddy const struct uguru_sensor abitab_sensors[] = {
4533a1bedeaSderaadt 	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
4543a1bedeaSderaadt 	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
4553a1bedeaSderaadt 	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
4563a1bedeaSderaadt 
4573a1bedeaSderaadt 	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
4583a1bedeaSderaadt 	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
4593a1bedeaSderaadt 	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
4603a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
4613a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
4623a1bedeaSderaadt 	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
4633a1bedeaSderaadt 	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT_NONE2 },
4643a1bedeaSderaadt 	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
4653a1bedeaSderaadt 	{ "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
4663a1bedeaSderaadt 	{ "ICHIO", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 },
4673a1bedeaSderaadt 	{ "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
4683a1bedeaSderaadt 	{ "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
4693a1bedeaSderaadt 
4703a1bedeaSderaadt 	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
4713a1bedeaSderaadt 	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
4723a1bedeaSderaadt 	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
4733a1bedeaSderaadt 	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
4743a1bedeaSderaadt 	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
4753a1bedeaSderaadt 	{ "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
4763a1bedeaSderaadt 
4773a1bedeaSderaadt 	{ NULL }
4783a1bedeaSderaadt };
4793a1bedeaSderaadt 
480*d095f713Snaddy const struct uguru_sensor abitan3_sensors[] = {
4813a1bedeaSderaadt 	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
4823a1bedeaSderaadt 	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
4833a1bedeaSderaadt 	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
4843a1bedeaSderaadt 
4853a1bedeaSderaadt 	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
4863a1bedeaSderaadt 	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
4873a1bedeaSderaadt 	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
4883a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
4893a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
4903a1bedeaSderaadt 	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
4913a1bedeaSderaadt 	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) },
4923a1bedeaSderaadt 	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
4933a1bedeaSderaadt 	{ "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) },
4943a1bedeaSderaadt 	{ "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
4953a1bedeaSderaadt 	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
4963a1bedeaSderaadt 	{ "NB/PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE2 },
4973a1bedeaSderaadt 	{ "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
4983a1bedeaSderaadt 
4993a1bedeaSderaadt 	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
5003a1bedeaSderaadt 	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
5013a1bedeaSderaadt 	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
5023a1bedeaSderaadt 	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
5033a1bedeaSderaadt 	{ "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
5043a1bedeaSderaadt 	{ "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
5053a1bedeaSderaadt 
5063a1bedeaSderaadt 	{ NULL }
5073a1bedeaSderaadt };
5083a1bedeaSderaadt 
509*d095f713Snaddy const struct uguru_sensor abitaw2_sensors[] = {
5103a1bedeaSderaadt 	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
5113a1bedeaSderaadt 	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
5123a1bedeaSderaadt 	{ "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
5133a1bedeaSderaadt 	{ "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x1b },
5143a1bedeaSderaadt 	{ "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x1c },
5153a1bedeaSderaadt 	{ "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x1d },
5163a1bedeaSderaadt 
5173a1bedeaSderaadt 	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
5183a1bedeaSderaadt 	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
5193a1bedeaSderaadt 	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
5203a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
5213a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
5223a1bedeaSderaadt 	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
5233a1bedeaSderaadt 	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) },
5243a1bedeaSderaadt 	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
5253a1bedeaSderaadt 	{ "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
5263a1bedeaSderaadt 	{ "MCH/PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
5273a1bedeaSderaadt 	{ "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) },
5283a1bedeaSderaadt 	{ "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
5293a1bedeaSderaadt 
5303a1bedeaSderaadt 	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
5313a1bedeaSderaadt 	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
5323a1bedeaSderaadt 	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
5333a1bedeaSderaadt 	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
5343a1bedeaSderaadt 	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
5353a1bedeaSderaadt 	{ "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
5363a1bedeaSderaadt 	{ "OTES1", SENSOR_FANRPM, UGURU_R_FAN, 0x26 },
5373a1bedeaSderaadt 	{ "OTES2", SENSOR_FANRPM, UGURU_R_FAN, 0x27 },
5383a1bedeaSderaadt 
5393a1bedeaSderaadt 	{ NULL }
5403a1bedeaSderaadt };
5413a1bedeaSderaadt 
542*d095f713Snaddy const struct uguru_sensor abitat2_sensors[] = {
5433a1bedeaSderaadt 	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
5443a1bedeaSderaadt 	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
5453a1bedeaSderaadt 	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1b },
5463a1bedeaSderaadt 
5473a1bedeaSderaadt 	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
5483a1bedeaSderaadt 	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
5493a1bedeaSderaadt 	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
5503a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
5513a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
5523a1bedeaSderaadt 	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
5533a1bedeaSderaadt 	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) },
5543a1bedeaSderaadt 	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
5553a1bedeaSderaadt 	{ "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT2(34, 34) },
5563a1bedeaSderaadt 	{ "PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0c, RFACT_NONE2 },
5573a1bedeaSderaadt 	{ "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
5583a1bedeaSderaadt 	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT_NONE2 },
5593a1bedeaSderaadt 	{ "NB +1.8V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
5603a1bedeaSderaadt 	{ "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 },
5613a1bedeaSderaadt 
5623a1bedeaSderaadt 	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
5633a1bedeaSderaadt 	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
5643a1bedeaSderaadt 	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
5653a1bedeaSderaadt 	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
5663a1bedeaSderaadt 	{ "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
5673a1bedeaSderaadt 	{ "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
5683a1bedeaSderaadt 
5693a1bedeaSderaadt 	{ NULL }
5703a1bedeaSderaadt };
5713a1bedeaSderaadt 
572*d095f713Snaddy const struct uguru_sensor abitab2_sensors[] = {
5733a1bedeaSderaadt 	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
5743a1bedeaSderaadt 	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
5753a1bedeaSderaadt 	{ "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
5763a1bedeaSderaadt 	{ "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x1b },
5773a1bedeaSderaadt 	{ "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x1c },
5783a1bedeaSderaadt 	{ "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x1d },
5793a1bedeaSderaadt 	{ "PWM5", SENSOR_TEMP, UGURU_R_TEMP, 0x1e },
5803a1bedeaSderaadt 
5813a1bedeaSderaadt 	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
5823a1bedeaSderaadt 	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
5833a1bedeaSderaadt 	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
5843a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
5853a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
5863a1bedeaSderaadt 	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
5873a1bedeaSderaadt 	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) },
5883a1bedeaSderaadt 	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
5893a1bedeaSderaadt 	{ "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
5903a1bedeaSderaadt 	{ "ICHIO", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 },
5913a1bedeaSderaadt 	{ "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
5923a1bedeaSderaadt 	{ "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
5933a1bedeaSderaadt 
5943a1bedeaSderaadt 	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
5953a1bedeaSderaadt 	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
5963a1bedeaSderaadt 	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
5973a1bedeaSderaadt 	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
5983a1bedeaSderaadt 	{ "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
5993a1bedeaSderaadt 	{ "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
6003a1bedeaSderaadt 
6013a1bedeaSderaadt 	{ NULL }
6023a1bedeaSderaadt };
6033a1bedeaSderaadt 
604*d095f713Snaddy const struct uguru_sensor abitin_sensors[] = {
6053a1bedeaSderaadt 	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
6063a1bedeaSderaadt 	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
6073a1bedeaSderaadt 	{ "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
6083a1bedeaSderaadt 	{ "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x1b },
6093a1bedeaSderaadt 	{ "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x1c },
6103a1bedeaSderaadt 	{ "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x1d },
6113a1bedeaSderaadt 	{ "PWM5", SENSOR_TEMP, UGURU_R_TEMP, 0x1e },
6123a1bedeaSderaadt 
6133a1bedeaSderaadt 	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT_NONE2 },
6143a1bedeaSderaadt 	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
6153a1bedeaSderaadt 	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
6163a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0c, RFACT2(50, 10) },
6173a1bedeaSderaadt 	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
6183a1bedeaSderaadt 	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
6193a1bedeaSderaadt 	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT2(34, 34) },
6203a1bedeaSderaadt 	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE2 },
6213a1bedeaSderaadt 	{ "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
6223a1bedeaSderaadt 	{ "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 },
6233a1bedeaSderaadt 	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
6243a1bedeaSderaadt 	{ "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
6253a1bedeaSderaadt 
6263a1bedeaSderaadt 	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
6273a1bedeaSderaadt 	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
6283a1bedeaSderaadt 	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
6293a1bedeaSderaadt 	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
6303a1bedeaSderaadt 	{ "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
6313a1bedeaSderaadt 	{ "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
6323a1bedeaSderaadt 
6333a1bedeaSderaadt 	{ NULL }
6343a1bedeaSderaadt };
6353a1bedeaSderaadt 
6363a1bedeaSderaadt int	 uguru_match(struct device *, void *, void *);
6373a1bedeaSderaadt void	 uguru_attach(struct device *, struct device *, void *);
6383a1bedeaSderaadt void	 uguru_refresh(void *);
6393a1bedeaSderaadt int	 uguru_read_sensor(struct uguru_softc *, int);
6403a1bedeaSderaadt int	 uguru_ac5_read_sensor(struct uguru_softc *, int);
6413a1bedeaSderaadt int	 uguru_ac5_read(bus_space_tag_t, bus_space_handle_t,
6423a1bedeaSderaadt 	    uint16_t, void *, int);
6433a1bedeaSderaadt int	 uguru_write_multi(bus_space_tag_t, bus_space_handle_t,
6443a1bedeaSderaadt 	    uint8_t, void *, int);
6453a1bedeaSderaadt int	 uguru_read_multi(bus_space_tag_t, bus_space_handle_t, void *, int);
6463a1bedeaSderaadt 
6473a1bedeaSderaadt struct cfdriver uguru_cd = {
6483a1bedeaSderaadt 	NULL, "uguru", DV_DULL
6493a1bedeaSderaadt };
6503a1bedeaSderaadt 
651471aeecfSnaddy const struct cfattach uguru_ca = {
6523a1bedeaSderaadt 	sizeof(struct uguru_softc), uguru_match, uguru_attach
6533a1bedeaSderaadt };
6543a1bedeaSderaadt 
6553a1bedeaSderaadt int
uguru_match(struct device * parent,void * match,void * aux)6563a1bedeaSderaadt uguru_match(struct device *parent, void *match, void *aux)
6573a1bedeaSderaadt {
6583a1bedeaSderaadt 	struct isa_attach_args *ia = aux;
6593a1bedeaSderaadt 	bus_space_tag_t iot;
6603a1bedeaSderaadt 	bus_space_handle_t ioh;
6613a1bedeaSderaadt 	uint8_t data[9];
6623a1bedeaSderaadt 	uint16_t vendid, devid;
6633a1bedeaSderaadt 	int ret = 0;
6643a1bedeaSderaadt 
6653a1bedeaSderaadt 	iot = ia->ia_iot;
6663a1bedeaSderaadt 	if (bus_space_map(iot, ia->ipa_io[0].base, UGURU_IOSIZE, 0, &ioh)) {
6673a1bedeaSderaadt 		DPRINTF(0, ": can't map i/o space\n");
6683a1bedeaSderaadt 		return 0;
6693a1bedeaSderaadt 	}
6703a1bedeaSderaadt 
6713a1bedeaSderaadt 	UGURU_WRITE(iot, ioh, UGURU_INDEX, UGURU_PRODID);
6723a1bedeaSderaadt 	if (!uguru_read_multi(iot, ioh, &data, sizeof(data)) ||
6733a1bedeaSderaadt 	    !uguru_ac5_read(iot, ioh, 0x0904, &data, sizeof(data))) {
6743a1bedeaSderaadt 		vendid = data[0] << 8 | data[1];
6753a1bedeaSderaadt 		devid = data[2] << 8 | data[3];
6763a1bedeaSderaadt 
6773a1bedeaSderaadt 		if (vendid == UGURU_VENDID_ABIT &&
6783a1bedeaSderaadt 		    (devid == UGURU_DEVID1 ||
6793a1bedeaSderaadt 		     devid == UGURU_DEVID2)) {
6803a1bedeaSderaadt 			ia->ipa_nio = 1;
6813a1bedeaSderaadt 			ia->ipa_io[0].length = UGURU_IOSIZE;
6823a1bedeaSderaadt 			ia->ipa_nmem = 0;
6833a1bedeaSderaadt 			ia->ipa_nirq = 0;
6843a1bedeaSderaadt 			ia->ipa_ndrq = 0;
6853a1bedeaSderaadt 			ret = 1;
6863a1bedeaSderaadt 		}
6873a1bedeaSderaadt 	}
6883a1bedeaSderaadt 	bus_space_unmap(iot, ioh, UGURU_IOSIZE);
6893a1bedeaSderaadt 	return (ret);
6903a1bedeaSderaadt }
6913a1bedeaSderaadt 
6923a1bedeaSderaadt void
uguru_attach(struct device * parent,struct device * self,void * aux)6933a1bedeaSderaadt uguru_attach(struct device *parent, struct device *self, void *aux)
6943a1bedeaSderaadt {
6953a1bedeaSderaadt 	struct uguru_softc *sc = (void *)self;
6963a1bedeaSderaadt 	struct isa_attach_args *ia = aux;
697*d095f713Snaddy 	const struct uguru_sensor *sensors;
6983a1bedeaSderaadt 	uint8_t data[9];
6993a1bedeaSderaadt 	uint16_t vendid, devid, sysid;
7003a1bedeaSderaadt 	int i;
7013a1bedeaSderaadt 
7023a1bedeaSderaadt 	sc->sc_iot = ia->ia_iot;
7033a1bedeaSderaadt 	if (bus_space_map(sc->sc_iot, ia->ipa_io[0].base,
7043a1bedeaSderaadt 	    UGURU_IOSIZE, 0, &sc->sc_ioh)) {
7053a1bedeaSderaadt 		printf(": can't map i/o space\n");
7063a1bedeaSderaadt 		return;
7073a1bedeaSderaadt 	}
7083a1bedeaSderaadt 
7093a1bedeaSderaadt 	UGURU_WRITE(sc->sc_iot, sc->sc_ioh, UGURU_INDEX, UGURU_PRODID);
7103a1bedeaSderaadt 	if (!uguru_read_multi(sc->sc_iot, sc->sc_ioh, &data, sizeof(data))) {
7113a1bedeaSderaadt 		sc->read = uguru_read_sensor;
7123a1bedeaSderaadt 		goto done;
7133a1bedeaSderaadt 	}
7143a1bedeaSderaadt 
7153a1bedeaSderaadt 	/* AC2005 product ID */
7163a1bedeaSderaadt 	if (!uguru_ac5_read(sc->sc_iot, sc->sc_ioh,
7173a1bedeaSderaadt 	    0x0904, &data, sizeof(data))) {
7183a1bedeaSderaadt 		sc->read = uguru_ac5_read_sensor;
7193a1bedeaSderaadt 		goto done;
7203a1bedeaSderaadt 	}
7213a1bedeaSderaadt 
7223a1bedeaSderaadt 	printf("\n");
7233a1bedeaSderaadt 	return;
7243a1bedeaSderaadt 
7253a1bedeaSderaadt done:
7263a1bedeaSderaadt 	DPRINTF(5, ": %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",
7273a1bedeaSderaadt 	    data[0], data[1], data[2], data[3], data[4],
7283a1bedeaSderaadt 	    data[5], data[6], data[7], data[8]);
7293a1bedeaSderaadt 
7303a1bedeaSderaadt 	vendid = data[0] << 8 | data[1];
7313a1bedeaSderaadt 	devid = data[2] << 8 | data[3];
7323a1bedeaSderaadt 	sysid = data[3] << 8 | data[7];
7333a1bedeaSderaadt 
7343a1bedeaSderaadt 	if (vendid != UGURU_VENDID_ABIT ||
7353a1bedeaSderaadt 	    (devid != UGURU_DEVID1 &&
7363a1bedeaSderaadt 	     devid != UGURU_DEVID2)) {
7373a1bedeaSderaadt 		printf(": attach failed\n");
7383a1bedeaSderaadt 		return;
7393a1bedeaSderaadt 	}
7403a1bedeaSderaadt 	printf(": AC%x", devid);
7413a1bedeaSderaadt 
7423a1bedeaSderaadt 	switch(sysid) {
7433a1bedeaSderaadt 	case ABIT_SYSID_KV01:
7443a1bedeaSderaadt 	case ABIT_SYSID_AI01:
7453a1bedeaSderaadt 	case ABIT_SYSID_AN01:
7463a1bedeaSderaadt 		printf(" KV1");
7473a1bedeaSderaadt 		sensors = abitkv_sensors;
7483a1bedeaSderaadt 		break;
7493a1bedeaSderaadt 	case ABIT_SYSID_AA01:
7503a1bedeaSderaadt 	case ABIT_SYSID_AG01:
7513a1bedeaSderaadt 		printf(" AA1");
7523a1bedeaSderaadt 		sensors = abitaa_sensors;
7533a1bedeaSderaadt 		break;
7543a1bedeaSderaadt 	case ABIT_SYSID_AV01:
7553a1bedeaSderaadt 	case ABIT_SYSID_KVP1:
7563a1bedeaSderaadt 		printf(" AV1");
7573a1bedeaSderaadt 		sensors = abitav_sensors;
7583a1bedeaSderaadt 		break;
7593a1bedeaSderaadt 	case ABIT_SYSID_AS01:
7603a1bedeaSderaadt 		printf(" AS1");
7613a1bedeaSderaadt 		sensors = abitas_sensors;
7623a1bedeaSderaadt 		break;
7633a1bedeaSderaadt 	case ABIT_SYSID_AX01:
7643a1bedeaSderaadt 		printf(" AX1");
7653a1bedeaSderaadt 		sensors = abitax_sensors;
7663a1bedeaSderaadt 		break;
7673a1bedeaSderaadt 	case ABIT_SYSID_M401:
7683a1bedeaSderaadt 		printf(" M41");
7693a1bedeaSderaadt 		sensors = abitm4_sensors;
7703a1bedeaSderaadt 		break;
7713a1bedeaSderaadt 	case ABIT_SYSID_AN02:
7723a1bedeaSderaadt 		printf(" AN1");
7733a1bedeaSderaadt 		sensors = abitan_sensors;
7743a1bedeaSderaadt 		break;
7753a1bedeaSderaadt 	case ABIT_SYSID_AU01:
7763a1bedeaSderaadt 	case ABIT_SYSID_AL01:
7773a1bedeaSderaadt 	case ABIT_SYSID_BL01:
7783a1bedeaSderaadt 		printf(" AL1");
7793a1bedeaSderaadt 		sensors = abital_sensors;
7803a1bedeaSderaadt 		break;
7813a1bedeaSderaadt 	case ABIT_SYSID_AW01:
7823a1bedeaSderaadt 	case ABIT_SYSID_AW02:
7833a1bedeaSderaadt 		printf(" AW1");
7843a1bedeaSderaadt 		sensors = abitaw_sensors;
7853a1bedeaSderaadt 		break;
7863a1bedeaSderaadt 	case ABIT_SYSID_NI01:
7873a1bedeaSderaadt 		printf(" NI1");
7883a1bedeaSderaadt 		sensors = abitni_sensors;
7893a1bedeaSderaadt 		break;
7903a1bedeaSderaadt 	case ABIT_SYSID_AT01:
7913a1bedeaSderaadt 		printf(" AT1");
7923a1bedeaSderaadt 		sensors = abitat_sensors;
7933a1bedeaSderaadt 		break;
7943a1bedeaSderaadt 	case ABIT_SYSID_AN03:
7953a1bedeaSderaadt 		printf(" AN2");
7963a1bedeaSderaadt 		sensors = abitan2_sensors;
7973a1bedeaSderaadt 		break;
7983a1bedeaSderaadt 	case ABIT_SYSID_AB01:
7993a1bedeaSderaadt 		printf(" AB1");
8003a1bedeaSderaadt 		sensors = abitab_sensors;
8013a1bedeaSderaadt 		break;
8023a1bedeaSderaadt 	case ABIT_SYSID_AN04:
8033a1bedeaSderaadt 		printf(" AN3");
8043a1bedeaSderaadt 		sensors = abitan3_sensors;
8053a1bedeaSderaadt 		break;
8063a1bedeaSderaadt 	case ABIT_SYSID_AW03:
8073a1bedeaSderaadt 		printf(" AW2");
8083a1bedeaSderaadt 		sensors = abitaw2_sensors;
8093a1bedeaSderaadt 		break;
8103a1bedeaSderaadt 	case ABIT_SYSID_AT02:
8113a1bedeaSderaadt 		printf(" AT2");
8123a1bedeaSderaadt 		sensors = abitat2_sensors;
8133a1bedeaSderaadt 		break;
8143a1bedeaSderaadt 	case ABIT_SYSID_AB02:
8153a1bedeaSderaadt 	case ABIT_SYSID_IP01:
8163a1bedeaSderaadt 	case ABIT_SYSID_IX01:
8173a1bedeaSderaadt 	case ABIT_SYSID_IX02:
8183a1bedeaSderaadt 		printf(" AB2");
8193a1bedeaSderaadt 		sensors = abitab2_sensors;
8203a1bedeaSderaadt 		break;
8213a1bedeaSderaadt 	case ABIT_SYSID_IN01:
8223a1bedeaSderaadt 		printf(" IN1");
8233a1bedeaSderaadt 		sensors = abitin_sensors;
8243a1bedeaSderaadt 		break;
8253a1bedeaSderaadt 	default:
8263a1bedeaSderaadt 		printf(" unknown system (ID 0x%.4x)\n", sysid);
8273a1bedeaSderaadt 		return;
8283a1bedeaSderaadt 	}
8293a1bedeaSderaadt 	printf("\n");
8303a1bedeaSderaadt 
8313a1bedeaSderaadt 	strlcpy(sc->sc_sensordev.xname,
8323a1bedeaSderaadt 	    sc->sc_dev.dv_xname,
8333a1bedeaSderaadt 	    sizeof(sc->sc_sensordev.xname));
8343a1bedeaSderaadt 
8353a1bedeaSderaadt 	for (i = 0; sensors[i].desc != NULL; i++) {
8363a1bedeaSderaadt 		strlcpy(sc->sc_sensors[i].desc,
8373a1bedeaSderaadt 		    sensors[i].desc, sizeof(sc->sc_sensors[i].desc));
8383a1bedeaSderaadt 		sc->sc_sensors[i].type = sensors[i].type;
8393a1bedeaSderaadt 		sensor_attach(&sc->sc_sensordev, &sc->sc_sensors[i]);
8403a1bedeaSderaadt 		sc->sc_numsensors++;
8413a1bedeaSderaadt 	}
8423a1bedeaSderaadt 	sc->uguru_sensors = sensors;
8433a1bedeaSderaadt 
8443a1bedeaSderaadt 	if (sensor_task_register(sc, uguru_refresh, UGURU_INTERVAL) == NULL) {
8453a1bedeaSderaadt 		printf("%s: unable to register update task\n",
8463a1bedeaSderaadt 		    sc->sc_sensordev.xname);
8473a1bedeaSderaadt 		return;
8483a1bedeaSderaadt 	}
8493a1bedeaSderaadt 	sensordev_install(&sc->sc_sensordev);
8503a1bedeaSderaadt }
8513a1bedeaSderaadt 
8523a1bedeaSderaadt void
uguru_refresh(void * arg)8533a1bedeaSderaadt uguru_refresh(void *arg)
8543a1bedeaSderaadt {
8553a1bedeaSderaadt 	struct uguru_softc *sc = (struct uguru_softc *)arg;
8563a1bedeaSderaadt 	int i;
8573a1bedeaSderaadt 
8583a1bedeaSderaadt 	for (i = 0; i < sc->sc_numsensors; i++)
8593a1bedeaSderaadt 		sc->uguru_sensors[i].refresh(sc, i);
8603a1bedeaSderaadt }
8613a1bedeaSderaadt 
8623a1bedeaSderaadt void
uguru_refresh_temp(struct uguru_softc * sc,int n)8633a1bedeaSderaadt uguru_refresh_temp(struct uguru_softc *sc, int n)
8643a1bedeaSderaadt {
8653a1bedeaSderaadt 	struct ksensor *sensor = &sc->sc_sensors[n];
8663a1bedeaSderaadt 	int status = SENSOR_S_OK;
8673a1bedeaSderaadt 	int ret;
8683a1bedeaSderaadt 
8693a1bedeaSderaadt 	ret = sc->read(sc, n);
8703a1bedeaSderaadt 	if (sc->cs.reading == 0x00) {
8713a1bedeaSderaadt 		sensor->flags |= SENSOR_FINVALID;
8723a1bedeaSderaadt 		sensor->value = 0;
8733a1bedeaSderaadt 		return;
8743a1bedeaSderaadt 	}
8753a1bedeaSderaadt 	sensor->flags &= ~SENSOR_FINVALID;
8763a1bedeaSderaadt 	sensor->value = sc->cs.reading * 1000000 + 273150000;
8773a1bedeaSderaadt 
8783a1bedeaSderaadt 	if (ret)
8793a1bedeaSderaadt 		status = SENSOR_S_UNSPEC;
8803a1bedeaSderaadt 	else {
8813a1bedeaSderaadt 		if (sc->cs.reading >= sc->cs.lower)
8823a1bedeaSderaadt 			status = SENSOR_S_WARN;
8833a1bedeaSderaadt 		if (sc->cs.reading >= sc->cs.upper)
8843a1bedeaSderaadt 			status = SENSOR_S_CRIT;
8853a1bedeaSderaadt 	}
8863a1bedeaSderaadt 	sensor->status = status;
8873a1bedeaSderaadt }
8883a1bedeaSderaadt 
8893a1bedeaSderaadt void
uguru_refresh_volt(struct uguru_softc * sc,int n)8903a1bedeaSderaadt uguru_refresh_volt(struct uguru_softc *sc, int n)
8913a1bedeaSderaadt {
8923a1bedeaSderaadt 	int status = SENSOR_S_OK;
8933a1bedeaSderaadt 
8943a1bedeaSderaadt 	if (sc->read(sc, n))
8953a1bedeaSderaadt 		status = SENSOR_S_UNSPEC;
8963a1bedeaSderaadt 	else
8973a1bedeaSderaadt 		if (sc->cs.reading <= sc->cs.lower ||
8983a1bedeaSderaadt 		    sc->cs.reading >= sc->cs.upper)
8993a1bedeaSderaadt 			status = SENSOR_S_CRIT;
9003a1bedeaSderaadt 
9013a1bedeaSderaadt 	sc->sc_sensors[n].value =
9023a1bedeaSderaadt 	    sc->cs.reading * sc->uguru_sensors[n].rfact;
9033a1bedeaSderaadt 	sc->sc_sensors[n].status = status;
9043a1bedeaSderaadt }
9053a1bedeaSderaadt 
9063a1bedeaSderaadt void
uguru_refresh_fan(struct uguru_softc * sc,int n)9073a1bedeaSderaadt uguru_refresh_fan(struct uguru_softc *sc, int n)
9083a1bedeaSderaadt {
9093a1bedeaSderaadt 	struct ksensor *sensor = &sc->sc_sensors[n];
9103a1bedeaSderaadt 	int ret;
9113a1bedeaSderaadt 
9123a1bedeaSderaadt 	ret = sc->read(sc, n);
9133a1bedeaSderaadt 	if (sc->cs.reading == 0x00) {
9143a1bedeaSderaadt 		sensor->flags |= SENSOR_FINVALID;
9153a1bedeaSderaadt 		sensor->value = 0;
9163a1bedeaSderaadt 		return;
9173a1bedeaSderaadt 	}
9183a1bedeaSderaadt 	sensor->flags &= ~SENSOR_FINVALID;
9193a1bedeaSderaadt 	sensor->value = sc->cs.reading * 60;
9203a1bedeaSderaadt 
9213a1bedeaSderaadt 	if (ret)
9223a1bedeaSderaadt 		sensor->status = SENSOR_S_UNSPEC;
9233a1bedeaSderaadt 	else
9243a1bedeaSderaadt 		if (sc->cs.reading <= sc->cs.lower)
9253a1bedeaSderaadt 			sensor->status = SENSOR_S_CRIT;
9263a1bedeaSderaadt 		else
9273a1bedeaSderaadt 			sensor->status = SENSOR_S_OK;
9283a1bedeaSderaadt }
9293a1bedeaSderaadt 
9303a1bedeaSderaadt int
uguru_read_sensor(struct uguru_softc * sc,int n)9313a1bedeaSderaadt uguru_read_sensor(struct uguru_softc *sc, int n)
9323a1bedeaSderaadt {
9333a1bedeaSderaadt 	struct ksensor *sensor = &sc->sc_sensors[n];
9343a1bedeaSderaadt 	bus_space_tag_t iot = sc->sc_iot;
9353a1bedeaSderaadt 	bus_space_handle_t ioh = sc->sc_ioh;
9363a1bedeaSderaadt 	uint8_t reg = sc->uguru_sensors[n].reg;
9373a1bedeaSderaadt 	uint8_t idx, data[3];
9383a1bedeaSderaadt 	uint8_t val = 0x00;
9393a1bedeaSderaadt 	int count, ret = 0;
9403a1bedeaSderaadt 
9413a1bedeaSderaadt 	if (sensor->type == SENSOR_FANRPM)
9423a1bedeaSderaadt 		idx = UGURU_FAN_DATA;
9433a1bedeaSderaadt 	else
9443a1bedeaSderaadt 		idx = UGURU_ITM_DATA;
9453a1bedeaSderaadt 
9463a1bedeaSderaadt 	/* sensor value */
9473a1bedeaSderaadt 	if (uguru_write_multi(iot, ioh, idx, &reg, sizeof(reg)) ||
9483a1bedeaSderaadt 	    uguru_read_multi(iot, ioh, &val, sizeof(val)))
9493a1bedeaSderaadt 		++ret;
9503a1bedeaSderaadt 
9513a1bedeaSderaadt 	/* sensor status */
9523a1bedeaSderaadt 	bzero(&data, sizeof(data));
9533a1bedeaSderaadt 	count = sensor->type == SENSOR_FANRPM ? 2 : 3;
9543a1bedeaSderaadt 
9553a1bedeaSderaadt 	if (uguru_write_multi(iot, ioh, idx + 1, &reg, sizeof(reg)) ||
9563a1bedeaSderaadt 	    uguru_read_multi(iot, ioh, &data, count))
9573a1bedeaSderaadt 		++ret;
9583a1bedeaSderaadt 
9593a1bedeaSderaadt 	/* fill in current sensor structure */
9603a1bedeaSderaadt 	sc->cs.reading = val;
9613a1bedeaSderaadt /*	sc->cs.flags = data[0]; */
9623a1bedeaSderaadt 	sc->cs.lower = data[1];
9633a1bedeaSderaadt 	sc->cs.upper = data[2];
9643a1bedeaSderaadt 
9653a1bedeaSderaadt 	DPRINTF(50, "0x%.2x: 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x\n",
9663a1bedeaSderaadt 	    idx, reg, val, data[0], data[1], data[2]);
9673a1bedeaSderaadt 
9683a1bedeaSderaadt 	return (ret);
9693a1bedeaSderaadt }
9703a1bedeaSderaadt 
9713a1bedeaSderaadt int
uguru_ac5_read_sensor(struct uguru_softc * sc,int n)9723a1bedeaSderaadt uguru_ac5_read_sensor(struct uguru_softc *sc, int n)
9733a1bedeaSderaadt {
9743a1bedeaSderaadt 	uint16_t reg;
9753a1bedeaSderaadt 	uint8_t val = 0x00;
9763a1bedeaSderaadt 	int ret = 1;
9773a1bedeaSderaadt 
9783a1bedeaSderaadt 	reg = sc->uguru_sensors[n].reg | 0x0880;
9793a1bedeaSderaadt 	if (uguru_ac5_read(sc->sc_iot, sc->sc_ioh, reg, &val, sizeof(val)))
9803a1bedeaSderaadt 		++ret;
9813a1bedeaSderaadt 
9823a1bedeaSderaadt 	sc->cs.reading = val;
9833a1bedeaSderaadt 	return (ret);
9843a1bedeaSderaadt }
9853a1bedeaSderaadt 
9863a1bedeaSderaadt int
uguru_ac5_read(bus_space_tag_t iot,bus_space_handle_t ioh,uint16_t reg,void * data,int count)9873a1bedeaSderaadt uguru_ac5_read(bus_space_tag_t iot, bus_space_handle_t ioh,
9883a1bedeaSderaadt     uint16_t reg, void *data, int count)
9893a1bedeaSderaadt {
9903a1bedeaSderaadt 	uint8_t buf[3];
9913a1bedeaSderaadt 
9923a1bedeaSderaadt 	buf[0] = reg >> 8;
9933a1bedeaSderaadt 	buf[1] = reg & 0xff;
9943a1bedeaSderaadt 	buf[2] = count;
9953a1bedeaSderaadt 
9963a1bedeaSderaadt 	if (!uguru_write_multi(iot, ioh, 0x1a, &buf, sizeof(buf)) &&
9973a1bedeaSderaadt 	    !uguru_read_multi(iot, ioh, data, count))
9983a1bedeaSderaadt 		return 0;
9993a1bedeaSderaadt 
10003a1bedeaSderaadt 	DPRINTF(0, "uguru_ac5_read: timeout 0x%.2x 0x%.2x 0x%.2x\n",
10013a1bedeaSderaadt 	    buf[0], buf[1], buf[2]);
10023a1bedeaSderaadt 
10033a1bedeaSderaadt 	return 1;
10043a1bedeaSderaadt }
10053a1bedeaSderaadt 
10063a1bedeaSderaadt int
uguru_write_multi(bus_space_tag_t iot,bus_space_handle_t ioh,uint8_t idx,void * data,int count)10073a1bedeaSderaadt uguru_write_multi(bus_space_tag_t iot, bus_space_handle_t ioh,
10083a1bedeaSderaadt     uint8_t idx, void *data, int count)
10093a1bedeaSderaadt {
10103a1bedeaSderaadt 	uint8_t *inbuf = data;
10113a1bedeaSderaadt 	int i, ntries;
10123a1bedeaSderaadt 
10133a1bedeaSderaadt 	UGURU_WRITE(iot, ioh, UGURU_INDEX, idx);
10143a1bedeaSderaadt 
10153a1bedeaSderaadt 	for (i = 0; i < count; ++i) {
10163a1bedeaSderaadt 		/*
10173a1bedeaSderaadt 		 * wait for non-busy status before write
10183a1bedeaSderaadt 		 * to the data port.
10193a1bedeaSderaadt 		 */
10203a1bedeaSderaadt 		ntries = 0;
10213a1bedeaSderaadt 		while (UGURU_READ(iot, ioh, UGURU_INDEX) >> 1 & 1) {
10226b5470fdSderaadt 			if (++ntries > 65)
10233a1bedeaSderaadt 				goto timeout;
10243a1bedeaSderaadt 			DELAY(5);
10253a1bedeaSderaadt 		}
10265365d42fSderaadt 		/* dummy read to flush the internal buffer */
10275365d42fSderaadt 		if (i == 0)
10285365d42fSderaadt 			UGURU_READ(iot, ioh, UGURU_DATA);
10295365d42fSderaadt 
10303a1bedeaSderaadt 		UGURU_WRITE(iot, ioh, UGURU_DATA, *inbuf++);
10313a1bedeaSderaadt 	}
10323a1bedeaSderaadt 	return 0;
10333a1bedeaSderaadt 
10343a1bedeaSderaadt timeout:
10353a1bedeaSderaadt 	DPRINTF(0, "uguru_write_multi: timeout 0x%.2x\n", idx);
10363a1bedeaSderaadt 	return 1;
10373a1bedeaSderaadt }
10383a1bedeaSderaadt 
10393a1bedeaSderaadt int
uguru_read_multi(bus_space_tag_t iot,bus_space_handle_t ioh,void * data,int count)10403a1bedeaSderaadt uguru_read_multi(bus_space_tag_t iot, bus_space_handle_t ioh,
10413a1bedeaSderaadt     void *data, int count)
10423a1bedeaSderaadt {
10433a1bedeaSderaadt 	uint8_t *outbuf = data;
10443a1bedeaSderaadt 	int i, ntries;
10453a1bedeaSderaadt 
10463a1bedeaSderaadt 	for (i = 0; i < count; ++i) {
10473a1bedeaSderaadt 		/*
10483a1bedeaSderaadt 		 * wait for valid status before read
10493a1bedeaSderaadt 		 * from the data port.
10503a1bedeaSderaadt 		 */
10513a1bedeaSderaadt 		ntries = 0;
10523a1bedeaSderaadt 		while (!(UGURU_READ(iot, ioh, UGURU_INDEX) & 1)) {
10533a1bedeaSderaadt 			if (++ntries > 40) {
10543a1bedeaSderaadt 				DPRINTF(0, "uguru_read_multi: timeout\n");
10553a1bedeaSderaadt 				return 1;
10563a1bedeaSderaadt 			}
10573a1bedeaSderaadt 			DELAY(35);
10583a1bedeaSderaadt 		}
10593a1bedeaSderaadt 		*outbuf++ = UGURU_READ(iot, ioh, UGURU_DATA);
10603a1bedeaSderaadt 	}
10613a1bedeaSderaadt 	return 0;
10623a1bedeaSderaadt }
1063