Annotation of sys/dev/i2c/i2c_scan.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: i2c_scan.c,v 1.97 2007/04/10 17:47:55 miod Exp $ */
! 2:
! 3: /*
! 4: * Copyright (c) 2005 Theo de Raadt <deraadt@openbsd.org>
! 5: *
! 6: * Permission to use, copy, modify, and distribute this software for any
! 7: * purpose with or without fee is hereby granted, provided that the above
! 8: * copyright notice and this permission notice appear in all copies.
! 9: *
! 10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
! 11: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 12: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
! 13: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 14: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
! 15: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
! 16: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 17: */
! 18:
! 19: /*
! 20: * I2C bus scanning.
! 21: */
! 22:
! 23: #include <sys/param.h>
! 24: #include <sys/systm.h>
! 25: #include <sys/device.h>
! 26:
! 27: #define _I2C_PRIVATE
! 28: #include <dev/i2c/i2cvar.h>
! 29:
! 30: #undef I2C_DEBUG
! 31: #define I2C_VERBOSE
! 32:
! 33: void iic_probe(struct device *, struct i2cbus_attach_args *, u_int8_t);
! 34:
! 35: /*
! 36: * Addresses at which to probe for sensors. Skip address 0x4f, since
! 37: * probing it seems to crash at least one Sony VAIO laptop. Only a
! 38: * few chips can actually sit at that address, and vendors seem to
! 39: * place those at other addresses, so this isn't a big loss.
! 40: */
! 41: struct {
! 42: u_int8_t start, end;
! 43: } probe_addrs[] = {
! 44: { 0x18, 0x18 },
! 45: { 0x1a, 0x1a },
! 46: { 0x20, 0x2f },
! 47: { 0x48, 0x4e }
! 48: };
! 49:
! 50: #define MAX_IGNORE 8
! 51: u_int8_t ignore_addrs[MAX_IGNORE];
! 52:
! 53: /*
! 54: * Some Maxim 1617 clones MAY NOT even read cmd 0xfc! When it is
! 55: * read, they will power-on-reset. Their default condition
! 56: * (control register bit 0x80) therefore will be that they assert
! 57: * /ALERT for the 5 potential errors that may occur. One of those
! 58: * errors is that the external temperature diode is missing. This
! 59: * is unfortunately a common choice of system designers, except
! 60: * suddenly now we get a /ALERT, which may on some chipsets cause
! 61: * us to receive an entirely unexpected SMI .. and then an NMI.
! 62: *
! 63: * As we probe each device, if we hit something which looks suspiciously
! 64: * like it may potentially be a 1617 or clone, we immediately set this
! 65: * variable to avoid reading that register offset.
! 66: */
! 67: int skip_fc;
! 68:
! 69: static i2c_tag_t probe_ic;
! 70: static u_int8_t probe_addr;
! 71: static u_int8_t probe_val[256];
! 72:
! 73: void iicprobeinit(struct i2cbus_attach_args *, u_int8_t);
! 74: u_int8_t iicprobenc(u_int8_t);
! 75: u_int8_t iicprobe(u_int8_t);
! 76: u_int16_t iicprobew(u_int8_t);
! 77: char *lm75probe(void);
! 78: char *adm1032cloneprobe(u_int8_t);
! 79: void iic_dump(struct device *, u_int8_t, char *);
! 80:
! 81: void
! 82: iicprobeinit(struct i2cbus_attach_args *iba, u_int8_t addr)
! 83: {
! 84: probe_ic = iba->iba_tag;
! 85: probe_addr = addr;
! 86: memset(probe_val, 0xff, sizeof probe_val);
! 87: }
! 88:
! 89: u_int8_t
! 90: iicprobenc(u_int8_t cmd)
! 91: {
! 92: u_int8_t data;
! 93:
! 94: /*
! 95: * If we think we are talking to an evil Maxim 1617 or clone,
! 96: * avoid accessing this register because it is death.
! 97: */
! 98: if (skip_fc && cmd == 0xfc)
! 99: return (0xff);
! 100: iic_acquire_bus(probe_ic, 0);
! 101: if (iic_exec(probe_ic, I2C_OP_READ_WITH_STOP,
! 102: probe_addr, &cmd, 1, &data, 1, 0) != 0)
! 103: data = 0xff;
! 104: iic_release_bus(probe_ic, 0);
! 105: return (data);
! 106: }
! 107:
! 108: u_int16_t
! 109: iicprobew(u_int8_t cmd)
! 110: {
! 111: u_int8_t data[2];
! 112:
! 113: /*
! 114: * If we think we are talking to an evil Maxim 1617 or clone,
! 115: * avoid accessing this register because it is death.
! 116: */
! 117: if (skip_fc && cmd == 0xfc)
! 118: return (0xffff);
! 119: iic_acquire_bus(probe_ic, 0);
! 120: if (iic_exec(probe_ic, I2C_OP_READ_WITH_STOP,
! 121: probe_addr, &cmd, 1, &data, 2, 0) != 0)
! 122: data[0] = data[1] = 0xff;
! 123: iic_release_bus(probe_ic, 0);
! 124: return ((data[0] << 8) | data[1]);
! 125: }
! 126:
! 127: u_int8_t
! 128: iicprobe(u_int8_t cmd)
! 129: {
! 130: if (probe_val[cmd] != 0xff)
! 131: return probe_val[cmd];
! 132: probe_val[cmd] = iicprobenc(cmd);
! 133: return (probe_val[cmd]);
! 134: }
! 135:
! 136: #define LM75TEMP 0x00
! 137: #define LM75CONF 0x01
! 138: #define LM75Thyst 0x02
! 139: #define LM75Tos 0x03
! 140: #define LM77Tlow 0x04
! 141: #define LM77Thigh 0x05
! 142: #define LM75TMASK 0xff80 /* 9 bits in temperature registers */
! 143: #define LM77TMASK 0xfff8 /* 13 bits in temperature registers */
! 144:
! 145: /*
! 146: * The LM75/LM75A/LM77 family are very hard to detect. Thus, we check
! 147: * for all other possible chips first. These chips do not have an
! 148: * ID register. They do have a few quirks though:
! 149: * - on the LM75 and LM77, registers 0x06 and 0x07 return whatever
! 150: * value was read before
! 151: * - the LM75 lacks registers 0x04 and 0x05, so those act as above
! 152: * - the LM75A returns 0xffff for registers 0x04, 0x05, 0x06 and 0x07
! 153: * - the chip registers loop every 8 registers
! 154: * The downside is that we must read almost every register to guess
! 155: * if this is an LM75, LM75A or LM77.
! 156: */
! 157: char *
! 158: lm75probe(void)
! 159: {
! 160: u_int16_t temp, thyst, tos, tlow, thigh, mask = LM75TMASK;
! 161: u_int8_t conf;
! 162: int i, echocount, ffffcount, score;
! 163: int echoreg67, echoreg45, ffffreg67, ffffreg45;
! 164:
! 165: temp = iicprobew(LM75TEMP);
! 166:
! 167: /*
! 168: * Sometimes the other probes can upset the chip, if we get 0xffff
! 169: * the first time, try it once more.
! 170: */
! 171: if (temp == 0xffff)
! 172: temp = iicprobew(LM75TEMP);
! 173:
! 174: conf = iicprobenc(LM75CONF);
! 175: thyst = iicprobew(LM75Thyst);
! 176: tos = iicprobew(LM75Tos);
! 177:
! 178: /* totally bogus data */
! 179: if (conf == 0xff && temp == 0xffff && thyst == 0xffff)
! 180: return (NULL);
! 181:
! 182: temp &= mask;
! 183: thyst &= mask;
! 184: tos &= mask;
! 185:
! 186: /* All values the same? Very unlikely */
! 187: if (temp == thyst && thyst == tos)
! 188: return (NULL);
! 189:
! 190: #if notsure
! 191: /* more register aliasing effects that indicate not a lm75 */
! 192: if ((temp >> 8) == conf)
! 193: return (NULL);
! 194: #endif
! 195:
! 196: /*
! 197: * LM77/LM75 registers 6, 7
! 198: * echo whatever was read just before them from reg 0, 1, or 2
! 199: *
! 200: * LM75A doesn't appear to do this, but does appear to reliably
! 201: * return 0xffff
! 202: */
! 203: for (i = 6, echocount = 2, ffffcount = 0; i <= 7; i++) {
! 204: if ((iicprobew(LM75TEMP) & mask) != (iicprobew(i) & mask) ||
! 205: (iicprobew(LM75Thyst) & mask) != (iicprobew(i) & mask) ||
! 206: (iicprobew(LM75Tos) & mask) != (iicprobew(i) & mask))
! 207: echocount--;
! 208: if (iicprobew(i) == 0xffff)
! 209: ffffcount++;
! 210: }
! 211:
! 212: /* Make sure either both registers echo, or neither does */
! 213: if (echocount == 1 || ffffcount == 1)
! 214: return (NULL);
! 215:
! 216: echoreg67 = (echocount == 0) ? 0 : 1;
! 217: ffffreg67 = (ffffcount == 0) ? 0 : 1;
! 218:
! 219: /*
! 220: * LM75 has no registers 4 or 5, and they will act as echos too
! 221: *
! 222: * LM75A doesn't appear to do this either, but does appear to
! 223: * reliably return 0xffff
! 224: */
! 225: for (i = 4, echocount = 2, ffffcount = 0; i <= 5; i++) {
! 226: if ((iicprobew(LM75TEMP) & mask) != (iicprobew(i) & mask) ||
! 227: (iicprobew(LM75Thyst) & mask) != (iicprobew(i) & mask) ||
! 228: (iicprobew(LM75Tos) & mask) != (iicprobew(i) & mask))
! 229: echocount--;
! 230: if (iicprobew(i) == 0xffff)
! 231: ffffcount++;
! 232: }
! 233:
! 234: /* Make sure either both registers echo, or neither does */
! 235: if (echocount == 1 || ffffcount == 1)
! 236: return (NULL);
! 237:
! 238: echoreg45 = (echocount == 0) ? 0 : 1;
! 239: ffffreg45 = (ffffcount == 0) ? 0 : 1;
! 240:
! 241: /*
! 242: * If we find that 4 and 5 are not echos, and don't return 0xffff
! 243: * then based on whether the echo test of registers 6 and 7
! 244: * succeeded or not, we may have an LM77
! 245: */
! 246: if (echoreg45 == 0 && ffffreg45 == 0 && echoreg67 == 1) {
! 247: mask = LM77TMASK;
! 248:
! 249: /* mask size changed, must re-read for the next checks */
! 250: thyst = iicprobew(LM75Thyst) & mask;
! 251: tos = iicprobew(LM75Tos) & mask;
! 252: tlow = iicprobew(LM77Tlow) & mask;
! 253: thigh = iicprobew(LM77Thigh) & mask;
! 254: }
! 255:
! 256: /* a real LM75/LM75A/LM77 repeats its registers.... */
! 257: for (i = 0x08; i <= 0xf8; i += 8) {
! 258: if (conf != iicprobenc(LM75CONF + i) ||
! 259: thyst != (iicprobew(LM75Thyst + i) & mask) ||
! 260: tos != (iicprobew(LM75Tos + i) & mask))
! 261: return (NULL);
! 262:
! 263: /*
! 264: * Check that the repeated registers 0x06 and 0x07 still
! 265: * either echo or return 0xffff
! 266: */
! 267: if (echoreg67 == 1) {
! 268: tos = iicprobew(LM75Tos) & mask;
! 269: if (tos != (iicprobew(0x06 + i) & mask) ||
! 270: tos != (iicprobew(0x07 + i) & mask))
! 271: return (NULL);
! 272: } else if (ffffreg67 == 1)
! 273: if (iicprobew(0x06 + i) != 0xffff ||
! 274: iicprobew(0x07 + i) != 0xffff)
! 275: return (NULL);
! 276:
! 277: /*
! 278: * Check that the repeated registers 0x04 and 0x05 still
! 279: * either echo or return 0xffff. If they do neither, and
! 280: * registers 0x06 and 0x07 echo, then we will be probing
! 281: * for an LM77, so make sure those still repeat
! 282: */
! 283: if (echoreg45 == 1) {
! 284: tos = iicprobew(LM75Tos) & mask;
! 285: if (tos != (iicprobew(LM77Tlow + i) & mask) ||
! 286: tos != (iicprobew(LM77Thigh + i) & mask))
! 287: return (NULL);
! 288: } else if (ffffreg45 == 1) {
! 289: if (iicprobew(LM77Tlow + i) != 0xffff ||
! 290: iicprobew(LM77Thigh + i) != 0xffff)
! 291: return (NULL);
! 292: } else if (echoreg67 == 1)
! 293: if (tlow != (iicprobew(LM77Tlow + i) & mask) ||
! 294: thigh != (iicprobew(LM77Thigh + i) & mask))
! 295: return (NULL);
! 296: }
! 297:
! 298: /*
! 299: * Given that we now know how the first eight registers behave and
! 300: * that this behaviour is consistently repeated, we can now use
! 301: * the following table:
! 302: *
! 303: * echoreg67 | echoreg45 | ffffreg67 | ffffreg45 | chip
! 304: * ----------+-----------+-----------+-----------+------
! 305: * 1 | 1 | 0 | 0 | LM75
! 306: * 1 | 0 | 0 | 0 | LM77
! 307: * 0 | 0 | 1 | 1 | LM75A
! 308: */
! 309:
! 310: /* Convert the various flags into a single score */
! 311: score = (echoreg67 << 3) + (echoreg45 << 2) + (ffffreg67 << 1) +
! 312: ffffreg45;
! 313:
! 314: switch (score) {
! 315: case 12:
! 316: return ("lm75");
! 317: case 8:
! 318: return ("lm77");
! 319: case 3:
! 320: return ("lm75a");
! 321: default:
! 322: #if defined(I2C_DEBUG)
! 323: printf("lm75probe: unknown chip, scored %d\n", score);
! 324: #endif /* defined(I2C_DEBUG) */
! 325: return (NULL);
! 326: }
! 327: }
! 328:
! 329: char *
! 330: adm1032cloneprobe(u_int8_t addr)
! 331: {
! 332: if (addr == 0x18 || addr == 0x1a || addr == 0x29 ||
! 333: addr == 0x2b || addr == 0x4c || addr == 0x4e) {
! 334: u_int8_t reg, val;
! 335: int zero = 0, copy = 0;
! 336:
! 337: val = iicprobe(0x00);
! 338: for (reg = 0x00; reg < 0x09; reg++) {
! 339: if (iicprobe(reg) == 0xff)
! 340: return (NULL);
! 341: if (iicprobe(reg) == 0x00)
! 342: zero++;
! 343: if (val == iicprobe(reg))
! 344: copy++;
! 345: }
! 346: if (zero > 6 || copy > 6)
! 347: return (NULL);
! 348: val = iicprobe(0x09);
! 349: for (reg = 0x0a; reg < 0xfc; reg++) {
! 350: if (iicprobe(reg) != val)
! 351: return (NULL);
! 352: }
! 353: /* 0xfe may be Maxim, or some other vendor */
! 354: if (iicprobe(0xfe) == 0x4d)
! 355: return ("max1617");
! 356: /*
! 357: * "xeontemp" is the name we choose for clone chips
! 358: * which have all sorts of buggy bus interactions, such
! 359: * as those we just probed. Why?
! 360: * Intel is partly to blame for this situation.
! 361: */
! 362: return ("xeontemp");
! 363: }
! 364: return (NULL);
! 365: }
! 366:
! 367: void
! 368: iic_ignore_addr(u_int8_t addr)
! 369: {
! 370: int i;
! 371:
! 372: for (i = 0; i < sizeof(ignore_addrs); i++)
! 373: if (ignore_addrs[i] == 0) {
! 374: ignore_addrs[i] = addr;
! 375: return;
! 376: }
! 377: }
! 378:
! 379: #if defined(I2C_DEBUG) || defined(I2C_VERBOSE)
! 380: void
! 381: iic_dump(struct device *dv, u_int8_t addr, char *name)
! 382: {
! 383: static u_int8_t iicvalcnt[256];
! 384: u_int8_t val, val2, max;
! 385: int i, cnt = 0;
! 386:
! 387: /*
! 388: * Don't bother printing the most often repeated register
! 389: * value, since it is often weird devices that respond
! 390: * incorrectly, busted controller driver, or in the worst
! 391: * case, it in mosts cases, the value 0xff.
! 392: */
! 393: bzero(iicvalcnt, sizeof iicvalcnt);
! 394: val = iicprobe(0);
! 395: iicvalcnt[val]++;
! 396: for (i = 1; i <= 0xff; i++) {
! 397: val2 = iicprobe(i);
! 398: iicvalcnt[val2]++;
! 399: if (val == val2)
! 400: cnt++;
! 401: }
! 402:
! 403: for (val = max = i = 0; i <= 0xff; i++)
! 404: if (max < iicvalcnt[i]) {
! 405: max = iicvalcnt[i];
! 406: val = i;
! 407: }
! 408:
! 409: if (cnt <= 254) {
! 410: printf("%s: addr 0x%x", dv->dv_xname, addr);
! 411: for (i = 0; i <= 0xff; i++) {
! 412: if (iicprobe(i) != val)
! 413: printf(" %02x=%02x", i, iicprobe(i));
! 414: }
! 415: if (name)
! 416: printf(": %s", name);
! 417: printf("\n");
! 418: }
! 419: }
! 420: #endif /* defined(I2C_DEBUG) || defined(I2C_VERBOSE) */
! 421:
! 422: void
! 423: iic_probe(struct device *self, struct i2cbus_attach_args *iba, u_int8_t addr)
! 424: {
! 425: struct i2c_attach_args ia;
! 426: char *name = NULL;
! 427: int i;
! 428:
! 429: for (i = 0; i < sizeof(ignore_addrs); i++)
! 430: if (ignore_addrs[i] == addr)
! 431: return;
! 432:
! 433: iicprobeinit(iba, addr);
! 434: skip_fc = 0;
! 435:
! 436: /*
! 437: * Many I2C/SMBus devices use register 0x3e as a vendor ID
! 438: * register.
! 439: */
! 440: switch (iicprobe(0x3e)) {
! 441: case 0x01: /* National Semiconductor */
! 442: /*
! 443: * Some newer National products use a vendor code at
! 444: * 0x3e of 0x01, and then 0x3f contains a product code
! 445: * But some older products are missing a product code,
! 446: * and contain who knows what in that register. We assume
! 447: * that some employee was smart enough to keep the numbers
! 448: * unique.
! 449: */
! 450: if ((addr == 0x2c || addr == 0x2d || addr == 0x2e) &&
! 451: iicprobe(0x3f) == 0x73)
! 452: name = "lm93";
! 453: else if ((addr == 0x2c || addr == 0x2d || addr == 0x2e) &&
! 454: iicprobe(0x3f) == 0x68)
! 455: name = "lm96000"; /* adt7460 compat? */
! 456: else if ((addr == 0x2c || addr == 0x2d || addr == 0x2e) &&
! 457: (iicprobe(0x3f) == 0x60 || iicprobe(0x3f) == 0x62))
! 458: name = "lm85"; /* lm85C/B == adt7460 compat */
! 459: else if ((addr & 0x7c) == 0x2c && /* addr 0b01011xx */
! 460: iicprobe(0x48) == addr &&
! 461: (iicprobe(0x3f) == 0x03 || iicprobe(0x3f) == 0x04) &&
! 462: (iicprobe(0x40) & 0x80) == 0x00)
! 463: name = "lm81";
! 464: break;
! 465: case 0x02: /* National Semiconductor? */
! 466: if ((iicprobe(0x3f) & 0xfc) == 0x04)
! 467: name = "lm87"; /* complete check */
! 468: break;
! 469: case 0x23: /* Analog Devices? */
! 470: if (iicprobe(0x48) == addr &&
! 471: (iicprobe(0x40) & 0x80) == 0x00 &&
! 472: (addr & 0x7c) == 0x2c)
! 473: name = "adm9240"; /* lm87 clone */
! 474: break;
! 475: case 0x41: /* Analog Devices */
! 476: /*
! 477: * Newer chips have a valid 0x3d product number, while
! 478: * older ones sometimes encoded the product into the
! 479: * upper half of the "step register" at 0x3f.
! 480: */
! 481: if ((addr == 0x2c || addr == 0x2e || addr == 0x2f) &&
! 482: iicprobe(0x3d) == 0x70)
! 483: name = "adt7470";
! 484: else if ((addr == 0x2c || addr == 0x2d || addr == 0x2e) &&
! 485: iicprobe(0x3d) == 0x76)
! 486: name = "adt7476";
! 487: else if (addr == 0x2e && iicprobe(0x3d) == 0x75)
! 488: name = "adt7475";
! 489: else if (iicprobe(0x3d) == 0x27 &&
! 490: (iicprobe(0x3f) == 0x60 || iicprobe(0x3f) == 0x6a))
! 491: name = "adm1027"; /* complete check */
! 492: else if (iicprobe(0x3d) == 0x27 &&
! 493: (iicprobe(0x3f) == 0x62 || iicprobe(0x3f) == 0x6a))
! 494: name = "adt7460"; /* complete check */
! 495: else if (addr == 0x2e &&
! 496: iicprobe(0x3d) == 0x68 && (iicprobe(0x3f) & 0xf0) == 0x70)
! 497: name = "adt7467";
! 498: else if (iicprobe(0x3d) == 0x33)
! 499: name = "adm1033";
! 500: else if ((addr == 0x2c || addr == 0x2d || addr == 0x2e) &&
! 501: iicprobe(0x3d) == 0x30 &&
! 502: (iicprobe(0x01) & 0x80) == 0x00 &&
! 503: (iicprobe(0x0d) & 0x70) == 0x00 &&
! 504: (iicprobe(0x0e) & 0x70) == 0x00)
! 505: /*
! 506: * Revision 3 seems to be an adm1031 with
! 507: * remote diode 2 shorted. Therefore we
! 508: * cannot assume the reserved/unused bits of
! 509: * register 0x03 and 0x06 are set to zero.
! 510: */
! 511: name = "adm1030"; /* complete check */
! 512: else if ((addr == 0x2c || addr == 0x2d || addr == 0x2e) &&
! 513: iicprobe(0x3d) == 0x31 &&
! 514: (iicprobe(0x01) & 0x80) == 0x00 &&
! 515: (iicprobe(0x0d) & 0x70) == 0x00 &&
! 516: (iicprobe(0x0e) & 0x70) == 0x00 &&
! 517: (iicprobe(0x0f) & 0x70) == 0x00)
! 518: name = "adm1031"; /* complete check */
! 519: else if ((addr & 0x7c) == 0x2c && /* addr 0b01011xx */
! 520: (iicprobe(0x3f) & 0xf0) == 0x20 &&
! 521: (iicprobe(0x40) & 0x80) == 0x00 &&
! 522: (iicprobe(0x41) & 0xc0) == 0x00 &&
! 523: (iicprobe(0x42) & 0xbc) == 0x00)
! 524: name = "adm1025"; /* complete check */
! 525: else if ((addr & 0x7c) == 0x2c && /* addr 0b01011xx */
! 526: (iicprobe(0x3f) & 0xf0) == 0x10 &&
! 527: (iicprobe(0x40) & 0x80) == 0x00)
! 528: name = "adm1024"; /* complete check */
! 529: else if ((iicprobe(0xff) & 0xf0) == 0x30)
! 530: name = "adm1023";
! 531: else if (addr == 0x2e &&
! 532: (iicprobe(0x3f) & 0xf0) == 0xd0 &&
! 533: (iicprobe(0x40) & 0x80) == 0x00)
! 534: name = "adm1028"; /* adm1022 clone? */
! 535: else if ((addr == 0x2c || addr == 0x2e || addr == 0x2f) &&
! 536: (iicprobe(0x3f) & 0xf0) == 0xc0 &&
! 537: (iicprobe(0x40) & 0x80) == 0x00)
! 538: name = "adm1022";
! 539: break;
! 540: case 0x49: /* Texas Instruments */
! 541: if ((addr == 0x2c || addr == 0x2e || addr == 0x2f) &&
! 542: (iicprobe(0x3f) & 0xf0) == 0xc0 &&
! 543: (iicprobe(0x40) & 0x80) == 0x00)
! 544: name = "thmc50"; /* adm1022 clone */
! 545: break;
! 546: case 0x55: /* SMSC */
! 547: if ((addr & 0x7c) == 0x2c && /* addr 0b01011xx */
! 548: iicprobe(0x3f) == 0x20 &&
! 549: (iicprobe(0x47) & 0x70) == 0x00 &&
! 550: (iicprobe(0x49) & 0xfe) == 0x80)
! 551: name = "47m192"; /* adm1025 compat */
! 552: break;
! 553: case 0x5c: /* SMSC */
! 554: if ((addr == 0x2c || addr == 0x2d || addr == 0x2e) &&
! 555: (iicprobe(0x3f) & 0xf0) == 0x60)
! 556: name = "emc6d100"; /* emc6d101, emc6d102, emc6d103 */
! 557: else if ((addr == 0x2c || addr == 0x2d || addr == 0x2e) &&
! 558: (iicprobe(0x3f) & 0xf0) == 0x80)
! 559: name = "sch5017";
! 560: else if ((addr == 0x2c || addr == 0x2d || addr == 0x2e) &&
! 561: (iicprobe(0x3f) & 0xf0) == 0xb0)
! 562: name = "emc6w201";
! 563: break;
! 564: case 0xa1: /* Philips */
! 565: if ((iicprobe(0x3f) & 0xf0) == 0x20 &&
! 566: (iicprobe(0x40) & 0x80) == 0x00 &&
! 567: (iicprobe(0x41) & 0xc0) == 0x00 &&
! 568: (iicprobe(0x42) & 0xbc) == 0x00)
! 569: name = "ne1619"; /* adm1025 compat */
! 570: break;
! 571: case 0xda: /* Dallas Semiconductor */
! 572: if (iicprobe(0x3f) == 0x01 && iicprobe(0x48) == addr &&
! 573: (iicprobe(0x40) & 0x80) == 0x00)
! 574: name = "ds1780"; /* lm87 clones */
! 575: break;
! 576: }
! 577:
! 578: switch (iicprobe(0x4e)) {
! 579: case 0x41: /* Analog Devices */
! 580: if ((addr == 0x48 || addr == 0x4a || addr == 0x4b) &&
! 581: (iicprobe(0x4d) == 0x03 || iicprobe(0x4d) == 0x08 ||
! 582: iicprobe(0x4d) == 0x07))
! 583: name = "adt7516"; /* adt7517, adt7519 */
! 584: break;
! 585: }
! 586:
! 587: switch (iicprobe(0xfe)) {
! 588: case 0x01: /* National Semiconductor */
! 589: if (addr == 0x4c &&
! 590: iicprobe(0xff) == 0x41 && (iicprobe(0x03) & 0x18) == 0 &&
! 591: iicprobe(0x04) <= 0x0f && (iicprobe(0xbf) & 0xf8) == 0)
! 592: name = "lm63";
! 593: else if (addr == 0x4c &&
! 594: iicprobe(0xff) == 0x11 && (iicprobe(0x03) & 0x2a) == 0 &&
! 595: iicprobe(0x04) <= 0x09 && (iicprobe(0xbf) & 0xf8) == 0)
! 596: name = "lm86";
! 597: else if (addr == 0x4c &&
! 598: iicprobe(0xff) == 0x31 && (iicprobe(0x03) & 0x2a) == 0 &&
! 599: iicprobe(0x04) <= 0x09 && (iicprobe(0xbf) & 0xf8) == 0)
! 600: name = "lm89"; /* or lm99 */
! 601: else if (addr == 0x4d &&
! 602: iicprobe(0xff) == 0x34 && (iicprobe(0x03) & 0x2a) == 0 &&
! 603: iicprobe(0x04) <= 0x09 && (iicprobe(0xbf) & 0xf8) == 0)
! 604: name = "lm89-1"; /* or lm99-1 */
! 605: else if (addr == 0x4c &&
! 606: iicprobe(0xff) == 0x21 && (iicprobe(0x03) & 0x2a) == 0 &&
! 607: iicprobe(0x04) <= 0x09 && (iicprobe(0xbf) & 0xf8) == 0)
! 608: name = "lm90";
! 609: break;
! 610: case 0x23: /* Genesys Logic? */
! 611: if ((addr == 0x4c) &&
! 612: (iicprobe(0x03) & 0x3f) == 0x00 && iicprobe(0x04) <= 0x08)
! 613: /*
! 614: * Genesys Logic doesn't make the datasheet
! 615: * for the GL523SM publically available, so
! 616: * the checks above are nothing more than a
! 617: * (conservative) educated guess.
! 618: */
! 619: name = "gl523sm";
! 620: break;
! 621: case 0x41: /* Analog Devices */
! 622: if ((addr == 0x4c || addr == 0x4d) &&
! 623: iicprobe(0xff) == 0x51 &&
! 624: (iicprobe(0x03) & 0x1f) == 0x04 &&
! 625: iicprobe(0x04) <= 0x0a) {
! 626: /* If not in adm1032 compatibility mode. */
! 627: name = "adt7461";
! 628: } else if ((addr == 0x18 || addr == 0x19 || addr == 0x1a ||
! 629: addr == 0x29 || addr == 0x2a || addr == 0x2b ||
! 630: addr == 0x4c || addr == 0x4d || addr == 0x4e) &&
! 631: (iicprobe(0xff) & 0xf0) == 0x00 &&
! 632: (iicprobe(0x03) & 0x3f) == 0x00 &&
! 633: iicprobe(0x04) <= 0x07) {
! 634: name = "adm1021";
! 635: skip_fc = 1;
! 636: } else if ((addr == 0x18 || addr == 0x19 || addr == 0x1a ||
! 637: addr == 0x29 || addr == 0x2a || addr == 0x2b ||
! 638: addr == 0x4c || addr == 0x4d || addr == 0x4e) &&
! 639: (iicprobe(0xff) & 0xf0) == 0x30 &&
! 640: (iicprobe(0x03) & 0x3f) == 0x00 &&
! 641: iicprobe(0x04) <= 0x07) {
! 642: name = "adm1023"; /* or adm1021a */
! 643: skip_fc = 1;
! 644: } else if ((addr == 0x4c || addr == 0x4d || addr == 0x4e) &&
! 645: (iicprobe(0x03) & 0x3f) == 0x00 &&
! 646: iicprobe(0x04) <= 0x0a) {
! 647: name = "adm1032"; /* or adm1020 */
! 648: skip_fc = 1;
! 649: }
! 650: break;
! 651: case 0x47: /* Global Mixed-mode Technology */
! 652: if (addr == 0x4c && iicprobe(0xff) == 0x01 &&
! 653: (iicprobe(0x03) & 0x3f) == 0x00 && iicprobe(0x04) <= 0x08)
! 654: name = "g781";
! 655: if (addr == 0x4d && iicprobe(0xff) == 0x03 &&
! 656: (iicprobe(0x03) & 0x3f) == 0x00 && iicprobe(0x04) <= 0x08)
! 657: name = "g781-1";
! 658: break;
! 659: case 0x4d: /* Maxim */
! 660: if ((addr == 0x18 || addr == 0x19 || addr == 0x1a ||
! 661: addr == 0x29 || addr == 0x2a || addr == 0x2b ||
! 662: addr == 0x4c || addr == 0x4d || addr == 0x4e) &&
! 663: iicprobe(0xff) == 0x08 && (iicprobe(0x02) & 0x03) == 0 &&
! 664: (iicprobe(0x03) & 0x07) == 0 && iicprobe(0x04) <= 0x08)
! 665: name = "max6690";
! 666: else if ((addr == 0x4c || addr == 0x4d || addr == 0x4e) &&
! 667: iicprobe(0xff) == 0x59 && (iicprobe(0x03) & 0x1f) == 0 &&
! 668: iicprobe(0x04) <= 0x07)
! 669: name = "max6646"; /* max6647/8/9, max6692 */
! 670: else if ((addr == 0x4c || addr == 0x4d || addr == 0x4e) &&
! 671: (iicprobe(0x02) & 0x2b) == 0 &&
! 672: (iicprobe(0x03) & 0x0f) == 0 && iicprobe(0x04) <= 0x09) {
! 673: name = "max6657"; /* max6658, max6659 */
! 674: skip_fc = 1;
! 675: } else if ((addr >= 0x48 && addr <= 0x4f) &&
! 676: (iicprobe(0x02) & 0x2b) == 0 &&
! 677: (iicprobe(0x03) & 0x0f) == 0)
! 678: name = "max6642";
! 679: break;
! 680: }
! 681:
! 682: if (addr == iicprobe(0x48) &&
! 683: ((iicprobe(0x4f) == 0x5c && (iicprobe(0x4e) & 0x80)) ||
! 684: (iicprobe(0x4f) == 0xa3 && !(iicprobe(0x4e) & 0x80)))) {
! 685: /*
! 686: * We could toggle 0x4e bit 0x80, then re-read 0x4f to
! 687: * see if the value changes to 0xa3 (indicating Winbond).
! 688: * But we are trying to avoid writes.
! 689: */
! 690: if ((iicprobe(0x4e) & 0x07) == 0) {
! 691: switch (iicprobe(0x58)) {
! 692: case 0x10:
! 693: case 0x11: /* rev 2? */
! 694: name = "w83781d";
! 695: break;
! 696: case 0x21:
! 697: name = "w83627hf";
! 698: break;
! 699: case 0x30:
! 700: name = "w83782d";
! 701: break;
! 702: case 0x31:
! 703: name = "as99127f"; /* rev 2 */
! 704: break;
! 705: case 0x40:
! 706: name = "w83783s";
! 707: break;
! 708: case 0x71:
! 709: name = "w83791d";
! 710: break;
! 711: case 0x72:
! 712: name = "w83791sd";
! 713: break;
! 714: case 0x7a:
! 715: name = "w83792d";
! 716: break;
! 717: }
! 718: } else {
! 719: /*
! 720: * The BIOS left the chip in a non-zero
! 721: * register bank. Assume it's a W83781D and
! 722: * let lm(4) sort out the real model.
! 723: */
! 724: name = "w83781d";
! 725: }
! 726: } else if (addr == iicprobe (0x4a) && iicprobe(0x4e) == 0x50 &&
! 727: iicprobe(0x4c) == 0xa3 && iicprobe(0x4d) == 0x5c) {
! 728: name = "w83l784r";
! 729: } else if (addr == 0x2d && iicprobe(0x4e) == 0x60 &&
! 730: iicprobe(0x4c) == 0xa3 && iicprobe(0x4d) == 0x5c) {
! 731: name = "w83l785r";
! 732: } else if (addr == 0x2e && iicprobe(0x4e) == 0x70 &&
! 733: iicprobe(0x4c) == 0xa3 && iicprobe(0x4d) == 0x5c) {
! 734: name = "w83l785ts-l";
! 735: } else if (addr >= 0x28 && addr <= 0x2f &&
! 736: iicprobe(0x4f) == 0x12 && (iicprobe(0x4e) & 0x80)) {
! 737: /*
! 738: * We could toggle 0x4e bit 0x80, then re-read 0x4f to
! 739: * see if the value changes to 0xc3 (indicating ASUS).
! 740: * But we are trying to avoid writes.
! 741: */
! 742: if (iicprobe(0x58) == 0x31)
! 743: name = "as99127f"; /* rev 1 */
! 744: } else if ((addr == 0x2d || addr == 0x2e) &&
! 745: addr * 2 == iicprobe(0x04) &&
! 746: iicprobe(0x5d) == 0x19 && iicprobe(0x5e) == 0x34 &&
! 747: iicprobe(0x5a) == 0x03 && iicprobe(0x5b) == 0x06) {
! 748: name = "f75375"; /* Fintek */
! 749: } else if (addr == 0x2d &&
! 750: ((iicprobe(0x4f) == 0x06 && (iicprobe(0x4e) & 0x80)) ||
! 751: (iicprobe(0x4f) == 0x94 && !(iicprobe(0x4e) & 0x80)))) {
! 752: /*
! 753: * We could toggle 0x4e bit 0x80, then re-read 0x4f to
! 754: * see if the value changes to 0x94 (indicating ASUS).
! 755: * But we are trying to avoid writes.
! 756: *
! 757: * NB. we won't match if the BIOS has selected a non-zero
! 758: * register bank (set via 0x4e). We could select bank 0 so
! 759: * we see the right registers, but that would require a
! 760: * write. In general though, we bet no BIOS would leave us
! 761: * in the wrong state.
! 762: */
! 763: if ((iicprobe(0x58) & 0x7f) == 0x31 &&
! 764: (iicprobe(0x4e) & 0xf) == 0x00)
! 765: name = "asb100";
! 766: } else if ((addr == 0x2c || addr == 0x2d) &&
! 767: iicprobe(0x00) == 0x80 &&
! 768: (iicprobe(0x01) == 0x00 || iicprobe(0x01) == 0x80) &&
! 769: iicprobe(0x02) == 0x00 && (iicprobe(0x03) & 0x83) == 0x00 &&
! 770: (iicprobe(0x0f) & 0x07) == 0x00 &&
! 771: (iicprobe(0x11) & 0x80) == 0x00 &&
! 772: (iicprobe(0x12) & 0x80) == 0x00) {
! 773: /*
! 774: * The GL518SM is really crappy. It has both byte and
! 775: * word registers, and reading a word register with a
! 776: * byte read command will make the device crap out and
! 777: * hang the bus. This has nasty consequences on some
! 778: * machines, like preventing warm reboots. The word
! 779: * registers are 0x07 through 0x0c, so make sure the
! 780: * checks above don't access those registers. We
! 781: * don't want to do this check right up front though
! 782: * since this chip is somewhat hard to detect (which
! 783: * is why we check for every single fixed bit it has).
! 784: */
! 785: name = "gl518sm";
! 786: } else if ((addr == 0x2c || addr == 0x2d || addr == 0x2e) &&
! 787: iicprobe(0x16) == 0x41 && ((iicprobe(0x17) & 0xf0) == 0x40)) {
! 788: name = "adm1026";
! 789: } else if (name == NULL &&
! 790: (addr & 0x78) == 0x48) { /* addr 0b1001xxx */
! 791: name = lm75probe();
! 792: }
! 793: #if 0
! 794: /*
! 795: * XXX This probe needs to be improved; the driver does some
! 796: * dangerous writes.
! 797: */
! 798: if (name == NULL && (addr & 0x7c) == 0x48 && /* addr 0b1001xxx */
! 799: (iicprobew(0xaa) & 0x0007) == 0x0000 &&
! 800: (iicprobew(0xa1) & 0x0007) == 0x0000 &&
! 801: (iicprobew(0xa2) & 0x0007) == 0x0000 &&
! 802: (iicprobe(0xac) & 0x10) == 0x00) {
! 803: if ((iicprobe(0xac) & 0x7e) == 0x0a &&
! 804: iicprobe(0xab) == 0x00 && iicprobe(0xa8) == 0x00)
! 805: name = "ds1624";
! 806: else if ((iicprobe(0xac) & 0x7e) == 0x0c)
! 807: name = "ds1631"; /* terrible probe */
! 808: else if ((iicprobe(0xac) & 0x2e) == 0x2e)
! 809: name = "ds1721"; /* terrible probe */
! 810: }
! 811: #endif
! 812: if (name == NULL && (addr & 0xf8) == 0x28 && iicprobe(0x48) == addr &&
! 813: (iicprobe(0x00) & 0x90) == 0x10 && iicprobe(0x58) == 0x90) {
! 814: if (iicprobe(0x5b) == 0x12)
! 815: name = "it8712";
! 816: else if (iicprobe(0x5b) == 0x00)
! 817: name = "it8712f-a"; /* sis950 too */
! 818: }
! 819:
! 820: if (name == NULL && iicprobe(0x48) == addr &&
! 821: (iicprobe(0x40) & 0x80) == 0x00 && iicprobe(0x58) == 0xac)
! 822: name = "mtp008";
! 823:
! 824: if (name == NULL) {
! 825: name = adm1032cloneprobe(addr);
! 826: if (name)
! 827: skip_fc = 1;
! 828: }
! 829:
! 830: #ifdef I2C_DEBUG
! 831: iic_dump(self, addr, name);
! 832: #endif /* I2C_DEBUG */
! 833:
! 834: #if !defined(I2C_VERBOSE) && !defined(I2C_DEBUG)
! 835: if (name == NULL)
! 836: name = "unknown";
! 837: #endif
! 838:
! 839: if (name) {
! 840: memset(&ia, 0, sizeof(ia));
! 841: ia.ia_tag = iba->iba_tag;
! 842: ia.ia_addr = addr;
! 843: ia.ia_size = 1;
! 844: ia.ia_name = name;
! 845: if (config_found(self, &ia, iic_print))
! 846: return;
! 847: }
! 848:
! 849: #if defined(I2C_VERBOSE) && !defined(I2C_DEBUG)
! 850: iic_dump(self, addr, name);
! 851: #endif /* defined(I2C_VERBOSE) && !defined(I2C_DEBUG) */
! 852: }
! 853:
! 854: void
! 855: iic_scan(struct device *self, struct i2cbus_attach_args *iba)
! 856: {
! 857: i2c_tag_t ic = iba->iba_tag;
! 858: u_int8_t cmd = 0, addr;
! 859: int i;
! 860:
! 861: bzero(ignore_addrs, sizeof(ignore_addrs));
! 862: for (i = 0; i < sizeof(probe_addrs)/sizeof(probe_addrs[0]); i++) {
! 863: for (addr = probe_addrs[i].start; addr <= probe_addrs[i].end;
! 864: addr++) {
! 865: /* Perform RECEIVE BYTE command */
! 866: iic_acquire_bus(ic, 0);
! 867: if (iic_exec(ic, I2C_OP_READ_WITH_STOP, addr,
! 868: &cmd, 1, NULL, 0, 0) == 0) {
! 869: iic_release_bus(ic, 0);
! 870:
! 871: /* Some device exists, so go scope it out */
! 872: iic_probe(self, iba, addr);
! 873:
! 874: iic_acquire_bus(ic, 0);
! 875:
! 876: }
! 877: iic_release_bus(ic, 0);
! 878: }
! 879: }
! 880: }
CVSweb