[PATCH v3 0/2] Add support for Microchip PAC1711 Power Monitor
From: Ariana Lazar
Date: Wed Sep 09 2026 - 08:30:08 EST
The PAC1711, PAC1721, PAC1811 and PAC1821 products are single-channel power
monitors with accumulator. The PAC1711 and PAC1721 devices use 12-bit
resolution for voltage and current measurements and 24 bits for power
calculations, while PAC1811 and PAC1821 have 16-bit resolution and use 32
bits for power calculations. The 56-bit accumulator register accumulates
power (energy) or current (Coulomb counter).
PAC1711 and PAC1811 measure up to 42V Full-Scale Range, respectively 9V for
PAC1721 and PAC1821.
Reasons why these devices are more suitable for the IIO subsystem:
1. Hardware capabilities and sampling rates:
The device is fundamentally a high-speed ADC with advanced hardware
features (e.g., measuring low voltage over a current shunt, calculate
power and/or acumulate power/current). When
configured to sample a single channel (e.g. current exclusively),
the PAC1711 can achieve sampling rates of up to 16,384 samples/second.
High-rate sampling is specifically required to enable accurate
power/current profiling.
2. Future Features:
The currently submitted version of the driver provides the basic
hardware interface that could be suitable for HWMON, but later on it is
needed to introduce features such as IIO buffer support. High-frequency
buffered data capture is essential for profiling high-resolution current
consumption on processors, peripherals, battery systems, and industrial
low-voltage automation.
3. Consistency:
It maintains a unified API across the entire Microchip power and current
monitor device family with similar hardware capabilities.
Signed-off-by: Ariana Lazar <ariana.lazar@xxxxxxxxxxxxx>
---
Changes in v3:
- fix review comments device tree binding:
remove interrupts and GPIO properties
change VSENSEP to VSENSE+, VSENSEN to VSENSE-
explain why we need the accumulation mode as a devicetree property
- fix review comments driver:
use NANO macro in defines
use anonymous enums
rename is_pac18x1_family to has_16bit_resolution
use more meaningful names for local variables instead of tmp
use guard instead of scoped_guard where possible
replace 'Increasing precision' comment from
pac1711_in_coulomb_counter_scale_show()
rename pac1711_work_periodic_rfsh() to pac1711_work_periodic_refresh()
remove ret initialization from pac1711_chip_configure()
add explanation for background worker instead of polling data in a
comment
remove dynamic allocation of the always available channels
return 0 in the end of pac1711_retrieve_data()
remove comma after NULL entries
use FIELD_MODIFY() instead of FIELD_PREP()
use consistent one line style
verify length instead of return code for I2C reads
remove return error code when accumulator overflows
correct refresh logic and jiffies timestamp calculation
add mutex in pac1711_in_power_acc_raw_show()
add mutex when reading power raw values
correct wait_time calculation
initialize all struct fields when identifying the chip fails
handle return code correctly for i2c_smbus_read_i2c_block_data()
correct power scale calculation to avoid overflow
change vals type from s32 to u32 in pac1711_init_vbus_vsense_ranges()
use IIO_ENERGY instead of custom attribute for vpower accumulation
add more comments to explain accumulation functionality
validate I2C transfer lengths and return -EIO for short transfers
- Link to v2: https://lore.kernel.org/r/20260728-pac1711-v2-0-609bc026093c@xxxxxxxxxxxxx
Changes in v2:
- fix review comments device tree binding:
add PAC1721, PAC1811 and PAC1821 part numbers
add Vbus/Vsense input ranges in attribute definition
change accumulation-mode from int to string type
remove size and address cells
correct interrupts definition and add attributes for the two
alerts, microchip,gpio0-mode and microchip,gpio1-mode
remove microchip,gpio attribute
remove "vbus" accumulation mode
- fix review comments driver:
add PAC1721, PAC1811 and PAC1821 part numbers
run pahole on reg_data and pac1711_chip_info structs
remove average registers - VBUS_AVG and VSENSE_AVG
add PAC1721, PAC1811, PAC1821 to features/compatible
add missing headers
remove rarely used defines like PAC1711_POWER_24B_RES and use the
numerical value inline instead
use ARRAY_SIZE() instead of define for the number of accumulator
related attributes
add explanation for bytes length defines
use spacing convention space after { and before }
remove pac1711_shift_map_tbl in order to use just
pac1711_samp_rate_map_tbl and an index saved in struct
use read_avail() for sampling_rate
change mutex comment in reg_data
use fsleep instead of usleep
use a local __be16 variable in endianess transformations
add missing error returns after dev_err
add info_mask_shared_by_all for sampling_frequency
use dev_info instead of dev_err_probe in chip_identify
generalize input setup functions into one
remove device_property_present
rename pac1711_single_channel into pac1711_chan_spec
rename pac1711_of_parse_channel_config into pac1711_parse_fw
remove unneccessary comments in probe
define in_shunt_resistor as ext_info instead of custom attribute
use calculations only with 16-bit resolution instead of multiple
shifting (12-bit registers are left shifted)
add scale computations based on new voltage of 9V for PAC1721/PAC1821
v1:
- first version committed to review
- Link to v1: https://lore.kernel.org/r/20251015-pac1711-v1-0-976949e36367@xxxxxxxxxxxxx
---
Ariana Lazar (2):
dt-bindings: iio: adc: add support for PAC1711
iio: adc: add support for PAC1711
.../ABI/testing/sysfs-bus-iio-adc-pac1711 | 24 +
.../bindings/iio/adc/microchip,pac1711.yaml | 183 +++
MAINTAINERS | 8 +
drivers/iio/adc/Kconfig | 11 +
drivers/iio/adc/Makefile | 1 +
drivers/iio/adc/pac1711.c | 1304 ++++++++++++++++++++
6 files changed, 1531 insertions(+)
---
base-commit: 19272b37aa4f83ca52bdf9c16d5d81bdd1354494
change-id: 20250901-pac1711-d3bacda400fd
Best regards,
--
Ariana Lazar <ariana.lazar@xxxxxxxxxxxxx>