diff options
-rw-r--r-- | drivers/hwmon/i5k_amb.c | 65 |
1 files changed, 43 insertions, 22 deletions
diff --git a/drivers/hwmon/i5k_amb.c b/drivers/hwmon/i5k_amb.c index 7fdbe810e8e2..6ac5c6f53585 100644 --- a/drivers/hwmon/i5k_amb.c +++ b/drivers/hwmon/i5k_amb.c | |||
@@ -47,16 +47,35 @@ | |||
47 | #define AMB_CONFIG_SIZE 2048 | 47 | #define AMB_CONFIG_SIZE 2048 |
48 | #define AMB_FUNC_3_OFFSET 768 | 48 | #define AMB_FUNC_3_OFFSET 768 |
49 | 49 | ||
50 | #define AMB_REG_TEMP_STATUS(amb) ((amb) * AMB_CONFIG_SIZE + \ | 50 | static unsigned long amb_reg_temp_status(unsigned int amb) |
51 | AMB_FUNC_3_OFFSET + AMB_REG_TEMP_STATUS_ADDR) | 51 | { |
52 | #define AMB_REG_TEMP_MIN(amb) ((amb) * AMB_CONFIG_SIZE + \ | 52 | return AMB_FUNC_3_OFFSET + AMB_REG_TEMP_STATUS_ADDR + |
53 | AMB_FUNC_3_OFFSET + AMB_REG_TEMP_MIN_ADDR) | 53 | AMB_CONFIG_SIZE * amb; |
54 | #define AMB_REG_TEMP_MID(amb) ((amb) * AMB_CONFIG_SIZE + \ | 54 | } |
55 | AMB_FUNC_3_OFFSET + AMB_REG_TEMP_MID_ADDR) | 55 | |
56 | #define AMB_REG_TEMP_MAX(amb) ((amb) * AMB_CONFIG_SIZE + \ | 56 | static unsigned long amb_reg_temp_min(unsigned int amb) |
57 | AMB_FUNC_3_OFFSET + AMB_REG_TEMP_MAX_ADDR) | 57 | { |
58 | #define AMB_REG_TEMP(amb) ((amb) * AMB_CONFIG_SIZE + \ | 58 | return AMB_FUNC_3_OFFSET + AMB_REG_TEMP_MIN_ADDR + |
59 | AMB_FUNC_3_OFFSET + AMB_REG_TEMP_ADDR) | 59 | AMB_CONFIG_SIZE * amb; |
60 | } | ||
61 | |||
62 | static unsigned long amb_reg_temp_mid(unsigned int amb) | ||
63 | { | ||
64 | return AMB_FUNC_3_OFFSET + AMB_REG_TEMP_MID_ADDR + | ||
65 | AMB_CONFIG_SIZE * amb; | ||
66 | } | ||
67 | |||
68 | static unsigned long amb_reg_temp_max(unsigned int amb) | ||
69 | { | ||
70 | return AMB_FUNC_3_OFFSET + AMB_REG_TEMP_MAX_ADDR + | ||
71 | AMB_CONFIG_SIZE * amb; | ||
72 | } | ||
73 | |||
74 | static unsigned long amb_reg_temp(unsigned int amb) | ||
75 | { | ||
76 | return AMB_FUNC_3_OFFSET + AMB_REG_TEMP_ADDR + | ||
77 | AMB_CONFIG_SIZE * amb; | ||
78 | } | ||
60 | 79 | ||
61 | #define MAX_MEM_CHANNELS 4 | 80 | #define MAX_MEM_CHANNELS 4 |
62 | #define MAX_AMBS_PER_CHANNEL 16 | 81 | #define MAX_AMBS_PER_CHANNEL 16 |
@@ -72,8 +91,10 @@ | |||
72 | #define REAL_MAX_AMBS_PER_CHANNEL 15 | 91 | #define REAL_MAX_AMBS_PER_CHANNEL 15 |
73 | #define KNOBS_PER_AMB 5 | 92 | #define KNOBS_PER_AMB 5 |
74 | 93 | ||
75 | #define AMB_NUM_FROM_REG(byte_num, bit_num) ((byte_num) * \ | 94 | static unsigned long amb_num_from_reg(unsigned int byte_num, unsigned int bit) |
76 | MAX_AMBS_PER_CHANNEL) + (bit_num) | 95 | { |
96 | return byte_num * MAX_AMBS_PER_CHANNEL + bit; | ||
97 | } | ||
77 | 98 | ||
78 | #define AMB_SYSFS_NAME_LEN 16 | 99 | #define AMB_SYSFS_NAME_LEN 16 |
79 | struct i5k_device_attribute { | 100 | struct i5k_device_attribute { |
@@ -121,8 +142,8 @@ static ssize_t show_amb_alarm(struct device *dev, | |||
121 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 142 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
122 | struct i5k_amb_data *data = dev_get_drvdata(dev); | 143 | struct i5k_amb_data *data = dev_get_drvdata(dev); |
123 | 144 | ||
124 | if (!(amb_read_byte(data, AMB_REG_TEMP_STATUS(attr->index)) & 0x20) && | 145 | if (!(amb_read_byte(data, amb_reg_temp_status(attr->index)) & 0x20) && |
125 | (amb_read_byte(data, AMB_REG_TEMP_STATUS(attr->index)) & 0x8)) | 146 | (amb_read_byte(data, amb_reg_temp_status(attr->index)) & 0x8)) |
126 | return sprintf(buf, "1\n"); | 147 | return sprintf(buf, "1\n"); |
127 | else | 148 | else |
128 | return sprintf(buf, "0\n"); | 149 | return sprintf(buf, "0\n"); |
@@ -140,7 +161,7 @@ static ssize_t store_amb_min(struct device *dev, | |||
140 | if (temp > 255) | 161 | if (temp > 255) |
141 | temp = 255; | 162 | temp = 255; |
142 | 163 | ||
143 | amb_write_byte(data, AMB_REG_TEMP_MIN(attr->index), temp); | 164 | amb_write_byte(data, amb_reg_temp_min(attr->index), temp); |
144 | return count; | 165 | return count; |
145 | } | 166 | } |
146 | 167 | ||
@@ -156,7 +177,7 @@ static ssize_t store_amb_mid(struct device *dev, | |||
156 | if (temp > 255) | 177 | if (temp > 255) |
157 | temp = 255; | 178 | temp = 255; |
158 | 179 | ||
159 | amb_write_byte(data, AMB_REG_TEMP_MID(attr->index), temp); | 180 | amb_write_byte(data, amb_reg_temp_mid(attr->index), temp); |
160 | return count; | 181 | return count; |
161 | } | 182 | } |
162 | 183 | ||
@@ -172,7 +193,7 @@ static ssize_t store_amb_max(struct device *dev, | |||
172 | if (temp > 255) | 193 | if (temp > 255) |
173 | temp = 255; | 194 | temp = 255; |
174 | 195 | ||
175 | amb_write_byte(data, AMB_REG_TEMP_MAX(attr->index), temp); | 196 | amb_write_byte(data, amb_reg_temp_max(attr->index), temp); |
176 | return count; | 197 | return count; |
177 | } | 198 | } |
178 | 199 | ||
@@ -183,7 +204,7 @@ static ssize_t show_amb_min(struct device *dev, | |||
183 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 204 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
184 | struct i5k_amb_data *data = dev_get_drvdata(dev); | 205 | struct i5k_amb_data *data = dev_get_drvdata(dev); |
185 | return sprintf(buf, "%d\n", | 206 | return sprintf(buf, "%d\n", |
186 | 500 * amb_read_byte(data, AMB_REG_TEMP_MIN(attr->index))); | 207 | 500 * amb_read_byte(data, amb_reg_temp_min(attr->index))); |
187 | } | 208 | } |
188 | 209 | ||
189 | static ssize_t show_amb_mid(struct device *dev, | 210 | static ssize_t show_amb_mid(struct device *dev, |
@@ -193,7 +214,7 @@ static ssize_t show_amb_mid(struct device *dev, | |||
193 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 214 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
194 | struct i5k_amb_data *data = dev_get_drvdata(dev); | 215 | struct i5k_amb_data *data = dev_get_drvdata(dev); |
195 | return sprintf(buf, "%d\n", | 216 | return sprintf(buf, "%d\n", |
196 | 500 * amb_read_byte(data, AMB_REG_TEMP_MID(attr->index))); | 217 | 500 * amb_read_byte(data, amb_reg_temp_mid(attr->index))); |
197 | } | 218 | } |
198 | 219 | ||
199 | static ssize_t show_amb_max(struct device *dev, | 220 | static ssize_t show_amb_max(struct device *dev, |
@@ -203,7 +224,7 @@ static ssize_t show_amb_max(struct device *dev, | |||
203 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 224 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
204 | struct i5k_amb_data *data = dev_get_drvdata(dev); | 225 | struct i5k_amb_data *data = dev_get_drvdata(dev); |
205 | return sprintf(buf, "%d\n", | 226 | return sprintf(buf, "%d\n", |
206 | 500 * amb_read_byte(data, AMB_REG_TEMP_MAX(attr->index))); | 227 | 500 * amb_read_byte(data, amb_reg_temp_max(attr->index))); |
207 | } | 228 | } |
208 | 229 | ||
209 | static ssize_t show_amb_temp(struct device *dev, | 230 | static ssize_t show_amb_temp(struct device *dev, |
@@ -213,7 +234,7 @@ static ssize_t show_amb_temp(struct device *dev, | |||
213 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 234 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
214 | struct i5k_amb_data *data = dev_get_drvdata(dev); | 235 | struct i5k_amb_data *data = dev_get_drvdata(dev); |
215 | return sprintf(buf, "%d\n", | 236 | return sprintf(buf, "%d\n", |
216 | 500 * amb_read_byte(data, AMB_REG_TEMP(attr->index))); | 237 | 500 * amb_read_byte(data, amb_reg_temp(attr->index))); |
217 | } | 238 | } |
218 | 239 | ||
219 | static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev) | 240 | static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev) |
@@ -241,7 +262,7 @@ static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev) | |||
241 | for (j = 0; j < REAL_MAX_AMBS_PER_CHANNEL; j++, c >>= 1) { | 262 | for (j = 0; j < REAL_MAX_AMBS_PER_CHANNEL; j++, c >>= 1) { |
242 | struct i5k_device_attribute *iattr; | 263 | struct i5k_device_attribute *iattr; |
243 | 264 | ||
244 | k = AMB_NUM_FROM_REG(i, j); | 265 | k = amb_num_from_reg(i, j); |
245 | if (!(c & 0x1)) | 266 | if (!(c & 0x1)) |
246 | continue; | 267 | continue; |
247 | d++; | 268 | d++; |