aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hwmon')
-rw-r--r--drivers/hwmon/nct6775.c72
-rw-r--r--drivers/hwmon/raspberrypi-hwmon.c1
2 files changed, 50 insertions, 23 deletions
diff --git a/drivers/hwmon/nct6775.c b/drivers/hwmon/nct6775.c
index 944f5b63aecd..78603b78cf41 100644
--- a/drivers/hwmon/nct6775.c
+++ b/drivers/hwmon/nct6775.c
@@ -207,8 +207,6 @@ superio_exit(int ioreg)
207 207
208#define NUM_FAN 7 208#define NUM_FAN 7
209 209
210#define TEMP_SOURCE_VIRTUAL 0x1f
211
212/* Common and NCT6775 specific data */ 210/* Common and NCT6775 specific data */
213 211
214/* Voltage min/max registers for nr=7..14 are in bank 5 */ 212/* Voltage min/max registers for nr=7..14 are in bank 5 */
@@ -299,8 +297,9 @@ static const u16 NCT6775_REG_PWM_READ[] = {
299 297
300static const u16 NCT6775_REG_FAN[] = { 0x630, 0x632, 0x634, 0x636, 0x638 }; 298static const u16 NCT6775_REG_FAN[] = { 0x630, 0x632, 0x634, 0x636, 0x638 };
301static const u16 NCT6775_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d }; 299static const u16 NCT6775_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d };
302static const u16 NCT6775_REG_FAN_PULSES[] = { 0x641, 0x642, 0x643, 0x644, 0 }; 300static const u16 NCT6775_REG_FAN_PULSES[NUM_FAN] = {
303static const u16 NCT6775_FAN_PULSE_SHIFT[] = { 0, 0, 0, 0, 0, 0 }; 301 0x641, 0x642, 0x643, 0x644 };
302static const u16 NCT6775_FAN_PULSE_SHIFT[NUM_FAN] = { };
304 303
305static const u16 NCT6775_REG_TEMP[] = { 304static const u16 NCT6775_REG_TEMP[] = {
306 0x27, 0x150, 0x250, 0x62b, 0x62c, 0x62d }; 305 0x27, 0x150, 0x250, 0x62b, 0x62c, 0x62d };
@@ -373,6 +372,7 @@ static const char *const nct6775_temp_label[] = {
373}; 372};
374 373
375#define NCT6775_TEMP_MASK 0x001ffffe 374#define NCT6775_TEMP_MASK 0x001ffffe
375#define NCT6775_VIRT_TEMP_MASK 0x00000000
376 376
377static const u16 NCT6775_REG_TEMP_ALTERNATE[32] = { 377static const u16 NCT6775_REG_TEMP_ALTERNATE[32] = {
378 [13] = 0x661, 378 [13] = 0x661,
@@ -425,8 +425,8 @@ static const u8 NCT6776_PWM_MODE_MASK[] = { 0x01, 0, 0, 0, 0, 0 };
425 425
426static const u16 NCT6776_REG_FAN_MIN[] = { 426static const u16 NCT6776_REG_FAN_MIN[] = {
427 0x63a, 0x63c, 0x63e, 0x640, 0x642, 0x64a, 0x64c }; 427 0x63a, 0x63c, 0x63e, 0x640, 0x642, 0x64a, 0x64c };
428static const u16 NCT6776_REG_FAN_PULSES[] = { 428static const u16 NCT6776_REG_FAN_PULSES[NUM_FAN] = {
429 0x644, 0x645, 0x646, 0x647, 0x648, 0x649, 0 }; 429 0x644, 0x645, 0x646, 0x647, 0x648, 0x649 };
430 430
431static const u16 NCT6776_REG_WEIGHT_DUTY_BASE[] = { 431static const u16 NCT6776_REG_WEIGHT_DUTY_BASE[] = {
432 0x13e, 0x23e, 0x33e, 0x83e, 0x93e, 0xa3e }; 432 0x13e, 0x23e, 0x33e, 0x83e, 0x93e, 0xa3e };
@@ -461,6 +461,7 @@ static const char *const nct6776_temp_label[] = {
461}; 461};
462 462
463#define NCT6776_TEMP_MASK 0x007ffffe 463#define NCT6776_TEMP_MASK 0x007ffffe
464#define NCT6776_VIRT_TEMP_MASK 0x00000000
464 465
465static const u16 NCT6776_REG_TEMP_ALTERNATE[32] = { 466static const u16 NCT6776_REG_TEMP_ALTERNATE[32] = {
466 [14] = 0x401, 467 [14] = 0x401,
@@ -501,9 +502,9 @@ static const s8 NCT6779_BEEP_BITS[] = {
501 30, 31 }; /* intrusion0, intrusion1 */ 502 30, 31 }; /* intrusion0, intrusion1 */
502 503
503static const u16 NCT6779_REG_FAN[] = { 504static const u16 NCT6779_REG_FAN[] = {
504 0x4b0, 0x4b2, 0x4b4, 0x4b6, 0x4b8, 0x4ba, 0x660 }; 505 0x4c0, 0x4c2, 0x4c4, 0x4c6, 0x4c8, 0x4ca, 0x4ce };
505static const u16 NCT6779_REG_FAN_PULSES[] = { 506static const u16 NCT6779_REG_FAN_PULSES[NUM_FAN] = {
506 0x644, 0x645, 0x646, 0x647, 0x648, 0x649, 0 }; 507 0x644, 0x645, 0x646, 0x647, 0x648, 0x649 };
507 508
508static const u16 NCT6779_REG_CRITICAL_PWM_ENABLE[] = { 509static const u16 NCT6779_REG_CRITICAL_PWM_ENABLE[] = {
509 0x136, 0x236, 0x336, 0x836, 0x936, 0xa36, 0xb36 }; 510 0x136, 0x236, 0x336, 0x836, 0x936, 0xa36, 0xb36 };
@@ -559,7 +560,9 @@ static const char *const nct6779_temp_label[] = {
559}; 560};
560 561
561#define NCT6779_TEMP_MASK 0x07ffff7e 562#define NCT6779_TEMP_MASK 0x07ffff7e
563#define NCT6779_VIRT_TEMP_MASK 0x00000000
562#define NCT6791_TEMP_MASK 0x87ffff7e 564#define NCT6791_TEMP_MASK 0x87ffff7e
565#define NCT6791_VIRT_TEMP_MASK 0x80000000
563 566
564static const u16 NCT6779_REG_TEMP_ALTERNATE[32] 567static const u16 NCT6779_REG_TEMP_ALTERNATE[32]
565 = { 0x490, 0x491, 0x492, 0x493, 0x494, 0x495, 0, 0, 568 = { 0x490, 0x491, 0x492, 0x493, 0x494, 0x495, 0, 0,
@@ -638,6 +641,7 @@ static const char *const nct6792_temp_label[] = {
638}; 641};
639 642
640#define NCT6792_TEMP_MASK 0x9fffff7e 643#define NCT6792_TEMP_MASK 0x9fffff7e
644#define NCT6792_VIRT_TEMP_MASK 0x80000000
641 645
642static const char *const nct6793_temp_label[] = { 646static const char *const nct6793_temp_label[] = {
643 "", 647 "",
@@ -675,6 +679,7 @@ static const char *const nct6793_temp_label[] = {
675}; 679};
676 680
677#define NCT6793_TEMP_MASK 0xbfff037e 681#define NCT6793_TEMP_MASK 0xbfff037e
682#define NCT6793_VIRT_TEMP_MASK 0x80000000
678 683
679static const char *const nct6795_temp_label[] = { 684static const char *const nct6795_temp_label[] = {
680 "", 685 "",
@@ -712,6 +717,7 @@ static const char *const nct6795_temp_label[] = {
712}; 717};
713 718
714#define NCT6795_TEMP_MASK 0xbfffff7e 719#define NCT6795_TEMP_MASK 0xbfffff7e
720#define NCT6795_VIRT_TEMP_MASK 0x80000000
715 721
716static const char *const nct6796_temp_label[] = { 722static const char *const nct6796_temp_label[] = {
717 "", 723 "",
@@ -724,8 +730,8 @@ static const char *const nct6796_temp_label[] = {
724 "AUXTIN4", 730 "AUXTIN4",
725 "SMBUSMASTER 0", 731 "SMBUSMASTER 0",
726 "SMBUSMASTER 1", 732 "SMBUSMASTER 1",
727 "", 733 "Virtual_TEMP",
728 "", 734 "Virtual_TEMP",
729 "", 735 "",
730 "", 736 "",
731 "", 737 "",
@@ -748,7 +754,8 @@ static const char *const nct6796_temp_label[] = {
748 "Virtual_TEMP" 754 "Virtual_TEMP"
749}; 755};
750 756
751#define NCT6796_TEMP_MASK 0xbfff03fe 757#define NCT6796_TEMP_MASK 0xbfff0ffe
758#define NCT6796_VIRT_TEMP_MASK 0x80000c00
752 759
753/* NCT6102D/NCT6106D specific data */ 760/* NCT6102D/NCT6106D specific data */
754 761
@@ -779,8 +786,8 @@ static const u16 NCT6106_REG_TEMP_CONFIG[] = {
779 786
780static const u16 NCT6106_REG_FAN[] = { 0x20, 0x22, 0x24 }; 787static const u16 NCT6106_REG_FAN[] = { 0x20, 0x22, 0x24 };
781static const u16 NCT6106_REG_FAN_MIN[] = { 0xe0, 0xe2, 0xe4 }; 788static const u16 NCT6106_REG_FAN_MIN[] = { 0xe0, 0xe2, 0xe4 };
782static const u16 NCT6106_REG_FAN_PULSES[] = { 0xf6, 0xf6, 0xf6, 0, 0 }; 789static const u16 NCT6106_REG_FAN_PULSES[] = { 0xf6, 0xf6, 0xf6 };
783static const u16 NCT6106_FAN_PULSE_SHIFT[] = { 0, 2, 4, 0, 0 }; 790static const u16 NCT6106_FAN_PULSE_SHIFT[] = { 0, 2, 4 };
784 791
785static const u8 NCT6106_REG_PWM_MODE[] = { 0xf3, 0xf3, 0xf3 }; 792static const u8 NCT6106_REG_PWM_MODE[] = { 0xf3, 0xf3, 0xf3 };
786static const u8 NCT6106_PWM_MODE_MASK[] = { 0x01, 0x02, 0x04 }; 793static const u8 NCT6106_PWM_MODE_MASK[] = { 0x01, 0x02, 0x04 };
@@ -917,6 +924,11 @@ static unsigned int fan_from_reg16(u16 reg, unsigned int divreg)
917 return 1350000U / (reg << divreg); 924 return 1350000U / (reg << divreg);
918} 925}
919 926
927static unsigned int fan_from_reg_rpm(u16 reg, unsigned int divreg)
928{
929 return reg;
930}
931
920static u16 fan_to_reg(u32 fan, unsigned int divreg) 932static u16 fan_to_reg(u32 fan, unsigned int divreg)
921{ 933{
922 if (!fan) 934 if (!fan)
@@ -969,6 +981,7 @@ struct nct6775_data {
969 u16 reg_temp_config[NUM_TEMP]; 981 u16 reg_temp_config[NUM_TEMP];
970 const char * const *temp_label; 982 const char * const *temp_label;
971 u32 temp_mask; 983 u32 temp_mask;
984 u32 virt_temp_mask;
972 985
973 u16 REG_CONFIG; 986 u16 REG_CONFIG;
974 u16 REG_VBAT; 987 u16 REG_VBAT;
@@ -1276,11 +1289,11 @@ static bool is_word_sized(struct nct6775_data *data, u16 reg)
1276 case nct6795: 1289 case nct6795:
1277 case nct6796: 1290 case nct6796:
1278 return reg == 0x150 || reg == 0x153 || reg == 0x155 || 1291 return reg == 0x150 || reg == 0x153 || reg == 0x155 ||
1279 ((reg & 0xfff0) == 0x4b0 && (reg & 0x000f) < 0x0b) || 1292 (reg & 0xfff0) == 0x4c0 ||
1280 reg == 0x402 || 1293 reg == 0x402 ||
1281 reg == 0x63a || reg == 0x63c || reg == 0x63e || 1294 reg == 0x63a || reg == 0x63c || reg == 0x63e ||
1282 reg == 0x640 || reg == 0x642 || reg == 0x64a || 1295 reg == 0x640 || reg == 0x642 || reg == 0x64a ||
1283 reg == 0x64c || reg == 0x660 || 1296 reg == 0x64c ||
1284 reg == 0x73 || reg == 0x75 || reg == 0x77 || reg == 0x79 || 1297 reg == 0x73 || reg == 0x75 || reg == 0x77 || reg == 0x79 ||
1285 reg == 0x7b || reg == 0x7d; 1298 reg == 0x7b || reg == 0x7d;
1286 } 1299 }
@@ -1558,7 +1571,7 @@ static void nct6775_update_pwm(struct device *dev)
1558 reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[i]); 1571 reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[i]);
1559 data->pwm_weight_temp_sel[i] = reg & 0x1f; 1572 data->pwm_weight_temp_sel[i] = reg & 0x1f;
1560 /* If weight is disabled, report weight source as 0 */ 1573 /* If weight is disabled, report weight source as 0 */
1561 if (j == 1 && !(reg & 0x80)) 1574 if (!(reg & 0x80))
1562 data->pwm_weight_temp_sel[i] = 0; 1575 data->pwm_weight_temp_sel[i] = 0;
1563 1576
1564 /* Weight temp data */ 1577 /* Weight temp data */
@@ -1682,9 +1695,13 @@ static struct nct6775_data *nct6775_update_device(struct device *dev)
1682 if (data->has_fan_min & BIT(i)) 1695 if (data->has_fan_min & BIT(i))
1683 data->fan_min[i] = nct6775_read_value(data, 1696 data->fan_min[i] = nct6775_read_value(data,
1684 data->REG_FAN_MIN[i]); 1697 data->REG_FAN_MIN[i]);
1685 data->fan_pulses[i] = 1698
1686 (nct6775_read_value(data, data->REG_FAN_PULSES[i]) 1699 if (data->REG_FAN_PULSES[i]) {
1687 >> data->FAN_PULSE_SHIFT[i]) & 0x03; 1700 data->fan_pulses[i] =
1701 (nct6775_read_value(data,
1702 data->REG_FAN_PULSES[i])
1703 >> data->FAN_PULSE_SHIFT[i]) & 0x03;
1704 }
1688 1705
1689 nct6775_select_fan_div(dev, data, i, reg); 1706 nct6775_select_fan_div(dev, data, i, reg);
1690 } 1707 }
@@ -3639,6 +3656,7 @@ static int nct6775_probe(struct platform_device *pdev)
3639 3656
3640 data->temp_label = nct6776_temp_label; 3657 data->temp_label = nct6776_temp_label;
3641 data->temp_mask = NCT6776_TEMP_MASK; 3658 data->temp_mask = NCT6776_TEMP_MASK;
3659 data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK;
3642 3660
3643 data->REG_VBAT = NCT6106_REG_VBAT; 3661 data->REG_VBAT = NCT6106_REG_VBAT;
3644 data->REG_DIODE = NCT6106_REG_DIODE; 3662 data->REG_DIODE = NCT6106_REG_DIODE;
@@ -3717,6 +3735,7 @@ static int nct6775_probe(struct platform_device *pdev)
3717 3735
3718 data->temp_label = nct6775_temp_label; 3736 data->temp_label = nct6775_temp_label;
3719 data->temp_mask = NCT6775_TEMP_MASK; 3737 data->temp_mask = NCT6775_TEMP_MASK;
3738 data->virt_temp_mask = NCT6775_VIRT_TEMP_MASK;
3720 3739
3721 data->REG_CONFIG = NCT6775_REG_CONFIG; 3740 data->REG_CONFIG = NCT6775_REG_CONFIG;
3722 data->REG_VBAT = NCT6775_REG_VBAT; 3741 data->REG_VBAT = NCT6775_REG_VBAT;
@@ -3789,6 +3808,7 @@ static int nct6775_probe(struct platform_device *pdev)
3789 3808
3790 data->temp_label = nct6776_temp_label; 3809 data->temp_label = nct6776_temp_label;
3791 data->temp_mask = NCT6776_TEMP_MASK; 3810 data->temp_mask = NCT6776_TEMP_MASK;
3811 data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK;
3792 3812
3793 data->REG_CONFIG = NCT6775_REG_CONFIG; 3813 data->REG_CONFIG = NCT6775_REG_CONFIG;
3794 data->REG_VBAT = NCT6775_REG_VBAT; 3814 data->REG_VBAT = NCT6775_REG_VBAT;
@@ -3853,7 +3873,7 @@ static int nct6775_probe(struct platform_device *pdev)
3853 data->ALARM_BITS = NCT6779_ALARM_BITS; 3873 data->ALARM_BITS = NCT6779_ALARM_BITS;
3854 data->BEEP_BITS = NCT6779_BEEP_BITS; 3874 data->BEEP_BITS = NCT6779_BEEP_BITS;
3855 3875
3856 data->fan_from_reg = fan_from_reg13; 3876 data->fan_from_reg = fan_from_reg_rpm;
3857 data->fan_from_reg_min = fan_from_reg13; 3877 data->fan_from_reg_min = fan_from_reg13;
3858 data->target_temp_mask = 0xff; 3878 data->target_temp_mask = 0xff;
3859 data->tolerance_mask = 0x07; 3879 data->tolerance_mask = 0x07;
@@ -3861,6 +3881,7 @@ static int nct6775_probe(struct platform_device *pdev)
3861 3881
3862 data->temp_label = nct6779_temp_label; 3882 data->temp_label = nct6779_temp_label;
3863 data->temp_mask = NCT6779_TEMP_MASK; 3883 data->temp_mask = NCT6779_TEMP_MASK;
3884 data->virt_temp_mask = NCT6779_VIRT_TEMP_MASK;
3864 3885
3865 data->REG_CONFIG = NCT6775_REG_CONFIG; 3886 data->REG_CONFIG = NCT6775_REG_CONFIG;
3866 data->REG_VBAT = NCT6775_REG_VBAT; 3887 data->REG_VBAT = NCT6775_REG_VBAT;
@@ -3933,7 +3954,7 @@ static int nct6775_probe(struct platform_device *pdev)
3933 data->ALARM_BITS = NCT6791_ALARM_BITS; 3954 data->ALARM_BITS = NCT6791_ALARM_BITS;
3934 data->BEEP_BITS = NCT6779_BEEP_BITS; 3955 data->BEEP_BITS = NCT6779_BEEP_BITS;
3935 3956
3936 data->fan_from_reg = fan_from_reg13; 3957 data->fan_from_reg = fan_from_reg_rpm;
3937 data->fan_from_reg_min = fan_from_reg13; 3958 data->fan_from_reg_min = fan_from_reg13;
3938 data->target_temp_mask = 0xff; 3959 data->target_temp_mask = 0xff;
3939 data->tolerance_mask = 0x07; 3960 data->tolerance_mask = 0x07;
@@ -3944,22 +3965,27 @@ static int nct6775_probe(struct platform_device *pdev)
3944 case nct6791: 3965 case nct6791:
3945 data->temp_label = nct6779_temp_label; 3966 data->temp_label = nct6779_temp_label;
3946 data->temp_mask = NCT6791_TEMP_MASK; 3967 data->temp_mask = NCT6791_TEMP_MASK;
3968 data->virt_temp_mask = NCT6791_VIRT_TEMP_MASK;
3947 break; 3969 break;
3948 case nct6792: 3970 case nct6792:
3949 data->temp_label = nct6792_temp_label; 3971 data->temp_label = nct6792_temp_label;
3950 data->temp_mask = NCT6792_TEMP_MASK; 3972 data->temp_mask = NCT6792_TEMP_MASK;
3973 data->virt_temp_mask = NCT6792_VIRT_TEMP_MASK;
3951 break; 3974 break;
3952 case nct6793: 3975 case nct6793:
3953 data->temp_label = nct6793_temp_label; 3976 data->temp_label = nct6793_temp_label;
3954 data->temp_mask = NCT6793_TEMP_MASK; 3977 data->temp_mask = NCT6793_TEMP_MASK;
3978 data->virt_temp_mask = NCT6793_VIRT_TEMP_MASK;
3955 break; 3979 break;
3956 case nct6795: 3980 case nct6795:
3957 data->temp_label = nct6795_temp_label; 3981 data->temp_label = nct6795_temp_label;
3958 data->temp_mask = NCT6795_TEMP_MASK; 3982 data->temp_mask = NCT6795_TEMP_MASK;
3983 data->virt_temp_mask = NCT6795_VIRT_TEMP_MASK;
3959 break; 3984 break;
3960 case nct6796: 3985 case nct6796:
3961 data->temp_label = nct6796_temp_label; 3986 data->temp_label = nct6796_temp_label;
3962 data->temp_mask = NCT6796_TEMP_MASK; 3987 data->temp_mask = NCT6796_TEMP_MASK;
3988 data->virt_temp_mask = NCT6796_VIRT_TEMP_MASK;
3963 break; 3989 break;
3964 } 3990 }
3965 3991
@@ -4143,7 +4169,7 @@ static int nct6775_probe(struct platform_device *pdev)
4143 * for each fan reflects a different temperature, and there 4169 * for each fan reflects a different temperature, and there
4144 * are no duplicates. 4170 * are no duplicates.
4145 */ 4171 */
4146 if (src != TEMP_SOURCE_VIRTUAL) { 4172 if (!(data->virt_temp_mask & BIT(src))) {
4147 if (mask & BIT(src)) 4173 if (mask & BIT(src))
4148 continue; 4174 continue;
4149 mask |= BIT(src); 4175 mask |= BIT(src);
diff --git a/drivers/hwmon/raspberrypi-hwmon.c b/drivers/hwmon/raspberrypi-hwmon.c
index fb4e4a6bb1f6..be5ba4690895 100644
--- a/drivers/hwmon/raspberrypi-hwmon.c
+++ b/drivers/hwmon/raspberrypi-hwmon.c
@@ -164,3 +164,4 @@ module_platform_driver(rpi_hwmon_driver);
164MODULE_AUTHOR("Stefan Wahren <stefan.wahren@i2se.com>"); 164MODULE_AUTHOR("Stefan Wahren <stefan.wahren@i2se.com>");
165MODULE_DESCRIPTION("Raspberry Pi voltage sensor driver"); 165MODULE_DESCRIPTION("Raspberry Pi voltage sensor driver");
166MODULE_LICENSE("GPL v2"); 166MODULE_LICENSE("GPL v2");
167MODULE_ALIAS("platform:raspberrypi-hwmon");