Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'hwmon-for-v7.1-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging

Pull hwmon fixes from Guenter Roeck:

- ads7871: Fix endianness bug in 16-bit register reads

- lm75: Fix configuration register writes and AS6200/TMP112 setup and
alarm handling

- lm63: Fix TOCTOU problems

- corsair-psu: Close HID device on probe errors

- ltc2992: Fix overflow and threshold range

- Documentation: fix link to ideapad-laptop.c file

- Remove stale CONFIG_SENSORS_SBRMI Makefile reference

* tag 'hwmon-for-v7.1-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging:
hwmon: (ads7871) Fix endianness bug in 16-bit register reads
hwmon: (lm75) Fix configuration register writes.
hwmon: (lm75) Fix AS6200 and TMP112 setup and alarm handling
hwmon: (lm63) Add locking to avoid TOCTOU
hwmon: (corsair-psu) Close HID device on probe errors
hwmon: Remove stale CONFIG_SENSORS_SBRMI Makefile reference
Documentation: hwmon: fix link to ideapad-laptop.c file
hwmon: (ltc2992) Fix u32 overflow in power read path
hwmon: (ltc2992) Clamp threshold writes to hardware range

+75 -28
+1 -1
Documentation/hwmon/yogafan.rst
··· 135 135 136 136 4. **Lenovo IdeaPad Laptop Driver:** Reference for DMI-based hardware 137 137 feature gating in Lenovo laptops. 138 - https://github.com/torvalds/linux/blob/master/drivers/platform/x86/ideapad-laptop.c 138 + https://github.com/torvalds/linux/blob/master/drivers/platform/x86/lenovo/ideapad-laptop.c
-1
drivers/hwmon/Makefile
··· 201 201 obj-$(CONFIG_SENSORS_QNAP_MCU_HWMON) += qnap-mcu-hwmon.o 202 202 obj-$(CONFIG_SENSORS_RASPBERRYPI_HWMON) += raspberrypi-hwmon.o 203 203 obj-$(CONFIG_SENSORS_SBTSI) += sbtsi_temp.o 204 - obj-$(CONFIG_SENSORS_SBRMI) += sbrmi.o 205 204 obj-$(CONFIG_SENSORS_SCH56XX_COMMON)+= sch56xx-common.o 206 205 obj-$(CONFIG_SENSORS_SCH5627) += sch5627.o 207 206 obj-$(CONFIG_SENSORS_SCH5636) += sch5636.o
+5 -1
drivers/hwmon/ads7871.c
··· 77 77 static int ads7871_read_reg16(struct spi_device *spi, int reg) 78 78 { 79 79 int ret; 80 + 80 81 reg = reg | INST_READ_BM | INST_16BIT_BM; 81 82 ret = spi_w8r16(spi, reg); 82 - return ret; 83 + if (ret < 0) 84 + return ret; 85 + 86 + return le16_to_cpu((__force __le16)ret); 83 87 } 84 88 85 89 static int ads7871_write_reg8(struct spi_device *spi, int reg, u8 val)
+2 -2
drivers/hwmon/corsair-psu.c
··· 796 796 ret = corsairpsu_init(priv); 797 797 if (ret < 0) { 798 798 dev_err(&hdev->dev, "unable to initialize device (%d)\n", ret); 799 - goto fail_and_stop; 799 + goto fail_and_close; 800 800 } 801 801 802 802 ret = corsairpsu_fwinfo(priv); 803 803 if (ret < 0) { 804 804 dev_err(&hdev->dev, "unable to query firmware (%d)\n", ret); 805 - goto fail_and_stop; 805 + goto fail_and_close; 806 806 } 807 807 808 808 corsairpsu_get_criticals(priv);
+30 -9
drivers/hwmon/lm63.c
··· 333 333 { 334 334 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 335 335 struct lm63_data *data = lm63_update_device(dev); 336 - return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[attr->index])); 336 + int fan; 337 + 338 + mutex_lock(&data->update_lock); 339 + fan = FAN_FROM_REG(data->fan[attr->index]); 340 + mutex_unlock(&data->update_lock); 341 + 342 + return sprintf(buf, "%d\n", fan); 337 343 } 338 344 339 345 static ssize_t set_fan(struct device *dev, struct device_attribute *dummy, ··· 372 366 int nr = attr->index; 373 367 int pwm; 374 368 369 + mutex_lock(&data->update_lock); 375 370 if (data->pwm_highres) 376 371 pwm = data->pwm1[nr]; 377 372 else 378 373 pwm = data->pwm1[nr] >= 2 * data->pwm1_freq ? 379 374 255 : (data->pwm1[nr] * 255 + data->pwm1_freq) / 380 375 (2 * data->pwm1_freq); 376 + mutex_unlock(&data->update_lock); 381 377 382 378 return sprintf(buf, "%d\n", pwm); 383 379 } ··· 537 529 int nr = attr->index; 538 530 int temp; 539 531 532 + mutex_lock(&data->update_lock); 540 533 if (!nr) { 541 534 /* 542 535 * Use unsigned temperature unless its value is zero. ··· 553 544 else 554 545 temp = TEMP11_FROM_REG(data->temp11[nr]); 555 546 } 556 - return sprintf(buf, "%d\n", temp + data->temp2_offset); 547 + temp += data->temp2_offset; 548 + mutex_unlock(&data->update_lock); 549 + 550 + return sprintf(buf, "%d\n", temp); 557 551 } 558 552 559 553 static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr, ··· 604 592 struct device_attribute *dummy, char *buf) 605 593 { 606 594 struct lm63_data *data = lm63_update_device(dev); 607 - return sprintf(buf, "%d\n", temp8_from_reg(data, 2) 608 - + data->temp2_offset 609 - - TEMP8_FROM_REG(data->temp2_crit_hyst)); 595 + int temp; 596 + 597 + mutex_lock(&data->update_lock); 598 + temp = temp8_from_reg(data, 2) + data->temp2_offset 599 + - TEMP8_FROM_REG(data->temp2_crit_hyst); 600 + mutex_unlock(&data->update_lock); 601 + 602 + return sprintf(buf, "%d\n", temp); 610 603 } 611 604 612 605 static ssize_t show_lut_temp_hyst(struct device *dev, ··· 619 602 { 620 603 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 621 604 struct lm63_data *data = lm63_update_device(dev); 605 + int temp; 622 606 623 - return sprintf(buf, "%d\n", lut_temp_from_reg(data, attr->index) 624 - + data->temp2_offset 625 - - TEMP8_FROM_REG(data->lut_temp_hyst)); 607 + mutex_lock(&data->update_lock); 608 + temp = lut_temp_from_reg(data, attr->index) + data->temp2_offset 609 + - TEMP8_FROM_REG(data->lut_temp_hyst); 610 + mutex_unlock(&data->update_lock); 611 + 612 + return sprintf(buf, "%d\n", temp); 626 613 } 627 614 628 615 /* ··· 637 616 struct device_attribute *dummy, 638 617 const char *buf, size_t count) 639 618 { 640 - struct lm63_data *data = dev_get_drvdata(dev); 619 + struct lm63_data *data = lm63_update_device(dev); 641 620 struct i2c_client *client = data->client; 642 621 long val; 643 622 int err;
+5 -5
drivers/hwmon/lm75.c
··· 137 137 }, 138 138 [as6200] = { 139 139 .config_reg_16bits = true, 140 - .set_mask = 0x94C0, /* 8 sample/s, 4 CF, positive polarity */ 140 + .set_mask = 0xC010, /* 8 sample/s, 4 CF */ 141 141 .default_resolution = 12, 142 142 .default_sample_time = 125, 143 143 .num_sample_times = 4, ··· 286 286 }, 287 287 [tmp112] = { 288 288 .config_reg_16bits = true, 289 - .set_mask = 0x60C0, /* 12-bit mode, 8 samples / second */ 290 - .clr_mask = 1 << 15, /* no one-shot mode*/ 289 + .set_mask = 0xC060, /* 12-bit mode, 8 samples / second */ 290 + .clr_mask = 1 << 7, /* no one-shot mode*/ 291 291 .default_resolution = 12, 292 292 .default_sample_time = 125, 293 293 .num_sample_times = 4, ··· 353 353 u16 clr_mask) 354 354 { 355 355 return regmap_update_bits(data->regmap, LM75_REG_CONF, 356 - clr_mask | LM75_SHUTDOWN, set_mask); 356 + clr_mask | set_mask | LM75_SHUTDOWN, set_mask); 357 357 } 358 358 359 359 static irqreturn_t lm75_alarm_handler(int irq, void *private) ··· 416 416 switch (data->kind) { 417 417 case as6200: 418 418 case tmp112: 419 - *val = (regval >> 13) & 0x1; 419 + *val = !!(regval & BIT(13)) == !!(regval & BIT(2)); 420 420 break; 421 421 default: 422 422 return -EINVAL;
+32 -9
drivers/hwmon/ltc2992.c
··· 431 431 432 432 static int ltc2992_set_voltage(struct ltc2992_state *st, u32 reg, u32 scale, long val) 433 433 { 434 - val = DIV_ROUND_CLOSEST(val * 1000, scale); 435 - val = val << 4; 434 + u32 reg_val; 435 + long vmax; 436 436 437 - return ltc2992_write_reg(st, reg, 2, val); 437 + vmax = DIV_ROUND_CLOSEST_ULL(0xFFFULL * scale, 1000); 438 + val = max(val, 0L); 439 + val = min(val, vmax); 440 + reg_val = min(DIV_ROUND_CLOSEST_ULL((u64)val * 1000, scale), 441 + 0xFFFULL) << 4; 442 + 443 + return ltc2992_write_reg(st, reg, 2, reg_val); 438 444 } 439 445 440 446 static int ltc2992_read_gpio_alarm(struct ltc2992_state *st, int nr_gpio, u32 attr, long *val) ··· 565 559 static int ltc2992_set_current(struct ltc2992_state *st, u32 reg, u32 channel, long val) 566 560 { 567 561 u32 reg_val; 562 + long cmax; 568 563 569 - reg_val = DIV_ROUND_CLOSEST(val * st->r_sense_uohm[channel], LTC2992_IADC_NANOV_LSB); 570 - reg_val = reg_val << 4; 564 + cmax = DIV_ROUND_CLOSEST_ULL(0xFFFULL * LTC2992_IADC_NANOV_LSB, 565 + st->r_sense_uohm[channel]); 566 + val = max(val, 0L); 567 + val = min(val, cmax); 568 + reg_val = min(DIV_ROUND_CLOSEST_ULL((u64)val * st->r_sense_uohm[channel], 569 + LTC2992_IADC_NANOV_LSB), 570 + 0xFFFULL) << 4; 571 571 572 572 return ltc2992_write_reg(st, reg, 2, reg_val); 573 573 } ··· 637 625 if (reg_val < 0) 638 626 return reg_val; 639 627 640 - *val = mul_u64_u32_div(reg_val, LTC2992_VADC_UV_LSB * LTC2992_IADC_NANOV_LSB, 641 - st->r_sense_uohm[channel] * 1000); 628 + *val = mul_u64_u32_div(reg_val, 629 + LTC2992_VADC_UV_LSB / 1000 * 630 + LTC2992_IADC_NANOV_LSB, 631 + st->r_sense_uohm[channel]); 642 632 643 633 return 0; 644 634 } ··· 648 634 static int ltc2992_set_power(struct ltc2992_state *st, u32 reg, u32 channel, long val) 649 635 { 650 636 u32 reg_val; 637 + u64 pmax, uval; 651 638 652 - reg_val = mul_u64_u32_div(val, st->r_sense_uohm[channel] * 1000, 653 - LTC2992_VADC_UV_LSB * LTC2992_IADC_NANOV_LSB); 639 + uval = max(val, 0L); 640 + pmax = mul_u64_u32_div(0xFFFFFFULL, 641 + LTC2992_VADC_UV_LSB / 1000 * 642 + LTC2992_IADC_NANOV_LSB, 643 + st->r_sense_uohm[channel]); 644 + uval = min(uval, pmax); 645 + reg_val = min(mul_u64_u32_div(uval, st->r_sense_uohm[channel], 646 + LTC2992_VADC_UV_LSB / 1000 * 647 + LTC2992_IADC_NANOV_LSB), 648 + 0xFFFFFFULL); 654 649 655 650 return ltc2992_write_reg(st, reg, 3, reg_val); 656 651 }