1 // SPDX-License-Identifier: GPL-2.0+
3 * IIO driver for PAC1934 Multi-Channel DC Power/Energy Monitor
5 * Copyright (C) 2017-2024 Microchip Technology Inc. and its subsidiaries
7 * Author: Bogdan Bolocan <bogdan.bolocan@microchip.com>
8 * Author: Victor Tudose
9 * Author: Marius Cristea <marius.cristea@microchip.com>
11 * Datasheet for PAC1931, PAC1932, PAC1933 and PAC1934 can be found here:
12 * https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/PAC1931-Family-Data-Sheet-DS20005850E.pdf
15 #include <linux/acpi.h>
16 #include <linux/bitfield.h>
17 #include <linux/delay.h>
18 #include <linux/device.h>
19 #include <linux/i2c.h>
20 #include <linux/iio/iio.h>
21 #include <linux/iio/sysfs.h>
22 #include <linux/unaligned.h>
25 * maximum accumulation time should be (17 * 60 * 1000) around 17 minutes@1024 sps
26 * till PAC1934 accumulation registers starts to saturate
28 #define PAC1934_MAX_RFSH_LIMIT_MS 60000
29 /* 50msec is the timeout for validity of the cached registers */
30 #define PAC1934_MIN_POLLING_TIME_MS 50
32 * 1000usec is the minimum wait time for normal conversions when sample
35 #define PAC1934_MIN_UPDATE_WAIT_TIME_US 1000
38 #define PAC1934_VOLTAGE_MILLIVOLTS_MAX 32000
39 /* voltage bits resolution when set for unsigned values */
40 #define PAC1934_VOLTAGE_U_RES 16
41 /* voltage bits resolution when set for signed values */
42 #define PAC1934_VOLTAGE_S_RES 15
45 * max signed value that can be stored on 32 bits and 8 digits fractional value
46 * (2^31 - 1) * 10^8 + 99999999
48 #define PAC_193X_MAX_POWER_ACC 214748364799999999LL
50 * min signed value that can be stored on 32 bits and 8 digits fractional value
51 * -(2^31) * 10^8 - 99999999
53 #define PAC_193X_MIN_POWER_ACC -214748364899999999LL
55 #define PAC1934_MAX_NUM_CHANNELS 4
57 #define PAC1934_MEAS_REG_LEN 76
58 #define PAC1934_CTRL_REG_LEN 12
60 #define PAC1934_DEFAULT_CHIP_SAMP_SPEED_HZ 1024
63 #define PAC1934_REFRESH_REG_ADDR 0x00
64 #define PAC1934_CTRL_REG_ADDR 0x01
65 #define PAC1934_ACC_COUNT_REG_ADDR 0x02
66 #define PAC1934_VPOWER_ACC_1_ADDR 0x03
67 #define PAC1934_VPOWER_ACC_2_ADDR 0x04
68 #define PAC1934_VPOWER_ACC_3_ADDR 0x05
69 #define PAC1934_VPOWER_ACC_4_ADDR 0x06
70 #define PAC1934_VBUS_1_ADDR 0x07
71 #define PAC1934_VBUS_2_ADDR 0x08
72 #define PAC1934_VBUS_3_ADDR 0x09
73 #define PAC1934_VBUS_4_ADDR 0x0A
74 #define PAC1934_VSENSE_1_ADDR 0x0B
75 #define PAC1934_VSENSE_2_ADDR 0x0C
76 #define PAC1934_VSENSE_3_ADDR 0x0D
77 #define PAC1934_VSENSE_4_ADDR 0x0E
78 #define PAC1934_VBUS_AVG_1_ADDR 0x0F
79 #define PAC1934_VBUS_AVG_2_ADDR 0x10
80 #define PAC1934_VBUS_AVG_3_ADDR 0x11
81 #define PAC1934_VBUS_AVG_4_ADDR 0x12
82 #define PAC1934_VSENSE_AVG_1_ADDR 0x13
83 #define PAC1934_VSENSE_AVG_2_ADDR 0x14
84 #define PAC1934_VSENSE_AVG_3_ADDR 0x15
85 #define PAC1934_VSENSE_AVG_4_ADDR 0x16
86 #define PAC1934_VPOWER_1_ADDR 0x17
87 #define PAC1934_VPOWER_2_ADDR 0x18
88 #define PAC1934_VPOWER_3_ADDR 0x19
89 #define PAC1934_VPOWER_4_ADDR 0x1A
90 #define PAC1934_REFRESH_V_REG_ADDR 0x1F
91 #define PAC1934_CTRL_STAT_REGS_ADDR 0x1C
92 #define PAC1934_PID_REG_ADDR 0xFD
93 #define PAC1934_MID_REG_ADDR 0xFE
94 #define PAC1934_RID_REG_ADDR 0xFF
96 /* PRODUCT ID REGISTER + MANUFACTURER ID REGISTER + REVISION ID REGISTER */
97 #define PAC1934_ID_REG_LEN 3
98 #define PAC1934_PID_IDX 0
99 #define PAC1934_MID_IDX 1
100 #define PAC1934_RID_IDX 2
102 #define PAC1934_ACPI_GET_NAMES_AND_MOHMS_VALS 1
103 #define PAC1934_ACPI_GET_UOHMS_VALS 2
104 #define PAC1934_ACPI_GET_BIPOLAR_SETTINGS 4
105 #define PAC1934_ACPI_GET_SAMP 5
107 #define PAC1934_SAMPLE_RATE_SHIFT 6
109 #define PAC1934_VBUS_SENSE_REG_LEN 2
110 #define PAC1934_ACC_REG_LEN 3
111 #define PAC1934_VPOWER_REG_LEN 4
112 #define PAC1934_VPOWER_ACC_REG_LEN 6
113 #define PAC1934_MAX_REGISTER_LENGTH 6
115 #define PAC1934_CUSTOM_ATTR_FOR_CHANNEL 1
118 * relative offsets when using multi-byte reads/writes even though these
119 * bytes are read one after the other, they are not at adjacent memory
120 * locations within the I2C memory map. The chip can skip some addresses
122 #define PAC1934_CHANNEL_DIS_REG_OFF 0
123 #define PAC1934_NEG_PWR_REG_OFF 1
126 * when reading/writing multiple bytes from offset PAC1934_CHANNEL_DIS_REG_OFF,
127 * the chip jumps over the 0x1E (REFRESH_G) and 0x1F (REFRESH_V) offsets
129 #define PAC1934_SLOW_REG_OFF 2
130 #define PAC1934_CTRL_ACT_REG_OFF 3
131 #define PAC1934_CHANNEL_DIS_ACT_REG_OFF 4
132 #define PAC1934_NEG_PWR_ACT_REG_OFF 5
133 #define PAC1934_CTRL_LAT_REG_OFF 6
134 #define PAC1934_CHANNEL_DIS_LAT_REG_OFF 7
135 #define PAC1934_NEG_PWR_LAT_REG_OFF 8
136 #define PAC1934_PID_REG_OFF 9
137 #define PAC1934_MID_REG_OFF 10
138 #define PAC1934_REV_REG_OFF 11
139 #define PAC1934_CTRL_STATUS_INFO_LEN 12
141 #define PAC1934_MID 0x5D
142 #define PAC1931_PID 0x58
143 #define PAC1932_PID 0x59
144 #define PAC1933_PID 0x5A
145 #define PAC1934_PID 0x5B
147 /* Scale constant = (10^3 * 3.2 * 10^9 / 2^28) for mili Watt-second */
148 #define PAC1934_SCALE_CONSTANT 11921
150 #define PAC1934_MAX_VPOWER_RSHIFTED_BY_28B 11921
151 #define PAC1934_MAX_VSENSE_RSHIFTED_BY_16B 1525
153 #define PAC1934_DEV_ATTR(name) (&iio_dev_attr_##name.dev_attr.attr)
155 #define PAC1934_CRTL_SAMPLE_RATE_MASK GENMASK(7, 6)
156 #define PAC1934_CHAN_SLEEP_MASK BIT(5)
157 #define PAC1934_CHAN_SLEEP_SET BIT(5)
158 #define PAC1934_CHAN_SINGLE_MASK BIT(4)
159 #define PAC1934_CHAN_SINGLE_SHOT_SET BIT(4)
160 #define PAC1934_CHAN_ALERT_MASK BIT(3)
161 #define PAC1934_CHAN_ALERT_EN BIT(3)
162 #define PAC1934_CHAN_ALERT_CC_MASK BIT(2)
163 #define PAC1934_CHAN_ALERT_CC_EN BIT(2)
164 #define PAC1934_CHAN_OVF_ALERT_MASK BIT(1)
165 #define PAC1934_CHAN_OVF_ALERT_EN BIT(1)
166 #define PAC1934_CHAN_OVF_MASK BIT(0)
168 #define PAC1934_CHAN_DIS_CH1_OFF_MASK BIT(7)
169 #define PAC1934_CHAN_DIS_CH2_OFF_MASK BIT(6)
170 #define PAC1934_CHAN_DIS_CH3_OFF_MASK BIT(5)
171 #define PAC1934_CHAN_DIS_CH4_OFF_MASK BIT(4)
172 #define PAC1934_SMBUS_TIMEOUT_MASK BIT(3)
173 #define PAC1934_SMBUS_BYTECOUNT_MASK BIT(2)
174 #define PAC1934_SMBUS_NO_SKIP_MASK BIT(1)
176 #define PAC1934_NEG_PWR_CH1_BIDI_MASK BIT(7)
177 #define PAC1934_NEG_PWR_CH2_BIDI_MASK BIT(6)
178 #define PAC1934_NEG_PWR_CH3_BIDI_MASK BIT(5)
179 #define PAC1934_NEG_PWR_CH4_BIDI_MASK BIT(4)
180 #define PAC1934_NEG_PWR_CH1_BIDV_MASK BIT(3)
181 #define PAC1934_NEG_PWR_CH2_BIDV_MASK BIT(2)
182 #define PAC1934_NEG_PWR_CH3_BIDV_MASK BIT(1)
183 #define PAC1934_NEG_PWR_CH4_BIDV_MASK BIT(0)
186 * Universal Unique Identifier (UUID),
187 * 033771E0-1705-47B4-9535-D1BBE14D9A09,
188 * is reserved to Microchip for the PAC1934.
190 #define PAC1934_DSM_UUID "033771E0-1705-47B4-9535-D1BBE14D9A09"
200 PAC1934_SAMP_1024SPS
,
207 * these indexes are exactly describing the element order within a single
208 * PAC1934 phys channel IIO channel descriptor; see the static const struct
209 * iio_chan_spec pac1934_single_channel[] declaration
211 enum pac1934_ch_idx
{
216 PAC1934_CH_VOLTAGE_AVERAGE
,
217 PAC1934_CH_CURRENT_AVERAGE
221 * struct pac1934_features - features of a pac1934 instance
222 * @phys_channels: number of physical channels supported by the chip
225 struct pac1934_features
{
230 static const unsigned int samp_rate_map_tbl
[] = {
231 [PAC1934_SAMP_1024SPS
] = 1024,
232 [PAC1934_SAMP_256SPS
] = 256,
233 [PAC1934_SAMP_64SPS
] = 64,
234 [PAC1934_SAMP_8SPS
] = 8,
237 static const struct pac1934_features pac1934_chip_config
[] = {
257 * struct reg_data - data from the registers
258 * @meas_regs: snapshot of raw measurements registers
259 * @ctrl_regs: snapshot of control registers
260 * @energy_sec_acc: snapshot of energy values
261 * @vpower_acc: accumulated vpower values
262 * @vpower: snapshot of vpower registers
263 * @vbus: snapshot of vbus registers
264 * @vbus_avg: averages of vbus registers
265 * @vsense: snapshot of vsense registers
266 * @vsense_avg: averages of vsense registers
267 * @num_enabled_channels: count of how many chip channels are currently enabled
270 u8 meas_regs
[PAC1934_MEAS_REG_LEN
];
271 u8 ctrl_regs
[PAC1934_CTRL_REG_LEN
];
272 s64 energy_sec_acc
[PAC1934_MAX_NUM_CHANNELS
];
273 s64 vpower_acc
[PAC1934_MAX_NUM_CHANNELS
];
274 s32 vpower
[PAC1934_MAX_NUM_CHANNELS
];
275 s32 vbus
[PAC1934_MAX_NUM_CHANNELS
];
276 s32 vbus_avg
[PAC1934_MAX_NUM_CHANNELS
];
277 s32 vsense
[PAC1934_MAX_NUM_CHANNELS
];
278 s32 vsense_avg
[PAC1934_MAX_NUM_CHANNELS
];
279 u8 num_enabled_channels
;
283 * struct pac1934_chip_info - information about the chip
284 * @client: the i2c-client attached to the device
285 * @lock: synchronize access to driver's state members
286 * @work_chip_rfsh: work queue used for refresh commands
287 * @phys_channels: phys channels count
288 * @active_channels: array of values, true means that channel is active
289 * @enable_energy: array of values, true means that channel energy is measured
290 * @bi_dir: array of bools, true means that channel is bidirectional
291 * @chip_variant: chip variant
292 * @chip_revision: chip revision
294 * @chip_reg_data: chip reg data
295 * @sample_rate_value: sampling frequency
296 * @labels: table with channels labels
297 * @iio_info: iio_info
298 * @tstamp: chip's uptime
300 struct pac1934_chip_info
{
301 struct i2c_client
*client
;
302 struct mutex lock
; /* synchronize access to driver's state members */
303 struct delayed_work work_chip_rfsh
;
305 bool active_channels
[PAC1934_MAX_NUM_CHANNELS
];
306 bool enable_energy
[PAC1934_MAX_NUM_CHANNELS
];
307 bool bi_dir
[PAC1934_MAX_NUM_CHANNELS
];
310 u32 shunts
[PAC1934_MAX_NUM_CHANNELS
];
311 struct reg_data chip_reg_data
;
312 s32 sample_rate_value
;
313 char *labels
[PAC1934_MAX_NUM_CHANNELS
];
314 struct iio_info iio_info
;
315 unsigned long tstamp
;
318 #define TO_PAC1934_CHIP_INFO(d) container_of(d, struct pac1934_chip_info, work_chip_rfsh)
320 #define PAC1934_VPOWER_ACC_CHANNEL(_index, _si, _address) { \
321 .type = IIO_ENERGY, \
322 .address = (_address), \
324 .channel = (_index), \
325 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
326 BIT(IIO_CHAN_INFO_SCALE) | \
327 BIT(IIO_CHAN_INFO_ENABLE), \
328 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
329 .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
330 .scan_index = (_si), \
335 .endianness = IIO_CPU, \
339 #define PAC1934_VBUS_CHANNEL(_index, _si, _address) { \
340 .type = IIO_VOLTAGE, \
341 .address = (_address), \
343 .channel = (_index), \
344 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
345 BIT(IIO_CHAN_INFO_SCALE), \
346 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
347 .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
348 .scan_index = (_si), \
353 .endianness = IIO_CPU, \
357 #define PAC1934_VBUS_AVG_CHANNEL(_index, _si, _address) { \
358 .type = IIO_VOLTAGE, \
359 .address = (_address), \
361 .channel = (_index), \
362 .info_mask_separate = BIT(IIO_CHAN_INFO_AVERAGE_RAW) | \
363 BIT(IIO_CHAN_INFO_SCALE), \
364 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
365 .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
366 .scan_index = (_si), \
371 .endianness = IIO_CPU, \
375 #define PAC1934_VSENSE_CHANNEL(_index, _si, _address) { \
376 .type = IIO_CURRENT, \
377 .address = (_address), \
379 .channel = (_index), \
380 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
381 BIT(IIO_CHAN_INFO_SCALE), \
382 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
383 .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
384 .scan_index = (_si), \
389 .endianness = IIO_CPU, \
393 #define PAC1934_VSENSE_AVG_CHANNEL(_index, _si, _address) { \
394 .type = IIO_CURRENT, \
395 .address = (_address), \
397 .channel = (_index), \
398 .info_mask_separate = BIT(IIO_CHAN_INFO_AVERAGE_RAW) | \
399 BIT(IIO_CHAN_INFO_SCALE), \
400 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
401 .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
402 .scan_index = (_si), \
407 .endianness = IIO_CPU, \
411 #define PAC1934_VPOWER_CHANNEL(_index, _si, _address) { \
413 .address = (_address), \
415 .channel = (_index), \
416 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
417 BIT(IIO_CHAN_INFO_SCALE), \
418 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
419 .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
420 .scan_index = (_si), \
426 .endianness = IIO_CPU, \
430 static const struct iio_chan_spec pac1934_single_channel
[] = {
431 PAC1934_VPOWER_ACC_CHANNEL(0, 0, PAC1934_VPOWER_ACC_1_ADDR
),
432 PAC1934_VPOWER_CHANNEL(0, 0, PAC1934_VPOWER_1_ADDR
),
433 PAC1934_VBUS_CHANNEL(0, 0, PAC1934_VBUS_1_ADDR
),
434 PAC1934_VSENSE_CHANNEL(0, 0, PAC1934_VSENSE_1_ADDR
),
435 PAC1934_VBUS_AVG_CHANNEL(0, 0, PAC1934_VBUS_AVG_1_ADDR
),
436 PAC1934_VSENSE_AVG_CHANNEL(0, 0, PAC1934_VSENSE_AVG_1_ADDR
),
439 /* Low-level I2c functions used to transfer up to 76 bytes at once */
440 static int pac1934_i2c_read(struct i2c_client
*client
, u8 reg_addr
,
441 void *databuf
, u8 len
)
444 struct i2c_msg msgs
[2] = {
446 .addr
= client
->addr
,
448 .buf
= (u8
*)®_addr
,
451 .addr
= client
->addr
,
458 ret
= i2c_transfer(client
->adapter
, msgs
, ARRAY_SIZE(msgs
));
465 static int pac1934_get_samp_rate_idx(struct pac1934_chip_info
*info
,
470 for (cnt
= 0; cnt
< ARRAY_SIZE(samp_rate_map_tbl
); cnt
++)
471 if (new_samp_rate
== samp_rate_map_tbl
[cnt
])
474 /* not a valid sample rate value */
478 static ssize_t
pac1934_shunt_value_show(struct device
*dev
,
479 struct device_attribute
*attr
,
482 struct iio_dev
*indio_dev
= dev_to_iio_dev(dev
);
483 struct pac1934_chip_info
*info
= iio_priv(indio_dev
);
484 struct iio_dev_attr
*this_attr
= to_iio_dev_attr(attr
);
486 return sysfs_emit(buf
, "%u\n", info
->shunts
[this_attr
->address
]);
489 static ssize_t
pac1934_shunt_value_store(struct device
*dev
,
490 struct device_attribute
*attr
,
491 const char *buf
, size_t count
)
493 struct iio_dev
*indio_dev
= dev_to_iio_dev(dev
);
494 struct pac1934_chip_info
*info
= iio_priv(indio_dev
);
495 struct iio_dev_attr
*this_attr
= to_iio_dev_attr(attr
);
498 if (kstrtouint(buf
, 10, &sh_val
)) {
499 dev_err(dev
, "Shunt value is not valid\n");
503 scoped_guard(mutex
, &info
->lock
)
504 info
->shunts
[this_attr
->address
] = sh_val
;
509 static int pac1934_read_avail(struct iio_dev
*indio_dev
,
510 struct iio_chan_spec
const *channel
,
511 const int **vals
, int *type
, int *length
, long mask
)
514 case IIO_CHAN_INFO_SAMP_FREQ
:
516 *vals
= samp_rate_map_tbl
;
517 *length
= ARRAY_SIZE(samp_rate_map_tbl
);
518 return IIO_AVAIL_LIST
;
524 static int pac1934_send_refresh(struct pac1934_chip_info
*info
,
525 u8 refresh_cmd
, u32 wait_time
)
527 /* this function only sends REFRESH or REFRESH_V */
528 struct i2c_client
*client
= info
->client
;
531 bool revision_bug
= false;
533 if (info
->chip_revision
== 2 || info
->chip_revision
== 3) {
535 * chip rev 2 and 3 bug workaround
536 * see: PAC1934 Family Data Sheet Errata DS80000836A.pdf
541 FIELD_PREP(PAC1934_NEG_PWR_CH1_BIDI_MASK
, info
->bi_dir
[0]) |
542 FIELD_PREP(PAC1934_NEG_PWR_CH2_BIDI_MASK
, info
->bi_dir
[1]) |
543 FIELD_PREP(PAC1934_NEG_PWR_CH3_BIDI_MASK
, info
->bi_dir
[2]) |
544 FIELD_PREP(PAC1934_NEG_PWR_CH4_BIDI_MASK
, info
->bi_dir
[3]) |
545 FIELD_PREP(PAC1934_NEG_PWR_CH1_BIDV_MASK
, info
->bi_dir
[0]) |
546 FIELD_PREP(PAC1934_NEG_PWR_CH2_BIDV_MASK
, info
->bi_dir
[1]) |
547 FIELD_PREP(PAC1934_NEG_PWR_CH3_BIDV_MASK
, info
->bi_dir
[2]) |
548 FIELD_PREP(PAC1934_NEG_PWR_CH4_BIDV_MASK
, info
->bi_dir
[3]);
550 ret
= i2c_smbus_write_byte_data(client
,
551 PAC1934_CTRL_STAT_REGS_ADDR
+
552 PAC1934_NEG_PWR_REG_OFF
,
558 ret
= i2c_smbus_write_byte(client
, refresh_cmd
);
560 dev_err(&client
->dev
, "%s - cannot send 0x%02X\n",
561 __func__
, refresh_cmd
);
567 * chip rev 2 and 3 bug workaround - write again the same
568 * register write the updated registers back
570 ret
= i2c_smbus_write_byte_data(client
,
571 PAC1934_CTRL_STAT_REGS_ADDR
+
572 PAC1934_NEG_PWR_REG_OFF
, bidir_reg
);
577 /* register data retrieval timestamp */
578 info
->tstamp
= jiffies
;
580 /* wait till the data is available */
581 usleep_range(wait_time
, wait_time
+ 100);
586 static int pac1934_reg_snapshot(struct pac1934_chip_info
*info
,
587 bool do_refresh
, u8 refresh_cmd
, u32 wait_time
)
590 struct i2c_client
*client
= info
->client
;
591 u8 samp_shift
, ctrl_regs_tmp
;
592 u8
*offset_reg_data_p
;
594 u32 samp_rate
, cnt
, tmp
;
595 s64 curr_energy
, inc
;
597 struct reg_data
*reg_data
;
599 guard(mutex
)(&info
->lock
);
602 ret
= pac1934_send_refresh(info
, refresh_cmd
, wait_time
);
604 dev_err(&client
->dev
,
605 "%s - cannot send refresh\n",
611 ret
= i2c_smbus_read_i2c_block_data(client
, PAC1934_CTRL_STAT_REGS_ADDR
,
612 PAC1934_CTRL_REG_LEN
,
613 (u8
*)info
->chip_reg_data
.ctrl_regs
);
615 dev_err(&client
->dev
,
616 "%s - cannot read ctrl/status registers\n",
621 reg_data
= &info
->chip_reg_data
;
623 /* read the data registers */
624 ret
= pac1934_i2c_read(client
, PAC1934_ACC_COUNT_REG_ADDR
,
625 (u8
*)reg_data
->meas_regs
, PAC1934_MEAS_REG_LEN
);
627 dev_err(&client
->dev
,
628 "%s - cannot read ACC_COUNT register: %d:%d\n",
629 __func__
, ret
, PAC1934_MEAS_REG_LEN
);
633 /* see how much shift is required by the sample rate */
634 samp_rate
= samp_rate_map_tbl
[((reg_data
->ctrl_regs
[PAC1934_CTRL_LAT_REG_OFF
]) >> 6)];
635 samp_shift
= get_count_order(samp_rate
);
637 ctrl_regs_tmp
= reg_data
->ctrl_regs
[PAC1934_CHANNEL_DIS_LAT_REG_OFF
];
638 offset_reg_data_p
= ®_data
->meas_regs
[PAC1934_ACC_REG_LEN
];
640 /* start with VPOWER_ACC */
641 for (cnt
= 0; cnt
< info
->phys_channels
; cnt
++) {
642 /* check if the channel is active, skip all fields if disabled */
643 if ((ctrl_regs_tmp
<< cnt
) & 0x80)
646 /* skip if the energy accumulation is disabled */
647 if (info
->enable_energy
[cnt
]) {
648 curr_energy
= info
->chip_reg_data
.energy_sec_acc
[cnt
];
650 tmp_energy
= get_unaligned_be48(offset_reg_data_p
);
652 if (info
->bi_dir
[cnt
])
653 reg_data
->vpower_acc
[cnt
] = sign_extend64(tmp_energy
, 47);
655 reg_data
->vpower_acc
[cnt
] = tmp_energy
;
658 * compute the scaled to 1 second accumulated energy value;
659 * energy accumulator scaled to 1sec = VPOWER_ACC/2^samp_shift
660 * the chip's sampling rate is 2^samp_shift samples/sec
662 inc
= (reg_data
->vpower_acc
[cnt
] >> samp_shift
);
664 /* add the power_acc field */
667 clamp(curr_energy
, PAC_193X_MIN_POWER_ACC
, PAC_193X_MAX_POWER_ACC
);
669 reg_data
->energy_sec_acc
[cnt
] = curr_energy
;
672 offset_reg_data_p
+= PAC1934_VPOWER_ACC_REG_LEN
;
675 /* continue with VBUS */
676 for (cnt
= 0; cnt
< info
->phys_channels
; cnt
++) {
677 if ((ctrl_regs_tmp
<< cnt
) & 0x80)
680 tmp_value
= get_unaligned_be16(offset_reg_data_p
);
682 if (info
->bi_dir
[cnt
])
683 reg_data
->vbus
[cnt
] = sign_extend32((u32
)(tmp_value
), 15);
685 reg_data
->vbus
[cnt
] = tmp_value
;
687 offset_reg_data_p
+= PAC1934_VBUS_SENSE_REG_LEN
;
691 for (cnt
= 0; cnt
< info
->phys_channels
; cnt
++) {
692 if ((ctrl_regs_tmp
<< cnt
) & 0x80)
695 tmp_value
= get_unaligned_be16(offset_reg_data_p
);
697 if (info
->bi_dir
[cnt
])
698 reg_data
->vsense
[cnt
] = sign_extend32((u32
)(tmp_value
), 15);
700 reg_data
->vsense
[cnt
] = tmp_value
;
702 offset_reg_data_p
+= PAC1934_VBUS_SENSE_REG_LEN
;
706 for (cnt
= 0; cnt
< info
->phys_channels
; cnt
++) {
707 if ((ctrl_regs_tmp
<< cnt
) & 0x80)
710 tmp_value
= get_unaligned_be16(offset_reg_data_p
);
712 if (info
->bi_dir
[cnt
])
713 reg_data
->vbus_avg
[cnt
] = sign_extend32((u32
)(tmp_value
), 15);
715 reg_data
->vbus_avg
[cnt
] = tmp_value
;
717 offset_reg_data_p
+= PAC1934_VBUS_SENSE_REG_LEN
;
721 for (cnt
= 0; cnt
< info
->phys_channels
; cnt
++) {
722 if ((ctrl_regs_tmp
<< cnt
) & 0x80)
725 tmp_value
= get_unaligned_be16(offset_reg_data_p
);
727 if (info
->bi_dir
[cnt
])
728 reg_data
->vsense_avg
[cnt
] = sign_extend32((u32
)(tmp_value
), 15);
730 reg_data
->vsense_avg
[cnt
] = tmp_value
;
732 offset_reg_data_p
+= PAC1934_VBUS_SENSE_REG_LEN
;
736 for (cnt
= 0; cnt
< info
->phys_channels
; cnt
++) {
737 if ((ctrl_regs_tmp
<< cnt
) & 0x80)
740 tmp
= get_unaligned_be32(offset_reg_data_p
) >> 4;
742 if (info
->bi_dir
[cnt
])
743 reg_data
->vpower
[cnt
] = sign_extend32(tmp
, 27);
745 reg_data
->vpower
[cnt
] = tmp
;
747 offset_reg_data_p
+= PAC1934_VPOWER_REG_LEN
;
753 static int pac1934_retrieve_data(struct pac1934_chip_info
*info
,
759 * check if the minimal elapsed time has passed and if so,
760 * re-read the chip, otherwise the cached info is just fine
762 if (time_after(jiffies
, info
->tstamp
+ msecs_to_jiffies(PAC1934_MIN_POLLING_TIME_MS
))) {
763 ret
= pac1934_reg_snapshot(info
, true, PAC1934_REFRESH_REG_ADDR
,
767 * Re-schedule the work for the read registers on timeout
768 * (to prevent chip registers saturation)
770 mod_delayed_work(system_wq
, &info
->work_chip_rfsh
,
771 msecs_to_jiffies(PAC1934_MAX_RFSH_LIMIT_MS
));
777 static int pac1934_read_raw(struct iio_dev
*indio_dev
,
778 struct iio_chan_spec
const *chan
, int *val
,
779 int *val2
, long mask
)
781 struct pac1934_chip_info
*info
= iio_priv(indio_dev
);
783 int ret
, channel
= chan
->channel
- 1;
786 * For AVG the index should be between 5 to 8.
787 * To calculate PAC1934_CH_VOLTAGE_AVERAGE,
788 * respectively PAC1934_CH_CURRENT real index, we need
789 * to remove the added offset (PAC1934_MAX_NUM_CHANNELS).
791 if (channel
>= PAC1934_MAX_NUM_CHANNELS
)
792 channel
= channel
- PAC1934_MAX_NUM_CHANNELS
;
794 ret
= pac1934_retrieve_data(info
, PAC1934_MIN_UPDATE_WAIT_TIME_US
);
799 case IIO_CHAN_INFO_RAW
:
800 switch (chan
->type
) {
802 *val
= info
->chip_reg_data
.vbus
[channel
];
805 *val
= info
->chip_reg_data
.vsense
[channel
];
808 *val
= info
->chip_reg_data
.vpower
[channel
];
811 curr_energy
= info
->chip_reg_data
.energy_sec_acc
[channel
];
812 *val
= (u32
)curr_energy
;
813 *val2
= (u32
)(curr_energy
>> 32);
814 return IIO_VAL_INT_64
;
818 case IIO_CHAN_INFO_AVERAGE_RAW
:
819 switch (chan
->type
) {
821 *val
= info
->chip_reg_data
.vbus_avg
[channel
];
824 *val
= info
->chip_reg_data
.vsense_avg
[channel
];
829 case IIO_CHAN_INFO_SCALE
:
830 switch (chan
->address
) {
831 /* Voltages - scale for millivolts */
832 case PAC1934_VBUS_1_ADDR
:
833 case PAC1934_VBUS_2_ADDR
:
834 case PAC1934_VBUS_3_ADDR
:
835 case PAC1934_VBUS_4_ADDR
:
836 case PAC1934_VBUS_AVG_1_ADDR
:
837 case PAC1934_VBUS_AVG_2_ADDR
:
838 case PAC1934_VBUS_AVG_3_ADDR
:
839 case PAC1934_VBUS_AVG_4_ADDR
:
840 *val
= PAC1934_VOLTAGE_MILLIVOLTS_MAX
;
841 if (chan
->scan_type
.sign
== 'u')
842 *val2
= PAC1934_VOLTAGE_U_RES
;
844 *val2
= PAC1934_VOLTAGE_S_RES
;
845 return IIO_VAL_FRACTIONAL_LOG2
;
847 * Currents - scale for mA - depends on the
848 * channel's shunt value
849 * (100mV * 1000000) / (2^16 * shunt(uohm))
851 case PAC1934_VSENSE_1_ADDR
:
852 case PAC1934_VSENSE_2_ADDR
:
853 case PAC1934_VSENSE_3_ADDR
:
854 case PAC1934_VSENSE_4_ADDR
:
855 case PAC1934_VSENSE_AVG_1_ADDR
:
856 case PAC1934_VSENSE_AVG_2_ADDR
:
857 case PAC1934_VSENSE_AVG_3_ADDR
:
858 case PAC1934_VSENSE_AVG_4_ADDR
:
859 *val
= PAC1934_MAX_VSENSE_RSHIFTED_BY_16B
;
860 if (chan
->scan_type
.sign
== 'u')
861 *val2
= info
->shunts
[channel
];
863 *val2
= info
->shunts
[channel
] >> 1;
864 return IIO_VAL_FRACTIONAL
;
866 * Power - uW - it will use the combined scale
867 * for current and voltage
868 * current(mA) * voltage(mV) = power (uW)
870 case PAC1934_VPOWER_1_ADDR
:
871 case PAC1934_VPOWER_2_ADDR
:
872 case PAC1934_VPOWER_3_ADDR
:
873 case PAC1934_VPOWER_4_ADDR
:
874 *val
= PAC1934_MAX_VPOWER_RSHIFTED_BY_28B
;
875 if (chan
->scan_type
.sign
== 'u')
876 *val2
= info
->shunts
[channel
];
878 *val2
= info
->shunts
[channel
] >> 1;
879 return IIO_VAL_FRACTIONAL
;
880 case PAC1934_VPOWER_ACC_1_ADDR
:
881 case PAC1934_VPOWER_ACC_2_ADDR
:
882 case PAC1934_VPOWER_ACC_3_ADDR
:
883 case PAC1934_VPOWER_ACC_4_ADDR
:
885 * expresses the 32 bit scale value here compute
886 * the scale for energy (miliWatt-second or miliJoule)
888 *val
= PAC1934_SCALE_CONSTANT
;
890 if (chan
->scan_type
.sign
== 'u')
891 *val2
= info
->shunts
[channel
];
893 *val2
= info
->shunts
[channel
] >> 1;
894 return IIO_VAL_FRACTIONAL
;
898 case IIO_CHAN_INFO_SAMP_FREQ
:
899 *val
= info
->sample_rate_value
;
901 case IIO_CHAN_INFO_ENABLE
:
902 *val
= info
->enable_energy
[channel
];
909 static int pac1934_write_raw(struct iio_dev
*indio_dev
, struct iio_chan_spec
const *chan
,
910 int val
, int val2
, long mask
)
912 struct pac1934_chip_info
*info
= iio_priv(indio_dev
);
913 struct i2c_client
*client
= info
->client
;
919 case IIO_CHAN_INFO_SAMP_FREQ
:
920 ret
= pac1934_get_samp_rate_idx(info
, val
);
924 /* write the new sampling value and trigger a snapshot(incl refresh) */
925 scoped_guard(mutex
, &info
->lock
) {
926 ctrl_reg
= FIELD_PREP(PAC1934_CRTL_SAMPLE_RATE_MASK
, ret
);
927 ret
= i2c_smbus_write_byte_data(client
, PAC1934_CTRL_REG_ADDR
, ctrl_reg
);
929 dev_err(&client
->dev
,
930 "%s - can't update sample rate\n",
936 old_samp_rate
= info
->sample_rate_value
;
937 info
->sample_rate_value
= val
;
940 * now, force a snapshot with refresh - call retrieve
941 * data in order to update the refresh timer
942 * alter the timestamp in order to force trigger a
943 * register snapshot and a timestamp update
945 info
->tstamp
-= msecs_to_jiffies(PAC1934_MIN_POLLING_TIME_MS
);
946 ret
= pac1934_retrieve_data(info
, (1024 / old_samp_rate
) * 1000);
948 dev_err(&client
->dev
,
949 "%s - cannot snapshot ctrl and measurement regs\n",
955 case IIO_CHAN_INFO_ENABLE
:
956 scoped_guard(mutex
, &info
->lock
) {
957 info
->enable_energy
[chan
->channel
- 1] = val
? true : false;
959 info
->chip_reg_data
.energy_sec_acc
[chan
->channel
- 1] = 0;
968 static int pac1934_read_label(struct iio_dev
*indio_dev
,
969 struct iio_chan_spec
const *chan
, char *label
)
971 struct pac1934_chip_info
*info
= iio_priv(indio_dev
);
973 switch (chan
->address
) {
974 case PAC1934_VBUS_1_ADDR
:
975 case PAC1934_VBUS_2_ADDR
:
976 case PAC1934_VBUS_3_ADDR
:
977 case PAC1934_VBUS_4_ADDR
:
978 return sysfs_emit(label
, "%s_VBUS_%d\n",
979 info
->labels
[chan
->scan_index
],
980 chan
->scan_index
+ 1);
981 case PAC1934_VBUS_AVG_1_ADDR
:
982 case PAC1934_VBUS_AVG_2_ADDR
:
983 case PAC1934_VBUS_AVG_3_ADDR
:
984 case PAC1934_VBUS_AVG_4_ADDR
:
985 return sysfs_emit(label
, "%s_VBUS_AVG_%d\n",
986 info
->labels
[chan
->scan_index
],
987 chan
->scan_index
+ 1);
988 case PAC1934_VSENSE_1_ADDR
:
989 case PAC1934_VSENSE_2_ADDR
:
990 case PAC1934_VSENSE_3_ADDR
:
991 case PAC1934_VSENSE_4_ADDR
:
992 return sysfs_emit(label
, "%s_IBUS_%d\n",
993 info
->labels
[chan
->scan_index
],
994 chan
->scan_index
+ 1);
995 case PAC1934_VSENSE_AVG_1_ADDR
:
996 case PAC1934_VSENSE_AVG_2_ADDR
:
997 case PAC1934_VSENSE_AVG_3_ADDR
:
998 case PAC1934_VSENSE_AVG_4_ADDR
:
999 return sysfs_emit(label
, "%s_IBUS_AVG_%d\n",
1000 info
->labels
[chan
->scan_index
],
1001 chan
->scan_index
+ 1);
1002 case PAC1934_VPOWER_1_ADDR
:
1003 case PAC1934_VPOWER_2_ADDR
:
1004 case PAC1934_VPOWER_3_ADDR
:
1005 case PAC1934_VPOWER_4_ADDR
:
1006 return sysfs_emit(label
, "%s_POWER_%d\n",
1007 info
->labels
[chan
->scan_index
],
1008 chan
->scan_index
+ 1);
1009 case PAC1934_VPOWER_ACC_1_ADDR
:
1010 case PAC1934_VPOWER_ACC_2_ADDR
:
1011 case PAC1934_VPOWER_ACC_3_ADDR
:
1012 case PAC1934_VPOWER_ACC_4_ADDR
:
1013 return sysfs_emit(label
, "%s_ENERGY_%d\n",
1014 info
->labels
[chan
->scan_index
],
1015 chan
->scan_index
+ 1);
1021 static void pac1934_work_periodic_rfsh(struct work_struct
*work
)
1023 struct pac1934_chip_info
*info
= TO_PAC1934_CHIP_INFO((struct delayed_work
*)work
);
1024 struct device
*dev
= &info
->client
->dev
;
1026 dev_dbg(dev
, "%s - Periodic refresh\n", __func__
);
1028 /* do a REFRESH, then read */
1029 pac1934_reg_snapshot(info
, true, PAC1934_REFRESH_REG_ADDR
,
1030 PAC1934_MIN_UPDATE_WAIT_TIME_US
);
1032 schedule_delayed_work(&info
->work_chip_rfsh
,
1033 msecs_to_jiffies(PAC1934_MAX_RFSH_LIMIT_MS
));
1036 static int pac1934_read_revision(struct pac1934_chip_info
*info
, u8
*buf
)
1039 struct i2c_client
*client
= info
->client
;
1041 ret
= i2c_smbus_read_i2c_block_data(client
, PAC1934_PID_REG_ADDR
,
1045 dev_err(&client
->dev
, "cannot read revision\n");
1052 static int pac1934_chip_identify(struct pac1934_chip_info
*info
)
1054 u8 rev_info
[PAC1934_ID_REG_LEN
];
1055 struct device
*dev
= &info
->client
->dev
;
1058 ret
= pac1934_read_revision(info
, (u8
*)rev_info
);
1062 info
->chip_variant
= rev_info
[PAC1934_PID_IDX
];
1063 info
->chip_revision
= rev_info
[PAC1934_RID_IDX
];
1065 dev_dbg(dev
, "Chip variant: 0x%02X\n", info
->chip_variant
);
1066 dev_dbg(dev
, "Chip revision: 0x%02X\n", info
->chip_revision
);
1068 switch (info
->chip_variant
) {
1083 * documentation related to the ACPI device definition
1084 * https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ApplicationNotes/ApplicationNotes/PAC1934-Integration-Notes-for-Microsoft-Windows-10-and-Windows-11-Driver-Support-DS00002534.pdf
1086 static int pac1934_acpi_parse_channel_config(struct i2c_client
*client
,
1087 struct pac1934_chip_info
*info
)
1090 union acpi_object
*rez
;
1091 struct device
*dev
= &client
->dev
;
1092 unsigned short bi_dir_mask
;
1096 handle
= ACPI_HANDLE(dev
);
1098 guid_parse(PAC1934_DSM_UUID
, &guid
);
1100 rez
= acpi_evaluate_dsm(handle
, &guid
, 0, PAC1934_ACPI_GET_NAMES_AND_MOHMS_VALS
, NULL
);
1104 for (i
= 0; i
< rez
->package
.count
; i
+= 2) {
1107 devm_kmemdup(dev
, rez
->package
.elements
[i
].string
.pointer
,
1108 (size_t)rez
->package
.elements
[i
].string
.length
+ 1,
1110 info
->labels
[idx
][rez
->package
.elements
[i
].string
.length
] = '\0';
1111 info
->shunts
[idx
] = rez
->package
.elements
[i
+ 1].integer
.value
* 1000;
1112 info
->active_channels
[idx
] = (info
->shunts
[idx
] != 0);
1117 rez
= acpi_evaluate_dsm(handle
, &guid
, 1, PAC1934_ACPI_GET_UOHMS_VALS
, NULL
);
1120 * initializing with default values
1121 * we assume all channels are unidirectional(the mask is zero)
1122 * and assign the default sampling rate
1124 info
->sample_rate_value
= PAC1934_DEFAULT_CHIP_SAMP_SPEED_HZ
;
1128 for (i
= 0; i
< rez
->package
.count
; i
++) {
1130 info
->shunts
[idx
] = rez
->package
.elements
[i
].integer
.value
;
1131 info
->active_channels
[idx
] = (info
->shunts
[idx
] != 0);
1136 rez
= acpi_evaluate_dsm(handle
, &guid
, 1, PAC1934_ACPI_GET_BIPOLAR_SETTINGS
, NULL
);
1140 bi_dir_mask
= rez
->package
.elements
[0].integer
.value
;
1141 info
->bi_dir
[0] = ((bi_dir_mask
& (1 << 3)) | (bi_dir_mask
& (1 << 7))) != 0;
1142 info
->bi_dir
[1] = ((bi_dir_mask
& (1 << 2)) | (bi_dir_mask
& (1 << 6))) != 0;
1143 info
->bi_dir
[2] = ((bi_dir_mask
& (1 << 1)) | (bi_dir_mask
& (1 << 5))) != 0;
1144 info
->bi_dir
[3] = ((bi_dir_mask
& (1 << 0)) | (bi_dir_mask
& (1 << 4))) != 0;
1148 rez
= acpi_evaluate_dsm(handle
, &guid
, 1, PAC1934_ACPI_GET_SAMP
, NULL
);
1152 info
->sample_rate_value
= rez
->package
.elements
[0].integer
.value
;
1159 static int pac1934_fw_parse_channel_config(struct i2c_client
*client
,
1160 struct pac1934_chip_info
*info
)
1162 struct device
*dev
= &client
->dev
;
1163 unsigned int current_channel
;
1166 info
->sample_rate_value
= 1024;
1167 current_channel
= 1;
1169 device_for_each_child_node_scoped(dev
, node
) {
1170 ret
= fwnode_property_read_u32(node
, "reg", &idx
);
1172 return dev_err_probe(dev
, ret
,
1173 "reading invalid channel index\n");
1175 /* adjust idx to match channel index (1 to 4) from the datasheet */
1178 if (current_channel
>= (info
->phys_channels
+ 1) ||
1179 idx
>= info
->phys_channels
|| idx
< 0)
1180 return dev_err_probe(dev
, -EINVAL
,
1181 "%s: invalid channel_index %d value\n",
1182 fwnode_get_name(node
), idx
);
1184 /* enable channel */
1185 info
->active_channels
[idx
] = true;
1187 ret
= fwnode_property_read_u32(node
, "shunt-resistor-micro-ohms",
1188 &info
->shunts
[idx
]);
1190 return dev_err_probe(dev
, ret
,
1191 "%s: invalid shunt-resistor value: %d\n",
1192 fwnode_get_name(node
), info
->shunts
[idx
]);
1194 if (fwnode_property_present(node
, "label")) {
1195 ret
= fwnode_property_read_string(node
, "label",
1196 (const char **)&info
->labels
[idx
]);
1198 return dev_err_probe(dev
, ret
,
1199 "%s: invalid rail-name value\n",
1200 fwnode_get_name(node
));
1203 info
->bi_dir
[idx
] = fwnode_property_read_bool(node
, "bipolar");
1211 static void pac1934_cancel_delayed_work(void *dwork
)
1213 cancel_delayed_work_sync(dwork
);
1216 static int pac1934_chip_configure(struct pac1934_chip_info
*info
)
1219 struct i2c_client
*client
= info
->client
;
1220 u8 regs
[PAC1934_CTRL_STATUS_INFO_LEN
], idx
, ctrl_reg
;
1223 info
->chip_reg_data
.num_enabled_channels
= 0;
1224 for (cnt
= 0; cnt
< info
->phys_channels
; cnt
++) {
1225 if (info
->active_channels
[cnt
])
1226 info
->chip_reg_data
.num_enabled_channels
++;
1230 * read whatever information was gathered before the driver was loaded
1231 * establish which channels are enabled/disabled and then establish the
1232 * information retrieval mode (using SKIP or no).
1233 * Read the chip ID values
1235 ret
= i2c_smbus_read_i2c_block_data(client
, PAC1934_CTRL_STAT_REGS_ADDR
,
1239 dev_err_probe(&client
->dev
, ret
,
1240 "%s - cannot read regs from 0x%02X\n",
1241 __func__
, PAC1934_CTRL_STAT_REGS_ADDR
);
1245 /* write the CHANNEL_DIS and the NEG_PWR registers */
1246 regs
[PAC1934_CHANNEL_DIS_REG_OFF
] =
1247 FIELD_PREP(PAC1934_CHAN_DIS_CH1_OFF_MASK
, info
->active_channels
[0] ? 0 : 1) |
1248 FIELD_PREP(PAC1934_CHAN_DIS_CH2_OFF_MASK
, info
->active_channels
[1] ? 0 : 1) |
1249 FIELD_PREP(PAC1934_CHAN_DIS_CH3_OFF_MASK
, info
->active_channels
[2] ? 0 : 1) |
1250 FIELD_PREP(PAC1934_CHAN_DIS_CH4_OFF_MASK
, info
->active_channels
[3] ? 0 : 1) |
1251 FIELD_PREP(PAC1934_SMBUS_TIMEOUT_MASK
, 0) |
1252 FIELD_PREP(PAC1934_SMBUS_BYTECOUNT_MASK
, 0) |
1253 FIELD_PREP(PAC1934_SMBUS_NO_SKIP_MASK
, 0);
1255 regs
[PAC1934_NEG_PWR_REG_OFF
] =
1256 FIELD_PREP(PAC1934_NEG_PWR_CH1_BIDI_MASK
, info
->bi_dir
[0]) |
1257 FIELD_PREP(PAC1934_NEG_PWR_CH2_BIDI_MASK
, info
->bi_dir
[1]) |
1258 FIELD_PREP(PAC1934_NEG_PWR_CH3_BIDI_MASK
, info
->bi_dir
[2]) |
1259 FIELD_PREP(PAC1934_NEG_PWR_CH4_BIDI_MASK
, info
->bi_dir
[3]) |
1260 FIELD_PREP(PAC1934_NEG_PWR_CH1_BIDV_MASK
, info
->bi_dir
[0]) |
1261 FIELD_PREP(PAC1934_NEG_PWR_CH2_BIDV_MASK
, info
->bi_dir
[1]) |
1262 FIELD_PREP(PAC1934_NEG_PWR_CH3_BIDV_MASK
, info
->bi_dir
[2]) |
1263 FIELD_PREP(PAC1934_NEG_PWR_CH4_BIDV_MASK
, info
->bi_dir
[3]);
1265 /* no SLOW triggered REFRESH, clear POR */
1266 regs
[PAC1934_SLOW_REG_OFF
] = 0;
1268 ret
= i2c_smbus_write_block_data(client
, PAC1934_CTRL_STAT_REGS_ADDR
,
1269 ARRAY_SIZE(regs
), (u8
*)regs
);
1273 /* Default sampling rate */
1274 ctrl_reg
= FIELD_PREP(PAC1934_CRTL_SAMPLE_RATE_MASK
, PAC1934_SAMP_1024SPS
);
1276 ret
= i2c_smbus_write_byte_data(client
, PAC1934_CTRL_REG_ADDR
, ctrl_reg
);
1281 * send a REFRESH to the chip, so the new settings take place
1282 * as well as resetting the accumulators
1284 ret
= i2c_smbus_write_byte(client
, PAC1934_REFRESH_REG_ADDR
);
1286 dev_err(&client
->dev
,
1287 "%s - cannot send 0x%02X\n",
1288 __func__
, PAC1934_REFRESH_REG_ADDR
);
1293 * get the current(in the chip) sampling speed and compute the
1294 * required timeout based on its value
1295 * the timeout is 1/sampling_speed
1297 idx
= regs
[PAC1934_CTRL_ACT_REG_OFF
] >> PAC1934_SAMPLE_RATE_SHIFT
;
1298 wait_time
= (1024 / samp_rate_map_tbl
[idx
]) * 1000;
1301 * wait the maximum amount of time to be on the safe side
1302 * the maximum wait time is for 8sps
1304 usleep_range(wait_time
, wait_time
+ 100);
1306 INIT_DELAYED_WORK(&info
->work_chip_rfsh
, pac1934_work_periodic_rfsh
);
1307 /* Setup the latest moment for reading the regs before saturation */
1308 schedule_delayed_work(&info
->work_chip_rfsh
,
1309 msecs_to_jiffies(PAC1934_MAX_RFSH_LIMIT_MS
));
1311 return devm_add_action_or_reset(&client
->dev
, pac1934_cancel_delayed_work
,
1312 &info
->work_chip_rfsh
);
1315 static int pac1934_prep_iio_channels(struct pac1934_chip_info
*info
, struct iio_dev
*indio_dev
)
1317 struct iio_chan_spec
*ch_sp
;
1318 int channel_size
, attribute_count
, cnt
;
1319 void *dyn_ch_struct
, *tmp_data
;
1320 struct device
*dev
= &info
->client
->dev
;
1322 /* find out dynamically how many IIO channels we need */
1323 attribute_count
= 0;
1325 for (cnt
= 0; cnt
< info
->phys_channels
; cnt
++) {
1326 if (!info
->active_channels
[cnt
])
1329 /* add the size of the properties of one chip physical channel */
1330 channel_size
+= sizeof(pac1934_single_channel
);
1331 /* count how many enabled channels we have */
1332 attribute_count
+= ARRAY_SIZE(pac1934_single_channel
);
1333 dev_dbg(dev
, ":%s: Channel %d active\n", __func__
, cnt
+ 1);
1336 dyn_ch_struct
= devm_kzalloc(dev
, channel_size
, GFP_KERNEL
);
1340 tmp_data
= dyn_ch_struct
;
1342 /* populate the dynamic channels and make all the adjustments */
1343 for (cnt
= 0; cnt
< info
->phys_channels
; cnt
++) {
1344 if (!info
->active_channels
[cnt
])
1347 memcpy(tmp_data
, pac1934_single_channel
, sizeof(pac1934_single_channel
));
1348 ch_sp
= (struct iio_chan_spec
*)tmp_data
;
1349 ch_sp
[PAC1934_CH_ENERGY
].channel
= cnt
+ 1;
1350 ch_sp
[PAC1934_CH_ENERGY
].scan_index
= cnt
;
1351 ch_sp
[PAC1934_CH_ENERGY
].address
= cnt
+ PAC1934_VPOWER_ACC_1_ADDR
;
1352 ch_sp
[PAC1934_CH_POWER
].channel
= cnt
+ 1;
1353 ch_sp
[PAC1934_CH_POWER
].scan_index
= cnt
;
1354 ch_sp
[PAC1934_CH_POWER
].address
= cnt
+ PAC1934_VPOWER_1_ADDR
;
1355 ch_sp
[PAC1934_CH_VOLTAGE
].channel
= cnt
+ 1;
1356 ch_sp
[PAC1934_CH_VOLTAGE
].scan_index
= cnt
;
1357 ch_sp
[PAC1934_CH_VOLTAGE
].address
= cnt
+ PAC1934_VBUS_1_ADDR
;
1358 ch_sp
[PAC1934_CH_CURRENT
].channel
= cnt
+ 1;
1359 ch_sp
[PAC1934_CH_CURRENT
].scan_index
= cnt
;
1360 ch_sp
[PAC1934_CH_CURRENT
].address
= cnt
+ PAC1934_VSENSE_1_ADDR
;
1363 * In order to be able to use labels for PAC1934_CH_VOLTAGE, and
1364 * PAC1934_CH_VOLTAGE_AVERAGE,respectively PAC1934_CH_CURRENT
1365 * and PAC1934_CH_CURRENT_AVERAGE we need to use different
1366 * channel numbers. We will add +5 (+1 to maximum PAC channels).
1368 ch_sp
[PAC1934_CH_VOLTAGE_AVERAGE
].channel
= cnt
+ 5;
1369 ch_sp
[PAC1934_CH_VOLTAGE_AVERAGE
].scan_index
= cnt
;
1370 ch_sp
[PAC1934_CH_VOLTAGE_AVERAGE
].address
= cnt
+ PAC1934_VBUS_AVG_1_ADDR
;
1371 ch_sp
[PAC1934_CH_CURRENT_AVERAGE
].channel
= cnt
+ 5;
1372 ch_sp
[PAC1934_CH_CURRENT_AVERAGE
].scan_index
= cnt
;
1373 ch_sp
[PAC1934_CH_CURRENT_AVERAGE
].address
= cnt
+ PAC1934_VSENSE_AVG_1_ADDR
;
1376 * now modify the parameters in all channels if the
1377 * whole chip rail(channel) is bi-directional
1379 if (info
->bi_dir
[cnt
]) {
1380 ch_sp
[PAC1934_CH_ENERGY
].scan_type
.sign
= 's';
1381 ch_sp
[PAC1934_CH_ENERGY
].scan_type
.realbits
= 47;
1382 ch_sp
[PAC1934_CH_POWER
].scan_type
.sign
= 's';
1383 ch_sp
[PAC1934_CH_POWER
].scan_type
.realbits
= 27;
1384 ch_sp
[PAC1934_CH_VOLTAGE
].scan_type
.sign
= 's';
1385 ch_sp
[PAC1934_CH_VOLTAGE
].scan_type
.realbits
= 15;
1386 ch_sp
[PAC1934_CH_CURRENT
].scan_type
.sign
= 's';
1387 ch_sp
[PAC1934_CH_CURRENT
].scan_type
.realbits
= 15;
1388 ch_sp
[PAC1934_CH_VOLTAGE_AVERAGE
].scan_type
.sign
= 's';
1389 ch_sp
[PAC1934_CH_VOLTAGE_AVERAGE
].scan_type
.realbits
= 15;
1390 ch_sp
[PAC1934_CH_CURRENT_AVERAGE
].scan_type
.sign
= 's';
1391 ch_sp
[PAC1934_CH_CURRENT_AVERAGE
].scan_type
.realbits
= 15;
1393 tmp_data
+= sizeof(pac1934_single_channel
);
1397 * send the updated dynamic channel structure information towards IIO
1398 * prepare the required field for IIO class registration
1400 indio_dev
->num_channels
= attribute_count
;
1401 indio_dev
->channels
= (const struct iio_chan_spec
*)dyn_ch_struct
;
1406 static IIO_DEVICE_ATTR(in_shunt_resistor1
, 0644,
1407 pac1934_shunt_value_show
, pac1934_shunt_value_store
, 0);
1408 static IIO_DEVICE_ATTR(in_shunt_resistor2
, 0644,
1409 pac1934_shunt_value_show
, pac1934_shunt_value_store
, 1);
1410 static IIO_DEVICE_ATTR(in_shunt_resistor3
, 0644,
1411 pac1934_shunt_value_show
, pac1934_shunt_value_store
, 2);
1412 static IIO_DEVICE_ATTR(in_shunt_resistor4
, 0644,
1413 pac1934_shunt_value_show
, pac1934_shunt_value_store
, 3);
1415 static int pac1934_prep_custom_attributes(struct pac1934_chip_info
*info
,
1416 struct iio_dev
*indio_dev
)
1418 int i
, active_channels_count
= 0;
1419 struct attribute
**pac1934_custom_attr
;
1420 struct attribute_group
*pac1934_group
;
1421 struct device
*dev
= &info
->client
->dev
;
1423 for (i
= 0 ; i
< info
->phys_channels
; i
++)
1424 if (info
->active_channels
[i
])
1425 active_channels_count
++;
1427 pac1934_group
= devm_kzalloc(dev
, sizeof(*pac1934_group
), GFP_KERNEL
);
1431 pac1934_custom_attr
= devm_kzalloc(dev
,
1432 (PAC1934_CUSTOM_ATTR_FOR_CHANNEL
*
1433 active_channels_count
)
1434 * sizeof(*pac1934_group
) + 1,
1436 if (!pac1934_custom_attr
)
1440 if (info
->active_channels
[0])
1441 pac1934_custom_attr
[i
++] = PAC1934_DEV_ATTR(in_shunt_resistor1
);
1443 if (info
->active_channels
[1])
1444 pac1934_custom_attr
[i
++] = PAC1934_DEV_ATTR(in_shunt_resistor2
);
1446 if (info
->active_channels
[2])
1447 pac1934_custom_attr
[i
++] = PAC1934_DEV_ATTR(in_shunt_resistor3
);
1449 if (info
->active_channels
[3])
1450 pac1934_custom_attr
[i
] = PAC1934_DEV_ATTR(in_shunt_resistor4
);
1452 pac1934_group
->attrs
= pac1934_custom_attr
;
1453 info
->iio_info
.attrs
= pac1934_group
;
1458 static void pac1934_mutex_destroy(void *data
)
1460 struct mutex
*lock
= data
;
1462 mutex_destroy(lock
);
1465 static const struct iio_info pac1934_info
= {
1466 .read_raw
= pac1934_read_raw
,
1467 .write_raw
= pac1934_write_raw
,
1468 .read_avail
= pac1934_read_avail
,
1469 .read_label
= pac1934_read_label
,
1472 static int pac1934_probe(struct i2c_client
*client
)
1474 struct pac1934_chip_info
*info
;
1475 const struct pac1934_features
*chip
;
1476 struct iio_dev
*indio_dev
;
1478 struct device
*dev
= &client
->dev
;
1480 indio_dev
= devm_iio_device_alloc(dev
, sizeof(*info
));
1484 info
= iio_priv(indio_dev
);
1486 info
->client
= client
;
1488 /* always start with energy accumulation enabled */
1489 for (cnt
= 0; cnt
< PAC1934_MAX_NUM_CHANNELS
; cnt
++)
1490 info
->enable_energy
[cnt
] = true;
1492 ret
= pac1934_chip_identify(info
);
1495 * If failed to identify the hardware based on internal
1496 * registers, try using fallback compatible in device tree
1497 * to deal with some newer part number.
1499 chip
= i2c_get_match_data(client
);
1503 info
->phys_channels
= chip
->phys_channels
;
1504 indio_dev
->name
= chip
->name
;
1506 info
->phys_channels
= pac1934_chip_config
[ret
].phys_channels
;
1507 indio_dev
->name
= pac1934_chip_config
[ret
].name
;
1510 if (acpi_match_device(dev
->driver
->acpi_match_table
, dev
))
1511 ret
= pac1934_acpi_parse_channel_config(client
, info
);
1514 * This makes it possible to use also ACPI PRP0001 for
1515 * registering the device using device tree properties.
1517 ret
= pac1934_fw_parse_channel_config(client
, info
);
1520 return dev_err_probe(dev
, ret
,
1521 "parameter parsing returned an error\n");
1523 mutex_init(&info
->lock
);
1524 ret
= devm_add_action_or_reset(dev
, pac1934_mutex_destroy
,
1530 * do now any chip specific initialization (e.g. read/write
1531 * some registers), enable/disable certain channels, change the sampling
1532 * rate to the requested value
1534 ret
= pac1934_chip_configure(info
);
1538 /* prepare the channel information */
1539 ret
= pac1934_prep_iio_channels(info
, indio_dev
);
1543 info
->iio_info
= pac1934_info
;
1544 indio_dev
->info
= &info
->iio_info
;
1545 indio_dev
->modes
= INDIO_DIRECT_MODE
;
1547 ret
= pac1934_prep_custom_attributes(info
, indio_dev
);
1549 return dev_err_probe(dev
, ret
,
1550 "Can't configure custom attributes for PAC1934 device\n");
1553 * read whatever has been accumulated in the chip so far
1554 * and reset the accumulators
1556 ret
= pac1934_reg_snapshot(info
, true, PAC1934_REFRESH_REG_ADDR
,
1557 PAC1934_MIN_UPDATE_WAIT_TIME_US
);
1561 ret
= devm_iio_device_register(dev
, indio_dev
);
1563 return dev_err_probe(dev
, ret
,
1564 "Can't register IIO device\n");
1569 static const struct i2c_device_id pac1934_id
[] = {
1570 { .name
= "pac1931", .driver_data
= (kernel_ulong_t
)&pac1934_chip_config
[PAC1931
] },
1571 { .name
= "pac1932", .driver_data
= (kernel_ulong_t
)&pac1934_chip_config
[PAC1932
] },
1572 { .name
= "pac1933", .driver_data
= (kernel_ulong_t
)&pac1934_chip_config
[PAC1933
] },
1573 { .name
= "pac1934", .driver_data
= (kernel_ulong_t
)&pac1934_chip_config
[PAC1934
] },
1576 MODULE_DEVICE_TABLE(i2c
, pac1934_id
);
1578 static const struct of_device_id pac1934_of_match
[] = {
1580 .compatible
= "microchip,pac1931",
1581 .data
= &pac1934_chip_config
[PAC1931
]
1584 .compatible
= "microchip,pac1932",
1585 .data
= &pac1934_chip_config
[PAC1932
]
1588 .compatible
= "microchip,pac1933",
1589 .data
= &pac1934_chip_config
[PAC1933
]
1592 .compatible
= "microchip,pac1934",
1593 .data
= &pac1934_chip_config
[PAC1934
]
1597 MODULE_DEVICE_TABLE(of
, pac1934_of_match
);
1600 * using MCHP1930 to be compatible with BIOS ACPI. See example:
1601 * https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ApplicationNotes/ApplicationNotes/PAC1934-Integration-Notes-for-Microsoft-Windows-10-and-Windows-11-Driver-Support-DS00002534.pdf
1603 static const struct acpi_device_id pac1934_acpi_match
[] = {
1604 { "MCHP1930", .driver_data
= (kernel_ulong_t
)&pac1934_chip_config
[PAC1934
] },
1607 MODULE_DEVICE_TABLE(acpi
, pac1934_acpi_match
);
1609 static struct i2c_driver pac1934_driver
= {
1612 .of_match_table
= pac1934_of_match
,
1613 .acpi_match_table
= pac1934_acpi_match
1615 .probe
= pac1934_probe
,
1616 .id_table
= pac1934_id
,
1619 module_i2c_driver(pac1934_driver
);
1621 MODULE_AUTHOR("Bogdan Bolocan <bogdan.bolocan@microchip.com>");
1622 MODULE_AUTHOR("Victor Tudose");
1623 MODULE_AUTHOR("Marius Cristea <marius.cristea@microchip.com>");
1624 MODULE_DESCRIPTION("IIO driver for PAC1934 Multi-Channel DC Power/Energy Monitor");
1625 MODULE_LICENSE("GPL");