diff options
Diffstat (limited to 'drivers/hwmon/lm85.c')
| -rw-r--r-- | drivers/hwmon/lm85.c | 660 |
1 files changed, 304 insertions, 356 deletions
diff --git a/drivers/hwmon/lm85.c b/drivers/hwmon/lm85.c index b0129a54e1a6..2b4b419273fe 100644 --- a/drivers/hwmon/lm85.c +++ b/drivers/hwmon/lm85.c | |||
| @@ -121,7 +121,6 @@ enum chips { | |||
| 121 | #define EMC6D102_REG_EXTEND_ADC3 0x87 | 121 | #define EMC6D102_REG_EXTEND_ADC3 0x87 |
| 122 | #define EMC6D102_REG_EXTEND_ADC4 0x88 | 122 | #define EMC6D102_REG_EXTEND_ADC4 0x88 |
| 123 | 123 | ||
| 124 | |||
| 125 | /* | 124 | /* |
| 126 | * Conversions. Rounding and limit checking is only done on the TO_REG | 125 | * Conversions. Rounding and limit checking is only done on the TO_REG |
| 127 | * variants. Note that you should be a bit careful with which arguments | 126 | * variants. Note that you should be a bit careful with which arguments |
| @@ -155,7 +154,7 @@ static inline u16 FAN_TO_REG(unsigned long val) | |||
| 155 | 154 | ||
| 156 | /* Temperature is reported in .001 degC increments */ | 155 | /* Temperature is reported in .001 degC increments */ |
| 157 | #define TEMP_TO_REG(val) \ | 156 | #define TEMP_TO_REG(val) \ |
| 158 | clamp_val(SCALE(val, 1000, 1), -127, 127) | 157 | DIV_ROUND_CLOSEST(clamp_val((val), -127000, 127000), 1000) |
| 159 | #define TEMPEXT_FROM_REG(val, ext) \ | 158 | #define TEMPEXT_FROM_REG(val, ext) \ |
| 160 | SCALE(((val) << 4) + (ext), 16, 1000) | 159 | SCALE(((val) << 4) + (ext), 16, 1000) |
| 161 | #define TEMP_FROM_REG(val) ((val) * 1000) | 160 | #define TEMP_FROM_REG(val) ((val) * 1000) |
| @@ -189,7 +188,7 @@ static const int lm85_range_map[] = { | |||
| 189 | 13300, 16000, 20000, 26600, 32000, 40000, 53300, 80000 | 188 | 13300, 16000, 20000, 26600, 32000, 40000, 53300, 80000 |
| 190 | }; | 189 | }; |
| 191 | 190 | ||
| 192 | static int RANGE_TO_REG(int range) | 191 | static int RANGE_TO_REG(long range) |
| 193 | { | 192 | { |
| 194 | int i; | 193 | int i; |
| 195 | 194 | ||
| @@ -211,7 +210,7 @@ static const int adm1027_freq_map[8] = { /* 1 Hz */ | |||
| 211 | 11, 15, 22, 29, 35, 44, 59, 88 | 210 | 11, 15, 22, 29, 35, 44, 59, 88 |
| 212 | }; | 211 | }; |
| 213 | 212 | ||
| 214 | static int FREQ_TO_REG(const int *map, int freq) | 213 | static int FREQ_TO_REG(const int *map, unsigned long freq) |
| 215 | { | 214 | { |
| 216 | int i; | 215 | int i; |
| 217 | 216 | ||
| @@ -303,7 +302,8 @@ struct lm85_autofan { | |||
| 303 | * The structure is dynamically allocated. | 302 | * The structure is dynamically allocated. |
| 304 | */ | 303 | */ |
| 305 | struct lm85_data { | 304 | struct lm85_data { |
| 306 | struct device *hwmon_dev; | 305 | struct i2c_client *client; |
| 306 | const struct attribute_group *groups[6]; | ||
| 307 | const int *freq_map; | 307 | const int *freq_map; |
| 308 | enum chips type; | 308 | enum chips type; |
| 309 | 309 | ||
| @@ -334,44 +334,235 @@ struct lm85_data { | |||
| 334 | struct lm85_zone zone[3]; | 334 | struct lm85_zone zone[3]; |
| 335 | }; | 335 | }; |
| 336 | 336 | ||
| 337 | static int lm85_detect(struct i2c_client *client, struct i2c_board_info *info); | 337 | static int lm85_read_value(struct i2c_client *client, u8 reg) |
| 338 | static int lm85_probe(struct i2c_client *client, | 338 | { |
| 339 | const struct i2c_device_id *id); | 339 | int res; |
| 340 | static int lm85_remove(struct i2c_client *client); | ||
| 341 | 340 | ||
| 342 | static int lm85_read_value(struct i2c_client *client, u8 reg); | 341 | /* What size location is it? */ |
| 343 | static void lm85_write_value(struct i2c_client *client, u8 reg, int value); | 342 | switch (reg) { |
| 344 | static struct lm85_data *lm85_update_device(struct device *dev); | 343 | case LM85_REG_FAN(0): /* Read WORD data */ |
| 344 | case LM85_REG_FAN(1): | ||
| 345 | case LM85_REG_FAN(2): | ||
| 346 | case LM85_REG_FAN(3): | ||
| 347 | case LM85_REG_FAN_MIN(0): | ||
| 348 | case LM85_REG_FAN_MIN(1): | ||
| 349 | case LM85_REG_FAN_MIN(2): | ||
| 350 | case LM85_REG_FAN_MIN(3): | ||
| 351 | case LM85_REG_ALARM1: /* Read both bytes at once */ | ||
| 352 | res = i2c_smbus_read_byte_data(client, reg) & 0xff; | ||
| 353 | res |= i2c_smbus_read_byte_data(client, reg + 1) << 8; | ||
| 354 | break; | ||
| 355 | default: /* Read BYTE data */ | ||
| 356 | res = i2c_smbus_read_byte_data(client, reg); | ||
| 357 | break; | ||
| 358 | } | ||
| 345 | 359 | ||
| 360 | return res; | ||
| 361 | } | ||
| 346 | 362 | ||
| 347 | static const struct i2c_device_id lm85_id[] = { | 363 | static void lm85_write_value(struct i2c_client *client, u8 reg, int value) |
| 348 | { "adm1027", adm1027 }, | 364 | { |
| 349 | { "adt7463", adt7463 }, | 365 | switch (reg) { |
| 350 | { "adt7468", adt7468 }, | 366 | case LM85_REG_FAN(0): /* Write WORD data */ |
| 351 | { "lm85", lm85 }, | 367 | case LM85_REG_FAN(1): |
| 352 | { "lm85b", lm85 }, | 368 | case LM85_REG_FAN(2): |
| 353 | { "lm85c", lm85 }, | 369 | case LM85_REG_FAN(3): |
| 354 | { "emc6d100", emc6d100 }, | 370 | case LM85_REG_FAN_MIN(0): |
| 355 | { "emc6d101", emc6d100 }, | 371 | case LM85_REG_FAN_MIN(1): |
| 356 | { "emc6d102", emc6d102 }, | 372 | case LM85_REG_FAN_MIN(2): |
| 357 | { "emc6d103", emc6d103 }, | 373 | case LM85_REG_FAN_MIN(3): |
| 358 | { "emc6d103s", emc6d103s }, | 374 | /* NOTE: ALARM is read only, so not included here */ |
| 359 | { } | 375 | i2c_smbus_write_byte_data(client, reg, value & 0xff); |
| 360 | }; | 376 | i2c_smbus_write_byte_data(client, reg + 1, value >> 8); |
| 361 | MODULE_DEVICE_TABLE(i2c, lm85_id); | 377 | break; |
| 378 | default: /* Write BYTE data */ | ||
| 379 | i2c_smbus_write_byte_data(client, reg, value); | ||
| 380 | break; | ||
| 381 | } | ||
| 382 | } | ||
| 362 | 383 | ||
| 363 | static struct i2c_driver lm85_driver = { | 384 | static struct lm85_data *lm85_update_device(struct device *dev) |
| 364 | .class = I2C_CLASS_HWMON, | 385 | { |
| 365 | .driver = { | 386 | struct lm85_data *data = dev_get_drvdata(dev); |
| 366 | .name = "lm85", | 387 | struct i2c_client *client = data->client; |
| 367 | }, | 388 | int i; |
| 368 | .probe = lm85_probe, | 389 | |
| 369 | .remove = lm85_remove, | 390 | mutex_lock(&data->update_lock); |
| 370 | .id_table = lm85_id, | 391 | |
| 371 | .detect = lm85_detect, | 392 | if (!data->valid || |
| 372 | .address_list = normal_i2c, | 393 | time_after(jiffies, data->last_reading + LM85_DATA_INTERVAL)) { |
| 373 | }; | 394 | /* Things that change quickly */ |
| 395 | dev_dbg(&client->dev, "Reading sensor values\n"); | ||
| 396 | |||
| 397 | /* | ||
| 398 | * Have to read extended bits first to "freeze" the | ||
| 399 | * more significant bits that are read later. | ||
| 400 | * There are 2 additional resolution bits per channel and we | ||
| 401 | * have room for 4, so we shift them to the left. | ||
| 402 | */ | ||
| 403 | if (data->type == adm1027 || data->type == adt7463 || | ||
| 404 | data->type == adt7468) { | ||
| 405 | int ext1 = lm85_read_value(client, | ||
| 406 | ADM1027_REG_EXTEND_ADC1); | ||
| 407 | int ext2 = lm85_read_value(client, | ||
| 408 | ADM1027_REG_EXTEND_ADC2); | ||
| 409 | int val = (ext1 << 8) + ext2; | ||
| 410 | |||
| 411 | for (i = 0; i <= 4; i++) | ||
| 412 | data->in_ext[i] = | ||
| 413 | ((val >> (i * 2)) & 0x03) << 2; | ||
| 414 | |||
| 415 | for (i = 0; i <= 2; i++) | ||
| 416 | data->temp_ext[i] = | ||
| 417 | (val >> ((i + 4) * 2)) & 0x0c; | ||
| 418 | } | ||
| 419 | |||
| 420 | data->vid = lm85_read_value(client, LM85_REG_VID); | ||
| 421 | |||
| 422 | for (i = 0; i <= 3; ++i) { | ||
| 423 | data->in[i] = | ||
| 424 | lm85_read_value(client, LM85_REG_IN(i)); | ||
| 425 | data->fan[i] = | ||
| 426 | lm85_read_value(client, LM85_REG_FAN(i)); | ||
| 427 | } | ||
| 428 | |||
| 429 | if (!data->has_vid5) | ||
| 430 | data->in[4] = lm85_read_value(client, LM85_REG_IN(4)); | ||
| 431 | |||
| 432 | if (data->type == adt7468) | ||
| 433 | data->cfg5 = lm85_read_value(client, ADT7468_REG_CFG5); | ||
| 374 | 434 | ||
| 435 | for (i = 0; i <= 2; ++i) { | ||
| 436 | data->temp[i] = | ||
| 437 | lm85_read_value(client, LM85_REG_TEMP(i)); | ||
| 438 | data->pwm[i] = | ||
| 439 | lm85_read_value(client, LM85_REG_PWM(i)); | ||
| 440 | |||
| 441 | if (IS_ADT7468_OFF64(data)) | ||
| 442 | data->temp[i] -= 64; | ||
| 443 | } | ||
| 444 | |||
| 445 | data->alarms = lm85_read_value(client, LM85_REG_ALARM1); | ||
| 446 | |||
| 447 | if (data->type == emc6d100) { | ||
| 448 | /* Three more voltage sensors */ | ||
| 449 | for (i = 5; i <= 7; ++i) { | ||
| 450 | data->in[i] = lm85_read_value(client, | ||
| 451 | EMC6D100_REG_IN(i)); | ||
| 452 | } | ||
| 453 | /* More alarm bits */ | ||
| 454 | data->alarms |= lm85_read_value(client, | ||
| 455 | EMC6D100_REG_ALARM3) << 16; | ||
| 456 | } else if (data->type == emc6d102 || data->type == emc6d103 || | ||
| 457 | data->type == emc6d103s) { | ||
| 458 | /* | ||
| 459 | * Have to read LSB bits after the MSB ones because | ||
| 460 | * the reading of the MSB bits has frozen the | ||
| 461 | * LSBs (backward from the ADM1027). | ||
| 462 | */ | ||
| 463 | int ext1 = lm85_read_value(client, | ||
| 464 | EMC6D102_REG_EXTEND_ADC1); | ||
| 465 | int ext2 = lm85_read_value(client, | ||
| 466 | EMC6D102_REG_EXTEND_ADC2); | ||
| 467 | int ext3 = lm85_read_value(client, | ||
| 468 | EMC6D102_REG_EXTEND_ADC3); | ||
| 469 | int ext4 = lm85_read_value(client, | ||
| 470 | EMC6D102_REG_EXTEND_ADC4); | ||
| 471 | data->in_ext[0] = ext3 & 0x0f; | ||
| 472 | data->in_ext[1] = ext4 & 0x0f; | ||
| 473 | data->in_ext[2] = ext4 >> 4; | ||
| 474 | data->in_ext[3] = ext3 >> 4; | ||
| 475 | data->in_ext[4] = ext2 >> 4; | ||
| 476 | |||
| 477 | data->temp_ext[0] = ext1 & 0x0f; | ||
| 478 | data->temp_ext[1] = ext2 & 0x0f; | ||
| 479 | data->temp_ext[2] = ext1 >> 4; | ||
| 480 | } | ||
| 481 | |||
| 482 | data->last_reading = jiffies; | ||
| 483 | } /* last_reading */ | ||
| 484 | |||
| 485 | if (!data->valid || | ||
| 486 | time_after(jiffies, data->last_config + LM85_CONFIG_INTERVAL)) { | ||
| 487 | /* Things that don't change often */ | ||
| 488 | dev_dbg(&client->dev, "Reading config values\n"); | ||
| 489 | |||
| 490 | for (i = 0; i <= 3; ++i) { | ||
| 491 | data->in_min[i] = | ||
| 492 | lm85_read_value(client, LM85_REG_IN_MIN(i)); | ||
| 493 | data->in_max[i] = | ||
| 494 | lm85_read_value(client, LM85_REG_IN_MAX(i)); | ||
| 495 | data->fan_min[i] = | ||
| 496 | lm85_read_value(client, LM85_REG_FAN_MIN(i)); | ||
| 497 | } | ||
| 498 | |||
| 499 | if (!data->has_vid5) { | ||
| 500 | data->in_min[4] = lm85_read_value(client, | ||
| 501 | LM85_REG_IN_MIN(4)); | ||
| 502 | data->in_max[4] = lm85_read_value(client, | ||
| 503 | LM85_REG_IN_MAX(4)); | ||
| 504 | } | ||
| 505 | |||
| 506 | if (data->type == emc6d100) { | ||
| 507 | for (i = 5; i <= 7; ++i) { | ||
| 508 | data->in_min[i] = lm85_read_value(client, | ||
| 509 | EMC6D100_REG_IN_MIN(i)); | ||
| 510 | data->in_max[i] = lm85_read_value(client, | ||
| 511 | EMC6D100_REG_IN_MAX(i)); | ||
| 512 | } | ||
| 513 | } | ||
| 514 | |||
| 515 | for (i = 0; i <= 2; ++i) { | ||
| 516 | int val; | ||
| 517 | |||
| 518 | data->temp_min[i] = | ||
| 519 | lm85_read_value(client, LM85_REG_TEMP_MIN(i)); | ||
| 520 | data->temp_max[i] = | ||
| 521 | lm85_read_value(client, LM85_REG_TEMP_MAX(i)); | ||
| 522 | |||
| 523 | data->autofan[i].config = | ||
| 524 | lm85_read_value(client, LM85_REG_AFAN_CONFIG(i)); | ||
| 525 | val = lm85_read_value(client, LM85_REG_AFAN_RANGE(i)); | ||
| 526 | data->pwm_freq[i] = val & 0x07; | ||
| 527 | data->zone[i].range = val >> 4; | ||
| 528 | data->autofan[i].min_pwm = | ||
| 529 | lm85_read_value(client, LM85_REG_AFAN_MINPWM(i)); | ||
| 530 | data->zone[i].limit = | ||
| 531 | lm85_read_value(client, LM85_REG_AFAN_LIMIT(i)); | ||
| 532 | data->zone[i].critical = | ||
| 533 | lm85_read_value(client, LM85_REG_AFAN_CRITICAL(i)); | ||
| 534 | |||
| 535 | if (IS_ADT7468_OFF64(data)) { | ||
| 536 | data->temp_min[i] -= 64; | ||
| 537 | data->temp_max[i] -= 64; | ||
| 538 | data->zone[i].limit -= 64; | ||
| 539 | data->zone[i].critical -= 64; | ||
| 540 | } | ||
| 541 | } | ||
| 542 | |||
| 543 | if (data->type != emc6d103s) { | ||
| 544 | i = lm85_read_value(client, LM85_REG_AFAN_SPIKE1); | ||
| 545 | data->autofan[0].min_off = (i & 0x20) != 0; | ||
| 546 | data->autofan[1].min_off = (i & 0x40) != 0; | ||
| 547 | data->autofan[2].min_off = (i & 0x80) != 0; | ||
| 548 | |||
| 549 | i = lm85_read_value(client, LM85_REG_AFAN_HYST1); | ||
| 550 | data->zone[0].hyst = i >> 4; | ||
| 551 | data->zone[1].hyst = i & 0x0f; | ||
| 552 | |||
| 553 | i = lm85_read_value(client, LM85_REG_AFAN_HYST2); | ||
| 554 | data->zone[2].hyst = i >> 4; | ||
| 555 | } | ||
| 556 | |||
| 557 | data->last_config = jiffies; | ||
| 558 | } /* last_config */ | ||
| 559 | |||
| 560 | data->valid = 1; | ||
| 561 | |||
| 562 | mutex_unlock(&data->update_lock); | ||
| 563 | |||
| 564 | return data; | ||
| 565 | } | ||
| 375 | 566 | ||
| 376 | /* 4 Fans */ | 567 | /* 4 Fans */ |
| 377 | static ssize_t show_fan(struct device *dev, struct device_attribute *attr, | 568 | static ssize_t show_fan(struct device *dev, struct device_attribute *attr, |
| @@ -394,8 +585,8 @@ static ssize_t set_fan_min(struct device *dev, struct device_attribute *attr, | |||
| 394 | const char *buf, size_t count) | 585 | const char *buf, size_t count) |
| 395 | { | 586 | { |
| 396 | int nr = to_sensor_dev_attr(attr)->index; | 587 | int nr = to_sensor_dev_attr(attr)->index; |
| 397 | struct i2c_client *client = to_i2c_client(dev); | 588 | struct lm85_data *data = dev_get_drvdata(dev); |
| 398 | struct lm85_data *data = i2c_get_clientdata(client); | 589 | struct i2c_client *client = data->client; |
| 399 | unsigned long val; | 590 | unsigned long val; |
| 400 | int err; | 591 | int err; |
| 401 | 592 | ||
| @@ -460,6 +651,9 @@ static ssize_t store_vrm_reg(struct device *dev, struct device_attribute *attr, | |||
| 460 | if (err) | 651 | if (err) |
| 461 | return err; | 652 | return err; |
| 462 | 653 | ||
| 654 | if (val > 255) | ||
| 655 | return -EINVAL; | ||
| 656 | |||
| 463 | data->vrm = val; | 657 | data->vrm = val; |
| 464 | return count; | 658 | return count; |
| 465 | } | 659 | } |
| @@ -515,8 +709,8 @@ static ssize_t set_pwm(struct device *dev, struct device_attribute *attr, | |||
| 515 | const char *buf, size_t count) | 709 | const char *buf, size_t count) |
| 516 | { | 710 | { |
| 517 | int nr = to_sensor_dev_attr(attr)->index; | 711 | int nr = to_sensor_dev_attr(attr)->index; |
| 518 | struct i2c_client *client = to_i2c_client(dev); | 712 | struct lm85_data *data = dev_get_drvdata(dev); |
| 519 | struct lm85_data *data = i2c_get_clientdata(client); | 713 | struct i2c_client *client = data->client; |
| 520 | unsigned long val; | 714 | unsigned long val; |
| 521 | int err; | 715 | int err; |
| 522 | 716 | ||
| @@ -557,8 +751,8 @@ static ssize_t set_pwm_enable(struct device *dev, struct device_attribute | |||
| 557 | *attr, const char *buf, size_t count) | 751 | *attr, const char *buf, size_t count) |
| 558 | { | 752 | { |
| 559 | int nr = to_sensor_dev_attr(attr)->index; | 753 | int nr = to_sensor_dev_attr(attr)->index; |
| 560 | struct i2c_client *client = to_i2c_client(dev); | 754 | struct lm85_data *data = dev_get_drvdata(dev); |
| 561 | struct lm85_data *data = i2c_get_clientdata(client); | 755 | struct i2c_client *client = data->client; |
| 562 | u8 config; | 756 | u8 config; |
| 563 | unsigned long val; | 757 | unsigned long val; |
| 564 | int err; | 758 | int err; |
| @@ -615,8 +809,8 @@ static ssize_t set_pwm_freq(struct device *dev, | |||
| 615 | struct device_attribute *attr, const char *buf, size_t count) | 809 | struct device_attribute *attr, const char *buf, size_t count) |
| 616 | { | 810 | { |
| 617 | int nr = to_sensor_dev_attr(attr)->index; | 811 | int nr = to_sensor_dev_attr(attr)->index; |
| 618 | struct i2c_client *client = to_i2c_client(dev); | 812 | struct lm85_data *data = dev_get_drvdata(dev); |
| 619 | struct lm85_data *data = i2c_get_clientdata(client); | 813 | struct i2c_client *client = data->client; |
| 620 | unsigned long val; | 814 | unsigned long val; |
| 621 | int err; | 815 | int err; |
| 622 | 816 | ||
| @@ -682,8 +876,8 @@ static ssize_t set_in_min(struct device *dev, struct device_attribute *attr, | |||
| 682 | const char *buf, size_t count) | 876 | const char *buf, size_t count) |
| 683 | { | 877 | { |
| 684 | int nr = to_sensor_dev_attr(attr)->index; | 878 | int nr = to_sensor_dev_attr(attr)->index; |
| 685 | struct i2c_client *client = to_i2c_client(dev); | 879 | struct lm85_data *data = dev_get_drvdata(dev); |
| 686 | struct lm85_data *data = i2c_get_clientdata(client); | 880 | struct i2c_client *client = data->client; |
| 687 | long val; | 881 | long val; |
| 688 | int err; | 882 | int err; |
| 689 | 883 | ||
| @@ -710,8 +904,8 @@ static ssize_t set_in_max(struct device *dev, struct device_attribute *attr, | |||
| 710 | const char *buf, size_t count) | 904 | const char *buf, size_t count) |
| 711 | { | 905 | { |
| 712 | int nr = to_sensor_dev_attr(attr)->index; | 906 | int nr = to_sensor_dev_attr(attr)->index; |
| 713 | struct i2c_client *client = to_i2c_client(dev); | 907 | struct lm85_data *data = dev_get_drvdata(dev); |
| 714 | struct lm85_data *data = i2c_get_clientdata(client); | 908 | struct i2c_client *client = data->client; |
| 715 | long val; | 909 | long val; |
| 716 | int err; | 910 | int err; |
| 717 | 911 | ||
| @@ -766,8 +960,8 @@ static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr, | |||
| 766 | const char *buf, size_t count) | 960 | const char *buf, size_t count) |
| 767 | { | 961 | { |
| 768 | int nr = to_sensor_dev_attr(attr)->index; | 962 | int nr = to_sensor_dev_attr(attr)->index; |
| 769 | struct i2c_client *client = to_i2c_client(dev); | 963 | struct lm85_data *data = dev_get_drvdata(dev); |
| 770 | struct lm85_data *data = i2c_get_clientdata(client); | 964 | struct i2c_client *client = data->client; |
| 771 | long val; | 965 | long val; |
| 772 | int err; | 966 | int err; |
| 773 | 967 | ||
| @@ -797,8 +991,8 @@ static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr, | |||
| 797 | const char *buf, size_t count) | 991 | const char *buf, size_t count) |
| 798 | { | 992 | { |
| 799 | int nr = to_sensor_dev_attr(attr)->index; | 993 | int nr = to_sensor_dev_attr(attr)->index; |
| 800 | struct i2c_client *client = to_i2c_client(dev); | 994 | struct lm85_data *data = dev_get_drvdata(dev); |
| 801 | struct lm85_data *data = i2c_get_clientdata(client); | 995 | struct i2c_client *client = data->client; |
| 802 | long val; | 996 | long val; |
| 803 | int err; | 997 | int err; |
| 804 | 998 | ||
| @@ -843,8 +1037,8 @@ static ssize_t set_pwm_auto_channels(struct device *dev, | |||
| 843 | struct device_attribute *attr, const char *buf, size_t count) | 1037 | struct device_attribute *attr, const char *buf, size_t count) |
| 844 | { | 1038 | { |
| 845 | int nr = to_sensor_dev_attr(attr)->index; | 1039 | int nr = to_sensor_dev_attr(attr)->index; |
| 846 | struct i2c_client *client = to_i2c_client(dev); | 1040 | struct lm85_data *data = dev_get_drvdata(dev); |
| 847 | struct lm85_data *data = i2c_get_clientdata(client); | 1041 | struct i2c_client *client = data->client; |
| 848 | long val; | 1042 | long val; |
| 849 | int err; | 1043 | int err; |
| 850 | 1044 | ||
| @@ -873,8 +1067,8 @@ static ssize_t set_pwm_auto_pwm_min(struct device *dev, | |||
| 873 | struct device_attribute *attr, const char *buf, size_t count) | 1067 | struct device_attribute *attr, const char *buf, size_t count) |
| 874 | { | 1068 | { |
| 875 | int nr = to_sensor_dev_attr(attr)->index; | 1069 | int nr = to_sensor_dev_attr(attr)->index; |
| 876 | struct i2c_client *client = to_i2c_client(dev); | 1070 | struct lm85_data *data = dev_get_drvdata(dev); |
| 877 | struct lm85_data *data = i2c_get_clientdata(client); | 1071 | struct i2c_client *client = data->client; |
| 878 | unsigned long val; | 1072 | unsigned long val; |
| 879 | int err; | 1073 | int err; |
| 880 | 1074 | ||
| @@ -902,8 +1096,8 @@ static ssize_t set_pwm_auto_pwm_minctl(struct device *dev, | |||
| 902 | struct device_attribute *attr, const char *buf, size_t count) | 1096 | struct device_attribute *attr, const char *buf, size_t count) |
| 903 | { | 1097 | { |
| 904 | int nr = to_sensor_dev_attr(attr)->index; | 1098 | int nr = to_sensor_dev_attr(attr)->index; |
| 905 | struct i2c_client *client = to_i2c_client(dev); | 1099 | struct lm85_data *data = dev_get_drvdata(dev); |
| 906 | struct lm85_data *data = i2c_get_clientdata(client); | 1100 | struct i2c_client *client = data->client; |
| 907 | u8 tmp; | 1101 | u8 tmp; |
| 908 | long val; | 1102 | long val; |
| 909 | int err; | 1103 | int err; |
| @@ -953,8 +1147,8 @@ static ssize_t set_temp_auto_temp_off(struct device *dev, | |||
| 953 | struct device_attribute *attr, const char *buf, size_t count) | 1147 | struct device_attribute *attr, const char *buf, size_t count) |
| 954 | { | 1148 | { |
| 955 | int nr = to_sensor_dev_attr(attr)->index; | 1149 | int nr = to_sensor_dev_attr(attr)->index; |
| 956 | struct i2c_client *client = to_i2c_client(dev); | 1150 | struct lm85_data *data = dev_get_drvdata(dev); |
| 957 | struct lm85_data *data = i2c_get_clientdata(client); | 1151 | struct i2c_client *client = data->client; |
| 958 | int min; | 1152 | int min; |
| 959 | long val; | 1153 | long val; |
| 960 | int err; | 1154 | int err; |
| @@ -990,8 +1184,8 @@ static ssize_t set_temp_auto_temp_min(struct device *dev, | |||
| 990 | struct device_attribute *attr, const char *buf, size_t count) | 1184 | struct device_attribute *attr, const char *buf, size_t count) |
| 991 | { | 1185 | { |
| 992 | int nr = to_sensor_dev_attr(attr)->index; | 1186 | int nr = to_sensor_dev_attr(attr)->index; |
| 993 | struct i2c_client *client = to_i2c_client(dev); | 1187 | struct lm85_data *data = dev_get_drvdata(dev); |
| 994 | struct lm85_data *data = i2c_get_clientdata(client); | 1188 | struct i2c_client *client = data->client; |
| 995 | long val; | 1189 | long val; |
| 996 | int err; | 1190 | int err; |
| 997 | 1191 | ||
| @@ -1029,8 +1223,8 @@ static ssize_t set_temp_auto_temp_max(struct device *dev, | |||
| 1029 | struct device_attribute *attr, const char *buf, size_t count) | 1223 | struct device_attribute *attr, const char *buf, size_t count) |
| 1030 | { | 1224 | { |
| 1031 | int nr = to_sensor_dev_attr(attr)->index; | 1225 | int nr = to_sensor_dev_attr(attr)->index; |
| 1032 | struct i2c_client *client = to_i2c_client(dev); | 1226 | struct lm85_data *data = dev_get_drvdata(dev); |
| 1033 | struct lm85_data *data = i2c_get_clientdata(client); | 1227 | struct i2c_client *client = data->client; |
| 1034 | int min; | 1228 | int min; |
| 1035 | long val; | 1229 | long val; |
| 1036 | int err; | 1230 | int err; |
| @@ -1063,8 +1257,8 @@ static ssize_t set_temp_auto_temp_crit(struct device *dev, | |||
| 1063 | struct device_attribute *attr, const char *buf, size_t count) | 1257 | struct device_attribute *attr, const char *buf, size_t count) |
| 1064 | { | 1258 | { |
| 1065 | int nr = to_sensor_dev_attr(attr)->index; | 1259 | int nr = to_sensor_dev_attr(attr)->index; |
| 1066 | struct i2c_client *client = to_i2c_client(dev); | 1260 | struct lm85_data *data = dev_get_drvdata(dev); |
| 1067 | struct lm85_data *data = i2c_get_clientdata(client); | 1261 | struct i2c_client *client = data->client; |
| 1068 | long val; | 1262 | long val; |
| 1069 | int err; | 1263 | int err; |
| 1070 | 1264 | ||
| @@ -1355,30 +1549,18 @@ static int lm85_detect(struct i2c_client *client, struct i2c_board_info *info) | |||
| 1355 | return 0; | 1549 | return 0; |
| 1356 | } | 1550 | } |
| 1357 | 1551 | ||
| 1358 | static void lm85_remove_files(struct i2c_client *client, struct lm85_data *data) | 1552 | static int lm85_probe(struct i2c_client *client, const struct i2c_device_id *id) |
| 1359 | { | ||
| 1360 | sysfs_remove_group(&client->dev.kobj, &lm85_group); | ||
| 1361 | if (data->type != emc6d103s) { | ||
| 1362 | sysfs_remove_group(&client->dev.kobj, &lm85_group_minctl); | ||
| 1363 | sysfs_remove_group(&client->dev.kobj, &lm85_group_temp_off); | ||
| 1364 | } | ||
| 1365 | if (!data->has_vid5) | ||
| 1366 | sysfs_remove_group(&client->dev.kobj, &lm85_group_in4); | ||
| 1367 | if (data->type == emc6d100) | ||
| 1368 | sysfs_remove_group(&client->dev.kobj, &lm85_group_in567); | ||
| 1369 | } | ||
| 1370 | |||
| 1371 | static int lm85_probe(struct i2c_client *client, | ||
| 1372 | const struct i2c_device_id *id) | ||
| 1373 | { | 1553 | { |
| 1554 | struct device *dev = &client->dev; | ||
| 1555 | struct device *hwmon_dev; | ||
| 1374 | struct lm85_data *data; | 1556 | struct lm85_data *data; |
| 1375 | int err; | 1557 | int idx = 0; |
| 1376 | 1558 | ||
| 1377 | data = devm_kzalloc(&client->dev, sizeof(struct lm85_data), GFP_KERNEL); | 1559 | data = devm_kzalloc(dev, sizeof(struct lm85_data), GFP_KERNEL); |
| 1378 | if (!data) | 1560 | if (!data) |
| 1379 | return -ENOMEM; | 1561 | return -ENOMEM; |
| 1380 | 1562 | ||
| 1381 | i2c_set_clientdata(client, data); | 1563 | data->client = client; |
| 1382 | data->type = id->driver_data; | 1564 | data->type = id->driver_data; |
| 1383 | mutex_init(&data->update_lock); | 1565 | mutex_init(&data->update_lock); |
| 1384 | 1566 | ||
| @@ -1403,20 +1585,13 @@ static int lm85_probe(struct i2c_client *client, | |||
| 1403 | /* Initialize the LM85 chip */ | 1585 | /* Initialize the LM85 chip */ |
| 1404 | lm85_init_client(client); | 1586 | lm85_init_client(client); |
| 1405 | 1587 | ||
| 1406 | /* Register sysfs hooks */ | 1588 | /* sysfs hooks */ |
| 1407 | err = sysfs_create_group(&client->dev.kobj, &lm85_group); | 1589 | data->groups[idx++] = &lm85_group; |
| 1408 | if (err) | ||
| 1409 | return err; | ||
| 1410 | 1590 | ||
| 1411 | /* minctl and temp_off exist on all chips except emc6d103s */ | 1591 | /* minctl and temp_off exist on all chips except emc6d103s */ |
| 1412 | if (data->type != emc6d103s) { | 1592 | if (data->type != emc6d103s) { |
| 1413 | err = sysfs_create_group(&client->dev.kobj, &lm85_group_minctl); | 1593 | data->groups[idx++] = &lm85_group_minctl; |
| 1414 | if (err) | 1594 | data->groups[idx++] = &lm85_group_temp_off; |
| 1415 | goto err_remove_files; | ||
| 1416 | err = sysfs_create_group(&client->dev.kobj, | ||
| 1417 | &lm85_group_temp_off); | ||
| 1418 | if (err) | ||
| 1419 | goto err_remove_files; | ||
| 1420 | } | 1595 | } |
| 1421 | 1596 | ||
| 1422 | /* | 1597 | /* |
| @@ -1429,271 +1604,44 @@ static int lm85_probe(struct i2c_client *client, | |||
| 1429 | data->has_vid5 = true; | 1604 | data->has_vid5 = true; |
| 1430 | } | 1605 | } |
| 1431 | 1606 | ||
| 1432 | if (!data->has_vid5) { | 1607 | if (!data->has_vid5) |
| 1433 | err = sysfs_create_group(&client->dev.kobj, &lm85_group_in4); | 1608 | data->groups[idx++] = &lm85_group_in4; |
| 1434 | if (err) | ||
| 1435 | goto err_remove_files; | ||
| 1436 | } | ||
| 1437 | 1609 | ||
| 1438 | /* The EMC6D100 has 3 additional voltage inputs */ | 1610 | /* The EMC6D100 has 3 additional voltage inputs */ |
| 1439 | if (data->type == emc6d100) { | 1611 | if (data->type == emc6d100) |
| 1440 | err = sysfs_create_group(&client->dev.kobj, &lm85_group_in567); | 1612 | data->groups[idx++] = &lm85_group_in567; |
| 1441 | if (err) | ||
| 1442 | goto err_remove_files; | ||
| 1443 | } | ||
| 1444 | |||
| 1445 | data->hwmon_dev = hwmon_device_register(&client->dev); | ||
| 1446 | if (IS_ERR(data->hwmon_dev)) { | ||
| 1447 | err = PTR_ERR(data->hwmon_dev); | ||
| 1448 | goto err_remove_files; | ||
| 1449 | } | ||
| 1450 | |||
| 1451 | return 0; | ||
| 1452 | |||
| 1453 | /* Error out and cleanup code */ | ||
| 1454 | err_remove_files: | ||
| 1455 | lm85_remove_files(client, data); | ||
| 1456 | return err; | ||
| 1457 | } | ||
| 1458 | |||
| 1459 | static int lm85_remove(struct i2c_client *client) | ||
| 1460 | { | ||
| 1461 | struct lm85_data *data = i2c_get_clientdata(client); | ||
| 1462 | hwmon_device_unregister(data->hwmon_dev); | ||
| 1463 | lm85_remove_files(client, data); | ||
| 1464 | return 0; | ||
| 1465 | } | ||
| 1466 | |||
| 1467 | |||
| 1468 | static int lm85_read_value(struct i2c_client *client, u8 reg) | ||
| 1469 | { | ||
| 1470 | int res; | ||
| 1471 | |||
| 1472 | /* What size location is it? */ | ||
| 1473 | switch (reg) { | ||
| 1474 | case LM85_REG_FAN(0): /* Read WORD data */ | ||
| 1475 | case LM85_REG_FAN(1): | ||
| 1476 | case LM85_REG_FAN(2): | ||
| 1477 | case LM85_REG_FAN(3): | ||
| 1478 | case LM85_REG_FAN_MIN(0): | ||
| 1479 | case LM85_REG_FAN_MIN(1): | ||
| 1480 | case LM85_REG_FAN_MIN(2): | ||
| 1481 | case LM85_REG_FAN_MIN(3): | ||
| 1482 | case LM85_REG_ALARM1: /* Read both bytes at once */ | ||
| 1483 | res = i2c_smbus_read_byte_data(client, reg) & 0xff; | ||
| 1484 | res |= i2c_smbus_read_byte_data(client, reg + 1) << 8; | ||
| 1485 | break; | ||
| 1486 | default: /* Read BYTE data */ | ||
| 1487 | res = i2c_smbus_read_byte_data(client, reg); | ||
| 1488 | break; | ||
| 1489 | } | ||
| 1490 | |||
| 1491 | return res; | ||
| 1492 | } | ||
| 1493 | 1613 | ||
| 1494 | static void lm85_write_value(struct i2c_client *client, u8 reg, int value) | 1614 | hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, |
| 1495 | { | 1615 | data, data->groups); |
| 1496 | switch (reg) { | 1616 | return PTR_ERR_OR_ZERO(hwmon_dev); |
| 1497 | case LM85_REG_FAN(0): /* Write WORD data */ | ||
| 1498 | case LM85_REG_FAN(1): | ||
| 1499 | case LM85_REG_FAN(2): | ||
| 1500 | case LM85_REG_FAN(3): | ||
| 1501 | case LM85_REG_FAN_MIN(0): | ||
| 1502 | case LM85_REG_FAN_MIN(1): | ||
| 1503 | case LM85_REG_FAN_MIN(2): | ||
| 1504 | case LM85_REG_FAN_MIN(3): | ||
| 1505 | /* NOTE: ALARM is read only, so not included here */ | ||
| 1506 | i2c_smbus_write_byte_data(client, reg, value & 0xff); | ||
| 1507 | i2c_smbus_write_byte_data(client, reg + 1, value >> 8); | ||
| 1508 | break; | ||
| 1509 | default: /* Write BYTE data */ | ||
| 1510 | i2c_smbus_write_byte_data(client, reg, value); | ||
| 1511 | break; | ||
| 1512 | } | ||
| 1513 | } | 1617 | } |
| 1514 | 1618 | ||
| 1515 | static struct lm85_data *lm85_update_device(struct device *dev) | 1619 | static const struct i2c_device_id lm85_id[] = { |
| 1516 | { | 1620 | { "adm1027", adm1027 }, |
| 1517 | struct i2c_client *client = to_i2c_client(dev); | 1621 | { "adt7463", adt7463 }, |
| 1518 | struct lm85_data *data = i2c_get_clientdata(client); | 1622 | { "adt7468", adt7468 }, |
| 1519 | int i; | 1623 | { "lm85", lm85 }, |
| 1520 | 1624 | { "lm85b", lm85 }, | |
| 1521 | mutex_lock(&data->update_lock); | 1625 | { "lm85c", lm85 }, |
| 1522 | 1626 | { "emc6d100", emc6d100 }, | |
| 1523 | if (!data->valid || | 1627 | { "emc6d101", emc6d100 }, |
| 1524 | time_after(jiffies, data->last_reading + LM85_DATA_INTERVAL)) { | 1628 | { "emc6d102", emc6d102 }, |
| 1525 | /* Things that change quickly */ | 1629 | { "emc6d103", emc6d103 }, |
| 1526 | dev_dbg(&client->dev, "Reading sensor values\n"); | 1630 | { "emc6d103s", emc6d103s }, |
| 1527 | 1631 | { } | |
| 1528 | /* | 1632 | }; |
| 1529 | * Have to read extended bits first to "freeze" the | 1633 | MODULE_DEVICE_TABLE(i2c, lm85_id); |
| 1530 | * more significant bits that are read later. | ||
| 1531 | * There are 2 additional resolution bits per channel and we | ||
| 1532 | * have room for 4, so we shift them to the left. | ||
| 1533 | */ | ||
| 1534 | if (data->type == adm1027 || data->type == adt7463 || | ||
| 1535 | data->type == adt7468) { | ||
| 1536 | int ext1 = lm85_read_value(client, | ||
| 1537 | ADM1027_REG_EXTEND_ADC1); | ||
| 1538 | int ext2 = lm85_read_value(client, | ||
| 1539 | ADM1027_REG_EXTEND_ADC2); | ||
| 1540 | int val = (ext1 << 8) + ext2; | ||
| 1541 | |||
| 1542 | for (i = 0; i <= 4; i++) | ||
| 1543 | data->in_ext[i] = | ||
| 1544 | ((val >> (i * 2)) & 0x03) << 2; | ||
| 1545 | |||
| 1546 | for (i = 0; i <= 2; i++) | ||
| 1547 | data->temp_ext[i] = | ||
| 1548 | (val >> ((i + 4) * 2)) & 0x0c; | ||
| 1549 | } | ||
| 1550 | |||
| 1551 | data->vid = lm85_read_value(client, LM85_REG_VID); | ||
| 1552 | |||
| 1553 | for (i = 0; i <= 3; ++i) { | ||
| 1554 | data->in[i] = | ||
| 1555 | lm85_read_value(client, LM85_REG_IN(i)); | ||
| 1556 | data->fan[i] = | ||
| 1557 | lm85_read_value(client, LM85_REG_FAN(i)); | ||
| 1558 | } | ||
| 1559 | |||
| 1560 | if (!data->has_vid5) | ||
| 1561 | data->in[4] = lm85_read_value(client, LM85_REG_IN(4)); | ||
| 1562 | |||
| 1563 | if (data->type == adt7468) | ||
| 1564 | data->cfg5 = lm85_read_value(client, ADT7468_REG_CFG5); | ||
| 1565 | |||
| 1566 | for (i = 0; i <= 2; ++i) { | ||
| 1567 | data->temp[i] = | ||
| 1568 | lm85_read_value(client, LM85_REG_TEMP(i)); | ||
| 1569 | data->pwm[i] = | ||
| 1570 | lm85_read_value(client, LM85_REG_PWM(i)); | ||
| 1571 | |||
| 1572 | if (IS_ADT7468_OFF64(data)) | ||
| 1573 | data->temp[i] -= 64; | ||
| 1574 | } | ||
| 1575 | |||
| 1576 | data->alarms = lm85_read_value(client, LM85_REG_ALARM1); | ||
| 1577 | |||
| 1578 | if (data->type == emc6d100) { | ||
| 1579 | /* Three more voltage sensors */ | ||
| 1580 | for (i = 5; i <= 7; ++i) { | ||
| 1581 | data->in[i] = lm85_read_value(client, | ||
| 1582 | EMC6D100_REG_IN(i)); | ||
| 1583 | } | ||
| 1584 | /* More alarm bits */ | ||
| 1585 | data->alarms |= lm85_read_value(client, | ||
| 1586 | EMC6D100_REG_ALARM3) << 16; | ||
| 1587 | } else if (data->type == emc6d102 || data->type == emc6d103 || | ||
| 1588 | data->type == emc6d103s) { | ||
| 1589 | /* | ||
| 1590 | * Have to read LSB bits after the MSB ones because | ||
| 1591 | * the reading of the MSB bits has frozen the | ||
| 1592 | * LSBs (backward from the ADM1027). | ||
| 1593 | */ | ||
| 1594 | int ext1 = lm85_read_value(client, | ||
| 1595 | EMC6D102_REG_EXTEND_ADC1); | ||
| 1596 | int ext2 = lm85_read_value(client, | ||
| 1597 | EMC6D102_REG_EXTEND_ADC2); | ||
| 1598 | int ext3 = lm85_read_value(client, | ||
| 1599 | EMC6D102_REG_EXTEND_ADC3); | ||
| 1600 | int ext4 = lm85_read_value(client, | ||
| 1601 | EMC6D102_REG_EXTEND_ADC4); | ||
| 1602 | data->in_ext[0] = ext3 & 0x0f; | ||
| 1603 | data->in_ext[1] = ext4 & 0x0f; | ||
| 1604 | data->in_ext[2] = ext4 >> 4; | ||
| 1605 | data->in_ext[3] = ext3 >> 4; | ||
| 1606 | data->in_ext[4] = ext2 >> 4; | ||
| 1607 | |||
| 1608 | data->temp_ext[0] = ext1 & 0x0f; | ||
| 1609 | data->temp_ext[1] = ext2 & 0x0f; | ||
| 1610 | data->temp_ext[2] = ext1 >> 4; | ||
| 1611 | } | ||
| 1612 | |||
| 1613 | data->last_reading = jiffies; | ||
| 1614 | } /* last_reading */ | ||
| 1615 | |||
| 1616 | if (!data->valid || | ||
| 1617 | time_after(jiffies, data->last_config + LM85_CONFIG_INTERVAL)) { | ||
| 1618 | /* Things that don't change often */ | ||
| 1619 | dev_dbg(&client->dev, "Reading config values\n"); | ||
| 1620 | |||
| 1621 | for (i = 0; i <= 3; ++i) { | ||
| 1622 | data->in_min[i] = | ||
| 1623 | lm85_read_value(client, LM85_REG_IN_MIN(i)); | ||
| 1624 | data->in_max[i] = | ||
| 1625 | lm85_read_value(client, LM85_REG_IN_MAX(i)); | ||
| 1626 | data->fan_min[i] = | ||
| 1627 | lm85_read_value(client, LM85_REG_FAN_MIN(i)); | ||
| 1628 | } | ||
| 1629 | |||
| 1630 | if (!data->has_vid5) { | ||
| 1631 | data->in_min[4] = lm85_read_value(client, | ||
| 1632 | LM85_REG_IN_MIN(4)); | ||
| 1633 | data->in_max[4] = lm85_read_value(client, | ||
| 1634 | LM85_REG_IN_MAX(4)); | ||
| 1635 | } | ||
| 1636 | |||
| 1637 | if (data->type == emc6d100) { | ||
| 1638 | for (i = 5; i <= 7; ++i) { | ||
| 1639 | data->in_min[i] = lm85_read_value(client, | ||
| 1640 | EMC6D100_REG_IN_MIN(i)); | ||
| 1641 | data->in_max[i] = lm85_read_value(client, | ||
| 1642 | EMC6D100_REG_IN_MAX(i)); | ||
| 1643 | } | ||
| 1644 | } | ||
| 1645 | |||
| 1646 | for (i = 0; i <= 2; ++i) { | ||
| 1647 | int val; | ||
| 1648 | |||
| 1649 | data->temp_min[i] = | ||
| 1650 | lm85_read_value(client, LM85_REG_TEMP_MIN(i)); | ||
| 1651 | data->temp_max[i] = | ||
| 1652 | lm85_read_value(client, LM85_REG_TEMP_MAX(i)); | ||
| 1653 | |||
| 1654 | data->autofan[i].config = | ||
| 1655 | lm85_read_value(client, LM85_REG_AFAN_CONFIG(i)); | ||
| 1656 | val = lm85_read_value(client, LM85_REG_AFAN_RANGE(i)); | ||
| 1657 | data->pwm_freq[i] = val & 0x07; | ||
| 1658 | data->zone[i].range = val >> 4; | ||
| 1659 | data->autofan[i].min_pwm = | ||
| 1660 | lm85_read_value(client, LM85_REG_AFAN_MINPWM(i)); | ||
| 1661 | data->zone[i].limit = | ||
| 1662 | lm85_read_value(client, LM85_REG_AFAN_LIMIT(i)); | ||
| 1663 | data->zone[i].critical = | ||
| 1664 | lm85_read_value(client, LM85_REG_AFAN_CRITICAL(i)); | ||
| 1665 | |||
| 1666 | if (IS_ADT7468_OFF64(data)) { | ||
| 1667 | data->temp_min[i] -= 64; | ||
| 1668 | data->temp_max[i] -= 64; | ||
| 1669 | data->zone[i].limit -= 64; | ||
| 1670 | data->zone[i].critical -= 64; | ||
| 1671 | } | ||
| 1672 | } | ||
| 1673 | |||
| 1674 | if (data->type != emc6d103s) { | ||
| 1675 | i = lm85_read_value(client, LM85_REG_AFAN_SPIKE1); | ||
| 1676 | data->autofan[0].min_off = (i & 0x20) != 0; | ||
| 1677 | data->autofan[1].min_off = (i & 0x40) != 0; | ||
| 1678 | data->autofan[2].min_off = (i & 0x80) != 0; | ||
| 1679 | |||
| 1680 | i = lm85_read_value(client, LM85_REG_AFAN_HYST1); | ||
| 1681 | data->zone[0].hyst = i >> 4; | ||
| 1682 | data->zone[1].hyst = i & 0x0f; | ||
| 1683 | |||
| 1684 | i = lm85_read_value(client, LM85_REG_AFAN_HYST2); | ||
| 1685 | data->zone[2].hyst = i >> 4; | ||
| 1686 | } | ||
| 1687 | |||
| 1688 | data->last_config = jiffies; | ||
| 1689 | } /* last_config */ | ||
| 1690 | |||
| 1691 | data->valid = 1; | ||
| 1692 | |||
| 1693 | mutex_unlock(&data->update_lock); | ||
| 1694 | 1634 | ||
| 1695 | return data; | 1635 | static struct i2c_driver lm85_driver = { |
| 1696 | } | 1636 | .class = I2C_CLASS_HWMON, |
| 1637 | .driver = { | ||
| 1638 | .name = "lm85", | ||
| 1639 | }, | ||
| 1640 | .probe = lm85_probe, | ||
| 1641 | .id_table = lm85_id, | ||
| 1642 | .detect = lm85_detect, | ||
| 1643 | .address_list = normal_i2c, | ||
| 1644 | }; | ||
| 1697 | 1645 | ||
| 1698 | module_i2c_driver(lm85_driver); | 1646 | module_i2c_driver(lm85_driver); |
| 1699 | 1647 | ||
