1
2
3
4
5
6
7#include <linux/bitfield.h>
8#include <linux/bits.h>
9#include <linux/clk.h>
10#include <linux/device.h>
11#include <linux/hwmon.h>
12#include <linux/hwmon-sysfs.h>
13#include <linux/module.h>
14#include <linux/of.h>
15#include <linux/regmap.h>
16
17#include "ltc2947.h"
18
19
20#define LTC2947_REG_PAGE_CTRL 0xFF
21#define LTC2947_REG_CTRL 0xF0
22#define LTC2947_REG_TBCTL 0xE9
23#define LTC2947_CONT_MODE_MASK BIT(3)
24#define LTC2947_CONT_MODE(x) FIELD_PREP(LTC2947_CONT_MODE_MASK, x)
25#define LTC2947_PRE_MASK GENMASK(2, 0)
26#define LTC2947_PRE(x) FIELD_PREP(LTC2947_PRE_MASK, x)
27#define LTC2947_DIV_MASK GENMASK(7, 3)
28#define LTC2947_DIV(x) FIELD_PREP(LTC2947_DIV_MASK, x)
29#define LTC2947_SHUTDOWN_MASK BIT(0)
30#define LTC2947_REG_ACCUM_POL 0xE1
31#define LTC2947_ACCUM_POL_1_MASK GENMASK(1, 0)
32#define LTC2947_ACCUM_POL_1(x) FIELD_PREP(LTC2947_ACCUM_POL_1_MASK, x)
33#define LTC2947_ACCUM_POL_2_MASK GENMASK(3, 2)
34#define LTC2947_ACCUM_POL_2(x) FIELD_PREP(LTC2947_ACCUM_POL_2_MASK, x)
35#define LTC2947_REG_ACCUM_DEADBAND 0xE4
36#define LTC2947_REG_GPIOSTATCTL 0x67
37#define LTC2947_GPIO_EN_MASK BIT(0)
38#define LTC2947_GPIO_EN(x) FIELD_PREP(LTC2947_GPIO_EN_MASK, x)
39#define LTC2947_GPIO_FAN_EN_MASK BIT(6)
40#define LTC2947_GPIO_FAN_EN(x) FIELD_PREP(LTC2947_GPIO_FAN_EN_MASK, x)
41#define LTC2947_GPIO_FAN_POL_MASK BIT(7)
42#define LTC2947_GPIO_FAN_POL(x) FIELD_PREP(LTC2947_GPIO_FAN_POL_MASK, x)
43#define LTC2947_REG_GPIO_ACCUM 0xE3
44
45#define LTC2947_CLK_MIN 200000
46
47#define LTC2947_CLK_MAX 25000000
48#define LTC2947_PAGE0 0
49#define LTC2947_PAGE1 1
50
51#define LTC2947_REG_VOLTAGE 0xA0
52#define LTC2947_REG_VOLTAGE_MAX 0x50
53#define LTC2947_REG_VOLTAGE_MIN 0x52
54#define LTC2947_REG_VOLTAGE_THRE_H 0x90
55#define LTC2947_REG_VOLTAGE_THRE_L 0x92
56#define LTC2947_REG_DVCC 0xA4
57#define LTC2947_REG_DVCC_MAX 0x58
58#define LTC2947_REG_DVCC_MIN 0x5A
59#define LTC2947_REG_DVCC_THRE_H 0x98
60#define LTC2947_REG_DVCC_THRE_L 0x9A
61#define LTC2947_VOLTAGE_GEN_CHAN 0
62#define LTC2947_VOLTAGE_DVCC_CHAN 1
63
64#define VOLTAGE_MAX 15500
65#define VOLTAGE_MIN -300
66#define VDVCC_MAX 15000
67#define VDVCC_MIN 4750
68
69#define LTC2947_REG_CURRENT 0x90
70#define LTC2947_REG_CURRENT_MAX 0x40
71#define LTC2947_REG_CURRENT_MIN 0x42
72#define LTC2947_REG_CURRENT_THRE_H 0x80
73#define LTC2947_REG_CURRENT_THRE_L 0x82
74
75#define CURRENT_MAX 30000
76#define CURRENT_MIN -30000
77
78#define LTC2947_REG_POWER 0x93
79#define LTC2947_REG_POWER_MAX 0x44
80#define LTC2947_REG_POWER_MIN 0x46
81#define LTC2947_REG_POWER_THRE_H 0x84
82#define LTC2947_REG_POWER_THRE_L 0x86
83
84#define POWER_MAX 450000000
85#define POWER_MIN -450000000
86
87#define LTC2947_REG_TEMP 0xA2
88#define LTC2947_REG_TEMP_MAX 0x54
89#define LTC2947_REG_TEMP_MIN 0x56
90#define LTC2947_REG_TEMP_THRE_H 0x94
91#define LTC2947_REG_TEMP_THRE_L 0x96
92#define LTC2947_REG_TEMP_FAN_THRE_H 0x9C
93#define LTC2947_REG_TEMP_FAN_THRE_L 0x9E
94#define LTC2947_TEMP_FAN_CHAN 1
95
96#define TEMP_MAX 85000
97#define TEMP_MIN -40000
98
99#define LTC2947_REG_ENERGY1 0x06
100#define LTC2947_REG_ENERGY2 0x16
101
102#define LTC2947_REG_STATUS 0x80
103#define LTC2947_REG_STATVT 0x81
104#define LTC2947_REG_STATIP 0x82
105#define LTC2947_REG_STATVDVCC 0x87
106
107#define LTC2947_ALERTS_SIZE (LTC2947_REG_STATVDVCC - LTC2947_REG_STATUS)
108#define LTC2947_MAX_VOLTAGE_MASK BIT(0)
109#define LTC2947_MIN_VOLTAGE_MASK BIT(1)
110#define LTC2947_MAX_CURRENT_MASK BIT(0)
111#define LTC2947_MIN_CURRENT_MASK BIT(1)
112#define LTC2947_MAX_POWER_MASK BIT(2)
113#define LTC2947_MIN_POWER_MASK BIT(3)
114#define LTC2947_MAX_TEMP_MASK BIT(2)
115#define LTC2947_MIN_TEMP_MASK BIT(3)
116#define LTC2947_MAX_TEMP_FAN_MASK BIT(4)
117#define LTC2947_MIN_TEMP_FAN_MASK BIT(5)
118
119struct ltc2947_data {
120 struct regmap *map;
121 struct device *dev;
122
123
124
125
126
127 struct mutex lock;
128 u32 lsb_energy;
129 bool gpio_out;
130};
131
132static int __ltc2947_val_read16(const struct ltc2947_data *st, const u8 reg,
133 u64 *val)
134{
135 __be16 __val = 0;
136 int ret;
137
138 ret = regmap_bulk_read(st->map, reg, &__val, 2);
139 if (ret)
140 return ret;
141
142 *val = be16_to_cpu(__val);
143
144 return 0;
145}
146
147static int __ltc2947_val_read24(const struct ltc2947_data *st, const u8 reg,
148 u64 *val)
149{
150 __be32 __val = 0;
151 int ret;
152
153 ret = regmap_bulk_read(st->map, reg, &__val, 3);
154 if (ret)
155 return ret;
156
157 *val = be32_to_cpu(__val) >> 8;
158
159 return 0;
160}
161
162static int __ltc2947_val_read64(const struct ltc2947_data *st, const u8 reg,
163 u64 *val)
164{
165 __be64 __val = 0;
166 int ret;
167
168 ret = regmap_bulk_read(st->map, reg, &__val, 6);
169 if (ret)
170 return ret;
171
172 *val = be64_to_cpu(__val) >> 16;
173
174 return 0;
175}
176
177static int ltc2947_val_read(struct ltc2947_data *st, const u8 reg,
178 const u8 page, const size_t size, s64 *val)
179{
180 int ret;
181 u64 __val = 0;
182
183 mutex_lock(&st->lock);
184
185 ret = regmap_write(st->map, LTC2947_REG_PAGE_CTRL, page);
186 if (ret) {
187 mutex_unlock(&st->lock);
188 return ret;
189 }
190
191 dev_dbg(st->dev, "Read val, reg:%02X, p:%d sz:%zu\n", reg, page,
192 size);
193
194 switch (size) {
195 case 2:
196 ret = __ltc2947_val_read16(st, reg, &__val);
197 break;
198 case 3:
199 ret = __ltc2947_val_read24(st, reg, &__val);
200 break;
201 case 6:
202 ret = __ltc2947_val_read64(st, reg, &__val);
203 break;
204 default:
205 ret = -EINVAL;
206 break;
207 }
208
209 mutex_unlock(&st->lock);
210
211 if (ret)
212 return ret;
213
214 *val = sign_extend64(__val, (8 * size) - 1);
215
216 dev_dbg(st->dev, "Got s:%lld, u:%016llX\n", *val, __val);
217
218 return 0;
219}
220
221static int __ltc2947_val_write64(const struct ltc2947_data *st, const u8 reg,
222 const u64 val)
223{
224 __be64 __val;
225
226 __val = cpu_to_be64(val << 16);
227 return regmap_bulk_write(st->map, reg, &__val, 6);
228}
229
230static int __ltc2947_val_write16(const struct ltc2947_data *st, const u8 reg,
231 const u16 val)
232{
233 __be16 __val;
234
235 __val = cpu_to_be16(val);
236 return regmap_bulk_write(st->map, reg, &__val, 2);
237}
238
239static int ltc2947_val_write(struct ltc2947_data *st, const u8 reg,
240 const u8 page, const size_t size, const u64 val)
241{
242 int ret;
243
244 mutex_lock(&st->lock);
245
246 ret = regmap_write(st->map, LTC2947_REG_PAGE_CTRL, page);
247 if (ret) {
248 mutex_unlock(&st->lock);
249 return ret;
250 }
251
252 dev_dbg(st->dev, "Write val, r:%02X, p:%d, sz:%zu, val:%016llX\n",
253 reg, page, size, val);
254
255 switch (size) {
256 case 2:
257 ret = __ltc2947_val_write16(st, reg, val);
258 break;
259 case 6:
260 ret = __ltc2947_val_write64(st, reg, val);
261 break;
262 default:
263 ret = -EINVAL;
264 break;
265 }
266
267 mutex_unlock(&st->lock);
268
269 return ret;
270}
271
272static int ltc2947_reset_history(struct ltc2947_data *st, const u8 reg_h,
273 const u8 reg_l)
274{
275 int ret;
276
277
278
279
280 ret = ltc2947_val_write(st, reg_h, LTC2947_PAGE0, 2, 0x8000U);
281 if (ret)
282 return ret;
283
284 return ltc2947_val_write(st, reg_l, LTC2947_PAGE0, 2, 0x7FFFU);
285}
286
287static int ltc2947_alarm_read(struct ltc2947_data *st, const u8 reg,
288 const u32 mask, long *val)
289{
290 u8 offset = reg - LTC2947_REG_STATUS;
291
292 char alarms[LTC2947_ALERTS_SIZE + 1];
293 int ret = 0;
294
295 memset(alarms, 0, sizeof(alarms));
296
297 mutex_lock(&st->lock);
298
299 ret = regmap_write(st->map, LTC2947_REG_PAGE_CTRL, LTC2947_PAGE0);
300 if (ret)
301 goto unlock;
302
303 dev_dbg(st->dev, "Read alarm, reg:%02X, mask:%02X\n", reg, mask);
304
305
306
307
308
309 ret = regmap_bulk_read(st->map, LTC2947_REG_STATUS, alarms,
310 sizeof(alarms));
311 if (ret)
312 goto unlock;
313
314
315 *val = !!(alarms[offset] & mask);
316unlock:
317 mutex_unlock(&st->lock);
318 return ret;
319}
320
321static ssize_t ltc2947_show_value(struct device *dev,
322 struct device_attribute *da, char *buf)
323{
324 struct ltc2947_data *st = dev_get_drvdata(dev);
325 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
326 int ret;
327 s64 val = 0;
328
329 ret = ltc2947_val_read(st, attr->index, LTC2947_PAGE0, 6, &val);
330 if (ret)
331 return ret;
332
333
334 val = div_s64(val * st->lsb_energy, 1000);
335
336 return sprintf(buf, "%lld\n", val);
337}
338
339static int ltc2947_read_temp(struct device *dev, const u32 attr, long *val,
340 const int channel)
341{
342 int ret;
343 struct ltc2947_data *st = dev_get_drvdata(dev);
344 s64 __val = 0;
345
346 switch (attr) {
347 case hwmon_temp_input:
348 ret = ltc2947_val_read(st, LTC2947_REG_TEMP, LTC2947_PAGE0,
349 2, &__val);
350 break;
351 case hwmon_temp_highest:
352 ret = ltc2947_val_read(st, LTC2947_REG_TEMP_MAX, LTC2947_PAGE0,
353 2, &__val);
354 break;
355 case hwmon_temp_lowest:
356 ret = ltc2947_val_read(st, LTC2947_REG_TEMP_MIN, LTC2947_PAGE0,
357 2, &__val);
358 break;
359 case hwmon_temp_max_alarm:
360 if (channel == LTC2947_TEMP_FAN_CHAN)
361 return ltc2947_alarm_read(st, LTC2947_REG_STATVT,
362 LTC2947_MAX_TEMP_FAN_MASK,
363 val);
364
365 return ltc2947_alarm_read(st, LTC2947_REG_STATVT,
366 LTC2947_MAX_TEMP_MASK, val);
367 case hwmon_temp_min_alarm:
368 if (channel == LTC2947_TEMP_FAN_CHAN)
369 return ltc2947_alarm_read(st, LTC2947_REG_STATVT,
370 LTC2947_MIN_TEMP_FAN_MASK,
371 val);
372
373 return ltc2947_alarm_read(st, LTC2947_REG_STATVT,
374 LTC2947_MIN_TEMP_MASK, val);
375 case hwmon_temp_max:
376 if (channel == LTC2947_TEMP_FAN_CHAN)
377 ret = ltc2947_val_read(st, LTC2947_REG_TEMP_FAN_THRE_H,
378 LTC2947_PAGE1, 2, &__val);
379 else
380 ret = ltc2947_val_read(st, LTC2947_REG_TEMP_THRE_H,
381 LTC2947_PAGE1, 2, &__val);
382 break;
383 case hwmon_temp_min:
384 if (channel == LTC2947_TEMP_FAN_CHAN)
385 ret = ltc2947_val_read(st, LTC2947_REG_TEMP_FAN_THRE_L,
386 LTC2947_PAGE1, 2, &__val);
387 else
388 ret = ltc2947_val_read(st, LTC2947_REG_TEMP_THRE_L,
389 LTC2947_PAGE1, 2, &__val);
390 break;
391 default:
392 return -ENOTSUPP;
393 }
394
395 if (ret)
396 return ret;
397
398
399 *val = (__val * 204) + 550;
400
401 return 0;
402}
403
404static int ltc2947_read_power(struct device *dev, const u32 attr, long *val)
405{
406 struct ltc2947_data *st = dev_get_drvdata(dev);
407 int ret;
408 u32 lsb = 200000;
409 s64 __val = 0;
410
411 switch (attr) {
412 case hwmon_power_input:
413 ret = ltc2947_val_read(st, LTC2947_REG_POWER, LTC2947_PAGE0,
414 3, &__val);
415 lsb = 50000;
416 break;
417 case hwmon_power_input_highest:
418 ret = ltc2947_val_read(st, LTC2947_REG_POWER_MAX, LTC2947_PAGE0,
419 2, &__val);
420 break;
421 case hwmon_power_input_lowest:
422 ret = ltc2947_val_read(st, LTC2947_REG_POWER_MIN, LTC2947_PAGE0,
423 2, &__val);
424 break;
425 case hwmon_power_max_alarm:
426 return ltc2947_alarm_read(st, LTC2947_REG_STATIP,
427 LTC2947_MAX_POWER_MASK, val);
428 case hwmon_power_min_alarm:
429 return ltc2947_alarm_read(st, LTC2947_REG_STATIP,
430 LTC2947_MIN_POWER_MASK, val);
431 case hwmon_power_max:
432 ret = ltc2947_val_read(st, LTC2947_REG_POWER_THRE_H,
433 LTC2947_PAGE1, 2, &__val);
434 break;
435 case hwmon_power_min:
436 ret = ltc2947_val_read(st, LTC2947_REG_POWER_THRE_L,
437 LTC2947_PAGE1, 2, &__val);
438 break;
439 default:
440 return -ENOTSUPP;
441 }
442
443 if (ret)
444 return ret;
445
446 *val = __val * lsb;
447
448 return 0;
449}
450
451static int ltc2947_read_curr(struct device *dev, const u32 attr, long *val)
452{
453 struct ltc2947_data *st = dev_get_drvdata(dev);
454 int ret;
455 u8 lsb = 12;
456 s64 __val = 0;
457
458 switch (attr) {
459 case hwmon_curr_input:
460 ret = ltc2947_val_read(st, LTC2947_REG_CURRENT,
461 LTC2947_PAGE0, 3, &__val);
462 lsb = 3;
463 break;
464 case hwmon_curr_highest:
465 ret = ltc2947_val_read(st, LTC2947_REG_CURRENT_MAX,
466 LTC2947_PAGE0, 2, &__val);
467 break;
468 case hwmon_curr_lowest:
469 ret = ltc2947_val_read(st, LTC2947_REG_CURRENT_MIN,
470 LTC2947_PAGE0, 2, &__val);
471 break;
472 case hwmon_curr_max_alarm:
473 return ltc2947_alarm_read(st, LTC2947_REG_STATIP,
474 LTC2947_MAX_CURRENT_MASK, val);
475 case hwmon_curr_min_alarm:
476 return ltc2947_alarm_read(st, LTC2947_REG_STATIP,
477 LTC2947_MIN_CURRENT_MASK, val);
478 case hwmon_curr_max:
479 ret = ltc2947_val_read(st, LTC2947_REG_CURRENT_THRE_H,
480 LTC2947_PAGE1, 2, &__val);
481 break;
482 case hwmon_curr_min:
483 ret = ltc2947_val_read(st, LTC2947_REG_CURRENT_THRE_L,
484 LTC2947_PAGE1, 2, &__val);
485 break;
486 default:
487 return -ENOTSUPP;
488 }
489
490 if (ret)
491 return ret;
492
493 *val = __val * lsb;
494
495 return 0;
496}
497
498static int ltc2947_read_in(struct device *dev, const u32 attr, long *val,
499 const int channel)
500{
501 struct ltc2947_data *st = dev_get_drvdata(dev);
502 int ret;
503 u8 lsb = 2;
504 s64 __val = 0;
505
506 if (channel < 0 || channel > LTC2947_VOLTAGE_DVCC_CHAN) {
507 dev_err(st->dev, "Invalid chan%d for voltage", channel);
508 return -EINVAL;
509 }
510
511 switch (attr) {
512 case hwmon_in_input:
513 if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
514 ret = ltc2947_val_read(st, LTC2947_REG_DVCC,
515 LTC2947_PAGE0, 2, &__val);
516 lsb = 145;
517 } else {
518 ret = ltc2947_val_read(st, LTC2947_REG_VOLTAGE,
519 LTC2947_PAGE0, 2, &__val);
520 }
521 break;
522 case hwmon_in_highest:
523 if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
524 ret = ltc2947_val_read(st, LTC2947_REG_DVCC_MAX,
525 LTC2947_PAGE0, 2, &__val);
526 lsb = 145;
527 } else {
528 ret = ltc2947_val_read(st, LTC2947_REG_VOLTAGE_MAX,
529 LTC2947_PAGE0, 2, &__val);
530 }
531 break;
532 case hwmon_in_lowest:
533 if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
534 ret = ltc2947_val_read(st, LTC2947_REG_DVCC_MIN,
535 LTC2947_PAGE0, 2, &__val);
536 lsb = 145;
537 } else {
538 ret = ltc2947_val_read(st, LTC2947_REG_VOLTAGE_MIN,
539 LTC2947_PAGE0, 2, &__val);
540 }
541 break;
542 case hwmon_in_max_alarm:
543 if (channel == LTC2947_VOLTAGE_DVCC_CHAN)
544 return ltc2947_alarm_read(st, LTC2947_REG_STATVDVCC,
545 LTC2947_MAX_VOLTAGE_MASK,
546 val);
547
548 return ltc2947_alarm_read(st, LTC2947_REG_STATVT,
549 LTC2947_MAX_VOLTAGE_MASK, val);
550 case hwmon_in_min_alarm:
551 if (channel == LTC2947_VOLTAGE_DVCC_CHAN)
552 return ltc2947_alarm_read(st, LTC2947_REG_STATVDVCC,
553 LTC2947_MIN_VOLTAGE_MASK,
554 val);
555
556 return ltc2947_alarm_read(st, LTC2947_REG_STATVT,
557 LTC2947_MIN_VOLTAGE_MASK, val);
558 case hwmon_in_max:
559 if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
560 ret = ltc2947_val_read(st, LTC2947_REG_DVCC_THRE_H,
561 LTC2947_PAGE1, 2, &__val);
562 lsb = 145;
563 } else {
564 ret = ltc2947_val_read(st, LTC2947_REG_VOLTAGE_THRE_H,
565 LTC2947_PAGE1, 2, &__val);
566 }
567 break;
568 case hwmon_in_min:
569 if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
570 ret = ltc2947_val_read(st, LTC2947_REG_DVCC_THRE_L,
571 LTC2947_PAGE1, 2, &__val);
572 lsb = 145;
573 } else {
574 ret = ltc2947_val_read(st, LTC2947_REG_VOLTAGE_THRE_L,
575 LTC2947_PAGE1, 2, &__val);
576 }
577 break;
578 default:
579 return -ENOTSUPP;
580 }
581
582 if (ret)
583 return ret;
584
585 *val = __val * lsb;
586
587 return 0;
588}
589
590static int ltc2947_read(struct device *dev, enum hwmon_sensor_types type,
591 u32 attr, int channel, long *val)
592{
593 switch (type) {
594 case hwmon_in:
595 return ltc2947_read_in(dev, attr, val, channel);
596 case hwmon_curr:
597 return ltc2947_read_curr(dev, attr, val);
598 case hwmon_power:
599 return ltc2947_read_power(dev, attr, val);
600 case hwmon_temp:
601 return ltc2947_read_temp(dev, attr, val, channel);
602 default:
603 return -ENOTSUPP;
604 }
605}
606
607static int ltc2947_write_temp(struct device *dev, const u32 attr,
608 long val, const int channel)
609{
610 struct ltc2947_data *st = dev_get_drvdata(dev);
611
612 if (channel < 0 || channel > LTC2947_TEMP_FAN_CHAN) {
613 dev_err(st->dev, "Invalid chan%d for temperature", channel);
614 return -EINVAL;
615 }
616
617 switch (attr) {
618 case hwmon_temp_reset_history:
619 if (val != 1)
620 return -EINVAL;
621 return ltc2947_reset_history(st, LTC2947_REG_TEMP_MAX,
622 LTC2947_REG_TEMP_MIN);
623 case hwmon_temp_max:
624 val = clamp_val(val, TEMP_MIN, TEMP_MAX);
625 if (channel == LTC2947_TEMP_FAN_CHAN) {
626 if (!st->gpio_out)
627 return -ENOTSUPP;
628
629 return ltc2947_val_write(st,
630 LTC2947_REG_TEMP_FAN_THRE_H,
631 LTC2947_PAGE1, 2,
632 DIV_ROUND_CLOSEST(val - 550, 204));
633 }
634
635 return ltc2947_val_write(st, LTC2947_REG_TEMP_THRE_H,
636 LTC2947_PAGE1, 2,
637 DIV_ROUND_CLOSEST(val - 550, 204));
638 case hwmon_temp_min:
639 val = clamp_val(val, TEMP_MIN, TEMP_MAX);
640 if (channel == LTC2947_TEMP_FAN_CHAN) {
641 if (!st->gpio_out)
642 return -ENOTSUPP;
643
644 return ltc2947_val_write(st,
645 LTC2947_REG_TEMP_FAN_THRE_L,
646 LTC2947_PAGE1, 2,
647 DIV_ROUND_CLOSEST(val - 550, 204));
648 }
649
650 return ltc2947_val_write(st, LTC2947_REG_TEMP_THRE_L,
651 LTC2947_PAGE1, 2,
652 DIV_ROUND_CLOSEST(val - 550, 204));
653 default:
654 return -ENOTSUPP;
655 }
656}
657
658static int ltc2947_write_power(struct device *dev, const u32 attr,
659 long val)
660{
661 struct ltc2947_data *st = dev_get_drvdata(dev);
662
663 switch (attr) {
664 case hwmon_power_reset_history:
665 if (val != 1)
666 return -EINVAL;
667 return ltc2947_reset_history(st, LTC2947_REG_POWER_MAX,
668 LTC2947_REG_POWER_MIN);
669 case hwmon_power_max:
670 val = clamp_val(val, POWER_MIN, POWER_MAX);
671 return ltc2947_val_write(st, LTC2947_REG_POWER_THRE_H,
672 LTC2947_PAGE1, 2,
673 DIV_ROUND_CLOSEST(val, 200000));
674 case hwmon_power_min:
675 val = clamp_val(val, POWER_MIN, POWER_MAX);
676 return ltc2947_val_write(st, LTC2947_REG_POWER_THRE_L,
677 LTC2947_PAGE1, 2,
678 DIV_ROUND_CLOSEST(val, 200000));
679 default:
680 return -ENOTSUPP;
681 }
682}
683
684static int ltc2947_write_curr(struct device *dev, const u32 attr,
685 long val)
686{
687 struct ltc2947_data *st = dev_get_drvdata(dev);
688
689 switch (attr) {
690 case hwmon_curr_reset_history:
691 if (val != 1)
692 return -EINVAL;
693 return ltc2947_reset_history(st, LTC2947_REG_CURRENT_MAX,
694 LTC2947_REG_CURRENT_MIN);
695 case hwmon_curr_max:
696 val = clamp_val(val, CURRENT_MIN, CURRENT_MAX);
697 return ltc2947_val_write(st, LTC2947_REG_CURRENT_THRE_H,
698 LTC2947_PAGE1, 2,
699 DIV_ROUND_CLOSEST(val, 12));
700 case hwmon_curr_min:
701 val = clamp_val(val, CURRENT_MIN, CURRENT_MAX);
702 return ltc2947_val_write(st, LTC2947_REG_CURRENT_THRE_L,
703 LTC2947_PAGE1, 2,
704 DIV_ROUND_CLOSEST(val, 12));
705 default:
706 return -ENOTSUPP;
707 }
708}
709
710static int ltc2947_write_in(struct device *dev, const u32 attr, long val,
711 const int channel)
712{
713 struct ltc2947_data *st = dev_get_drvdata(dev);
714
715 if (channel > LTC2947_VOLTAGE_DVCC_CHAN) {
716 dev_err(st->dev, "Invalid chan%d for voltage", channel);
717 return -EINVAL;
718 }
719
720 switch (attr) {
721 case hwmon_in_reset_history:
722 if (val != 1)
723 return -EINVAL;
724
725 if (channel == LTC2947_VOLTAGE_DVCC_CHAN)
726 return ltc2947_reset_history(st, LTC2947_REG_DVCC_MAX,
727 LTC2947_REG_DVCC_MIN);
728
729 return ltc2947_reset_history(st, LTC2947_REG_VOLTAGE_MAX,
730 LTC2947_REG_VOLTAGE_MIN);
731 case hwmon_in_max:
732 if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
733 val = clamp_val(val, VDVCC_MIN, VDVCC_MAX);
734 return ltc2947_val_write(st, LTC2947_REG_DVCC_THRE_H,
735 LTC2947_PAGE1, 2,
736 DIV_ROUND_CLOSEST(val, 145));
737 }
738
739 val = clamp_val(val, VOLTAGE_MIN, VOLTAGE_MAX);
740 return ltc2947_val_write(st, LTC2947_REG_VOLTAGE_THRE_H,
741 LTC2947_PAGE1, 2,
742 DIV_ROUND_CLOSEST(val, 2));
743 case hwmon_in_min:
744 if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
745 val = clamp_val(val, VDVCC_MIN, VDVCC_MAX);
746 return ltc2947_val_write(st, LTC2947_REG_DVCC_THRE_L,
747 LTC2947_PAGE1, 2,
748 DIV_ROUND_CLOSEST(val, 145));
749 }
750
751 val = clamp_val(val, VOLTAGE_MIN, VOLTAGE_MAX);
752 return ltc2947_val_write(st, LTC2947_REG_VOLTAGE_THRE_L,
753 LTC2947_PAGE1, 2,
754 DIV_ROUND_CLOSEST(val, 2));
755 default:
756 return -ENOTSUPP;
757 }
758}
759
760static int ltc2947_write(struct device *dev,
761 enum hwmon_sensor_types type,
762 u32 attr, int channel, long val)
763{
764 switch (type) {
765 case hwmon_in:
766 return ltc2947_write_in(dev, attr, val, channel);
767 case hwmon_curr:
768 return ltc2947_write_curr(dev, attr, val);
769 case hwmon_power:
770 return ltc2947_write_power(dev, attr, val);
771 case hwmon_temp:
772 return ltc2947_write_temp(dev, attr, val, channel);
773 default:
774 return -ENOTSUPP;
775 }
776}
777
778static int ltc2947_read_labels(struct device *dev,
779 enum hwmon_sensor_types type,
780 u32 attr, int channel, const char **str)
781{
782 switch (type) {
783 case hwmon_in:
784 if (channel == LTC2947_VOLTAGE_DVCC_CHAN)
785 *str = "DVCC";
786 else
787 *str = "VP-VM";
788 return 0;
789 case hwmon_curr:
790 *str = "IP-IM";
791 return 0;
792 case hwmon_temp:
793 if (channel == LTC2947_TEMP_FAN_CHAN)
794 *str = "TEMPFAN";
795 else
796 *str = "Ambient";
797 return 0;
798 case hwmon_power:
799 *str = "Power";
800 return 0;
801 default:
802 return -ENOTSUPP;
803 }
804}
805
806static int ltc2947_in_is_visible(const u32 attr)
807{
808 switch (attr) {
809 case hwmon_in_input:
810 case hwmon_in_highest:
811 case hwmon_in_lowest:
812 case hwmon_in_max_alarm:
813 case hwmon_in_min_alarm:
814 case hwmon_in_label:
815 return 0444;
816 case hwmon_in_reset_history:
817 return 0200;
818 case hwmon_in_max:
819 case hwmon_in_min:
820 return 0644;
821 default:
822 return 0;
823 }
824}
825
826static int ltc2947_curr_is_visible(const u32 attr)
827{
828 switch (attr) {
829 case hwmon_curr_input:
830 case hwmon_curr_highest:
831 case hwmon_curr_lowest:
832 case hwmon_curr_max_alarm:
833 case hwmon_curr_min_alarm:
834 case hwmon_curr_label:
835 return 0444;
836 case hwmon_curr_reset_history:
837 return 0200;
838 case hwmon_curr_max:
839 case hwmon_curr_min:
840 return 0644;
841 default:
842 return 0;
843 }
844}
845
846static int ltc2947_power_is_visible(const u32 attr)
847{
848 switch (attr) {
849 case hwmon_power_input:
850 case hwmon_power_input_highest:
851 case hwmon_power_input_lowest:
852 case hwmon_power_label:
853 case hwmon_power_max_alarm:
854 case hwmon_power_min_alarm:
855 return 0444;
856 case hwmon_power_reset_history:
857 return 0200;
858 case hwmon_power_max:
859 case hwmon_power_min:
860 return 0644;
861 default:
862 return 0;
863 }
864}
865
866static int ltc2947_temp_is_visible(const u32 attr)
867{
868 switch (attr) {
869 case hwmon_temp_input:
870 case hwmon_temp_highest:
871 case hwmon_temp_lowest:
872 case hwmon_temp_max_alarm:
873 case hwmon_temp_min_alarm:
874 case hwmon_temp_label:
875 return 0444;
876 case hwmon_temp_reset_history:
877 return 0200;
878 case hwmon_temp_max:
879 case hwmon_temp_min:
880 return 0644;
881 default:
882 return 0;
883 }
884}
885
886static umode_t ltc2947_is_visible(const void *data,
887 enum hwmon_sensor_types type,
888 u32 attr, int channel)
889{
890 switch (type) {
891 case hwmon_in:
892 return ltc2947_in_is_visible(attr);
893 case hwmon_curr:
894 return ltc2947_curr_is_visible(attr);
895 case hwmon_power:
896 return ltc2947_power_is_visible(attr);
897 case hwmon_temp:
898 return ltc2947_temp_is_visible(attr);
899 default:
900 return 0;
901 }
902}
903
904static const struct hwmon_channel_info *ltc2947_info[] = {
905 HWMON_CHANNEL_INFO(in,
906 HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST |
907 HWMON_I_MAX | HWMON_I_MIN | HWMON_I_RESET_HISTORY |
908 HWMON_I_MIN_ALARM | HWMON_I_MAX_ALARM |
909 HWMON_I_LABEL,
910 HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST |
911 HWMON_I_MAX | HWMON_I_MIN | HWMON_I_RESET_HISTORY |
912 HWMON_I_MIN_ALARM | HWMON_I_MAX_ALARM |
913 HWMON_I_LABEL),
914 HWMON_CHANNEL_INFO(curr,
915 HWMON_C_INPUT | HWMON_C_LOWEST | HWMON_C_HIGHEST |
916 HWMON_C_MAX | HWMON_C_MIN | HWMON_C_RESET_HISTORY |
917 HWMON_C_MIN_ALARM | HWMON_C_MAX_ALARM |
918 HWMON_C_LABEL),
919 HWMON_CHANNEL_INFO(power,
920 HWMON_P_INPUT | HWMON_P_INPUT_LOWEST |
921 HWMON_P_INPUT_HIGHEST | HWMON_P_MAX | HWMON_P_MIN |
922 HWMON_P_RESET_HISTORY | HWMON_P_MAX_ALARM |
923 HWMON_P_MIN_ALARM | HWMON_P_LABEL),
924 HWMON_CHANNEL_INFO(temp,
925 HWMON_T_INPUT | HWMON_T_LOWEST | HWMON_T_HIGHEST |
926 HWMON_T_MAX | HWMON_T_MIN | HWMON_T_RESET_HISTORY |
927 HWMON_T_MIN_ALARM | HWMON_T_MAX_ALARM |
928 HWMON_T_LABEL,
929 HWMON_T_MAX_ALARM | HWMON_T_MIN_ALARM | HWMON_T_MAX |
930 HWMON_T_MIN | HWMON_T_LABEL),
931 NULL
932};
933
934static const struct hwmon_ops ltc2947_hwmon_ops = {
935 .is_visible = ltc2947_is_visible,
936 .read = ltc2947_read,
937 .write = ltc2947_write,
938 .read_string = ltc2947_read_labels,
939};
940
941static const struct hwmon_chip_info ltc2947_chip_info = {
942 .ops = <c2947_hwmon_ops,
943 .info = ltc2947_info,
944};
945
946
947static SENSOR_DEVICE_ATTR(energy1_input, 0444, ltc2947_show_value, NULL,
948 LTC2947_REG_ENERGY1);
949static SENSOR_DEVICE_ATTR(energy2_input, 0444, ltc2947_show_value, NULL,
950 LTC2947_REG_ENERGY2);
951
952static struct attribute *ltc2947_attrs[] = {
953 &sensor_dev_attr_energy1_input.dev_attr.attr,
954 &sensor_dev_attr_energy2_input.dev_attr.attr,
955 NULL,
956};
957ATTRIBUTE_GROUPS(ltc2947);
958
959static void ltc2947_clk_disable(void *data)
960{
961 struct clk *extclk = data;
962
963 clk_disable_unprepare(extclk);
964}
965
966static int ltc2947_setup(struct ltc2947_data *st)
967{
968 int ret;
969 struct clk *extclk;
970 u32 dummy, deadband, pol;
971 u32 accum[2];
972
973
974 ret = regmap_read(st->map, LTC2947_REG_STATUS, &dummy);
975 if (ret)
976 return ret;
977
978
979
980
981 ret = ltc2947_val_write(st, LTC2947_REG_POWER_THRE_H, LTC2947_PAGE1, 2,
982 POWER_MAX / 200000);
983 if (ret)
984 return ret;
985
986 ret = ltc2947_val_write(st, LTC2947_REG_POWER_THRE_L, LTC2947_PAGE1, 2,
987 POWER_MIN / 200000);
988 if (ret)
989 return ret;
990
991
992 extclk = devm_clk_get_optional(st->dev, NULL);
993 if (IS_ERR(extclk))
994 return dev_err_probe(st->dev, PTR_ERR(extclk),
995 "Failed to get external clock\n");
996
997 if (extclk) {
998 unsigned long rate_hz;
999 u8 pre = 0, div, tbctl;
1000 u64 aux;
1001
1002
1003 rate_hz = clk_get_rate(extclk);
1004 if (rate_hz < LTC2947_CLK_MIN || rate_hz > LTC2947_CLK_MAX) {
1005 dev_err(st->dev, "Invalid rate:%lu for external clock",
1006 rate_hz);
1007 return -EINVAL;
1008 }
1009
1010 ret = clk_prepare_enable(extclk);
1011 if (ret)
1012 return ret;
1013
1014 ret = devm_add_action_or_reset(st->dev, ltc2947_clk_disable,
1015 extclk);
1016 if (ret)
1017 return ret;
1018
1019 if (rate_hz >= LTC2947_CLK_MIN && rate_hz <= 1000000)
1020 pre = 0;
1021 else if (rate_hz > 1000000 && rate_hz <= 2000000)
1022 pre = 1;
1023 else if (rate_hz > 2000000 && rate_hz <= 4000000)
1024 pre = 2;
1025 else if (rate_hz > 4000000 && rate_hz <= 8000000)
1026 pre = 3;
1027 else if (rate_hz > 8000000 && rate_hz <= 16000000)
1028 pre = 4;
1029 else if (rate_hz > 16000000 && rate_hz <= LTC2947_CLK_MAX)
1030 pre = 5;
1031
1032
1033
1034
1035 div = rate_hz / ((1 << pre) * 32768);
1036 tbctl = LTC2947_PRE(pre) | LTC2947_DIV(div);
1037
1038 ret = regmap_write(st->map, LTC2947_REG_TBCTL, tbctl);
1039 if (ret)
1040 return ret;
1041
1042
1043
1044
1045
1046 aux = (div + 1) * ((1 << pre) * 641600000ULL);
1047 st->lsb_energy = DIV_ROUND_CLOSEST_ULL(aux, rate_hz);
1048 } else {
1049
1050 st->lsb_energy = 19890;
1051 }
1052 ret = of_property_read_u32_array(st->dev->of_node,
1053 "adi,accumulator-ctl-pol", accum,
1054 ARRAY_SIZE(accum));
1055 if (!ret) {
1056 u32 accum_reg = LTC2947_ACCUM_POL_1(accum[0]) |
1057 LTC2947_ACCUM_POL_2(accum[1]);
1058
1059 ret = regmap_write(st->map, LTC2947_REG_ACCUM_POL, accum_reg);
1060 if (ret)
1061 return ret;
1062 }
1063 ret = of_property_read_u32(st->dev->of_node,
1064 "adi,accumulation-deadband-microamp",
1065 &deadband);
1066 if (!ret) {
1067
1068 ret = regmap_write(st->map, LTC2947_REG_ACCUM_DEADBAND,
1069 deadband / (1000 * 3));
1070 if (ret)
1071 return ret;
1072 }
1073
1074 ret = of_property_read_u32(st->dev->of_node, "adi,gpio-out-pol", &pol);
1075 if (!ret) {
1076
1077 u32 gpio_ctl = LTC2947_GPIO_EN(1) | LTC2947_GPIO_FAN_EN(1) |
1078 LTC2947_GPIO_FAN_POL(pol);
1079
1080 st->gpio_out = true;
1081 ret = regmap_write(st->map, LTC2947_REG_GPIOSTATCTL, gpio_ctl);
1082 if (ret)
1083 return ret;
1084 }
1085 ret = of_property_read_u32_array(st->dev->of_node, "adi,gpio-in-accum",
1086 accum, ARRAY_SIZE(accum));
1087 if (!ret) {
1088
1089
1090
1091
1092 u32 accum_val = LTC2947_ACCUM_POL_1(accum[0]) |
1093 LTC2947_ACCUM_POL_2(accum[1]);
1094
1095 if (st->gpio_out) {
1096 dev_err(st->dev,
1097 "Cannot have input gpio config if already configured as output");
1098 return -EINVAL;
1099 }
1100
1101 ret = regmap_write(st->map, LTC2947_REG_GPIO_ACCUM, accum_val);
1102 if (ret)
1103 return ret;
1104 }
1105
1106
1107 return regmap_update_bits(st->map, LTC2947_REG_CTRL,
1108 LTC2947_CONT_MODE_MASK, LTC2947_CONT_MODE(1));
1109}
1110
1111int ltc2947_core_probe(struct regmap *map, const char *name)
1112{
1113 struct ltc2947_data *st;
1114 struct device *dev = regmap_get_device(map);
1115 struct device *hwmon;
1116 int ret;
1117
1118 st = devm_kzalloc(dev, sizeof(*st), GFP_KERNEL);
1119 if (!st)
1120 return -ENOMEM;
1121
1122 st->map = map;
1123 st->dev = dev;
1124 dev_set_drvdata(dev, st);
1125 mutex_init(&st->lock);
1126
1127 ret = ltc2947_setup(st);
1128 if (ret)
1129 return ret;
1130
1131 hwmon = devm_hwmon_device_register_with_info(dev, name, st,
1132 <c2947_chip_info,
1133 ltc2947_groups);
1134 return PTR_ERR_OR_ZERO(hwmon);
1135}
1136EXPORT_SYMBOL_GPL(ltc2947_core_probe);
1137
1138static int __maybe_unused ltc2947_resume(struct device *dev)
1139{
1140 struct ltc2947_data *st = dev_get_drvdata(dev);
1141 u32 ctrl = 0;
1142 int ret;
1143
1144
1145 ret = regmap_read(st->map, LTC2947_REG_CTRL, &ctrl);
1146 if (ret)
1147 return ret;
1148
1149
1150
1151
1152 msleep(110);
1153 ret = regmap_read(st->map, LTC2947_REG_CTRL, &ctrl);
1154 if (ret)
1155 return ret;
1156
1157 if (ctrl != 0) {
1158 dev_err(st->dev, "Device failed to wake up, ctl:%02X\n", ctrl);
1159 return -ETIMEDOUT;
1160 }
1161
1162
1163 return regmap_update_bits(st->map, LTC2947_REG_CTRL,
1164 LTC2947_CONT_MODE_MASK, LTC2947_CONT_MODE(1));
1165}
1166
1167static int __maybe_unused ltc2947_suspend(struct device *dev)
1168{
1169 struct ltc2947_data *st = dev_get_drvdata(dev);
1170
1171 return regmap_update_bits(st->map, LTC2947_REG_CTRL,
1172 LTC2947_SHUTDOWN_MASK, 1);
1173}
1174
1175SIMPLE_DEV_PM_OPS(ltc2947_pm_ops, ltc2947_suspend, ltc2947_resume);
1176EXPORT_SYMBOL_GPL(ltc2947_pm_ops);
1177
1178const struct of_device_id ltc2947_of_match[] = {
1179 { .compatible = "adi,ltc2947" },
1180 {}
1181};
1182EXPORT_SYMBOL_GPL(ltc2947_of_match);
1183MODULE_DEVICE_TABLE(of, ltc2947_of_match);
1184
1185MODULE_AUTHOR("Nuno Sa <nuno.sa@analog.com>");
1186MODULE_DESCRIPTION("LTC2947 power and energy monitor core driver");
1187MODULE_LICENSE("GPL");
1188