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