diff options
-rw-r--r-- | drivers/hwmon/gl520sm.c | 104 |
1 files changed, 40 insertions, 64 deletions
diff --git a/drivers/hwmon/gl520sm.c b/drivers/hwmon/gl520sm.c index 4fdfe820294b..7c3b73a1623d 100644 --- a/drivers/hwmon/gl520sm.c +++ b/drivers/hwmon/gl520sm.c | |||
@@ -56,37 +56,14 @@ That's why _TEMP2 and _IN4 access the same register | |||
56 | 56 | ||
57 | #define GL520_REG_VID_INPUT 0x02 | 57 | #define GL520_REG_VID_INPUT 0x02 |
58 | 58 | ||
59 | #define GL520_REG_IN0_INPUT 0x15 | 59 | static const u8 GL520_REG_IN_INPUT[] = { 0x15, 0x14, 0x13, 0x0d, 0x0e }; |
60 | #define GL520_REG_IN0_LIMIT 0x0c | 60 | static const u8 GL520_REG_IN_LIMIT[] = { 0x0c, 0x09, 0x0a, 0x0b }; |
61 | #define GL520_REG_IN0_MIN GL520_REG_IN0_LIMIT | 61 | static const u8 GL520_REG_IN_MIN[] = { 0x0c, 0x09, 0x0a, 0x0b, 0x18 }; |
62 | #define GL520_REG_IN0_MAX GL520_REG_IN0_LIMIT | 62 | static const u8 GL520_REG_IN_MAX[] = { 0x0c, 0x09, 0x0a, 0x0b, 0x17 }; |
63 | 63 | ||
64 | #define GL520_REG_IN1_INPUT 0x14 | 64 | static const u8 GL520_REG_TEMP_INPUT[] = { 0x04, 0x0e }; |
65 | #define GL520_REG_IN1_LIMIT 0x09 | 65 | static const u8 GL520_REG_TEMP_MAX[] = { 0x05, 0x17 }; |
66 | #define GL520_REG_IN1_MIN GL520_REG_IN1_LIMIT | 66 | static const u8 GL520_REG_TEMP_MAX_HYST[] = { 0x06, 0x18 }; |
67 | #define GL520_REG_IN1_MAX GL520_REG_IN1_LIMIT | ||
68 | |||
69 | #define GL520_REG_IN2_INPUT 0x13 | ||
70 | #define GL520_REG_IN2_LIMIT 0x0a | ||
71 | #define GL520_REG_IN2_MIN GL520_REG_IN2_LIMIT | ||
72 | #define GL520_REG_IN2_MAX GL520_REG_IN2_LIMIT | ||
73 | |||
74 | #define GL520_REG_IN3_INPUT 0x0d | ||
75 | #define GL520_REG_IN3_LIMIT 0x0b | ||
76 | #define GL520_REG_IN3_MIN GL520_REG_IN3_LIMIT | ||
77 | #define GL520_REG_IN3_MAX GL520_REG_IN3_LIMIT | ||
78 | |||
79 | #define GL520_REG_IN4_INPUT 0x0e | ||
80 | #define GL520_REG_IN4_MAX 0x17 | ||
81 | #define GL520_REG_IN4_MIN 0x18 | ||
82 | |||
83 | #define GL520_REG_TEMP1_INPUT 0x04 | ||
84 | #define GL520_REG_TEMP1_MAX 0x05 | ||
85 | #define GL520_REG_TEMP1_MAX_HYST 0x06 | ||
86 | |||
87 | #define GL520_REG_TEMP2_INPUT 0x0e | ||
88 | #define GL520_REG_TEMP2_MAX 0x17 | ||
89 | #define GL520_REG_TEMP2_MAX_HYST 0x18 | ||
90 | 67 | ||
91 | #define GL520_REG_FAN_INPUT 0x07 | 68 | #define GL520_REG_FAN_INPUT 0x07 |
92 | #define GL520_REG_FAN_MIN 0x08 | 69 | #define GL520_REG_FAN_MIN 0x08 |
@@ -191,9 +168,9 @@ static DEVICE_ATTR(type##item, S_IRUGO, get_##type##0##item, NULL); | |||
191 | sysfs_ro_n(cpu, n, _vid, GL520_REG_VID_INPUT) | 168 | sysfs_ro_n(cpu, n, _vid, GL520_REG_VID_INPUT) |
192 | 169 | ||
193 | #define sysfs_in(n) \ | 170 | #define sysfs_in(n) \ |
194 | sysfs_ro_n(in, n, _input, GL520_REG_IN##n##INPUT) \ | 171 | sysfs_ro_n(in, n, _input, GL520_REG_IN_INPUT[n]) \ |
195 | sysfs_rw_n(in, n, _min, GL520_REG_IN##n##_MIN) \ | 172 | sysfs_rw_n(in, n, _min, GL520_REG_IN_MIN[n]) \ |
196 | sysfs_rw_n(in, n, _max, GL520_REG_IN##n##_MAX) | 173 | sysfs_rw_n(in, n, _max, GL520_REG_IN_MAX[n]) |
197 | 174 | ||
198 | #define sysfs_fan(n) \ | 175 | #define sysfs_fan(n) \ |
199 | sysfs_ro_n(fan, n, _input, GL520_REG_FAN_INPUT) \ | 176 | sysfs_ro_n(fan, n, _input, GL520_REG_FAN_INPUT) \ |
@@ -204,9 +181,9 @@ sysfs_rw_n(fan, n, _div, GL520_REG_FAN_DIV) | |||
204 | sysfs_rw_n(fan, n, _off, GL520_REG_FAN_OFF) | 181 | sysfs_rw_n(fan, n, _off, GL520_REG_FAN_OFF) |
205 | 182 | ||
206 | #define sysfs_temp(n) \ | 183 | #define sysfs_temp(n) \ |
207 | sysfs_ro_n(temp, n, _input, GL520_REG_TEMP##n##_INPUT) \ | 184 | sysfs_ro_n(temp, n, _input, GL520_REG_TEMP_INPUT[(n) - 1]) \ |
208 | sysfs_rw_n(temp, n, _max, GL520_REG_TEMP##n##_MAX) \ | 185 | sysfs_rw_n(temp, n, _max, GL520_REG_TEMP_MAX[(n) - 1]) \ |
209 | sysfs_rw_n(temp, n, _max_hyst, GL520_REG_TEMP##n##_MAX_HYST) | 186 | sysfs_rw_n(temp, n, _max_hyst, GL520_REG_TEMP_MAX_HYST[(n) - 1]) |
210 | 187 | ||
211 | #define sysfs_alarms() \ | 188 | #define sysfs_alarms() \ |
212 | sysfs_ro(alarms, , GL520_REG_ALARMS) \ | 189 | sysfs_ro(alarms, , GL520_REG_ALARMS) \ |
@@ -717,7 +694,7 @@ static struct gl520_data *gl520_update_device(struct device *dev) | |||
717 | { | 694 | { |
718 | struct i2c_client *client = to_i2c_client(dev); | 695 | struct i2c_client *client = to_i2c_client(dev); |
719 | struct gl520_data *data = i2c_get_clientdata(client); | 696 | struct gl520_data *data = i2c_get_clientdata(client); |
720 | int val; | 697 | int val, i; |
721 | 698 | ||
722 | mutex_lock(&data->update_lock); | 699 | mutex_lock(&data->update_lock); |
723 | 700 | ||
@@ -729,18 +706,13 @@ static struct gl520_data *gl520_update_device(struct device *dev) | |||
729 | data->beep_mask = gl520_read_value(client, GL520_REG_BEEP_MASK); | 706 | data->beep_mask = gl520_read_value(client, GL520_REG_BEEP_MASK); |
730 | data->vid = gl520_read_value(client, GL520_REG_VID_INPUT) & 0x1f; | 707 | data->vid = gl520_read_value(client, GL520_REG_VID_INPUT) & 0x1f; |
731 | 708 | ||
732 | val = gl520_read_value(client, GL520_REG_IN0_LIMIT); | 709 | for (i = 0; i < 4; i++) { |
733 | data->in_min[0] = val & 0xff; | 710 | data->in_input[i] = gl520_read_value(client, |
734 | data->in_max[0] = (val >> 8) & 0xff; | 711 | GL520_REG_IN_INPUT[i]); |
735 | val = gl520_read_value(client, GL520_REG_IN1_LIMIT); | 712 | val = gl520_read_value(client, GL520_REG_IN_LIMIT[i]); |
736 | data->in_min[1] = val & 0xff; | 713 | data->in_min[i] = val & 0xff; |
737 | data->in_max[1] = (val >> 8) & 0xff; | 714 | data->in_max[i] = (val >> 8) & 0xff; |
738 | val = gl520_read_value(client, GL520_REG_IN2_LIMIT); | 715 | } |
739 | data->in_min[2] = val & 0xff; | ||
740 | data->in_max[2] = (val >> 8) & 0xff; | ||
741 | val = gl520_read_value(client, GL520_REG_IN3_LIMIT); | ||
742 | data->in_min[3] = val & 0xff; | ||
743 | data->in_max[3] = (val >> 8) & 0xff; | ||
744 | 716 | ||
745 | val = gl520_read_value(client, GL520_REG_FAN_INPUT); | 717 | val = gl520_read_value(client, GL520_REG_FAN_INPUT); |
746 | data->fan_input[0] = (val >> 8) & 0xff; | 718 | data->fan_input[0] = (val >> 8) & 0xff; |
@@ -750,9 +722,12 @@ static struct gl520_data *gl520_update_device(struct device *dev) | |||
750 | data->fan_min[0] = (val >> 8) & 0xff; | 722 | data->fan_min[0] = (val >> 8) & 0xff; |
751 | data->fan_min[1] = val & 0xff; | 723 | data->fan_min[1] = val & 0xff; |
752 | 724 | ||
753 | data->temp_input[0] = gl520_read_value(client, GL520_REG_TEMP1_INPUT); | 725 | data->temp_input[0] = gl520_read_value(client, |
754 | data->temp_max[0] = gl520_read_value(client, GL520_REG_TEMP1_MAX); | 726 | GL520_REG_TEMP_INPUT[0]); |
755 | data->temp_max_hyst[0] = gl520_read_value(client, GL520_REG_TEMP1_MAX_HYST); | 727 | data->temp_max[0] = gl520_read_value(client, |
728 | GL520_REG_TEMP_MAX[0]); | ||
729 | data->temp_max_hyst[0] = gl520_read_value(client, | ||
730 | GL520_REG_TEMP_MAX_HYST[0]); | ||
756 | 731 | ||
757 | val = gl520_read_value(client, GL520_REG_FAN_DIV); | 732 | val = gl520_read_value(client, GL520_REG_FAN_DIV); |
758 | data->fan_div[0] = (val >> 6) & 0x03; | 733 | data->fan_div[0] = (val >> 6) & 0x03; |
@@ -764,20 +739,21 @@ static struct gl520_data *gl520_update_device(struct device *dev) | |||
764 | val = gl520_read_value(client, GL520_REG_CONF); | 739 | val = gl520_read_value(client, GL520_REG_CONF); |
765 | data->beep_enable = !((val >> 2) & 1); | 740 | data->beep_enable = !((val >> 2) & 1); |
766 | 741 | ||
767 | data->in_input[0] = gl520_read_value(client, GL520_REG_IN0_INPUT); | ||
768 | data->in_input[1] = gl520_read_value(client, GL520_REG_IN1_INPUT); | ||
769 | data->in_input[2] = gl520_read_value(client, GL520_REG_IN2_INPUT); | ||
770 | data->in_input[3] = gl520_read_value(client, GL520_REG_IN3_INPUT); | ||
771 | |||
772 | /* Temp1 and Vin4 are the same input */ | 742 | /* Temp1 and Vin4 are the same input */ |
773 | if (data->two_temps) { | 743 | if (data->two_temps) { |
774 | data->temp_input[1] = gl520_read_value(client, GL520_REG_TEMP2_INPUT); | 744 | data->temp_input[1] = gl520_read_value(client, |
775 | data->temp_max[1] = gl520_read_value(client, GL520_REG_TEMP2_MAX); | 745 | GL520_REG_TEMP_INPUT[1]); |
776 | data->temp_max_hyst[1] = gl520_read_value(client, GL520_REG_TEMP2_MAX_HYST); | 746 | data->temp_max[1] = gl520_read_value(client, |
747 | GL520_REG_TEMP_MAX[1]); | ||
748 | data->temp_max_hyst[1] = gl520_read_value(client, | ||
749 | GL520_REG_TEMP_MAX_HYST[1]); | ||
777 | } else { | 750 | } else { |
778 | data->in_input[4] = gl520_read_value(client, GL520_REG_IN4_INPUT); | 751 | data->in_input[4] = gl520_read_value(client, |
779 | data->in_min[4] = gl520_read_value(client, GL520_REG_IN4_MIN); | 752 | GL520_REG_IN_INPUT[4]); |
780 | data->in_max[4] = gl520_read_value(client, GL520_REG_IN4_MAX); | 753 | data->in_min[4] = gl520_read_value(client, |
754 | GL520_REG_IN_MIN[4]); | ||
755 | data->in_max[4] = gl520_read_value(client, | ||
756 | GL520_REG_IN_MAX[4]); | ||
781 | } | 757 | } |
782 | 758 | ||
783 | data->last_updated = jiffies; | 759 | data->last_updated = jiffies; |