diff options
Diffstat (limited to 'drivers/hwmon/adm1025.c')
-rw-r--r-- | drivers/hwmon/adm1025.c | 291 |
1 files changed, 154 insertions, 137 deletions
diff --git a/drivers/hwmon/adm1025.c b/drivers/hwmon/adm1025.c index 041ecb0bdf48..f0d833eb1f47 100644 --- a/drivers/hwmon/adm1025.c +++ b/drivers/hwmon/adm1025.c | |||
@@ -51,6 +51,7 @@ | |||
51 | #include <linux/jiffies.h> | 51 | #include <linux/jiffies.h> |
52 | #include <linux/i2c.h> | 52 | #include <linux/i2c.h> |
53 | #include <linux/hwmon.h> | 53 | #include <linux/hwmon.h> |
54 | #include <linux/hwmon-sysfs.h> | ||
54 | #include <linux/hwmon-vid.h> | 55 | #include <linux/hwmon-vid.h> |
55 | #include <linux/err.h> | 56 | #include <linux/err.h> |
56 | #include <linux/mutex.h> | 57 | #include <linux/mutex.h> |
@@ -153,86 +154,96 @@ struct adm1025_data { | |||
153 | * Sysfs stuff | 154 | * Sysfs stuff |
154 | */ | 155 | */ |
155 | 156 | ||
156 | #define show_in(offset) \ | 157 | static ssize_t |
157 | static ssize_t show_in##offset(struct device *dev, struct device_attribute *attr, char *buf) \ | 158 | show_in(struct device *dev, struct device_attribute *attr, char *buf) |
158 | { \ | 159 | { |
159 | struct adm1025_data *data = adm1025_update_device(dev); \ | 160 | int index = to_sensor_dev_attr(attr)->index; |
160 | return sprintf(buf, "%u\n", IN_FROM_REG(data->in[offset], \ | 161 | struct adm1025_data *data = adm1025_update_device(dev); |
161 | in_scale[offset])); \ | 162 | return sprintf(buf, "%u\n", IN_FROM_REG(data->in[index], |
162 | } \ | 163 | in_scale[index])); |
163 | static ssize_t show_in##offset##_min(struct device *dev, struct device_attribute *attr, char *buf) \ | 164 | } |
164 | { \ | 165 | |
165 | struct adm1025_data *data = adm1025_update_device(dev); \ | 166 | static ssize_t |
166 | return sprintf(buf, "%u\n", IN_FROM_REG(data->in_min[offset], \ | 167 | show_in_min(struct device *dev, struct device_attribute *attr, char *buf) |
167 | in_scale[offset])); \ | 168 | { |
168 | } \ | 169 | int index = to_sensor_dev_attr(attr)->index; |
169 | static ssize_t show_in##offset##_max(struct device *dev, struct device_attribute *attr, char *buf) \ | 170 | struct adm1025_data *data = adm1025_update_device(dev); |
170 | { \ | 171 | return sprintf(buf, "%u\n", IN_FROM_REG(data->in_min[index], |
171 | struct adm1025_data *data = adm1025_update_device(dev); \ | 172 | in_scale[index])); |
172 | return sprintf(buf, "%u\n", IN_FROM_REG(data->in_max[offset], \ | 173 | } |
173 | in_scale[offset])); \ | 174 | |
174 | } \ | 175 | static ssize_t |
175 | static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_in##offset, NULL); | 176 | show_in_max(struct device *dev, struct device_attribute *attr, char *buf) |
176 | show_in(0); | 177 | { |
177 | show_in(1); | 178 | int index = to_sensor_dev_attr(attr)->index; |
178 | show_in(2); | 179 | struct adm1025_data *data = adm1025_update_device(dev); |
179 | show_in(3); | 180 | return sprintf(buf, "%u\n", IN_FROM_REG(data->in_max[index], |
180 | show_in(4); | 181 | in_scale[index])); |
181 | show_in(5); | 182 | } |
182 | 183 | ||
183 | #define show_temp(offset) \ | 184 | static ssize_t |
184 | static ssize_t show_temp##offset(struct device *dev, struct device_attribute *attr, char *buf) \ | 185 | show_temp(struct device *dev, struct device_attribute *attr, char *buf) |
185 | { \ | 186 | { |
186 | struct adm1025_data *data = adm1025_update_device(dev); \ | 187 | int index = to_sensor_dev_attr(attr)->index; |
187 | return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[offset-1])); \ | 188 | struct adm1025_data *data = adm1025_update_device(dev); |
188 | } \ | 189 | return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[index])); |
189 | static ssize_t show_temp##offset##_min(struct device *dev, struct device_attribute *attr, char *buf) \ | 190 | } |
190 | { \ | 191 | |
191 | struct adm1025_data *data = adm1025_update_device(dev); \ | 192 | static ssize_t |
192 | return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_min[offset-1])); \ | 193 | show_temp_min(struct device *dev, struct device_attribute *attr, char *buf) |
193 | } \ | 194 | { |
194 | static ssize_t show_temp##offset##_max(struct device *dev, struct device_attribute *attr, char *buf) \ | 195 | int index = to_sensor_dev_attr(attr)->index; |
195 | { \ | 196 | struct adm1025_data *data = adm1025_update_device(dev); |
196 | struct adm1025_data *data = adm1025_update_device(dev); \ | 197 | return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_min[index])); |
197 | return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max[offset-1])); \ | 198 | } |
198 | }\ | 199 | |
199 | static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_temp##offset, NULL); | 200 | static ssize_t |
200 | show_temp(1); | 201 | show_temp_max(struct device *dev, struct device_attribute *attr, char *buf) |
201 | show_temp(2); | 202 | { |
203 | int index = to_sensor_dev_attr(attr)->index; | ||
204 | struct adm1025_data *data = adm1025_update_device(dev); | ||
205 | return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max[index])); | ||
206 | } | ||
207 | |||
208 | static ssize_t set_in_min(struct device *dev, struct device_attribute *attr, | ||
209 | const char *buf, size_t count) | ||
210 | { | ||
211 | int index = to_sensor_dev_attr(attr)->index; | ||
212 | struct i2c_client *client = to_i2c_client(dev); | ||
213 | struct adm1025_data *data = i2c_get_clientdata(client); | ||
214 | long val = simple_strtol(buf, NULL, 10); | ||
215 | |||
216 | mutex_lock(&data->update_lock); | ||
217 | data->in_min[index] = IN_TO_REG(val, in_scale[index]); | ||
218 | i2c_smbus_write_byte_data(client, ADM1025_REG_IN_MIN(index), | ||
219 | data->in_min[index]); | ||
220 | mutex_unlock(&data->update_lock); | ||
221 | return count; | ||
222 | } | ||
223 | |||
224 | static ssize_t set_in_max(struct device *dev, struct device_attribute *attr, | ||
225 | const char *buf, size_t count) | ||
226 | { | ||
227 | int index = to_sensor_dev_attr(attr)->index; | ||
228 | struct i2c_client *client = to_i2c_client(dev); | ||
229 | struct adm1025_data *data = i2c_get_clientdata(client); | ||
230 | long val = simple_strtol(buf, NULL, 10); | ||
231 | |||
232 | mutex_lock(&data->update_lock); | ||
233 | data->in_max[index] = IN_TO_REG(val, in_scale[index]); | ||
234 | i2c_smbus_write_byte_data(client, ADM1025_REG_IN_MAX(index), | ||
235 | data->in_max[index]); | ||
236 | mutex_unlock(&data->update_lock); | ||
237 | return count; | ||
238 | } | ||
202 | 239 | ||
203 | #define set_in(offset) \ | 240 | #define set_in(offset) \ |
204 | static ssize_t set_in##offset##_min(struct device *dev, struct device_attribute *attr, const char *buf, \ | 241 | static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, \ |
205 | size_t count) \ | 242 | show_in, NULL, offset); \ |
206 | { \ | 243 | static SENSOR_DEVICE_ATTR(in##offset##_min, S_IWUSR | S_IRUGO, \ |
207 | struct i2c_client *client = to_i2c_client(dev); \ | 244 | show_in_min, set_in_min, offset); \ |
208 | struct adm1025_data *data = i2c_get_clientdata(client); \ | 245 | static SENSOR_DEVICE_ATTR(in##offset##_max, S_IWUSR | S_IRUGO, \ |
209 | long val = simple_strtol(buf, NULL, 10); \ | 246 | show_in_max, set_in_max, offset) |
210 | \ | ||
211 | mutex_lock(&data->update_lock); \ | ||
212 | data->in_min[offset] = IN_TO_REG(val, in_scale[offset]); \ | ||
213 | i2c_smbus_write_byte_data(client, ADM1025_REG_IN_MIN(offset), \ | ||
214 | data->in_min[offset]); \ | ||
215 | mutex_unlock(&data->update_lock); \ | ||
216 | return count; \ | ||
217 | } \ | ||
218 | static ssize_t set_in##offset##_max(struct device *dev, struct device_attribute *attr, const char *buf, \ | ||
219 | size_t count) \ | ||
220 | { \ | ||
221 | struct i2c_client *client = to_i2c_client(dev); \ | ||
222 | struct adm1025_data *data = i2c_get_clientdata(client); \ | ||
223 | long val = simple_strtol(buf, NULL, 10); \ | ||
224 | \ | ||
225 | mutex_lock(&data->update_lock); \ | ||
226 | data->in_max[offset] = IN_TO_REG(val, in_scale[offset]); \ | ||
227 | i2c_smbus_write_byte_data(client, ADM1025_REG_IN_MAX(offset), \ | ||
228 | data->in_max[offset]); \ | ||
229 | mutex_unlock(&data->update_lock); \ | ||
230 | return count; \ | ||
231 | } \ | ||
232 | static DEVICE_ATTR(in##offset##_min, S_IWUSR | S_IRUGO, \ | ||
233 | show_in##offset##_min, set_in##offset##_min); \ | ||
234 | static DEVICE_ATTR(in##offset##_max, S_IWUSR | S_IRUGO, \ | ||
235 | show_in##offset##_max, set_in##offset##_max); | ||
236 | set_in(0); | 247 | set_in(0); |
237 | set_in(1); | 248 | set_in(1); |
238 | set_in(2); | 249 | set_in(2); |
@@ -240,39 +251,45 @@ set_in(3); | |||
240 | set_in(4); | 251 | set_in(4); |
241 | set_in(5); | 252 | set_in(5); |
242 | 253 | ||
254 | static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr, | ||
255 | const char *buf, size_t count) | ||
256 | { | ||
257 | int index = to_sensor_dev_attr(attr)->index; | ||
258 | struct i2c_client *client = to_i2c_client(dev); | ||
259 | struct adm1025_data *data = i2c_get_clientdata(client); | ||
260 | long val = simple_strtol(buf, NULL, 10); | ||
261 | |||
262 | mutex_lock(&data->update_lock); | ||
263 | data->temp_min[index] = TEMP_TO_REG(val); | ||
264 | i2c_smbus_write_byte_data(client, ADM1025_REG_TEMP_LOW(index), | ||
265 | data->temp_min[index]); | ||
266 | mutex_unlock(&data->update_lock); | ||
267 | return count; | ||
268 | } | ||
269 | |||
270 | static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr, | ||
271 | const char *buf, size_t count) | ||
272 | { | ||
273 | int index = to_sensor_dev_attr(attr)->index; | ||
274 | struct i2c_client *client = to_i2c_client(dev); | ||
275 | struct adm1025_data *data = i2c_get_clientdata(client); | ||
276 | long val = simple_strtol(buf, NULL, 10); | ||
277 | |||
278 | mutex_lock(&data->update_lock); | ||
279 | data->temp_max[index] = TEMP_TO_REG(val); | ||
280 | i2c_smbus_write_byte_data(client, ADM1025_REG_TEMP_HIGH(index), | ||
281 | data->temp_max[index]); | ||
282 | mutex_unlock(&data->update_lock); | ||
283 | return count; | ||
284 | } | ||
285 | |||
243 | #define set_temp(offset) \ | 286 | #define set_temp(offset) \ |
244 | static ssize_t set_temp##offset##_min(struct device *dev, struct device_attribute *attr, const char *buf, \ | 287 | static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, \ |
245 | size_t count) \ | 288 | show_temp, NULL, offset - 1); \ |
246 | { \ | 289 | static SENSOR_DEVICE_ATTR(temp##offset##_min, S_IWUSR | S_IRUGO, \ |
247 | struct i2c_client *client = to_i2c_client(dev); \ | 290 | show_temp_min, set_temp_min, offset - 1); \ |
248 | struct adm1025_data *data = i2c_get_clientdata(client); \ | 291 | static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IWUSR | S_IRUGO, \ |
249 | long val = simple_strtol(buf, NULL, 10); \ | 292 | show_temp_max, set_temp_max, offset - 1) |
250 | \ | ||
251 | mutex_lock(&data->update_lock); \ | ||
252 | data->temp_min[offset-1] = TEMP_TO_REG(val); \ | ||
253 | i2c_smbus_write_byte_data(client, ADM1025_REG_TEMP_LOW(offset-1), \ | ||
254 | data->temp_min[offset-1]); \ | ||
255 | mutex_unlock(&data->update_lock); \ | ||
256 | return count; \ | ||
257 | } \ | ||
258 | static ssize_t set_temp##offset##_max(struct device *dev, struct device_attribute *attr, const char *buf, \ | ||
259 | size_t count) \ | ||
260 | { \ | ||
261 | struct i2c_client *client = to_i2c_client(dev); \ | ||
262 | struct adm1025_data *data = i2c_get_clientdata(client); \ | ||
263 | long val = simple_strtol(buf, NULL, 10); \ | ||
264 | \ | ||
265 | mutex_lock(&data->update_lock); \ | ||
266 | data->temp_max[offset-1] = TEMP_TO_REG(val); \ | ||
267 | i2c_smbus_write_byte_data(client, ADM1025_REG_TEMP_HIGH(offset-1), \ | ||
268 | data->temp_max[offset-1]); \ | ||
269 | mutex_unlock(&data->update_lock); \ | ||
270 | return count; \ | ||
271 | } \ | ||
272 | static DEVICE_ATTR(temp##offset##_min, S_IWUSR | S_IRUGO, \ | ||
273 | show_temp##offset##_min, set_temp##offset##_min); \ | ||
274 | static DEVICE_ATTR(temp##offset##_max, S_IWUSR | S_IRUGO, \ | ||
275 | show_temp##offset##_max, set_temp##offset##_max); | ||
276 | set_temp(1); | 293 | set_temp(1); |
277 | set_temp(2); | 294 | set_temp(2); |
278 | 295 | ||
@@ -316,27 +333,27 @@ static int adm1025_attach_adapter(struct i2c_adapter *adapter) | |||
316 | } | 333 | } |
317 | 334 | ||
318 | static struct attribute *adm1025_attributes[] = { | 335 | static struct attribute *adm1025_attributes[] = { |
319 | &dev_attr_in0_input.attr, | 336 | &sensor_dev_attr_in0_input.dev_attr.attr, |
320 | &dev_attr_in1_input.attr, | 337 | &sensor_dev_attr_in1_input.dev_attr.attr, |
321 | &dev_attr_in2_input.attr, | 338 | &sensor_dev_attr_in2_input.dev_attr.attr, |
322 | &dev_attr_in3_input.attr, | 339 | &sensor_dev_attr_in3_input.dev_attr.attr, |
323 | &dev_attr_in5_input.attr, | 340 | &sensor_dev_attr_in5_input.dev_attr.attr, |
324 | &dev_attr_in0_min.attr, | 341 | &sensor_dev_attr_in0_min.dev_attr.attr, |
325 | &dev_attr_in1_min.attr, | 342 | &sensor_dev_attr_in1_min.dev_attr.attr, |
326 | &dev_attr_in2_min.attr, | 343 | &sensor_dev_attr_in2_min.dev_attr.attr, |
327 | &dev_attr_in3_min.attr, | 344 | &sensor_dev_attr_in3_min.dev_attr.attr, |
328 | &dev_attr_in5_min.attr, | 345 | &sensor_dev_attr_in5_min.dev_attr.attr, |
329 | &dev_attr_in0_max.attr, | 346 | &sensor_dev_attr_in0_max.dev_attr.attr, |
330 | &dev_attr_in1_max.attr, | 347 | &sensor_dev_attr_in1_max.dev_attr.attr, |
331 | &dev_attr_in2_max.attr, | 348 | &sensor_dev_attr_in2_max.dev_attr.attr, |
332 | &dev_attr_in3_max.attr, | 349 | &sensor_dev_attr_in3_max.dev_attr.attr, |
333 | &dev_attr_in5_max.attr, | 350 | &sensor_dev_attr_in5_max.dev_attr.attr, |
334 | &dev_attr_temp1_input.attr, | 351 | &sensor_dev_attr_temp1_input.dev_attr.attr, |
335 | &dev_attr_temp2_input.attr, | 352 | &sensor_dev_attr_temp2_input.dev_attr.attr, |
336 | &dev_attr_temp1_min.attr, | 353 | &sensor_dev_attr_temp1_min.dev_attr.attr, |
337 | &dev_attr_temp2_min.attr, | 354 | &sensor_dev_attr_temp2_min.dev_attr.attr, |
338 | &dev_attr_temp1_max.attr, | 355 | &sensor_dev_attr_temp1_max.dev_attr.attr, |
339 | &dev_attr_temp2_max.attr, | 356 | &sensor_dev_attr_temp2_max.dev_attr.attr, |
340 | &dev_attr_alarms.attr, | 357 | &dev_attr_alarms.attr, |
341 | &dev_attr_cpu0_vid.attr, | 358 | &dev_attr_cpu0_vid.attr, |
342 | &dev_attr_vrm.attr, | 359 | &dev_attr_vrm.attr, |
@@ -348,9 +365,9 @@ static const struct attribute_group adm1025_group = { | |||
348 | }; | 365 | }; |
349 | 366 | ||
350 | static struct attribute *adm1025_attributes_opt[] = { | 367 | static struct attribute *adm1025_attributes_opt[] = { |
351 | &dev_attr_in4_input.attr, | 368 | &sensor_dev_attr_in4_input.dev_attr.attr, |
352 | &dev_attr_in4_min.attr, | 369 | &sensor_dev_attr_in4_min.dev_attr.attr, |
353 | &dev_attr_in4_max.attr, | 370 | &sensor_dev_attr_in4_max.dev_attr.attr, |
354 | NULL | 371 | NULL |
355 | }; | 372 | }; |
356 | 373 | ||
@@ -464,11 +481,11 @@ static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind) | |||
464 | /* Pin 11 is either in4 (+12V) or VID4 */ | 481 | /* Pin 11 is either in4 (+12V) or VID4 */ |
465 | if (!(config & 0x20)) { | 482 | if (!(config & 0x20)) { |
466 | if ((err = device_create_file(&new_client->dev, | 483 | if ((err = device_create_file(&new_client->dev, |
467 | &dev_attr_in4_input)) | 484 | &sensor_dev_attr_in4_input.dev_attr)) |
468 | || (err = device_create_file(&new_client->dev, | 485 | || (err = device_create_file(&new_client->dev, |
469 | &dev_attr_in4_min)) | 486 | &sensor_dev_attr_in4_min.dev_attr)) |
470 | || (err = device_create_file(&new_client->dev, | 487 | || (err = device_create_file(&new_client->dev, |
471 | &dev_attr_in4_max))) | 488 | &sensor_dev_attr_in4_max.dev_attr))) |
472 | goto exit_remove; | 489 | goto exit_remove; |
473 | } | 490 | } |
474 | 491 | ||