Lines Matching +full:pulses +full:- +full:per +full:- +full:revolution
2 * dme1737.c - Driver for the SMSC DME1737, Asus A8000, SMSC SCH311x, SCH5027,
3 * and SCH5127 Super-I/O chips integrated hardware monitoring
37 #include <linux/hwmon-sysfs.h>
38 #include <linux/hwmon-vid.h>
59 "Include probing of non-standard LPC addresses");
68 /* ---------------------------------------------------------------------
74 * -------- ------------
84 * --------------------------------------------------------------------- */
86 /* Voltages (in) numbered 0-7 (ix) */
95 /* Temperatures (temp) numbered 0-2 (ix) */
118 /* Fans numbered 0-5 (ix) */
125 #define DME1737_REG_FAN_MAX(ix) (0xb4 + (ix)) /* only for fan[4-5] */
127 /* PWMs numbered 0-2, 4-5 (ix) */
130 #define DME1737_REG_PWM_CONFIG(ix) (0x5c + (ix)) /* only for pwm[0-2] */
131 #define DME1737_REG_PWM_MIN(ix) (0x64 + (ix)) /* only for pwm[0-2] */
137 * PWM_RR(0) = [OFF3, OFF2, OFF1, RES, RR1E, RR1-2, RR1-1, RR1-0]
138 * PWM_RR(1) = [RR2E, RR2-2, RR2-1, RR2-0, RR3E, RR3-2, RR3-1, RR3-0]
140 #define DME1737_REG_PWM_RR(ix) (0x62 + (ix)) /* only for pwm[0-2] */
142 /* Thermal zones 0-2 */
148 * ZONE_HYST(0) = [H1-3, H1-2, H1-1, H1-0, H2-3, H2-2, H2-1, H2-0]
149 * ZONE_HYST(1) = [H3-3, H3-2, H3-1, H3-0, RES, RES, RES, RES]
155 * The 3 8-bit alarm registers will be concatenated to a single 32-bit
174 /* ---------------------------------------------------------------------
176 * --------------------------------------------------------------------- */
198 /* chip-dependent features */
204 #define HAS_FAN(ix) (1 << ((ix) + 5)) /* bits 5-10 */
205 #define HAS_PWM(ix) (1 << ((ix) + 11)) /* bits 11-16 */
208 /* ---------------------------------------------------------------------
210 * --------------------------------------------------------------------- */
277 return (reg * nominal + (3 << (res - 3))) / (3 << (res - 2)); in IN_FROM_REG()
289 * -127 degrees C to +127 degrees C. Temp inputs have 16 bits resolution, limit
294 return (reg * 1000) >> (res - 8); in TEMP_FROM_REG()
299 val = clamp_val(val, -128000, 127000); in TEMP_TO_REG()
317 for (i = 15; i > 0; i--) { in TEMP_RANGE_TO_REG()
318 if (val > (TEMP_RANGE[i] + TEMP_RANGE[i - 1] + 1) / 2) in TEMP_RANGE_TO_REG()
328 * reg[0] = [H1-3, H1-2, H1-1, H1-0, H2-3, H2-2, H2-1, H2-0]
329 * reg[1] = [H3-3, H3-2, H3-1, H3-0, xxxx, xxxx, xxxx, xxxx]
338 hyst = clamp_val(hyst, temp - 15000, temp); in TEMP_HYST_TO_REG()
339 hyst = DIV_ROUND_CLOSEST(temp - hyst, 1000); in TEMP_HYST_TO_REG()
366 * is configured in legacy (non-tpc) mode
375 * The type of a fan is expressed in number of pulses-per-revolution that it
382 return (edge > 0) ? 1 << (edge - 1) : 0; in FAN_TYPE_FROM_REG()
400 for (i = 10; i > 0; i--) { in FAN_MAX_FROM_REG()
412 for (i = 10; i > 0; i--) { in FAN_MAX_TO_REG()
413 if (val > (1000 + (i - 1) * 500)) in FAN_MAX_TO_REG()
427 * 100: -1 fan disabled
434 static const int en[] = {2, 2, 2, 0, -1, 2, 2, 1}; in PWM_EN_FROM_REG()
468 int acz = (val == 4) ? 2 : val - 1; in PWM_ACZ_TO_REG()
486 /* the first two cases are special - stupid chip design! */ in PWM_FREQ_TO_REG()
492 for (i = 9; i > 0; i--) { in PWM_FREQ_TO_REG()
493 if (val > (PWM_FREQ[i] + PWM_FREQ[i - 1] + 1) / 2) in PWM_FREQ_TO_REG()
504 * reg[0] = [OFF3, OFF2, OFF1, RES, RR1-E, RR1-2, RR1-1, RR1-0]
505 * reg[1] = [RR2-E, RR2-2, RR2-1, RR2-0, RR3-E, RR3-2, RR3-1, RR3-0]
556 /* ---------------------------------------------------------------------
561 * We use data->update_lock for this and need to ensure that we acquire it
563 * --------------------------------------------------------------------- */
567 struct i2c_client *client = data->client; in dme1737_read()
574 dev_warn(&client->dev, in dme1737_read()
579 outb(reg, data->addr); in dme1737_read()
580 val = inb(data->addr + 1); in dme1737_read()
588 struct i2c_client *client = data->client; in dme1737_write()
595 dev_warn(&client->dev, in dme1737_write()
600 outb(reg, data->addr); in dme1737_write()
601 outb(val, data->addr + 1); in dme1737_write()
613 mutex_lock(&data->update_lock); in dme1737_update_device()
616 if (time_after(jiffies, data->last_vbat + 600 * HZ) || !data->valid) { in dme1737_update_device()
619 data->last_vbat = jiffies; in dme1737_update_device()
623 if (time_after(jiffies, data->last_update + HZ) || !data->valid) { in dme1737_update_device()
624 if (data->has_features & HAS_VID) { in dme1737_update_device()
625 data->vid = dme1737_read(data, DME1737_REG_VID) & in dme1737_update_device()
630 for (ix = 0; ix < ARRAY_SIZE(data->in); ix++) { in dme1737_update_device()
636 if (ix == 7 && !(data->has_features & HAS_IN7)) in dme1737_update_device()
638 data->in[ix] = dme1737_read(data, in dme1737_update_device()
640 data->in_min[ix] = dme1737_read(data, in dme1737_update_device()
642 data->in_max[ix] = dme1737_read(data, in dme1737_update_device()
647 for (ix = 0; ix < ARRAY_SIZE(data->temp); ix++) { in dme1737_update_device()
655 data->temp[ix] = dme1737_read(data, in dme1737_update_device()
657 data->temp_min[ix] = dme1737_read(data, in dme1737_update_device()
659 data->temp_max[ix] = dme1737_read(data, in dme1737_update_device()
661 if (data->has_features & HAS_TEMP_OFFSET) { in dme1737_update_device()
662 data->temp_offset[ix] = dme1737_read(data, in dme1737_update_device()
674 if (ix == 5 && !(data->has_features & HAS_IN7)) in dme1737_update_device()
679 for (ix = 0; ix < ARRAY_SIZE(data->in); ix++) { in dme1737_update_device()
680 if (ix == 7 && !(data->has_features & HAS_IN7)) in dme1737_update_device()
682 data->in[ix] |= (lsb[DME1737_REG_IN_LSB[ix]] << in dme1737_update_device()
685 for (ix = 0; ix < ARRAY_SIZE(data->temp); ix++) { in dme1737_update_device()
686 data->temp[ix] |= (lsb[DME1737_REG_TEMP_LSB[ix]] << in dme1737_update_device()
691 for (ix = 0; ix < ARRAY_SIZE(data->fan); ix++) { in dme1737_update_device()
696 if (!(data->has_features & HAS_FAN(ix))) in dme1737_update_device()
698 data->fan[ix] = dme1737_read(data, in dme1737_update_device()
700 data->fan[ix] |= dme1737_read(data, in dme1737_update_device()
702 data->fan_min[ix] = dme1737_read(data, in dme1737_update_device()
704 data->fan_min[ix] |= dme1737_read(data, in dme1737_update_device()
706 data->fan_opt[ix] = dme1737_read(data, in dme1737_update_device()
708 /* fan_max exists only for fan[5-6] */ in dme1737_update_device()
710 data->fan_max[ix - 4] = dme1737_read(data, in dme1737_update_device()
716 for (ix = 0; ix < ARRAY_SIZE(data->pwm); ix++) { in dme1737_update_device()
721 if (!(data->has_features & HAS_PWM(ix))) in dme1737_update_device()
723 data->pwm[ix] = dme1737_read(data, in dme1737_update_device()
725 data->pwm_freq[ix] = dme1737_read(data, in dme1737_update_device()
727 /* pwm_config and pwm_min exist only for pwm[1-3] */ in dme1737_update_device()
729 data->pwm_config[ix] = dme1737_read(data, in dme1737_update_device()
731 data->pwm_min[ix] = dme1737_read(data, in dme1737_update_device()
735 for (ix = 0; ix < ARRAY_SIZE(data->pwm_rr); ix++) { in dme1737_update_device()
736 data->pwm_rr[ix] = dme1737_read(data, in dme1737_update_device()
741 for (ix = 0; ix < ARRAY_SIZE(data->zone_low); ix++) { in dme1737_update_device()
743 if ((ix == 2) && !(data->has_features & HAS_ZONE3)) in dme1737_update_device()
746 if ((ix == 1) && (data->type == sch5127)) { in dme1737_update_device()
747 data->zone_low[1] = dme1737_read(data, in dme1737_update_device()
749 data->zone_abs[1] = dme1737_read(data, in dme1737_update_device()
752 data->zone_low[ix] = dme1737_read(data, in dme1737_update_device()
754 data->zone_abs[ix] = dme1737_read(data, in dme1737_update_device()
758 if (data->has_features & HAS_ZONE_HYST) { in dme1737_update_device()
759 for (ix = 0; ix < ARRAY_SIZE(data->zone_hyst); ix++) { in dme1737_update_device()
760 data->zone_hyst[ix] = dme1737_read(data, in dme1737_update_device()
766 data->alarms = dme1737_read(data, in dme1737_update_device()
769 * Bit 7 tells us if the other alarm registers are non-zero and in dme1737_update_device()
772 if (data->alarms & 0x80) { in dme1737_update_device()
773 data->alarms |= dme1737_read(data, in dme1737_update_device()
775 data->alarms |= dme1737_read(data, in dme1737_update_device()
784 if (!data->client) { in dme1737_update_device()
785 if (data->alarms & 0xff0000) in dme1737_update_device()
787 if (data->alarms & 0xff00) in dme1737_update_device()
789 if (data->alarms & 0xff) in dme1737_update_device()
793 data->last_update = jiffies; in dme1737_update_device()
794 data->valid = 1; in dme1737_update_device()
797 mutex_unlock(&data->update_lock); in dme1737_update_device()
802 /* ---------------------------------------------------------------------
804 * ix = [0-7]
805 * --------------------------------------------------------------------- */
818 int ix = sensor_attr_2->index; in show_in()
819 int fn = sensor_attr_2->nr; in show_in()
824 res = IN_FROM_REG(data->in[ix], data->in_nominal[ix], 16); in show_in()
827 res = IN_FROM_REG(data->in_min[ix], data->in_nominal[ix], 8); in show_in()
830 res = IN_FROM_REG(data->in_max[ix], data->in_nominal[ix], 8); in show_in()
833 res = (data->alarms >> DME1737_BIT_ALARM_IN[ix]) & 0x01; in show_in()
849 int ix = sensor_attr_2->index; in set_in()
850 int fn = sensor_attr_2->nr; in set_in()
858 mutex_lock(&data->update_lock); in set_in()
861 data->in_min[ix] = IN_TO_REG(val, data->in_nominal[ix]); in set_in()
863 data->in_min[ix]); in set_in()
866 data->in_max[ix] = IN_TO_REG(val, data->in_nominal[ix]); in set_in()
868 data->in_max[ix]); in set_in()
873 mutex_unlock(&data->update_lock); in set_in()
878 /* ---------------------------------------------------------------------
880 * ix = [0-2]
881 * --------------------------------------------------------------------- */
896 int ix = sensor_attr_2->index; in show_temp()
897 int fn = sensor_attr_2->nr; in show_temp()
902 res = TEMP_FROM_REG(data->temp[ix], 16); in show_temp()
905 res = TEMP_FROM_REG(data->temp_min[ix], 8); in show_temp()
908 res = TEMP_FROM_REG(data->temp_max[ix], 8); in show_temp()
911 res = TEMP_FROM_REG(data->temp_offset[ix], 8); in show_temp()
914 res = (data->alarms >> DME1737_BIT_ALARM_TEMP[ix]) & 0x01; in show_temp()
917 res = (((u16)data->temp[ix] & 0xff00) == 0x8000); in show_temp()
933 int ix = sensor_attr_2->index; in set_temp()
934 int fn = sensor_attr_2->nr; in set_temp()
942 mutex_lock(&data->update_lock); in set_temp()
945 data->temp_min[ix] = TEMP_TO_REG(val); in set_temp()
947 data->temp_min[ix]); in set_temp()
950 data->temp_max[ix] = TEMP_TO_REG(val); in set_temp()
952 data->temp_max[ix]); in set_temp()
955 data->temp_offset[ix] = TEMP_TO_REG(val); in set_temp()
957 data->temp_offset[ix]); in set_temp()
962 mutex_unlock(&data->update_lock); in set_temp()
967 /* ---------------------------------------------------------------------
969 * ix = [0-2]
970 * --------------------------------------------------------------------- */
984 int ix = sensor_attr_2->index; in show_zone()
985 int fn = sensor_attr_2->nr; in show_zone()
990 /* check config2 for non-standard temp-to-zone mapping */ in show_zone()
991 if ((ix == 1) && (data->config2 & 0x02)) in show_zone()
997 res = TEMP_FROM_REG(data->zone_low[ix], 8) - in show_zone()
998 TEMP_HYST_FROM_REG(data->zone_hyst[ix == 2], ix); in show_zone()
1001 res = TEMP_FROM_REG(data->zone_low[ix], 8); in show_zone()
1005 res = TEMP_FROM_REG(data->zone_low[ix], 8) + in show_zone()
1006 TEMP_RANGE_FROM_REG(data->pwm_freq[ix]); in show_zone()
1009 res = TEMP_FROM_REG(data->zone_abs[ix], 8); in show_zone()
1025 int ix = sensor_attr_2->index; in set_zone()
1026 int fn = sensor_attr_2->nr; in set_zone()
1036 mutex_lock(&data->update_lock); in set_zone()
1040 data->zone_low[ix] = dme1737_read(data, in set_zone()
1043 temp = TEMP_FROM_REG(data->zone_low[ix], 8); in set_zone()
1045 data->zone_hyst[ix == 2] = TEMP_HYST_TO_REG(temp, val, ix, reg); in set_zone()
1047 data->zone_hyst[ix == 2]); in set_zone()
1050 data->zone_low[ix] = TEMP_TO_REG(val); in set_zone()
1052 data->zone_low[ix]); in set_zone()
1056 data->zone_low[ix] = dme1737_read(data, in set_zone()
1062 temp = TEMP_FROM_REG(data->zone_low[ix], 8); in set_zone()
1065 data->pwm_freq[ix] = TEMP_RANGE_TO_REG(val - temp, reg); in set_zone()
1067 data->pwm_freq[ix]); in set_zone()
1070 data->zone_abs[ix] = TEMP_TO_REG(val); in set_zone()
1072 data->zone_abs[ix]); in set_zone()
1077 mutex_unlock(&data->update_lock); in set_zone()
1082 /* ---------------------------------------------------------------------
1084 * ix = [0-5]
1085 * --------------------------------------------------------------------- */
1099 int ix = sensor_attr_2->index; in show_fan()
1100 int fn = sensor_attr_2->nr; in show_fan()
1105 res = FAN_FROM_REG(data->fan[ix], in show_fan()
1107 FAN_TPC_FROM_REG(data->fan_opt[ix])); in show_fan()
1110 res = FAN_FROM_REG(data->fan_min[ix], in show_fan()
1112 FAN_TPC_FROM_REG(data->fan_opt[ix])); in show_fan()
1115 /* only valid for fan[5-6] */ in show_fan()
1116 res = FAN_MAX_FROM_REG(data->fan_max[ix - 4]); in show_fan()
1119 res = (data->alarms >> DME1737_BIT_ALARM_FAN[ix]) & 0x01; in show_fan()
1122 /* only valid for fan[1-4] */ in show_fan()
1123 res = FAN_TYPE_FROM_REG(data->fan_opt[ix]); in show_fan()
1139 int ix = sensor_attr_2->index; in set_fan()
1140 int fn = sensor_attr_2->nr; in set_fan()
1148 mutex_lock(&data->update_lock); in set_fan()
1152 data->fan_min[ix] = FAN_TO_REG(val, 0); in set_fan()
1155 data->fan_opt[ix] = dme1737_read(data, in set_fan()
1158 data->fan_min[ix] = FAN_TO_REG(val, in set_fan()
1159 FAN_TPC_FROM_REG(data->fan_opt[ix])); in set_fan()
1162 data->fan_min[ix] & 0xff); in set_fan()
1164 data->fan_min[ix] >> 8); in set_fan()
1167 /* Only valid for fan[5-6] */ in set_fan()
1168 data->fan_max[ix - 4] = FAN_MAX_TO_REG(val); in set_fan()
1170 data->fan_max[ix - 4]); in set_fan()
1173 /* Only valid for fan[1-4] */ in set_fan()
1175 count = -EINVAL; in set_fan()
1181 data->fan_opt[ix] = FAN_TYPE_TO_REG(val, dme1737_read(data, in set_fan()
1184 data->fan_opt[ix]); in set_fan()
1190 mutex_unlock(&data->update_lock); in set_fan()
1195 /* ---------------------------------------------------------------------
1197 * ix = [0-4]
1198 * --------------------------------------------------------------------- */
1215 int ix = sensor_attr_2->index; in show_pwm()
1216 int fn = sensor_attr_2->nr; in show_pwm()
1221 if (PWM_EN_FROM_REG(data->pwm_config[ix]) == 0) in show_pwm()
1224 res = data->pwm[ix]; in show_pwm()
1227 res = PWM_FREQ_FROM_REG(data->pwm_freq[ix]); in show_pwm()
1231 res = 1; /* pwm[5-6] hard-wired to manual mode */ in show_pwm()
1233 res = PWM_EN_FROM_REG(data->pwm_config[ix]); in show_pwm()
1236 /* Only valid for pwm[1-3] */ in show_pwm()
1237 res = PWM_RR_FROM_REG(data->pwm_rr[ix > 0], ix); in show_pwm()
1240 /* Only valid for pwm[1-3] */ in show_pwm()
1241 if (PWM_EN_FROM_REG(data->pwm_config[ix]) == 2) in show_pwm()
1242 res = PWM_ACZ_FROM_REG(data->pwm_config[ix]); in show_pwm()
1244 res = data->pwm_acz[ix]; in show_pwm()
1247 /* Only valid for pwm[1-3] */ in show_pwm()
1248 if (PWM_OFF_FROM_REG(data->pwm_rr[0], ix)) in show_pwm()
1249 res = data->pwm_min[ix]; in show_pwm()
1254 /* Only valid for pwm[1-3] */ in show_pwm()
1255 res = data->pwm_min[ix]; in show_pwm()
1258 /* Only valid for pwm[1-3] */ in show_pwm()
1259 res = 255; /* hard-wired */ in show_pwm()
1278 int ix = sensor_attr_2->index; in set_pwm()
1279 int fn = sensor_attr_2->nr; in set_pwm()
1287 mutex_lock(&data->update_lock); in set_pwm()
1290 data->pwm[ix] = clamp_val(val, 0, 255); in set_pwm()
1291 dme1737_write(data, DME1737_REG_PWM(ix), data->pwm[ix]); in set_pwm()
1294 data->pwm_freq[ix] = PWM_FREQ_TO_REG(val, dme1737_read(data, in set_pwm()
1297 data->pwm_freq[ix]); in set_pwm()
1300 /* Only valid for pwm[1-3] */ in set_pwm()
1302 count = -EINVAL; in set_pwm()
1309 data->pwm_config[ix] = dme1737_read(data, in set_pwm()
1311 if (val == PWM_EN_FROM_REG(data->pwm_config[ix])) { in set_pwm()
1316 if (PWM_EN_FROM_REG(data->pwm_config[ix]) == 2) { in set_pwm()
1318 data->pwm_acz[ix] = PWM_ACZ_FROM_REG( in set_pwm()
1319 data->pwm_config[ix]); in set_pwm()
1321 data->pwm_rr[ix > 0] = dme1737_read(data, in set_pwm()
1323 data->pwm_rr_en &= ~(1 << ix); in set_pwm()
1324 if (PWM_RR_EN_FROM_REG(data->pwm_rr[ix > 0], ix)) { in set_pwm()
1325 data->pwm_rr_en |= (1 << ix); in set_pwm()
1326 data->pwm_rr[ix > 0] = PWM_RR_EN_TO_REG(0, ix, in set_pwm()
1327 data->pwm_rr[ix > 0]); in set_pwm()
1330 data->pwm_rr[ix > 0]); in set_pwm()
1336 /* Change permissions of pwm[ix] to read-only */ in set_pwm()
1340 data->pwm_config[ix] = PWM_EN_TO_REG(0, in set_pwm()
1341 data->pwm_config[ix]); in set_pwm()
1343 data->pwm_config[ix]); in set_pwm()
1347 data->pwm_config[ix] = PWM_EN_TO_REG(1, in set_pwm()
1348 data->pwm_config[ix]); in set_pwm()
1350 data->pwm_config[ix]); in set_pwm()
1351 /* Change permissions of pwm[ix] to read-writeable */ in set_pwm()
1356 /* Change permissions of pwm[ix] to read-only */ in set_pwm()
1363 data->pwm_config[ix] = PWM_ACZ_TO_REG( in set_pwm()
1364 data->pwm_acz[ix], in set_pwm()
1365 data->pwm_config[ix]); in set_pwm()
1367 data->pwm_config[ix]); in set_pwm()
1369 if (data->pwm_rr_en & (1 << ix)) { in set_pwm()
1370 data->pwm_rr[ix > 0] = PWM_RR_EN_TO_REG(1, ix, in set_pwm()
1375 data->pwm_rr[ix > 0]); in set_pwm()
1381 /* Only valid for pwm[1-3] */ in set_pwm()
1383 data->pwm_config[ix] = dme1737_read(data, in set_pwm()
1385 data->pwm_rr[ix > 0] = dme1737_read(data, in set_pwm()
1389 data->pwm_rr[ix > 0] = PWM_RR_TO_REG(val, ix, in set_pwm()
1390 data->pwm_rr[ix > 0]); in set_pwm()
1396 if (PWM_EN_FROM_REG(data->pwm_config[ix]) == 2) { in set_pwm()
1397 data->pwm_rr[ix > 0] = PWM_RR_EN_TO_REG(val > 0, ix, in set_pwm()
1398 data->pwm_rr[ix > 0]); in set_pwm()
1401 data->pwm_rr[ix > 0]); in set_pwm()
1404 /* Only valid for pwm[1-3] */ in set_pwm()
1407 count = -EINVAL; in set_pwm()
1414 data->pwm_config[ix] = dme1737_read(data, in set_pwm()
1416 if (PWM_EN_FROM_REG(data->pwm_config[ix]) == 2) { in set_pwm()
1421 data->pwm_config[ix] = PWM_ACZ_TO_REG(val, in set_pwm()
1422 data->pwm_config[ix]); in set_pwm()
1424 data->pwm_config[ix]); in set_pwm()
1430 data->pwm_acz[ix] = val; in set_pwm()
1434 /* Only valid for pwm[1-3] */ in set_pwm()
1436 data->pwm_min[ix] = dme1737_read(data, in set_pwm()
1442 * off or runs at auto_point1_pwm duty-cycle. in set_pwm()
1444 if (val > ((data->pwm_min[ix] + 1) / 2)) { in set_pwm()
1445 data->pwm_rr[0] = PWM_OFF_TO_REG(1, ix, in set_pwm()
1449 data->pwm_rr[0] = PWM_OFF_TO_REG(0, ix, in set_pwm()
1454 data->pwm_rr[0]); in set_pwm()
1457 /* Only valid for pwm[1-3] */ in set_pwm()
1458 data->pwm_min[ix] = clamp_val(val, 0, 255); in set_pwm()
1460 data->pwm_min[ix]); in set_pwm()
1466 mutex_unlock(&data->update_lock); in set_pwm()
1471 /* ---------------------------------------------------------------------
1473 * --------------------------------------------------------------------- */
1481 return sprintf(buf, "%d\n", data->vrm); in vrm_show()
1496 return -EINVAL; in vrm_store()
1498 data->vrm = val; in vrm_store()
1507 return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm)); in cpu0_vid_show()
1515 return sprintf(buf, "%s\n", data->name); in name_show()
1518 /* ---------------------------------------------------------------------
1520 * --------------------------------------------------------------------- */
1522 /* Voltages 0-7 */
1543 /* Temperatures 1-3 */
1547 show_temp, NULL, SYS_TEMP_INPUT, ix-1); \
1549 show_temp, set_temp, SYS_TEMP_MIN, ix-1); \
1551 show_temp, set_temp, SYS_TEMP_MAX, ix-1); \
1553 show_temp, set_temp, SYS_TEMP_OFFSET, ix-1); \
1555 show_temp, NULL, SYS_TEMP_ALARM, ix-1); \
1557 show_temp, NULL, SYS_TEMP_FAULT, ix-1)
1563 /* Zones 1-3 */
1567 show_zone, NULL, SYS_ZONE_AUTO_CHANNELS_TEMP, ix-1); \
1569 show_zone, set_zone, SYS_ZONE_AUTO_POINT1_TEMP_HYST, ix-1); \
1571 show_zone, set_zone, SYS_ZONE_AUTO_POINT1_TEMP, ix-1); \
1573 show_zone, set_zone, SYS_ZONE_AUTO_POINT2_TEMP, ix-1); \
1575 show_zone, set_zone, SYS_ZONE_AUTO_POINT3_TEMP, ix-1)
1581 /* Fans 1-4 */
1585 show_fan, NULL, SYS_FAN_INPUT, ix-1); \
1587 show_fan, set_fan, SYS_FAN_MIN, ix-1); \
1589 show_fan, NULL, SYS_FAN_ALARM, ix-1); \
1591 show_fan, set_fan, SYS_FAN_TYPE, ix-1)
1598 /* Fans 5-6 */
1602 show_fan, NULL, SYS_FAN_INPUT, ix-1); \
1604 show_fan, set_fan, SYS_FAN_MIN, ix-1); \
1606 show_fan, NULL, SYS_FAN_ALARM, ix-1); \
1608 show_fan, set_fan, SYS_FAN_MAX, ix-1)
1613 /* PWMs 1-3 */
1617 show_pwm, set_pwm, SYS_PWM, ix-1); \
1619 show_pwm, set_pwm, SYS_PWM_FREQ, ix-1); \
1621 show_pwm, set_pwm, SYS_PWM_ENABLE, ix-1); \
1623 show_pwm, set_pwm, SYS_PWM_RAMP_RATE, ix-1); \
1625 show_pwm, set_pwm, SYS_PWM_AUTO_CHANNELS_ZONE, ix-1); \
1627 show_pwm, set_pwm, SYS_PWM_AUTO_PWM_MIN, ix-1); \
1629 show_pwm, set_pwm, SYS_PWM_AUTO_POINT1_PWM, ix-1); \
1631 show_pwm, NULL, SYS_PWM_AUTO_POINT2_PWM, ix-1)
1637 /* PWMs 5-6 */
1641 show_pwm, set_pwm, SYS_PWM, ix-1); \
1643 show_pwm, set_pwm, SYS_PWM_FREQ, ix-1); \
1645 show_pwm, NULL, SYS_PWM_ENABLE, ix-1)
1659 * permissions are created read-only and write permissions are added or removed
1932 * The permissions of the following zone attributes are changed to read-
1933 * writeable if the chip is *not* locked. Otherwise they stay read-only.
1951 * The permissions of the following zone 3 attributes are changed to read-
1952 * writeable if the chip is *not* locked. Otherwise they stay read-only.
1966 * The permissions of the following PWM attributes are changed to read-
1968 * Otherwise they stay read-only.
2015 * Pwm[1-3] are read-writeable if the associated pwm is in manual mode and the
2016 * chip is not locked. Otherwise they are read-only.
2024 /* ---------------------------------------------------------------------
2025 * Super-IO functions
2026 * --------------------------------------------------------------------- */
2050 /* ---------------------------------------------------------------------
2052 * --------------------------------------------------------------------- */
2059 if (sysfs_chmod_file(&dev->kobj, attr, mode)) { in dme1737_chmod_file()
2061 attr->name); in dme1737_chmod_file()
2071 for (attr = group->attrs; *attr; attr++) in dme1737_chmod_group()
2081 if (data->has_features & HAS_FAN(ix)) { in dme1737_remove_files()
2082 sysfs_remove_group(&dev->kobj, in dme1737_remove_files()
2088 if (data->has_features & HAS_PWM(ix)) { in dme1737_remove_files()
2089 sysfs_remove_group(&dev->kobj, in dme1737_remove_files()
2091 if ((data->has_features & HAS_PWM_MIN) && ix < 3) { in dme1737_remove_files()
2092 sysfs_remove_file(&dev->kobj, in dme1737_remove_files()
2098 if (data->has_features & HAS_TEMP_OFFSET) in dme1737_remove_files()
2099 sysfs_remove_group(&dev->kobj, &dme1737_temp_offset_group); in dme1737_remove_files()
2100 if (data->has_features & HAS_VID) in dme1737_remove_files()
2101 sysfs_remove_group(&dev->kobj, &dme1737_vid_group); in dme1737_remove_files()
2102 if (data->has_features & HAS_ZONE3) in dme1737_remove_files()
2103 sysfs_remove_group(&dev->kobj, &dme1737_zone3_group); in dme1737_remove_files()
2104 if (data->has_features & HAS_ZONE_HYST) in dme1737_remove_files()
2105 sysfs_remove_group(&dev->kobj, &dme1737_zone_hyst_group); in dme1737_remove_files()
2106 if (data->has_features & HAS_IN7) in dme1737_remove_files()
2107 sysfs_remove_group(&dev->kobj, &dme1737_in7_group); in dme1737_remove_files()
2108 sysfs_remove_group(&dev->kobj, &dme1737_group); in dme1737_remove_files()
2110 if (!data->client) in dme1737_remove_files()
2111 sysfs_remove_file(&dev->kobj, &dev_attr_name.attr); in dme1737_remove_files()
2120 if (!data->client) { in dme1737_create_files()
2121 err = sysfs_create_file(&dev->kobj, &dev_attr_name.attr); in dme1737_create_files()
2127 err = sysfs_create_group(&dev->kobj, &dme1737_group); in dme1737_create_files()
2131 /* Create chip-dependent sysfs attributes */ in dme1737_create_files()
2132 if (data->has_features & HAS_TEMP_OFFSET) { in dme1737_create_files()
2133 err = sysfs_create_group(&dev->kobj, in dme1737_create_files()
2138 if (data->has_features & HAS_VID) { in dme1737_create_files()
2139 err = sysfs_create_group(&dev->kobj, &dme1737_vid_group); in dme1737_create_files()
2143 if (data->has_features & HAS_ZONE3) { in dme1737_create_files()
2144 err = sysfs_create_group(&dev->kobj, &dme1737_zone3_group); in dme1737_create_files()
2148 if (data->has_features & HAS_ZONE_HYST) { in dme1737_create_files()
2149 err = sysfs_create_group(&dev->kobj, &dme1737_zone_hyst_group); in dme1737_create_files()
2153 if (data->has_features & HAS_IN7) { in dme1737_create_files()
2154 err = sysfs_create_group(&dev->kobj, &dme1737_in7_group); in dme1737_create_files()
2161 if (data->has_features & HAS_FAN(ix)) { in dme1737_create_files()
2162 err = sysfs_create_group(&dev->kobj, in dme1737_create_files()
2171 if (data->has_features & HAS_PWM(ix)) { in dme1737_create_files()
2172 err = sysfs_create_group(&dev->kobj, in dme1737_create_files()
2176 if ((data->has_features & HAS_PWM_MIN) && (ix < 3)) { in dme1737_create_files()
2177 err = sysfs_create_file(&dev->kobj, in dme1737_create_files()
2187 * selected attributes from read-only to read-writeable. in dme1737_create_files()
2189 if (data->config & 0x02) { in dme1737_create_files()
2191 "Device is locked. Some attributes will be read-only.\n"); in dme1737_create_files()
2197 /* Change permissions of chip-dependent sysfs attributes */ in dme1737_create_files()
2198 if (data->has_features & HAS_TEMP_OFFSET) { in dme1737_create_files()
2202 if (data->has_features & HAS_ZONE3) { in dme1737_create_files()
2206 if (data->has_features & HAS_ZONE_HYST) { in dme1737_create_files()
2213 if (data->has_features & HAS_PWM(ix)) { in dme1737_create_files()
2217 if ((data->has_features & HAS_PWM_MIN) && in dme1737_create_files()
2226 /* Change permissions of pwm[1-3] if in manual mode */ in dme1737_create_files()
2228 if ((data->has_features & HAS_PWM(ix)) && in dme1737_create_files()
2229 (PWM_EN_FROM_REG(data->pwm_config[ix]) == 1)) { in dme1737_create_files()
2248 struct i2c_client *client = data->client; in dme1737_init_device()
2253 data->in_nominal = IN_NOMINAL(data->type); in dme1737_init_device()
2255 data->config = dme1737_read(data, DME1737_REG_CONFIG); in dme1737_init_device()
2257 if (!(data->config & 0x01)) { in dme1737_init_device()
2261 return -EFAULT; in dme1737_init_device()
2265 data->config |= 0x01; in dme1737_init_device()
2266 dme1737_write(data, DME1737_REG_CONFIG, data->config); in dme1737_init_device()
2269 if (!(data->config & 0x04)) { in dme1737_init_device()
2271 return -EFAULT; in dme1737_init_device()
2279 data->config2 = dme1737_read(data, DME1737_REG_CONFIG2); in dme1737_init_device()
2281 if (data->config2 & 0x04) in dme1737_init_device()
2282 data->has_features |= HAS_FAN(2); in dme1737_init_device()
2289 if (client->addr == 0x2e) in dme1737_init_device()
2290 data->has_features |= HAS_FAN(3) | HAS_PWM(2); in dme1737_init_device()
2293 * Determine which of the optional fan[5-6] and pwm[5-6] in dme1737_init_device()
2295 * registers through the Super-IO LPC interface. Try both in dme1737_init_device()
2301 "Failed to query Super-IO for optional features.\n"); in dme1737_init_device()
2305 /* Fan[1-2] and pwm[1-2] are present in all chips */ in dme1737_init_device()
2306 data->has_features |= HAS_FAN(0) | HAS_FAN(1) | HAS_PWM(0) | HAS_PWM(1); in dme1737_init_device()
2308 /* Chip-dependent features */ in dme1737_init_device()
2309 switch (data->type) { in dme1737_init_device()
2311 data->has_features |= HAS_TEMP_OFFSET | HAS_VID | HAS_ZONE3 | in dme1737_init_device()
2315 data->has_features |= HAS_TEMP_OFFSET | HAS_ZONE3 | in dme1737_init_device()
2319 data->has_features |= HAS_ZONE3; in dme1737_init_device()
2322 data->has_features |= HAS_FAN(2) | HAS_PWM(2) | HAS_IN7; in dme1737_init_device()
2330 (data->has_features & HAS_PWM(2)) ? "yes" : "no", in dme1737_init_device()
2331 (data->has_features & HAS_PWM(4)) ? "yes" : "no", in dme1737_init_device()
2332 (data->has_features & HAS_PWM(5)) ? "yes" : "no", in dme1737_init_device()
2333 (data->has_features & HAS_FAN(2)) ? "yes" : "no", in dme1737_init_device()
2334 (data->has_features & HAS_FAN(3)) ? "yes" : "no", in dme1737_init_device()
2335 (data->has_features & HAS_FAN(4)) ? "yes" : "no", in dme1737_init_device()
2336 (data->has_features & HAS_FAN(5)) ? "yes" : "no"); in dme1737_init_device()
2339 /* Inform if fan-to-pwm mapping differs from the default */ in dme1737_init_device()
2342 "Non-standard fan to pwm mapping: fan1->pwm%d, fan2->pwm%d, fan3->pwm%d, fan4->pwm%d. %s\n", in dme1737_init_device()
2348 "Non-standard fan to pwm mapping: fan1->pwm%d, fan2->pwm%d, fan3->pwm%d. %s\n", in dme1737_init_device()
2354 * Switch pwm[1-3] to manual mode if they are currently disabled and in dme1737_init_device()
2355 * set the duty-cycles to 0% (which is identical to the PWMs being in dme1737_init_device()
2358 if (!(data->config & 0x02)) { in dme1737_init_device()
2360 data->pwm_config[ix] = dme1737_read(data, in dme1737_init_device()
2362 if ((data->has_features & HAS_PWM(ix)) && in dme1737_init_device()
2363 (PWM_EN_FROM_REG(data->pwm_config[ix]) == -1)) { in dme1737_init_device()
2367 data->pwm_config[ix] = PWM_EN_TO_REG(1, in dme1737_init_device()
2368 data->pwm_config[ix]); in dme1737_init_device()
2372 data->pwm_config[ix]); in dme1737_init_device()
2378 data->pwm_acz[0] = 1; /* pwm1 -> zone1 */ in dme1737_init_device()
2379 data->pwm_acz[1] = 2; /* pwm2 -> zone2 */ in dme1737_init_device()
2380 data->pwm_acz[2] = 4; /* pwm3 -> zone3 */ in dme1737_init_device()
2383 if (data->has_features & HAS_VID) in dme1737_init_device()
2384 data->vrm = vid_which_vrm(); in dme1737_init_device()
2389 /* ---------------------------------------------------------------------
2391 * --------------------------------------------------------------------- */
2409 err = -ENODEV; in dme1737_i2c_get_features()
2420 err = -ENODEV; in dme1737_i2c_get_features()
2426 * are enabled and available. Bits [3:2] of registers 0x43-0x46 are set in dme1737_i2c_get_features()
2430 data->has_features |= HAS_FAN(5); in dme1737_i2c_get_features()
2432 data->has_features |= HAS_PWM(5); in dme1737_i2c_get_features()
2434 data->has_features |= HAS_FAN(4); in dme1737_i2c_get_features()
2436 data->has_features |= HAS_PWM(4); in dme1737_i2c_get_features()
2444 /* Return 0 if detection is successful, -ENODEV otherwise */
2448 struct i2c_adapter *adapter = client->adapter; in dme1737_i2c_detect()
2449 struct device *dev = &adapter->dev; in dme1737_i2c_detect()
2454 return -ENODEV; in dme1737_i2c_detect()
2466 return -ENODEV; in dme1737_i2c_detect()
2471 client->addr, verstep); in dme1737_i2c_detect()
2472 strlcpy(info->type, name, I2C_NAME_SIZE); in dme1737_i2c_detect()
2481 struct device *dev = &client->dev; in dme1737_i2c_probe()
2486 return -ENOMEM; in dme1737_i2c_probe()
2489 data->type = id->driver_data; in dme1737_i2c_probe()
2490 data->client = client; in dme1737_i2c_probe()
2491 data->name = client->name; in dme1737_i2c_probe()
2492 mutex_init(&data->update_lock); in dme1737_i2c_probe()
2509 data->hwmon_dev = hwmon_device_register(dev); in dme1737_i2c_probe()
2510 if (IS_ERR(data->hwmon_dev)) { in dme1737_i2c_probe()
2512 err = PTR_ERR(data->hwmon_dev); in dme1737_i2c_probe()
2527 hwmon_device_unregister(data->hwmon_dev); in dme1737_i2c_remove()
2528 dme1737_remove_files(&client->dev); in dme1737_i2c_remove()
2552 /* ---------------------------------------------------------------------
2554 * --------------------------------------------------------------------- */
2570 err = -ENODEV; in dme1737_isa_detect()
2582 err = -ENODEV; in dme1737_isa_detect()
2601 .end = addr + DME1737_EXTENT - 1, in dme1737_isa_device_add()
2614 err = -ENOMEM; in dme1737_isa_device_add()
2644 struct device *dev = &pdev->dev; in dme1737_isa_probe()
2648 if (!devm_request_region(dev, res->start, DME1737_EXTENT, "dme1737")) { in dme1737_isa_probe()
2649 dev_err(dev, "Failed to request region 0x%04x-0x%04x.\n", in dme1737_isa_probe()
2650 (unsigned short)res->start, in dme1737_isa_probe()
2651 (unsigned short)res->start + DME1737_EXTENT - 1); in dme1737_isa_probe()
2652 return -EBUSY; in dme1737_isa_probe()
2657 return -ENOMEM; in dme1737_isa_probe()
2659 data->addr = res->start; in dme1737_isa_probe()
2667 data->type = sch311x; in dme1737_isa_probe()
2670 data->type = sch5127; in dme1737_isa_probe()
2678 data->type = sch311x; in dme1737_isa_probe()
2681 data->type = sch5127; in dme1737_isa_probe()
2683 return -ENODEV; in dme1737_isa_probe()
2687 if (data->type == sch5127) in dme1737_isa_probe()
2688 data->name = "sch5127"; in dme1737_isa_probe()
2690 data->name = "sch311x"; in dme1737_isa_probe()
2693 mutex_init(&data->update_lock); in dme1737_isa_probe()
2696 data->type == sch5127 ? "SCH5127" : "SCH311x", data->addr); in dme1737_isa_probe()
2713 data->hwmon_dev = hwmon_device_register(dev); in dme1737_isa_probe()
2714 if (IS_ERR(data->hwmon_dev)) { in dme1737_isa_probe()
2716 err = PTR_ERR(data->hwmon_dev); in dme1737_isa_probe()
2731 hwmon_device_unregister(data->hwmon_dev); in dme1737_isa_remove()
2732 dme1737_remove_files(&pdev->dev); in dme1737_isa_remove()
2745 /* ---------------------------------------------------------------------
2747 * --------------------------------------------------------------------- */