Re: [PATCH v1 1/1] hwmon: (nct6775) Fix use of undefined variable

From: kernel test robot
Date: Mon Jun 19 2023 - 23:24:24 EST


Hi Andy,

kernel test robot noticed the following build warnings:

[auto build test WARNING on groeck-staging/hwmon-next]
[also build test WARNING on next-20230619]
[cannot apply to linus/master v6.4-rc7]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Andy-Shevchenko/hwmon-nct6775-Fix-use-of-undefined-variable/20230619-213352
base: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-next
patch link: https://lore.kernel.org/r/20230619133257.57569-1-andriy.shevchenko%40linux.intel.com
patch subject: [PATCH v1 1/1] hwmon: (nct6775) Fix use of undefined variable
config: nios2-randconfig-s053-20230618 (https://download.01.org/0day-ci/archive/20230620/202306201028.JdLRkqNh-lkp@xxxxxxxxx/config)
compiler: nios2-linux-gcc (GCC) 12.3.0
reproduce: (https://download.01.org/0day-ci/archive/20230620/202306201028.JdLRkqNh-lkp@xxxxxxxxx/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202306201028.JdLRkqNh-lkp@xxxxxxxxx/

sparse warnings: (new ones prefixed by >>)
>> drivers/hwmon/nct6775-core.c:3854:32: sparse: sparse: incorrect type in argument 1 (different base types) @@ expected unsigned long *map @@ got unsigned short [usertype] have_in @@
drivers/hwmon/nct6775-core.c:3854:32: sparse: expected unsigned long *map
drivers/hwmon/nct6775-core.c:3854:32: sparse: got unsigned short [usertype] have_in
>> drivers/hwmon/nct6775-core.c:3854:28: sparse: sparse: non size-preserving integer to pointer cast

vim +3854 drivers/hwmon/nct6775-core.c

3444
3445 int nct6775_probe(struct device *dev, struct nct6775_data *data,
3446 const struct regmap_config *regmapcfg)
3447 {
3448 int i, s, err = 0;
3449 int mask, available;
3450 u16 src;
3451 const u16 *reg_temp, *reg_temp_over, *reg_temp_hyst, *reg_temp_config;
3452 const u16 *reg_temp_mon, *reg_temp_alternate, *reg_temp_crit;
3453 const u16 *reg_temp_crit_l = NULL, *reg_temp_crit_h = NULL;
3454 int num_reg_temp, num_reg_temp_mon, num_reg_tsi_temp;
3455 struct device *hwmon_dev;
3456 struct sensor_template_group tsi_temp_tg;
3457
3458 data->regmap = devm_regmap_init(dev, NULL, data, regmapcfg);
3459 if (IS_ERR(data->regmap))
3460 return PTR_ERR(data->regmap);
3461
3462 mutex_init(&data->update_lock);
3463 data->name = nct6775_device_names[data->kind];
3464 data->bank = 0xff; /* Force initial bank selection */
3465
3466 switch (data->kind) {
3467 case nct6106:
3468 data->in_num = 9;
3469 data->pwm_num = 3;
3470 data->auto_pwm_num = 4;
3471 data->temp_fixed_num = 3;
3472 data->num_temp_alarms = 6;
3473 data->num_temp_beeps = 6;
3474
3475 data->fan_from_reg = fan_from_reg13;
3476 data->fan_from_reg_min = fan_from_reg13;
3477
3478 data->temp_label = nct6776_temp_label;
3479 data->temp_mask = NCT6776_TEMP_MASK;
3480 data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK;
3481
3482 data->REG_VBAT = NCT6106_REG_VBAT;
3483 data->REG_DIODE = NCT6106_REG_DIODE;
3484 data->DIODE_MASK = NCT6106_DIODE_MASK;
3485 data->REG_VIN = NCT6106_REG_IN;
3486 data->REG_IN_MINMAX[0] = NCT6106_REG_IN_MIN;
3487 data->REG_IN_MINMAX[1] = NCT6106_REG_IN_MAX;
3488 data->REG_TARGET = NCT6106_REG_TARGET;
3489 data->REG_FAN = NCT6106_REG_FAN;
3490 data->REG_FAN_MODE = NCT6106_REG_FAN_MODE;
3491 data->REG_FAN_MIN = NCT6106_REG_FAN_MIN;
3492 data->REG_FAN_PULSES = NCT6106_REG_FAN_PULSES;
3493 data->FAN_PULSE_SHIFT = NCT6106_FAN_PULSE_SHIFT;
3494 data->REG_FAN_TIME[0] = NCT6106_REG_FAN_STOP_TIME;
3495 data->REG_FAN_TIME[1] = NCT6106_REG_FAN_STEP_UP_TIME;
3496 data->REG_FAN_TIME[2] = NCT6106_REG_FAN_STEP_DOWN_TIME;
3497 data->REG_TOLERANCE_H = NCT6106_REG_TOLERANCE_H;
3498 data->REG_PWM[0] = NCT6116_REG_PWM;
3499 data->REG_PWM[1] = NCT6106_REG_FAN_START_OUTPUT;
3500 data->REG_PWM[2] = NCT6106_REG_FAN_STOP_OUTPUT;
3501 data->REG_PWM[5] = NCT6106_REG_WEIGHT_DUTY_STEP;
3502 data->REG_PWM[6] = NCT6106_REG_WEIGHT_DUTY_BASE;
3503 data->REG_PWM_READ = NCT6106_REG_PWM_READ;
3504 data->REG_PWM_MODE = NCT6106_REG_PWM_MODE;
3505 data->PWM_MODE_MASK = NCT6106_PWM_MODE_MASK;
3506 data->REG_AUTO_TEMP = NCT6106_REG_AUTO_TEMP;
3507 data->REG_AUTO_PWM = NCT6106_REG_AUTO_PWM;
3508 data->REG_CRITICAL_TEMP = NCT6106_REG_CRITICAL_TEMP;
3509 data->REG_CRITICAL_TEMP_TOLERANCE
3510 = NCT6106_REG_CRITICAL_TEMP_TOLERANCE;
3511 data->REG_CRITICAL_PWM_ENABLE = NCT6106_REG_CRITICAL_PWM_ENABLE;
3512 data->CRITICAL_PWM_ENABLE_MASK
3513 = NCT6106_CRITICAL_PWM_ENABLE_MASK;
3514 data->REG_CRITICAL_PWM = NCT6106_REG_CRITICAL_PWM;
3515 data->REG_TEMP_OFFSET = NCT6106_REG_TEMP_OFFSET;
3516 data->REG_TEMP_SOURCE = NCT6106_REG_TEMP_SOURCE;
3517 data->REG_TEMP_SEL = NCT6116_REG_TEMP_SEL;
3518 data->REG_WEIGHT_TEMP_SEL = NCT6106_REG_WEIGHT_TEMP_SEL;
3519 data->REG_WEIGHT_TEMP[0] = NCT6106_REG_WEIGHT_TEMP_STEP;
3520 data->REG_WEIGHT_TEMP[1] = NCT6106_REG_WEIGHT_TEMP_STEP_TOL;
3521 data->REG_WEIGHT_TEMP[2] = NCT6106_REG_WEIGHT_TEMP_BASE;
3522 data->REG_ALARM = NCT6106_REG_ALARM;
3523 data->ALARM_BITS = NCT6106_ALARM_BITS;
3524 data->REG_BEEP = NCT6106_REG_BEEP;
3525 data->BEEP_BITS = NCT6106_BEEP_BITS;
3526 data->REG_TSI_TEMP = NCT6106_REG_TSI_TEMP;
3527
3528 reg_temp = NCT6106_REG_TEMP;
3529 reg_temp_mon = NCT6106_REG_TEMP_MON;
3530 num_reg_temp = ARRAY_SIZE(NCT6106_REG_TEMP);
3531 num_reg_temp_mon = ARRAY_SIZE(NCT6106_REG_TEMP_MON);
3532 num_reg_tsi_temp = ARRAY_SIZE(NCT6106_REG_TSI_TEMP);
3533 reg_temp_over = NCT6106_REG_TEMP_OVER;
3534 reg_temp_hyst = NCT6106_REG_TEMP_HYST;
3535 reg_temp_config = NCT6106_REG_TEMP_CONFIG;
3536 reg_temp_alternate = NCT6106_REG_TEMP_ALTERNATE;
3537 reg_temp_crit = NCT6106_REG_TEMP_CRIT;
3538 reg_temp_crit_l = NCT6106_REG_TEMP_CRIT_L;
3539 reg_temp_crit_h = NCT6106_REG_TEMP_CRIT_H;
3540
3541 break;
3542 case nct6116:
3543 data->in_num = 9;
3544 data->pwm_num = 3;
3545 data->auto_pwm_num = 4;
3546 data->temp_fixed_num = 3;
3547 data->num_temp_alarms = 3;
3548 data->num_temp_beeps = 3;
3549
3550 data->fan_from_reg = fan_from_reg13;
3551 data->fan_from_reg_min = fan_from_reg13;
3552
3553 data->temp_label = nct6776_temp_label;
3554 data->temp_mask = NCT6776_TEMP_MASK;
3555 data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK;
3556
3557 data->REG_VBAT = NCT6106_REG_VBAT;
3558 data->REG_DIODE = NCT6106_REG_DIODE;
3559 data->DIODE_MASK = NCT6106_DIODE_MASK;
3560 data->REG_VIN = NCT6106_REG_IN;
3561 data->REG_IN_MINMAX[0] = NCT6106_REG_IN_MIN;
3562 data->REG_IN_MINMAX[1] = NCT6106_REG_IN_MAX;
3563 data->REG_TARGET = NCT6116_REG_TARGET;
3564 data->REG_FAN = NCT6116_REG_FAN;
3565 data->REG_FAN_MODE = NCT6116_REG_FAN_MODE;
3566 data->REG_FAN_MIN = NCT6116_REG_FAN_MIN;
3567 data->REG_FAN_PULSES = NCT6116_REG_FAN_PULSES;
3568 data->FAN_PULSE_SHIFT = NCT6116_FAN_PULSE_SHIFT;
3569 data->REG_FAN_TIME[0] = NCT6116_REG_FAN_STOP_TIME;
3570 data->REG_FAN_TIME[1] = NCT6116_REG_FAN_STEP_UP_TIME;
3571 data->REG_FAN_TIME[2] = NCT6116_REG_FAN_STEP_DOWN_TIME;
3572 data->REG_TOLERANCE_H = NCT6116_REG_TOLERANCE_H;
3573 data->REG_PWM[0] = NCT6116_REG_PWM;
3574 data->REG_PWM[1] = NCT6116_REG_FAN_START_OUTPUT;
3575 data->REG_PWM[2] = NCT6116_REG_FAN_STOP_OUTPUT;
3576 data->REG_PWM[5] = NCT6106_REG_WEIGHT_DUTY_STEP;
3577 data->REG_PWM[6] = NCT6106_REG_WEIGHT_DUTY_BASE;
3578 data->REG_PWM_READ = NCT6106_REG_PWM_READ;
3579 data->REG_PWM_MODE = NCT6106_REG_PWM_MODE;
3580 data->PWM_MODE_MASK = NCT6106_PWM_MODE_MASK;
3581 data->REG_AUTO_TEMP = NCT6116_REG_AUTO_TEMP;
3582 data->REG_AUTO_PWM = NCT6116_REG_AUTO_PWM;
3583 data->REG_CRITICAL_TEMP = NCT6116_REG_CRITICAL_TEMP;
3584 data->REG_CRITICAL_TEMP_TOLERANCE
3585 = NCT6116_REG_CRITICAL_TEMP_TOLERANCE;
3586 data->REG_CRITICAL_PWM_ENABLE = NCT6116_REG_CRITICAL_PWM_ENABLE;
3587 data->CRITICAL_PWM_ENABLE_MASK
3588 = NCT6106_CRITICAL_PWM_ENABLE_MASK;
3589 data->REG_CRITICAL_PWM = NCT6116_REG_CRITICAL_PWM;
3590 data->REG_TEMP_OFFSET = NCT6106_REG_TEMP_OFFSET;
3591 data->REG_TEMP_SOURCE = NCT6116_REG_TEMP_SOURCE;
3592 data->REG_TEMP_SEL = NCT6116_REG_TEMP_SEL;
3593 data->REG_WEIGHT_TEMP_SEL = NCT6106_REG_WEIGHT_TEMP_SEL;
3594 data->REG_WEIGHT_TEMP[0] = NCT6106_REG_WEIGHT_TEMP_STEP;
3595 data->REG_WEIGHT_TEMP[1] = NCT6106_REG_WEIGHT_TEMP_STEP_TOL;
3596 data->REG_WEIGHT_TEMP[2] = NCT6106_REG_WEIGHT_TEMP_BASE;
3597 data->REG_ALARM = NCT6106_REG_ALARM;
3598 data->ALARM_BITS = NCT6116_ALARM_BITS;
3599 data->REG_BEEP = NCT6106_REG_BEEP;
3600 data->BEEP_BITS = NCT6116_BEEP_BITS;
3601 data->REG_TSI_TEMP = NCT6116_REG_TSI_TEMP;
3602
3603 reg_temp = NCT6106_REG_TEMP;
3604 reg_temp_mon = NCT6106_REG_TEMP_MON;
3605 num_reg_temp = ARRAY_SIZE(NCT6106_REG_TEMP);
3606 num_reg_temp_mon = ARRAY_SIZE(NCT6106_REG_TEMP_MON);
3607 num_reg_tsi_temp = ARRAY_SIZE(NCT6116_REG_TSI_TEMP);
3608 reg_temp_over = NCT6106_REG_TEMP_OVER;
3609 reg_temp_hyst = NCT6106_REG_TEMP_HYST;
3610 reg_temp_config = NCT6106_REG_TEMP_CONFIG;
3611 reg_temp_alternate = NCT6106_REG_TEMP_ALTERNATE;
3612 reg_temp_crit = NCT6106_REG_TEMP_CRIT;
3613 reg_temp_crit_l = NCT6106_REG_TEMP_CRIT_L;
3614 reg_temp_crit_h = NCT6106_REG_TEMP_CRIT_H;
3615
3616 break;
3617 case nct6775:
3618 data->in_num = 9;
3619 data->pwm_num = 3;
3620 data->auto_pwm_num = 6;
3621 data->has_fan_div = true;
3622 data->temp_fixed_num = 3;
3623 data->num_temp_alarms = 3;
3624 data->num_temp_beeps = 3;
3625
3626 data->ALARM_BITS = NCT6775_ALARM_BITS;
3627 data->BEEP_BITS = NCT6775_BEEP_BITS;
3628
3629 data->fan_from_reg = fan_from_reg16;
3630 data->fan_from_reg_min = fan_from_reg8;
3631 data->target_temp_mask = 0x7f;
3632 data->tolerance_mask = 0x0f;
3633 data->speed_tolerance_limit = 15;
3634
3635 data->temp_label = nct6775_temp_label;
3636 data->temp_mask = NCT6775_TEMP_MASK;
3637 data->virt_temp_mask = NCT6775_VIRT_TEMP_MASK;
3638
3639 data->REG_CONFIG = NCT6775_REG_CONFIG;
3640 data->REG_VBAT = NCT6775_REG_VBAT;
3641 data->REG_DIODE = NCT6775_REG_DIODE;
3642 data->DIODE_MASK = NCT6775_DIODE_MASK;
3643 data->REG_VIN = NCT6775_REG_IN;
3644 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN;
3645 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX;
3646 data->REG_TARGET = NCT6775_REG_TARGET;
3647 data->REG_FAN = NCT6775_REG_FAN;
3648 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE;
3649 data->REG_FAN_MIN = NCT6775_REG_FAN_MIN;
3650 data->REG_FAN_PULSES = NCT6775_REG_FAN_PULSES;
3651 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
3652 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME;
3653 data->REG_FAN_TIME[1] = NCT6775_REG_FAN_STEP_UP_TIME;
3654 data->REG_FAN_TIME[2] = NCT6775_REG_FAN_STEP_DOWN_TIME;
3655 data->REG_PWM[0] = NCT6775_REG_PWM;
3656 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT;
3657 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT;
3658 data->REG_PWM[3] = NCT6775_REG_FAN_MAX_OUTPUT;
3659 data->REG_PWM[4] = NCT6775_REG_FAN_STEP_OUTPUT;
3660 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP;
3661 data->REG_PWM_READ = NCT6775_REG_PWM_READ;
3662 data->REG_PWM_MODE = NCT6775_REG_PWM_MODE;
3663 data->PWM_MODE_MASK = NCT6775_PWM_MODE_MASK;
3664 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP;
3665 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM;
3666 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP;
3667 data->REG_CRITICAL_TEMP_TOLERANCE
3668 = NCT6775_REG_CRITICAL_TEMP_TOLERANCE;
3669 data->REG_TEMP_OFFSET = NCT6775_REG_TEMP_OFFSET;
3670 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE;
3671 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL;
3672 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL;
3673 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP;
3674 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL;
3675 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE;
3676 data->REG_ALARM = NCT6775_REG_ALARM;
3677 data->REG_BEEP = NCT6775_REG_BEEP;
3678 data->REG_TSI_TEMP = NCT6775_REG_TSI_TEMP;
3679
3680 reg_temp = NCT6775_REG_TEMP;
3681 reg_temp_mon = NCT6775_REG_TEMP_MON;
3682 num_reg_temp = ARRAY_SIZE(NCT6775_REG_TEMP);
3683 num_reg_temp_mon = ARRAY_SIZE(NCT6775_REG_TEMP_MON);
3684 num_reg_tsi_temp = ARRAY_SIZE(NCT6775_REG_TSI_TEMP);
3685 reg_temp_over = NCT6775_REG_TEMP_OVER;
3686 reg_temp_hyst = NCT6775_REG_TEMP_HYST;
3687 reg_temp_config = NCT6775_REG_TEMP_CONFIG;
3688 reg_temp_alternate = NCT6775_REG_TEMP_ALTERNATE;
3689 reg_temp_crit = NCT6775_REG_TEMP_CRIT;
3690
3691 break;
3692 case nct6776:
3693 data->in_num = 9;
3694 data->pwm_num = 3;
3695 data->auto_pwm_num = 4;
3696 data->has_fan_div = false;
3697 data->temp_fixed_num = 3;
3698 data->num_temp_alarms = 3;
3699 data->num_temp_beeps = 6;
3700
3701 data->ALARM_BITS = NCT6776_ALARM_BITS;
3702 data->BEEP_BITS = NCT6776_BEEP_BITS;
3703
3704 data->fan_from_reg = fan_from_reg13;
3705 data->fan_from_reg_min = fan_from_reg13;
3706 data->target_temp_mask = 0xff;
3707 data->tolerance_mask = 0x07;
3708 data->speed_tolerance_limit = 63;
3709
3710 data->temp_label = nct6776_temp_label;
3711 data->temp_mask = NCT6776_TEMP_MASK;
3712 data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK;
3713
3714 data->REG_CONFIG = NCT6775_REG_CONFIG;
3715 data->REG_VBAT = NCT6775_REG_VBAT;
3716 data->REG_DIODE = NCT6775_REG_DIODE;
3717 data->DIODE_MASK = NCT6775_DIODE_MASK;
3718 data->REG_VIN = NCT6775_REG_IN;
3719 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN;
3720 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX;
3721 data->REG_TARGET = NCT6775_REG_TARGET;
3722 data->REG_FAN = NCT6775_REG_FAN;
3723 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE;
3724 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN;
3725 data->REG_FAN_PULSES = NCT6776_REG_FAN_PULSES;
3726 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
3727 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME;
3728 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME;
3729 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME;
3730 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H;
3731 data->REG_PWM[0] = NCT6775_REG_PWM;
3732 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT;
3733 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT;
3734 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP;
3735 data->REG_PWM[6] = NCT6776_REG_WEIGHT_DUTY_BASE;
3736 data->REG_PWM_READ = NCT6775_REG_PWM_READ;
3737 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE;
3738 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK;
3739 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP;
3740 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM;
3741 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP;
3742 data->REG_CRITICAL_TEMP_TOLERANCE
3743 = NCT6775_REG_CRITICAL_TEMP_TOLERANCE;
3744 data->REG_TEMP_OFFSET = NCT6775_REG_TEMP_OFFSET;
3745 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE;
3746 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL;
3747 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL;
3748 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP;
3749 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL;
3750 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE;
3751 data->REG_ALARM = NCT6775_REG_ALARM;
3752 data->REG_BEEP = NCT6776_REG_BEEP;
3753 data->REG_TSI_TEMP = NCT6776_REG_TSI_TEMP;
3754
3755 reg_temp = NCT6775_REG_TEMP;
3756 reg_temp_mon = NCT6775_REG_TEMP_MON;
3757 num_reg_temp = ARRAY_SIZE(NCT6775_REG_TEMP);
3758 num_reg_temp_mon = ARRAY_SIZE(NCT6775_REG_TEMP_MON);
3759 num_reg_tsi_temp = ARRAY_SIZE(NCT6776_REG_TSI_TEMP);
3760 reg_temp_over = NCT6775_REG_TEMP_OVER;
3761 reg_temp_hyst = NCT6775_REG_TEMP_HYST;
3762 reg_temp_config = NCT6776_REG_TEMP_CONFIG;
3763 reg_temp_alternate = NCT6776_REG_TEMP_ALTERNATE;
3764 reg_temp_crit = NCT6776_REG_TEMP_CRIT;
3765
3766 break;
3767 case nct6779:
3768 data->in_num = 15;
3769 data->pwm_num = 5;
3770 data->auto_pwm_num = 4;
3771 data->has_fan_div = false;
3772 data->temp_fixed_num = 6;
3773 data->num_temp_alarms = 2;
3774 data->num_temp_beeps = 2;
3775
3776 data->ALARM_BITS = NCT6779_ALARM_BITS;
3777 data->BEEP_BITS = NCT6779_BEEP_BITS;
3778
3779 data->fan_from_reg = fan_from_reg_rpm;
3780 data->fan_from_reg_min = fan_from_reg13;
3781 data->target_temp_mask = 0xff;
3782 data->tolerance_mask = 0x07;
3783 data->speed_tolerance_limit = 63;
3784
3785 data->temp_label = nct6779_temp_label;
3786 data->temp_mask = NCT6779_TEMP_MASK;
3787 data->virt_temp_mask = NCT6779_VIRT_TEMP_MASK;
3788
3789 data->REG_CONFIG = NCT6775_REG_CONFIG;
3790 data->REG_VBAT = NCT6775_REG_VBAT;
3791 data->REG_DIODE = NCT6775_REG_DIODE;
3792 data->DIODE_MASK = NCT6775_DIODE_MASK;
3793 data->REG_VIN = NCT6779_REG_IN;
3794 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN;
3795 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX;
3796 data->REG_TARGET = NCT6775_REG_TARGET;
3797 data->REG_FAN = NCT6779_REG_FAN;
3798 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE;
3799 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN;
3800 data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES;
3801 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
3802 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME;
3803 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME;
3804 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME;
3805 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H;
3806 data->REG_PWM[0] = NCT6775_REG_PWM;
3807 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT;
3808 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT;
3809 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP;
3810 data->REG_PWM[6] = NCT6776_REG_WEIGHT_DUTY_BASE;
3811 data->REG_PWM_READ = NCT6775_REG_PWM_READ;
3812 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE;
3813 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK;
3814 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP;
3815 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM;
3816 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP;
3817 data->REG_CRITICAL_TEMP_TOLERANCE
3818 = NCT6775_REG_CRITICAL_TEMP_TOLERANCE;
3819 data->REG_CRITICAL_PWM_ENABLE = NCT6779_REG_CRITICAL_PWM_ENABLE;
3820 data->CRITICAL_PWM_ENABLE_MASK
3821 = NCT6779_CRITICAL_PWM_ENABLE_MASK;
3822 data->REG_CRITICAL_PWM = NCT6779_REG_CRITICAL_PWM;
3823 data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET;
3824 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE;
3825 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL;
3826 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL;
3827 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP;
3828 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL;
3829 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE;
3830 data->REG_ALARM = NCT6779_REG_ALARM;
3831 data->REG_BEEP = NCT6776_REG_BEEP;
3832 data->REG_TSI_TEMP = NCT6776_REG_TSI_TEMP;
3833
3834 reg_temp = NCT6779_REG_TEMP;
3835 reg_temp_mon = NCT6779_REG_TEMP_MON;
3836 num_reg_temp = ARRAY_SIZE(NCT6779_REG_TEMP);
3837 num_reg_temp_mon = ARRAY_SIZE(NCT6779_REG_TEMP_MON);
3838 num_reg_tsi_temp = ARRAY_SIZE(NCT6776_REG_TSI_TEMP);
3839 reg_temp_over = NCT6779_REG_TEMP_OVER;
3840 reg_temp_hyst = NCT6779_REG_TEMP_HYST;
3841 reg_temp_config = NCT6779_REG_TEMP_CONFIG;
3842 reg_temp_alternate = NCT6779_REG_TEMP_ALTERNATE;
3843 reg_temp_crit = NCT6779_REG_TEMP_CRIT;
3844
3845 break;
3846 case nct6791:
3847 case nct6792:
3848 case nct6793:
3849 case nct6795:
3850 case nct6796:
3851 case nct6797:
3852 case nct6798:
3853 case nct6799:
> 3854 bitmap_set(data->have_in, 0, 15);
3855 data->pwm_num = (data->kind == nct6796 ||
3856 data->kind == nct6797 ||
3857 data->kind == nct6798 ||
3858 data->kind == nct6799) ? 7 : 6;
3859 data->auto_pwm_num = 4;
3860 data->has_fan_div = false;
3861 data->temp_fixed_num = 6;
3862 data->num_temp_alarms = 2;
3863 data->num_temp_beeps = 2;
3864
3865 data->ALARM_BITS = NCT6791_ALARM_BITS;
3866 data->BEEP_BITS = NCT6779_BEEP_BITS;
3867
3868 data->fan_from_reg = fan_from_reg_rpm;
3869 data->fan_from_reg_min = fan_from_reg13;
3870 data->target_temp_mask = 0xff;
3871 data->tolerance_mask = 0x07;
3872 data->speed_tolerance_limit = 63;
3873
3874 switch (data->kind) {
3875 default:
3876 case nct6791:
3877 data->temp_label = nct6779_temp_label;
3878 data->temp_mask = NCT6791_TEMP_MASK;
3879 data->virt_temp_mask = NCT6791_VIRT_TEMP_MASK;
3880 break;
3881 case nct6792:
3882 data->temp_label = nct6792_temp_label;
3883 data->temp_mask = NCT6792_TEMP_MASK;
3884 data->virt_temp_mask = NCT6792_VIRT_TEMP_MASK;
3885 break;
3886 case nct6793:
3887 data->temp_label = nct6793_temp_label;
3888 data->temp_mask = NCT6793_TEMP_MASK;
3889 data->virt_temp_mask = NCT6793_VIRT_TEMP_MASK;
3890 break;
3891 case nct6795:
3892 case nct6797:
3893 data->temp_label = nct6795_temp_label;
3894 data->temp_mask = NCT6795_TEMP_MASK;
3895 data->virt_temp_mask = NCT6795_VIRT_TEMP_MASK;
3896 break;
3897 case nct6796:
3898 data->temp_label = nct6796_temp_label;
3899 data->temp_mask = NCT6796_TEMP_MASK;
3900 data->virt_temp_mask = NCT6796_VIRT_TEMP_MASK;
3901 break;
3902 case nct6798:
3903 data->temp_label = nct6798_temp_label;
3904 data->temp_mask = NCT6798_TEMP_MASK;
3905 data->virt_temp_mask = NCT6798_VIRT_TEMP_MASK;
3906 break;
3907 case nct6799:
3908 data->temp_label = nct6799_temp_label;
3909 data->temp_mask = NCT6799_TEMP_MASK;
3910 data->virt_temp_mask = NCT6799_VIRT_TEMP_MASK;
3911 break;
3912 }
3913
3914 data->REG_CONFIG = NCT6775_REG_CONFIG;
3915 data->REG_VBAT = NCT6775_REG_VBAT;
3916 data->REG_DIODE = NCT6775_REG_DIODE;
3917 data->DIODE_MASK = NCT6775_DIODE_MASK;
3918 data->REG_VIN = NCT6779_REG_IN;
3919 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN;
3920 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX;
3921 data->REG_TARGET = NCT6775_REG_TARGET;
3922 data->REG_FAN = NCT6779_REG_FAN;
3923 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE;
3924 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN;
3925 data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES;
3926 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
3927 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME;
3928 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME;
3929 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME;
3930 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H;
3931 data->REG_PWM[0] = NCT6775_REG_PWM;
3932 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT;
3933 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT;
3934 data->REG_PWM[5] = NCT6791_REG_WEIGHT_DUTY_STEP;
3935 data->REG_PWM[6] = NCT6791_REG_WEIGHT_DUTY_BASE;
3936 data->REG_PWM_READ = NCT6775_REG_PWM_READ;
3937 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE;
3938 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK;
3939 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP;
3940 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM;
3941 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP;
3942 data->REG_CRITICAL_TEMP_TOLERANCE
3943 = NCT6775_REG_CRITICAL_TEMP_TOLERANCE;
3944 data->REG_CRITICAL_PWM_ENABLE = NCT6779_REG_CRITICAL_PWM_ENABLE;
3945 data->CRITICAL_PWM_ENABLE_MASK
3946 = NCT6779_CRITICAL_PWM_ENABLE_MASK;
3947 data->REG_CRITICAL_PWM = NCT6779_REG_CRITICAL_PWM;
3948 data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET;
3949 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE;
3950 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL;
3951 data->REG_WEIGHT_TEMP_SEL = NCT6791_REG_WEIGHT_TEMP_SEL;
3952 data->REG_WEIGHT_TEMP[0] = NCT6791_REG_WEIGHT_TEMP_STEP;
3953 data->REG_WEIGHT_TEMP[1] = NCT6791_REG_WEIGHT_TEMP_STEP_TOL;
3954 data->REG_WEIGHT_TEMP[2] = NCT6791_REG_WEIGHT_TEMP_BASE;
3955 data->REG_ALARM = NCT6791_REG_ALARM;
3956 if (data->kind == nct6791)
3957 data->REG_BEEP = NCT6776_REG_BEEP;
3958 else
3959 data->REG_BEEP = NCT6792_REG_BEEP;
3960 switch (data->kind) {
3961 case nct6791:
3962 case nct6792:
3963 case nct6793:
3964 data->REG_TSI_TEMP = NCT6776_REG_TSI_TEMP;
3965 num_reg_tsi_temp = ARRAY_SIZE(NCT6776_REG_TSI_TEMP);
3966 break;
3967 case nct6795:
3968 case nct6796:
3969 case nct6797:
3970 case nct6798:
3971 case nct6799:
3972 data->REG_TSI_TEMP = NCT6796_REG_TSI_TEMP;
3973 num_reg_tsi_temp = ARRAY_SIZE(NCT6796_REG_TSI_TEMP);
3974 break;
3975 default:
3976 num_reg_tsi_temp = 0;
3977 break;
3978 }
3979
3980 reg_temp = NCT6779_REG_TEMP;
3981 num_reg_temp = ARRAY_SIZE(NCT6779_REG_TEMP);
3982 if (data->kind == nct6791) {
3983 reg_temp_mon = NCT6779_REG_TEMP_MON;
3984 num_reg_temp_mon = ARRAY_SIZE(NCT6779_REG_TEMP_MON);
3985 } else {
3986 reg_temp_mon = NCT6792_REG_TEMP_MON;
3987 num_reg_temp_mon = ARRAY_SIZE(NCT6792_REG_TEMP_MON);
3988 }
3989 reg_temp_over = NCT6779_REG_TEMP_OVER;
3990 reg_temp_hyst = NCT6779_REG_TEMP_HYST;
3991 reg_temp_config = NCT6779_REG_TEMP_CONFIG;
3992 reg_temp_alternate = NCT6779_REG_TEMP_ALTERNATE;
3993 reg_temp_crit = NCT6779_REG_TEMP_CRIT;
3994
3995 break;
3996 default:
3997 return -ENODEV;
3998 }
3999 data->have_in = BIT(data->in_num) - 1;
4000 data->have_temp = 0;
4001
4002 /*
4003 * On some boards, not all available temperature sources are monitored,
4004 * even though some of the monitoring registers are unused.
4005 * Get list of unused monitoring registers, then detect if any fan
4006 * controls are configured to use unmonitored temperature sources.
4007 * If so, assign the unmonitored temperature sources to available
4008 * monitoring registers.
4009 */
4010 mask = 0;
4011 available = 0;
4012 for (i = 0; i < num_reg_temp; i++) {
4013 if (reg_temp[i] == 0)
4014 continue;
4015
4016 err = nct6775_read_value(data, data->REG_TEMP_SOURCE[i], &src);
4017 if (err)
4018 return err;
4019 src &= 0x1f;
4020 if (!src || (mask & BIT(src)))
4021 available |= BIT(i);
4022
4023 mask |= BIT(src);
4024 }
4025
4026 /*
4027 * Now find unmonitored temperature registers and enable monitoring
4028 * if additional monitoring registers are available.
4029 */
4030 err = add_temp_sensors(data, data->REG_TEMP_SEL, &available, &mask);
4031 if (err)
4032 return err;
4033 err = add_temp_sensors(data, data->REG_WEIGHT_TEMP_SEL, &available, &mask);
4034 if (err)
4035 return err;
4036
4037 mask = 0;
4038 s = NUM_TEMP_FIXED; /* First dynamic temperature attribute */
4039 for (i = 0; i < num_reg_temp; i++) {
4040 if (reg_temp[i] == 0)
4041 continue;
4042
4043 err = nct6775_read_value(data, data->REG_TEMP_SOURCE[i], &src);
4044 if (err)
4045 return err;
4046 src &= 0x1f;
4047 if (!src || (mask & BIT(src)))
4048 continue;
4049
4050 if (!(data->temp_mask & BIT(src))) {
4051 dev_info(dev,
4052 "Invalid temperature source %d at index %d, source register 0x%x, temp register 0x%x\n",
4053 src, i, data->REG_TEMP_SOURCE[i], reg_temp[i]);
4054 continue;
4055 }
4056
4057 mask |= BIT(src);
4058
4059 /* Use fixed index for SYSTIN(1), CPUTIN(2), AUXTIN(3) */
4060 if (src <= data->temp_fixed_num) {
4061 data->have_temp |= BIT(src - 1);
4062 data->have_temp_fixed |= BIT(src - 1);
4063 data->reg_temp[0][src - 1] = reg_temp[i];
4064 data->reg_temp[1][src - 1] = reg_temp_over[i];
4065 data->reg_temp[2][src - 1] = reg_temp_hyst[i];
4066 if (reg_temp_crit_h && reg_temp_crit_h[i])
4067 data->reg_temp[3][src - 1] = reg_temp_crit_h[i];
4068 else if (reg_temp_crit[src - 1])
4069 data->reg_temp[3][src - 1]
4070 = reg_temp_crit[src - 1];
4071 if (reg_temp_crit_l && reg_temp_crit_l[i])
4072 data->reg_temp[4][src - 1] = reg_temp_crit_l[i];
4073 data->reg_temp_config[src - 1] = reg_temp_config[i];
4074 data->temp_src[src - 1] = src;
4075 continue;
4076 }
4077
4078 if (s >= NUM_TEMP)
4079 continue;
4080
4081 /* Use dynamic index for other sources */
4082 data->have_temp |= BIT(s);
4083 data->reg_temp[0][s] = reg_temp[i];
4084 data->reg_temp[1][s] = reg_temp_over[i];
4085 data->reg_temp[2][s] = reg_temp_hyst[i];
4086 data->reg_temp_config[s] = reg_temp_config[i];
4087 if (reg_temp_crit_h && reg_temp_crit_h[i])
4088 data->reg_temp[3][s] = reg_temp_crit_h[i];
4089 else if (reg_temp_crit[src - 1])
4090 data->reg_temp[3][s] = reg_temp_crit[src - 1];
4091 if (reg_temp_crit_l && reg_temp_crit_l[i])
4092 data->reg_temp[4][s] = reg_temp_crit_l[i];
4093
4094 data->temp_src[s] = src;
4095 s++;
4096 }
4097
4098 /*
4099 * Repeat with temperatures used for fan control.
4100 * This set of registers does not support limits.
4101 */
4102 for (i = 0; i < num_reg_temp_mon; i++) {
4103 if (reg_temp_mon[i] == 0)
4104 continue;
4105
4106 err = nct6775_read_value(data, data->REG_TEMP_SEL[i], &src);
4107 if (err)
4108 return err;
4109 src &= 0x1f;
4110 if (!src)
4111 continue;
4112
4113 if (!(data->temp_mask & BIT(src))) {
4114 dev_info(dev,
4115 "Invalid temperature source %d at index %d, source register 0x%x, temp register 0x%x\n",
4116 src, i, data->REG_TEMP_SEL[i],
4117 reg_temp_mon[i]);
4118 continue;
4119 }
4120
4121 /*
4122 * For virtual temperature sources, the 'virtual' temperature
4123 * for each fan reflects a different temperature, and there
4124 * are no duplicates.
4125 */
4126 if (!(data->virt_temp_mask & BIT(src))) {
4127 if (mask & BIT(src))
4128 continue;
4129 mask |= BIT(src);
4130 }
4131
4132 /* Use fixed index for SYSTIN(1), CPUTIN(2), AUXTIN(3) */
4133 if (src <= data->temp_fixed_num) {
4134 if (data->have_temp & BIT(src - 1))
4135 continue;
4136 data->have_temp |= BIT(src - 1);
4137 data->have_temp_fixed |= BIT(src - 1);
4138 data->reg_temp[0][src - 1] = reg_temp_mon[i];
4139 data->temp_src[src - 1] = src;
4140 continue;
4141 }
4142
4143 if (s >= NUM_TEMP)
4144 continue;
4145
4146 /* Use dynamic index for other sources */
4147 data->have_temp |= BIT(s);
4148 data->reg_temp[0][s] = reg_temp_mon[i];
4149 data->temp_src[s] = src;
4150 s++;
4151 }
4152

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki