| .. | .. |
|---|
| 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 | |
|---|