summaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/it87.c
diff options
context:
space:
mode:
authorGuenter Roeck <linux@roeck-us.net>2015-03-26 22:57:42 -0400
committerGuenter Roeck <linux@roeck-us.net>2016-04-19 09:32:35 -0400
commit60878bcfd3dd2ea146dacf41313f8caa365df9a1 (patch)
tree07710ac2956c1ab8184faf488a2b0022c18be359 /drivers/hwmon/it87.c
parent36c4d98a7883d4c51252d0f4ebf2c667fa7f879f (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.c100
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
278static const struct it87_devices it87_devices[] = { 279static 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
431struct it87_sio_data { 440struct 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,
906static ssize_t show_pwm_freq(struct device *dev, struct device_attribute *attr, 915static 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,
1127static ssize_t set_pwm_freq(struct device *dev, 1143static 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,
1316static SENSOR_DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR, 1340static 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);
1318static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 0); 1342static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 0);
1319static DEVICE_ATTR(pwm1_freq, S_IRUGO | S_IWUSR, show_pwm_freq, set_pwm_freq); 1343static SENSOR_DEVICE_ATTR(pwm1_freq, S_IRUGO | S_IWUSR, show_pwm_freq,
1344 set_pwm_freq, 0);
1320static SENSOR_DEVICE_ATTR(pwm1_auto_channels_temp, S_IRUGO | S_IWUSR, 1345static 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);
1322static SENSOR_DEVICE_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO | S_IWUSR, 1347static 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,
1341static SENSOR_DEVICE_ATTR(pwm2_enable, S_IRUGO | S_IWUSR, 1366static 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);
1343static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 1); 1368static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 1);
1344static DEVICE_ATTR(pwm2_freq, S_IRUGO, show_pwm_freq, NULL); 1369static SENSOR_DEVICE_ATTR(pwm2_freq, S_IRUGO, show_pwm_freq, set_pwm_freq, 1);
1345static SENSOR_DEVICE_ATTR(pwm2_auto_channels_temp, S_IRUGO | S_IWUSR, 1370static 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);
1347static SENSOR_DEVICE_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO | S_IWUSR, 1372static 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,
1366static SENSOR_DEVICE_ATTR(pwm3_enable, S_IRUGO | S_IWUSR, 1391static 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);
1368static SENSOR_DEVICE_ATTR(pwm3, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 2); 1393static SENSOR_DEVICE_ATTR(pwm3, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 2);
1369static DEVICE_ATTR(pwm3_freq, S_IRUGO, show_pwm_freq, NULL); 1394static SENSOR_DEVICE_ATTR(pwm3_freq, S_IRUGO, show_pwm_freq, NULL, 2);
1370static SENSOR_DEVICE_ATTR(pwm3_auto_channels_temp, S_IRUGO | S_IWUSR, 1395static 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);
1372static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO | S_IWUSR, 1397static 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,
1391static SENSOR_DEVICE_ATTR(pwm4_enable, S_IRUGO | S_IWUSR, 1416static 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);
1393static SENSOR_DEVICE_ATTR(pwm4, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 3); 1418static SENSOR_DEVICE_ATTR(pwm4, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 3);
1394static DEVICE_ATTR(pwm4_freq, S_IRUGO | S_IWUSR, show_pwm_freq, set_pwm_freq); 1419static SENSOR_DEVICE_ATTR(pwm4_freq, S_IRUGO, show_pwm_freq, NULL, 3);
1395static SENSOR_DEVICE_ATTR(pwm4_auto_channels_temp, S_IRUGO | S_IWUSR, 1420static 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
1398static SENSOR_DEVICE_ATTR(pwm5_enable, S_IRUGO | S_IWUSR, 1423static 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);
1400static SENSOR_DEVICE_ATTR(pwm5, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 4); 1425static SENSOR_DEVICE_ATTR(pwm5, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 4);
1401static DEVICE_ATTR(pwm5_freq, S_IRUGO | S_IWUSR, show_pwm_freq, set_pwm_freq); 1426static SENSOR_DEVICE_ATTR(pwm5_freq, S_IRUGO, show_pwm_freq, NULL, 4);
1402static SENSOR_DEVICE_ATTR(pwm5_auto_channels_temp, S_IRUGO | S_IWUSR, 1427static 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
1405static SENSOR_DEVICE_ATTR(pwm6_enable, S_IRUGO | S_IWUSR, 1430static 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);
1407static SENSOR_DEVICE_ATTR(pwm6, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 5); 1432static SENSOR_DEVICE_ATTR(pwm6, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 5);
1408static DEVICE_ATTR(pwm6_freq, S_IRUGO | S_IWUSR, show_pwm_freq, set_pwm_freq); 1433static SENSOR_DEVICE_ATTR(pwm6_freq, S_IRUGO, show_pwm_freq, NULL, 5);
1409static SENSOR_DEVICE_ATTR(pwm6_auto_channels_temp, S_IRUGO | S_IWUSR, 1434static 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[] = {
1774static struct attribute *it87_attributes_pwm[6][4+1] = { { 1799static 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
1837static 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
1812static const struct attribute_group it87_group_pwm[6] = { 1849static 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] },