.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /* |
---|
2 | 3 | * Driver for Linear Technology LTC2945 I2C Power Monitor |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright (c) 2014 Guenter Roeck |
---|
5 | | - * |
---|
6 | | - * This program is free software; you can redistribute it and/or modify |
---|
7 | | - * it under the terms of the GNU General Public License as published by |
---|
8 | | - * the Free Software Foundation; either version 2 of the License, or |
---|
9 | | - * (at your option) any later version. |
---|
10 | | - * |
---|
11 | | - * This program is distributed in the hope that it will be useful, |
---|
12 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
13 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
14 | | - * GNU General Public License for more details. |
---|
15 | 6 | */ |
---|
16 | 7 | |
---|
17 | 8 | #include <linux/kernel.h> |
---|
.. | .. |
---|
226 | 217 | return val; |
---|
227 | 218 | } |
---|
228 | 219 | |
---|
229 | | -static ssize_t ltc2945_show_value(struct device *dev, |
---|
| 220 | +static ssize_t ltc2945_value_show(struct device *dev, |
---|
230 | 221 | struct device_attribute *da, char *buf) |
---|
231 | 222 | { |
---|
232 | 223 | struct sensor_device_attribute *attr = to_sensor_dev_attr(da); |
---|
.. | .. |
---|
238 | 229 | return snprintf(buf, PAGE_SIZE, "%lld\n", value); |
---|
239 | 230 | } |
---|
240 | 231 | |
---|
241 | | -static ssize_t ltc2945_set_value(struct device *dev, |
---|
242 | | - struct device_attribute *da, |
---|
243 | | - const char *buf, size_t count) |
---|
| 232 | +static ssize_t ltc2945_value_store(struct device *dev, |
---|
| 233 | + struct device_attribute *da, |
---|
| 234 | + const char *buf, size_t count) |
---|
244 | 235 | { |
---|
245 | 236 | struct sensor_device_attribute *attr = to_sensor_dev_attr(da); |
---|
246 | 237 | struct regmap *regmap = dev_get_drvdata(dev); |
---|
.. | .. |
---|
257 | 248 | |
---|
258 | 249 | /* convert to register value, then clamp and write result */ |
---|
259 | 250 | regval = ltc2945_val_to_reg(dev, reg, val); |
---|
| 251 | + if (regval < 0) |
---|
| 252 | + return regval; |
---|
260 | 253 | if (is_power_reg(reg)) { |
---|
261 | 254 | regval = clamp_val(regval, 0, 0xffffff); |
---|
262 | 255 | regbuf[0] = regval >> 16; |
---|
.. | .. |
---|
273 | 266 | return ret < 0 ? ret : count; |
---|
274 | 267 | } |
---|
275 | 268 | |
---|
276 | | -static ssize_t ltc2945_reset_history(struct device *dev, |
---|
| 269 | +static ssize_t ltc2945_history_store(struct device *dev, |
---|
277 | 270 | struct device_attribute *da, |
---|
278 | 271 | const char *buf, size_t count) |
---|
279 | 272 | { |
---|
.. | .. |
---|
326 | 319 | return ret ? : count; |
---|
327 | 320 | } |
---|
328 | 321 | |
---|
329 | | -static ssize_t ltc2945_show_bool(struct device *dev, |
---|
| 322 | +static ssize_t ltc2945_bool_show(struct device *dev, |
---|
330 | 323 | struct device_attribute *da, char *buf) |
---|
331 | 324 | { |
---|
332 | 325 | struct sensor_device_attribute *attr = to_sensor_dev_attr(da); |
---|
.. | .. |
---|
347 | 340 | |
---|
348 | 341 | /* Input voltages */ |
---|
349 | 342 | |
---|
350 | | -static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, ltc2945_show_value, NULL, |
---|
351 | | - LTC2945_VIN_H); |
---|
352 | | -static SENSOR_DEVICE_ATTR(in1_min, S_IRUGO | S_IWUSR, ltc2945_show_value, |
---|
353 | | - ltc2945_set_value, LTC2945_MIN_VIN_THRES_H); |
---|
354 | | -static SENSOR_DEVICE_ATTR(in1_max, S_IRUGO | S_IWUSR, ltc2945_show_value, |
---|
355 | | - ltc2945_set_value, LTC2945_MAX_VIN_THRES_H); |
---|
356 | | -static SENSOR_DEVICE_ATTR(in1_lowest, S_IRUGO, ltc2945_show_value, NULL, |
---|
357 | | - LTC2945_MIN_VIN_H); |
---|
358 | | -static SENSOR_DEVICE_ATTR(in1_highest, S_IRUGO, ltc2945_show_value, NULL, |
---|
359 | | - LTC2945_MAX_VIN_H); |
---|
360 | | -static SENSOR_DEVICE_ATTR(in1_reset_history, S_IWUSR, NULL, |
---|
361 | | - ltc2945_reset_history, LTC2945_MIN_VIN_H); |
---|
| 343 | +static SENSOR_DEVICE_ATTR_RO(in1_input, ltc2945_value, LTC2945_VIN_H); |
---|
| 344 | +static SENSOR_DEVICE_ATTR_RW(in1_min, ltc2945_value, LTC2945_MIN_VIN_THRES_H); |
---|
| 345 | +static SENSOR_DEVICE_ATTR_RW(in1_max, ltc2945_value, LTC2945_MAX_VIN_THRES_H); |
---|
| 346 | +static SENSOR_DEVICE_ATTR_RO(in1_lowest, ltc2945_value, LTC2945_MIN_VIN_H); |
---|
| 347 | +static SENSOR_DEVICE_ATTR_RO(in1_highest, ltc2945_value, LTC2945_MAX_VIN_H); |
---|
| 348 | +static SENSOR_DEVICE_ATTR_WO(in1_reset_history, ltc2945_history, |
---|
| 349 | + LTC2945_MIN_VIN_H); |
---|
362 | 350 | |
---|
363 | | -static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, ltc2945_show_value, NULL, |
---|
364 | | - LTC2945_ADIN_H); |
---|
365 | | -static SENSOR_DEVICE_ATTR(in2_min, S_IRUGO | S_IWUSR, ltc2945_show_value, |
---|
366 | | - ltc2945_set_value, LTC2945_MIN_ADIN_THRES_H); |
---|
367 | | -static SENSOR_DEVICE_ATTR(in2_max, S_IRUGO | S_IWUSR, ltc2945_show_value, |
---|
368 | | - ltc2945_set_value, LTC2945_MAX_ADIN_THRES_H); |
---|
369 | | -static SENSOR_DEVICE_ATTR(in2_lowest, S_IRUGO, ltc2945_show_value, NULL, |
---|
370 | | - LTC2945_MIN_ADIN_H); |
---|
371 | | -static SENSOR_DEVICE_ATTR(in2_highest, S_IRUGO, ltc2945_show_value, NULL, |
---|
372 | | - LTC2945_MAX_ADIN_H); |
---|
373 | | -static SENSOR_DEVICE_ATTR(in2_reset_history, S_IWUSR, NULL, |
---|
374 | | - ltc2945_reset_history, LTC2945_MIN_ADIN_H); |
---|
| 351 | +static SENSOR_DEVICE_ATTR_RO(in2_input, ltc2945_value, LTC2945_ADIN_H); |
---|
| 352 | +static SENSOR_DEVICE_ATTR_RW(in2_min, ltc2945_value, LTC2945_MIN_ADIN_THRES_H); |
---|
| 353 | +static SENSOR_DEVICE_ATTR_RW(in2_max, ltc2945_value, LTC2945_MAX_ADIN_THRES_H); |
---|
| 354 | +static SENSOR_DEVICE_ATTR_RO(in2_lowest, ltc2945_value, LTC2945_MIN_ADIN_H); |
---|
| 355 | +static SENSOR_DEVICE_ATTR_RO(in2_highest, ltc2945_value, LTC2945_MAX_ADIN_H); |
---|
| 356 | +static SENSOR_DEVICE_ATTR_WO(in2_reset_history, ltc2945_history, |
---|
| 357 | + LTC2945_MIN_ADIN_H); |
---|
375 | 358 | |
---|
376 | 359 | /* Voltage alarms */ |
---|
377 | 360 | |
---|
378 | | -static SENSOR_DEVICE_ATTR(in1_min_alarm, S_IRUGO, ltc2945_show_bool, NULL, |
---|
379 | | - FAULT_VIN_UV); |
---|
380 | | -static SENSOR_DEVICE_ATTR(in1_max_alarm, S_IRUGO, ltc2945_show_bool, NULL, |
---|
381 | | - FAULT_VIN_OV); |
---|
382 | | -static SENSOR_DEVICE_ATTR(in2_min_alarm, S_IRUGO, ltc2945_show_bool, NULL, |
---|
383 | | - FAULT_ADIN_UV); |
---|
384 | | -static SENSOR_DEVICE_ATTR(in2_max_alarm, S_IRUGO, ltc2945_show_bool, NULL, |
---|
385 | | - FAULT_ADIN_OV); |
---|
| 361 | +static SENSOR_DEVICE_ATTR_RO(in1_min_alarm, ltc2945_bool, FAULT_VIN_UV); |
---|
| 362 | +static SENSOR_DEVICE_ATTR_RO(in1_max_alarm, ltc2945_bool, FAULT_VIN_OV); |
---|
| 363 | +static SENSOR_DEVICE_ATTR_RO(in2_min_alarm, ltc2945_bool, FAULT_ADIN_UV); |
---|
| 364 | +static SENSOR_DEVICE_ATTR_RO(in2_max_alarm, ltc2945_bool, FAULT_ADIN_OV); |
---|
386 | 365 | |
---|
387 | 366 | /* Currents (via sense resistor) */ |
---|
388 | 367 | |
---|
389 | | -static SENSOR_DEVICE_ATTR(curr1_input, S_IRUGO, ltc2945_show_value, NULL, |
---|
390 | | - LTC2945_SENSE_H); |
---|
391 | | -static SENSOR_DEVICE_ATTR(curr1_min, S_IRUGO | S_IWUSR, ltc2945_show_value, |
---|
392 | | - ltc2945_set_value, LTC2945_MIN_SENSE_THRES_H); |
---|
393 | | -static SENSOR_DEVICE_ATTR(curr1_max, S_IRUGO | S_IWUSR, ltc2945_show_value, |
---|
394 | | - ltc2945_set_value, LTC2945_MAX_SENSE_THRES_H); |
---|
395 | | -static SENSOR_DEVICE_ATTR(curr1_lowest, S_IRUGO, ltc2945_show_value, NULL, |
---|
396 | | - LTC2945_MIN_SENSE_H); |
---|
397 | | -static SENSOR_DEVICE_ATTR(curr1_highest, S_IRUGO, ltc2945_show_value, NULL, |
---|
398 | | - LTC2945_MAX_SENSE_H); |
---|
399 | | -static SENSOR_DEVICE_ATTR(curr1_reset_history, S_IWUSR, NULL, |
---|
400 | | - ltc2945_reset_history, LTC2945_MIN_SENSE_H); |
---|
| 368 | +static SENSOR_DEVICE_ATTR_RO(curr1_input, ltc2945_value, LTC2945_SENSE_H); |
---|
| 369 | +static SENSOR_DEVICE_ATTR_RW(curr1_min, ltc2945_value, |
---|
| 370 | + LTC2945_MIN_SENSE_THRES_H); |
---|
| 371 | +static SENSOR_DEVICE_ATTR_RW(curr1_max, ltc2945_value, |
---|
| 372 | + LTC2945_MAX_SENSE_THRES_H); |
---|
| 373 | +static SENSOR_DEVICE_ATTR_RO(curr1_lowest, ltc2945_value, LTC2945_MIN_SENSE_H); |
---|
| 374 | +static SENSOR_DEVICE_ATTR_RO(curr1_highest, ltc2945_value, |
---|
| 375 | + LTC2945_MAX_SENSE_H); |
---|
| 376 | +static SENSOR_DEVICE_ATTR_WO(curr1_reset_history, ltc2945_history, |
---|
| 377 | + LTC2945_MIN_SENSE_H); |
---|
401 | 378 | |
---|
402 | 379 | /* Current alarms */ |
---|
403 | 380 | |
---|
404 | | -static SENSOR_DEVICE_ATTR(curr1_min_alarm, S_IRUGO, ltc2945_show_bool, NULL, |
---|
405 | | - FAULT_SENSE_UV); |
---|
406 | | -static SENSOR_DEVICE_ATTR(curr1_max_alarm, S_IRUGO, ltc2945_show_bool, NULL, |
---|
407 | | - FAULT_SENSE_OV); |
---|
| 381 | +static SENSOR_DEVICE_ATTR_RO(curr1_min_alarm, ltc2945_bool, FAULT_SENSE_UV); |
---|
| 382 | +static SENSOR_DEVICE_ATTR_RO(curr1_max_alarm, ltc2945_bool, FAULT_SENSE_OV); |
---|
408 | 383 | |
---|
409 | 384 | /* Power */ |
---|
410 | 385 | |
---|
411 | | -static SENSOR_DEVICE_ATTR(power1_input, S_IRUGO, ltc2945_show_value, NULL, |
---|
412 | | - LTC2945_POWER_H); |
---|
413 | | -static SENSOR_DEVICE_ATTR(power1_min, S_IRUGO | S_IWUSR, ltc2945_show_value, |
---|
414 | | - ltc2945_set_value, LTC2945_MIN_POWER_THRES_H); |
---|
415 | | -static SENSOR_DEVICE_ATTR(power1_max, S_IRUGO | S_IWUSR, ltc2945_show_value, |
---|
416 | | - ltc2945_set_value, LTC2945_MAX_POWER_THRES_H); |
---|
417 | | -static SENSOR_DEVICE_ATTR(power1_input_lowest, S_IRUGO, ltc2945_show_value, |
---|
418 | | - NULL, LTC2945_MIN_POWER_H); |
---|
419 | | -static SENSOR_DEVICE_ATTR(power1_input_highest, S_IRUGO, ltc2945_show_value, |
---|
420 | | - NULL, LTC2945_MAX_POWER_H); |
---|
421 | | -static SENSOR_DEVICE_ATTR(power1_reset_history, S_IWUSR, NULL, |
---|
422 | | - ltc2945_reset_history, LTC2945_MIN_POWER_H); |
---|
| 386 | +static SENSOR_DEVICE_ATTR_RO(power1_input, ltc2945_value, LTC2945_POWER_H); |
---|
| 387 | +static SENSOR_DEVICE_ATTR_RW(power1_min, ltc2945_value, |
---|
| 388 | + LTC2945_MIN_POWER_THRES_H); |
---|
| 389 | +static SENSOR_DEVICE_ATTR_RW(power1_max, ltc2945_value, |
---|
| 390 | + LTC2945_MAX_POWER_THRES_H); |
---|
| 391 | +static SENSOR_DEVICE_ATTR_RO(power1_input_lowest, ltc2945_value, |
---|
| 392 | + LTC2945_MIN_POWER_H); |
---|
| 393 | +static SENSOR_DEVICE_ATTR_RO(power1_input_highest, ltc2945_value, |
---|
| 394 | + LTC2945_MAX_POWER_H); |
---|
| 395 | +static SENSOR_DEVICE_ATTR_WO(power1_reset_history, ltc2945_history, |
---|
| 396 | + LTC2945_MIN_POWER_H); |
---|
423 | 397 | |
---|
424 | 398 | /* Power alarms */ |
---|
425 | 399 | |
---|
426 | | -static SENSOR_DEVICE_ATTR(power1_min_alarm, S_IRUGO, ltc2945_show_bool, NULL, |
---|
427 | | - FAULT_POWER_UV); |
---|
428 | | -static SENSOR_DEVICE_ATTR(power1_max_alarm, S_IRUGO, ltc2945_show_bool, NULL, |
---|
429 | | - FAULT_POWER_OV); |
---|
| 400 | +static SENSOR_DEVICE_ATTR_RO(power1_min_alarm, ltc2945_bool, FAULT_POWER_UV); |
---|
| 401 | +static SENSOR_DEVICE_ATTR_RO(power1_max_alarm, ltc2945_bool, FAULT_POWER_OV); |
---|
430 | 402 | |
---|
431 | 403 | static struct attribute *ltc2945_attrs[] = { |
---|
432 | 404 | &sensor_dev_attr_in1_input.dev_attr.attr, |
---|
.. | .. |
---|
475 | 447 | .max_register = LTC2945_MIN_ADIN_THRES_L, |
---|
476 | 448 | }; |
---|
477 | 449 | |
---|
478 | | -static int ltc2945_probe(struct i2c_client *client, |
---|
479 | | - const struct i2c_device_id *id) |
---|
| 450 | +static int ltc2945_probe(struct i2c_client *client) |
---|
480 | 451 | { |
---|
481 | 452 | struct device *dev = &client->dev; |
---|
482 | 453 | struct device *hwmon_dev; |
---|
.. | .. |
---|
508 | 479 | .driver = { |
---|
509 | 480 | .name = "ltc2945", |
---|
510 | 481 | }, |
---|
511 | | - .probe = ltc2945_probe, |
---|
| 482 | + .probe_new = ltc2945_probe, |
---|
512 | 483 | .id_table = ltc2945_id, |
---|
513 | 484 | }; |
---|
514 | 485 | |
---|