.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* |
---|
2 | 3 | * Driver for the Texas Instruments / Burr Brown INA209 |
---|
3 | 4 | * Bidirectional Current/Power Monitor |
---|
.. | .. |
---|
12 | 13 | * Copyright (C) 2012 Lothar Felten <l-felten@ti.com> |
---|
13 | 14 | * Thanks to Jan Volkering |
---|
14 | 15 | * |
---|
15 | | - * This program is free software; you can redistribute it and/or modify |
---|
16 | | - * it under the terms of the GNU General Public License as published by |
---|
17 | | - * the Free Software Foundation; version 2 of the License. |
---|
18 | | - * |
---|
19 | 16 | * Datasheet: |
---|
20 | | - * http://www.ti.com/lit/gpn/ina209 |
---|
| 17 | + * https://www.ti.com/lit/gpn/ina209 |
---|
21 | 18 | */ |
---|
22 | 19 | |
---|
23 | 20 | #include <linux/kernel.h> |
---|
.. | .. |
---|
230 | 227 | return (config & 0xf807) | (adc << 3) | (adc << 7); |
---|
231 | 228 | } |
---|
232 | 229 | |
---|
233 | | -static ssize_t ina209_set_interval(struct device *dev, |
---|
234 | | - struct device_attribute *da, |
---|
235 | | - const char *buf, size_t count) |
---|
| 230 | +static ssize_t ina209_interval_store(struct device *dev, |
---|
| 231 | + struct device_attribute *da, |
---|
| 232 | + const char *buf, size_t count) |
---|
236 | 233 | { |
---|
237 | 234 | struct ina209_data *data = ina209_update_device(dev); |
---|
238 | 235 | long val; |
---|
.. | .. |
---|
257 | 254 | return count; |
---|
258 | 255 | } |
---|
259 | 256 | |
---|
260 | | -static ssize_t ina209_show_interval(struct device *dev, |
---|
| 257 | +static ssize_t ina209_interval_show(struct device *dev, |
---|
261 | 258 | struct device_attribute *da, char *buf) |
---|
262 | 259 | { |
---|
263 | 260 | struct ina209_data *data = dev_get_drvdata(dev); |
---|
.. | .. |
---|
279 | 276 | INA209_POWER_PEAK |
---|
280 | 277 | }; |
---|
281 | 278 | |
---|
282 | | -static ssize_t ina209_reset_history(struct device *dev, |
---|
| 279 | +static ssize_t ina209_history_store(struct device *dev, |
---|
283 | 280 | struct device_attribute *da, |
---|
284 | | - const char *buf, |
---|
285 | | - size_t count) |
---|
| 281 | + const char *buf, size_t count) |
---|
286 | 282 | { |
---|
287 | 283 | struct sensor_device_attribute *attr = to_sensor_dev_attr(da); |
---|
288 | 284 | struct ina209_data *data = dev_get_drvdata(dev); |
---|
.. | .. |
---|
306 | 302 | return count; |
---|
307 | 303 | } |
---|
308 | 304 | |
---|
309 | | -static ssize_t ina209_set_value(struct device *dev, |
---|
310 | | - struct device_attribute *da, |
---|
311 | | - const char *buf, |
---|
312 | | - size_t count) |
---|
| 305 | +static ssize_t ina209_value_store(struct device *dev, |
---|
| 306 | + struct device_attribute *da, |
---|
| 307 | + const char *buf, size_t count) |
---|
313 | 308 | { |
---|
314 | 309 | struct ina209_data *data = ina209_update_device(dev); |
---|
315 | 310 | struct sensor_device_attribute *attr = to_sensor_dev_attr(da); |
---|
.. | .. |
---|
337 | 332 | return count; |
---|
338 | 333 | } |
---|
339 | 334 | |
---|
340 | | -static ssize_t ina209_show_value(struct device *dev, |
---|
341 | | - struct device_attribute *da, |
---|
342 | | - char *buf) |
---|
| 335 | +static ssize_t ina209_value_show(struct device *dev, |
---|
| 336 | + struct device_attribute *da, char *buf) |
---|
343 | 337 | { |
---|
344 | 338 | struct sensor_device_attribute *attr = to_sensor_dev_attr(da); |
---|
345 | 339 | struct ina209_data *data = ina209_update_device(dev); |
---|
.. | .. |
---|
352 | 346 | return snprintf(buf, PAGE_SIZE, "%ld\n", val); |
---|
353 | 347 | } |
---|
354 | 348 | |
---|
355 | | -static ssize_t ina209_show_alarm(struct device *dev, |
---|
356 | | - struct device_attribute *da, |
---|
357 | | - char *buf) |
---|
| 349 | +static ssize_t ina209_alarm_show(struct device *dev, |
---|
| 350 | + struct device_attribute *da, char *buf) |
---|
358 | 351 | { |
---|
359 | 352 | struct sensor_device_attribute *attr = to_sensor_dev_attr(da); |
---|
360 | 353 | struct ina209_data *data = ina209_update_device(dev); |
---|
.. | .. |
---|
374 | 367 | } |
---|
375 | 368 | |
---|
376 | 369 | /* Shunt voltage, history, limits, alarms */ |
---|
377 | | -static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, ina209_show_value, NULL, |
---|
378 | | - INA209_SHUNT_VOLTAGE); |
---|
379 | | -static SENSOR_DEVICE_ATTR(in0_input_highest, S_IRUGO, ina209_show_value, NULL, |
---|
380 | | - INA209_SHUNT_VOLTAGE_POS_PEAK); |
---|
381 | | -static SENSOR_DEVICE_ATTR(in0_input_lowest, S_IRUGO, ina209_show_value, NULL, |
---|
382 | | - INA209_SHUNT_VOLTAGE_NEG_PEAK); |
---|
383 | | -static SENSOR_DEVICE_ATTR(in0_reset_history, S_IWUSR, NULL, |
---|
384 | | - ina209_reset_history, (1 << 0) | (1 << 1)); |
---|
385 | | -static SENSOR_DEVICE_ATTR(in0_max, S_IRUGO | S_IWUSR, ina209_show_value, |
---|
386 | | - ina209_set_value, INA209_SHUNT_VOLTAGE_POS_WARN); |
---|
387 | | -static SENSOR_DEVICE_ATTR(in0_min, S_IRUGO | S_IWUSR, ina209_show_value, |
---|
388 | | - ina209_set_value, INA209_SHUNT_VOLTAGE_NEG_WARN); |
---|
389 | | -static SENSOR_DEVICE_ATTR(in0_crit_max, S_IRUGO | S_IWUSR, ina209_show_value, |
---|
390 | | - ina209_set_value, INA209_CRITICAL_DAC_POS); |
---|
391 | | -static SENSOR_DEVICE_ATTR(in0_crit_min, S_IRUGO | S_IWUSR, ina209_show_value, |
---|
392 | | - ina209_set_value, INA209_CRITICAL_DAC_NEG); |
---|
| 370 | +static SENSOR_DEVICE_ATTR_RO(in0_input, ina209_value, INA209_SHUNT_VOLTAGE); |
---|
| 371 | +static SENSOR_DEVICE_ATTR_RO(in0_input_highest, ina209_value, |
---|
| 372 | + INA209_SHUNT_VOLTAGE_POS_PEAK); |
---|
| 373 | +static SENSOR_DEVICE_ATTR_RO(in0_input_lowest, ina209_value, |
---|
| 374 | + INA209_SHUNT_VOLTAGE_NEG_PEAK); |
---|
| 375 | +static SENSOR_DEVICE_ATTR_WO(in0_reset_history, ina209_history, |
---|
| 376 | + (1 << 0) | (1 << 1)); |
---|
| 377 | +static SENSOR_DEVICE_ATTR_RW(in0_max, ina209_value, |
---|
| 378 | + INA209_SHUNT_VOLTAGE_POS_WARN); |
---|
| 379 | +static SENSOR_DEVICE_ATTR_RW(in0_min, ina209_value, |
---|
| 380 | + INA209_SHUNT_VOLTAGE_NEG_WARN); |
---|
| 381 | +static SENSOR_DEVICE_ATTR_RW(in0_crit_max, ina209_value, |
---|
| 382 | + INA209_CRITICAL_DAC_POS); |
---|
| 383 | +static SENSOR_DEVICE_ATTR_RW(in0_crit_min, ina209_value, |
---|
| 384 | + INA209_CRITICAL_DAC_NEG); |
---|
393 | 385 | |
---|
394 | | -static SENSOR_DEVICE_ATTR(in0_min_alarm, S_IRUGO, ina209_show_alarm, NULL, |
---|
395 | | - 1 << 11); |
---|
396 | | -static SENSOR_DEVICE_ATTR(in0_max_alarm, S_IRUGO, ina209_show_alarm, NULL, |
---|
397 | | - 1 << 12); |
---|
398 | | -static SENSOR_DEVICE_ATTR(in0_crit_min_alarm, S_IRUGO, ina209_show_alarm, NULL, |
---|
399 | | - 1 << 6); |
---|
400 | | -static SENSOR_DEVICE_ATTR(in0_crit_max_alarm, S_IRUGO, ina209_show_alarm, NULL, |
---|
401 | | - 1 << 7); |
---|
| 386 | +static SENSOR_DEVICE_ATTR_RO(in0_min_alarm, ina209_alarm, 1 << 11); |
---|
| 387 | +static SENSOR_DEVICE_ATTR_RO(in0_max_alarm, ina209_alarm, 1 << 12); |
---|
| 388 | +static SENSOR_DEVICE_ATTR_RO(in0_crit_min_alarm, ina209_alarm, 1 << 6); |
---|
| 389 | +static SENSOR_DEVICE_ATTR_RO(in0_crit_max_alarm, ina209_alarm, 1 << 7); |
---|
402 | 390 | |
---|
403 | 391 | /* Bus voltage, history, limits, alarms */ |
---|
404 | | -static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, ina209_show_value, NULL, |
---|
405 | | - INA209_BUS_VOLTAGE); |
---|
406 | | -static SENSOR_DEVICE_ATTR(in1_input_highest, S_IRUGO, ina209_show_value, NULL, |
---|
407 | | - INA209_BUS_VOLTAGE_MAX_PEAK); |
---|
408 | | -static SENSOR_DEVICE_ATTR(in1_input_lowest, S_IRUGO, ina209_show_value, NULL, |
---|
409 | | - INA209_BUS_VOLTAGE_MIN_PEAK); |
---|
410 | | -static SENSOR_DEVICE_ATTR(in1_reset_history, S_IWUSR, NULL, |
---|
411 | | - ina209_reset_history, (1 << 2) | (1 << 3)); |
---|
412 | | -static SENSOR_DEVICE_ATTR(in1_max, S_IRUGO | S_IWUSR, ina209_show_value, |
---|
413 | | - ina209_set_value, INA209_BUS_VOLTAGE_OVER_WARN); |
---|
414 | | -static SENSOR_DEVICE_ATTR(in1_min, S_IRUGO | S_IWUSR, ina209_show_value, |
---|
415 | | - ina209_set_value, INA209_BUS_VOLTAGE_UNDER_WARN); |
---|
416 | | -static SENSOR_DEVICE_ATTR(in1_crit_max, S_IRUGO | S_IWUSR, ina209_show_value, |
---|
417 | | - ina209_set_value, INA209_BUS_VOLTAGE_OVER_LIMIT); |
---|
418 | | -static SENSOR_DEVICE_ATTR(in1_crit_min, S_IRUGO | S_IWUSR, ina209_show_value, |
---|
419 | | - ina209_set_value, INA209_BUS_VOLTAGE_UNDER_LIMIT); |
---|
| 392 | +static SENSOR_DEVICE_ATTR_RO(in1_input, ina209_value, INA209_BUS_VOLTAGE); |
---|
| 393 | +static SENSOR_DEVICE_ATTR_RO(in1_input_highest, ina209_value, |
---|
| 394 | + INA209_BUS_VOLTAGE_MAX_PEAK); |
---|
| 395 | +static SENSOR_DEVICE_ATTR_RO(in1_input_lowest, ina209_value, |
---|
| 396 | + INA209_BUS_VOLTAGE_MIN_PEAK); |
---|
| 397 | +static SENSOR_DEVICE_ATTR_WO(in1_reset_history, ina209_history, |
---|
| 398 | + (1 << 2) | (1 << 3)); |
---|
| 399 | +static SENSOR_DEVICE_ATTR_RW(in1_max, ina209_value, |
---|
| 400 | + INA209_BUS_VOLTAGE_OVER_WARN); |
---|
| 401 | +static SENSOR_DEVICE_ATTR_RW(in1_min, ina209_value, |
---|
| 402 | + INA209_BUS_VOLTAGE_UNDER_WARN); |
---|
| 403 | +static SENSOR_DEVICE_ATTR_RW(in1_crit_max, ina209_value, |
---|
| 404 | + INA209_BUS_VOLTAGE_OVER_LIMIT); |
---|
| 405 | +static SENSOR_DEVICE_ATTR_RW(in1_crit_min, ina209_value, |
---|
| 406 | + INA209_BUS_VOLTAGE_UNDER_LIMIT); |
---|
420 | 407 | |
---|
421 | | -static SENSOR_DEVICE_ATTR(in1_min_alarm, S_IRUGO, ina209_show_alarm, NULL, |
---|
422 | | - 1 << 14); |
---|
423 | | -static SENSOR_DEVICE_ATTR(in1_max_alarm, S_IRUGO, ina209_show_alarm, NULL, |
---|
424 | | - 1 << 15); |
---|
425 | | -static SENSOR_DEVICE_ATTR(in1_crit_min_alarm, S_IRUGO, ina209_show_alarm, NULL, |
---|
426 | | - 1 << 9); |
---|
427 | | -static SENSOR_DEVICE_ATTR(in1_crit_max_alarm, S_IRUGO, ina209_show_alarm, NULL, |
---|
428 | | - 1 << 10); |
---|
| 408 | +static SENSOR_DEVICE_ATTR_RO(in1_min_alarm, ina209_alarm, 1 << 14); |
---|
| 409 | +static SENSOR_DEVICE_ATTR_RO(in1_max_alarm, ina209_alarm, 1 << 15); |
---|
| 410 | +static SENSOR_DEVICE_ATTR_RO(in1_crit_min_alarm, ina209_alarm, 1 << 9); |
---|
| 411 | +static SENSOR_DEVICE_ATTR_RO(in1_crit_max_alarm, ina209_alarm, 1 << 10); |
---|
429 | 412 | |
---|
430 | 413 | /* Power */ |
---|
431 | | -static SENSOR_DEVICE_ATTR(power1_input, S_IRUGO, ina209_show_value, NULL, |
---|
432 | | - INA209_POWER); |
---|
433 | | -static SENSOR_DEVICE_ATTR(power1_input_highest, S_IRUGO, ina209_show_value, |
---|
434 | | - NULL, INA209_POWER_PEAK); |
---|
435 | | -static SENSOR_DEVICE_ATTR(power1_reset_history, S_IWUSR, NULL, |
---|
436 | | - ina209_reset_history, 1 << 4); |
---|
437 | | -static SENSOR_DEVICE_ATTR(power1_max, S_IRUGO | S_IWUSR, ina209_show_value, |
---|
438 | | - ina209_set_value, INA209_POWER_WARN); |
---|
439 | | -static SENSOR_DEVICE_ATTR(power1_crit, S_IRUGO | S_IWUSR, ina209_show_value, |
---|
440 | | - ina209_set_value, INA209_POWER_OVER_LIMIT); |
---|
| 414 | +static SENSOR_DEVICE_ATTR_RO(power1_input, ina209_value, INA209_POWER); |
---|
| 415 | +static SENSOR_DEVICE_ATTR_RO(power1_input_highest, ina209_value, |
---|
| 416 | + INA209_POWER_PEAK); |
---|
| 417 | +static SENSOR_DEVICE_ATTR_WO(power1_reset_history, ina209_history, 1 << 4); |
---|
| 418 | +static SENSOR_DEVICE_ATTR_RW(power1_max, ina209_value, INA209_POWER_WARN); |
---|
| 419 | +static SENSOR_DEVICE_ATTR_RW(power1_crit, ina209_value, |
---|
| 420 | + INA209_POWER_OVER_LIMIT); |
---|
441 | 421 | |
---|
442 | | -static SENSOR_DEVICE_ATTR(power1_max_alarm, S_IRUGO, ina209_show_alarm, NULL, |
---|
443 | | - 1 << 13); |
---|
444 | | -static SENSOR_DEVICE_ATTR(power1_crit_alarm, S_IRUGO, ina209_show_alarm, NULL, |
---|
445 | | - 1 << 8); |
---|
| 422 | +static SENSOR_DEVICE_ATTR_RO(power1_max_alarm, ina209_alarm, 1 << 13); |
---|
| 423 | +static SENSOR_DEVICE_ATTR_RO(power1_crit_alarm, ina209_alarm, 1 << 8); |
---|
446 | 424 | |
---|
447 | 425 | /* Current */ |
---|
448 | | -static SENSOR_DEVICE_ATTR(curr1_input, S_IRUGO, ina209_show_value, NULL, |
---|
449 | | - INA209_CURRENT); |
---|
| 426 | +static SENSOR_DEVICE_ATTR_RO(curr1_input, ina209_value, INA209_CURRENT); |
---|
450 | 427 | |
---|
451 | | -static SENSOR_DEVICE_ATTR(update_interval, S_IRUGO | S_IWUSR, |
---|
452 | | - ina209_show_interval, ina209_set_interval, 0); |
---|
| 428 | +static SENSOR_DEVICE_ATTR_RW(update_interval, ina209_interval, 0); |
---|
453 | 429 | |
---|
454 | 430 | /* |
---|
455 | 431 | * Finally, construct an array of pointers to members of the above objects, |
---|
.. | .. |
---|
555 | 531 | return 0; |
---|
556 | 532 | } |
---|
557 | 533 | |
---|
558 | | -static int ina209_probe(struct i2c_client *client, |
---|
559 | | - const struct i2c_device_id *id) |
---|
| 534 | +static int ina209_probe(struct i2c_client *client) |
---|
560 | 535 | { |
---|
561 | 536 | struct i2c_adapter *adapter = client->adapter; |
---|
562 | 537 | struct ina209_data *data; |
---|
.. | .. |
---|
608 | 583 | }; |
---|
609 | 584 | MODULE_DEVICE_TABLE(i2c, ina209_id); |
---|
610 | 585 | |
---|
611 | | -static const struct of_device_id ina209_of_match[] = { |
---|
| 586 | +static const struct of_device_id __maybe_unused ina209_of_match[] = { |
---|
612 | 587 | { .compatible = "ti,ina209" }, |
---|
613 | 588 | { }, |
---|
614 | 589 | }; |
---|
.. | .. |
---|
621 | 596 | .name = "ina209", |
---|
622 | 597 | .of_match_table = of_match_ptr(ina209_of_match), |
---|
623 | 598 | }, |
---|
624 | | - .probe = ina209_probe, |
---|
| 599 | + .probe_new = ina209_probe, |
---|
625 | 600 | .remove = ina209_remove, |
---|
626 | 601 | .id_table = ina209_id, |
---|
627 | 602 | }; |
---|