diff options
author | Guenter Roeck <linux@roeck-us.net> | 2015-03-26 22:57:42 -0400 |
---|---|---|
committer | Guenter Roeck <linux@roeck-us.net> | 2016-04-19 09:32:35 -0400 |
commit | 60878bcfd3dd2ea146dacf41313f8caa365df9a1 (patch) | |
tree | 07710ac2956c1ab8184faf488a2b0022c18be359 /drivers/hwmon/it87.c | |
parent | 36c4d98a7883d4c51252d0f4ebf2c667fa7f879f (diff) |
hwmon: (it87) Add support for second pwm frequency register
Recent chips have a separate register to select the pwm2 frequency.
Tested-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Diffstat (limited to 'drivers/hwmon/it87.c')
-rw-r--r-- | drivers/hwmon/it87.c | 100 |
1 files changed, 69 insertions, 31 deletions
diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c index 916d73630224..68c8d98e711a 100644 --- a/drivers/hwmon/it87.c +++ b/drivers/hwmon/it87.c | |||
@@ -274,6 +274,7 @@ struct it87_devices { | |||
274 | #define FEAT_10_9MV_ADC (1 << 12) | 274 | #define FEAT_10_9MV_ADC (1 << 12) |
275 | #define FEAT_AVCC3 (1 << 13) /* Chip supports in9/AVCC3 */ | 275 | #define FEAT_AVCC3 (1 << 13) /* Chip supports in9/AVCC3 */ |
276 | #define FEAT_SIX_PWM (1 << 14) /* Chip supports 6 pwm chn */ | 276 | #define FEAT_SIX_PWM (1 << 14) /* Chip supports 6 pwm chn */ |
277 | #define FEAT_PWM_FREQ2 (1 << 15) /* Separate pwm freq 2 */ | ||
277 | 278 | ||
278 | static const struct it87_devices it87_devices[] = { | 279 | static const struct it87_devices it87_devices[] = { |
279 | [it87] = { | 280 | [it87] = { |
@@ -291,20 +292,22 @@ static const struct it87_devices it87_devices[] = { | |||
291 | .name = "it8716", | 292 | .name = "it8716", |
292 | .suffix = "F", | 293 | .suffix = "F", |
293 | .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID | 294 | .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID |
294 | | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS, | 295 | | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS | FEAT_PWM_FREQ2, |
295 | }, | 296 | }, |
296 | [it8718] = { | 297 | [it8718] = { |
297 | .name = "it8718", | 298 | .name = "it8718", |
298 | .suffix = "F", | 299 | .suffix = "F", |
299 | .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID | 300 | .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID |
300 | | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS, | 301 | | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS |
302 | | FEAT_PWM_FREQ2, | ||
301 | .old_peci_mask = 0x4, | 303 | .old_peci_mask = 0x4, |
302 | }, | 304 | }, |
303 | [it8720] = { | 305 | [it8720] = { |
304 | .name = "it8720", | 306 | .name = "it8720", |
305 | .suffix = "F", | 307 | .suffix = "F", |
306 | .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID | 308 | .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID |
307 | | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS, | 309 | | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS |
310 | | FEAT_PWM_FREQ2, | ||
308 | .old_peci_mask = 0x4, | 311 | .old_peci_mask = 0x4, |
309 | }, | 312 | }, |
310 | [it8721] = { | 313 | [it8721] = { |
@@ -312,7 +315,8 @@ static const struct it87_devices it87_devices[] = { | |||
312 | .suffix = "F", | 315 | .suffix = "F", |
313 | .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS | 316 | .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS |
314 | | FEAT_TEMP_OFFSET | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI | 317 | | FEAT_TEMP_OFFSET | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI |
315 | | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS | FEAT_IN7_INTERNAL, | 318 | | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS | FEAT_IN7_INTERNAL |
319 | | FEAT_PWM_FREQ2, | ||
316 | .peci_mask = 0x05, | 320 | .peci_mask = 0x05, |
317 | .old_peci_mask = 0x02, /* Actually reports PCH */ | 321 | .old_peci_mask = 0x02, /* Actually reports PCH */ |
318 | }, | 322 | }, |
@@ -321,7 +325,7 @@ static const struct it87_devices it87_devices[] = { | |||
321 | .suffix = "F", | 325 | .suffix = "F", |
322 | .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS | 326 | .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS |
323 | | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_FIVE_FANS | 327 | | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_FIVE_FANS |
324 | | FEAT_IN7_INTERNAL, | 328 | | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2, |
325 | .peci_mask = 0x07, | 329 | .peci_mask = 0x07, |
326 | }, | 330 | }, |
327 | [it8732] = { | 331 | [it8732] = { |
@@ -337,7 +341,8 @@ static const struct it87_devices it87_devices[] = { | |||
337 | .name = "it8771", | 341 | .name = "it8771", |
338 | .suffix = "E", | 342 | .suffix = "E", |
339 | .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS | 343 | .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS |
340 | | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL, | 344 | | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL |
345 | | FEAT_PWM_FREQ2, | ||
341 | /* PECI: guesswork */ | 346 | /* PECI: guesswork */ |
342 | /* 12mV ADC (OHM) */ | 347 | /* 12mV ADC (OHM) */ |
343 | /* 16 bit fans (OHM) */ | 348 | /* 16 bit fans (OHM) */ |
@@ -348,7 +353,8 @@ static const struct it87_devices it87_devices[] = { | |||
348 | .name = "it8772", | 353 | .name = "it8772", |
349 | .suffix = "E", | 354 | .suffix = "E", |
350 | .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS | 355 | .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS |
351 | | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL, | 356 | | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL |
357 | | FEAT_PWM_FREQ2, | ||
352 | /* PECI (coreboot) */ | 358 | /* PECI (coreboot) */ |
353 | /* 12mV ADC (HWSensors4, OHM) */ | 359 | /* 12mV ADC (HWSensors4, OHM) */ |
354 | /* 16 bit fans (HWSensors4, OHM) */ | 360 | /* 16 bit fans (HWSensors4, OHM) */ |
@@ -359,35 +365,37 @@ static const struct it87_devices it87_devices[] = { | |||
359 | .name = "it8781", | 365 | .name = "it8781", |
360 | .suffix = "F", | 366 | .suffix = "F", |
361 | .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | 367 | .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET |
362 | | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG, | 368 | | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2, |
363 | .old_peci_mask = 0x4, | 369 | .old_peci_mask = 0x4, |
364 | }, | 370 | }, |
365 | [it8782] = { | 371 | [it8782] = { |
366 | .name = "it8782", | 372 | .name = "it8782", |
367 | .suffix = "F", | 373 | .suffix = "F", |
368 | .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | 374 | .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET |
369 | | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG, | 375 | | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2, |
370 | .old_peci_mask = 0x4, | 376 | .old_peci_mask = 0x4, |
371 | }, | 377 | }, |
372 | [it8783] = { | 378 | [it8783] = { |
373 | .name = "it8783", | 379 | .name = "it8783", |
374 | .suffix = "E/F", | 380 | .suffix = "E/F", |
375 | .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | 381 | .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET |
376 | | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG, | 382 | | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2, |
377 | .old_peci_mask = 0x4, | 383 | .old_peci_mask = 0x4, |
378 | }, | 384 | }, |
379 | [it8786] = { | 385 | [it8786] = { |
380 | .name = "it8786", | 386 | .name = "it8786", |
381 | .suffix = "E", | 387 | .suffix = "E", |
382 | .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS | 388 | .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS |
383 | | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL, | 389 | | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL |
390 | | FEAT_PWM_FREQ2, | ||
384 | .peci_mask = 0x07, | 391 | .peci_mask = 0x07, |
385 | }, | 392 | }, |
386 | [it8790] = { | 393 | [it8790] = { |
387 | .name = "it8790", | 394 | .name = "it8790", |
388 | .suffix = "E", | 395 | .suffix = "E", |
389 | .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS | 396 | .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS |
390 | | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL, | 397 | | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL |
398 | | FEAT_PWM_FREQ2, | ||
391 | .peci_mask = 0x07, | 399 | .peci_mask = 0x07, |
392 | }, | 400 | }, |
393 | [it8603] = { | 401 | [it8603] = { |
@@ -395,7 +403,7 @@ static const struct it87_devices it87_devices[] = { | |||
395 | .suffix = "E", | 403 | .suffix = "E", |
396 | .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS | 404 | .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS |
397 | | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL | 405 | | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL |
398 | | FEAT_AVCC3, | 406 | | FEAT_AVCC3 | FEAT_PWM_FREQ2, |
399 | .peci_mask = 0x07, | 407 | .peci_mask = 0x07, |
400 | }, | 408 | }, |
401 | [it8620] = { | 409 | [it8620] = { |
@@ -403,7 +411,7 @@ static const struct it87_devices it87_devices[] = { | |||
403 | .suffix = "E", | 411 | .suffix = "E", |
404 | .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS | 412 | .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS |
405 | | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_SIX_FANS | 413 | | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_SIX_FANS |
406 | | FEAT_IN7_INTERNAL | FEAT_SIX_PWM, | 414 | | FEAT_IN7_INTERNAL | FEAT_SIX_PWM | FEAT_PWM_FREQ2, |
407 | .peci_mask = 0x07, | 415 | .peci_mask = 0x07, |
408 | }, | 416 | }, |
409 | }; | 417 | }; |
@@ -427,6 +435,7 @@ static const struct it87_devices it87_devices[] = { | |||
427 | #define has_six_fans(data) ((data)->features & FEAT_SIX_FANS) | 435 | #define has_six_fans(data) ((data)->features & FEAT_SIX_FANS) |
428 | #define has_avcc3(data) ((data)->features & FEAT_AVCC3) | 436 | #define has_avcc3(data) ((data)->features & FEAT_AVCC3) |
429 | #define has_six_pwm(data) ((data)->features & FEAT_SIX_PWM) | 437 | #define has_six_pwm(data) ((data)->features & FEAT_SIX_PWM) |
438 | #define has_pwm_freq2(data) ((data)->features & FEAT_PWM_FREQ2) | ||
430 | 439 | ||
431 | struct it87_sio_data { | 440 | struct it87_sio_data { |
432 | enum chips type; | 441 | enum chips type; |
@@ -906,9 +915,16 @@ static ssize_t show_pwm(struct device *dev, struct device_attribute *attr, | |||
906 | static ssize_t show_pwm_freq(struct device *dev, struct device_attribute *attr, | 915 | static ssize_t show_pwm_freq(struct device *dev, struct device_attribute *attr, |
907 | char *buf) | 916 | char *buf) |
908 | { | 917 | { |
918 | struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); | ||
909 | struct it87_data *data = it87_update_device(dev); | 919 | struct it87_data *data = it87_update_device(dev); |
910 | int index = (data->fan_ctl >> 4) & 0x07; | 920 | int nr = sensor_attr->index; |
911 | unsigned int freq; | 921 | unsigned int freq; |
922 | int index; | ||
923 | |||
924 | if (has_pwm_freq2(data) && nr == 1) | ||
925 | index = (data->extra >> 4) & 0x07; | ||
926 | else | ||
927 | index = (data->fan_ctl >> 4) & 0x07; | ||
912 | 928 | ||
913 | freq = pwm_freq[index] / (has_newer_autopwm(data) ? 256 : 128); | 929 | freq = pwm_freq[index] / (has_newer_autopwm(data) ? 256 : 128); |
914 | 930 | ||
@@ -1127,7 +1143,9 @@ static ssize_t set_pwm(struct device *dev, struct device_attribute *attr, | |||
1127 | static ssize_t set_pwm_freq(struct device *dev, | 1143 | static ssize_t set_pwm_freq(struct device *dev, |
1128 | struct device_attribute *attr, const char *buf, size_t count) | 1144 | struct device_attribute *attr, const char *buf, size_t count) |
1129 | { | 1145 | { |
1146 | struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); | ||
1130 | struct it87_data *data = dev_get_drvdata(dev); | 1147 | struct it87_data *data = dev_get_drvdata(dev); |
1148 | int nr = sensor_attr->index; | ||
1131 | unsigned long val; | 1149 | unsigned long val; |
1132 | int i; | 1150 | int i; |
1133 | 1151 | ||
@@ -1144,9 +1162,15 @@ static ssize_t set_pwm_freq(struct device *dev, | |||
1144 | } | 1162 | } |
1145 | 1163 | ||
1146 | mutex_lock(&data->update_lock); | 1164 | mutex_lock(&data->update_lock); |
1147 | data->fan_ctl = it87_read_value(data, IT87_REG_FAN_CTL) & 0x8f; | 1165 | if (nr == 0) { |
1148 | data->fan_ctl |= i << 4; | 1166 | data->fan_ctl = it87_read_value(data, IT87_REG_FAN_CTL) & 0x8f; |
1149 | it87_write_value(data, IT87_REG_FAN_CTL, data->fan_ctl); | 1167 | data->fan_ctl |= i << 4; |
1168 | it87_write_value(data, IT87_REG_FAN_CTL, data->fan_ctl); | ||
1169 | } else { | ||
1170 | data->extra = it87_read_value(data, IT87_REG_TEMP_EXTRA) & 0x8f; | ||
1171 | data->extra |= i << 4; | ||
1172 | it87_write_value(data, IT87_REG_TEMP_EXTRA, data->extra); | ||
1173 | } | ||
1150 | mutex_unlock(&data->update_lock); | 1174 | mutex_unlock(&data->update_lock); |
1151 | 1175 | ||
1152 | return count; | 1176 | return count; |
@@ -1316,7 +1340,8 @@ static SENSOR_DEVICE_ATTR_2(fan6_min, S_IRUGO | S_IWUSR, show_fan, set_fan, | |||
1316 | static SENSOR_DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR, | 1340 | static SENSOR_DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR, |
1317 | show_pwm_enable, set_pwm_enable, 0); | 1341 | show_pwm_enable, set_pwm_enable, 0); |
1318 | static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 0); | 1342 | static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 0); |
1319 | static DEVICE_ATTR(pwm1_freq, S_IRUGO | S_IWUSR, show_pwm_freq, set_pwm_freq); | 1343 | static SENSOR_DEVICE_ATTR(pwm1_freq, S_IRUGO | S_IWUSR, show_pwm_freq, |
1344 | set_pwm_freq, 0); | ||
1320 | static SENSOR_DEVICE_ATTR(pwm1_auto_channels_temp, S_IRUGO | S_IWUSR, | 1345 | static SENSOR_DEVICE_ATTR(pwm1_auto_channels_temp, S_IRUGO | S_IWUSR, |
1321 | show_pwm_temp_map, set_pwm_temp_map, 0); | 1346 | show_pwm_temp_map, set_pwm_temp_map, 0); |
1322 | static SENSOR_DEVICE_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO | S_IWUSR, | 1347 | static SENSOR_DEVICE_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO | S_IWUSR, |
@@ -1341,7 +1366,7 @@ static SENSOR_DEVICE_ATTR_2(pwm1_auto_point4_temp, S_IRUGO | S_IWUSR, | |||
1341 | static SENSOR_DEVICE_ATTR(pwm2_enable, S_IRUGO | S_IWUSR, | 1366 | static SENSOR_DEVICE_ATTR(pwm2_enable, S_IRUGO | S_IWUSR, |
1342 | show_pwm_enable, set_pwm_enable, 1); | 1367 | show_pwm_enable, set_pwm_enable, 1); |
1343 | static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 1); | 1368 | static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 1); |
1344 | static DEVICE_ATTR(pwm2_freq, S_IRUGO, show_pwm_freq, NULL); | 1369 | static SENSOR_DEVICE_ATTR(pwm2_freq, S_IRUGO, show_pwm_freq, set_pwm_freq, 1); |
1345 | static SENSOR_DEVICE_ATTR(pwm2_auto_channels_temp, S_IRUGO | S_IWUSR, | 1370 | static SENSOR_DEVICE_ATTR(pwm2_auto_channels_temp, S_IRUGO | S_IWUSR, |
1346 | show_pwm_temp_map, set_pwm_temp_map, 1); | 1371 | show_pwm_temp_map, set_pwm_temp_map, 1); |
1347 | static SENSOR_DEVICE_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO | S_IWUSR, | 1372 | static SENSOR_DEVICE_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO | S_IWUSR, |
@@ -1366,7 +1391,7 @@ static SENSOR_DEVICE_ATTR_2(pwm2_auto_point4_temp, S_IRUGO | S_IWUSR, | |||
1366 | static SENSOR_DEVICE_ATTR(pwm3_enable, S_IRUGO | S_IWUSR, | 1391 | static SENSOR_DEVICE_ATTR(pwm3_enable, S_IRUGO | S_IWUSR, |
1367 | show_pwm_enable, set_pwm_enable, 2); | 1392 | show_pwm_enable, set_pwm_enable, 2); |
1368 | static SENSOR_DEVICE_ATTR(pwm3, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 2); | 1393 | static SENSOR_DEVICE_ATTR(pwm3, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 2); |
1369 | static DEVICE_ATTR(pwm3_freq, S_IRUGO, show_pwm_freq, NULL); | 1394 | static SENSOR_DEVICE_ATTR(pwm3_freq, S_IRUGO, show_pwm_freq, NULL, 2); |
1370 | static SENSOR_DEVICE_ATTR(pwm3_auto_channels_temp, S_IRUGO | S_IWUSR, | 1395 | static SENSOR_DEVICE_ATTR(pwm3_auto_channels_temp, S_IRUGO | S_IWUSR, |
1371 | show_pwm_temp_map, set_pwm_temp_map, 2); | 1396 | show_pwm_temp_map, set_pwm_temp_map, 2); |
1372 | static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO | S_IWUSR, | 1397 | static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO | S_IWUSR, |
@@ -1391,21 +1416,21 @@ static SENSOR_DEVICE_ATTR_2(pwm3_auto_point4_temp, S_IRUGO | S_IWUSR, | |||
1391 | static SENSOR_DEVICE_ATTR(pwm4_enable, S_IRUGO | S_IWUSR, | 1416 | static SENSOR_DEVICE_ATTR(pwm4_enable, S_IRUGO | S_IWUSR, |
1392 | show_pwm_enable, set_pwm_enable, 3); | 1417 | show_pwm_enable, set_pwm_enable, 3); |
1393 | static SENSOR_DEVICE_ATTR(pwm4, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 3); | 1418 | static SENSOR_DEVICE_ATTR(pwm4, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 3); |
1394 | static DEVICE_ATTR(pwm4_freq, S_IRUGO | S_IWUSR, show_pwm_freq, set_pwm_freq); | 1419 | static SENSOR_DEVICE_ATTR(pwm4_freq, S_IRUGO, show_pwm_freq, NULL, 3); |
1395 | static SENSOR_DEVICE_ATTR(pwm4_auto_channels_temp, S_IRUGO | S_IWUSR, | 1420 | static SENSOR_DEVICE_ATTR(pwm4_auto_channels_temp, S_IRUGO | S_IWUSR, |
1396 | show_pwm_temp_map, set_pwm_temp_map, 3); | 1421 | show_pwm_temp_map, set_pwm_temp_map, 3); |
1397 | 1422 | ||
1398 | static SENSOR_DEVICE_ATTR(pwm5_enable, S_IRUGO | S_IWUSR, | 1423 | static SENSOR_DEVICE_ATTR(pwm5_enable, S_IRUGO | S_IWUSR, |
1399 | show_pwm_enable, set_pwm_enable, 4); | 1424 | show_pwm_enable, set_pwm_enable, 4); |
1400 | static SENSOR_DEVICE_ATTR(pwm5, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 4); | 1425 | static SENSOR_DEVICE_ATTR(pwm5, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 4); |
1401 | static DEVICE_ATTR(pwm5_freq, S_IRUGO | S_IWUSR, show_pwm_freq, set_pwm_freq); | 1426 | static SENSOR_DEVICE_ATTR(pwm5_freq, S_IRUGO, show_pwm_freq, NULL, 4); |
1402 | static SENSOR_DEVICE_ATTR(pwm5_auto_channels_temp, S_IRUGO | S_IWUSR, | 1427 | static SENSOR_DEVICE_ATTR(pwm5_auto_channels_temp, S_IRUGO | S_IWUSR, |
1403 | show_pwm_temp_map, set_pwm_temp_map, 4); | 1428 | show_pwm_temp_map, set_pwm_temp_map, 4); |
1404 | 1429 | ||
1405 | static SENSOR_DEVICE_ATTR(pwm6_enable, S_IRUGO | S_IWUSR, | 1430 | static SENSOR_DEVICE_ATTR(pwm6_enable, S_IRUGO | S_IWUSR, |
1406 | show_pwm_enable, set_pwm_enable, 5); | 1431 | show_pwm_enable, set_pwm_enable, 5); |
1407 | static SENSOR_DEVICE_ATTR(pwm6, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 5); | 1432 | static SENSOR_DEVICE_ATTR(pwm6, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 5); |
1408 | static DEVICE_ATTR(pwm6_freq, S_IRUGO | S_IWUSR, show_pwm_freq, set_pwm_freq); | 1433 | static SENSOR_DEVICE_ATTR(pwm6_freq, S_IRUGO, show_pwm_freq, NULL, 5); |
1409 | static SENSOR_DEVICE_ATTR(pwm6_auto_channels_temp, S_IRUGO | S_IWUSR, | 1434 | static SENSOR_DEVICE_ATTR(pwm6_auto_channels_temp, S_IRUGO | S_IWUSR, |
1410 | show_pwm_temp_map, set_pwm_temp_map, 5); | 1435 | show_pwm_temp_map, set_pwm_temp_map, 5); |
1411 | 1436 | ||
@@ -1774,44 +1799,57 @@ static const struct attribute *it87_attributes_fan_div[] = { | |||
1774 | static struct attribute *it87_attributes_pwm[6][4+1] = { { | 1799 | static struct attribute *it87_attributes_pwm[6][4+1] = { { |
1775 | &sensor_dev_attr_pwm1_enable.dev_attr.attr, | 1800 | &sensor_dev_attr_pwm1_enable.dev_attr.attr, |
1776 | &sensor_dev_attr_pwm1.dev_attr.attr, | 1801 | &sensor_dev_attr_pwm1.dev_attr.attr, |
1777 | &dev_attr_pwm1_freq.attr, | 1802 | &sensor_dev_attr_pwm1_freq.dev_attr.attr, |
1778 | &sensor_dev_attr_pwm1_auto_channels_temp.dev_attr.attr, | 1803 | &sensor_dev_attr_pwm1_auto_channels_temp.dev_attr.attr, |
1779 | NULL | 1804 | NULL |
1780 | }, { | 1805 | }, { |
1781 | &sensor_dev_attr_pwm2_enable.dev_attr.attr, | 1806 | &sensor_dev_attr_pwm2_enable.dev_attr.attr, |
1782 | &sensor_dev_attr_pwm2.dev_attr.attr, | 1807 | &sensor_dev_attr_pwm2.dev_attr.attr, |
1783 | &dev_attr_pwm2_freq.attr, | 1808 | &sensor_dev_attr_pwm2_freq.dev_attr.attr, |
1784 | &sensor_dev_attr_pwm2_auto_channels_temp.dev_attr.attr, | 1809 | &sensor_dev_attr_pwm2_auto_channels_temp.dev_attr.attr, |
1785 | NULL | 1810 | NULL |
1786 | }, { | 1811 | }, { |
1787 | &sensor_dev_attr_pwm3_enable.dev_attr.attr, | 1812 | &sensor_dev_attr_pwm3_enable.dev_attr.attr, |
1788 | &sensor_dev_attr_pwm3.dev_attr.attr, | 1813 | &sensor_dev_attr_pwm3.dev_attr.attr, |
1789 | &dev_attr_pwm3_freq.attr, | 1814 | &sensor_dev_attr_pwm3_freq.dev_attr.attr, |
1790 | &sensor_dev_attr_pwm3_auto_channels_temp.dev_attr.attr, | 1815 | &sensor_dev_attr_pwm3_auto_channels_temp.dev_attr.attr, |
1791 | NULL | 1816 | NULL |
1792 | }, { | 1817 | }, { |
1793 | &sensor_dev_attr_pwm4_enable.dev_attr.attr, | 1818 | &sensor_dev_attr_pwm4_enable.dev_attr.attr, |
1794 | &sensor_dev_attr_pwm4.dev_attr.attr, | 1819 | &sensor_dev_attr_pwm4.dev_attr.attr, |
1795 | &dev_attr_pwm4_freq.attr, | 1820 | &sensor_dev_attr_pwm4_freq.dev_attr.attr, |
1796 | &sensor_dev_attr_pwm4_auto_channels_temp.dev_attr.attr, | 1821 | &sensor_dev_attr_pwm4_auto_channels_temp.dev_attr.attr, |
1797 | NULL | 1822 | NULL |
1798 | }, { | 1823 | }, { |
1799 | &sensor_dev_attr_pwm5_enable.dev_attr.attr, | 1824 | &sensor_dev_attr_pwm5_enable.dev_attr.attr, |
1800 | &sensor_dev_attr_pwm5.dev_attr.attr, | 1825 | &sensor_dev_attr_pwm5.dev_attr.attr, |
1801 | &dev_attr_pwm5_freq.attr, | 1826 | &sensor_dev_attr_pwm5_freq.dev_attr.attr, |
1802 | &sensor_dev_attr_pwm5_auto_channels_temp.dev_attr.attr, | 1827 | &sensor_dev_attr_pwm5_auto_channels_temp.dev_attr.attr, |
1803 | NULL | 1828 | NULL |
1804 | }, { | 1829 | }, { |
1805 | &sensor_dev_attr_pwm6_enable.dev_attr.attr, | 1830 | &sensor_dev_attr_pwm6_enable.dev_attr.attr, |
1806 | &sensor_dev_attr_pwm6.dev_attr.attr, | 1831 | &sensor_dev_attr_pwm6.dev_attr.attr, |
1807 | &dev_attr_pwm6_freq.attr, | 1832 | &sensor_dev_attr_pwm6_freq.dev_attr.attr, |
1808 | &sensor_dev_attr_pwm6_auto_channels_temp.dev_attr.attr, | 1833 | &sensor_dev_attr_pwm6_auto_channels_temp.dev_attr.attr, |
1809 | NULL | 1834 | NULL |
1810 | } }; | 1835 | } }; |
1811 | 1836 | ||
1837 | static umode_t pwm_attribute_mode(struct kobject *kobj, struct attribute *attr, | ||
1838 | int index) | ||
1839 | { | ||
1840 | struct device *dev = container_of(kobj, struct device, kobj); | ||
1841 | struct it87_data *data = dev_get_drvdata(dev); | ||
1842 | |||
1843 | if (has_pwm_freq2(data) && index == 2) | ||
1844 | return attr->mode | S_IWUSR; | ||
1845 | |||
1846 | return attr->mode; | ||
1847 | } | ||
1848 | |||
1812 | static const struct attribute_group it87_group_pwm[6] = { | 1849 | static const struct attribute_group it87_group_pwm[6] = { |
1813 | { .attrs = it87_attributes_pwm[0] }, | 1850 | { .attrs = it87_attributes_pwm[0] }, |
1814 | { .attrs = it87_attributes_pwm[1] }, | 1851 | { .attrs = it87_attributes_pwm[1], |
1852 | .is_visible = pwm_attribute_mode, }, | ||
1815 | { .attrs = it87_attributes_pwm[2] }, | 1853 | { .attrs = it87_attributes_pwm[2] }, |
1816 | { .attrs = it87_attributes_pwm[3] }, | 1854 | { .attrs = it87_attributes_pwm[3] }, |
1817 | { .attrs = it87_attributes_pwm[4] }, | 1855 | { .attrs = it87_attributes_pwm[4] }, |