xref: /openbsd-src/sys/dev/i2c/adm1026.c (revision 471aeecfc619bc9b69519928152daf993376c2a1)
1*471aeecfSnaddy /*	$OpenBSD: adm1026.c,v 1.12 2022/04/06 18:59:28 naddy Exp $	*/
2b86f347dSderaadt 
3b86f347dSderaadt /*
4b86f347dSderaadt  * Copyright (c) 2005 Theo de Raadt
5b86f347dSderaadt  *
6b86f347dSderaadt  * Permission to use, copy, modify, and distribute this software for any
7b86f347dSderaadt  * purpose with or without fee is hereby granted, provided that the above
8b86f347dSderaadt  * copyright notice and this permission notice appear in all copies.
9b86f347dSderaadt  *
10b86f347dSderaadt  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11b86f347dSderaadt  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12b86f347dSderaadt  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13b86f347dSderaadt  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14b86f347dSderaadt  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15b86f347dSderaadt  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16b86f347dSderaadt  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17b86f347dSderaadt  */
18b86f347dSderaadt 
19b86f347dSderaadt #include <sys/param.h>
20b86f347dSderaadt #include <sys/systm.h>
21b86f347dSderaadt #include <sys/device.h>
22b86f347dSderaadt #include <sys/sensors.h>
23b86f347dSderaadt 
24b86f347dSderaadt #include <dev/i2c/i2cvar.h>
25b86f347dSderaadt 
26b86f347dSderaadt /* ADM 1026 registers */
27b86f347dSderaadt #define ADM1026_TEMP		0x1f
28b86f347dSderaadt #define ADM1026_STATUS		0x20
29b86f347dSderaadt #define ADM1026_Vbat		0x26
30b86f347dSderaadt #define ADM1026_Ain8		0x27
31b86f347dSderaadt #define ADM1026_EXT1		0x28
32b86f347dSderaadt #define ADM1026_EXT2		0x29
33b86f347dSderaadt #define ADM1026_V3_3stby	0x2a
34b86f347dSderaadt #define ADM1026_V3_3main	0x2b
35b86f347dSderaadt #define ADM1026_V5		0x2c
36b86f347dSderaadt #define ADM1026_Vccp		0x2d
37b86f347dSderaadt #define ADM1026_V12		0x2e
38b86f347dSderaadt #define ADM1026_Vminus12	0x2f
39b86f347dSderaadt #define ADM1026_FAN0		0x38
40b86f347dSderaadt #define ADM1026_FAN1		0x39
41b86f347dSderaadt #define ADM1026_FAN2		0x3a
42b86f347dSderaadt #define ADM1026_FAN3		0x3b
43b86f347dSderaadt #define ADM1026_FAN4		0x3c
44b86f347dSderaadt #define ADM1026_FAN5		0x3d
45b86f347dSderaadt #define ADM1026_FAN6		0x3e
46b86f347dSderaadt #define ADM1026_FAN7		0x3f
47b86f347dSderaadt #define ADM1026_EXT1_OFF	0x6e
48b86f347dSderaadt #define ADM1026_EXT2_OFF	0x6f
49b86f347dSderaadt #define ADM1026_FAN0123DIV	0x02
50b86f347dSderaadt #define ADM1026_FAN4567DIV	0x03
51b86f347dSderaadt #define ADM1026_CONTROL		0x00
52b86f347dSderaadt #define  ADM1026_CONTROL_START	0x01
53b86f347dSderaadt #define  ADM1026_CONTROL_INTCLR	0x04
54b86f347dSderaadt 
55b86f347dSderaadt /* Sensors */
56b86f347dSderaadt #define ADMCTS_TEMP		0
57b86f347dSderaadt #define ADMCTS_EXT1		1
58b86f347dSderaadt #define ADMCTS_EXT2		2
59b86f347dSderaadt #define ADMCTS_Vbat		3
60b86f347dSderaadt #define ADMCTS_V3_3stby		4
61b86f347dSderaadt #define ADMCTS_V3_3main		5
62b86f347dSderaadt #define ADMCTS_V5		6
63b86f347dSderaadt #define ADMCTS_Vccp		7
64b86f347dSderaadt #define ADMCTS_V12		8
65b86f347dSderaadt #define ADMCTS_Vminus12		9
66b86f347dSderaadt #define ADMCTS_FAN0		10
67b86f347dSderaadt #define ADMCTS_FAN1		11
68b86f347dSderaadt #define ADMCTS_FAN2		12
69b86f347dSderaadt #define ADMCTS_FAN3		13
70b86f347dSderaadt #define ADMCTS_FAN4		14
71b86f347dSderaadt #define ADMCTS_FAN5		15
72b86f347dSderaadt #define ADMCTS_FAN6		16
73b86f347dSderaadt #define ADMCTS_FAN7		17
74b86f347dSderaadt #define ADMCTS_NUM_SENSORS	18
75b86f347dSderaadt 
76b86f347dSderaadt struct admcts_softc {
77b86f347dSderaadt 	struct device	sc_dev;
78b86f347dSderaadt 	i2c_tag_t	sc_tag;
79b86f347dSderaadt 	i2c_addr_t	sc_addr;
80b86f347dSderaadt 
81275cbf62Sderaadt 	struct ksensor	sc_sensor[ADMCTS_NUM_SENSORS];
82275cbf62Sderaadt 	struct ksensordev sc_sensordev;
8357bb1d2cSderaadt 	int		sc_fanmul[8];
84b86f347dSderaadt };
85b86f347dSderaadt 
86b86f347dSderaadt int	admcts_match(struct device *, void *, void *);
87b86f347dSderaadt void	admcts_attach(struct device *, struct device *, void *);
88b86f347dSderaadt void	admcts_refresh(void *);
89b86f347dSderaadt 
90*471aeecfSnaddy const struct cfattach admcts_ca = {
91b86f347dSderaadt 	sizeof(struct admcts_softc), admcts_match, admcts_attach
92b86f347dSderaadt };
93b86f347dSderaadt 
94b86f347dSderaadt struct cfdriver admcts_cd = {
95b86f347dSderaadt 	NULL, "admcts", DV_DULL
96b86f347dSderaadt };
97b86f347dSderaadt 
98b86f347dSderaadt int
admcts_match(struct device * parent,void * match,void * aux)99b86f347dSderaadt admcts_match(struct device *parent, void *match, void *aux)
100b86f347dSderaadt {
101b86f347dSderaadt 	struct i2c_attach_args *ia = aux;
102b86f347dSderaadt 
103b86f347dSderaadt 	if (strcmp(ia->ia_name, "adm1026") == 0)
104b86f347dSderaadt 		return (1);
105b86f347dSderaadt 	return (0);
106b86f347dSderaadt }
107b86f347dSderaadt 
108b86f347dSderaadt void
admcts_attach(struct device * parent,struct device * self,void * aux)109b86f347dSderaadt admcts_attach(struct device *parent, struct device *self, void *aux)
110b86f347dSderaadt {
111b86f347dSderaadt 	struct admcts_softc *sc = (struct admcts_softc *)self;
112b86f347dSderaadt 	struct i2c_attach_args *ia = aux;
113b86f347dSderaadt 	u_int8_t cmd, data, data2;
114b86f347dSderaadt 	int i;
115b86f347dSderaadt 
116b86f347dSderaadt 	sc->sc_tag = ia->ia_tag;
117b86f347dSderaadt 	sc->sc_addr = ia->ia_addr;
118b86f347dSderaadt 
119b86f347dSderaadt 	iic_acquire_bus(sc->sc_tag, 0);
120b86f347dSderaadt 	cmd = ADM1026_CONTROL;
121b86f347dSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
122b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0)) {
123b86f347dSderaadt 		iic_release_bus(sc->sc_tag, 0);
124b86f347dSderaadt 		printf(": cannot get control register\n");
125b86f347dSderaadt 		return;
126b86f347dSderaadt 	}
127b86f347dSderaadt 	data2 = data | ADM1026_CONTROL_START;
128b86f347dSderaadt 	data2 = data2 & ~ADM1026_CONTROL_INTCLR;
129b86f347dSderaadt 	if (data != data2) {
130b86f347dSderaadt 		if (iic_exec(sc->sc_tag, I2C_OP_WRITE_WITH_STOP,
131b8631cf2Sderaadt 		    sc->sc_addr, &cmd, sizeof cmd, &data2, sizeof data2, 0)) {
132b86f347dSderaadt 			iic_release_bus(sc->sc_tag, 0);
133b86f347dSderaadt 			printf(": cannot set control register\n");
134b86f347dSderaadt 			return;
135b86f347dSderaadt 		}
136b86f347dSderaadt 	}
13757bb1d2cSderaadt 
13857bb1d2cSderaadt 	cmd = ADM1026_FAN0123DIV;
13957bb1d2cSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
140b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0)) {
14157bb1d2cSderaadt 		iic_release_bus(sc->sc_tag, 0);
14257bb1d2cSderaadt 		printf(": cannot get fan0123div register\n");
14357bb1d2cSderaadt 		return;
14457bb1d2cSderaadt 	}
145525d7c6cScnst 	sc->sc_fanmul[0] = (1 << ((data >> 0) & 0x3));
146525d7c6cScnst 	sc->sc_fanmul[1] = (1 << ((data >> 2) & 0x3));
147525d7c6cScnst 	sc->sc_fanmul[2] = (1 << ((data >> 4) & 0x3));
148525d7c6cScnst 	sc->sc_fanmul[3] = (1 << ((data >> 6) & 0x3));
14957bb1d2cSderaadt 
15057bb1d2cSderaadt 	cmd = ADM1026_FAN4567DIV;
15157bb1d2cSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
152b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0)) {
15357bb1d2cSderaadt 		iic_release_bus(sc->sc_tag, 0);
15457bb1d2cSderaadt 		printf(": cannot get fan0123div register\n");
15557bb1d2cSderaadt 		return;
15657bb1d2cSderaadt 	}
157525d7c6cScnst 	sc->sc_fanmul[4] = (1 << ((data >> 0) & 0x3));
158525d7c6cScnst 	sc->sc_fanmul[5] = (1 << ((data >> 2) & 0x3));
159525d7c6cScnst 	sc->sc_fanmul[6] = (1 << ((data >> 4) & 0x3));
160525d7c6cScnst 	sc->sc_fanmul[7] = (1 << ((data >> 6) & 0x3));
16157bb1d2cSderaadt 
162b86f347dSderaadt 	iic_release_bus(sc->sc_tag, 0);
163b86f347dSderaadt 
164b86f347dSderaadt 	/* Initialize sensor data. */
16527515a6bSderaadt 	strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
16627515a6bSderaadt 	    sizeof(sc->sc_sensordev.xname));
167b86f347dSderaadt 
168b86f347dSderaadt 	sc->sc_sensor[ADMCTS_TEMP].type = SENSOR_TEMP;
16927515a6bSderaadt 	strlcpy(sc->sc_sensor[ADMCTS_TEMP].desc, "Internal",
170b86f347dSderaadt 	    sizeof(sc->sc_sensor[ADMCTS_TEMP].desc));
171b86f347dSderaadt 
172b86f347dSderaadt 	sc->sc_sensor[ADMCTS_Vbat].type = SENSOR_VOLTS_DC;
173b86f347dSderaadt 	strlcpy(sc->sc_sensor[ADMCTS_Vbat].desc, "Vbat",
174b86f347dSderaadt 	    sizeof(sc->sc_sensor[ADMCTS_Vbat].desc));
175b86f347dSderaadt 
176b86f347dSderaadt 	sc->sc_sensor[ADMCTS_EXT1].type = SENSOR_TEMP;
17727515a6bSderaadt 	strlcpy(sc->sc_sensor[ADMCTS_EXT1].desc, "External",
178b86f347dSderaadt 	    sizeof(sc->sc_sensor[ADMCTS_EXT1].desc));
179b86f347dSderaadt 
180b86f347dSderaadt 	sc->sc_sensor[ADMCTS_EXT2].type = SENSOR_TEMP;
18127515a6bSderaadt 	strlcpy(sc->sc_sensor[ADMCTS_EXT2].desc, "External",
182b86f347dSderaadt 	    sizeof(sc->sc_sensor[ADMCTS_EXT2].desc));
183b86f347dSderaadt 
184b86f347dSderaadt 	sc->sc_sensor[ADMCTS_V3_3stby].type = SENSOR_VOLTS_DC;
185b86f347dSderaadt 	strlcpy(sc->sc_sensor[ADMCTS_V3_3stby].desc, "3.3 V standby",
186b86f347dSderaadt 	    sizeof(sc->sc_sensor[ADMCTS_V3_3stby].desc));
187b86f347dSderaadt 
188b86f347dSderaadt 	sc->sc_sensor[ADMCTS_V3_3main].type = SENSOR_VOLTS_DC;
189b86f347dSderaadt 	strlcpy(sc->sc_sensor[ADMCTS_V3_3main].desc, "3.3 V main",
190b86f347dSderaadt 	    sizeof(sc->sc_sensor[ADMCTS_V3_3main].desc));
191b86f347dSderaadt 
192b86f347dSderaadt 	sc->sc_sensor[ADMCTS_V5].type = SENSOR_VOLTS_DC;
193b86f347dSderaadt 	strlcpy(sc->sc_sensor[ADMCTS_V5].desc, "5 V",
194b86f347dSderaadt 	    sizeof(sc->sc_sensor[ADMCTS_V5].desc));
195b86f347dSderaadt 
196b86f347dSderaadt 	sc->sc_sensor[ADMCTS_Vccp].type = SENSOR_VOLTS_DC;
197b86f347dSderaadt 	strlcpy(sc->sc_sensor[ADMCTS_Vccp].desc, "Vccp",
198b86f347dSderaadt 	    sizeof(sc->sc_sensor[ADMCTS_Vccp].desc));
199b86f347dSderaadt 
200b86f347dSderaadt 	sc->sc_sensor[ADMCTS_V12].type = SENSOR_VOLTS_DC;
201b86f347dSderaadt 	strlcpy(sc->sc_sensor[ADMCTS_V12].desc, "12 V",
202b86f347dSderaadt 	    sizeof(sc->sc_sensor[ADMCTS_V12].desc));
203b86f347dSderaadt 
204b86f347dSderaadt 	sc->sc_sensor[ADMCTS_Vminus12].type = SENSOR_VOLTS_DC;
205b86f347dSderaadt 	strlcpy(sc->sc_sensor[ADMCTS_Vminus12].desc, "-12 V",
206b86f347dSderaadt 	    sizeof(sc->sc_sensor[ADMCTS_Vminus12].desc));
207b86f347dSderaadt 
208b86f347dSderaadt 	sc->sc_sensor[ADMCTS_FAN1].type = SENSOR_FANRPM;
209b86f347dSderaadt 	sc->sc_sensor[ADMCTS_FAN2].type = SENSOR_FANRPM;
210b86f347dSderaadt 	sc->sc_sensor[ADMCTS_FAN3].type = SENSOR_FANRPM;
211b86f347dSderaadt 	sc->sc_sensor[ADMCTS_FAN4].type = SENSOR_FANRPM;
212b86f347dSderaadt 	sc->sc_sensor[ADMCTS_FAN5].type = SENSOR_FANRPM;
213b86f347dSderaadt 	sc->sc_sensor[ADMCTS_FAN6].type = SENSOR_FANRPM;
214b86f347dSderaadt 	sc->sc_sensor[ADMCTS_FAN7].type = SENSOR_FANRPM;
215b86f347dSderaadt 
216abd9fc28Sdlg 	if (sensor_task_register(sc, admcts_refresh, 5) == NULL) {
217b86f347dSderaadt 		printf(", unable to register update task\n");
218b86f347dSderaadt 		return;
219b86f347dSderaadt 	}
220b86f347dSderaadt 
221b86f347dSderaadt 	for (i = 0; i < ADMCTS_NUM_SENSORS; i++)
22227515a6bSderaadt 		sensor_attach(&sc->sc_sensordev, &sc->sc_sensor[i]);
22327515a6bSderaadt 	sensordev_install(&sc->sc_sensordev);
224b86f347dSderaadt 
225b86f347dSderaadt 	printf("\n");
226b86f347dSderaadt }
227b86f347dSderaadt 
2288bd65a67Sderaadt static void
fanval(struct ksensor * sens,int mul,u_int8_t data)229275cbf62Sderaadt fanval(struct ksensor *sens, int mul, u_int8_t data)
2308bd65a67Sderaadt {
2318bd65a67Sderaadt 	int tmp = data * mul;
2328bd65a67Sderaadt 
2338bd65a67Sderaadt 	if (tmp == 0)
2348bd65a67Sderaadt 		sens->flags |= SENSOR_FINVALID;
2358bd65a67Sderaadt 	else
236525d7c6cScnst 		sens->value = 1630000 / tmp;
2378bd65a67Sderaadt }
2388bd65a67Sderaadt 
239b86f347dSderaadt void
admcts_refresh(void * arg)240b86f347dSderaadt admcts_refresh(void *arg)
241b86f347dSderaadt {
242b86f347dSderaadt 	struct admcts_softc *sc = arg;
243b86f347dSderaadt 	u_int8_t cmd, data;
244b86f347dSderaadt 	int8_t sdata;
245b86f347dSderaadt 
246b86f347dSderaadt 	iic_acquire_bus(sc->sc_tag, 0);
247b86f347dSderaadt 
248b86f347dSderaadt 	cmd = ADM1026_TEMP;
249b86f347dSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
250b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &sdata, sizeof sdata, 0) == 0)
251b86f347dSderaadt 		sc->sc_sensor[ADMCTS_TEMP].value = 273150000 + 1000000 * sdata;
252b86f347dSderaadt 
253b86f347dSderaadt 	cmd = ADM1026_EXT1;
254b86f347dSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
255b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &sdata, sizeof sdata, 0) == 0)
256b86f347dSderaadt 		sc->sc_sensor[ADMCTS_EXT1].value = 273150000 + 1000000 * sdata;
257b86f347dSderaadt 
258b86f347dSderaadt 	cmd = ADM1026_EXT2;
259b86f347dSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
260b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &sdata, sizeof sdata, 0) == 0)
261b86f347dSderaadt 		sc->sc_sensor[ADMCTS_EXT2].value = 273150000 + 1000000 * sdata;
262b86f347dSderaadt 
263b86f347dSderaadt 	cmd = ADM1026_Vbat;
264b86f347dSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
265b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0) == 0)
266b86f347dSderaadt 		sc->sc_sensor[ADMCTS_Vbat].value = 3000000 * data / 192;
267b86f347dSderaadt 
268b86f347dSderaadt 	cmd = ADM1026_V3_3stby;
269b86f347dSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
270b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0) == 0)
271b86f347dSderaadt 		sc->sc_sensor[ADMCTS_V3_3stby].value = 3300000 * data / 192;
272b86f347dSderaadt 
273b86f347dSderaadt 	cmd = ADM1026_V3_3main;
274b86f347dSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
275b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0) == 0)
276b86f347dSderaadt 		sc->sc_sensor[ADMCTS_V3_3main].value = 3300000 * data / 192;
277b86f347dSderaadt 
278b86f347dSderaadt 	cmd = ADM1026_V5;
279b86f347dSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
280b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0) == 0)
281b86f347dSderaadt 		sc->sc_sensor[ADMCTS_V5].value = 5500000 * data / 192;
282b86f347dSderaadt 
283b86f347dSderaadt 	cmd = ADM1026_Vccp;
284b86f347dSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
285b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0) == 0)
286b86f347dSderaadt 		sc->sc_sensor[ADMCTS_Vccp].value = 2250000 * data / 192;
287b86f347dSderaadt 
288b86f347dSderaadt 	cmd = ADM1026_V12;
289b86f347dSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
290b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0) == 0)
291b86f347dSderaadt 		sc->sc_sensor[ADMCTS_V12].value = 12000000 * data / 192;
292b86f347dSderaadt 
293b86f347dSderaadt 	cmd = ADM1026_Vminus12;
294b86f347dSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
295b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0) == 0)
296b86f347dSderaadt 		sc->sc_sensor[ADMCTS_Vminus12].value = -2125000 * data / 192;
297b86f347dSderaadt 
29857bb1d2cSderaadt 	cmd = ADM1026_FAN0;
29957bb1d2cSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
300b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0) == 0)
3018bd65a67Sderaadt 		fanval(&sc->sc_sensor[ADMCTS_FAN0], sc->sc_fanmul[0], data);
30257bb1d2cSderaadt 
30357bb1d2cSderaadt 	cmd = ADM1026_FAN1;
30457bb1d2cSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
305b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0) == 0)
3068bd65a67Sderaadt 		fanval(&sc->sc_sensor[ADMCTS_FAN1], sc->sc_fanmul[1], data);
30757bb1d2cSderaadt 
30857bb1d2cSderaadt 	cmd = ADM1026_FAN2;
30957bb1d2cSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
310b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0) == 0)
3118bd65a67Sderaadt 		fanval(&sc->sc_sensor[ADMCTS_FAN2], sc->sc_fanmul[2], data);
31257bb1d2cSderaadt 
31357bb1d2cSderaadt 	cmd = ADM1026_FAN3;
31457bb1d2cSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
315b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0) == 0)
3168bd65a67Sderaadt 		fanval(&sc->sc_sensor[ADMCTS_FAN3], sc->sc_fanmul[3], data);
31757bb1d2cSderaadt 
31857bb1d2cSderaadt 	cmd = ADM1026_FAN4;
31957bb1d2cSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
320b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0) == 0)
3218bd65a67Sderaadt 		fanval(&sc->sc_sensor[ADMCTS_FAN4], sc->sc_fanmul[4], data);
32257bb1d2cSderaadt 
32357bb1d2cSderaadt 	cmd = ADM1026_FAN5;
32457bb1d2cSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
325b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0) == 0)
3268bd65a67Sderaadt 		fanval(&sc->sc_sensor[ADMCTS_FAN5], sc->sc_fanmul[5], data);
32757bb1d2cSderaadt 
32857bb1d2cSderaadt 	cmd = ADM1026_FAN6;
32957bb1d2cSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
330b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0) == 0)
3318bd65a67Sderaadt 		fanval(&sc->sc_sensor[ADMCTS_FAN6], sc->sc_fanmul[6], data);
33257bb1d2cSderaadt 
33357bb1d2cSderaadt 	cmd = ADM1026_FAN7;
33457bb1d2cSderaadt 	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
335b8631cf2Sderaadt 	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0) == 0)
3368bd65a67Sderaadt 		fanval(&sc->sc_sensor[ADMCTS_FAN7], sc->sc_fanmul[7], data);
337b86f347dSderaadt 
338b86f347dSderaadt 	iic_release_bus(sc->sc_tag, 0);
339b86f347dSderaadt }
340