1 /* $OpenBSD: uguru.c,v 1.4 2010/06/03 17:48:24 deraadt Exp $ */
4 * Copyright (c) 2010 Mikko Tolmunen <oskari@sefirosu.org>
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <sys/param.h>
21 #include <sys/device.h>
23 #include <sys/sensors.h>
24 #include <sys/systm.h>
26 #include <bus/isa/isareg.h>
27 #include <bus/isa/isavar.h>
31 #define DPRINTF(lvl, fmt...) \
32 if (uguru_dbg >= lvl) \
35 #define DPRINTF(lvl, fmt...)
38 #define UGURU_READ(iot, ioh, reg) \
39 bus_space_read_1((iot), (ioh), (reg))
40 #define UGURU_WRITE(iot, ioh, reg, val) \
41 bus_space_write_1((iot), (ioh), (reg), (val))
43 #define UGURU_DATA 0x00 /* configuration data register */
44 #define UGURU_INDEX 0x04 /* configuration index register */
45 #define UGURU_IOSIZE 0x08
47 #define UGURU_DUMMY 0x00 /* dummy zero bit */
48 #define UGURU_ITM_DATA 0x21 /* temp/volt readings */
49 #define UGURU_ITM_CTRL 0x22 /* temp/volt settings */
50 #define UGURU_FAN_DATA 0x26 /* fan readings */
51 #define UGURU_FAN_CTRL 0x27 /* fan settings */
52 #define UGURU_PRODID 0x44 /* product ID */
54 #define UGURU_VENDID_ABIT 0x147b /* ABIT */
55 #define UGURU_DEVID1 0x2003 /* AC2003 */
56 #define UGURU_DEVID2 0x2005 /* AC2005 */
58 #define ABIT_SYSID_KV01 0x0301
59 #define ABIT_SYSID_AI01 0x0302
60 #define ABIT_SYSID_AN01 0x0303
61 #define ABIT_SYSID_AA01 0x0304
62 #define ABIT_SYSID_AG01 0x0305
63 #define ABIT_SYSID_AV01 0x0306
64 #define ABIT_SYSID_KVP1 0x0307
65 #define ABIT_SYSID_AS01 0x0308
66 #define ABIT_SYSID_AX01 0x0309
67 #define ABIT_SYSID_M401 0x030a
68 #define ABIT_SYSID_AN02 0x030b
69 #define ABIT_SYSID_AU01 0x050c
70 #define ABIT_SYSID_AW01 0x050d
71 #define ABIT_SYSID_AL01 0x050e
72 #define ABIT_SYSID_BL01 0x050f
73 #define ABIT_SYSID_NI01 0x0510
74 #define ABIT_SYSID_AT01 0x0511
75 #define ABIT_SYSID_AN03 0x0512
76 #define ABIT_SYSID_AW02 0x0513
77 #define ABIT_SYSID_AB01 0x0514
78 #define ABIT_SYSID_AN04 0x0515
79 #define ABIT_SYSID_AW03 0x0516
80 #define ABIT_SYSID_AT02 0x0517
81 #define ABIT_SYSID_AB02 0x0518
82 #define ABIT_SYSID_IN01 0x0519
83 #define ABIT_SYSID_IP01 0x051a
84 #define ABIT_SYSID_IX01 0x051b
85 #define ABIT_SYSID_IX02 0x051c
87 #define UGURU_INTERVAL 5
88 #define UGURU_MAX_SENSORS 27
90 #define RFACT_NONE 13700
91 #define RFACT_NONE2 10000
92 #define RFACT(x, y) (RFACT_NONE * ((x) + (y)) / (y))
93 #define RFACT2(x, y) (RFACT_NONE2 * ((x) + (y)) / (y))
96 struct device *sc_dev;
98 struct resource *sc_iores;
101 bus_space_tag_t sc_iot;
102 bus_space_handle_t sc_ioh;
104 struct ksensor sc_sensors[UGURU_MAX_SENSORS];
105 struct ksensordev sc_sensordev;
107 struct uguru_sensor *uguru_sensors;
114 int (*read)(struct uguru_softc *, int);
117 struct uguru_sensor {
119 enum sensor_type type;
120 void (*refresh)(struct uguru_softc *, int);
125 static void uguru_refresh_temp(struct uguru_softc *, int);
126 static void uguru_refresh_volt(struct uguru_softc *, int);
127 static void uguru_refresh_fan(struct uguru_softc *, int);
129 #define UGURU_R_TEMP uguru_refresh_temp
130 #define UGURU_R_VOLT uguru_refresh_volt
131 #define UGURU_R_FAN uguru_refresh_fan
133 struct uguru_sensor abitkv_sensors[] = {
134 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
135 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
136 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f },
138 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE },
139 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) },
140 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) },
141 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT(2800, 887) },
142 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) },
143 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE },
144 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
146 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
147 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
148 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
149 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
150 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 },
155 struct uguru_sensor abitaa_sensors[] = {
156 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
157 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
158 { "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x0f },
159 { "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x0c },
161 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE },
162 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) },
163 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) },
164 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT(2800, 888) },
165 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) },
166 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE },
167 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
168 { "FSBVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE },
169 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE },
170 { "NB +2.5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE },
172 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
173 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
174 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
175 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
176 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 },
181 struct uguru_sensor abitav_sensors[] = {
182 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
183 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
184 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f },
186 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE },
187 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) },
188 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) },
189 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) },
190 { "+3.3VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT(100, 402) },
191 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE },
192 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
193 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT_NONE },
194 { "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE },
195 { "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE },
196 { "AGP", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE },
198 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
199 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
200 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
201 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
202 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 },
207 struct uguru_sensor abitas_sensors[] = {
208 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
209 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
210 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f },
212 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE },
213 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) },
214 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) },
215 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT(2800, 884) },
216 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) },
217 { "+3.3VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT(100, 402) },
218 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE },
219 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
220 { "FSBVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE },
221 { "NB/AGP", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE },
222 { "GMCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE },
224 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
225 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
226 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
227 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
228 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 },
233 struct uguru_sensor abitax_sensors[] = {
234 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
235 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
236 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f },
238 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE },
239 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) },
240 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) },
241 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT(2800, 888) },
242 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) },
243 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE },
244 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
245 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT_NONE },
246 { "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE },
247 { "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE },
249 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
250 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
251 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
252 { "AUX", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
257 struct uguru_sensor abitm4_sensors[] = {
258 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
259 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
260 { "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x02 },
261 { "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x03 },
262 { "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x04 },
263 { "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x05 },
265 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT_NONE },
266 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x13, RFACT(100, 402) },
267 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x12, RFACT(442, 560) },
268 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x11, RFACT(2800, 884) },
269 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x10, RFACT(442, 560) },
270 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE },
271 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
272 { "FSBVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT_NONE },
273 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT_NONE },
274 { "NB +2.5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0c, RFACT_NONE },
276 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
277 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
278 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
279 { "OTES1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
280 { "OTES2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 },
285 struct uguru_sensor abitan_sensors[] = {
286 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
287 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
288 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f },
290 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE },
291 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) },
292 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) },
293 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT(2800, 844) },
294 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) },
295 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE },
296 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
297 { "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE },
298 { "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE },
299 { "MCP", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE },
300 { "MCP SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT_NONE },
302 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
303 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
304 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
305 { "AUX", SENSOR_FANRPM, UGURU_R_FAN, 0x05 },
306 { "OTES1", SENSOR_FANRPM, UGURU_R_FAN, 0x04 },
307 { "OTES2", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
312 struct uguru_sensor abital_sensors[] = {
313 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
314 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
315 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
317 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
318 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
319 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
320 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
321 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
322 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
323 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT_NONE2 },
324 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
325 { "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
326 { "MCH/PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
327 { "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) },
328 { "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
330 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
331 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
332 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
333 { "AUX", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
338 struct uguru_sensor abitaw_sensors[] = {
339 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
340 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
341 { "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
342 { "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x1b },
343 { "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x1c },
344 { "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x1d },
346 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
347 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
348 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
349 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
350 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
351 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
352 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT_NONE2 },
353 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
354 { "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
355 { "MCH/PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
356 { "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) },
357 { "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
359 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
360 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
361 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
362 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
363 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
364 { "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
365 { "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x26 },
366 { "AUX5", SENSOR_FANRPM, UGURU_R_FAN, 0x27 },
371 struct uguru_sensor abitni_sensors[] = {
372 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
373 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
374 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
376 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
377 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
378 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
379 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
380 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
381 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
382 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT_NONE2 },
383 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
384 { "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
385 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
386 { "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
388 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
389 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
390 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
391 { "AUX", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
392 { "OTES1", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
393 { "OTES2", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
398 struct uguru_sensor abitat_sensors[] = {
399 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
400 { "NB", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
401 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
402 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1b },
404 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
405 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
406 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
407 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
408 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
409 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
410 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) },
411 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
412 { "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT2(34, 34) },
413 { "PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0c, RFACT_NONE2 },
414 { "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
415 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT_NONE2 },
416 { "NB +1.8V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
417 { "NB +1.8V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 },
419 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
420 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
421 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
422 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
423 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
424 { "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
429 struct uguru_sensor abitan2_sensors[] = {
430 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
431 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
432 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
434 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
435 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
436 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
437 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
438 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
439 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
440 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) },
441 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
442 { "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) },
443 { "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
444 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
445 { "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
447 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
448 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
449 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
450 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
451 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
456 struct uguru_sensor abitab_sensors[] = {
457 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
458 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
459 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
461 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
462 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
463 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
464 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
465 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
466 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
467 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT_NONE2 },
468 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
469 { "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
470 { "ICHIO", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 },
471 { "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
472 { "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
474 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
475 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
476 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
477 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
478 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
479 { "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
484 struct uguru_sensor abitan3_sensors[] = {
485 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
486 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
487 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
489 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
490 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
491 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
492 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
493 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
494 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
495 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) },
496 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
497 { "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) },
498 { "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
499 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
500 { "NB/PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE2 },
501 { "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
503 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
504 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
505 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
506 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
507 { "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
508 { "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
513 struct uguru_sensor abitaw2_sensors[] = {
514 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
515 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
516 { "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
517 { "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x1b },
518 { "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x1c },
519 { "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x1d },
521 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
522 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
523 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
524 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
525 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
526 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
527 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) },
528 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
529 { "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
530 { "MCH/PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
531 { "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) },
532 { "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
534 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
535 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
536 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
537 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
538 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
539 { "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
540 { "OTES1", SENSOR_FANRPM, UGURU_R_FAN, 0x26 },
541 { "OTES2", SENSOR_FANRPM, UGURU_R_FAN, 0x27 },
546 struct uguru_sensor abitat2_sensors[] = {
547 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
548 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
549 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1b },
551 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
552 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
553 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
554 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
555 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
556 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
557 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) },
558 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
559 { "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT2(34, 34) },
560 { "PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0c, RFACT_NONE2 },
561 { "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
562 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT_NONE2 },
563 { "NB +1.8V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
564 { "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 },
566 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
567 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
568 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
569 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
570 { "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
571 { "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
576 struct uguru_sensor abitab2_sensors[] = {
577 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
578 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
579 { "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
580 { "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x1b },
581 { "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x1c },
582 { "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x1d },
583 { "PWM5", SENSOR_TEMP, UGURU_R_TEMP, 0x1e },
585 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
586 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
587 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
588 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
589 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
590 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
591 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) },
592 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
593 { "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
594 { "ICHIO", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 },
595 { "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
596 { "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
598 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
599 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
600 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
601 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
602 { "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
603 { "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
608 struct uguru_sensor abitin_sensors[] = {
609 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
610 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
611 { "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
612 { "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x1b },
613 { "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x1c },
614 { "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x1d },
615 { "PWM5", SENSOR_TEMP, UGURU_R_TEMP, 0x1e },
617 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT_NONE2 },
618 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
619 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
620 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0c, RFACT2(50, 10) },
621 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
622 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
623 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT2(34, 34) },
624 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE2 },
625 { "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
626 { "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 },
627 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
628 { "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
630 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
631 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
632 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
633 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
634 { "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
635 { "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
640 static void uguru_identify(driver_t *driver, struct device *parent);
641 static int uguru_match(struct device *);
642 static int uguru_attach(struct device *);
643 static int uguru_detach(struct device *dev);
644 static void uguru_refresh(void *);
645 static int uguru_read_sensor(struct uguru_softc *, int);
646 static int uguru_ac5_read_sensor(struct uguru_softc *, int);
647 static int uguru_ac5_read(bus_space_tag_t, bus_space_handle_t,
648 uint16_t, void *, int);
649 static int uguru_write_multi(bus_space_tag_t, bus_space_handle_t,
650 uint8_t, void *, int);
651 static int uguru_read_multi(bus_space_tag_t, bus_space_handle_t, void *,
654 static device_method_t uguru_methods[] = {
655 DEVMETHOD(device_identify, uguru_identify),
656 DEVMETHOD(device_probe, uguru_match),
657 DEVMETHOD(device_attach, uguru_attach),
658 DEVMETHOD(device_detach, uguru_detach),
663 static driver_t uguru_driver = {
666 sizeof(struct uguru_softc)
669 static devclass_t uguru_devclass;
671 DRIVER_MODULE(uguru, isa, uguru_driver, uguru_devclass, NULL, NULL);
674 uguru_identify(driver_t *driver, struct device *parent)
677 struct device *child;
678 const int port = 0xe0;
680 child = device_find_child(parent, driver->name, 0);
682 child = BUS_ADD_CHILD(parent, parent, ISA_ORDER_PNP,
684 if (bus_set_resource(child, SYS_RES_IOPORT, 0, port, UGURU_IOSIZE))
685 kprintf("%s: cannot set resource for child\n", __func__);
690 uguru_match(struct device *dev)
692 struct resource *iores;
695 bus_space_handle_t ioh;
697 uint16_t vendid, devid;
700 iores = bus_alloc_resource(dev, SYS_RES_IOPORT, &iorid,
701 0ul, ~0ul, 8, RF_ACTIVE);
704 iot = rman_get_bustag(iores);
705 ioh = rman_get_bushandle(iores);
707 UGURU_WRITE(iot, ioh, UGURU_INDEX, UGURU_PRODID);
708 if (!uguru_read_multi(iot, ioh, &data, sizeof(data)) ||
709 !uguru_ac5_read(iot, ioh, 0x0904, &data, sizeof(data))) {
710 vendid = data[0] << 8 | data[1];
711 devid = data[2] << 8 | data[3];
713 if (vendid == UGURU_VENDID_ABIT &&
714 (devid == UGURU_DEVID1 ||
715 devid == UGURU_DEVID2)) {
719 bus_release_resource(dev, SYS_RES_IOPORT, iorid, iores);
724 uguru_attach(struct device *dev)
726 struct uguru_softc *sc = device_get_softc(dev);
727 struct uguru_sensor *sensors;
729 uint16_t vendid, devid, sysid;
731 const char *desc = NULL;
735 sc->sc_iores = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->sc_iorid,
736 0ul, ~0ul, 8, RF_ACTIVE);
737 if (sc->sc_iores == NULL) {
738 device_printf(dev, "can't map i/o space\n");
741 sc->sc_iot = rman_get_bustag(sc->sc_iores);
742 sc->sc_ioh = rman_get_bushandle(sc->sc_iores);
744 UGURU_WRITE(sc->sc_iot, sc->sc_ioh, UGURU_INDEX, UGURU_PRODID);
745 if (!uguru_read_multi(sc->sc_iot, sc->sc_ioh, &data, sizeof(data))) {
746 sc->read = uguru_read_sensor;
750 /* AC2005 product ID */
751 if (!uguru_ac5_read(sc->sc_iot, sc->sc_ioh,
752 0x0904, &data, sizeof(data))) {
753 sc->read = uguru_ac5_read_sensor;
760 DPRINTF(5, ": %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",
761 data[0], data[1], data[2], data[3], data[4],
762 data[5], data[6], data[7], data[8]);
764 vendid = data[0] << 8 | data[1];
765 devid = data[2] << 8 | data[3];
766 sysid = data[3] << 8 | data[7];
768 if (vendid != UGURU_VENDID_ABIT ||
769 (devid != UGURU_DEVID1 &&
770 devid != UGURU_DEVID2)) {
771 device_printf(dev, "attach failed\n");
776 case ABIT_SYSID_KV01:
777 case ABIT_SYSID_AI01:
778 case ABIT_SYSID_AN01:
780 sensors = abitkv_sensors;
782 case ABIT_SYSID_AA01:
783 case ABIT_SYSID_AG01:
785 sensors = abitaa_sensors;
787 case ABIT_SYSID_AV01:
788 case ABIT_SYSID_KVP1:
790 sensors = abitav_sensors;
792 case ABIT_SYSID_AS01:
794 sensors = abitas_sensors;
796 case ABIT_SYSID_AX01:
798 sensors = abitax_sensors;
800 case ABIT_SYSID_M401:
802 sensors = abitm4_sensors;
804 case ABIT_SYSID_AN02:
806 sensors = abitan_sensors;
808 case ABIT_SYSID_AU01:
809 case ABIT_SYSID_AL01:
810 case ABIT_SYSID_BL01:
812 sensors = abital_sensors;
814 case ABIT_SYSID_AW01:
815 case ABIT_SYSID_AW02:
817 sensors = abitaw_sensors;
819 case ABIT_SYSID_NI01:
821 sensors = abitni_sensors;
823 case ABIT_SYSID_AT01:
825 sensors = abitat_sensors;
827 case ABIT_SYSID_AN03:
829 sensors = abitan2_sensors;
831 case ABIT_SYSID_AB01:
833 sensors = abitab_sensors;
835 case ABIT_SYSID_AN04:
837 sensors = abitan3_sensors;
839 case ABIT_SYSID_AW03:
841 sensors = abitaw2_sensors;
843 case ABIT_SYSID_AT02:
845 sensors = abitat2_sensors;
847 case ABIT_SYSID_AB02:
848 case ABIT_SYSID_IP01:
849 case ABIT_SYSID_IX01:
850 case ABIT_SYSID_IX02:
852 sensors = abitab2_sensors;
854 case ABIT_SYSID_IN01:
856 sensors = abitin_sensors;
859 kprintf(" unknown system (ID 0x%.4x)\n", sysid);
863 strlcpy(sc->sc_sensordev.xname,
864 device_get_nameunit(sc->sc_dev),
865 sizeof(sc->sc_sensordev.xname));
867 for (i = 0; sensors[i].desc != NULL; i++) {
868 strlcpy(sc->sc_sensors[i].desc,
869 sensors[i].desc, sizeof(sc->sc_sensors[i].desc));
870 sc->sc_sensors[i].type = sensors[i].type;
871 sensor_attach(&sc->sc_sensordev, &sc->sc_sensors[i]);
874 sc->uguru_sensors = sensors;
876 if (sensor_task_register(sc, uguru_refresh, UGURU_INTERVAL) != 0) {
877 kprintf("%s: unable to register update task\n",
878 sc->sc_sensordev.xname);
881 sensordev_install(&sc->sc_sensordev);
883 ksnprintf(fulldesc, sizeof(fulldesc),
884 "ABIT AC%x %s I/O port driver", devid, desc);
885 device_set_desc_copy(dev, fulldesc);
890 uguru_detach(struct device *dev)
892 struct uguru_softc *sc = device_get_softc(dev);
894 return bus_release_resource(dev, SYS_RES_IOPORT,
895 sc->sc_iorid, sc->sc_iores);
899 uguru_refresh(void *arg)
901 struct uguru_softc *sc = (struct uguru_softc *)arg;
904 for (i = 0; i < sc->sc_numsensors; i++)
905 sc->uguru_sensors[i].refresh(sc, i);
909 uguru_refresh_temp(struct uguru_softc *sc, int n)
911 struct ksensor *sensor = &sc->sc_sensors[n];
912 int status = SENSOR_S_OK;
915 ret = sc->read(sc, n);
916 if (sc->cs.reading == 0x00) {
917 sensor->flags |= SENSOR_FINVALID;
921 sensor->flags &= ~SENSOR_FINVALID;
922 sensor->value = sc->cs.reading * 1000000 + 273150000;
925 status = SENSOR_S_UNSPEC;
927 if (sc->cs.reading >= sc->cs.lower)
928 status = SENSOR_S_WARN;
929 if (sc->cs.reading >= sc->cs.upper)
930 status = SENSOR_S_CRIT;
932 sensor->status = status;
936 uguru_refresh_volt(struct uguru_softc *sc, int n)
938 int status = SENSOR_S_OK;
941 status = SENSOR_S_UNSPEC;
943 if (sc->cs.reading <= sc->cs.lower ||
944 sc->cs.reading >= sc->cs.upper)
945 status = SENSOR_S_CRIT;
947 sc->sc_sensors[n].value =
948 sc->cs.reading * sc->uguru_sensors[n].rfact;
949 sc->sc_sensors[n].status = status;
953 uguru_refresh_fan(struct uguru_softc *sc, int n)
955 struct ksensor *sensor = &sc->sc_sensors[n];
958 ret = sc->read(sc, n);
959 if (sc->cs.reading == 0x00) {
960 sensor->flags |= SENSOR_FINVALID;
964 sensor->flags &= ~SENSOR_FINVALID;
965 sensor->value = sc->cs.reading * 60;
968 sensor->status = SENSOR_S_UNSPEC;
970 if (sc->cs.reading <= sc->cs.lower)
971 sensor->status = SENSOR_S_CRIT;
973 sensor->status = SENSOR_S_OK;
977 uguru_read_sensor(struct uguru_softc *sc, int n)
979 struct ksensor *sensor = &sc->sc_sensors[n];
980 bus_space_tag_t iot = sc->sc_iot;
981 bus_space_handle_t ioh = sc->sc_ioh;
982 uint8_t reg = sc->uguru_sensors[n].reg;
983 uint8_t idx, data[3];
987 if (sensor->type == SENSOR_FANRPM)
988 idx = UGURU_FAN_DATA;
990 idx = UGURU_ITM_DATA;
993 if (uguru_write_multi(iot, ioh, idx, ®, sizeof(reg)) ||
994 uguru_read_multi(iot, ioh, &val, sizeof(val)))
998 bzero(&data, sizeof(data));
999 count = sensor->type == SENSOR_FANRPM ? 2 : 3;
1001 if (uguru_write_multi(iot, ioh, idx + 1, ®, sizeof(reg)) ||
1002 uguru_read_multi(iot, ioh, &data, count))
1005 /* fill in current sensor structure */
1006 sc->cs.reading = val;
1007 /* sc->cs.flags = data[0]; */
1008 sc->cs.lower = data[1];
1009 sc->cs.upper = data[2];
1011 DPRINTF(50, "0x%.2x: 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x\n",
1012 idx, reg, val, data[0], data[1], data[2]);
1018 uguru_ac5_read_sensor(struct uguru_softc *sc, int n)
1024 reg = sc->uguru_sensors[n].reg | 0x0880;
1025 if (uguru_ac5_read(sc->sc_iot, sc->sc_ioh, reg, &val, sizeof(val)))
1028 sc->cs.reading = val;
1033 uguru_ac5_read(bus_space_tag_t iot, bus_space_handle_t ioh,
1034 uint16_t reg, void *data, int count)
1039 buf[1] = reg & 0xff;
1042 if (!uguru_write_multi(iot, ioh, 0x1a, &buf, sizeof(buf)) &&
1043 !uguru_read_multi(iot, ioh, data, count))
1046 DPRINTF(0, "uguru_ac5_read: timeout 0x%.2x 0x%.2x 0x%.2x\n",
1047 buf[0], buf[1], buf[2]);
1053 uguru_write_multi(bus_space_tag_t iot, bus_space_handle_t ioh,
1054 uint8_t idx, void *data, int count)
1056 uint8_t *inbuf = data;
1059 UGURU_WRITE(iot, ioh, UGURU_INDEX, idx);
1061 for (i = 0; i < count; ++i) {
1063 * wait for non-busy status before write
1067 while (UGURU_READ(iot, ioh, UGURU_INDEX) >> 1 & 1) {
1072 /* dummy read to flush the internal buffer */
1074 UGURU_READ(iot, ioh, UGURU_DATA);
1076 UGURU_WRITE(iot, ioh, UGURU_DATA, *inbuf++);
1081 DPRINTF(0, "uguru_write_multi: timeout 0x%.2x\n", idx);
1086 uguru_read_multi(bus_space_tag_t iot, bus_space_handle_t ioh,
1087 void *data, int count)
1089 uint8_t *outbuf = data;
1092 for (i = 0; i < count; ++i) {
1094 * wait for valid status before read
1095 * from the data port.
1098 while (!(UGURU_READ(iot, ioh, UGURU_INDEX) & 1)) {
1099 if (++ntries > 40) {
1100 DPRINTF(0, "uguru_read_multi: timeout\n");
1105 *outbuf++ = UGURU_READ(iot, ioh, UGURU_DATA);