Lines Matching +full:0 +full:- +full:datasheet

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * w83792d.c - Part of lm_sensors, Linux kernel modules for hardware
13 * calculation method to in6-in7(measured value, limits) is a little
15 * by CR[0x49h].
22 * w83792d 9 7 7 3 0x7a 0x5ca3 yes no
30 #include <linux/hwmon-sysfs.h>
37 static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f,
43 module_param_array(force_subclients, short, NULL, 0);
48 module_param(init, bool, 0);
53 0x20, /* Vcore A in DataSheet */
54 0x21, /* Vcore B in DataSheet */
55 0x22, /* VIN0 in DataSheet */
56 0x23, /* VIN1 in DataSheet */
57 0x24, /* VIN2 in DataSheet */
58 0x25, /* VIN3 in DataSheet */
59 0x26, /* 5VCC in DataSheet */
60 0xB0, /* 5VSB in DataSheet */
61 0xB1 /* VBAT in DataSheet */
63 #define W83792D_REG_LOW_BITS1 0x3E /* Low Bits I in DataSheet */
64 #define W83792D_REG_LOW_BITS2 0x3F /* Low Bits II in DataSheet */
66 0x2B, /* Vcore A High Limit in DataSheet */
67 0x2D, /* Vcore B High Limit in DataSheet */
68 0x2F, /* VIN0 High Limit in DataSheet */
69 0x31, /* VIN1 High Limit in DataSheet */
70 0x33, /* VIN2 High Limit in DataSheet */
71 0x35, /* VIN3 High Limit in DataSheet */
72 0x37, /* 5VCC High Limit in DataSheet */
73 0xB4, /* 5VSB High Limit in DataSheet */
74 0xB6 /* VBAT High Limit in DataSheet */
77 0x2C, /* Vcore A Low Limit in DataSheet */
78 0x2E, /* Vcore B Low Limit in DataSheet */
79 0x30, /* VIN0 Low Limit in DataSheet */
80 0x32, /* VIN1 Low Limit in DataSheet */
81 0x34, /* VIN2 Low Limit in DataSheet */
82 0x36, /* VIN3 Low Limit in DataSheet */
83 0x38, /* 5VCC Low Limit in DataSheet */
84 0xB5, /* 5VSB Low Limit in DataSheet */
85 0xB7 /* VBAT Low Limit in DataSheet */
88 0x28, /* FAN 1 Count in DataSheet */
89 0x29, /* FAN 2 Count in DataSheet */
90 0x2A, /* FAN 3 Count in DataSheet */
91 0xB8, /* FAN 4 Count in DataSheet */
92 0xB9, /* FAN 5 Count in DataSheet */
93 0xBA, /* FAN 6 Count in DataSheet */
94 0xBE /* FAN 7 Count in DataSheet */
97 0x3B, /* FAN 1 Count Low Limit in DataSheet */
98 0x3C, /* FAN 2 Count Low Limit in DataSheet */
99 0x3D, /* FAN 3 Count Low Limit in DataSheet */
100 0xBB, /* FAN 4 Count Low Limit in DataSheet */
101 0xBC, /* FAN 5 Count Low Limit in DataSheet */
102 0xBD, /* FAN 6 Count Low Limit in DataSheet */
103 0xBF /* FAN 7 Count Low Limit in DataSheet */
105 #define W83792D_REG_FAN_CFG 0x84 /* FAN Configuration in DataSheet */
107 0x47, /* contains FAN2 and FAN1 Divisor */
108 0x5B, /* contains FAN4 and FAN3 Divisor */
109 0x5C, /* contains FAN6 and FAN5 Divisor */
110 0x9E /* contains FAN7 Divisor. */
113 0x81, /* FAN 1 Duty Cycle, be used to control */
114 0x83, /* FAN 2 Duty Cycle, be used to control */
115 0x94, /* FAN 3 Duty Cycle, be used to control */
116 0xA3, /* FAN 4 Duty Cycle, be used to control */
117 0xA4, /* FAN 5 Duty Cycle, be used to control */
118 0xA5, /* FAN 6 Duty Cycle, be used to control */
119 0xA6 /* FAN 7 Duty Cycle, be used to control */
121 #define W83792D_REG_BANK 0x4E
122 #define W83792D_REG_TEMP2_CONFIG 0xC2
123 #define W83792D_REG_TEMP3_CONFIG 0xCA
126 0x27, /* TEMP 1 in DataSheet */
127 0x39, /* TEMP 1 Over in DataSheet */
128 0x3A, /* TEMP 1 Hyst in DataSheet */
132 { 0xC0, /* TEMP 2 in DataSheet */
133 0xC1, /* TEMP 2(0.5 deg) in DataSheet */
134 0xC5, /* TEMP 2 Over High part in DataSheet */
135 0xC6, /* TEMP 2 Over Low part in DataSheet */
136 0xC3, /* TEMP 2 Thyst High part in DataSheet */
137 0xC4 }, /* TEMP 2 Thyst Low part in DataSheet */
138 { 0xC8, /* TEMP 3 in DataSheet */
139 0xC9, /* TEMP 3(0.5 deg) in DataSheet */
140 0xCD, /* TEMP 3 Over High part in DataSheet */
141 0xCE, /* TEMP 3 Over Low part in DataSheet */
142 0xCB, /* TEMP 3 Thyst High part in DataSheet */
143 0xCC } /* TEMP 3 Thyst Low part in DataSheet */
147 0x85, /* SmartFanI: Fan1 target value */
148 0x86, /* SmartFanI: Fan2 target value */
149 0x96 /* SmartFanI: Fan3 target value */
153 0x87, /* (bit3-0)SmartFan Fan1 tolerance */
154 0x87, /* (bit7-4)SmartFan Fan2 tolerance */
155 0x97 /* (bit3-0)SmartFan Fan3 tolerance */
159 { 0x85, /* SmartFanII: Fan1 temp point 1 */
160 0xE3, /* SmartFanII: Fan1 temp point 2 */
161 0xE4, /* SmartFanII: Fan1 temp point 3 */
162 0xE5 }, /* SmartFanII: Fan1 temp point 4 */
163 { 0x86, /* SmartFanII: Fan2 temp point 1 */
164 0xE6, /* SmartFanII: Fan2 temp point 2 */
165 0xE7, /* SmartFanII: Fan2 temp point 3 */
166 0xE8 }, /* SmartFanII: Fan2 temp point 4 */
167 { 0x96, /* SmartFanII: Fan3 temp point 1 */
168 0xE9, /* SmartFanII: Fan3 temp point 2 */
169 0xEA, /* SmartFanII: Fan3 temp point 3 */
170 0xEB } /* SmartFanII: Fan3 temp point 4 */
174 { 0x88, /* (bit3-0) SmartFanII: Fan1 Non-Stop */
175 0x88, /* (bit7-4) SmartFanII: Fan1 Level 1 */
176 0xE0, /* (bit7-4) SmartFanII: Fan1 Level 2 */
177 0xE0 }, /* (bit3-0) SmartFanII: Fan1 Level 3 */
178 { 0x89, /* (bit3-0) SmartFanII: Fan2 Non-Stop */
179 0x89, /* (bit7-4) SmartFanII: Fan2 Level 1 */
180 0xE1, /* (bit7-4) SmartFanII: Fan2 Level 2 */
181 0xE1 }, /* (bit3-0) SmartFanII: Fan2 Level 3 */
182 { 0x98, /* (bit3-0) SmartFanII: Fan3 Non-Stop */
183 0x98, /* (bit7-4) SmartFanII: Fan3 Level 1 */
184 0xE2, /* (bit7-4) SmartFanII: Fan3 Level 2 */
185 0xE2 } /* (bit3-0) SmartFanII: Fan3 Level 3 */
188 #define W83792D_REG_GPIO_EN 0x1A
189 #define W83792D_REG_CONFIG 0x40
190 #define W83792D_REG_VID_FANDIV 0x47
191 #define W83792D_REG_CHIPID 0x49
192 #define W83792D_REG_WCHIPID 0x58
193 #define W83792D_REG_CHIPMAN 0x4F
194 #define W83792D_REG_PIN 0x4B
195 #define W83792D_REG_I2C_SUBADDR 0x4A
197 #define W83792D_REG_ALARM1 0xA9 /* realtime status register1 */
198 #define W83792D_REG_ALARM2 0xAA /* realtime status register2 */
199 #define W83792D_REG_ALARM3 0xAB /* realtime status register3 */
200 #define W83792D_REG_CHASSIS 0x42 /* Bit 5: Case Open status bit */
201 #define W83792D_REG_CHASSIS_CLR 0x44 /* Bit 7: Case Open CLR_CHS/Reset bit */
204 #define W83792D_REG_VID_IN_B 0x17
206 #define W83792D_REG_VBAT 0x5D
207 #define W83792D_REG_I2C_ADDR 0x48
223 if (rpm == 0) in FAN_TO_REG()
229 #define FAN_FROM_REG(val, div) ((val) == 0 ? -1 : \
230 ((val) == 255 ? 0 : \
234 #define TEMP1_TO_REG(val) (clamp_val(((val) < 0 ? (val) + 0x100 * 1000 \
235 : (val)) / 1000, 0, 0xff))
236 #define TEMP1_FROM_REG(val) (((val) & 0x80 ? (val)-0x100 : (val)) * 1000)
239 ((((val1) & 0x80 ? (val1)-0x100 \
240 : (val1)) * 1000) + ((val2 & 0x80) ? 500 : 0))
242 (clamp_val(((val) < 0 ? (val) + 0x100 * 1000 : (val)) / 1000, 0, 0xff))
243 #define TEMP_ADD_TO_REG_LOW(val) ((val%1000) ? 0x80 : 0x00)
252 for (i = 0; i < 7; i++) { in DIV_TO_REG()
253 if (val == 0) in DIV_TO_REG()
270 u16 low_bits; /* Additional resolution to voltage in6-0 */
319 return (data->in[nr] << 2) | ((data->low_bits >> (2 * nr)) & 0x03); in in_count_from_reg()
324 * but the driver only accesses registers in bank 0, so we don't have
343 int nr = sensor_attr->index; in show_in()
355 int nr = sensor_attr->index; \
358 (long)(IN_FROM_REG(nr, data->reg[nr]) * 4)); \
371 int nr = sensor_attr->index; \
378 mutex_lock(&data->update_lock); \
379 data->in_##reg[nr] = clamp_val(IN_TO_REG(nr, val) / 4, 0, 255); \
381 data->in_##reg[nr]); \
382 mutex_unlock(&data->update_lock); \
395 int nr = sensor_attr->index - 1; \
398 FAN_FROM_REG(data->reg[nr], DIV_FROM_REG(data->fan_div[nr]))); \
409 int nr = sensor_attr->index - 1; in store_fan_min()
419 mutex_lock(&data->update_lock); in store_fan_min()
420 data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr])); in store_fan_min()
422 data->fan_min[nr]); in store_fan_min()
423 mutex_unlock(&data->update_lock); in store_fan_min()
433 int nr = sensor_attr->index; in show_fan_div()
435 return sprintf(buf, "%u\n", DIV_FROM_REG(data->fan_div[nr - 1])); in show_fan_div()
449 int nr = sensor_attr->index - 1; in store_fan_div()
454 u8 fan_div_reg = 0; in store_fan_div()
464 mutex_lock(&data->update_lock); in store_fan_div()
465 min = FAN_FROM_REG(data->fan_min[nr], in store_fan_div()
466 DIV_FROM_REG(data->fan_div[nr])); in store_fan_div()
468 data->fan_div[nr] = DIV_TO_REG(val); in store_fan_div()
471 fan_div_reg &= (nr & 0x01) ? 0x8f : 0xf8; in store_fan_div()
472 tmp_fan_div = (nr & 0x01) ? (((data->fan_div[nr]) << 4) & 0x70) in store_fan_div()
473 : ((data->fan_div[nr]) & 0x07); in store_fan_div()
478 data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr])); in store_fan_div()
479 w83792d_write_value(client, W83792D_REG_FAN_MIN[nr], data->fan_min[nr]); in store_fan_div()
480 mutex_unlock(&data->update_lock); in store_fan_div()
491 int nr = sensor_attr->index; in show_temp1()
493 return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->temp1[nr])); in show_temp1()
500 int nr = sensor_attr->index; in store_temp1()
510 mutex_lock(&data->update_lock); in store_temp1()
511 data->temp1[nr] = TEMP1_TO_REG(val); in store_temp1()
513 data->temp1[nr]); in store_temp1()
514 mutex_unlock(&data->update_lock); in store_temp1()
519 /* read/write the temperature2-3, includes measured value and limits */
526 int nr = sensor_attr->nr; in show_temp23()
527 int index = sensor_attr->index; in show_temp23()
530 (long)TEMP_ADD_FROM_REG(data->temp_add[nr][index], in show_temp23()
531 data->temp_add[nr][index+1])); in show_temp23()
539 int nr = sensor_attr->nr; in store_temp23()
540 int index = sensor_attr->index; in store_temp23()
550 mutex_lock(&data->update_lock); in store_temp23()
551 data->temp_add[nr][index] = TEMP_ADD_TO_REG_HIGH(val); in store_temp23()
552 data->temp_add[nr][index+1] = TEMP_ADD_TO_REG_LOW(val); in store_temp23()
554 data->temp_add[nr][index]); in store_temp23()
556 data->temp_add[nr][index+1]); in store_temp23()
557 mutex_unlock(&data->update_lock); in store_temp23()
567 return sprintf(buf, "%d\n", data->alarms); in alarms_show()
574 int nr = sensor_attr->index; in show_alarm()
576 return sprintf(buf, "%d\n", (data->alarms >> nr) & 1); in show_alarm()
584 int nr = sensor_attr->index; in show_pwm()
586 return sprintf(buf, "%d\n", (data->pwm[nr] & 0x0f) << 4); in show_pwm()
594 int nr = sensor_attr->index - 1; in show_pwmenable()
598 switch (data->pwmenable[nr]) { in show_pwmenable()
599 case 0: in show_pwmenable()
618 int nr = sensor_attr->index; in store_pwm()
627 val = clamp_val(val, 0, 255) >> 4; in store_pwm()
629 mutex_lock(&data->update_lock); in store_pwm()
630 val |= w83792d_read_value(client, W83792D_REG_PWM[nr]) & 0xf0; in store_pwm()
631 data->pwm[nr] = val; in store_pwm()
632 w83792d_write_value(client, W83792D_REG_PWM[nr], data->pwm[nr]); in store_pwm()
633 mutex_unlock(&data->update_lock); in store_pwm()
643 int nr = sensor_attr->index - 1; in store_pwmenable()
655 return -EINVAL; in store_pwmenable()
657 mutex_lock(&data->update_lock); in store_pwmenable()
660 data->pwmenable[nr] = 0; /* manual mode */ in store_pwmenable()
663 data->pwmenable[nr] = 2; /* Smart Fan II */ in store_pwmenable()
666 data->pwmenable[nr] = 1; /* thermal cruise/Smart Fan I */ in store_pwmenable()
669 cfg1_tmp = data->pwmenable[0]; in store_pwmenable()
670 cfg2_tmp = (data->pwmenable[1]) << 2; in store_pwmenable()
671 cfg3_tmp = (data->pwmenable[2]) << 4; in store_pwmenable()
672 cfg4_tmp = w83792d_read_value(client, W83792D_REG_FAN_CFG) & 0xc0; in store_pwmenable()
675 mutex_unlock(&data->update_lock); in store_pwmenable()
685 int nr = sensor_attr->index; in show_pwm_mode()
687 return sprintf(buf, "%d\n", data->pwm[nr] >> 7); in show_pwm_mode()
695 int nr = sensor_attr->index; in store_pwm_mode()
705 return -EINVAL; in store_pwm_mode()
707 mutex_lock(&data->update_lock); in store_pwm_mode()
708 data->pwm[nr] = w83792d_read_value(client, W83792D_REG_PWM[nr]); in store_pwm_mode()
710 data->pwm[nr] |= 0x80; in store_pwm_mode()
712 data->pwm[nr] &= 0x7f; in store_pwm_mode()
714 w83792d_write_value(client, W83792D_REG_PWM[nr], data->pwm[nr]); in store_pwm_mode()
715 mutex_unlock(&data->update_lock); in store_pwm_mode()
725 return sprintf(buf, "%d\n", data->chassis); in intrusion0_alarm_show()
737 if (kstrtoul(buf, 10, &val) || val != 0) in intrusion0_alarm_store()
738 return -EINVAL; in intrusion0_alarm_store()
740 mutex_lock(&data->update_lock); in intrusion0_alarm_store()
742 w83792d_write_value(client, W83792D_REG_CHASSIS_CLR, reg | 0x80); in intrusion0_alarm_store()
743 data->valid = false; /* Force cache refresh */ in intrusion0_alarm_store()
744 mutex_unlock(&data->update_lock); in intrusion0_alarm_store()
755 int nr = sensor_attr->index; in show_thermal_cruise()
757 return sprintf(buf, "%ld\n", (long)data->thermal_cruise[nr-1]); in show_thermal_cruise()
765 int nr = sensor_attr->index - 1; in store_thermal_cruise()
768 u8 target_tmp = 0, target_mask = 0; in store_thermal_cruise()
777 target_tmp = target_tmp & 0x7f; in store_thermal_cruise()
778 mutex_lock(&data->update_lock); in store_thermal_cruise()
780 W83792D_REG_THERMAL[nr]) & 0x80; in store_thermal_cruise()
781 data->thermal_cruise[nr] = clamp_val(target_tmp, 0, 255); in store_thermal_cruise()
783 (data->thermal_cruise[nr]) | target_mask); in store_thermal_cruise()
784 mutex_unlock(&data->update_lock); in store_thermal_cruise()
795 int nr = sensor_attr->index; in show_tolerance()
797 return sprintf(buf, "%ld\n", (long)data->tolerance[nr-1]); in show_tolerance()
805 int nr = sensor_attr->index - 1; in store_tolerance()
816 mutex_lock(&data->update_lock); in store_tolerance()
818 W83792D_REG_TOLERANCE[nr]) & ((nr == 1) ? 0x0f : 0xf0); in store_tolerance()
819 tol_tmp = clamp_val(val, 0, 15); in store_tolerance()
820 tol_tmp &= 0x0f; in store_tolerance()
821 data->tolerance[nr] = tol_tmp; in store_tolerance()
826 mutex_unlock(&data->update_lock); in store_tolerance()
838 int nr = sensor_attr->nr; in show_sf2_point()
839 int index = sensor_attr->index; in show_sf2_point()
841 return sprintf(buf, "%ld\n", (long)data->sf2_points[index-1][nr-1]); in show_sf2_point()
850 int nr = sensor_attr->nr - 1; in store_sf2_point()
851 int index = sensor_attr->index - 1; in store_sf2_point()
854 u8 mask_tmp = 0; in store_sf2_point()
862 mutex_lock(&data->update_lock); in store_sf2_point()
863 data->sf2_points[index][nr] = clamp_val(val, 0, 127); in store_sf2_point()
865 W83792D_REG_POINTS[index][nr]) & 0x80; in store_sf2_point()
867 mask_tmp|data->sf2_points[index][nr]); in store_sf2_point()
868 mutex_unlock(&data->update_lock); in store_sf2_point()
879 int nr = sensor_attr->nr; in show_sf2_level()
880 int index = sensor_attr->index; in show_sf2_level()
883 (((data->sf2_levels[index-1][nr]) * 100) / 15)); in show_sf2_level()
892 int nr = sensor_attr->nr; in store_sf2_level()
893 int index = sensor_attr->index - 1; in store_sf2_level()
896 u8 mask_tmp = 0, level_tmp = 0; in store_sf2_level()
904 mutex_lock(&data->update_lock); in store_sf2_level()
905 data->sf2_levels[index][nr] = clamp_val((val * 15) / 100, 0, 15); in store_sf2_level()
907 & ((nr == 3) ? 0xf0 : 0x0f); in store_sf2_level()
909 level_tmp = data->sf2_levels[index][nr]; in store_sf2_level()
911 level_tmp = data->sf2_levels[index][nr] << 4; in store_sf2_level()
914 mutex_unlock(&data->update_lock); in store_sf2_level()
924 int address = new_client->addr; in w83792d_detect_subclients()
926 struct i2c_adapter *adapter = new_client->adapter; in w83792d_detect_subclients()
929 if (force_subclients[0] == id && force_subclients[1] == address) { in w83792d_detect_subclients()
931 if (force_subclients[i] < 0x48 || in w83792d_detect_subclients()
932 force_subclients[i] > 0x4f) { in w83792d_detect_subclients()
933 dev_err(&new_client->dev, in w83792d_detect_subclients()
934 "invalid subclient address %d; must be 0x48-0x4f\n", in w83792d_detect_subclients()
936 return -ENODEV; in w83792d_detect_subclients()
940 (force_subclients[2] & 0x07) | in w83792d_detect_subclients()
941 ((force_subclients[3] & 0x07) << 4)); in w83792d_detect_subclients()
946 if (!(val & 0x88) && (val & 0x7) == ((val >> 4) & 0x7)) { in w83792d_detect_subclients()
947 dev_err(&new_client->dev, in w83792d_detect_subclients()
948 "duplicate addresses 0x%x, use force_subclient\n", 0x48 + (val & 0x7)); in w83792d_detect_subclients()
949 return -ENODEV; in w83792d_detect_subclients()
952 if (!(val & 0x08)) in w83792d_detect_subclients()
953 devm_i2c_new_dummy_device(&new_client->dev, adapter, 0x48 + (val & 0x7)); in w83792d_detect_subclients()
955 if (!(val & 0x80)) in w83792d_detect_subclients()
956 devm_i2c_new_dummy_device(&new_client->dev, adapter, 0x48 + ((val >> 4) & 0x7)); in w83792d_detect_subclients()
958 return 0; in w83792d_detect_subclients()
961 static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, show_in, NULL, 0);
971 show_in_min, store_in_min, 0);
989 show_in_max, store_in_max, 0);
1006 static SENSOR_DEVICE_ATTR_2(temp1_input, S_IRUGO, show_temp1, NULL, 0, 0);
1007 static SENSOR_DEVICE_ATTR_2(temp2_input, S_IRUGO, show_temp23, NULL, 0, 0);
1008 static SENSOR_DEVICE_ATTR_2(temp3_input, S_IRUGO, show_temp23, NULL, 1, 0);
1010 show_temp1, store_temp1, 0, 1);
1012 store_temp23, 0, 2);
1016 show_temp1, store_temp1, 0, 2);
1018 show_temp23, store_temp23, 0, 4);
1022 static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
1042 static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 0);
1056 show_pwm_mode, store_pwm_mode, 0);
1196 { .attrs = w83792d_attributes_fan[0] },
1308 /* Return 0 if detection is successful, -ENODEV otherwise */
1312 struct i2c_adapter *adapter = client->adapter; in w83792d_detect()
1314 unsigned short address = client->addr; in w83792d_detect()
1317 return -ENODEV; in w83792d_detect()
1319 if (w83792d_read_value(client, W83792D_REG_CONFIG) & 0x80) in w83792d_detect()
1320 return -ENODEV; in w83792d_detect()
1324 /* Check for Winbond ID if in bank 0 */ in w83792d_detect()
1325 if (!(val1 & 0x07)) { /* is Bank0 */ in w83792d_detect()
1326 if ((!(val1 & 0x80) && val2 != 0xa3) || in w83792d_detect()
1327 ((val1 & 0x80) && val2 != 0x5c)) in w83792d_detect()
1328 return -ENODEV; in w83792d_detect()
1335 return -ENODEV; in w83792d_detect()
1337 /* Put it now into bank 0 and Vendor ID High Byte */ in w83792d_detect()
1341 W83792D_REG_BANK) & 0x78) | 0x80); in w83792d_detect()
1346 if (val1 != 0x7a || val2 != 0x5c) in w83792d_detect()
1347 return -ENODEV; in w83792d_detect()
1349 strscpy(info->type, "w83792d", I2C_NAME_SIZE); in w83792d_detect()
1351 return 0; in w83792d_detect()
1358 struct device *dev = &client->dev; in w83792d_probe()
1363 return -ENOMEM; in w83792d_probe()
1366 mutex_init(&data->update_lock); in w83792d_probe()
1376 for (i = 0; i < 7; i++) { in w83792d_probe()
1377 data->fan_min[i] = w83792d_read_value(client, in w83792d_probe()
1382 err = sysfs_create_group(&dev->kobj, &w83792d_group); in w83792d_probe()
1392 if (!(val1 & 0x40)) { in w83792d_probe()
1393 err = sysfs_create_group(&dev->kobj, &w83792d_group_fan[0]); in w83792d_probe()
1398 if (!(val1 & 0x20)) { in w83792d_probe()
1399 err = sysfs_create_group(&dev->kobj, &w83792d_group_fan[1]); in w83792d_probe()
1405 if (val1 & 0x40) { in w83792d_probe()
1406 err = sysfs_create_group(&dev->kobj, &w83792d_group_fan[2]); in w83792d_probe()
1411 if (val1 & 0x04) { in w83792d_probe()
1412 err = sysfs_create_group(&dev->kobj, &w83792d_group_fan[3]); in w83792d_probe()
1417 data->hwmon_dev = hwmon_device_register(dev); in w83792d_probe()
1418 if (IS_ERR(data->hwmon_dev)) { in w83792d_probe()
1419 err = PTR_ERR(data->hwmon_dev); in w83792d_probe()
1423 return 0; in w83792d_probe()
1426 sysfs_remove_group(&dev->kobj, &w83792d_group); in w83792d_probe()
1427 for (i = 0; i < ARRAY_SIZE(w83792d_group_fan); i++) in w83792d_probe()
1428 sysfs_remove_group(&dev->kobj, &w83792d_group_fan[i]); in w83792d_probe()
1438 hwmon_device_unregister(data->hwmon_dev); in w83792d_remove()
1439 sysfs_remove_group(&client->dev.kobj, &w83792d_group); in w83792d_remove()
1440 for (i = 0; i < ARRAY_SIZE(w83792d_group_fan); i++) in w83792d_remove()
1441 sysfs_remove_group(&client->dev.kobj, in w83792d_remove()
1451 w83792d_write_value(client, W83792D_REG_CONFIG, 0x80); in w83792d_init_client()
1454 * Clear the bit6 of W83792D_REG_VID_IN_B(set it into 0): in w83792d_init_client()
1455 * W83792D_REG_VID_IN_B bit6 = 0: the high/low limit of in w83792d_init_client()
1458 * vin0/vin1 auto-updated, can NOT be modified by user. in w83792d_init_client()
1462 vid_in_b & 0xbf); in w83792d_init_client()
1467 temp2_cfg & 0xe6); in w83792d_init_client()
1469 temp3_cfg & 0xe6); in w83792d_init_client()
1474 W83792D_REG_CONFIG) & 0xf7) in w83792d_init_client()
1475 | 0x01); in w83792d_init_client()
1485 mutex_lock(&data->update_lock); in w83792d_update_device()
1488 (jiffies - data->last_updated, (unsigned long) (HZ * 3)) in w83792d_update_device()
1489 || time_before(jiffies, data->last_updated) || !data->valid) { in w83792d_update_device()
1493 for (i = 0; i < 9; i++) { in w83792d_update_device()
1494 data->in[i] = w83792d_read_value(client, in w83792d_update_device()
1496 data->in_max[i] = w83792d_read_value(client, in w83792d_update_device()
1498 data->in_min[i] = w83792d_read_value(client, in w83792d_update_device()
1501 data->low_bits = w83792d_read_value(client, in w83792d_update_device()
1505 for (i = 0; i < 7; i++) { in w83792d_update_device()
1507 data->fan[i] = w83792d_read_value(client, in w83792d_update_device()
1509 data->fan_min[i] = w83792d_read_value(client, in w83792d_update_device()
1512 data->pwm[i] = w83792d_read_value(client, in w83792d_update_device()
1517 data->pwmenable[0] = reg_tmp & 0x03; in w83792d_update_device()
1518 data->pwmenable[1] = (reg_tmp>>2) & 0x03; in w83792d_update_device()
1519 data->pwmenable[2] = (reg_tmp>>4) & 0x03; in w83792d_update_device()
1521 for (i = 0; i < 3; i++) { in w83792d_update_device()
1522 data->temp1[i] = w83792d_read_value(client, in w83792d_update_device()
1525 for (i = 0; i < 2; i++) { in w83792d_update_device()
1526 for (j = 0; j < 6; j++) { in w83792d_update_device()
1527 data->temp_add[i][j] = w83792d_read_value( in w83792d_update_device()
1533 for (i = 0; i < 4; i++) { in w83792d_update_device()
1537 data->fan_div[0] = reg_array_tmp[0] & 0x07; in w83792d_update_device()
1538 data->fan_div[1] = (reg_array_tmp[0] >> 4) & 0x07; in w83792d_update_device()
1539 data->fan_div[2] = reg_array_tmp[1] & 0x07; in w83792d_update_device()
1540 data->fan_div[3] = (reg_array_tmp[1] >> 4) & 0x07; in w83792d_update_device()
1541 data->fan_div[4] = reg_array_tmp[2] & 0x07; in w83792d_update_device()
1542 data->fan_div[5] = (reg_array_tmp[2] >> 4) & 0x07; in w83792d_update_device()
1543 data->fan_div[6] = reg_array_tmp[3] & 0x07; in w83792d_update_device()
1546 data->alarms = w83792d_read_value(client, W83792D_REG_ALARM1) + in w83792d_update_device()
1551 data->chassis = (w83792d_read_value(client, in w83792d_update_device()
1552 W83792D_REG_CHASSIS) >> 5) & 0x01; in w83792d_update_device()
1555 for (i = 0; i < 3; i++) { in w83792d_update_device()
1556 data->thermal_cruise[i] = in w83792d_update_device()
1558 W83792D_REG_THERMAL[i]) & 0x7f; in w83792d_update_device()
1562 reg_tmp = w83792d_read_value(client, W83792D_REG_TOLERANCE[0]); in w83792d_update_device()
1563 data->tolerance[0] = reg_tmp & 0x0f; in w83792d_update_device()
1564 data->tolerance[1] = (reg_tmp >> 4) & 0x0f; in w83792d_update_device()
1565 data->tolerance[2] = w83792d_read_value(client, in w83792d_update_device()
1566 W83792D_REG_TOLERANCE[2]) & 0x0f; in w83792d_update_device()
1569 for (i = 0; i < 3; i++) { in w83792d_update_device()
1570 for (j = 0; j < 4; j++) { in w83792d_update_device()
1571 data->sf2_points[i][j] in w83792d_update_device()
1573 W83792D_REG_POINTS[i][j]) & 0x7f; in w83792d_update_device()
1578 for (i = 0; i < 3; i++) { in w83792d_update_device()
1580 W83792D_REG_LEVELS[i][0]); in w83792d_update_device()
1581 data->sf2_levels[i][0] = reg_tmp & 0x0f; in w83792d_update_device()
1582 data->sf2_levels[i][1] = (reg_tmp >> 4) & 0x0f; in w83792d_update_device()
1585 data->sf2_levels[i][2] = (reg_tmp >> 4) & 0x0f; in w83792d_update_device()
1586 data->sf2_levels[i][3] = reg_tmp & 0x0f; in w83792d_update_device()
1589 data->last_updated = jiffies; in w83792d_update_device()
1590 data->valid = true; in w83792d_update_device()
1593 mutex_unlock(&data->update_lock); in w83792d_update_device()
1605 int i = 0, j = 0; in w83792d_print_debug()
1608 for (i = 0; i < 9; i++) { in w83792d_print_debug()
1609 dev_dbg(dev, "vin[%d] is: 0x%x\n", i, data->in[i]); in w83792d_print_debug()
1610 dev_dbg(dev, "vin[%d] max is: 0x%x\n", i, data->in_max[i]); in w83792d_print_debug()
1611 dev_dbg(dev, "vin[%d] min is: 0x%x\n", i, data->in_min[i]); in w83792d_print_debug()
1613 dev_dbg(dev, "Low Bit1 is: 0x%x\n", data->low_bits & 0xff); in w83792d_print_debug()
1614 dev_dbg(dev, "Low Bit2 is: 0x%x\n", data->low_bits >> 8); in w83792d_print_debug()
1616 for (i = 0; i < 7; i++) { in w83792d_print_debug()
1617 dev_dbg(dev, "fan[%d] is: 0x%x\n", i, data->fan[i]); in w83792d_print_debug()
1618 dev_dbg(dev, "fan[%d] min is: 0x%x\n", i, data->fan_min[i]); in w83792d_print_debug()
1619 dev_dbg(dev, "pwm[%d] is: 0x%x\n", i, data->pwm[i]); in w83792d_print_debug()
1622 for (i = 0; i < 3; i++) in w83792d_print_debug()
1623 dev_dbg(dev, "temp1[%d] is: 0x%x\n", i, data->temp1[i]); in w83792d_print_debug()
1625 for (i = 0; i < 2; i++) { in w83792d_print_debug()
1626 for (j = 0; j < 6; j++) { in w83792d_print_debug()
1627 dev_dbg(dev, "temp_add[%d][%d] is: 0x%x\n", i, j, in w83792d_print_debug()
1628 data->temp_add[i][j]); in w83792d_print_debug()
1632 for (i = 0; i < 7; i++) in w83792d_print_debug()
1633 dev_dbg(dev, "fan_div[%d] is: 0x%x\n", i, data->fan_div[i]); in w83792d_print_debug()
1643 MODULE_DESCRIPTION("W83792AD/D driver for linux-2.6");