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-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging

Pull hwmon fixes from Guenter Roeck:
- acpi_power_meter: Fix return value check from call to
acpi_bus_get_device
- nct6775: Fix/improve NCT6791 support
- lm75: Add support for GMT G751

* tag 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging:
hwmon: (acpi_power_meter) Fix acpi_bus_get_device() return value check
hwmon: (nct6775) NCT6791 supports weight control only for CPUFAN
hwmon: (nct6775) Monitor additional temperature registers
hwmon: (lm75) Add support for GMT G751 chip

+88 -13
+1
Documentation/devicetree/bindings/i2c/trivial-devices.txt
··· 36 36 fsl,mma8450 MMA8450Q: Xtrinsic Low-power, 3-axis Xtrinsic Accelerometer 37 37 fsl,mpr121 MPR121: Proximity Capacitive Touch Sensor Controller 38 38 fsl,sgtl5000 SGTL5000: Ultra Low-Power Audio Codec 39 + gmt,g751 G751: Digital Temperature Sensor and Thermal Watchdog with Two-Wire Interface 39 40 infineon,slb9635tt Infineon SLB9635 (Soft-) I2C TPM (old protocol, max 100khz) 40 41 infineon,slb9645tt Infineon SLB9645 I2C TPM (new protocol, max 400khz) 41 42 maxim,ds1050 5 Bit Programmable, Pulse-Width Modulator
+1
drivers/hwmon/Kconfig
··· 656 656 657 657 - Analog Devices ADT75 658 658 - Dallas Semiconductor DS75, DS1775 and DS7505 659 + - Global Mixed-mode Technology (GMT) G751 659 660 - Maxim MAX6625 and MAX6626 660 661 - Microchip MCP980x 661 662 - National Semiconductor LM75, LM75A
+2 -3
drivers/hwmon/acpi_power_meter.c
··· 602 602 603 603 /* Create a symlink to domain objects */ 604 604 resource->domain_devices[i] = NULL; 605 - status = acpi_bus_get_device(element->reference.handle, 606 - &resource->domain_devices[i]); 607 - if (ACPI_FAILURE(status)) 605 + if (acpi_bus_get_device(element->reference.handle, 606 + &resource->domain_devices[i])) 608 607 continue; 609 608 610 609 obj = resource->domain_devices[i];
+3
drivers/hwmon/lm75.c
··· 39 39 ds1775, 40 40 ds75, 41 41 ds7505, 42 + g751, 42 43 lm75, 43 44 lm75a, 44 45 max6625, ··· 209 208 data->resolution = 12; 210 209 data->sample_time = HZ / 4; 211 210 break; 211 + case g751: 212 212 case lm75: 213 213 case lm75a: 214 214 data->resolution = 9; ··· 298 296 { "ds1775", ds1775, }, 299 297 { "ds75", ds75, }, 300 298 { "ds7505", ds7505, }, 299 + { "g751", g751, }, 301 300 { "lm75", lm75, }, 302 301 { "lm75a", lm75a, }, 303 302 { "max6625", max6625, },
+81 -10
drivers/hwmon/nct6775.c
··· 274 274 static const u16 NCT6775_REG_TEMP[] = { 275 275 0x27, 0x150, 0x250, 0x62b, 0x62c, 0x62d }; 276 276 277 + static const u16 NCT6775_REG_TEMP_MON[] = { 0x73, 0x75, 0x77 }; 278 + 277 279 static const u16 NCT6775_REG_TEMP_CONFIG[ARRAY_SIZE(NCT6775_REG_TEMP)] = { 278 280 0, 0x152, 0x252, 0x628, 0x629, 0x62A }; 279 281 static const u16 NCT6775_REG_TEMP_HYST[ARRAY_SIZE(NCT6775_REG_TEMP)] = { ··· 456 454 0x137, 0x237, 0x337, 0x837, 0x937, 0xa37 }; 457 455 458 456 static const u16 NCT6779_REG_TEMP[] = { 0x27, 0x150 }; 457 + static const u16 NCT6779_REG_TEMP_MON[] = { 0x73, 0x75, 0x77, 0x79, 0x7b }; 459 458 static const u16 NCT6779_REG_TEMP_CONFIG[ARRAY_SIZE(NCT6779_REG_TEMP)] = { 460 459 0x18, 0x152 }; 461 460 static const u16 NCT6779_REG_TEMP_HYST[ARRAY_SIZE(NCT6779_REG_TEMP)] = { ··· 510 507 511 508 #define NCT6791_REG_HM_IO_SPACE_LOCK_ENABLE 0x28 512 509 510 + static const u16 NCT6791_REG_WEIGHT_TEMP_SEL[6] = { 0, 0x239 }; 511 + static const u16 NCT6791_REG_WEIGHT_TEMP_STEP[6] = { 0, 0x23a }; 512 + static const u16 NCT6791_REG_WEIGHT_TEMP_STEP_TOL[6] = { 0, 0x23b }; 513 + static const u16 NCT6791_REG_WEIGHT_DUTY_STEP[6] = { 0, 0x23c }; 514 + static const u16 NCT6791_REG_WEIGHT_TEMP_BASE[6] = { 0, 0x23d }; 515 + static const u16 NCT6791_REG_WEIGHT_DUTY_BASE[6] = { 0, 0x23e }; 516 + 513 517 static const u16 NCT6791_REG_ALARM[NUM_REG_ALARM] = { 514 518 0x459, 0x45A, 0x45B, 0x568, 0x45D }; 515 519 ··· 544 534 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, 0x09 }; 545 535 546 536 static const u16 NCT6106_REG_TEMP[] = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15 }; 537 + static const u16 NCT6106_REG_TEMP_MON[] = { 0x18, 0x19, 0x1a }; 547 538 static const u16 NCT6106_REG_TEMP_HYST[] = { 548 539 0xc3, 0xc7, 0xcb, 0xcf, 0xd3, 0xd7 }; 549 540 static const u16 NCT6106_REG_TEMP_OVER[] = { ··· 1317 1306 /* If fan can stop, report floor as 0 */ 1318 1307 if (reg & 0x80) 1319 1308 data->pwm[2][i] = 0; 1309 + 1310 + if (!data->REG_WEIGHT_TEMP_SEL[i]) 1311 + continue; 1320 1312 1321 1313 reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[i]); 1322 1314 data->pwm_weight_temp_sel[i] = reg & 0x1f; ··· 2866 2852 if (!(data->has_pwm & (1 << pwm))) 2867 2853 return 0; 2868 2854 2855 + if ((nr >= 14 && nr <= 18) || nr == 21) /* weight */ 2856 + if (!data->REG_WEIGHT_TEMP_SEL[pwm]) 2857 + return 0; 2869 2858 if (nr == 19 && data->REG_PWM[3] == NULL) /* pwm_max */ 2870 2859 return 0; 2871 2860 if (nr == 20 && data->REG_PWM[4] == NULL) /* pwm_step */ ··· 2962 2945 &sensor_dev_template_pwm_step_down_time, 2963 2946 &sensor_dev_template_pwm_start, 2964 2947 &sensor_dev_template_pwm_floor, 2965 - &sensor_dev_template_pwm_weight_temp_sel, 2948 + &sensor_dev_template_pwm_weight_temp_sel, /* 14 */ 2966 2949 &sensor_dev_template_pwm_weight_temp_step, 2967 2950 &sensor_dev_template_pwm_weight_temp_step_tol, 2968 2951 &sensor_dev_template_pwm_weight_temp_step_base, 2969 - &sensor_dev_template_pwm_weight_duty_step, 2952 + &sensor_dev_template_pwm_weight_duty_step, /* 18 */ 2970 2953 &sensor_dev_template_pwm_max, /* 19 */ 2971 2954 &sensor_dev_template_pwm_step, /* 20 */ 2972 2955 &sensor_dev_template_pwm_weight_duty_base, /* 21 */ ··· 3270 3253 int i, s, err = 0; 3271 3254 int src, mask, available; 3272 3255 const u16 *reg_temp, *reg_temp_over, *reg_temp_hyst, *reg_temp_config; 3273 - const u16 *reg_temp_alternate, *reg_temp_crit; 3256 + const u16 *reg_temp_mon, *reg_temp_alternate, *reg_temp_crit; 3274 3257 const u16 *reg_temp_crit_l = NULL, *reg_temp_crit_h = NULL; 3275 - int num_reg_temp; 3258 + int num_reg_temp, num_reg_temp_mon; 3276 3259 u8 cr2a; 3277 3260 struct attribute_group *group; 3278 3261 struct device *hwmon_dev; ··· 3355 3338 data->BEEP_BITS = NCT6106_BEEP_BITS; 3356 3339 3357 3340 reg_temp = NCT6106_REG_TEMP; 3341 + reg_temp_mon = NCT6106_REG_TEMP_MON; 3358 3342 num_reg_temp = ARRAY_SIZE(NCT6106_REG_TEMP); 3343 + num_reg_temp_mon = ARRAY_SIZE(NCT6106_REG_TEMP_MON); 3359 3344 reg_temp_over = NCT6106_REG_TEMP_OVER; 3360 3345 reg_temp_hyst = NCT6106_REG_TEMP_HYST; 3361 3346 reg_temp_config = NCT6106_REG_TEMP_CONFIG; ··· 3429 3410 data->REG_BEEP = NCT6775_REG_BEEP; 3430 3411 3431 3412 reg_temp = NCT6775_REG_TEMP; 3413 + reg_temp_mon = NCT6775_REG_TEMP_MON; 3432 3414 num_reg_temp = ARRAY_SIZE(NCT6775_REG_TEMP); 3415 + num_reg_temp_mon = ARRAY_SIZE(NCT6775_REG_TEMP_MON); 3433 3416 reg_temp_over = NCT6775_REG_TEMP_OVER; 3434 3417 reg_temp_hyst = NCT6775_REG_TEMP_HYST; 3435 3418 reg_temp_config = NCT6775_REG_TEMP_CONFIG; ··· 3501 3480 data->REG_BEEP = NCT6776_REG_BEEP; 3502 3481 3503 3482 reg_temp = NCT6775_REG_TEMP; 3483 + reg_temp_mon = NCT6775_REG_TEMP_MON; 3504 3484 num_reg_temp = ARRAY_SIZE(NCT6775_REG_TEMP); 3485 + num_reg_temp_mon = ARRAY_SIZE(NCT6775_REG_TEMP_MON); 3505 3486 reg_temp_over = NCT6775_REG_TEMP_OVER; 3506 3487 reg_temp_hyst = NCT6775_REG_TEMP_HYST; 3507 3488 reg_temp_config = NCT6776_REG_TEMP_CONFIG; ··· 3577 3554 data->REG_BEEP = NCT6776_REG_BEEP; 3578 3555 3579 3556 reg_temp = NCT6779_REG_TEMP; 3557 + reg_temp_mon = NCT6779_REG_TEMP_MON; 3580 3558 num_reg_temp = ARRAY_SIZE(NCT6779_REG_TEMP); 3559 + num_reg_temp_mon = ARRAY_SIZE(NCT6779_REG_TEMP_MON); 3581 3560 reg_temp_over = NCT6779_REG_TEMP_OVER; 3582 3561 reg_temp_hyst = NCT6779_REG_TEMP_HYST; 3583 3562 reg_temp_config = NCT6779_REG_TEMP_CONFIG; ··· 3628 3603 data->REG_PWM[0] = NCT6775_REG_PWM; 3629 3604 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; 3630 3605 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; 3631 - data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP; 3632 - data->REG_PWM[6] = NCT6776_REG_WEIGHT_DUTY_BASE; 3606 + data->REG_PWM[5] = NCT6791_REG_WEIGHT_DUTY_STEP; 3607 + data->REG_PWM[6] = NCT6791_REG_WEIGHT_DUTY_BASE; 3633 3608 data->REG_PWM_READ = NCT6775_REG_PWM_READ; 3634 3609 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE; 3635 3610 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK; ··· 3645 3620 data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET; 3646 3621 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; 3647 3622 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; 3648 - data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL; 3649 - data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP; 3650 - data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL; 3651 - data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE; 3623 + data->REG_WEIGHT_TEMP_SEL = NCT6791_REG_WEIGHT_TEMP_SEL; 3624 + data->REG_WEIGHT_TEMP[0] = NCT6791_REG_WEIGHT_TEMP_STEP; 3625 + data->REG_WEIGHT_TEMP[1] = NCT6791_REG_WEIGHT_TEMP_STEP_TOL; 3626 + data->REG_WEIGHT_TEMP[2] = NCT6791_REG_WEIGHT_TEMP_BASE; 3652 3627 data->REG_ALARM = NCT6791_REG_ALARM; 3653 3628 data->REG_BEEP = NCT6776_REG_BEEP; 3654 3629 3655 3630 reg_temp = NCT6779_REG_TEMP; 3631 + reg_temp_mon = NCT6779_REG_TEMP_MON; 3656 3632 num_reg_temp = ARRAY_SIZE(NCT6779_REG_TEMP); 3633 + num_reg_temp_mon = ARRAY_SIZE(NCT6779_REG_TEMP_MON); 3657 3634 reg_temp_over = NCT6779_REG_TEMP_OVER; 3658 3635 reg_temp_hyst = NCT6779_REG_TEMP_HYST; 3659 3636 reg_temp_config = NCT6779_REG_TEMP_CONFIG; ··· 3752 3725 if (reg_temp_crit_l && reg_temp_crit_l[i]) 3753 3726 data->reg_temp[4][s] = reg_temp_crit_l[i]; 3754 3727 3728 + data->temp_src[s] = src; 3729 + s++; 3730 + } 3731 + 3732 + /* 3733 + * Repeat with temperatures used for fan control. 3734 + * This set of registers does not support limits. 3735 + */ 3736 + for (i = 0; i < num_reg_temp_mon; i++) { 3737 + if (reg_temp_mon[i] == 0) 3738 + continue; 3739 + 3740 + src = nct6775_read_value(data, data->REG_TEMP_SEL[i]) & 0x1f; 3741 + if (!src || (mask & (1 << src))) 3742 + continue; 3743 + 3744 + if (src >= data->temp_label_num || 3745 + !strlen(data->temp_label[src])) { 3746 + dev_info(dev, 3747 + "Invalid temperature source %d at index %d, source register 0x%x, temp register 0x%x\n", 3748 + src, i, data->REG_TEMP_SEL[i], 3749 + reg_temp_mon[i]); 3750 + continue; 3751 + } 3752 + 3753 + mask |= 1 << src; 3754 + 3755 + /* Use fixed index for SYSTIN(1), CPUTIN(2), AUXTIN(3) */ 3756 + if (src <= data->temp_fixed_num) { 3757 + if (data->have_temp & (1 << (src - 1))) 3758 + continue; 3759 + data->have_temp |= 1 << (src - 1); 3760 + data->have_temp_fixed |= 1 << (src - 1); 3761 + data->reg_temp[0][src - 1] = reg_temp_mon[i]; 3762 + data->temp_src[src - 1] = src; 3763 + continue; 3764 + } 3765 + 3766 + if (s >= NUM_TEMP) 3767 + continue; 3768 + 3769 + /* Use dynamic index for other sources */ 3770 + data->have_temp |= 1 << s; 3771 + data->reg_temp[0][s] = reg_temp_mon[i]; 3755 3772 data->temp_src[s] = src; 3756 3773 s++; 3757 3774 }