1 1.79 msaitoh /* $NetBSD: nslm7x.c,v 1.79 2022/12/16 00:02:28 msaitoh Exp $ */ 2 1.1 groo 3 1.1 groo /*- 4 1.1 groo * Copyright (c) 2000 The NetBSD Foundation, Inc. 5 1.1 groo * All rights reserved. 6 1.1 groo * 7 1.1 groo * This code is derived from software contributed to The NetBSD Foundation 8 1.1 groo * by Bill Squier. 9 1.1 groo * 10 1.1 groo * Redistribution and use in source and binary forms, with or without 11 1.1 groo * modification, are permitted provided that the following conditions 12 1.1 groo * are met: 13 1.1 groo * 1. Redistributions of source code must retain the above copyright 14 1.1 groo * notice, this list of conditions and the following disclaimer. 15 1.1 groo * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 groo * notice, this list of conditions and the following disclaimer in the 17 1.1 groo * documentation and/or other materials provided with the distribution. 18 1.1 groo * 19 1.1 groo * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 groo * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 groo * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 groo * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 groo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 groo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 groo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 groo * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 groo * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 groo * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 groo * POSSIBILITY OF SUCH DAMAGE. 30 1.1 groo */ 31 1.13 lukem 32 1.13 lukem #include <sys/cdefs.h> 33 1.79 msaitoh __KERNEL_RCSID(0, "$NetBSD: nslm7x.c,v 1.79 2022/12/16 00:02:28 msaitoh Exp $"); 34 1.1 groo 35 1.1 groo #include <sys/param.h> 36 1.1 groo #include <sys/systm.h> 37 1.1 groo #include <sys/kernel.h> 38 1.1 groo #include <sys/proc.h> 39 1.1 groo #include <sys/device.h> 40 1.59 jakllsch #include <sys/module.h> 41 1.1 groo #include <sys/conf.h> 42 1.1 groo #include <sys/time.h> 43 1.1 groo 44 1.43 ad #include <sys/bus.h> 45 1.1 groo 46 1.1 groo #include <dev/isa/isareg.h> 47 1.1 groo #include <dev/isa/isavar.h> 48 1.65 msaitoh #include <dev/isa/wbsioreg.h> 49 1.1 groo 50 1.4 thorpej #include <dev/sysmon/sysmonvar.h> 51 1.4 thorpej 52 1.1 groo #include <dev/ic/nslm7xvar.h> 53 1.1 groo 54 1.43 ad #include <sys/intr.h> 55 1.1 groo 56 1.1 groo #if defined(LMDEBUG) 57 1.30 xtraeme #define DPRINTF(x) do { printf x; } while (0) 58 1.1 groo #else 59 1.1 groo #define DPRINTF(x) 60 1.1 groo #endif 61 1.1 groo 62 1.30 xtraeme /* 63 1.30 xtraeme * LM78-compatible chips can typically measure voltages up to 4.096 V. 64 1.30 xtraeme * To measure higher voltages the input is attenuated with (external) 65 1.30 xtraeme * resistors. Negative voltages are measured using inverting op amps 66 1.30 xtraeme * and resistors. So we have to convert the sensor values back to 67 1.30 xtraeme * real voltages by applying the appropriate resistor factor. 68 1.30 xtraeme */ 69 1.30 xtraeme #define RFACT_NONE 10000 70 1.30 xtraeme #define RFACT(x, y) (RFACT_NONE * ((x) + (y)) / (y)) 71 1.30 xtraeme #define NRFACT(x, y) (-RFACT_NONE * (x) / (y)) 72 1.30 xtraeme 73 1.41 xtraeme #define LM_REFRESH_TIMO (2 * hz) /* 2 seconds */ 74 1.40 xtraeme 75 1.70 msaitoh static const struct wb_product *wb_lookup(struct lm_softc *, 76 1.70 msaitoh const struct wb_product *, uint16_t); 77 1.30 xtraeme static int wb_match(struct lm_softc *); 78 1.70 msaitoh static int wb_attach(struct lm_softc *); 79 1.70 msaitoh static int nslm_match(struct lm_softc *); 80 1.70 msaitoh static int nslm_attach(struct lm_softc *); 81 1.30 xtraeme static int def_match(struct lm_softc *); 82 1.70 msaitoh static int def_attach(struct lm_softc *); 83 1.50 pgoyette static void wb_temp_diode_type(struct lm_softc *, int); 84 1.70 msaitoh static uint16_t wb_read_vendorid(struct lm_softc *); 85 1.30 xtraeme 86 1.40 xtraeme static void lm_refresh(void *); 87 1.40 xtraeme 88 1.69 msaitoh static void lm_generic_banksel(struct lm_softc *, uint8_t); 89 1.68 msaitoh static void lm_setup_sensors(struct lm_softc *, const struct lm_sensor *); 90 1.40 xtraeme static void lm_refresh_sensor_data(struct lm_softc *); 91 1.30 xtraeme static void lm_refresh_volt(struct lm_softc *, int); 92 1.30 xtraeme static void lm_refresh_temp(struct lm_softc *, int); 93 1.30 xtraeme static void lm_refresh_fanrpm(struct lm_softc *, int); 94 1.30 xtraeme 95 1.40 xtraeme static void wb_refresh_sensor_data(struct lm_softc *); 96 1.30 xtraeme static void wb_w83637hf_refresh_vcore(struct lm_softc *, int); 97 1.30 xtraeme static void wb_refresh_nvolt(struct lm_softc *, int); 98 1.30 xtraeme static void wb_w83627ehf_refresh_nvolt(struct lm_softc *, int); 99 1.30 xtraeme static void wb_refresh_temp(struct lm_softc *, int); 100 1.30 xtraeme static void wb_refresh_fanrpm(struct lm_softc *, int); 101 1.30 xtraeme static void wb_w83792d_refresh_fanrpm(struct lm_softc *, int); 102 1.64 pgoyette static void wb_nct6776f_refresh_fanrpm(struct lm_softc *, int); 103 1.65 msaitoh 104 1.30 xtraeme static void as_refresh_temp(struct lm_softc *, int); 105 1.20 perry 106 1.5 bouyer struct lm_chip { 107 1.20 perry int (*chip_match)(struct lm_softc *); 108 1.70 msaitoh int (*chip_attach)(struct lm_softc *); 109 1.5 bouyer }; 110 1.5 bouyer 111 1.30 xtraeme static struct lm_chip lm_chips[] = { 112 1.70 msaitoh { wb_match, wb_attach }, 113 1.70 msaitoh { nslm_match, nslm_attach }, 114 1.70 msaitoh { def_match, def_attach } /* Must be last */ 115 1.65 msaitoh }; 116 1.65 msaitoh 117 1.33 xtraeme /* LM78/78J/79/81 */ 118 1.68 msaitoh static const struct lm_sensor lm78_sensors[] = { 119 1.30 xtraeme /* Voltage */ 120 1.33 xtraeme { 121 1.33 xtraeme .desc = "VCore A", 122 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 123 1.33 xtraeme .bank = 0, 124 1.33 xtraeme .reg = 0x20, 125 1.33 xtraeme .refresh = lm_refresh_volt, 126 1.33 xtraeme .rfact = RFACT_NONE 127 1.33 xtraeme }, 128 1.33 xtraeme { 129 1.33 xtraeme .desc = "VCore B", 130 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 131 1.33 xtraeme .bank = 0, 132 1.33 xtraeme .reg = 0x21, 133 1.33 xtraeme .refresh = lm_refresh_volt, 134 1.33 xtraeme .rfact = RFACT_NONE 135 1.33 xtraeme }, 136 1.33 xtraeme { 137 1.33 xtraeme .desc = "+3.3V", 138 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 139 1.33 xtraeme .bank = 0, 140 1.33 xtraeme .reg = 0x22, 141 1.33 xtraeme .refresh = lm_refresh_volt, 142 1.33 xtraeme .rfact = RFACT_NONE 143 1.33 xtraeme }, 144 1.33 xtraeme { 145 1.33 xtraeme .desc = "+5V", 146 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 147 1.33 xtraeme .bank = 0, 148 1.33 xtraeme .reg = 0x23, 149 1.33 xtraeme .refresh = lm_refresh_volt, 150 1.33 xtraeme .rfact = RFACT(68, 100) 151 1.33 xtraeme }, 152 1.33 xtraeme { 153 1.33 xtraeme .desc = "+12V", 154 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 155 1.33 xtraeme .bank = 0, 156 1.33 xtraeme .reg = 0x24, 157 1.33 xtraeme .refresh = lm_refresh_volt, 158 1.33 xtraeme .rfact = RFACT(30, 10) 159 1.33 xtraeme }, 160 1.33 xtraeme { 161 1.33 xtraeme .desc = "-12V", 162 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 163 1.33 xtraeme .bank = 0, 164 1.33 xtraeme .reg = 0x25, 165 1.33 xtraeme .refresh = lm_refresh_volt, 166 1.33 xtraeme .rfact = NRFACT(240, 60) 167 1.33 xtraeme }, 168 1.33 xtraeme { 169 1.33 xtraeme .desc = "-5V", 170 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 171 1.33 xtraeme .bank = 0, 172 1.33 xtraeme .reg = 0x26, 173 1.33 xtraeme .refresh = lm_refresh_volt, 174 1.33 xtraeme .rfact = NRFACT(100, 60) 175 1.33 xtraeme }, 176 1.30 xtraeme 177 1.30 xtraeme /* Temperature */ 178 1.33 xtraeme { 179 1.33 xtraeme .desc = "Temp0", 180 1.33 xtraeme .type = ENVSYS_STEMP, 181 1.33 xtraeme .bank = 0, 182 1.33 xtraeme .reg = 0x27, 183 1.33 xtraeme .refresh = lm_refresh_temp, 184 1.33 xtraeme .rfact = 0 185 1.33 xtraeme }, 186 1.30 xtraeme 187 1.30 xtraeme /* Fans */ 188 1.33 xtraeme { 189 1.33 xtraeme .desc = "Fan0", 190 1.33 xtraeme .type = ENVSYS_SFANRPM, 191 1.33 xtraeme .bank = 0, 192 1.33 xtraeme .reg = 0x28, 193 1.33 xtraeme .refresh = lm_refresh_fanrpm, 194 1.33 xtraeme .rfact = 0 195 1.33 xtraeme }, 196 1.33 xtraeme { 197 1.33 xtraeme .desc = "Fan1", 198 1.33 xtraeme .type = ENVSYS_SFANRPM, 199 1.33 xtraeme .bank = 0, 200 1.33 xtraeme .reg = 0x29, 201 1.33 xtraeme .refresh = lm_refresh_fanrpm, 202 1.33 xtraeme .rfact = 0 203 1.33 xtraeme }, 204 1.33 xtraeme { 205 1.33 xtraeme .desc = "Fan2", 206 1.33 xtraeme .type = ENVSYS_SFANRPM, 207 1.33 xtraeme .bank = 0, 208 1.33 xtraeme .reg = 0x2a, 209 1.33 xtraeme .refresh = lm_refresh_fanrpm, 210 1.33 xtraeme .rfact = 0 211 1.33 xtraeme }, 212 1.30 xtraeme 213 1.32 christos { .desc = NULL } 214 1.30 xtraeme }; 215 1.30 xtraeme 216 1.33 xtraeme /* W83627HF */ 217 1.68 msaitoh static const struct lm_sensor w83627hf_sensors[] = { 218 1.30 xtraeme /* Voltage */ 219 1.33 xtraeme { 220 1.33 xtraeme .desc = "VCore A", 221 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 222 1.33 xtraeme .bank = 0, 223 1.33 xtraeme .reg = 0x20, 224 1.33 xtraeme .refresh = lm_refresh_volt, 225 1.33 xtraeme .rfact = RFACT_NONE 226 1.33 xtraeme }, 227 1.33 xtraeme { 228 1.33 xtraeme .desc = "VCore B", 229 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 230 1.33 xtraeme .bank = 0, 231 1.33 xtraeme .reg = 0x21, 232 1.33 xtraeme .refresh = lm_refresh_volt, 233 1.33 xtraeme .rfact = RFACT_NONE 234 1.33 xtraeme }, 235 1.33 xtraeme { 236 1.33 xtraeme .desc = "+3.3V", 237 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 238 1.33 xtraeme .bank = 0, 239 1.33 xtraeme .reg = 0x22, 240 1.33 xtraeme .refresh = lm_refresh_volt, 241 1.33 xtraeme .rfact = RFACT_NONE 242 1.33 xtraeme }, 243 1.33 xtraeme { 244 1.33 xtraeme .desc = "+5V", 245 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 246 1.33 xtraeme .bank = 0, 247 1.33 xtraeme .reg = 0x23, 248 1.33 xtraeme .refresh = lm_refresh_volt, 249 1.33 xtraeme .rfact = RFACT(34, 50) 250 1.33 xtraeme }, 251 1.33 xtraeme { 252 1.33 xtraeme .desc = "+12V", 253 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 254 1.33 xtraeme .bank = 0, 255 1.33 xtraeme .reg = 0x24, 256 1.33 xtraeme .refresh = lm_refresh_volt, 257 1.33 xtraeme .rfact = RFACT(28, 10) 258 1.33 xtraeme }, 259 1.33 xtraeme { 260 1.33 xtraeme .desc = "-12V", 261 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 262 1.33 xtraeme .bank = 0, 263 1.33 xtraeme .reg = 0x25, 264 1.33 xtraeme .refresh = wb_refresh_nvolt, 265 1.33 xtraeme .rfact = RFACT(232, 56) 266 1.33 xtraeme }, 267 1.33 xtraeme { 268 1.33 xtraeme .desc = "-5V", 269 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 270 1.33 xtraeme .bank = 0, 271 1.33 xtraeme .reg = 0x26, 272 1.33 xtraeme .refresh = wb_refresh_nvolt, 273 1.33 xtraeme .rfact = RFACT(120, 56) 274 1.33 xtraeme }, 275 1.33 xtraeme { 276 1.33 xtraeme .desc = "5VSB", 277 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 278 1.33 xtraeme .bank = 5, 279 1.33 xtraeme .reg = 0x50, 280 1.33 xtraeme .refresh = lm_refresh_volt, 281 1.33 xtraeme .rfact = RFACT(17, 33) 282 1.33 xtraeme }, 283 1.33 xtraeme { 284 1.33 xtraeme .desc = "VBAT", 285 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 286 1.33 xtraeme .bank = 5, 287 1.33 xtraeme .reg = 0x51, 288 1.33 xtraeme .refresh = lm_refresh_volt, 289 1.33 xtraeme .rfact = RFACT_NONE 290 1.33 xtraeme }, 291 1.30 xtraeme 292 1.30 xtraeme /* Temperature */ 293 1.33 xtraeme { 294 1.33 xtraeme .desc = "Temp0", 295 1.33 xtraeme .type = ENVSYS_STEMP, 296 1.33 xtraeme .bank = 0, 297 1.33 xtraeme .reg = 0x27, 298 1.33 xtraeme .refresh = lm_refresh_temp, 299 1.33 xtraeme .rfact = 0 300 1.33 xtraeme }, 301 1.33 xtraeme { 302 1.33 xtraeme .desc = "Temp1", 303 1.33 xtraeme .type = ENVSYS_STEMP, 304 1.33 xtraeme .bank = 1, 305 1.33 xtraeme .reg = 0x50, 306 1.33 xtraeme .refresh = wb_refresh_temp, 307 1.33 xtraeme .rfact = 0 308 1.33 xtraeme }, 309 1.33 xtraeme { 310 1.33 xtraeme .desc = "Temp2", 311 1.33 xtraeme .type = ENVSYS_STEMP, 312 1.33 xtraeme .bank = 2, 313 1.33 xtraeme .reg = 0x50, 314 1.33 xtraeme .refresh = wb_refresh_temp, 315 1.33 xtraeme .rfact = 0 316 1.33 xtraeme }, 317 1.30 xtraeme 318 1.30 xtraeme /* Fans */ 319 1.33 xtraeme { 320 1.33 xtraeme .desc = "Fan0", 321 1.33 xtraeme .type = ENVSYS_SFANRPM, 322 1.33 xtraeme .bank = 0, 323 1.33 xtraeme .reg = 0x28, 324 1.33 xtraeme .refresh = wb_refresh_fanrpm, 325 1.33 xtraeme .rfact = 0 326 1.33 xtraeme }, 327 1.33 xtraeme { 328 1.33 xtraeme .desc = "Fan1", 329 1.33 xtraeme .type = ENVSYS_SFANRPM, 330 1.33 xtraeme .bank = 0, 331 1.33 xtraeme .reg = 0x29, 332 1.33 xtraeme .refresh = wb_refresh_fanrpm, 333 1.33 xtraeme .rfact = 0 334 1.33 xtraeme }, 335 1.33 xtraeme { 336 1.33 xtraeme .desc = "Fan2", 337 1.33 xtraeme .type = ENVSYS_SFANRPM, 338 1.33 xtraeme .bank = 0, 339 1.33 xtraeme .reg = 0x2a, 340 1.33 xtraeme .refresh = wb_refresh_fanrpm, 341 1.33 xtraeme .rfact = 0 342 1.33 xtraeme }, 343 1.30 xtraeme 344 1.32 christos { .desc = NULL } 345 1.30 xtraeme }; 346 1.30 xtraeme 347 1.33 xtraeme /* W8627EHF */ 348 1.33 xtraeme 349 1.30 xtraeme /* 350 1.30 xtraeme * The W83627EHF can measure voltages up to 2.048 V instead of the 351 1.30 xtraeme * traditional 4.096 V. For measuring positive voltages, this can be 352 1.30 xtraeme * accounted for by halving the resistor factor. Negative voltages 353 1.30 xtraeme * need special treatment, also because the reference voltage is 2.048 V 354 1.30 xtraeme * instead of the traditional 3.6 V. 355 1.30 xtraeme */ 356 1.68 msaitoh static const struct lm_sensor w83627ehf_sensors[] = { 357 1.30 xtraeme /* Voltage */ 358 1.33 xtraeme { 359 1.33 xtraeme .desc = "VCore", 360 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 361 1.33 xtraeme .bank = 0, 362 1.33 xtraeme .reg = 0x20, 363 1.33 xtraeme .refresh = lm_refresh_volt, 364 1.33 xtraeme .rfact = RFACT_NONE / 2 365 1.33 xtraeme }, 366 1.33 xtraeme { 367 1.33 xtraeme .desc = "+12V", 368 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 369 1.33 xtraeme .bank = 0, 370 1.33 xtraeme .reg = 0x21, 371 1.33 xtraeme .refresh = lm_refresh_volt, 372 1.33 xtraeme .rfact = RFACT(56, 10) / 2 373 1.33 xtraeme }, 374 1.33 xtraeme { 375 1.33 xtraeme .desc = "+3.3V", 376 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 377 1.33 xtraeme .bank = 0, 378 1.33 xtraeme .reg = 0x22, 379 1.33 xtraeme .refresh = lm_refresh_volt, 380 1.33 xtraeme .rfact = RFACT(34, 34) / 2 381 1.33 xtraeme }, 382 1.33 xtraeme { 383 1.39 xtraeme .desc = "VIN3", 384 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 385 1.33 xtraeme .bank = 0, 386 1.33 xtraeme .reg = 0x23, 387 1.33 xtraeme .refresh = lm_refresh_volt, 388 1.36 tsutsui .rfact = RFACT(34, 34) / 2 389 1.33 xtraeme }, 390 1.33 xtraeme { 391 1.33 xtraeme .desc = "-12V", 392 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 393 1.33 xtraeme .bank = 0, 394 1.33 xtraeme .reg = 0x24, 395 1.33 xtraeme .refresh = wb_w83627ehf_refresh_nvolt, 396 1.33 xtraeme .rfact = 0 397 1.33 xtraeme }, 398 1.33 xtraeme { 399 1.39 xtraeme .desc = "VIN5", 400 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 401 1.33 xtraeme .bank = 0, 402 1.33 xtraeme .reg = 0x25, 403 1.33 xtraeme .refresh = lm_refresh_volt, 404 1.33 xtraeme .rfact = RFACT_NONE / 2 405 1.33 xtraeme }, 406 1.33 xtraeme { 407 1.39 xtraeme .desc = "VIN6", 408 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 409 1.33 xtraeme .bank = 0, 410 1.33 xtraeme .reg = 0x26, 411 1.33 xtraeme .refresh = lm_refresh_volt, 412 1.33 xtraeme .rfact = RFACT_NONE / 2 413 1.33 xtraeme }, 414 1.33 xtraeme { 415 1.33 xtraeme .desc = "3.3VSB", 416 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 417 1.33 xtraeme .bank = 5, 418 1.33 xtraeme .reg = 0x50, 419 1.33 xtraeme .refresh = lm_refresh_volt, 420 1.33 xtraeme .rfact = RFACT(34, 34) / 2 421 1.33 xtraeme }, 422 1.33 xtraeme { 423 1.33 xtraeme .desc = "VBAT", 424 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 425 1.33 xtraeme .bank = 5, 426 1.33 xtraeme .reg = 0x51, 427 1.33 xtraeme .refresh = lm_refresh_volt, 428 1.33 xtraeme .rfact = RFACT_NONE / 2 429 1.33 xtraeme }, 430 1.33 xtraeme { 431 1.39 xtraeme .desc = "VIN8", 432 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 433 1.33 xtraeme .bank = 5, 434 1.33 xtraeme .reg = 0x52, 435 1.33 xtraeme .refresh = lm_refresh_volt, 436 1.33 xtraeme .rfact = RFACT_NONE / 2 437 1.33 xtraeme }, 438 1.30 xtraeme 439 1.30 xtraeme /* Temperature */ 440 1.33 xtraeme { 441 1.33 xtraeme .desc = "Temp0", 442 1.33 xtraeme .type = ENVSYS_STEMP, 443 1.33 xtraeme .bank = 0, 444 1.33 xtraeme .reg = 0x27, 445 1.33 xtraeme .refresh = lm_refresh_temp, 446 1.33 xtraeme .rfact = 0 447 1.33 xtraeme }, 448 1.33 xtraeme { 449 1.33 xtraeme .desc = "Temp1", 450 1.33 xtraeme .type = ENVSYS_STEMP, 451 1.33 xtraeme .bank = 1, 452 1.33 xtraeme .reg = 0x50, 453 1.33 xtraeme .refresh = wb_refresh_temp, 454 1.33 xtraeme .rfact = 0 455 1.33 xtraeme }, 456 1.33 xtraeme { 457 1.33 xtraeme .desc = "Temp2", 458 1.33 xtraeme .type = ENVSYS_STEMP, 459 1.33 xtraeme .bank = 2, 460 1.33 xtraeme .reg = 0x50, 461 1.33 xtraeme .refresh = wb_refresh_temp, 462 1.33 xtraeme .rfact = 0 463 1.33 xtraeme }, 464 1.30 xtraeme 465 1.30 xtraeme /* Fans */ 466 1.33 xtraeme { 467 1.33 xtraeme .desc = "Fan0", 468 1.33 xtraeme .type = ENVSYS_SFANRPM, 469 1.33 xtraeme .bank = 0, 470 1.33 xtraeme .reg = 0x28, 471 1.33 xtraeme .refresh = wb_refresh_fanrpm, 472 1.33 xtraeme .rfact = 0 473 1.33 xtraeme }, 474 1.33 xtraeme { 475 1.33 xtraeme .desc = "Fan1", 476 1.33 xtraeme .type = ENVSYS_SFANRPM, 477 1.33 xtraeme .bank = 0, 478 1.33 xtraeme .reg = 0x29, 479 1.33 xtraeme .refresh = wb_refresh_fanrpm, 480 1.33 xtraeme .rfact = 0 481 1.33 xtraeme }, 482 1.33 xtraeme { 483 1.33 xtraeme .desc = "Fan2", 484 1.33 xtraeme .type = ENVSYS_SFANRPM, 485 1.33 xtraeme .bank = 0, 486 1.33 xtraeme .reg = 0x2a, 487 1.33 xtraeme .refresh = wb_refresh_fanrpm, 488 1.33 xtraeme .rfact = 0 489 1.33 xtraeme }, 490 1.30 xtraeme 491 1.32 christos { .desc = NULL } 492 1.30 xtraeme }; 493 1.30 xtraeme 494 1.33 xtraeme /* W83627DHG */ 495 1.68 msaitoh static const struct lm_sensor w83627dhg_sensors[] = { 496 1.30 xtraeme /* Voltage */ 497 1.33 xtraeme { 498 1.33 xtraeme .desc = "VCore", 499 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 500 1.33 xtraeme .bank = 0, 501 1.33 xtraeme .reg = 0x20, 502 1.33 xtraeme .refresh = lm_refresh_volt, 503 1.33 xtraeme .rfact = RFACT_NONE / 2 504 1.33 xtraeme }, 505 1.33 xtraeme { 506 1.33 xtraeme .desc = "+12V", 507 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 508 1.33 xtraeme .bank = 0, 509 1.33 xtraeme .reg = 0x21, 510 1.33 xtraeme .refresh = lm_refresh_volt, 511 1.33 xtraeme .rfact = RFACT(56, 10) / 2 512 1.33 xtraeme }, 513 1.33 xtraeme { 514 1.37 xtraeme .desc = "AVCC", 515 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 516 1.33 xtraeme .bank = 0, 517 1.33 xtraeme .reg = 0x22, 518 1.33 xtraeme .refresh = lm_refresh_volt, 519 1.37 xtraeme .rfact = RFACT(34, 34) / 2 520 1.33 xtraeme }, 521 1.33 xtraeme { 522 1.37 xtraeme .desc = "+3.3V", 523 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 524 1.33 xtraeme .bank = 0, 525 1.33 xtraeme .reg = 0x23, 526 1.33 xtraeme .refresh = lm_refresh_volt, 527 1.37 xtraeme .rfact = RFACT(34, 34) / 2 528 1.33 xtraeme }, 529 1.33 xtraeme { 530 1.44 xtraeme .desc = "-12V", 531 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 532 1.33 xtraeme .bank = 0, 533 1.37 xtraeme .reg = 0x24, 534 1.37 xtraeme .refresh = wb_w83627ehf_refresh_nvolt, 535 1.37 xtraeme .rfact = 0 536 1.33 xtraeme }, 537 1.33 xtraeme { 538 1.37 xtraeme .desc = "+5V", 539 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 540 1.33 xtraeme .bank = 0, 541 1.37 xtraeme .reg = 0x25, 542 1.37 xtraeme .refresh = lm_refresh_volt, 543 1.37 xtraeme .rfact = 16000 544 1.33 xtraeme }, 545 1.33 xtraeme { 546 1.37 xtraeme .desc = "VIN3", 547 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 548 1.33 xtraeme .bank = 0, 549 1.33 xtraeme .reg = 0x26, 550 1.37 xtraeme .refresh = lm_refresh_volt, 551 1.44 xtraeme .rfact = RFACT_NONE 552 1.33 xtraeme }, 553 1.33 xtraeme { 554 1.33 xtraeme .desc = "+3.3VSB", 555 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 556 1.33 xtraeme .bank = 5, 557 1.33 xtraeme .reg = 0x50, 558 1.33 xtraeme .refresh = lm_refresh_volt, 559 1.37 xtraeme .rfact = RFACT(34, 34) / 2 560 1.33 xtraeme }, 561 1.33 xtraeme { 562 1.33 xtraeme .desc = "VBAT", 563 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 564 1.33 xtraeme .bank = 5, 565 1.33 xtraeme .reg = 0x51, 566 1.33 xtraeme .refresh = lm_refresh_volt, 567 1.44 xtraeme .rfact = RFACT(34, 34) / 2 568 1.33 xtraeme }, 569 1.30 xtraeme 570 1.30 xtraeme /* Temperature */ 571 1.33 xtraeme { 572 1.37 xtraeme .desc = "MB Temperature", 573 1.33 xtraeme .type = ENVSYS_STEMP, 574 1.33 xtraeme .bank = 0, 575 1.33 xtraeme .reg = 0x27, 576 1.33 xtraeme .refresh = lm_refresh_temp, 577 1.33 xtraeme .rfact = 0 578 1.33 xtraeme }, 579 1.33 xtraeme { 580 1.37 xtraeme .desc = "CPU Temperature", 581 1.33 xtraeme .type = ENVSYS_STEMP, 582 1.33 xtraeme .bank = 1, 583 1.33 xtraeme .reg = 0x50, 584 1.37 xtraeme .refresh = lm_refresh_temp, 585 1.33 xtraeme .rfact = 0 586 1.33 xtraeme }, 587 1.33 xtraeme { 588 1.33 xtraeme .desc = "Aux Temp", 589 1.33 xtraeme .type = ENVSYS_STEMP, 590 1.33 xtraeme .bank = 2, 591 1.33 xtraeme .reg = 0x50, 592 1.37 xtraeme .refresh = lm_refresh_temp, 593 1.33 xtraeme .rfact = 0 594 1.33 xtraeme }, 595 1.30 xtraeme 596 1.30 xtraeme /* Fans */ 597 1.33 xtraeme { 598 1.33 xtraeme .desc = "System Fan", 599 1.33 xtraeme .type = ENVSYS_SFANRPM, 600 1.33 xtraeme .bank = 0, 601 1.33 xtraeme .reg = 0x28, 602 1.33 xtraeme .refresh = wb_refresh_fanrpm, 603 1.33 xtraeme .rfact = 0 604 1.33 xtraeme }, 605 1.33 xtraeme { 606 1.33 xtraeme .desc = "CPU Fan", 607 1.33 xtraeme .type = ENVSYS_SFANRPM, 608 1.33 xtraeme .bank = 0, 609 1.33 xtraeme .reg = 0x29, 610 1.33 xtraeme .refresh = wb_refresh_fanrpm, 611 1.33 xtraeme .rfact = 0 612 1.33 xtraeme }, 613 1.33 xtraeme { 614 1.33 xtraeme .desc = "Aux Fan", 615 1.33 xtraeme .type = ENVSYS_SFANRPM, 616 1.33 xtraeme .bank = 0, 617 1.33 xtraeme .reg = 0x2a, 618 1.33 xtraeme .refresh = wb_refresh_fanrpm, 619 1.33 xtraeme .rfact = 0 620 1.33 xtraeme }, 621 1.30 xtraeme 622 1.32 christos { .desc = NULL } 623 1.30 xtraeme }; 624 1.30 xtraeme 625 1.33 xtraeme /* W83637HF */ 626 1.68 msaitoh static const struct lm_sensor w83637hf_sensors[] = { 627 1.30 xtraeme /* Voltage */ 628 1.33 xtraeme { 629 1.33 xtraeme .desc = "VCore", 630 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 631 1.33 xtraeme .bank = 0, 632 1.33 xtraeme .reg = 0x20, 633 1.33 xtraeme .refresh = wb_w83637hf_refresh_vcore, 634 1.33 xtraeme .rfact = 0 635 1.33 xtraeme }, 636 1.33 xtraeme { 637 1.33 xtraeme .desc = "+12V", 638 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 639 1.33 xtraeme .bank = 0, 640 1.33 xtraeme .reg = 0x21, 641 1.33 xtraeme .refresh = lm_refresh_volt, 642 1.33 xtraeme .rfact = RFACT(28, 10) 643 1.33 xtraeme }, 644 1.33 xtraeme { 645 1.33 xtraeme .desc = "+3.3V", 646 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 647 1.33 xtraeme .bank = 0, 648 1.33 xtraeme .reg = 0x22, 649 1.33 xtraeme .refresh = lm_refresh_volt, 650 1.33 xtraeme .rfact = RFACT_NONE 651 1.33 xtraeme }, 652 1.33 xtraeme { 653 1.33 xtraeme .desc = "+5V", 654 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 655 1.33 xtraeme .bank = 0, 656 1.33 xtraeme .reg = 0x23, 657 1.33 xtraeme .refresh = lm_refresh_volt, 658 1.33 xtraeme .rfact = RFACT(34, 51) 659 1.33 xtraeme }, 660 1.33 xtraeme { 661 1.33 xtraeme .desc = "-12V", 662 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 663 1.33 xtraeme .bank = 0, 664 1.33 xtraeme .reg = 0x24, 665 1.33 xtraeme .refresh = wb_refresh_nvolt, 666 1.33 xtraeme .rfact = RFACT(232, 56) 667 1.33 xtraeme }, 668 1.33 xtraeme { 669 1.33 xtraeme .desc = "5VSB", 670 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 671 1.33 xtraeme .bank = 5, 672 1.33 xtraeme .reg = 0x50, 673 1.33 xtraeme .refresh = lm_refresh_volt, 674 1.33 xtraeme .rfact = RFACT(34, 51) 675 1.33 xtraeme }, 676 1.33 xtraeme { 677 1.33 xtraeme .desc = "VBAT", 678 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 679 1.33 xtraeme .bank = 5, 680 1.33 xtraeme .reg = 0x51, 681 1.33 xtraeme .refresh = lm_refresh_volt, 682 1.33 xtraeme .rfact = RFACT_NONE 683 1.33 xtraeme }, 684 1.30 xtraeme 685 1.30 xtraeme /* Temperature */ 686 1.33 xtraeme { 687 1.33 xtraeme .desc = "Temp0", 688 1.33 xtraeme .type = ENVSYS_STEMP, 689 1.33 xtraeme .bank = 0, 690 1.33 xtraeme .reg = 0x27, 691 1.33 xtraeme .refresh = lm_refresh_temp, 692 1.33 xtraeme .rfact = 0 693 1.33 xtraeme }, 694 1.33 xtraeme { 695 1.33 xtraeme .desc = "Temp1", 696 1.33 xtraeme .type = ENVSYS_STEMP, 697 1.33 xtraeme .bank = 1, 698 1.33 xtraeme .reg = 0x50, 699 1.33 xtraeme .refresh = wb_refresh_temp, 700 1.33 xtraeme .rfact = 0 701 1.33 xtraeme }, 702 1.33 xtraeme { 703 1.33 xtraeme .desc = "Temp2", 704 1.33 xtraeme .type = ENVSYS_STEMP, 705 1.33 xtraeme .bank = 2, 706 1.33 xtraeme .reg = 0x50, 707 1.33 xtraeme .refresh = wb_refresh_temp, 708 1.33 xtraeme .rfact = 0 709 1.33 xtraeme }, 710 1.30 xtraeme 711 1.30 xtraeme /* Fans */ 712 1.33 xtraeme { 713 1.33 xtraeme .desc = "Fan0", 714 1.33 xtraeme .type = ENVSYS_SFANRPM, 715 1.33 xtraeme .bank = 0, 716 1.33 xtraeme .reg = 0x28, 717 1.33 xtraeme .refresh = wb_refresh_fanrpm, 718 1.33 xtraeme .rfact = 0 719 1.33 xtraeme }, 720 1.33 xtraeme { 721 1.33 xtraeme .desc = "Fan1", 722 1.33 xtraeme .type = ENVSYS_SFANRPM, 723 1.33 xtraeme .bank = 0, 724 1.33 xtraeme .reg = 0x29, 725 1.33 xtraeme .refresh = wb_refresh_fanrpm, 726 1.33 xtraeme .rfact = 0 727 1.33 xtraeme }, 728 1.33 xtraeme { 729 1.33 xtraeme .desc = "Fan2", 730 1.33 xtraeme .type = ENVSYS_SFANRPM, 731 1.33 xtraeme .bank = 0, 732 1.33 xtraeme .reg = 0x2a, 733 1.33 xtraeme .refresh = wb_refresh_fanrpm, 734 1.33 xtraeme .rfact = 0 735 1.33 xtraeme }, 736 1.30 xtraeme 737 1.32 christos { .desc = NULL } 738 1.30 xtraeme }; 739 1.30 xtraeme 740 1.33 xtraeme /* W83697HF */ 741 1.68 msaitoh static const struct lm_sensor w83697hf_sensors[] = { 742 1.30 xtraeme /* Voltage */ 743 1.33 xtraeme { 744 1.33 xtraeme .desc = "VCore", 745 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 746 1.33 xtraeme .bank = 0, 747 1.33 xtraeme .reg = 0x20, 748 1.33 xtraeme .refresh = lm_refresh_volt, 749 1.33 xtraeme .rfact = RFACT_NONE 750 1.33 xtraeme }, 751 1.33 xtraeme { 752 1.33 xtraeme .desc = "+3.3V", 753 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 754 1.33 xtraeme .bank = 0, 755 1.33 xtraeme .reg = 0x22, 756 1.33 xtraeme .refresh = lm_refresh_volt, 757 1.33 xtraeme .rfact = RFACT_NONE 758 1.33 xtraeme }, 759 1.33 xtraeme { 760 1.33 xtraeme .desc = "+5V", 761 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 762 1.33 xtraeme .bank = 0, 763 1.33 xtraeme .reg = 0x23, 764 1.33 xtraeme .refresh = lm_refresh_volt, 765 1.33 xtraeme .rfact = RFACT(34, 50) 766 1.33 xtraeme }, 767 1.33 xtraeme { 768 1.33 xtraeme .desc = "+12V", 769 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 770 1.33 xtraeme .bank = 0, 771 1.33 xtraeme .reg = 0x24, 772 1.33 xtraeme .refresh = lm_refresh_volt, 773 1.33 xtraeme .rfact = RFACT(28, 10) 774 1.33 xtraeme }, 775 1.33 xtraeme { 776 1.33 xtraeme .desc = "-12V", 777 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 778 1.33 xtraeme .bank = 0, 779 1.33 xtraeme .reg = 0x25, 780 1.33 xtraeme .refresh = wb_refresh_nvolt, 781 1.33 xtraeme .rfact = RFACT(232, 56) 782 1.33 xtraeme }, 783 1.33 xtraeme { 784 1.33 xtraeme .desc = "-5V", 785 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 786 1.33 xtraeme .bank = 0, 787 1.33 xtraeme .reg = 0x26, 788 1.33 xtraeme .refresh = wb_refresh_nvolt, 789 1.33 xtraeme .rfact = RFACT(120, 56) 790 1.33 xtraeme }, 791 1.33 xtraeme { 792 1.33 xtraeme .desc = "5VSB", 793 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 794 1.33 xtraeme .bank = 5, 795 1.33 xtraeme .reg = 0x50, 796 1.33 xtraeme .refresh = lm_refresh_volt, 797 1.33 xtraeme .rfact = RFACT(17, 33) 798 1.33 xtraeme }, 799 1.33 xtraeme { 800 1.33 xtraeme .desc = "VBAT", 801 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 802 1.33 xtraeme .bank = 5, 803 1.33 xtraeme .reg = 0x51, 804 1.33 xtraeme .refresh = lm_refresh_volt, 805 1.33 xtraeme .rfact = RFACT_NONE 806 1.33 xtraeme }, 807 1.30 xtraeme 808 1.30 xtraeme /* Temperature */ 809 1.33 xtraeme { 810 1.33 xtraeme .desc = "Temp0", 811 1.33 xtraeme .type = ENVSYS_STEMP, 812 1.33 xtraeme .bank = 0, 813 1.33 xtraeme .reg = 0x27, 814 1.33 xtraeme .refresh = lm_refresh_temp, 815 1.33 xtraeme .rfact = 0 816 1.33 xtraeme }, 817 1.33 xtraeme { 818 1.33 xtraeme .desc = "Temp1", 819 1.33 xtraeme .type = ENVSYS_STEMP, 820 1.33 xtraeme .bank = 1, 821 1.33 xtraeme .reg = 0x50, 822 1.33 xtraeme .refresh = wb_refresh_temp, 823 1.33 xtraeme .rfact = 0 824 1.33 xtraeme }, 825 1.30 xtraeme 826 1.30 xtraeme /* Fans */ 827 1.33 xtraeme { 828 1.33 xtraeme .desc = "Fan0", 829 1.33 xtraeme .type = ENVSYS_SFANRPM, 830 1.33 xtraeme .bank = 0, 831 1.33 xtraeme .reg = 0x28, 832 1.33 xtraeme .refresh = wb_refresh_fanrpm, 833 1.33 xtraeme .rfact = 0 834 1.33 xtraeme }, 835 1.33 xtraeme { 836 1.33 xtraeme .desc = "Fan1", 837 1.33 xtraeme .type = ENVSYS_SFANRPM, 838 1.33 xtraeme .bank = 0, 839 1.33 xtraeme .reg = 0x29, 840 1.33 xtraeme .refresh = wb_refresh_fanrpm, 841 1.33 xtraeme .rfact = 0 842 1.33 xtraeme }, 843 1.30 xtraeme 844 1.32 christos { .desc = NULL } 845 1.30 xtraeme }; 846 1.30 xtraeme 847 1.33 xtraeme /* W83781D */ 848 1.33 xtraeme 849 1.30 xtraeme /* 850 1.30 xtraeme * The datasheet doesn't mention the (internal) resistors used for the 851 1.30 xtraeme * +5V, but using the values from the W83782D datasheets seems to 852 1.30 xtraeme * provide sensible results. 853 1.30 xtraeme */ 854 1.68 msaitoh static const struct lm_sensor w83781d_sensors[] = { 855 1.30 xtraeme /* Voltage */ 856 1.33 xtraeme { 857 1.33 xtraeme .desc = "VCore A", 858 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 859 1.33 xtraeme .bank = 0, 860 1.33 xtraeme .reg = 0x20, 861 1.33 xtraeme .refresh = lm_refresh_volt, 862 1.33 xtraeme .rfact = RFACT_NONE 863 1.33 xtraeme }, 864 1.33 xtraeme { 865 1.33 xtraeme .desc = "VCore B", 866 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 867 1.33 xtraeme .bank = 0, 868 1.33 xtraeme .reg = 0x21, 869 1.33 xtraeme .refresh = lm_refresh_volt, 870 1.33 xtraeme .rfact = RFACT_NONE 871 1.33 xtraeme }, 872 1.33 xtraeme { 873 1.33 xtraeme .desc = "+3.3V", 874 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 875 1.33 xtraeme .bank = 0, 876 1.33 xtraeme .reg = 0x22, 877 1.33 xtraeme .refresh = lm_refresh_volt, 878 1.33 xtraeme .rfact = RFACT_NONE 879 1.33 xtraeme }, 880 1.33 xtraeme { 881 1.33 xtraeme .desc = "+5V", 882 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 883 1.33 xtraeme .bank = 0, 884 1.33 xtraeme .reg = 0x23, 885 1.33 xtraeme .refresh = lm_refresh_volt, 886 1.33 xtraeme .rfact = RFACT(34, 50) 887 1.33 xtraeme }, 888 1.33 xtraeme { 889 1.33 xtraeme .desc = "+12V", 890 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 891 1.33 xtraeme .bank = 0, 892 1.33 xtraeme .reg = 0x24, 893 1.33 xtraeme .refresh = lm_refresh_volt, 894 1.33 xtraeme .rfact = RFACT(28, 10) 895 1.33 xtraeme }, 896 1.33 xtraeme { 897 1.33 xtraeme .desc = "-12V", 898 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 899 1.33 xtraeme .bank = 0, 900 1.33 xtraeme .reg = 0x25, 901 1.33 xtraeme .refresh = lm_refresh_volt, 902 1.33 xtraeme .rfact = NRFACT(2100, 604) 903 1.33 xtraeme }, 904 1.33 xtraeme { 905 1.33 xtraeme .desc = "-5V", 906 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 907 1.33 xtraeme .bank = 0, 908 1.33 xtraeme .reg = 0x26, 909 1.33 xtraeme .refresh = lm_refresh_volt, 910 1.33 xtraeme .rfact = NRFACT(909, 604) 911 1.33 xtraeme }, 912 1.30 xtraeme 913 1.30 xtraeme /* Temperature */ 914 1.33 xtraeme { 915 1.33 xtraeme .desc = "Temp0", 916 1.33 xtraeme .type = ENVSYS_STEMP, 917 1.33 xtraeme .bank = 0, 918 1.33 xtraeme .reg = 0x27, 919 1.33 xtraeme .refresh = lm_refresh_temp, 920 1.33 xtraeme .rfact = 0 921 1.33 xtraeme }, 922 1.33 xtraeme { 923 1.33 xtraeme .desc = "Temp1", 924 1.33 xtraeme .type = ENVSYS_STEMP, 925 1.33 xtraeme .bank = 1, 926 1.33 xtraeme .reg = 0x50, 927 1.33 xtraeme .refresh = wb_refresh_temp, 928 1.33 xtraeme .rfact = 0 929 1.33 xtraeme }, 930 1.33 xtraeme { 931 1.33 xtraeme .desc = "Temp2", 932 1.33 xtraeme .type = ENVSYS_STEMP, 933 1.33 xtraeme .bank = 2, 934 1.33 xtraeme .reg = 0x50, 935 1.33 xtraeme .refresh = wb_refresh_temp, 936 1.33 xtraeme .rfact = 0 937 1.33 xtraeme }, 938 1.30 xtraeme 939 1.30 xtraeme /* Fans */ 940 1.33 xtraeme { 941 1.33 xtraeme .desc = "Fan0", 942 1.33 xtraeme .type = ENVSYS_SFANRPM, 943 1.33 xtraeme .bank = 0, 944 1.33 xtraeme .reg = 0x28, 945 1.33 xtraeme .refresh = lm_refresh_fanrpm, 946 1.33 xtraeme .rfact = 0 947 1.33 xtraeme }, 948 1.33 xtraeme { 949 1.33 xtraeme .desc = "Fan1", 950 1.33 xtraeme .type = ENVSYS_SFANRPM, 951 1.33 xtraeme .bank = 0, 952 1.33 xtraeme .reg = 0x29, 953 1.33 xtraeme .refresh = lm_refresh_fanrpm, 954 1.33 xtraeme .rfact = 0 955 1.33 xtraeme }, 956 1.33 xtraeme { 957 1.33 xtraeme .desc = "Fan2", 958 1.33 xtraeme .type = ENVSYS_SFANRPM, 959 1.33 xtraeme .bank = 0, 960 1.33 xtraeme .reg = 0x2a, 961 1.33 xtraeme .refresh = lm_refresh_fanrpm, 962 1.33 xtraeme .rfact = 0 963 1.33 xtraeme }, 964 1.30 xtraeme 965 1.32 christos { .desc = NULL } 966 1.30 xtraeme }; 967 1.30 xtraeme 968 1.33 xtraeme /* W83782D */ 969 1.68 msaitoh static const struct lm_sensor w83782d_sensors[] = { 970 1.30 xtraeme /* Voltage */ 971 1.33 xtraeme { 972 1.33 xtraeme .desc = "VCore", 973 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 974 1.33 xtraeme .bank = 0, 975 1.33 xtraeme .reg = 0x20, 976 1.33 xtraeme .refresh = lm_refresh_volt, 977 1.33 xtraeme .rfact = RFACT_NONE 978 1.33 xtraeme }, 979 1.33 xtraeme { 980 1.33 xtraeme .desc = "VINR0", 981 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 982 1.33 xtraeme .bank = 0, 983 1.33 xtraeme .reg = 0x21, 984 1.33 xtraeme .refresh = lm_refresh_volt, 985 1.33 xtraeme .rfact = RFACT_NONE 986 1.33 xtraeme }, 987 1.33 xtraeme { 988 1.33 xtraeme .desc = "+3.3V", 989 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 990 1.33 xtraeme .bank = 0, 991 1.33 xtraeme .reg = 0x22, 992 1.33 xtraeme .refresh = lm_refresh_volt, 993 1.33 xtraeme .rfact = RFACT_NONE 994 1.33 xtraeme }, 995 1.33 xtraeme { 996 1.33 xtraeme .desc = "+5V", 997 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 998 1.33 xtraeme .bank = 0, 999 1.33 xtraeme .reg = 0x23, 1000 1.33 xtraeme .refresh = lm_refresh_volt, 1001 1.33 xtraeme .rfact = RFACT(34, 50) 1002 1.33 xtraeme }, 1003 1.33 xtraeme { 1004 1.33 xtraeme .desc = "+12V", 1005 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1006 1.33 xtraeme .bank = 0, 1007 1.33 xtraeme .reg = 0x24, 1008 1.33 xtraeme .refresh = lm_refresh_volt, 1009 1.33 xtraeme .rfact = RFACT(28, 10) 1010 1.33 xtraeme }, 1011 1.33 xtraeme { 1012 1.33 xtraeme .desc = "-12V", 1013 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1014 1.33 xtraeme .bank = 0, 1015 1.33 xtraeme .reg = 0x25, 1016 1.33 xtraeme .refresh = wb_refresh_nvolt, 1017 1.33 xtraeme .rfact = RFACT(232, 56) 1018 1.33 xtraeme }, 1019 1.33 xtraeme { 1020 1.33 xtraeme .desc = "-5V", 1021 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1022 1.33 xtraeme .bank = 0, 1023 1.33 xtraeme .reg = 0x26, 1024 1.33 xtraeme .refresh = wb_refresh_nvolt, 1025 1.33 xtraeme .rfact = RFACT(120, 56) 1026 1.33 xtraeme }, 1027 1.33 xtraeme { 1028 1.33 xtraeme .desc = "5VSB", 1029 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1030 1.33 xtraeme .bank = 5, 1031 1.33 xtraeme .reg = 0x50, 1032 1.33 xtraeme .refresh = lm_refresh_volt, 1033 1.33 xtraeme .rfact = RFACT(17, 33) 1034 1.33 xtraeme }, 1035 1.33 xtraeme { 1036 1.33 xtraeme .desc = "VBAT", 1037 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1038 1.33 xtraeme .bank = 5, 1039 1.33 xtraeme .reg = 0x51, 1040 1.33 xtraeme .refresh = lm_refresh_volt, 1041 1.33 xtraeme .rfact = RFACT_NONE 1042 1.33 xtraeme }, 1043 1.30 xtraeme 1044 1.30 xtraeme /* Temperature */ 1045 1.33 xtraeme { 1046 1.33 xtraeme .desc = "Temp0", 1047 1.33 xtraeme .type = ENVSYS_STEMP, 1048 1.33 xtraeme .bank = 0, 1049 1.33 xtraeme .reg = 0x27, 1050 1.33 xtraeme .refresh = lm_refresh_temp, 1051 1.33 xtraeme .rfact = 0 1052 1.33 xtraeme }, 1053 1.33 xtraeme { 1054 1.33 xtraeme .desc = "Temp1", 1055 1.33 xtraeme .type = ENVSYS_STEMP, 1056 1.33 xtraeme .bank = 1, 1057 1.33 xtraeme .reg = 0x50, 1058 1.33 xtraeme .refresh = wb_refresh_temp, 1059 1.33 xtraeme .rfact = 0 1060 1.33 xtraeme }, 1061 1.33 xtraeme { 1062 1.33 xtraeme .desc = "Temp2", 1063 1.33 xtraeme .type = ENVSYS_STEMP, 1064 1.33 xtraeme .bank = 2, 1065 1.33 xtraeme .reg = 0x50, 1066 1.33 xtraeme .refresh = wb_refresh_temp, 1067 1.33 xtraeme .rfact = 0 1068 1.33 xtraeme }, 1069 1.30 xtraeme 1070 1.30 xtraeme /* Fans */ 1071 1.33 xtraeme { 1072 1.33 xtraeme .desc = "Fan0", 1073 1.33 xtraeme .type = ENVSYS_SFANRPM, 1074 1.33 xtraeme .bank = 0, 1075 1.33 xtraeme .reg = 0x28, 1076 1.33 xtraeme .refresh = wb_refresh_fanrpm, 1077 1.33 xtraeme .rfact = 0 1078 1.33 xtraeme }, 1079 1.33 xtraeme { 1080 1.33 xtraeme .desc = "Fan1", 1081 1.33 xtraeme .type = ENVSYS_SFANRPM, 1082 1.33 xtraeme .bank = 0, 1083 1.33 xtraeme .reg = 0x29, 1084 1.33 xtraeme .refresh = wb_refresh_fanrpm, 1085 1.33 xtraeme .rfact = 0 1086 1.33 xtraeme }, 1087 1.33 xtraeme { 1088 1.33 xtraeme .desc = "Fan2", 1089 1.33 xtraeme .type = ENVSYS_SFANRPM, 1090 1.33 xtraeme .bank = 0, 1091 1.33 xtraeme .reg = 0x2a, 1092 1.33 xtraeme .refresh = wb_refresh_fanrpm, 1093 1.33 xtraeme .rfact = 0 1094 1.33 xtraeme }, 1095 1.30 xtraeme 1096 1.32 christos { .desc = NULL } 1097 1.30 xtraeme }; 1098 1.30 xtraeme 1099 1.33 xtraeme /* W83783S */ 1100 1.68 msaitoh static const struct lm_sensor w83783s_sensors[] = { 1101 1.30 xtraeme /* Voltage */ 1102 1.33 xtraeme { 1103 1.33 xtraeme .desc = "VCore", 1104 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1105 1.33 xtraeme .bank = 0, 1106 1.33 xtraeme .reg = 0x20, 1107 1.33 xtraeme .refresh = lm_refresh_volt, 1108 1.33 xtraeme .rfact = RFACT_NONE 1109 1.33 xtraeme }, 1110 1.33 xtraeme { 1111 1.33 xtraeme .desc = "+3.3V", 1112 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1113 1.33 xtraeme .bank = 0, 1114 1.33 xtraeme .reg = 0x22, 1115 1.33 xtraeme .refresh = lm_refresh_volt, 1116 1.33 xtraeme .rfact = RFACT_NONE 1117 1.33 xtraeme }, 1118 1.33 xtraeme { 1119 1.33 xtraeme .desc = "+5V", 1120 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1121 1.33 xtraeme .bank = 0, 1122 1.33 xtraeme .reg = 0x23, 1123 1.33 xtraeme .refresh = lm_refresh_volt, 1124 1.33 xtraeme .rfact = RFACT(34, 50) 1125 1.33 xtraeme }, 1126 1.33 xtraeme { 1127 1.33 xtraeme .desc = "+12V", 1128 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1129 1.33 xtraeme .bank = 0, 1130 1.33 xtraeme .reg = 0x24, 1131 1.33 xtraeme .refresh = lm_refresh_volt, 1132 1.33 xtraeme .rfact = RFACT(28, 10) 1133 1.33 xtraeme }, 1134 1.33 xtraeme { 1135 1.33 xtraeme .desc = "-12V", 1136 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1137 1.33 xtraeme .bank = 0, 1138 1.33 xtraeme .reg = 0x25, 1139 1.33 xtraeme .refresh = wb_refresh_nvolt, 1140 1.33 xtraeme .rfact = RFACT(232, 56) 1141 1.33 xtraeme }, 1142 1.33 xtraeme { 1143 1.33 xtraeme .desc = "-5V", 1144 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1145 1.33 xtraeme .bank = 0, 1146 1.33 xtraeme .reg = 0x26, 1147 1.33 xtraeme .refresh = wb_refresh_nvolt, 1148 1.33 xtraeme .rfact = RFACT(120, 56) 1149 1.33 xtraeme }, 1150 1.30 xtraeme 1151 1.30 xtraeme /* Temperature */ 1152 1.33 xtraeme { 1153 1.33 xtraeme .desc = "Temp0", 1154 1.33 xtraeme .type = ENVSYS_STEMP, 1155 1.33 xtraeme .bank = 0, 1156 1.33 xtraeme .reg = 0x27, 1157 1.33 xtraeme .refresh = lm_refresh_temp, 1158 1.33 xtraeme .rfact = 0 1159 1.33 xtraeme }, 1160 1.33 xtraeme { 1161 1.33 xtraeme .desc = "Temp1", 1162 1.33 xtraeme .type = ENVSYS_STEMP, 1163 1.33 xtraeme .bank = 1, 1164 1.33 xtraeme .reg = 0x50, 1165 1.33 xtraeme .refresh = wb_refresh_temp, 1166 1.33 xtraeme .rfact = 0 1167 1.33 xtraeme }, 1168 1.30 xtraeme 1169 1.30 xtraeme /* Fans */ 1170 1.33 xtraeme { 1171 1.33 xtraeme .desc = "Fan0", 1172 1.33 xtraeme .type = ENVSYS_SFANRPM, 1173 1.33 xtraeme .bank = 0, 1174 1.33 xtraeme .reg = 0x28, 1175 1.33 xtraeme .refresh = wb_refresh_fanrpm, 1176 1.33 xtraeme .rfact = 0 1177 1.33 xtraeme }, 1178 1.33 xtraeme { 1179 1.33 xtraeme .desc = "Fan1", 1180 1.33 xtraeme .type = ENVSYS_SFANRPM, 1181 1.33 xtraeme .bank = 0, 1182 1.33 xtraeme .reg = 0x29, 1183 1.33 xtraeme .refresh = wb_refresh_fanrpm, 1184 1.33 xtraeme .rfact = 0 1185 1.33 xtraeme }, 1186 1.33 xtraeme { 1187 1.33 xtraeme .desc = "Fan2", 1188 1.33 xtraeme .type = ENVSYS_SFANRPM, 1189 1.33 xtraeme .bank = 0, 1190 1.33 xtraeme .reg = 0x2a, 1191 1.33 xtraeme .refresh = wb_refresh_fanrpm, 1192 1.33 xtraeme .rfact = 0 1193 1.33 xtraeme }, 1194 1.30 xtraeme 1195 1.32 christos { .desc = NULL } 1196 1.30 xtraeme }; 1197 1.30 xtraeme 1198 1.33 xtraeme /* W83791D */ 1199 1.68 msaitoh static const struct lm_sensor w83791d_sensors[] = { 1200 1.30 xtraeme /* Voltage */ 1201 1.33 xtraeme { 1202 1.33 xtraeme .desc = "VCore", 1203 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1204 1.33 xtraeme .bank = 0, 1205 1.33 xtraeme .reg = 0x20, 1206 1.33 xtraeme .refresh = lm_refresh_volt, 1207 1.33 xtraeme .rfact = 10000 1208 1.33 xtraeme }, 1209 1.33 xtraeme { 1210 1.33 xtraeme .desc = "VINR0", 1211 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1212 1.33 xtraeme .bank = 0, 1213 1.33 xtraeme .reg = 0x21, 1214 1.33 xtraeme .refresh = lm_refresh_volt, 1215 1.33 xtraeme .rfact = 10000 1216 1.33 xtraeme }, 1217 1.33 xtraeme { 1218 1.33 xtraeme .desc = "+3.3V", 1219 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1220 1.33 xtraeme .bank = 0, 1221 1.33 xtraeme .reg = 0x22, 1222 1.33 xtraeme .refresh = lm_refresh_volt, 1223 1.33 xtraeme .rfact = 10000 1224 1.33 xtraeme }, 1225 1.33 xtraeme { 1226 1.33 xtraeme .desc = "+5V", 1227 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1228 1.33 xtraeme .bank = 0, 1229 1.33 xtraeme .reg = 0x23, 1230 1.33 xtraeme .refresh = lm_refresh_volt, 1231 1.33 xtraeme .rfact = RFACT(34, 50) 1232 1.33 xtraeme }, 1233 1.33 xtraeme { 1234 1.33 xtraeme .desc = "+12V", 1235 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1236 1.33 xtraeme .bank = 0, 1237 1.33 xtraeme .reg = 0x24, 1238 1.33 xtraeme .refresh = lm_refresh_volt, 1239 1.33 xtraeme .rfact = RFACT(28, 10) 1240 1.33 xtraeme }, 1241 1.33 xtraeme { 1242 1.33 xtraeme .desc = "-12V", 1243 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1244 1.33 xtraeme .bank = 0, 1245 1.33 xtraeme .reg = 0x25, 1246 1.33 xtraeme .refresh = wb_refresh_nvolt, 1247 1.33 xtraeme .rfact = RFACT(232, 56) 1248 1.33 xtraeme }, 1249 1.33 xtraeme { 1250 1.33 xtraeme .desc = "-5V", 1251 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1252 1.33 xtraeme .bank = 0, 1253 1.33 xtraeme .reg = 0x26, 1254 1.33 xtraeme .refresh = wb_refresh_nvolt, 1255 1.33 xtraeme .rfact = RFACT(120, 56) 1256 1.33 xtraeme }, 1257 1.33 xtraeme { 1258 1.33 xtraeme .desc = "5VSB", 1259 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1260 1.33 xtraeme .bank = 0, 1261 1.33 xtraeme .reg = 0xb0, 1262 1.33 xtraeme .refresh = lm_refresh_volt, 1263 1.33 xtraeme .rfact = RFACT(17, 33) 1264 1.33 xtraeme }, 1265 1.33 xtraeme { 1266 1.33 xtraeme .desc = "VBAT", 1267 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1268 1.33 xtraeme .bank = 0, 1269 1.33 xtraeme .reg = 0xb1, 1270 1.33 xtraeme .refresh = lm_refresh_volt, 1271 1.33 xtraeme .rfact = RFACT_NONE 1272 1.33 xtraeme }, 1273 1.33 xtraeme { 1274 1.33 xtraeme .desc = "VINR1", 1275 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1276 1.33 xtraeme .bank = 0, 1277 1.33 xtraeme .reg = 0xb2, 1278 1.33 xtraeme .refresh = lm_refresh_volt, 1279 1.33 xtraeme .rfact = RFACT_NONE 1280 1.33 xtraeme }, 1281 1.30 xtraeme 1282 1.30 xtraeme /* Temperature */ 1283 1.33 xtraeme { 1284 1.33 xtraeme .desc = "Temp0", 1285 1.33 xtraeme .type = ENVSYS_STEMP, 1286 1.33 xtraeme .bank = 0, 1287 1.33 xtraeme .reg = 0x27, 1288 1.33 xtraeme .refresh = lm_refresh_temp, 1289 1.33 xtraeme .rfact = 0 1290 1.33 xtraeme }, 1291 1.33 xtraeme { 1292 1.33 xtraeme .desc = "Temp1", 1293 1.33 xtraeme .type = ENVSYS_STEMP, 1294 1.33 xtraeme .bank = 0, 1295 1.33 xtraeme .reg = 0xc0, 1296 1.33 xtraeme .refresh = wb_refresh_temp, 1297 1.33 xtraeme .rfact = 0 1298 1.33 xtraeme }, 1299 1.33 xtraeme { 1300 1.33 xtraeme .desc = "Temp2", 1301 1.33 xtraeme .type = ENVSYS_STEMP, 1302 1.33 xtraeme .bank = 0, 1303 1.33 xtraeme .reg = 0xc8, 1304 1.33 xtraeme .refresh = wb_refresh_temp, 1305 1.33 xtraeme .rfact = 0 1306 1.33 xtraeme }, 1307 1.30 xtraeme 1308 1.30 xtraeme /* Fans */ 1309 1.33 xtraeme { 1310 1.33 xtraeme .desc = "Fan0", 1311 1.33 xtraeme .type = ENVSYS_SFANRPM, 1312 1.33 xtraeme .bank = 0, 1313 1.33 xtraeme .reg = 0x28, 1314 1.33 xtraeme .refresh = wb_refresh_fanrpm, 1315 1.33 xtraeme .rfact = 0 1316 1.33 xtraeme }, 1317 1.33 xtraeme { 1318 1.33 xtraeme .desc = "Fan1", 1319 1.33 xtraeme .type = ENVSYS_SFANRPM, 1320 1.33 xtraeme .bank = 0, 1321 1.33 xtraeme .reg = 0x29, 1322 1.33 xtraeme .refresh = wb_refresh_fanrpm, 1323 1.33 xtraeme .rfact = 0 1324 1.33 xtraeme }, 1325 1.33 xtraeme { 1326 1.33 xtraeme .desc = "Fan2", 1327 1.33 xtraeme .type = ENVSYS_SFANRPM, 1328 1.33 xtraeme .bank = 0, 1329 1.33 xtraeme .reg = 0x2a, 1330 1.33 xtraeme .refresh = wb_refresh_fanrpm, 1331 1.33 xtraeme .rfact = 0 1332 1.33 xtraeme }, 1333 1.33 xtraeme { 1334 1.33 xtraeme .desc = "Fan3", 1335 1.33 xtraeme .type = ENVSYS_SFANRPM, 1336 1.33 xtraeme .bank = 0, 1337 1.33 xtraeme .reg = 0xba, 1338 1.33 xtraeme .refresh = wb_refresh_fanrpm, 1339 1.33 xtraeme .rfact = 0 1340 1.33 xtraeme }, 1341 1.33 xtraeme { 1342 1.33 xtraeme .desc = "Fan4", 1343 1.33 xtraeme .type = ENVSYS_SFANRPM, 1344 1.33 xtraeme .bank = 0, 1345 1.33 xtraeme .reg = 0xbb, 1346 1.33 xtraeme .refresh = wb_refresh_fanrpm, 1347 1.33 xtraeme .rfact = 0 1348 1.33 xtraeme }, 1349 1.30 xtraeme 1350 1.32 christos { .desc = NULL } 1351 1.30 xtraeme }; 1352 1.30 xtraeme 1353 1.33 xtraeme /* W83792D */ 1354 1.68 msaitoh static const struct lm_sensor w83792d_sensors[] = { 1355 1.30 xtraeme /* Voltage */ 1356 1.33 xtraeme { 1357 1.33 xtraeme .desc = "VCore A", 1358 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1359 1.33 xtraeme .bank = 0, 1360 1.33 xtraeme .reg = 0x20, 1361 1.33 xtraeme .refresh = lm_refresh_volt, 1362 1.33 xtraeme .rfact = RFACT_NONE 1363 1.33 xtraeme }, 1364 1.33 xtraeme { 1365 1.33 xtraeme .desc = "VCore B", 1366 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1367 1.33 xtraeme .bank = 0, 1368 1.33 xtraeme .reg = 0x21, 1369 1.33 xtraeme .refresh = lm_refresh_volt, 1370 1.33 xtraeme .rfact = RFACT_NONE 1371 1.33 xtraeme }, 1372 1.33 xtraeme { 1373 1.33 xtraeme .desc = "+3.3V", 1374 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1375 1.33 xtraeme .bank = 0, 1376 1.33 xtraeme .reg = 0x22, 1377 1.33 xtraeme .refresh = lm_refresh_volt, 1378 1.33 xtraeme .rfact = RFACT_NONE 1379 1.33 xtraeme }, 1380 1.33 xtraeme { 1381 1.33 xtraeme .desc = "-5V", 1382 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1383 1.33 xtraeme .bank = 0, 1384 1.33 xtraeme .reg = 0x23, 1385 1.33 xtraeme .refresh = wb_refresh_nvolt, 1386 1.33 xtraeme .rfact = RFACT(120, 56) 1387 1.33 xtraeme }, 1388 1.33 xtraeme { 1389 1.33 xtraeme .desc = "+12V", 1390 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1391 1.33 xtraeme .bank = 0, 1392 1.33 xtraeme .reg = 0x24, 1393 1.33 xtraeme .refresh = lm_refresh_volt, 1394 1.33 xtraeme .rfact = RFACT(28, 10) 1395 1.33 xtraeme }, 1396 1.33 xtraeme { 1397 1.33 xtraeme .desc = "-12V", 1398 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1399 1.33 xtraeme .bank = 0, 1400 1.33 xtraeme .reg = 0x25, 1401 1.33 xtraeme .refresh = wb_refresh_nvolt, 1402 1.33 xtraeme .rfact = RFACT(232, 56) 1403 1.33 xtraeme }, 1404 1.33 xtraeme { 1405 1.33 xtraeme .desc = "+5V", 1406 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1407 1.33 xtraeme .bank = 0, 1408 1.33 xtraeme .reg = 0x26, 1409 1.33 xtraeme .refresh = lm_refresh_volt, 1410 1.33 xtraeme .rfact = RFACT(34, 50) 1411 1.33 xtraeme }, 1412 1.33 xtraeme { 1413 1.33 xtraeme .desc = "5VSB", 1414 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1415 1.33 xtraeme .bank = 0, 1416 1.33 xtraeme .reg = 0xb0, 1417 1.33 xtraeme .refresh = lm_refresh_volt, 1418 1.33 xtraeme .rfact = RFACT(17, 33) 1419 1.33 xtraeme }, 1420 1.33 xtraeme { 1421 1.33 xtraeme .desc = "VBAT", 1422 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1423 1.33 xtraeme .bank = 0, 1424 1.33 xtraeme .reg = 0xb1, 1425 1.33 xtraeme .refresh = lm_refresh_volt, 1426 1.33 xtraeme .rfact = RFACT_NONE 1427 1.33 xtraeme }, 1428 1.30 xtraeme 1429 1.30 xtraeme /* Temperature */ 1430 1.33 xtraeme { 1431 1.33 xtraeme .desc = "Temp0", 1432 1.33 xtraeme .type = ENVSYS_STEMP, 1433 1.33 xtraeme .bank = 0, 1434 1.33 xtraeme .reg = 0x27, 1435 1.33 xtraeme .refresh = lm_refresh_temp, 1436 1.33 xtraeme .rfact = 0 1437 1.33 xtraeme }, 1438 1.33 xtraeme { 1439 1.33 xtraeme .desc = "Temp1", 1440 1.33 xtraeme .type = ENVSYS_STEMP, 1441 1.33 xtraeme .bank = 0, 1442 1.33 xtraeme .reg = 0xc0, 1443 1.33 xtraeme .refresh = wb_refresh_temp, 1444 1.33 xtraeme .rfact = 0 1445 1.33 xtraeme }, 1446 1.33 xtraeme { 1447 1.33 xtraeme .desc = "Temp2", 1448 1.33 xtraeme .type = ENVSYS_STEMP, 1449 1.33 xtraeme .bank = 0, 1450 1.33 xtraeme .reg = 0xc8, 1451 1.33 xtraeme .refresh = wb_refresh_temp, 1452 1.33 xtraeme .rfact = 0 1453 1.33 xtraeme }, 1454 1.30 xtraeme 1455 1.30 xtraeme /* Fans */ 1456 1.33 xtraeme { 1457 1.33 xtraeme .desc = "Fan0", 1458 1.33 xtraeme .type = ENVSYS_SFANRPM, 1459 1.33 xtraeme .bank = 0, 1460 1.33 xtraeme .reg = 0x28, 1461 1.33 xtraeme .refresh = wb_w83792d_refresh_fanrpm, 1462 1.33 xtraeme .rfact = 0 1463 1.33 xtraeme }, 1464 1.33 xtraeme { 1465 1.33 xtraeme .desc = "Fan1", 1466 1.33 xtraeme .type = ENVSYS_SFANRPM, 1467 1.33 xtraeme .bank = 0, 1468 1.33 xtraeme .reg = 0x29, 1469 1.33 xtraeme .refresh = wb_w83792d_refresh_fanrpm, 1470 1.33 xtraeme .rfact = 0 1471 1.33 xtraeme }, 1472 1.33 xtraeme { 1473 1.33 xtraeme .desc = "Fan2", 1474 1.33 xtraeme .type = ENVSYS_SFANRPM, 1475 1.33 xtraeme .bank = 0, 1476 1.33 xtraeme .reg = 0x2a, 1477 1.33 xtraeme .refresh = wb_w83792d_refresh_fanrpm, 1478 1.33 xtraeme .rfact = 0 1479 1.33 xtraeme }, 1480 1.33 xtraeme { 1481 1.33 xtraeme .desc = "Fan3", 1482 1.33 xtraeme .type = ENVSYS_SFANRPM, 1483 1.33 xtraeme .bank = 0, 1484 1.33 xtraeme .reg = 0xb8, 1485 1.33 xtraeme .refresh = wb_w83792d_refresh_fanrpm, 1486 1.33 xtraeme .rfact = 0 1487 1.33 xtraeme }, 1488 1.33 xtraeme { 1489 1.33 xtraeme .desc = "Fan4", 1490 1.33 xtraeme .type = ENVSYS_SFANRPM, 1491 1.33 xtraeme .bank = 0, 1492 1.33 xtraeme .reg = 0xb9, 1493 1.33 xtraeme .refresh = wb_w83792d_refresh_fanrpm, 1494 1.33 xtraeme .rfact = 0 1495 1.33 xtraeme }, 1496 1.33 xtraeme { 1497 1.33 xtraeme .desc = "Fan5", 1498 1.33 xtraeme .type = ENVSYS_SFANRPM, 1499 1.33 xtraeme .bank = 0, 1500 1.33 xtraeme .reg = 0xba, 1501 1.33 xtraeme .refresh = wb_w83792d_refresh_fanrpm, 1502 1.33 xtraeme .rfact = 0 1503 1.33 xtraeme }, 1504 1.33 xtraeme { 1505 1.33 xtraeme .desc = "Fan6", 1506 1.33 xtraeme .type = ENVSYS_SFANRPM, 1507 1.33 xtraeme .bank = 0, 1508 1.33 xtraeme .reg = 0xbe, 1509 1.33 xtraeme .refresh = wb_w83792d_refresh_fanrpm, 1510 1.33 xtraeme .rfact = 0 1511 1.33 xtraeme }, 1512 1.30 xtraeme 1513 1.32 christos { .desc = NULL } 1514 1.30 xtraeme }; 1515 1.1 groo 1516 1.33 xtraeme /* AS99127F */ 1517 1.68 msaitoh static const struct lm_sensor as99127f_sensors[] = { 1518 1.30 xtraeme /* Voltage */ 1519 1.33 xtraeme { 1520 1.33 xtraeme .desc = "VCore A", 1521 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1522 1.33 xtraeme .bank = 0, 1523 1.33 xtraeme .reg = 0x20, 1524 1.33 xtraeme .refresh = lm_refresh_volt, 1525 1.33 xtraeme .rfact = RFACT_NONE 1526 1.33 xtraeme }, 1527 1.33 xtraeme { 1528 1.33 xtraeme .desc = "VCore B", 1529 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1530 1.33 xtraeme .bank = 0, 1531 1.33 xtraeme .reg = 0x21, 1532 1.33 xtraeme .refresh = lm_refresh_volt, 1533 1.33 xtraeme .rfact = RFACT_NONE 1534 1.33 xtraeme }, 1535 1.33 xtraeme { 1536 1.33 xtraeme .desc = "+3.3V", 1537 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1538 1.33 xtraeme .bank = 0, 1539 1.33 xtraeme .reg = 0x22, 1540 1.33 xtraeme .refresh = lm_refresh_volt, 1541 1.33 xtraeme .rfact = RFACT_NONE 1542 1.33 xtraeme }, 1543 1.33 xtraeme { 1544 1.33 xtraeme .desc = "+5V", 1545 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1546 1.33 xtraeme .bank = 0, 1547 1.33 xtraeme .reg = 0x23, 1548 1.33 xtraeme .refresh = lm_refresh_volt, 1549 1.33 xtraeme .rfact = RFACT(34, 50) 1550 1.33 xtraeme }, 1551 1.33 xtraeme { 1552 1.33 xtraeme .desc = "+12V", 1553 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1554 1.33 xtraeme .bank = 0, 1555 1.33 xtraeme .reg = 0x24, 1556 1.33 xtraeme .refresh = lm_refresh_volt, 1557 1.33 xtraeme .rfact = RFACT(28, 10) 1558 1.33 xtraeme }, 1559 1.33 xtraeme { 1560 1.33 xtraeme .desc = "-12V", 1561 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1562 1.33 xtraeme .bank = 0, 1563 1.33 xtraeme .reg = 0x25, 1564 1.33 xtraeme .refresh = wb_refresh_nvolt, 1565 1.33 xtraeme .rfact = RFACT(232, 56) 1566 1.33 xtraeme }, 1567 1.33 xtraeme { 1568 1.33 xtraeme .desc = "-5V", 1569 1.33 xtraeme .type = ENVSYS_SVOLTS_DC, 1570 1.33 xtraeme .bank = 0, 1571 1.33 xtraeme .reg = 0x26, 1572 1.33 xtraeme .refresh = wb_refresh_nvolt, 1573 1.33 xtraeme .rfact = RFACT(120, 56) 1574 1.33 xtraeme }, 1575 1.30 xtraeme 1576 1.30 xtraeme /* Temperature */ 1577 1.33 xtraeme { 1578 1.33 xtraeme .desc = "Temp0", 1579 1.33 xtraeme .type = ENVSYS_STEMP, 1580 1.33 xtraeme .bank = 0, 1581 1.33 xtraeme .reg = 0x27, 1582 1.33 xtraeme .refresh = lm_refresh_temp, 1583 1.33 xtraeme .rfact = 0 1584 1.33 xtraeme }, 1585 1.33 xtraeme { 1586 1.33 xtraeme .desc = "Temp1", 1587 1.33 xtraeme .type = ENVSYS_STEMP, 1588 1.33 xtraeme .bank = 1, 1589 1.33 xtraeme .reg = 0x50, 1590 1.33 xtraeme .refresh = as_refresh_temp, 1591 1.33 xtraeme .rfact = 0 1592 1.33 xtraeme }, 1593 1.33 xtraeme { 1594 1.33 xtraeme .desc = "Temp2", 1595 1.33 xtraeme .type = ENVSYS_STEMP, 1596 1.33 xtraeme .bank = 2, 1597 1.33 xtraeme .reg = 0x50, 1598 1.33 xtraeme .refresh = as_refresh_temp, 1599 1.33 xtraeme .rfact = 0 1600 1.33 xtraeme }, 1601 1.30 xtraeme 1602 1.30 xtraeme /* Fans */ 1603 1.33 xtraeme { 1604 1.33 xtraeme .desc = "Fan0", 1605 1.33 xtraeme .type = ENVSYS_SFANRPM, 1606 1.33 xtraeme .bank = 0, 1607 1.33 xtraeme .reg = 0x28, 1608 1.33 xtraeme .refresh = lm_refresh_fanrpm, 1609 1.33 xtraeme .rfact = 0 1610 1.33 xtraeme }, 1611 1.33 xtraeme { 1612 1.33 xtraeme .desc = "Fan1", 1613 1.33 xtraeme .type = ENVSYS_SFANRPM, 1614 1.33 xtraeme .bank = 0, 1615 1.33 xtraeme .reg = 0x29, 1616 1.33 xtraeme .refresh = lm_refresh_fanrpm, 1617 1.33 xtraeme .rfact = 0 1618 1.33 xtraeme }, 1619 1.33 xtraeme { 1620 1.33 xtraeme .desc = "Fan2", 1621 1.33 xtraeme .type = ENVSYS_SFANRPM, 1622 1.33 xtraeme .bank = 0, 1623 1.33 xtraeme .reg = 0x2a, 1624 1.33 xtraeme .refresh = lm_refresh_fanrpm, 1625 1.33 xtraeme .rfact = 0 1626 1.33 xtraeme }, 1627 1.30 xtraeme 1628 1.32 christos { .desc = NULL } 1629 1.30 xtraeme }; 1630 1.30 xtraeme 1631 1.65 msaitoh /* NCT6776F */ 1632 1.68 msaitoh static const struct lm_sensor nct6776f_sensors[] = { 1633 1.63 pgoyette /* Voltage */ 1634 1.63 pgoyette { 1635 1.63 pgoyette .desc = "VCore", 1636 1.63 pgoyette .type = ENVSYS_SVOLTS_DC, 1637 1.63 pgoyette .bank = 0, 1638 1.63 pgoyette .reg = 0x20, 1639 1.63 pgoyette .refresh = lm_refresh_volt, 1640 1.63 pgoyette .rfact = RFACT_NONE / 2 1641 1.63 pgoyette }, 1642 1.63 pgoyette { 1643 1.63 pgoyette .desc = "+12V", 1644 1.63 pgoyette .type = ENVSYS_SVOLTS_DC, 1645 1.63 pgoyette .bank = 0, 1646 1.63 pgoyette .reg = 0x21, 1647 1.63 pgoyette .refresh = lm_refresh_volt, 1648 1.63 pgoyette .rfact = RFACT(56, 10) / 2 1649 1.63 pgoyette }, 1650 1.63 pgoyette { 1651 1.63 pgoyette .desc = "AVCC", 1652 1.63 pgoyette .type = ENVSYS_SVOLTS_DC, 1653 1.63 pgoyette .bank = 0, 1654 1.63 pgoyette .reg = 0x22, 1655 1.63 pgoyette .refresh = lm_refresh_volt, 1656 1.63 pgoyette .rfact = RFACT(34, 34) / 2 1657 1.63 pgoyette }, 1658 1.63 pgoyette { 1659 1.63 pgoyette .desc = "+3.3V", 1660 1.63 pgoyette .type = ENVSYS_SVOLTS_DC, 1661 1.63 pgoyette .bank = 0, 1662 1.63 pgoyette .reg = 0x23, 1663 1.63 pgoyette .refresh = lm_refresh_volt, 1664 1.63 pgoyette .rfact = RFACT(34, 34) / 2 1665 1.63 pgoyette }, 1666 1.63 pgoyette { 1667 1.63 pgoyette .desc = "-12V", 1668 1.63 pgoyette .type = ENVSYS_SVOLTS_DC, 1669 1.63 pgoyette .bank = 0, 1670 1.63 pgoyette .reg = 0x24, 1671 1.63 pgoyette .refresh = wb_w83627ehf_refresh_nvolt, 1672 1.63 pgoyette .rfact = 0 1673 1.63 pgoyette }, 1674 1.63 pgoyette { 1675 1.63 pgoyette .desc = "+5V", 1676 1.63 pgoyette .type = ENVSYS_SVOLTS_DC, 1677 1.63 pgoyette .bank = 0, 1678 1.63 pgoyette .reg = 0x25, 1679 1.63 pgoyette .refresh = lm_refresh_volt, 1680 1.63 pgoyette .rfact = 16000 1681 1.63 pgoyette }, 1682 1.63 pgoyette { 1683 1.63 pgoyette .desc = "VIN3", 1684 1.63 pgoyette .type = ENVSYS_SVOLTS_DC, 1685 1.63 pgoyette .bank = 0, 1686 1.63 pgoyette .reg = 0x26, 1687 1.63 pgoyette .refresh = lm_refresh_volt, 1688 1.63 pgoyette .rfact = RFACT_NONE 1689 1.63 pgoyette }, 1690 1.63 pgoyette { 1691 1.63 pgoyette .desc = "+3.3VSB", 1692 1.63 pgoyette .type = ENVSYS_SVOLTS_DC, 1693 1.63 pgoyette .bank = 5, 1694 1.63 pgoyette .reg = 0x50, 1695 1.63 pgoyette .refresh = lm_refresh_volt, 1696 1.63 pgoyette .rfact = RFACT(34, 34) / 2 1697 1.63 pgoyette }, 1698 1.63 pgoyette { 1699 1.63 pgoyette .desc = "VBAT", 1700 1.63 pgoyette .type = ENVSYS_SVOLTS_DC, 1701 1.63 pgoyette .bank = 5, 1702 1.63 pgoyette .reg = 0x51, 1703 1.63 pgoyette .refresh = lm_refresh_volt, 1704 1.63 pgoyette .rfact = RFACT(34, 34) / 2 1705 1.63 pgoyette }, 1706 1.63 pgoyette 1707 1.63 pgoyette /* Temperature */ 1708 1.63 pgoyette { 1709 1.63 pgoyette .desc = "MB Temperature", 1710 1.63 pgoyette .type = ENVSYS_STEMP, 1711 1.63 pgoyette .bank = 0, 1712 1.63 pgoyette .reg = 0x27, 1713 1.63 pgoyette .refresh = lm_refresh_temp, 1714 1.63 pgoyette .rfact = 0 1715 1.63 pgoyette }, 1716 1.63 pgoyette { 1717 1.63 pgoyette .desc = "CPU Temperature", 1718 1.63 pgoyette .type = ENVSYS_STEMP, 1719 1.63 pgoyette .bank = 1, 1720 1.63 pgoyette .reg = 0x50, 1721 1.63 pgoyette .refresh = wb_refresh_temp, 1722 1.63 pgoyette .rfact = 0 1723 1.63 pgoyette }, 1724 1.63 pgoyette { 1725 1.63 pgoyette .desc = "Aux Temp", 1726 1.63 pgoyette .type = ENVSYS_STEMP, 1727 1.63 pgoyette .bank = 2, 1728 1.63 pgoyette .reg = 0x50, 1729 1.63 pgoyette .refresh = wb_refresh_temp, 1730 1.63 pgoyette .rfact = 0 1731 1.63 pgoyette }, 1732 1.63 pgoyette 1733 1.63 pgoyette /* Fans */ 1734 1.63 pgoyette { 1735 1.63 pgoyette .desc = "System Fan", 1736 1.63 pgoyette .type = ENVSYS_SFANRPM, 1737 1.63 pgoyette .bank = 6, 1738 1.63 pgoyette .reg = 0x56, 1739 1.63 pgoyette .refresh = wb_nct6776f_refresh_fanrpm, 1740 1.63 pgoyette .rfact = 0 1741 1.63 pgoyette }, 1742 1.63 pgoyette { 1743 1.63 pgoyette .desc = "CPU Fan", 1744 1.63 pgoyette .type = ENVSYS_SFANRPM, 1745 1.63 pgoyette .bank = 6, 1746 1.63 pgoyette .reg = 0x58, 1747 1.63 pgoyette .refresh = wb_nct6776f_refresh_fanrpm, 1748 1.63 pgoyette .rfact = 0 1749 1.63 pgoyette }, 1750 1.63 pgoyette { 1751 1.63 pgoyette .desc = "Aux Fan0", 1752 1.63 pgoyette .type = ENVSYS_SFANRPM, 1753 1.63 pgoyette .bank = 6, 1754 1.63 pgoyette .reg = 0x5a, 1755 1.63 pgoyette .refresh = wb_nct6776f_refresh_fanrpm, 1756 1.63 pgoyette .rfact = 0 1757 1.63 pgoyette }, 1758 1.63 pgoyette { 1759 1.63 pgoyette .desc = "Aux Fan1", 1760 1.63 pgoyette .type = ENVSYS_SFANRPM, 1761 1.63 pgoyette .bank = 6, 1762 1.63 pgoyette .reg = 0x5c, 1763 1.63 pgoyette .refresh = wb_nct6776f_refresh_fanrpm, 1764 1.63 pgoyette .rfact = 0 1765 1.63 pgoyette }, 1766 1.63 pgoyette 1767 1.63 pgoyette { 1768 1.63 pgoyette .desc = "Aux Fan2", 1769 1.63 pgoyette .type = ENVSYS_SFANRPM, 1770 1.63 pgoyette .bank = 6, 1771 1.63 pgoyette .reg = 0x5e, 1772 1.63 pgoyette .refresh = wb_nct6776f_refresh_fanrpm, 1773 1.63 pgoyette .rfact = 0 1774 1.63 pgoyette }, 1775 1.63 pgoyette 1776 1.63 pgoyette { .desc = NULL } 1777 1.63 pgoyette }; 1778 1.63 pgoyette 1779 1.70 msaitoh /* NCT610[246]D */ 1780 1.70 msaitoh static const struct lm_sensor nct6102d_sensors[] = { 1781 1.70 msaitoh /* Voltage */ 1782 1.70 msaitoh { 1783 1.70 msaitoh .desc = "VCore", 1784 1.70 msaitoh .type = ENVSYS_SVOLTS_DC, 1785 1.70 msaitoh .bank = 0, 1786 1.70 msaitoh .reg = 0x00, 1787 1.70 msaitoh .refresh = lm_refresh_volt, 1788 1.70 msaitoh .rfact = RFACT_NONE 1789 1.70 msaitoh }, 1790 1.70 msaitoh { 1791 1.70 msaitoh .desc = "VIN0", 1792 1.70 msaitoh .type = ENVSYS_SVOLTS_DC, 1793 1.70 msaitoh .bank = 0, 1794 1.70 msaitoh .reg = 0x01, 1795 1.70 msaitoh .refresh = lm_refresh_volt, 1796 1.70 msaitoh .rfact = RFACT_NONE 1797 1.70 msaitoh }, 1798 1.70 msaitoh { 1799 1.70 msaitoh .desc = "AVCC", 1800 1.70 msaitoh .type = ENVSYS_SVOLTS_DC, 1801 1.70 msaitoh .bank = 0, 1802 1.70 msaitoh .reg = 0x02, 1803 1.70 msaitoh .refresh = lm_refresh_volt, 1804 1.70 msaitoh .rfact = RFACT(34, 34) / 2 1805 1.70 msaitoh }, 1806 1.70 msaitoh { 1807 1.70 msaitoh .desc = "3VCC", 1808 1.70 msaitoh .type = ENVSYS_SVOLTS_DC, 1809 1.70 msaitoh .bank = 0, 1810 1.70 msaitoh .reg = 0x03, 1811 1.70 msaitoh .refresh = lm_refresh_volt, 1812 1.70 msaitoh .rfact = RFACT(34, 34) / 2 1813 1.70 msaitoh }, 1814 1.70 msaitoh { 1815 1.70 msaitoh .desc = "VIN1", 1816 1.70 msaitoh .type = ENVSYS_SVOLTS_DC, 1817 1.70 msaitoh .bank = 0, 1818 1.70 msaitoh .reg = 0x04, 1819 1.70 msaitoh .refresh = lm_refresh_volt, 1820 1.70 msaitoh .rfact = RFACT_NONE 1821 1.70 msaitoh }, 1822 1.70 msaitoh { 1823 1.70 msaitoh .desc = "VIN2", 1824 1.70 msaitoh .type = ENVSYS_SVOLTS_DC, 1825 1.70 msaitoh .bank = 0, 1826 1.70 msaitoh .reg = 0x05, 1827 1.70 msaitoh .refresh = lm_refresh_volt, 1828 1.70 msaitoh .rfact = RFACT(34, 34) / 2 1829 1.70 msaitoh }, 1830 1.70 msaitoh { 1831 1.70 msaitoh .desc = "+3.3VSB", 1832 1.70 msaitoh .type = ENVSYS_SVOLTS_DC, 1833 1.70 msaitoh .bank = 0, 1834 1.70 msaitoh .reg = 0x07, 1835 1.70 msaitoh .refresh = lm_refresh_volt, 1836 1.70 msaitoh .rfact = RFACT(34, 34) / 2 1837 1.70 msaitoh }, 1838 1.70 msaitoh { 1839 1.70 msaitoh .desc = "VBAT", 1840 1.70 msaitoh .type = ENVSYS_SVOLTS_DC, 1841 1.70 msaitoh .bank = 0, 1842 1.70 msaitoh .reg = 0x08, 1843 1.70 msaitoh .refresh = lm_refresh_volt, 1844 1.70 msaitoh .rfact = RFACT(34, 34) / 2 1845 1.70 msaitoh }, 1846 1.70 msaitoh { 1847 1.70 msaitoh .desc = "VTT", 1848 1.70 msaitoh .type = ENVSYS_SVOLTS_DC, 1849 1.70 msaitoh .bank = 0, 1850 1.70 msaitoh .reg = 0x09, 1851 1.70 msaitoh .refresh = lm_refresh_volt, 1852 1.70 msaitoh .rfact = RFACT_NONE 1853 1.70 msaitoh }, 1854 1.70 msaitoh 1855 1.70 msaitoh /* Temperature */ 1856 1.70 msaitoh { 1857 1.70 msaitoh .desc = "MB Temperature", 1858 1.70 msaitoh .type = ENVSYS_STEMP, 1859 1.70 msaitoh .bank = 0, 1860 1.70 msaitoh .reg = 0x18, 1861 1.70 msaitoh .refresh = lm_refresh_temp, 1862 1.70 msaitoh .rfact = 0 1863 1.70 msaitoh }, 1864 1.70 msaitoh { 1865 1.70 msaitoh .desc = "CPU Temperature", 1866 1.70 msaitoh .type = ENVSYS_STEMP, 1867 1.70 msaitoh .bank = 0, 1868 1.70 msaitoh .reg = 0x19, 1869 1.70 msaitoh .refresh = lm_refresh_temp, 1870 1.70 msaitoh .rfact = 0 1871 1.70 msaitoh }, 1872 1.70 msaitoh { 1873 1.70 msaitoh .desc = "Aux Temp", 1874 1.70 msaitoh .type = ENVSYS_STEMP, 1875 1.70 msaitoh .bank = 0, 1876 1.70 msaitoh .reg = 0x1a, 1877 1.70 msaitoh .refresh = lm_refresh_temp, 1878 1.70 msaitoh .rfact = 0 1879 1.70 msaitoh }, 1880 1.70 msaitoh 1881 1.70 msaitoh /* Fans */ 1882 1.70 msaitoh { 1883 1.70 msaitoh .desc = "System Fan", 1884 1.70 msaitoh .type = ENVSYS_SFANRPM, 1885 1.70 msaitoh .bank = 0, 1886 1.70 msaitoh .reg = 0x30, 1887 1.70 msaitoh .refresh = wb_nct6776f_refresh_fanrpm, 1888 1.70 msaitoh .rfact = 0 1889 1.70 msaitoh }, 1890 1.70 msaitoh { 1891 1.70 msaitoh .desc = "CPU Fan", 1892 1.70 msaitoh .type = ENVSYS_SFANRPM, 1893 1.70 msaitoh .bank = 0, 1894 1.70 msaitoh .reg = 0x32, 1895 1.70 msaitoh .refresh = wb_nct6776f_refresh_fanrpm, 1896 1.70 msaitoh .rfact = 0 1897 1.70 msaitoh }, 1898 1.70 msaitoh { 1899 1.70 msaitoh .desc = "Aux Fan", 1900 1.70 msaitoh .type = ENVSYS_SFANRPM, 1901 1.70 msaitoh .bank = 0, 1902 1.70 msaitoh .reg = 0x34, 1903 1.70 msaitoh .refresh = wb_nct6776f_refresh_fanrpm, 1904 1.70 msaitoh .rfact = 0 1905 1.70 msaitoh }, 1906 1.70 msaitoh 1907 1.70 msaitoh { .desc = NULL } 1908 1.70 msaitoh }; 1909 1.70 msaitoh 1910 1.65 msaitoh /* NCT6779D */ 1911 1.68 msaitoh static const struct lm_sensor nct6779d_sensors[] = { 1912 1.65 msaitoh /* Voltage */ 1913 1.65 msaitoh { 1914 1.65 msaitoh .desc = "VCore", 1915 1.65 msaitoh .type = ENVSYS_SVOLTS_DC, 1916 1.65 msaitoh .bank = 4, 1917 1.65 msaitoh .reg = 0x80, 1918 1.65 msaitoh .refresh = lm_refresh_volt, 1919 1.65 msaitoh .rfact = RFACT_NONE / 2 1920 1.65 msaitoh }, 1921 1.65 msaitoh { 1922 1.65 msaitoh .desc = "VIN1", 1923 1.65 msaitoh .type = ENVSYS_SVOLTS_DC, 1924 1.65 msaitoh .bank = 4, 1925 1.65 msaitoh .reg = 0x81, 1926 1.65 msaitoh .refresh = lm_refresh_volt, 1927 1.65 msaitoh .rfact = RFACT(56, 10) / 2 1928 1.65 msaitoh }, 1929 1.65 msaitoh { 1930 1.65 msaitoh .desc = "AVCC", 1931 1.65 msaitoh .type = ENVSYS_SVOLTS_DC, 1932 1.65 msaitoh .bank = 4, 1933 1.65 msaitoh .reg = 0x82, 1934 1.65 msaitoh .refresh = lm_refresh_volt, 1935 1.65 msaitoh .rfact = RFACT(34, 34) / 2 1936 1.65 msaitoh }, 1937 1.65 msaitoh { 1938 1.65 msaitoh .desc = "+3.3V", 1939 1.65 msaitoh .type = ENVSYS_SVOLTS_DC, 1940 1.65 msaitoh .bank = 4, 1941 1.65 msaitoh .reg = 0x83, 1942 1.65 msaitoh .refresh = lm_refresh_volt, 1943 1.65 msaitoh .rfact = RFACT(34, 34) / 2 1944 1.65 msaitoh }, 1945 1.65 msaitoh { 1946 1.65 msaitoh .desc = "VIN0", 1947 1.65 msaitoh .type = ENVSYS_SVOLTS_DC, 1948 1.65 msaitoh .bank = 4, 1949 1.65 msaitoh .reg = 0x84, 1950 1.65 msaitoh .refresh = lm_refresh_volt, 1951 1.65 msaitoh .rfact = RFACT(48600, 10000) 1952 1.65 msaitoh }, 1953 1.65 msaitoh { 1954 1.65 msaitoh .desc = "VIN8", 1955 1.65 msaitoh .type = ENVSYS_SVOLTS_DC, 1956 1.65 msaitoh .bank = 4, 1957 1.65 msaitoh .reg = 0x85, 1958 1.65 msaitoh .refresh = lm_refresh_volt, 1959 1.65 msaitoh .rfact = RFACT_NONE / 2 1960 1.65 msaitoh }, 1961 1.65 msaitoh { 1962 1.65 msaitoh .desc = "VIN4", 1963 1.65 msaitoh .type = ENVSYS_SVOLTS_DC, 1964 1.65 msaitoh .bank = 4, 1965 1.65 msaitoh .reg = 0x86, 1966 1.65 msaitoh .refresh = lm_refresh_volt, 1967 1.65 msaitoh .rfact = RFACT_NONE 1968 1.65 msaitoh }, 1969 1.65 msaitoh { 1970 1.65 msaitoh .desc = "+3.3VSB", 1971 1.65 msaitoh .type = ENVSYS_SVOLTS_DC, 1972 1.65 msaitoh .bank = 4, 1973 1.65 msaitoh .reg = 0x87, 1974 1.65 msaitoh .refresh = lm_refresh_volt, 1975 1.65 msaitoh .rfact = RFACT(34, 34) / 2 1976 1.65 msaitoh }, 1977 1.65 msaitoh { 1978 1.65 msaitoh .desc = "VBAT", 1979 1.65 msaitoh .type = ENVSYS_SVOLTS_DC, 1980 1.65 msaitoh .bank = 4, 1981 1.65 msaitoh .reg = 0x88, 1982 1.65 msaitoh .refresh = lm_refresh_volt, 1983 1.65 msaitoh .rfact = RFACT_NONE 1984 1.65 msaitoh }, 1985 1.65 msaitoh { 1986 1.65 msaitoh .desc = "VTT", 1987 1.65 msaitoh .type = ENVSYS_SVOLTS_DC, 1988 1.65 msaitoh .bank = 4, 1989 1.65 msaitoh .reg = 0x89, 1990 1.65 msaitoh .refresh = lm_refresh_volt, 1991 1.65 msaitoh .rfact = RFACT_NONE 1992 1.65 msaitoh }, 1993 1.65 msaitoh { 1994 1.65 msaitoh .desc = "VIN5", 1995 1.65 msaitoh .type = ENVSYS_SVOLTS_DC, 1996 1.65 msaitoh .bank = 4, 1997 1.65 msaitoh .reg = 0x8a, 1998 1.65 msaitoh .refresh = lm_refresh_volt, 1999 1.65 msaitoh .rfact = RFACT_NONE 2000 1.65 msaitoh }, 2001 1.65 msaitoh { 2002 1.65 msaitoh .desc = "VIN6", 2003 1.65 msaitoh .type = ENVSYS_SVOLTS_DC, 2004 1.65 msaitoh .bank = 4, 2005 1.65 msaitoh .reg = 0x8b, 2006 1.65 msaitoh .refresh = lm_refresh_volt, 2007 1.65 msaitoh .rfact = RFACT_NONE 2008 1.65 msaitoh }, 2009 1.65 msaitoh { 2010 1.65 msaitoh .desc = "VIN2", 2011 1.65 msaitoh .type = ENVSYS_SVOLTS_DC, 2012 1.65 msaitoh .bank = 4, 2013 1.65 msaitoh .reg = 0x8c, 2014 1.65 msaitoh .refresh = lm_refresh_volt, 2015 1.65 msaitoh .rfact = RFACT_NONE 2016 1.65 msaitoh }, 2017 1.65 msaitoh { 2018 1.65 msaitoh .desc = "VIN3", 2019 1.65 msaitoh .type = ENVSYS_SVOLTS_DC, 2020 1.65 msaitoh .bank = 4, 2021 1.65 msaitoh .reg = 0x8d, 2022 1.65 msaitoh .refresh = lm_refresh_volt, 2023 1.65 msaitoh .rfact = RFACT(14414, 10000) 2024 1.65 msaitoh }, 2025 1.65 msaitoh { 2026 1.65 msaitoh .desc = "VIN7", 2027 1.65 msaitoh .type = ENVSYS_SVOLTS_DC, 2028 1.65 msaitoh .bank = 4, 2029 1.65 msaitoh .reg = 0x8e, 2030 1.65 msaitoh .refresh = lm_refresh_volt, 2031 1.65 msaitoh .rfact = RFACT_NONE / 2 2032 1.65 msaitoh }, 2033 1.65 msaitoh 2034 1.65 msaitoh /* Temperature */ 2035 1.65 msaitoh { 2036 1.65 msaitoh .desc = "MB Temperature", 2037 1.65 msaitoh .type = ENVSYS_STEMP, 2038 1.65 msaitoh .bank = 4, 2039 1.65 msaitoh .reg = 0x90, 2040 1.65 msaitoh .refresh = lm_refresh_temp, 2041 1.65 msaitoh .rfact = 0 2042 1.65 msaitoh }, 2043 1.65 msaitoh { 2044 1.65 msaitoh .desc = "CPU Temperature", 2045 1.65 msaitoh .type = ENVSYS_STEMP, 2046 1.65 msaitoh .bank = 4, 2047 1.65 msaitoh .reg = 0x91, 2048 1.65 msaitoh .refresh = wb_refresh_temp, 2049 1.65 msaitoh .rfact = 0 2050 1.65 msaitoh }, 2051 1.65 msaitoh { 2052 1.65 msaitoh .desc = "Aux Temp0", 2053 1.65 msaitoh .type = ENVSYS_STEMP, 2054 1.65 msaitoh .bank = 4, 2055 1.65 msaitoh .reg = 0x92, 2056 1.65 msaitoh .refresh = wb_refresh_temp, 2057 1.65 msaitoh .rfact = 0 2058 1.65 msaitoh }, 2059 1.65 msaitoh { 2060 1.65 msaitoh .desc = "Aux Temp1", 2061 1.65 msaitoh .type = ENVSYS_STEMP, 2062 1.65 msaitoh .bank = 4, 2063 1.65 msaitoh .reg = 0x93, 2064 1.65 msaitoh .refresh = wb_refresh_temp, 2065 1.65 msaitoh .rfact = 0 2066 1.65 msaitoh }, 2067 1.65 msaitoh { 2068 1.65 msaitoh .desc = "Aux Temp2", 2069 1.65 msaitoh .type = ENVSYS_STEMP, 2070 1.65 msaitoh .bank = 4, 2071 1.65 msaitoh .reg = 0x94, 2072 1.65 msaitoh .refresh = wb_refresh_temp, 2073 1.65 msaitoh .rfact = 0 2074 1.65 msaitoh }, 2075 1.65 msaitoh { 2076 1.65 msaitoh .desc = "Aux Temp3", 2077 1.65 msaitoh .type = ENVSYS_STEMP, 2078 1.65 msaitoh .bank = 4, 2079 1.65 msaitoh .reg = 0x95, 2080 1.65 msaitoh .refresh = wb_refresh_temp, 2081 1.65 msaitoh .rfact = 0 2082 1.65 msaitoh }, 2083 1.65 msaitoh 2084 1.65 msaitoh /* Fans */ 2085 1.65 msaitoh { 2086 1.65 msaitoh .desc = "System Fan", 2087 1.65 msaitoh .type = ENVSYS_SFANRPM, 2088 1.65 msaitoh .bank = 4, 2089 1.66 msaitoh .reg = 0xc0, 2090 1.65 msaitoh .refresh = wb_nct6776f_refresh_fanrpm, 2091 1.65 msaitoh .rfact = 0 2092 1.65 msaitoh }, 2093 1.65 msaitoh { 2094 1.65 msaitoh .desc = "CPU Fan", 2095 1.65 msaitoh .type = ENVSYS_SFANRPM, 2096 1.65 msaitoh .bank = 4, 2097 1.66 msaitoh .reg = 0xc2, 2098 1.65 msaitoh .refresh = wb_nct6776f_refresh_fanrpm, 2099 1.65 msaitoh .rfact = 0 2100 1.65 msaitoh }, 2101 1.65 msaitoh { 2102 1.65 msaitoh .desc = "Aux Fan0", 2103 1.65 msaitoh .type = ENVSYS_SFANRPM, 2104 1.65 msaitoh .bank = 4, 2105 1.66 msaitoh .reg = 0xc4, 2106 1.65 msaitoh .refresh = wb_nct6776f_refresh_fanrpm, 2107 1.65 msaitoh .rfact = 0 2108 1.65 msaitoh }, 2109 1.65 msaitoh { 2110 1.65 msaitoh .desc = "Aux Fan1", 2111 1.65 msaitoh .type = ENVSYS_SFANRPM, 2112 1.65 msaitoh .bank = 4, 2113 1.66 msaitoh .reg = 0xc6, 2114 1.65 msaitoh .refresh = wb_nct6776f_refresh_fanrpm, 2115 1.65 msaitoh .rfact = 0 2116 1.65 msaitoh }, 2117 1.65 msaitoh { 2118 1.65 msaitoh .desc = "Aux Fan2", 2119 1.65 msaitoh .type = ENVSYS_SFANRPM, 2120 1.65 msaitoh .bank = 4, 2121 1.66 msaitoh .reg = 0xc8, 2122 1.65 msaitoh .refresh = wb_nct6776f_refresh_fanrpm, 2123 1.65 msaitoh .rfact = 0 2124 1.65 msaitoh }, 2125 1.65 msaitoh 2126 1.65 msaitoh { .desc = NULL } 2127 1.65 msaitoh }; 2128 1.65 msaitoh 2129 1.70 msaitoh static const struct wb_product wb_products[] = { 2130 1.70 msaitoh { WB_CHIPID_W83627HF, "W83627HF", w83627hf_sensors, NULL }, 2131 1.70 msaitoh { WB_CHIPID_W83627THF, "W83627THF",w83637hf_sensors, NULL }, 2132 1.70 msaitoh { WB_CHIPID_W83627EHF_A,"W83627EHF-A",w83627ehf_sensors,NULL }, 2133 1.70 msaitoh { WB_CHIPID_W83627EHF, "W83627EHF",w83627ehf_sensors,NULL }, 2134 1.70 msaitoh { WB_CHIPID_W83627DHG, NULL, NULL, NULL }, 2135 1.70 msaitoh { WB_CHIPID_W83637HF, "W83637HF", w83637hf_sensors, NULL }, 2136 1.70 msaitoh { WB_CHIPID_W83697HF, "W83697HF", w83697hf_sensors, NULL }, 2137 1.70 msaitoh { WB_CHIPID_W83781D, "W83781D", w83781d_sensors, NULL }, 2138 1.70 msaitoh { WB_CHIPID_W83781D_2, "W83781D", w83781d_sensors, NULL }, 2139 1.70 msaitoh { WB_CHIPID_W83782D, "W83782D", w83782d_sensors, NULL }, 2140 1.70 msaitoh { WB_CHIPID_W83783S, "W83783S", w83783s_sensors, NULL }, 2141 1.70 msaitoh { WB_CHIPID_W83791D, "W83791D", w83791d_sensors, NULL }, 2142 1.70 msaitoh { WB_CHIPID_W83791SD, "W83791SD", NULL, NULL }, 2143 1.70 msaitoh { WB_CHIPID_W83792D, "W83792D", w83792d_sensors, NULL }, 2144 1.70 msaitoh { WB_CHIPID_AS99127F, NULL, NULL, NULL }, 2145 1.70 msaitoh { 0, NULL, NULL, NULL } 2146 1.70 msaitoh }; 2147 1.70 msaitoh 2148 1.70 msaitoh static const struct wb_product wbsio_products[] = { 2149 1.70 msaitoh { WBSIO_ID_W83627DHG, "W83627DHG",w83627dhg_sensors,NULL }, 2150 1.70 msaitoh { WBSIO_ID_NCT6775F, "NCT6775F", nct6776f_sensors, NULL }, 2151 1.70 msaitoh { WBSIO_ID_NCT6776F, "NCT6776F", nct6776f_sensors, NULL }, 2152 1.70 msaitoh { WBSIO_ID_NCT5104D, "NCT5104D or 610[246]D",nct6102d_sensors,NULL }, 2153 1.70 msaitoh { WBSIO_ID_NCT6779D, "NCT6779D", nct6779d_sensors, NULL }, 2154 1.70 msaitoh { WBSIO_ID_NCT6791D, "NCT6791D", nct6779d_sensors, NULL }, 2155 1.70 msaitoh { WBSIO_ID_NCT6792D, "NCT6792D", nct6779d_sensors, NULL }, 2156 1.70 msaitoh { WBSIO_ID_NCT6793D, "NCT6793D", nct6779d_sensors, NULL }, 2157 1.70 msaitoh { WBSIO_ID_NCT6795D, "NCT6795D", nct6779d_sensors, NULL }, 2158 1.71 msaitoh { WBSIO_ID_NCT6796D, "NCT6796D", nct6779d_sensors, NULL }, 2159 1.79 msaitoh { WBSIO_ID_NCT6797D, "NCT6797D", nct6779d_sensors, NULL }, 2160 1.73 msaitoh { WBSIO_ID_NCT6798D, "NCT6798D", nct6779d_sensors, NULL }, 2161 1.78 msaitoh { WBSIO_ID_NCT6799D, "NCT6799D", nct6779d_sensors, NULL }, 2162 1.70 msaitoh { 0, NULL, NULL, NULL } 2163 1.70 msaitoh }; 2164 1.70 msaitoh 2165 1.70 msaitoh static const struct wb_product as99127f_products[] = { 2166 1.70 msaitoh { WB_VENDID_ASUS, "AS99127F", w83781d_sensors, NULL }, 2167 1.70 msaitoh { WB_VENDID_WINBOND, "AS99127F rev 2",as99127f_sensors,NULL }, 2168 1.70 msaitoh { 0, NULL, NULL, NULL } 2169 1.70 msaitoh }; 2170 1.70 msaitoh 2171 1.30 xtraeme static void 2172 1.69 msaitoh lm_generic_banksel(struct lm_softc *lmsc, uint8_t bank) 2173 1.1 groo { 2174 1.17 ad (*lmsc->lm_writereg)(lmsc, WB_BANKSEL, bank); 2175 1.1 groo } 2176 1.1 groo 2177 1.1 groo /* 2178 1.70 msaitoh * bus independent match 2179 1.48 pgoyette * 2180 1.48 pgoyette * prerequisites: lmsc contains valid lm_{read,write}reg() routines 2181 1.48 pgoyette * and associated bus access data is present in attachment's softc 2182 1.2 groo */ 2183 1.2 groo int 2184 1.70 msaitoh lm_match(struct lm_softc *lmsc) 2185 1.2 groo { 2186 1.30 xtraeme uint8_t cr; 2187 1.70 msaitoh int i, rv; 2188 1.2 groo 2189 1.2 groo /* Perform LM78 reset */ 2190 1.49 pgoyette /*(*lmsc->lm_writereg)(lmsc, LMD_CONFIG, 0x80); */ 2191 1.2 groo 2192 1.49 pgoyette cr = (*lmsc->lm_readreg)(lmsc, LMD_CONFIG); 2193 1.2 groo 2194 1.2 groo /* XXX - spec says *only* 0x08! */ 2195 1.70 msaitoh if ((cr != 0x08) && (cr != 0x01) && (cr != 0x03) && (cr != 0x06)) 2196 1.70 msaitoh return 0; 2197 1.70 msaitoh 2198 1.70 msaitoh DPRINTF(("%s: 0x80 check: cr = %x\n", __func__, cr)); 2199 1.2 groo 2200 1.70 msaitoh for (i = 0; i < __arraycount(lm_chips); i++) 2201 1.70 msaitoh if ((rv = lm_chips[i].chip_match(lmsc)) != 0) 2202 1.70 msaitoh return rv; 2203 1.2 groo 2204 1.70 msaitoh return 0; 2205 1.70 msaitoh } 2206 1.70 msaitoh 2207 1.70 msaitoh int 2208 1.70 msaitoh nslm_match(struct lm_softc *sc) 2209 1.70 msaitoh { 2210 1.70 msaitoh uint8_t chipid; 2211 1.70 msaitoh 2212 1.70 msaitoh /* See if we have an LM78/LM78J/LM79 or LM81 */ 2213 1.70 msaitoh chipid = (*sc->lm_readreg)(sc, LMD_CHIPID) & LM_ID_MASK; 2214 1.70 msaitoh switch(chipid) { 2215 1.70 msaitoh case LM_ID_LM78: 2216 1.70 msaitoh case LM_ID_LM78J: 2217 1.70 msaitoh case LM_ID_LM79: 2218 1.70 msaitoh case LM_ID_LM81: 2219 1.70 msaitoh break; 2220 1.70 msaitoh default: 2221 1.70 msaitoh return 0; 2222 1.70 msaitoh } 2223 1.70 msaitoh DPRINTF(("%s: chipid %x\n", __func__, chipid)); 2224 1.70 msaitoh return 1; 2225 1.2 groo } 2226 1.2 groo 2227 1.1 groo void 2228 1.30 xtraeme lm_attach(struct lm_softc *lmsc) 2229 1.1 groo { 2230 1.30 xtraeme uint32_t i; 2231 1.70 msaitoh int rv; 2232 1.1 groo 2233 1.70 msaitoh for (i = 0; i < __arraycount(lm_chips); i++) { 2234 1.70 msaitoh if (lm_chips[i].chip_match(lmsc) != 0) { 2235 1.70 msaitoh if (lm_chips[i].chip_attach(lmsc) == 0) 2236 1.70 msaitoh break; 2237 1.70 msaitoh else 2238 1.70 msaitoh return; 2239 1.70 msaitoh } 2240 1.70 msaitoh } 2241 1.1 groo 2242 1.1 groo /* Start the monitoring loop */ 2243 1.17 ad (*lmsc->lm_writereg)(lmsc, LMD_CONFIG, 0x01); 2244 1.1 groo 2245 1.44 xtraeme lmsc->sc_sme = sysmon_envsys_create(); 2246 1.1 groo /* Initialize sensors */ 2247 1.40 xtraeme for (i = 0; i < lmsc->numsensors; i++) { 2248 1.58 pgoyette lmsc->sensors[i].state = ENVSYS_SINVALID; 2249 1.70 msaitoh if ((rv = sysmon_envsys_sensor_attach(lmsc->sc_sme, 2250 1.70 msaitoh &lmsc->sensors[i])) != 0) { 2251 1.44 xtraeme sysmon_envsys_destroy(lmsc->sc_sme); 2252 1.77 mlelstv lmsc->sc_sme = NULL; 2253 1.70 msaitoh aprint_error_dev(lmsc->sc_dev, 2254 1.70 msaitoh "sysmon_envsys_sensor_attach() returned %d\n", rv); 2255 1.44 xtraeme return; 2256 1.44 xtraeme } 2257 1.1 groo } 2258 1.37 xtraeme 2259 1.4 thorpej /* 2260 1.42 xtraeme * Setup the callout to refresh sensor data every 2 seconds. 2261 1.40 xtraeme */ 2262 1.40 xtraeme callout_init(&lmsc->sc_callout, 0); 2263 1.40 xtraeme callout_setfunc(&lmsc->sc_callout, lm_refresh, lmsc); 2264 1.40 xtraeme callout_schedule(&lmsc->sc_callout, LM_REFRESH_TIMO); 2265 1.40 xtraeme 2266 1.40 xtraeme /* 2267 1.4 thorpej * Hook into the System Monitor. 2268 1.4 thorpej */ 2269 1.46 xtraeme lmsc->sc_sme->sme_name = device_xname(lmsc->sc_dev); 2270 1.44 xtraeme lmsc->sc_sme->sme_flags = SME_DISABLE_REFRESH; 2271 1.4 thorpej 2272 1.44 xtraeme if (sysmon_envsys_register(lmsc->sc_sme)) { 2273 1.46 xtraeme aprint_error_dev(lmsc->sc_dev, 2274 1.46 xtraeme "unable to register with sysmon\n"); 2275 1.44 xtraeme sysmon_envsys_destroy(lmsc->sc_sme); 2276 1.77 mlelstv lmsc->sc_sme = NULL; 2277 1.44 xtraeme } 2278 1.72 msaitoh if (!pmf_device_register(lmsc->sc_dev, NULL, NULL)) 2279 1.72 msaitoh aprint_error_dev(lmsc->sc_dev, 2280 1.72 msaitoh "couldn't establish power handler\n"); 2281 1.1 groo } 2282 1.1 groo 2283 1.40 xtraeme /* 2284 1.40 xtraeme * Stop, destroy the callout and unregister the driver with the 2285 1.40 xtraeme * sysmon_envsys(9) framework. 2286 1.40 xtraeme */ 2287 1.40 xtraeme void 2288 1.40 xtraeme lm_detach(struct lm_softc *lmsc) 2289 1.40 xtraeme { 2290 1.61 ozaki callout_halt(&lmsc->sc_callout, NULL); 2291 1.40 xtraeme callout_destroy(&lmsc->sc_callout); 2292 1.77 mlelstv 2293 1.77 mlelstv if (lmsc->sc_sme != NULL) 2294 1.77 mlelstv sysmon_envsys_unregister(lmsc->sc_sme); 2295 1.72 msaitoh pmf_device_deregister(lmsc->sc_dev); 2296 1.40 xtraeme } 2297 1.40 xtraeme 2298 1.40 xtraeme static void 2299 1.40 xtraeme lm_refresh(void *arg) 2300 1.40 xtraeme { 2301 1.40 xtraeme struct lm_softc *lmsc = arg; 2302 1.40 xtraeme 2303 1.40 xtraeme lmsc->refresh_sensor_data(lmsc); 2304 1.40 xtraeme callout_schedule(&lmsc->sc_callout, LM_REFRESH_TIMO); 2305 1.40 xtraeme } 2306 1.40 xtraeme 2307 1.30 xtraeme static int 2308 1.70 msaitoh nslm_attach(struct lm_softc *sc) 2309 1.5 bouyer { 2310 1.30 xtraeme const char *model = NULL; 2311 1.69 msaitoh uint8_t chipid; 2312 1.5 bouyer 2313 1.30 xtraeme /* See if we have an LM78/LM78J/LM79 or LM81 */ 2314 1.30 xtraeme chipid = (*sc->lm_readreg)(sc, LMD_CHIPID) & LM_ID_MASK; 2315 1.30 xtraeme switch(chipid) { 2316 1.5 bouyer case LM_ID_LM78: 2317 1.30 xtraeme model = "LM78"; 2318 1.5 bouyer break; 2319 1.5 bouyer case LM_ID_LM78J: 2320 1.30 xtraeme model = "LM78J"; 2321 1.5 bouyer break; 2322 1.5 bouyer case LM_ID_LM79: 2323 1.30 xtraeme model = "LM79"; 2324 1.15 bouyer break; 2325 1.15 bouyer case LM_ID_LM81: 2326 1.30 xtraeme model = "LM81"; 2327 1.5 bouyer break; 2328 1.5 bouyer default: 2329 1.70 msaitoh return -1; 2330 1.5 bouyer } 2331 1.1 groo 2332 1.55 njoly aprint_naive("\n"); 2333 1.37 xtraeme aprint_normal("\n"); 2334 1.46 xtraeme aprint_normal_dev(sc->sc_dev, 2335 1.46 xtraeme "National Semiconductor %s Hardware monitor\n", model); 2336 1.5 bouyer 2337 1.30 xtraeme lm_setup_sensors(sc, lm78_sensors); 2338 1.30 xtraeme sc->refresh_sensor_data = lm_refresh_sensor_data; 2339 1.70 msaitoh return 0; 2340 1.70 msaitoh } 2341 1.70 msaitoh 2342 1.70 msaitoh static int 2343 1.70 msaitoh def_match(struct lm_softc *sc) 2344 1.70 msaitoh { 2345 1.70 msaitoh 2346 1.5 bouyer return 1; 2347 1.5 bouyer } 2348 1.5 bouyer 2349 1.30 xtraeme static int 2350 1.70 msaitoh def_attach(struct lm_softc *sc) 2351 1.1 groo { 2352 1.68 msaitoh uint8_t chipid; 2353 1.5 bouyer 2354 1.30 xtraeme chipid = (*sc->lm_readreg)(sc, LMD_CHIPID) & LM_ID_MASK; 2355 1.55 njoly aprint_naive("\n"); 2356 1.37 xtraeme aprint_normal("\n"); 2357 1.70 msaitoh aprint_error_dev(sc->sc_dev, "Unknown chip (ID 0x%02x)\n", chipid); 2358 1.5 bouyer 2359 1.30 xtraeme lm_setup_sensors(sc, lm78_sensors); 2360 1.30 xtraeme sc->refresh_sensor_data = lm_refresh_sensor_data; 2361 1.70 msaitoh return 0; 2362 1.5 bouyer } 2363 1.1 groo 2364 1.50 pgoyette static void 2365 1.50 pgoyette wb_temp_diode_type(struct lm_softc *sc, int diode_type) 2366 1.50 pgoyette { 2367 1.69 msaitoh uint8_t regval, banksel; 2368 1.50 pgoyette 2369 1.50 pgoyette banksel = (*sc->lm_readreg)(sc, WB_BANKSEL); 2370 1.50 pgoyette switch (diode_type) { 2371 1.50 pgoyette case 1: /* Switch to Pentium-II diode mode */ 2372 1.50 pgoyette lm_generic_banksel(sc, WB_BANKSEL_B0); 2373 1.50 pgoyette regval = (*sc->lm_readreg)(sc, WB_BANK0_VBAT); 2374 1.50 pgoyette regval |= 0x0e; 2375 1.50 pgoyette (*sc->lm_writereg)(sc, WB_BANK0_VBAT, regval); 2376 1.50 pgoyette regval = (*sc->lm_readreg)(sc, WB_BANK0_RESVD1); 2377 1.50 pgoyette regval |= 0x70; 2378 1.50 pgoyette (*sc->lm_writereg)(sc, WB_BANK0_RESVD1, 0x0); 2379 1.50 pgoyette lm_generic_banksel(sc, banksel); 2380 1.50 pgoyette aprint_verbose_dev(sc->sc_dev, "Pentium-II diode temp sensors\n"); 2381 1.50 pgoyette break; 2382 1.50 pgoyette case 2: /* Switch to 2N3904 mode */ 2383 1.50 pgoyette lm_generic_banksel(sc, WB_BANKSEL_B0); 2384 1.50 pgoyette regval = (*sc->lm_readreg)(sc, WB_BANK0_VBAT); 2385 1.50 pgoyette regval |= 0xe; 2386 1.50 pgoyette (*sc->lm_writereg)(sc, WB_BANK0_VBAT, regval); 2387 1.50 pgoyette regval = (*sc->lm_readreg)(sc, WB_BANK0_RESVD1); 2388 1.50 pgoyette regval &= ~0x70; 2389 1.50 pgoyette (*sc->lm_writereg)(sc, WB_BANK0_RESVD1, 0x0); 2390 1.50 pgoyette lm_generic_banksel(sc, banksel); 2391 1.50 pgoyette aprint_verbose_dev(sc->sc_dev, "2N3904 bipolar temp sensors\n"); 2392 1.50 pgoyette break; 2393 1.50 pgoyette case 4: /* Switch to generic thermistor mode */ 2394 1.50 pgoyette lm_generic_banksel(sc, WB_BANKSEL_B0); 2395 1.50 pgoyette regval = (*sc->lm_readreg)(sc, WB_BANK0_VBAT); 2396 1.52 pgoyette regval &= ~0xe; 2397 1.50 pgoyette (*sc->lm_writereg)(sc, WB_BANK0_VBAT, regval); 2398 1.50 pgoyette lm_generic_banksel(sc, banksel); 2399 1.50 pgoyette aprint_verbose_dev(sc->sc_dev, "Thermistor temp sensors\n"); 2400 1.50 pgoyette break; 2401 1.50 pgoyette case 0: /* Unspecified - use default */ 2402 1.50 pgoyette aprint_verbose_dev(sc->sc_dev, "Using default temp sensors\n"); 2403 1.50 pgoyette break; 2404 1.50 pgoyette default: 2405 1.50 pgoyette aprint_error_dev(sc->sc_dev, 2406 1.50 pgoyette "Ignoring invalid temp sensor mode %d\n", 2407 1.50 pgoyette diode_type); 2408 1.50 pgoyette break; 2409 1.50 pgoyette } 2410 1.50 pgoyette } 2411 1.50 pgoyette 2412 1.70 msaitoh static const struct wb_product * 2413 1.70 msaitoh wb_lookup(struct lm_softc *sc, const struct wb_product *products, uint16_t id) 2414 1.70 msaitoh { 2415 1.70 msaitoh const struct wb_product *prod = products; 2416 1.70 msaitoh int i = 0; 2417 1.70 msaitoh 2418 1.70 msaitoh while (prod[i].id != 0) { 2419 1.70 msaitoh if (prod[i].id != id) { 2420 1.70 msaitoh i++; 2421 1.70 msaitoh continue; 2422 1.70 msaitoh } 2423 1.70 msaitoh if (prod[i].str == NULL) { 2424 1.70 msaitoh if (products == wb_products) { 2425 1.70 msaitoh if (id == WB_CHIPID_W83627DHG) { 2426 1.70 msaitoh /* 2427 1.70 msaitoh * Lookup wbsio_products 2428 1.70 msaitoh * with WBSIO_ID. 2429 1.70 msaitoh */ 2430 1.70 msaitoh return wb_lookup(sc, wbsio_products, 2431 1.70 msaitoh sc->sioid); 2432 1.70 msaitoh } else if (id == WB_CHIPID_AS99127F) { 2433 1.70 msaitoh /* 2434 1.70 msaitoh * Lookup as99127f_products 2435 1.70 msaitoh * with WB_VENDID. 2436 1.70 msaitoh */ 2437 1.70 msaitoh return wb_lookup(sc, as99127f_products, 2438 1.70 msaitoh wb_read_vendorid(sc)); 2439 1.70 msaitoh } else 2440 1.70 msaitoh return NULL; /* not occur */ 2441 1.70 msaitoh } 2442 1.70 msaitoh return NULL; /* not occur */ 2443 1.70 msaitoh } 2444 1.70 msaitoh return &prod[i]; 2445 1.70 msaitoh } 2446 1.70 msaitoh 2447 1.70 msaitoh /* Not found */ 2448 1.70 msaitoh return NULL; 2449 1.70 msaitoh } 2450 1.70 msaitoh 2451 1.70 msaitoh static uint16_t 2452 1.70 msaitoh wb_read_vendorid(struct lm_softc *sc) 2453 1.70 msaitoh { 2454 1.70 msaitoh uint16_t vendid; 2455 1.70 msaitoh uint8_t vendidreg; 2456 1.70 msaitoh uint8_t banksel; 2457 1.70 msaitoh 2458 1.70 msaitoh /* Save bank */ 2459 1.70 msaitoh banksel = (*sc->lm_readreg)(sc, WB_BANKSEL); 2460 1.70 msaitoh 2461 1.70 msaitoh /* Check default vendor ID register first */ 2462 1.70 msaitoh vendidreg = WB_VENDID; 2463 1.70 msaitoh 2464 1.70 msaitoh retry: 2465 1.70 msaitoh /* Read vendor ID */ 2466 1.70 msaitoh lm_generic_banksel(sc, WB_BANKSEL_HBAC); 2467 1.70 msaitoh vendid = (*sc->lm_readreg)(sc, vendidreg) << 8; 2468 1.70 msaitoh lm_generic_banksel(sc, 0); 2469 1.70 msaitoh vendid |= (*sc->lm_readreg)(sc, vendidreg); 2470 1.70 msaitoh 2471 1.70 msaitoh if ((vendidreg == WB_VENDID) 2472 1.70 msaitoh && (vendid != WB_VENDID_WINBOND && vendid != WB_VENDID_ASUS)) { 2473 1.70 msaitoh /* If it failed, try NCT6102 vendor ID register */ 2474 1.70 msaitoh vendidreg = WB_NCT6102_VENDID; 2475 1.70 msaitoh goto retry; 2476 1.70 msaitoh } else if ((vendidreg == WB_NCT6102_VENDID) 2477 1.70 msaitoh && (vendid != WB_VENDID_WINBOND)) 2478 1.70 msaitoh vendid = 0; /* XXX */ 2479 1.70 msaitoh 2480 1.70 msaitoh /* Restore bank */ 2481 1.70 msaitoh lm_generic_banksel(sc, banksel); 2482 1.70 msaitoh 2483 1.70 msaitoh return vendid; 2484 1.70 msaitoh } 2485 1.70 msaitoh 2486 1.70 msaitoh static uint8_t 2487 1.70 msaitoh wb_read_chipid(struct lm_softc *sc) 2488 1.70 msaitoh { 2489 1.70 msaitoh const struct wb_product *prod; 2490 1.70 msaitoh uint8_t chipidreg, chipid, banksel; 2491 1.70 msaitoh 2492 1.70 msaitoh /* Save bank */ 2493 1.70 msaitoh banksel = (*sc->lm_readreg)(sc, WB_BANKSEL); 2494 1.70 msaitoh 2495 1.70 msaitoh /* Check default vendor ID register first */ 2496 1.70 msaitoh chipidreg = WB_BANK0_CHIPID; 2497 1.70 msaitoh lm_generic_banksel(sc, WB_BANKSEL_B0); 2498 1.70 msaitoh 2499 1.70 msaitoh retry: 2500 1.70 msaitoh (void)(*sc->lm_readreg)(sc, LMD_CHIPID); 2501 1.70 msaitoh chipid = (*sc->lm_readreg)(sc, chipidreg); 2502 1.70 msaitoh prod = wb_lookup(sc, wb_products, chipid); 2503 1.70 msaitoh if (prod == NULL) { 2504 1.70 msaitoh if (chipidreg == WB_BANK0_CHIPID) { 2505 1.70 msaitoh chipidreg = WB_BANK0_NCT6102_CHIPID; 2506 1.70 msaitoh goto retry; 2507 1.70 msaitoh } else 2508 1.70 msaitoh chipid = 0; 2509 1.70 msaitoh } 2510 1.70 msaitoh /* Restore bank */ 2511 1.70 msaitoh lm_generic_banksel(sc, banksel); 2512 1.70 msaitoh 2513 1.70 msaitoh return chipid; 2514 1.70 msaitoh } 2515 1.70 msaitoh 2516 1.30 xtraeme static int 2517 1.30 xtraeme wb_match(struct lm_softc *sc) 2518 1.5 bouyer { 2519 1.70 msaitoh const struct wb_product *prod; 2520 1.70 msaitoh uint16_t vendid; 2521 1.70 msaitoh uint8_t chipid; 2522 1.70 msaitoh 2523 1.70 msaitoh /* Read vendor ID */ 2524 1.70 msaitoh vendid = wb_read_vendorid(sc); 2525 1.70 msaitoh DPRINTF(("%s: winbond vend id 0x%x\n", __func__, vendid)); 2526 1.70 msaitoh if ((vendid != WB_VENDID_WINBOND && vendid != WB_VENDID_ASUS)) 2527 1.70 msaitoh return 0; 2528 1.70 msaitoh 2529 1.70 msaitoh /* Read device/chip ID */ 2530 1.70 msaitoh chipid = wb_read_chipid(sc); 2531 1.70 msaitoh DPRINTF(("%s: winbond chip id 0x%x\n", __func__, chipid)); 2532 1.70 msaitoh prod = wb_lookup(sc, wb_products, chipid); 2533 1.70 msaitoh 2534 1.70 msaitoh if (prod == NULL) { 2535 1.70 msaitoh if (vendid == WB_VENDID_WINBOND) 2536 1.70 msaitoh return 1; /* Generic match */ 2537 1.70 msaitoh else 2538 1.70 msaitoh return 0; 2539 1.70 msaitoh } 2540 1.70 msaitoh DPRINTF(("%s: chipid %02x, sioid = %04x\n", __func__, chipid, 2541 1.70 msaitoh sc->sioid)); 2542 1.70 msaitoh 2543 1.70 msaitoh return 10; /* found */ 2544 1.70 msaitoh } 2545 1.70 msaitoh 2546 1.70 msaitoh static int 2547 1.70 msaitoh wb_attach(struct lm_softc *sc) 2548 1.70 msaitoh { 2549 1.70 msaitoh device_t dev = sc->sc_dev; 2550 1.70 msaitoh const struct wb_product *prod; 2551 1.37 xtraeme const char *model = NULL; 2552 1.63 pgoyette const char *vendor = "Winbond"; 2553 1.70 msaitoh const struct lm_sensor *sensors; 2554 1.69 msaitoh uint16_t vendid; 2555 1.69 msaitoh uint8_t banksel; 2556 1.69 msaitoh int cf_flags; 2557 1.1 groo 2558 1.55 njoly aprint_naive("\n"); 2559 1.37 xtraeme aprint_normal("\n"); 2560 1.30 xtraeme /* Read device/chip ID */ 2561 1.70 msaitoh sc->chipid = wb_read_chipid(sc); 2562 1.37 xtraeme DPRINTF(("%s: winbond chip id 0x%x\n", __func__, sc->chipid)); 2563 1.30 xtraeme 2564 1.70 msaitoh if ((prod = wb_lookup(sc, wb_products, sc->chipid)) != NULL) { 2565 1.74 mrg model = prod->str; 2566 1.74 mrg switch (model[0]) { 2567 1.70 msaitoh case 'W': 2568 1.70 msaitoh vendor = "Winbond"; 2569 1.70 msaitoh break; 2570 1.70 msaitoh case 'A': 2571 1.70 msaitoh vendor = "ASUS"; 2572 1.70 msaitoh break; 2573 1.70 msaitoh case 'N': 2574 1.70 msaitoh vendor = "Nuvoton"; 2575 1.70 msaitoh break; 2576 1.70 msaitoh default: 2577 1.70 msaitoh aprint_error_dev(dev, "Unknown model (%s)\n", model); 2578 1.70 msaitoh return -1; 2579 1.70 msaitoh } 2580 1.70 msaitoh sensors = prod->sensors; 2581 1.70 msaitoh sc->refresh_sensor_data = wb_refresh_sensor_data; 2582 1.70 msaitoh if (prod->extattach != NULL) 2583 1.70 msaitoh prod->extattach(sc); 2584 1.70 msaitoh } else { 2585 1.70 msaitoh vendid = wb_read_vendorid(sc); 2586 1.70 msaitoh if (vendid == WB_VENDID_WINBOND) { 2587 1.70 msaitoh vendor = "Winbond"; 2588 1.70 msaitoh model = "unknown-model"; 2589 1.70 msaitoh 2590 1.70 msaitoh /* Handle as a standard LM78. */ 2591 1.70 msaitoh sensors = lm78_sensors; 2592 1.70 msaitoh sc->refresh_sensor_data = lm_refresh_sensor_data; 2593 1.70 msaitoh } else { 2594 1.70 msaitoh aprint_error_dev(dev, "Unknown chip (ID %02x)\n", 2595 1.70 msaitoh sc->chipid); 2596 1.70 msaitoh return -1; 2597 1.70 msaitoh } 2598 1.70 msaitoh } 2599 1.70 msaitoh 2600 1.70 msaitoh cf_flags = device_cfdata(dev)->cf_flags; 2601 1.70 msaitoh 2602 1.70 msaitoh if (sensors != NULL) { 2603 1.70 msaitoh lm_setup_sensors(sc, sensors); 2604 1.70 msaitoh 2605 1.70 msaitoh /* XXX Is this correct? Check all datasheets. */ 2606 1.70 msaitoh switch (sc->chipid) { 2607 1.70 msaitoh case WB_CHIPID_W83627EHF_A: 2608 1.70 msaitoh case WB_CHIPID_W83781D: 2609 1.70 msaitoh case WB_CHIPID_W83781D_2: 2610 1.70 msaitoh case WB_CHIPID_W83791SD: 2611 1.70 msaitoh case WB_CHIPID_W83792D: 2612 1.70 msaitoh case WB_CHIPID_AS99127F: 2613 1.70 msaitoh break; 2614 1.70 msaitoh default: 2615 1.70 msaitoh wb_temp_diode_type(sc, cf_flags); 2616 1.70 msaitoh break; 2617 1.70 msaitoh } 2618 1.70 msaitoh } 2619 1.70 msaitoh 2620 1.70 msaitoh /* XXX Is this correct? Check all datasheets. */ 2621 1.70 msaitoh banksel = (*sc->lm_readreg)(sc, WB_BANKSEL); 2622 1.30 xtraeme switch(sc->chipid) { 2623 1.30 xtraeme case WB_CHIPID_W83627THF: 2624 1.56 jakllsch lm_generic_banksel(sc, WB_BANKSEL_B0); 2625 1.56 jakllsch if ((*sc->lm_readreg)(sc, WB_BANK0_CONFIG) & WB_CONFIG_VMR9) 2626 1.56 jakllsch sc->vrm9 = 1; 2627 1.56 jakllsch lm_generic_banksel(sc, banksel); 2628 1.30 xtraeme break; 2629 1.30 xtraeme case WB_CHIPID_W83637HF: 2630 1.30 xtraeme lm_generic_banksel(sc, WB_BANKSEL_B0); 2631 1.30 xtraeme if ((*sc->lm_readreg)(sc, WB_BANK0_CONFIG) & WB_CONFIG_VMR9) 2632 1.30 xtraeme sc->vrm9 = 1; 2633 1.30 xtraeme lm_generic_banksel(sc, banksel); 2634 1.30 xtraeme break; 2635 1.70 msaitoh default: 2636 1.23 xtraeme break; 2637 1.7 bouyer } 2638 1.30 xtraeme 2639 1.70 msaitoh aprint_normal_dev(dev, "%s %s Hardware monitor\n", vendor, model); 2640 1.30 xtraeme 2641 1.70 msaitoh return 0; 2642 1.8 bouyer } 2643 1.5 bouyer 2644 1.8 bouyer static void 2645 1.68 msaitoh lm_setup_sensors(struct lm_softc *sc, const struct lm_sensor *sensors) 2646 1.8 bouyer { 2647 1.30 xtraeme int i; 2648 1.30 xtraeme 2649 1.30 xtraeme for (i = 0; sensors[i].desc; i++) { 2650 1.37 xtraeme sc->sensors[i].units = sensors[i].type; 2651 1.57 jakllsch if (sc->sensors[i].units == ENVSYS_SVOLTS_DC) 2652 1.57 jakllsch sc->sensors[i].flags = ENVSYS_FCHANGERFACT; 2653 1.37 xtraeme strlcpy(sc->sensors[i].desc, sensors[i].desc, 2654 1.37 xtraeme sizeof(sc->sensors[i].desc)); 2655 1.30 xtraeme sc->numsensors++; 2656 1.30 xtraeme } 2657 1.30 xtraeme sc->lm_sensors = sensors; 2658 1.8 bouyer } 2659 1.8 bouyer 2660 1.8 bouyer static void 2661 1.40 xtraeme lm_refresh_sensor_data(struct lm_softc *sc) 2662 1.8 bouyer { 2663 1.40 xtraeme int i; 2664 1.40 xtraeme 2665 1.40 xtraeme for (i = 0; i < sc->numsensors; i++) 2666 1.40 xtraeme sc->lm_sensors[i].refresh(sc, i); 2667 1.30 xtraeme } 2668 1.30 xtraeme 2669 1.30 xtraeme static void 2670 1.30 xtraeme lm_refresh_volt(struct lm_softc *sc, int n) 2671 1.30 xtraeme { 2672 1.30 xtraeme int data; 2673 1.30 xtraeme 2674 1.30 xtraeme data = (*sc->lm_readreg)(sc, sc->lm_sensors[n].reg); 2675 1.45 xtraeme if (data == 0xff) { 2676 1.37 xtraeme sc->sensors[n].state = ENVSYS_SINVALID; 2677 1.37 xtraeme } else { 2678 1.45 xtraeme sc->sensors[n].value_cur = (data << 4); 2679 1.45 xtraeme if (sc->sensors[n].rfact) { 2680 1.45 xtraeme sc->sensors[n].value_cur *= sc->sensors[n].rfact; 2681 1.45 xtraeme sc->sensors[n].value_cur /= 10; 2682 1.45 xtraeme } else { 2683 1.45 xtraeme sc->sensors[n].value_cur *= sc->lm_sensors[n].rfact; 2684 1.45 xtraeme sc->sensors[n].value_cur /= 10; 2685 1.45 xtraeme sc->sensors[n].rfact = sc->lm_sensors[n].rfact; 2686 1.45 xtraeme } 2687 1.45 xtraeme sc->sensors[n].state = ENVSYS_SVALID; 2688 1.37 xtraeme } 2689 1.40 xtraeme 2690 1.37 xtraeme DPRINTF(("%s: volt[%d] data=0x%x value_cur=%d\n", 2691 1.37 xtraeme __func__, n, data, sc->sensors[n].value_cur)); 2692 1.30 xtraeme } 2693 1.30 xtraeme 2694 1.30 xtraeme static void 2695 1.30 xtraeme lm_refresh_temp(struct lm_softc *sc, int n) 2696 1.30 xtraeme { 2697 1.37 xtraeme int data; 2698 1.30 xtraeme 2699 1.30 xtraeme /* 2700 1.30 xtraeme * The data sheet suggests that the range of the temperature 2701 1.30 xtraeme * sensor is between -55 degC and +125 degC. 2702 1.30 xtraeme */ 2703 1.37 xtraeme data = (*sc->lm_readreg)(sc, sc->lm_sensors[n].reg); 2704 1.37 xtraeme if (data > 0x7d && data < 0xc9) 2705 1.37 xtraeme sc->sensors[n].state = ENVSYS_SINVALID; 2706 1.37 xtraeme else { 2707 1.37 xtraeme if (data & 0x80) 2708 1.37 xtraeme data -= 0x100; 2709 1.37 xtraeme sc->sensors[n].state = ENVSYS_SVALID; 2710 1.37 xtraeme sc->sensors[n].value_cur = data * 1000000 + 273150000; 2711 1.8 bouyer } 2712 1.37 xtraeme DPRINTF(("%s: temp[%d] data=0x%x value_cur=%d\n", 2713 1.37 xtraeme __func__, n, data, sc->sensors[n].value_cur)); 2714 1.8 bouyer } 2715 1.8 bouyer 2716 1.30 xtraeme static void 2717 1.30 xtraeme lm_refresh_fanrpm(struct lm_softc *sc, int n) 2718 1.30 xtraeme { 2719 1.30 xtraeme int data, divisor = 1; 2720 1.30 xtraeme 2721 1.30 xtraeme /* 2722 1.30 xtraeme * We might get more accurate fan readings by adjusting the 2723 1.30 xtraeme * divisor, but that might interfere with APM or other SMM 2724 1.30 xtraeme * BIOS code reading the fan speeds. 2725 1.30 xtraeme */ 2726 1.30 xtraeme 2727 1.30 xtraeme /* FAN3 has a fixed fan divisor. */ 2728 1.30 xtraeme if (sc->lm_sensors[n].reg == LMD_FAN1 || 2729 1.30 xtraeme sc->lm_sensors[n].reg == LMD_FAN2) { 2730 1.30 xtraeme data = (*sc->lm_readreg)(sc, LMD_VIDFAN); 2731 1.30 xtraeme if (sc->lm_sensors[n].reg == LMD_FAN1) 2732 1.30 xtraeme divisor = (data >> 4) & 0x03; 2733 1.30 xtraeme else 2734 1.30 xtraeme divisor = (data >> 6) & 0x03; 2735 1.30 xtraeme } 2736 1.30 xtraeme 2737 1.30 xtraeme data = (*sc->lm_readreg)(sc, sc->lm_sensors[n].reg); 2738 1.37 xtraeme if (data == 0xff || data == 0x00) 2739 1.37 xtraeme sc->sensors[n].state = ENVSYS_SINVALID; 2740 1.37 xtraeme else { 2741 1.37 xtraeme sc->sensors[n].state = ENVSYS_SVALID; 2742 1.37 xtraeme sc->sensors[n].value_cur = 1350000 / (data << divisor); 2743 1.30 xtraeme } 2744 1.37 xtraeme DPRINTF(("%s: fan[%d] data=0x%x value_cur=%d\n", 2745 1.37 xtraeme __func__, n, data, sc->sensors[n].value_cur)); 2746 1.30 xtraeme } 2747 1.30 xtraeme 2748 1.30 xtraeme static void 2749 1.40 xtraeme wb_refresh_sensor_data(struct lm_softc *sc) 2750 1.30 xtraeme { 2751 1.69 msaitoh uint8_t banksel, bank; 2752 1.69 msaitoh int i; 2753 1.30 xtraeme 2754 1.30 xtraeme /* 2755 1.30 xtraeme * Properly save and restore bank selection register. 2756 1.30 xtraeme */ 2757 1.30 xtraeme banksel = bank = sc->lm_readreg(sc, WB_BANKSEL); 2758 1.30 xtraeme for (i = 0; i < sc->numsensors; i++) { 2759 1.30 xtraeme if (bank != sc->lm_sensors[i].bank) { 2760 1.30 xtraeme bank = sc->lm_sensors[i].bank; 2761 1.30 xtraeme lm_generic_banksel(sc, bank); 2762 1.30 xtraeme } 2763 1.30 xtraeme sc->lm_sensors[i].refresh(sc, i); 2764 1.30 xtraeme } 2765 1.30 xtraeme lm_generic_banksel(sc, banksel); 2766 1.30 xtraeme } 2767 1.30 xtraeme 2768 1.30 xtraeme static void 2769 1.30 xtraeme wb_w83637hf_refresh_vcore(struct lm_softc *sc, int n) 2770 1.30 xtraeme { 2771 1.30 xtraeme int data; 2772 1.30 xtraeme 2773 1.30 xtraeme data = (*sc->lm_readreg)(sc, sc->lm_sensors[n].reg); 2774 1.30 xtraeme /* 2775 1.30 xtraeme * Depending on the voltage detection method, 2776 1.30 xtraeme * one of the following formulas is used: 2777 1.30 xtraeme * VRM8 method: value = raw * 0.016V 2778 1.30 xtraeme * VRM9 method: value = raw * 0.00488V + 0.70V 2779 1.30 xtraeme */ 2780 1.30 xtraeme if (sc->vrm9) 2781 1.37 xtraeme sc->sensors[n].value_cur = (data * 4880) + 700000; 2782 1.30 xtraeme else 2783 1.37 xtraeme sc->sensors[n].value_cur = (data * 16000); 2784 1.54 jakllsch sc->sensors[n].state = ENVSYS_SVALID; 2785 1.37 xtraeme DPRINTF(("%s: volt[%d] data=0x%x value_cur=%d\n", 2786 1.37 xtraeme __func__, n, data, sc->sensors[n].value_cur)); 2787 1.30 xtraeme } 2788 1.8 bouyer 2789 1.8 bouyer static void 2790 1.30 xtraeme wb_refresh_nvolt(struct lm_softc *sc, int n) 2791 1.8 bouyer { 2792 1.30 xtraeme int data; 2793 1.30 xtraeme 2794 1.30 xtraeme data = (*sc->lm_readreg)(sc, sc->lm_sensors[n].reg); 2795 1.37 xtraeme sc->sensors[n].value_cur = ((data << 4) - WB_VREF); 2796 1.37 xtraeme if (sc->sensors[n].rfact) 2797 1.37 xtraeme sc->sensors[n].value_cur *= sc->sensors[n].rfact; 2798 1.37 xtraeme else 2799 1.37 xtraeme sc->sensors[n].value_cur *= sc->lm_sensors[n].rfact; 2800 1.37 xtraeme 2801 1.37 xtraeme sc->sensors[n].value_cur /= 10; 2802 1.37 xtraeme sc->sensors[n].value_cur += WB_VREF * 1000; 2803 1.54 jakllsch sc->sensors[n].state = ENVSYS_SVALID; 2804 1.37 xtraeme DPRINTF(("%s: volt[%d] data=0x%x value_cur=%d\n", 2805 1.37 xtraeme __func__, n , data, sc->sensors[n].value_cur)); 2806 1.30 xtraeme } 2807 1.30 xtraeme 2808 1.30 xtraeme static void 2809 1.30 xtraeme wb_w83627ehf_refresh_nvolt(struct lm_softc *sc, int n) 2810 1.30 xtraeme { 2811 1.30 xtraeme int data; 2812 1.30 xtraeme 2813 1.30 xtraeme data = (*sc->lm_readreg)(sc, sc->lm_sensors[n].reg); 2814 1.37 xtraeme sc->sensors[n].value_cur = ((data << 3) - WB_W83627EHF_VREF); 2815 1.37 xtraeme if (sc->sensors[n].rfact) 2816 1.37 xtraeme sc->sensors[n].value_cur *= sc->sensors[n].rfact; 2817 1.37 xtraeme else 2818 1.37 xtraeme sc->sensors[n].value_cur *= RFACT(232, 10); 2819 1.37 xtraeme 2820 1.37 xtraeme sc->sensors[n].value_cur /= 10; 2821 1.37 xtraeme sc->sensors[n].value_cur += WB_W83627EHF_VREF * 1000; 2822 1.54 jakllsch sc->sensors[n].state = ENVSYS_SVALID; 2823 1.37 xtraeme DPRINTF(("%s: volt[%d] data=0x%x value_cur=%d\n", 2824 1.37 xtraeme __func__, n , data, sc->sensors[n].value_cur)); 2825 1.30 xtraeme } 2826 1.30 xtraeme 2827 1.30 xtraeme static void 2828 1.30 xtraeme wb_refresh_temp(struct lm_softc *sc, int n) 2829 1.30 xtraeme { 2830 1.37 xtraeme int data; 2831 1.30 xtraeme 2832 1.30 xtraeme /* 2833 1.30 xtraeme * The data sheet suggests that the range of the temperature 2834 1.30 xtraeme * sensor is between -55 degC and +125 degC. However, values 2835 1.30 xtraeme * around -48 degC seem to be a very common bogus values. 2836 1.30 xtraeme * Since such values are unreasonably low, we use -45 degC for 2837 1.30 xtraeme * the lower limit instead. 2838 1.30 xtraeme */ 2839 1.37 xtraeme data = (*sc->lm_readreg)(sc, sc->lm_sensors[n].reg) << 1; 2840 1.37 xtraeme data += (*sc->lm_readreg)(sc, sc->lm_sensors[n].reg + 1) >> 7; 2841 1.37 xtraeme if (data > 0xfffffff || (data > 0x0fa && data < 0x1a6)) { 2842 1.37 xtraeme sc->sensors[n].state = ENVSYS_SINVALID; 2843 1.30 xtraeme } else { 2844 1.37 xtraeme if (data & 0x100) 2845 1.37 xtraeme data -= 0x200; 2846 1.37 xtraeme sc->sensors[n].state = ENVSYS_SVALID; 2847 1.37 xtraeme sc->sensors[n].value_cur = data * 500000 + 273150000; 2848 1.30 xtraeme } 2849 1.37 xtraeme DPRINTF(("%s: temp[%d] data=0x%x value_cur=%d\n", 2850 1.37 xtraeme __func__, n , data, sc->sensors[n].value_cur)); 2851 1.30 xtraeme } 2852 1.30 xtraeme 2853 1.30 xtraeme static void 2854 1.30 xtraeme wb_refresh_fanrpm(struct lm_softc *sc, int n) 2855 1.30 xtraeme { 2856 1.30 xtraeme int fan, data, divisor = 0; 2857 1.30 xtraeme 2858 1.30 xtraeme /* 2859 1.30 xtraeme * This is madness; the fan divisor bits are scattered all 2860 1.30 xtraeme * over the place. 2861 1.30 xtraeme */ 2862 1.30 xtraeme 2863 1.30 xtraeme if (sc->lm_sensors[n].reg == LMD_FAN1 || 2864 1.30 xtraeme sc->lm_sensors[n].reg == LMD_FAN2 || 2865 1.30 xtraeme sc->lm_sensors[n].reg == LMD_FAN3) { 2866 1.30 xtraeme data = (*sc->lm_readreg)(sc, WB_BANK0_VBAT); 2867 1.30 xtraeme fan = (sc->lm_sensors[n].reg - LMD_FAN1); 2868 1.30 xtraeme if ((data >> 5) & (1 << fan)) 2869 1.30 xtraeme divisor |= 0x04; 2870 1.30 xtraeme } 2871 1.30 xtraeme 2872 1.30 xtraeme if (sc->lm_sensors[n].reg == LMD_FAN1 || 2873 1.30 xtraeme sc->lm_sensors[n].reg == LMD_FAN2) { 2874 1.30 xtraeme data = (*sc->lm_readreg)(sc, LMD_VIDFAN); 2875 1.30 xtraeme if (sc->lm_sensors[n].reg == LMD_FAN1) 2876 1.30 xtraeme divisor |= (data >> 4) & 0x03; 2877 1.30 xtraeme else 2878 1.30 xtraeme divisor |= (data >> 6) & 0x03; 2879 1.30 xtraeme } else if (sc->lm_sensors[n].reg == LMD_FAN3) { 2880 1.30 xtraeme data = (*sc->lm_readreg)(sc, WB_PIN); 2881 1.30 xtraeme divisor |= (data >> 6) & 0x03; 2882 1.30 xtraeme } else if (sc->lm_sensors[n].reg == WB_BANK0_FAN4 || 2883 1.30 xtraeme sc->lm_sensors[n].reg == WB_BANK0_FAN5) { 2884 1.30 xtraeme data = (*sc->lm_readreg)(sc, WB_BANK0_FAN45); 2885 1.30 xtraeme if (sc->lm_sensors[n].reg == WB_BANK0_FAN4) 2886 1.30 xtraeme divisor |= (data >> 0) & 0x07; 2887 1.30 xtraeme else 2888 1.30 xtraeme divisor |= (data >> 4) & 0x07; 2889 1.30 xtraeme } 2890 1.30 xtraeme 2891 1.30 xtraeme data = (*sc->lm_readreg)(sc, sc->lm_sensors[n].reg); 2892 1.37 xtraeme if (data >= 0xff || data == 0x00) 2893 1.37 xtraeme sc->sensors[n].state = ENVSYS_SINVALID; 2894 1.37 xtraeme else { 2895 1.37 xtraeme sc->sensors[n].state = ENVSYS_SVALID; 2896 1.37 xtraeme sc->sensors[n].value_cur = 1350000 / (data << divisor); 2897 1.30 xtraeme } 2898 1.37 xtraeme DPRINTF(("%s: fan[%d] data=0x%x value_cur=%d\n", 2899 1.37 xtraeme __func__, n , data, sc->sensors[n].value_cur)); 2900 1.30 xtraeme } 2901 1.30 xtraeme 2902 1.30 xtraeme static void 2903 1.63 pgoyette wb_nct6776f_refresh_fanrpm(struct lm_softc *sc, int n) 2904 1.63 pgoyette { 2905 1.63 pgoyette int datah, datal; 2906 1.63 pgoyette 2907 1.63 pgoyette datah = (*sc->lm_readreg)(sc, sc->lm_sensors[n].reg); 2908 1.63 pgoyette datal = (*sc->lm_readreg)(sc, sc->lm_sensors[n].reg + 1); 2909 1.63 pgoyette 2910 1.63 pgoyette if ((datah == 0xff) || (datah == 0)) { 2911 1.63 pgoyette sc->sensors[n].state = ENVSYS_SINVALID; 2912 1.63 pgoyette } else { 2913 1.63 pgoyette sc->sensors[n].state = ENVSYS_SVALID; 2914 1.63 pgoyette sc->sensors[n].value_cur = (datah << 8) | datal; 2915 1.63 pgoyette } 2916 1.63 pgoyette } 2917 1.63 pgoyette 2918 1.63 pgoyette static void 2919 1.30 xtraeme wb_w83792d_refresh_fanrpm(struct lm_softc *sc, int n) 2920 1.30 xtraeme { 2921 1.69 msaitoh int shift, data, divisor = 1; 2922 1.69 msaitoh uint8_t reg; 2923 1.30 xtraeme 2924 1.30 xtraeme shift = 0; 2925 1.30 xtraeme 2926 1.30 xtraeme switch (sc->lm_sensors[n].reg) { 2927 1.30 xtraeme case 0x28: 2928 1.30 xtraeme reg = 0x47; shift = 0; 2929 1.30 xtraeme break; 2930 1.30 xtraeme case 0x29: 2931 1.30 xtraeme reg = 0x47; shift = 4; 2932 1.30 xtraeme break; 2933 1.30 xtraeme case 0x2a: 2934 1.30 xtraeme reg = 0x5b; shift = 0; 2935 1.30 xtraeme break; 2936 1.30 xtraeme case 0xb8: 2937 1.30 xtraeme reg = 0x5b; shift = 4; 2938 1.30 xtraeme break; 2939 1.30 xtraeme case 0xb9: 2940 1.30 xtraeme reg = 0x5c; shift = 0; 2941 1.30 xtraeme break; 2942 1.30 xtraeme case 0xba: 2943 1.30 xtraeme reg = 0x5c; shift = 4; 2944 1.30 xtraeme break; 2945 1.30 xtraeme case 0xbe: 2946 1.30 xtraeme reg = 0x9e; shift = 0; 2947 1.30 xtraeme break; 2948 1.30 xtraeme default: 2949 1.30 xtraeme reg = 0; 2950 1.30 xtraeme break; 2951 1.30 xtraeme } 2952 1.30 xtraeme 2953 1.30 xtraeme data = (*sc->lm_readreg)(sc, sc->lm_sensors[n].reg); 2954 1.37 xtraeme if (data == 0xff || data == 0x00) 2955 1.37 xtraeme sc->sensors[n].state = ENVSYS_SINVALID; 2956 1.37 xtraeme else { 2957 1.30 xtraeme if (reg != 0) 2958 1.30 xtraeme divisor = ((*sc->lm_readreg)(sc, reg) >> shift) & 0x7; 2959 1.37 xtraeme sc->sensors[n].state = ENVSYS_SVALID; 2960 1.37 xtraeme sc->sensors[n].value_cur = 1350000 / (data << divisor); 2961 1.30 xtraeme } 2962 1.37 xtraeme DPRINTF(("%s: fan[%d] data=0x%x value_cur=%d\n", 2963 1.37 xtraeme __func__, n , data, sc->sensors[n].value_cur)); 2964 1.30 xtraeme } 2965 1.30 xtraeme 2966 1.30 xtraeme static void 2967 1.30 xtraeme as_refresh_temp(struct lm_softc *sc, int n) 2968 1.30 xtraeme { 2969 1.37 xtraeme int data; 2970 1.30 xtraeme 2971 1.30 xtraeme /* 2972 1.30 xtraeme * It seems a shorted temperature diode produces an all-ones 2973 1.30 xtraeme * bit pattern. 2974 1.30 xtraeme */ 2975 1.37 xtraeme data = (*sc->lm_readreg)(sc, sc->lm_sensors[n].reg) << 1; 2976 1.37 xtraeme data += (*sc->lm_readreg)(sc, sc->lm_sensors[n].reg + 1) >> 7; 2977 1.37 xtraeme if (data == 0x1ff) 2978 1.37 xtraeme sc->sensors[n].state = ENVSYS_SINVALID; 2979 1.37 xtraeme else { 2980 1.37 xtraeme if (data & 0x100) 2981 1.37 xtraeme data -= 0x200; 2982 1.37 xtraeme sc->sensors[n].state = ENVSYS_SVALID; 2983 1.37 xtraeme sc->sensors[n].value_cur = data * 500000 + 273150000; 2984 1.5 bouyer } 2985 1.37 xtraeme DPRINTF(("%s: temp[%d] data=0x%x value_cur=%d\n", 2986 1.37 xtraeme __func__, n, data, sc->sensors[n].value_cur)); 2987 1.1 groo } 2988 1.59 jakllsch 2989 1.62 pgoyette MODULE(MODULE_CLASS_DRIVER, lm, "sysmon_envsys"); 2990 1.59 jakllsch 2991 1.59 jakllsch static int 2992 1.59 jakllsch lm_modcmd(modcmd_t cmd, void *opaque) 2993 1.59 jakllsch { 2994 1.59 jakllsch switch (cmd) { 2995 1.59 jakllsch case MODULE_CMD_INIT: 2996 1.59 jakllsch case MODULE_CMD_FINI: 2997 1.59 jakllsch return 0; 2998 1.59 jakllsch default: 2999 1.59 jakllsch return ENOTTY; 3000 1.59 jakllsch } 3001 1.59 jakllsch } 3002