forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 cde9070d9970eef1f7ec2360586c802a16230ad8
kernel/drivers/hwmon/pmbus/adm1275.c
....@@ -1,19 +1,10 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Hardware monitoring driver for Analog Devices ADM1275 Hot-Swap Controller
34 * and Digital Power Monitor
45 *
56 * Copyright (c) 2011 Ericsson AB.
67 * Copyright (c) 2018 Guenter Roeck
7
- *
8
- * This program is free software; you can redistribute it and/or modify
9
- * it under the terms of the GNU General Public License as published by
10
- * the Free Software Foundation; either version 2 of the License, or
11
- * (at your option) any later version.
12
- *
13
- * This program is distributed in the hope that it will be useful,
14
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
- * GNU General Public License for more details.
178 */
189
1910 #include <linux/kernel.h>
....@@ -23,6 +14,8 @@
2314 #include <linux/slab.h>
2415 #include <linux/i2c.h>
2516 #include <linux/bitops.h>
17
+#include <linux/bitfield.h>
18
+#include <linux/log2.h>
2619 #include "pmbus.h"
2720
2821 enum chips { adm1075, adm1272, adm1275, adm1276, adm1278, adm1293, adm1294 };
....@@ -44,9 +37,12 @@
4437
4538 #define ADM1272_IRANGE BIT(0)
4639
40
+#define ADM1278_TSFILT BIT(15)
4741 #define ADM1278_TEMP1_EN BIT(3)
4842 #define ADM1278_VIN_EN BIT(2)
4943 #define ADM1278_VOUT_EN BIT(1)
44
+
45
+#define ADM1278_PMON_DEFCONFIG (ADM1278_VOUT_EN | ADM1278_TEMP1_EN | ADM1278_TSFILT)
5046
5147 #define ADM1293_IRANGE_25 0
5248 #define ADM1293_IRANGE_50 BIT(6)
....@@ -78,6 +74,18 @@
7874 #define ADM1075_VAUX_OV_WARN BIT(7)
7975 #define ADM1075_VAUX_UV_WARN BIT(6)
8076
77
+#define ADM1275_VI_AVG_SHIFT 0
78
+#define ADM1275_VI_AVG_MASK GENMASK(ADM1275_VI_AVG_SHIFT + 2, \
79
+ ADM1275_VI_AVG_SHIFT)
80
+#define ADM1275_SAMPLES_AVG_MAX 128
81
+
82
+#define ADM1278_PWR_AVG_SHIFT 11
83
+#define ADM1278_PWR_AVG_MASK GENMASK(ADM1278_PWR_AVG_SHIFT + 2, \
84
+ ADM1278_PWR_AVG_SHIFT)
85
+#define ADM1278_VI_AVG_SHIFT 8
86
+#define ADM1278_VI_AVG_MASK GENMASK(ADM1278_VI_AVG_SHIFT + 2, \
87
+ ADM1278_VI_AVG_SHIFT)
88
+
8189 struct adm1275_data {
8290 int id;
8391 bool have_oc_fault;
....@@ -89,6 +97,7 @@
8997 bool have_pin_min;
9098 bool have_pin_max;
9199 bool have_temp_max;
100
+ bool have_power_sampling;
92101 struct pmbus_driver_info info;
93102 };
94103
....@@ -164,7 +173,64 @@
164173 [18] = { 7658, 0, -3 }, /* power, 21V, irange200 */
165174 };
166175
167
-static int adm1275_read_word_data(struct i2c_client *client, int page, int reg)
176
+static int adm1275_read_pmon_config(const struct adm1275_data *data,
177
+ struct i2c_client *client, bool is_power)
178
+{
179
+ int shift, ret;
180
+ u16 mask;
181
+
182
+ /*
183
+ * The PMON configuration register is a 16-bit register only on chips
184
+ * supporting power average sampling. On other chips it is an 8-bit
185
+ * register.
186
+ */
187
+ if (data->have_power_sampling) {
188
+ ret = i2c_smbus_read_word_data(client, ADM1275_PMON_CONFIG);
189
+ mask = is_power ? ADM1278_PWR_AVG_MASK : ADM1278_VI_AVG_MASK;
190
+ shift = is_power ? ADM1278_PWR_AVG_SHIFT : ADM1278_VI_AVG_SHIFT;
191
+ } else {
192
+ ret = i2c_smbus_read_byte_data(client, ADM1275_PMON_CONFIG);
193
+ mask = ADM1275_VI_AVG_MASK;
194
+ shift = ADM1275_VI_AVG_SHIFT;
195
+ }
196
+ if (ret < 0)
197
+ return ret;
198
+
199
+ return (ret & mask) >> shift;
200
+}
201
+
202
+static int adm1275_write_pmon_config(const struct adm1275_data *data,
203
+ struct i2c_client *client,
204
+ bool is_power, u16 word)
205
+{
206
+ int shift, ret;
207
+ u16 mask;
208
+
209
+ if (data->have_power_sampling) {
210
+ ret = i2c_smbus_read_word_data(client, ADM1275_PMON_CONFIG);
211
+ mask = is_power ? ADM1278_PWR_AVG_MASK : ADM1278_VI_AVG_MASK;
212
+ shift = is_power ? ADM1278_PWR_AVG_SHIFT : ADM1278_VI_AVG_SHIFT;
213
+ } else {
214
+ ret = i2c_smbus_read_byte_data(client, ADM1275_PMON_CONFIG);
215
+ mask = ADM1275_VI_AVG_MASK;
216
+ shift = ADM1275_VI_AVG_SHIFT;
217
+ }
218
+ if (ret < 0)
219
+ return ret;
220
+
221
+ word = (ret & ~mask) | ((word << shift) & mask);
222
+ if (data->have_power_sampling)
223
+ ret = i2c_smbus_write_word_data(client, ADM1275_PMON_CONFIG,
224
+ word);
225
+ else
226
+ ret = i2c_smbus_write_byte_data(client, ADM1275_PMON_CONFIG,
227
+ word);
228
+
229
+ return ret;
230
+}
231
+
232
+static int adm1275_read_word_data(struct i2c_client *client, int page,
233
+ int phase, int reg)
168234 {
169235 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
170236 const struct adm1275_data *data = to_adm1275_data(info);
....@@ -177,58 +243,68 @@
177243 case PMBUS_IOUT_UC_FAULT_LIMIT:
178244 if (!data->have_uc_fault)
179245 return -ENXIO;
180
- ret = pmbus_read_word_data(client, 0, ADM1275_IOUT_WARN2_LIMIT);
246
+ ret = pmbus_read_word_data(client, 0, 0xff,
247
+ ADM1275_IOUT_WARN2_LIMIT);
181248 break;
182249 case PMBUS_IOUT_OC_FAULT_LIMIT:
183250 if (!data->have_oc_fault)
184251 return -ENXIO;
185
- ret = pmbus_read_word_data(client, 0, ADM1275_IOUT_WARN2_LIMIT);
252
+ ret = pmbus_read_word_data(client, 0, 0xff,
253
+ ADM1275_IOUT_WARN2_LIMIT);
186254 break;
187255 case PMBUS_VOUT_OV_WARN_LIMIT:
188256 if (data->have_vout)
189257 return -ENODATA;
190
- ret = pmbus_read_word_data(client, 0,
258
+ ret = pmbus_read_word_data(client, 0, 0xff,
191259 ADM1075_VAUX_OV_WARN_LIMIT);
192260 break;
193261 case PMBUS_VOUT_UV_WARN_LIMIT:
194262 if (data->have_vout)
195263 return -ENODATA;
196
- ret = pmbus_read_word_data(client, 0,
264
+ ret = pmbus_read_word_data(client, 0, 0xff,
197265 ADM1075_VAUX_UV_WARN_LIMIT);
198266 break;
199267 case PMBUS_READ_VOUT:
200268 if (data->have_vout)
201269 return -ENODATA;
202
- ret = pmbus_read_word_data(client, 0, ADM1075_READ_VAUX);
270
+ ret = pmbus_read_word_data(client, 0, 0xff,
271
+ ADM1075_READ_VAUX);
203272 break;
204273 case PMBUS_VIRT_READ_IOUT_MIN:
205274 if (!data->have_iout_min)
206275 return -ENXIO;
207
- ret = pmbus_read_word_data(client, 0, ADM1293_IOUT_MIN);
276
+ ret = pmbus_read_word_data(client, 0, 0xff,
277
+ ADM1293_IOUT_MIN);
208278 break;
209279 case PMBUS_VIRT_READ_IOUT_MAX:
210
- ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_IOUT);
280
+ ret = pmbus_read_word_data(client, 0, 0xff,
281
+ ADM1275_PEAK_IOUT);
211282 break;
212283 case PMBUS_VIRT_READ_VOUT_MAX:
213
- ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_VOUT);
284
+ ret = pmbus_read_word_data(client, 0, 0xff,
285
+ ADM1275_PEAK_VOUT);
214286 break;
215287 case PMBUS_VIRT_READ_VIN_MAX:
216
- ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_VIN);
288
+ ret = pmbus_read_word_data(client, 0, 0xff,
289
+ ADM1275_PEAK_VIN);
217290 break;
218291 case PMBUS_VIRT_READ_PIN_MIN:
219292 if (!data->have_pin_min)
220293 return -ENXIO;
221
- ret = pmbus_read_word_data(client, 0, ADM1293_PIN_MIN);
294
+ ret = pmbus_read_word_data(client, 0, 0xff,
295
+ ADM1293_PIN_MIN);
222296 break;
223297 case PMBUS_VIRT_READ_PIN_MAX:
224298 if (!data->have_pin_max)
225299 return -ENXIO;
226
- ret = pmbus_read_word_data(client, 0, ADM1276_PEAK_PIN);
300
+ ret = pmbus_read_word_data(client, 0, 0xff,
301
+ ADM1276_PEAK_PIN);
227302 break;
228303 case PMBUS_VIRT_READ_TEMP_MAX:
229304 if (!data->have_temp_max)
230305 return -ENXIO;
231
- ret = pmbus_read_word_data(client, 0, ADM1278_PEAK_TEMP);
306
+ ret = pmbus_read_word_data(client, 0, 0xff,
307
+ ADM1278_PEAK_TEMP);
232308 break;
233309 case PMBUS_VIRT_RESET_IOUT_HISTORY:
234310 case PMBUS_VIRT_RESET_VOUT_HISTORY:
....@@ -241,6 +317,21 @@
241317 case PMBUS_VIRT_RESET_TEMP_HISTORY:
242318 if (!data->have_temp_max)
243319 return -ENXIO;
320
+ break;
321
+ case PMBUS_VIRT_POWER_SAMPLES:
322
+ if (!data->have_power_sampling)
323
+ return -ENXIO;
324
+ ret = adm1275_read_pmon_config(data, client, true);
325
+ if (ret < 0)
326
+ break;
327
+ ret = BIT(ret);
328
+ break;
329
+ case PMBUS_VIRT_IN_SAMPLES:
330
+ case PMBUS_VIRT_CURR_SAMPLES:
331
+ ret = adm1275_read_pmon_config(data, client, false);
332
+ if (ret < 0)
333
+ break;
334
+ ret = BIT(ret);
244335 break;
245336 default:
246337 ret = -ENODATA;
....@@ -285,6 +376,19 @@
285376 break;
286377 case PMBUS_VIRT_RESET_TEMP_HISTORY:
287378 ret = pmbus_write_word_data(client, 0, ADM1278_PEAK_TEMP, 0);
379
+ break;
380
+ case PMBUS_VIRT_POWER_SAMPLES:
381
+ if (!data->have_power_sampling)
382
+ return -ENXIO;
383
+ word = clamp_val(word, 1, ADM1275_SAMPLES_AVG_MAX);
384
+ ret = adm1275_write_pmon_config(data, client, true,
385
+ ilog2(word));
386
+ break;
387
+ case PMBUS_VIRT_IN_SAMPLES:
388
+ case PMBUS_VIRT_CURR_SAMPLES:
389
+ word = clamp_val(word, 1, ADM1275_SAMPLES_AVG_MAX);
390
+ ret = adm1275_write_pmon_config(data, client, false,
391
+ ilog2(word));
288392 break;
289393 default:
290394 ret = -ENODATA;
....@@ -361,8 +465,23 @@
361465 };
362466 MODULE_DEVICE_TABLE(i2c, adm1275_id);
363467
364
-static int adm1275_probe(struct i2c_client *client,
365
- const struct i2c_device_id *id)
468
+/* Enable VOUT & TEMP1 if not enabled (disabled by default) */
469
+static int adm1275_enable_vout_temp(struct i2c_client *client, int config)
470
+{
471
+ int ret;
472
+
473
+ if ((config & ADM1278_PMON_DEFCONFIG) != ADM1278_PMON_DEFCONFIG) {
474
+ config |= ADM1278_PMON_DEFCONFIG;
475
+ ret = i2c_smbus_write_word_data(client, ADM1275_PMON_CONFIG, config);
476
+ if (ret < 0) {
477
+ dev_err(&client->dev, "Failed to enable VOUT/TEMP1 monitoring\n");
478
+ return ret;
479
+ }
480
+ }
481
+ return 0;
482
+}
483
+
484
+static int adm1275_probe(struct i2c_client *client)
366485 {
367486 s32 (*config_read_fn)(const struct i2c_client *client, u8 reg);
368487 u8 block_buffer[I2C_SMBUS_BLOCK_MAX + 1];
....@@ -374,6 +493,8 @@
374493 const struct coefficients *coefficients;
375494 int vindex = -1, voindex = -1, cindex = -1, pindex = -1;
376495 int tindex = -1;
496
+ u32 shunt;
497
+ u32 avg;
377498
378499 if (!i2c_check_functionality(client->adapter,
379500 I2C_FUNC_SMBUS_READ_BYTE_DATA
....@@ -404,10 +525,10 @@
404525 return -ENODEV;
405526 }
406527
407
- if (id->driver_data != mid->driver_data)
528
+ if (strcmp(client->name, mid->name) != 0)
408529 dev_notice(&client->dev,
409530 "Device mismatch: Configured %s, detected %s\n",
410
- id->name, mid->name);
531
+ client->name, mid->name);
411532
412533 if (mid->driver_data == adm1272 || mid->driver_data == adm1278 ||
413534 mid->driver_data == adm1293 || mid->driver_data == adm1294)
....@@ -427,6 +548,13 @@
427548 if (!data)
428549 return -ENOMEM;
429550
551
+ if (of_property_read_u32(client->dev.of_node,
552
+ "shunt-resistor-micro-ohms", &shunt))
553
+ shunt = 1000; /* 1 mOhm if not set via DT */
554
+
555
+ if (shunt == 0)
556
+ return -EINVAL;
557
+
430558 data->id = mid->driver_data;
431559
432560 info = &data->info;
....@@ -437,7 +565,8 @@
437565 info->format[PSC_CURRENT_OUT] = direct;
438566 info->format[PSC_POWER] = direct;
439567 info->format[PSC_TEMPERATURE] = direct;
440
- info->func[0] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT;
568
+ info->func[0] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
569
+ PMBUS_HAVE_SAMPLES;
441570
442571 info->read_word_data = adm1275_read_word_data;
443572 info->read_byte_data = adm1275_read_byte_data;
....@@ -478,6 +607,7 @@
478607 data->have_vout = true;
479608 data->have_pin_max = true;
480609 data->have_temp_max = true;
610
+ data->have_power_sampling = true;
481611
482612 coefficients = adm1272_coefficients;
483613 vindex = (config & ADM1275_VRANGE) ? 1 : 0;
....@@ -501,24 +631,13 @@
501631 tindex = 8;
502632
503633 info->func[0] |= PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT |
504
- PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT;
634
+ PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
635
+ PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
505636
506
- /* Enable VOUT if not enabled (it is disabled by default) */
507
- if (!(config & ADM1278_VOUT_EN)) {
508
- config |= ADM1278_VOUT_EN;
509
- ret = i2c_smbus_write_byte_data(client,
510
- ADM1275_PMON_CONFIG,
511
- config);
512
- if (ret < 0) {
513
- dev_err(&client->dev,
514
- "Failed to enable VOUT monitoring\n");
515
- return -ENODEV;
516
- }
517
- }
637
+ ret = adm1275_enable_vout_temp(client, config);
638
+ if (ret)
639
+ return ret;
518640
519
- if (config & ADM1278_TEMP1_EN)
520
- info->func[0] |=
521
- PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
522641 if (config & ADM1278_VIN_EN)
523642 info->func[0] |= PMBUS_HAVE_VIN;
524643 break;
....@@ -563,6 +682,7 @@
563682 data->have_vout = true;
564683 data->have_pin_max = true;
565684 data->have_temp_max = true;
685
+ data->have_power_sampling = true;
566686
567687 coefficients = adm1278_coefficients;
568688 vindex = 0;
....@@ -571,24 +691,13 @@
571691 tindex = 3;
572692
573693 info->func[0] |= PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT |
574
- PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT;
694
+ PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
695
+ PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
575696
576
- /* Enable VOUT if not enabled (it is disabled by default) */
577
- if (!(config & ADM1278_VOUT_EN)) {
578
- config |= ADM1278_VOUT_EN;
579
- ret = i2c_smbus_write_byte_data(client,
580
- ADM1275_PMON_CONFIG,
581
- config);
582
- if (ret < 0) {
583
- dev_err(&client->dev,
584
- "Failed to enable VOUT monitoring\n");
585
- return -ENODEV;
586
- }
587
- }
697
+ ret = adm1275_enable_vout_temp(client, config);
698
+ if (ret)
699
+ return ret;
588700
589
- if (config & ADM1278_TEMP1_EN)
590
- info->func[0] |=
591
- PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
592701 if (config & ADM1278_VIN_EN)
593702 info->func[0] |= PMBUS_HAVE_VIN;
594703 break;
....@@ -598,6 +707,7 @@
598707 data->have_pin_min = true;
599708 data->have_pin_max = true;
600709 data->have_mfr_vaux_status = true;
710
+ data->have_power_sampling = true;
601711
602712 coefficients = adm1293_coefficients;
603713
....@@ -647,6 +757,43 @@
647757 return -ENODEV;
648758 }
649759
760
+ if (data->have_power_sampling &&
761
+ of_property_read_u32(client->dev.of_node,
762
+ "adi,power-sample-average", &avg) == 0) {
763
+ if (!avg || avg > ADM1275_SAMPLES_AVG_MAX ||
764
+ BIT(__fls(avg)) != avg) {
765
+ dev_err(&client->dev,
766
+ "Invalid number of power samples");
767
+ return -EINVAL;
768
+ }
769
+ ret = adm1275_write_pmon_config(data, client, true,
770
+ ilog2(avg));
771
+ if (ret < 0) {
772
+ dev_err(&client->dev,
773
+ "Setting power sample averaging failed with error %d",
774
+ ret);
775
+ return ret;
776
+ }
777
+ }
778
+
779
+ if (of_property_read_u32(client->dev.of_node,
780
+ "adi,volt-curr-sample-average", &avg) == 0) {
781
+ if (!avg || avg > ADM1275_SAMPLES_AVG_MAX ||
782
+ BIT(__fls(avg)) != avg) {
783
+ dev_err(&client->dev,
784
+ "Invalid number of voltage/current samples");
785
+ return -EINVAL;
786
+ }
787
+ ret = adm1275_write_pmon_config(data, client, false,
788
+ ilog2(avg));
789
+ if (ret < 0) {
790
+ dev_err(&client->dev,
791
+ "Setting voltage and current sample averaging failed with error %d",
792
+ ret);
793
+ return ret;
794
+ }
795
+ }
796
+
650797 if (voindex < 0)
651798 voindex = vindex;
652799 if (vindex >= 0) {
....@@ -660,12 +807,15 @@
660807 info->R[PSC_VOLTAGE_OUT] = coefficients[voindex].R;
661808 }
662809 if (cindex >= 0) {
663
- info->m[PSC_CURRENT_OUT] = coefficients[cindex].m;
810
+ /* Scale current with sense resistor value */
811
+ info->m[PSC_CURRENT_OUT] =
812
+ coefficients[cindex].m * shunt / 1000;
664813 info->b[PSC_CURRENT_OUT] = coefficients[cindex].b;
665814 info->R[PSC_CURRENT_OUT] = coefficients[cindex].R;
666815 }
667816 if (pindex >= 0) {
668
- info->m[PSC_POWER] = coefficients[pindex].m;
817
+ info->m[PSC_POWER] =
818
+ coefficients[pindex].m * shunt / 1000;
669819 info->b[PSC_POWER] = coefficients[pindex].b;
670820 info->R[PSC_POWER] = coefficients[pindex].R;
671821 }
....@@ -675,14 +825,14 @@
675825 info->R[PSC_TEMPERATURE] = coefficients[tindex].R;
676826 }
677827
678
- return pmbus_do_probe(client, id, info);
828
+ return pmbus_do_probe(client, info);
679829 }
680830
681831 static struct i2c_driver adm1275_driver = {
682832 .driver = {
683833 .name = "adm1275",
684834 },
685
- .probe = adm1275_probe,
835
+ .probe_new = adm1275_probe,
686836 .remove = pmbus_do_remove,
687837 .id_table = adm1275_id,
688838 };