diff options
author | Guenter Roeck <linux@roeck-us.net> | 2015-08-15 20:02:09 -0400 |
---|---|---|
committer | Guenter Roeck <linux@roeck-us.net> | 2015-08-17 14:55:55 -0400 |
commit | 8582bcc8ebb21375b37f337c58ca783b997a0355 (patch) | |
tree | daf94b261cbb8b9658b4dcedde594a5a6de920f4 | |
parent | 2238835c5ce9f8eae5cb4dd6a6c05a6c82743282 (diff) |
hwmon: (ltc2978) Introduce feature flags
It is becoming cumbersom to track per-chip feature support.
Introduce feature flag to simplify the code.
Tested-by: Michael Jones <mike@proclivis.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
-rw-r--r-- | drivers/hwmon/pmbus/ltc2978.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/drivers/hwmon/pmbus/ltc2978.c b/drivers/hwmon/pmbus/ltc2978.c index e153ffd59ab0..48cbb5794e30 100644 --- a/drivers/hwmon/pmbus/ltc2978.c +++ b/drivers/hwmon/pmbus/ltc2978.c | |||
@@ -97,10 +97,14 @@ struct ltc2978_data { | |||
97 | u16 pin_min, pin_max; | 97 | u16 pin_min, pin_max; |
98 | u16 temp2_max; | 98 | u16 temp2_max; |
99 | struct pmbus_driver_info info; | 99 | struct pmbus_driver_info info; |
100 | u32 features; | ||
100 | }; | 101 | }; |
101 | |||
102 | #define to_ltc2978_data(x) container_of(x, struct ltc2978_data, info) | 102 | #define to_ltc2978_data(x) container_of(x, struct ltc2978_data, info) |
103 | 103 | ||
104 | #define FEAT_CLEAR_PEAKS BIT(0) | ||
105 | |||
106 | #define has_clear_peaks(d) ((d)->features & FEAT_CLEAR_PEAKS) | ||
107 | |||
104 | static inline int lin11_to_val(int data) | 108 | static inline int lin11_to_val(int data) |
105 | { | 109 | { |
106 | s16 e = ((s16)data) >> 11; | 110 | s16 e = ((s16)data) >> 11; |
@@ -374,13 +378,12 @@ static int ltc3883_read_word_data(struct i2c_client *client, int page, int reg) | |||
374 | return ret; | 378 | return ret; |
375 | } | 379 | } |
376 | 380 | ||
377 | static int ltc2978_clear_peaks(struct i2c_client *client, int page, | 381 | static int ltc2978_clear_peaks(struct ltc2978_data *data, |
378 | enum chips id) | 382 | struct i2c_client *client, int page) |
379 | { | 383 | { |
380 | int ret; | 384 | int ret; |
381 | 385 | ||
382 | if (id == ltc3880 || id == ltc3882 || id == ltc3883 || id == ltc3887 || | 386 | if (has_clear_peaks(data)) |
383 | id == ltm4676) | ||
384 | ret = pmbus_write_byte(client, 0, LTC3880_MFR_CLEAR_PEAKS); | 387 | ret = pmbus_write_byte(client, 0, LTC3880_MFR_CLEAR_PEAKS); |
385 | else | 388 | else |
386 | ret = pmbus_write_byte(client, page, PMBUS_CLEAR_FAULTS); | 389 | ret = pmbus_write_byte(client, page, PMBUS_CLEAR_FAULTS); |
@@ -399,36 +402,36 @@ static int ltc2978_write_word_data(struct i2c_client *client, int page, | |||
399 | case PMBUS_VIRT_RESET_IIN_HISTORY: | 402 | case PMBUS_VIRT_RESET_IIN_HISTORY: |
400 | data->iin_max = 0x7c00; | 403 | data->iin_max = 0x7c00; |
401 | data->iin_min = 0x7bff; | 404 | data->iin_min = 0x7bff; |
402 | ret = ltc2978_clear_peaks(client, 0, data->id); | 405 | ret = ltc2978_clear_peaks(data, client, 0); |
403 | break; | 406 | break; |
404 | case PMBUS_VIRT_RESET_PIN_HISTORY: | 407 | case PMBUS_VIRT_RESET_PIN_HISTORY: |
405 | data->pin_max = 0x7c00; | 408 | data->pin_max = 0x7c00; |
406 | data->pin_min = 0x7bff; | 409 | data->pin_min = 0x7bff; |
407 | ret = ltc2978_clear_peaks(client, 0, data->id); | 410 | ret = ltc2978_clear_peaks(data, client, 0); |
408 | break; | 411 | break; |
409 | case PMBUS_VIRT_RESET_IOUT_HISTORY: | 412 | case PMBUS_VIRT_RESET_IOUT_HISTORY: |
410 | data->iout_max[page] = 0x7c00; | 413 | data->iout_max[page] = 0x7c00; |
411 | data->iout_min[page] = 0xfbff; | 414 | data->iout_min[page] = 0xfbff; |
412 | ret = ltc2978_clear_peaks(client, page, data->id); | 415 | ret = ltc2978_clear_peaks(data, client, page); |
413 | break; | 416 | break; |
414 | case PMBUS_VIRT_RESET_TEMP2_HISTORY: | 417 | case PMBUS_VIRT_RESET_TEMP2_HISTORY: |
415 | data->temp2_max = 0x7c00; | 418 | data->temp2_max = 0x7c00; |
416 | ret = ltc2978_clear_peaks(client, page, data->id); | 419 | ret = ltc2978_clear_peaks(data, client, page); |
417 | break; | 420 | break; |
418 | case PMBUS_VIRT_RESET_VOUT_HISTORY: | 421 | case PMBUS_VIRT_RESET_VOUT_HISTORY: |
419 | data->vout_min[page] = 0xffff; | 422 | data->vout_min[page] = 0xffff; |
420 | data->vout_max[page] = 0; | 423 | data->vout_max[page] = 0; |
421 | ret = ltc2978_clear_peaks(client, page, data->id); | 424 | ret = ltc2978_clear_peaks(data, client, page); |
422 | break; | 425 | break; |
423 | case PMBUS_VIRT_RESET_VIN_HISTORY: | 426 | case PMBUS_VIRT_RESET_VIN_HISTORY: |
424 | data->vin_min = 0x7bff; | 427 | data->vin_min = 0x7bff; |
425 | data->vin_max = 0x7c00; | 428 | data->vin_max = 0x7c00; |
426 | ret = ltc2978_clear_peaks(client, page, data->id); | 429 | ret = ltc2978_clear_peaks(data, client, page); |
427 | break; | 430 | break; |
428 | case PMBUS_VIRT_RESET_TEMP_HISTORY: | 431 | case PMBUS_VIRT_RESET_TEMP_HISTORY: |
429 | data->temp_min[page] = 0x7bff; | 432 | data->temp_min[page] = 0x7bff; |
430 | data->temp_max[page] = 0x7c00; | 433 | data->temp_max[page] = 0x7c00; |
431 | ret = ltc2978_clear_peaks(client, page, data->id); | 434 | ret = ltc2978_clear_peaks(data, client, page); |
432 | break; | 435 | break; |
433 | default: | 436 | default: |
434 | ret = -ENODATA; | 437 | ret = -ENODATA; |
@@ -603,6 +606,7 @@ static int ltc2978_probe(struct i2c_client *client, | |||
603 | case ltc3880: | 606 | case ltc3880: |
604 | case ltc3887: | 607 | case ltc3887: |
605 | case ltm4676: | 608 | case ltm4676: |
609 | data->features |= FEAT_CLEAR_PEAKS; | ||
606 | info->read_word_data = ltc3880_read_word_data; | 610 | info->read_word_data = ltc3880_read_word_data; |
607 | info->pages = LTC3880_NUM_PAGES; | 611 | info->pages = LTC3880_NUM_PAGES; |
608 | info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN | 612 | info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN |
@@ -617,6 +621,7 @@ static int ltc2978_probe(struct i2c_client *client, | |||
617 | | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP; | 621 | | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP; |
618 | break; | 622 | break; |
619 | case ltc3882: | 623 | case ltc3882: |
624 | data->features |= FEAT_CLEAR_PEAKS; | ||
620 | info->read_word_data = ltc3880_read_word_data; | 625 | info->read_word_data = ltc3880_read_word_data; |
621 | info->pages = LTC3880_NUM_PAGES; | 626 | info->pages = LTC3880_NUM_PAGES; |
622 | info->func[0] = PMBUS_HAVE_VIN | 627 | info->func[0] = PMBUS_HAVE_VIN |
@@ -631,6 +636,7 @@ static int ltc2978_probe(struct i2c_client *client, | |||
631 | | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP; | 636 | | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP; |
632 | break; | 637 | break; |
633 | case ltc3883: | 638 | case ltc3883: |
639 | data->features |= FEAT_CLEAR_PEAKS; | ||
634 | info->read_word_data = ltc3883_read_word_data; | 640 | info->read_word_data = ltc3883_read_word_data; |
635 | info->pages = LTC3883_NUM_PAGES; | 641 | info->pages = LTC3883_NUM_PAGES; |
636 | info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN | 642 | info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN |