Add driver support for ESWIN EIC7700 PVT controller
Subsystems (2)
v8 cover Add driver support for ESWIN EIC7700 PVT controller
From: Huan He <[email protected]>
Add support for the ESWIN EIC7700 PVT (Voltage, Temperature) sensor
Features:
The driver supports monitoring of voltage and temperature parameters through the hardware monitoring subsystem. It provides an access to the sampled Temperature and Voltage.
Test:
Tested this patch on the SiFive HiFive Premier P550 (which uses the ESWIN EIC7700 SoC).
Updates:
Changes in v8:
- Update eswin,eic7700-pvt.yaml
- Delete reviewed-by tag of Krzysztof Kozlowski due to functional changes. Add the APB clock because when the kernel is booted with CMDLINE option "clk_ignore_unused", the APB clock remains enabled by default; without this option, the APB clock may be gated and the PVT driver will not operate correctly
- Update eic7700-pvt.c and eic7700-pvt.h
- Add APB clock support and retrieve clocks using devm_clk_bulk_get()
- Update eic7700_pvt_hard_isr() to verify PVT_INT_STAT before clearing the interrupt and completing a conversion, preventing spurious interrupts from returning stale data or completing a conversion early
- Update eic7700_pvt_probe() to register the PM runtime cleanup action before requesting the IRQ, so the IRQ is torn down before clocks are disabled during driver removal, preventing a possible use-after-disable of the hardware clock in the ISR
Changes in v7:
- Remove the unused reset control pointer from struct pvt_hwmon and keep the reset control handle local to eic7700_pvt_probe()
- Update eic7700_pvt_init_iface() to disable PVT_ENA_EN before clearing the interrupt status, preventing a possible level-triggered interrupt storm if the bootloader leaves the conversion engine running
- Update eic7700_pvt_disable_pm_runtime() to explicitly disable runtime PM and avoid an unbalanced disable_depth
Changes in v6:
- Fix the !CONFIG_PM probe error path by disabling the clock if IRQ request fails before the PM cleanup action is registered
- Replace pm_runtime_put_noidle() with pm_runtime_put() in the IRQ handler to avoid a runtime PM reference-count race with the read path
- Remove the unused pvt_clear_data() devres action and its associated devm_add_action() registration
Changes in v5:
- Update eswin,eic7700-pvt.yaml
- Drop the label enum constraint and remove label from the required list
- Add '#thermal-sensor-cells' to the required list
- Rename the example node to the generic sensor@... form
- Update the binding description to describe one temperature sensor and one voltage sensor
- Update eic7700-pvt.c
- Register the hwmon device with the fixed name "pvt"
- Remove label-based instance identification from the driver
- Fix CONFIG_PM=n support by keeping the clock enabled when runtime PM is unavailable
- Add pm_runtime_force_suspend() in the cleanup path to avoid leaving the device active during unbind
- Switch system sleep callbacks to pm_runtime_force_suspend() and pm_runtime_force_resume()
- Guard ISR register accesses with pm_runtime_get_if_active()
- Add synchronize_irq() on the timeout path to avoid stale completion races
- Remove temp_offset support because the raw trim register does not match the hwmon ABI
- Align the commit message with the implementation (one temperature sensor, one voltage sensor)
Changes in v4:
- Update eswin,eic7700-pvt.yaml
- Delete reviewed-by tag of Conor Dooley, because the label enum constraint is introduced
- Update eic7700-pvt.c and eic7700-pvt.h
- Remove the unused LVT/ULVT/SVT process-monitoring channels
- Remove the probe-time power check since the PVT block is always powered on EIC7700 and the extra verification is unnecessary
- Stop requesting the interrupt as shared and use the dedicated PVT IRQ only
- Reorder probe initialization so the interface is initialized before the clock is disabled, avoiding register accesses with the clock gated
- Fix runtime PM reference handling on error paths by balancing pm_runtime_get_noresume() with pm_runtime_put_noidle()
- Add pm_runtime_put_noidle() handling for failed pm_runtime_get_sync() calls in hwmon read/write paths
- Switch the PM callback registration from pm_sleep_ptr() to pm_ptr()
Changes in v3:
- Update eswin,eic7700-pvt.yaml
- Remove redundant label property description and use 'label: true' to reference the definition in hwmon-common.yaml
- Replace 'additionalProperties: false' with 'unevaluatedProperties: false'
- Remove the description for '#thermal-sensor-cells'
- Update eic7700-pvt.c and eic7700-pvt.h
- Fix clock reference count imbalance with Runtime PM:
Replace devm_clk_get_enabled() with devm_clk_get() and manually manage clock enable/disable to avoid double-disable in remove() when Runtime PM is active. Clock is now enabled only during probe for eic7700_pvt_check_pwr(), then disabled before enabling Runtime PM, which takes full control of the clock thereafter
- Add detailed comment explaining the spurious interrupt risk in eic7700_pvt_check_pwr()
- Replace wait_for_completion_interruptible() with wait_for_completion_timeout() to prevent infinite wait
Changes in v2:
- Update eswin,eic7700-pvt.yaml
- Reference the hwmon-common.yaml file
- Remove the clock-names and reset-names properties
- Move additionalProperties: false after the required block
- Remove one example node to avoid redundancy
- Update eic7700-pvt.c and eic7700-pvt.h
- Remove unused sensor macros (PVT_SENSOR_FIRST, PVT_SENSOR_LAST, PVT_SENSORS_NUM)
- Drop the unnecessary hwmon-sysfs.h header
- Replace dynamic sensor info allocation with a static array and unify sensor labels
- Remove unused hwmon_temp_type attribute
- Eliminate redundant validation checks
- Remove mutex and related locking, relying on hwmon core serialization
- Replace per-sensor caches and completions with a single data cache and completion object
- Remove pvt->sensor tracking. ISR no longer depends on the currently selected sensor
- Move devm_add_action() registration after init_completion() for safer cleanup, and update cleanup function (pvt_clear_data)
- Replace devm_reset_control_get_optional_exclusive() with devm_reset_control_get_exclusive_deasserted()
- Replace eic7700_pvt_remove() with eic7700_pvt_disable_pm_runtime() and move it after PM runtime enable to avoid resource leaks on probe failure and remove clock disable and reset assert from eic7700_pvt_disable_pm_runtime() as it is already handled by devm_* framework
- Remove redundant clock presence check in runtime_resume
- Link to v1: https://lore.kernel.org/all/[email protected]/
Huan He (2):
dt-bindings: hwmon: Add Eswin EIC7700 PVT sensor
hwmon: Add Eswin EIC7700 PVT sensor driver
.../bindings/hwmon/eswin,eic7700-pvt.yaml | 72 +++ drivers/hwmon/Kconfig | 12 + drivers/hwmon/Makefile | 1 + drivers/hwmon/eic7700-pvt.c | 507 ++++++++++++++++++ drivers/hwmon/eic7700-pvt.h | 99 ++++ 5 files changed, 691 insertions(+) create mode 100644 Documentation/devicetree/bindings/hwmon/eswin,eic7700-pvt.yaml create mode 100644 drivers/hwmon/eic7700-pvt.c create mode 100644 drivers/hwmon/eic7700-pvt.h
Signature · 1 line
2.34.1
PATCH v8 1/2 dt-bindings: hwmon: Add Eswin EIC7700 PVT sensor
From: Huan He <[email protected]>
Add device tree binding documentation for ESWIN EIC7700 Voltage and Temperature sensor.
The EIC7700 SoC integrates two PVT instances for monitoring SoC and DDR power domains respectively.
--- .../bindings/hwmon/eswin,eic7700-pvt.yaml | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 Documentation/devicetree/bindings/hwmon/eswin,eic7700-pvt.yaml
Documentation/devicetree/bindings/hwmon/eswin,eic7700-pvt.yaml new file +72 -0
@@ -0,0 +1,72 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/hwmon/eswin,eic7700-pvt.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: ESWIN EIC7700 PVT Sensor + +maintainers: + - Yulin Lu <[email protected]> + - Huan He <[email protected]> + +description: + ESWIN EIC7700 SoC integrates embedded voltage and temperature sensors to + monitor the internal SoC environment. The system includes two PVT sensor + instances. The PVT0 monitors the main SoC power domain. The PVT1 sensor + monitors the DDR core power domain. + +allOf: + - $ref: /schemas/hwmon/hwmon-common.yaml# + +properties: + compatible: + const: eswin,eic7700-pvt + + reg: + maxItems: 1 + + clocks: + items: + - description: PVT enable clock + - description: APB bus clock + + clock-names: + items: + - const: enable + - const: apb + + interrupts: + maxItems: 1 + + resets: + maxItems: 1 + + '#thermal-sensor-cells': + const: 0 + +required: + - compatible + - reg + - clocks + - clock-names + - interrupts + - resets + - '#thermal-sensor-cells' + +unevaluatedProperties: false + +examples: + - | + sensor@50b00000 { + compatible = "eswin,eic7700-pvt"; + reg = <0x50b00000 0x10000>; + clocks = <&clocks 244>, <&clocks 234>; + clock-names = "enable", "apb"; + interrupts = <349>; + interrupt-parent = <&plic>; + label = "pvt0"; + resets = <&reset 111>; + #thermal-sensor-cells = <0>; + }; +...
Signature · 1 line
2.34.1
[email protected]
AI reviewRe: [PATCH v8 1/2] dt-bindings: hwmon: Add Eswin EIC7700 PVT sensor
Sashiko has reviewed this patch and found no issues. It looks great!
Quoted 10 lines
From: Huan He <[email protected]>
Add device tree binding documentation for ESWIN EIC7700 Voltage and Temperature sensor.
The EIC7700 SoC integrates two PVT instances for monitoring SoC and DDR power domains respectively.
Signed-off-by Yulin Lu <[email protected]>Signed-off-by Huan He <[email protected]>
Sashiko has reviewed this patch and found no issues. It looks great!
Signature · 1 line
Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=1
Re: [PATCH v8 1/2] dt-bindings: hwmon: Add Eswin EIC7700 PVT sensor
In reply to [email protected]pw-bot: not-applicable
PATCH v8 2/2 hwmon: Add Eswin EIC7700 PVT sensor driver
In reply to [email protected]From: Huan He <[email protected]>
Add support for ESWIN EIC7700 Voltage and Temperature sensor. The driver supports temperature and voltage monitoring with polynomial conversion, and provides sysfs interface for sensor data access.
The PVT IP contains one temperature sensor and one voltage sensor.
--- drivers/hwmon/Kconfig | 12 + drivers/hwmon/Makefile | 1 + drivers/hwmon/eic7700-pvt.c | 507 ++++++++++++++++++++++++++++++++++++ drivers/hwmon/eic7700-pvt.h | 99 +++++++ 4 files changed, 619 insertions(+) create mode 100644 drivers/hwmon/eic7700-pvt.c create mode 100644 drivers/hwmon/eic7700-pvt.h
drivers/hwmon/Kconfig +12 -0
@@ -2067,6 +2067,18 @@ config SENSORS_DME1737 This driver can also be built as a module. If so, the module will be called dme1737. +config SENSORS_EIC7700_PVT + tristate "Eswin EIC7700 Voltage, Temperature sensor driver" + depends on ARCH_ESWIN || COMPILE_TEST + depends on HWMON + select POLYNOMIAL + help + If you say yes here you get support for Eswin EIC7700 PVT sensor + embedded into the SoC. + + This driver can also be built as a module. If so, the module will be + called eic7700-pvt. + config SENSORS_EMC1403 tristate "SMSC EMC1403/23 thermal sensor" depends on I2C
drivers/hwmon/Makefile +1 -0
@@ -72,6 +72,7 @@ obj-$(CONFIG_SENSORS_DME1737) += dme1737.o obj-$(CONFIG_SENSORS_DRIVETEMP) += drivetemp.o obj-$(CONFIG_SENSORS_DS620) += ds620.o obj-$(CONFIG_SENSORS_DS1621) += ds1621.o +obj-$(CONFIG_SENSORS_EIC7700_PVT) += eic7700-pvt.o obj-$(CONFIG_SENSORS_EMC1403) += emc1403.o obj-$(CONFIG_SENSORS_EMC1812) += emc1812.o obj-$(CONFIG_SENSORS_EMC2103) += emc2103.o
drivers/hwmon/eic7700-pvt.c new file +507 -0
507 lines not on this page · raw message
drivers/hwmon/eic7700-pvt.h new file +99 -0
99 lines not on this page · raw message
Signature · 1 line
2.34.1
[email protected]
AI reviewRe: [PATCH v8 2/2] hwmon: Add Eswin EIC7700 PVT sensor driver
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [Medium] Missing Hardware State Restoration after System Sleep / Runtime PM --
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] Missing Hardware State Restoration after System Sleep / Runtime PM --
commit 90e30b4d9c6082a265da7f7091bf9e2cd31aec81
Author: Huan He <[email protected]>
hwmon: Add Eswin EIC7700 PVT sensor driver
This commit introduces support for the ESWIN EIC7700 Voltage and Temperature (PVT) sensor. The driver implements temperature and voltage monitoring using polynomial conversion and provides a sysfs interface for accessing the sensor data.
Quoted 4 lines
drivers/hwmon/eic7700-pvt.c new file +0
-0
[ ... ]
drivers/hwmon/eic7700-pvt.c line 469
Quoted 11 lines
drivers/hwmon/eic7700-pvt.c new file +11
-0+static int __maybe_unused eic7700_pvt_runtime_resume (struct device *dev) +{ +struct pvt_hwmon *pvt =dev_get_drvdata (dev); +int ret; + + ret =clk_bulk_prepare_enable (PVT_CLK_NUM , pvt->clks); +if (ret) { +dev_err (dev,"Failed to enable clocks: %d\n" , ret); +return ret; + } +
[Severity: Medium]
Does this code need to restore the hardware trim value after resuming?
The driver initializes the sensor mode and trim configuration via eic7700_pvt_init_iface() during probe.
If the device enters system suspend or runtime suspend and the power domain is disabled, the hardware configuration could be lost. Since the driver utilizes pm_runtime_force_resume() for system suspend paths, should this callback re-apply the trim values to prevent incorrect sensor readings upon wake?
Quoted 2 lines
drivers/hwmon/eic7700-pvt.c new file +2
-0+return 0 ; +}
Signature · 1 line
Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=2
Guenter Roeck
maintainerRe: [PATCH v8 2/2] hwmon: Add Eswin EIC7700 PVT sensor driver
Quoted 36 lines · On 6/24/26 23:22, [email protected] wrote:
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] Missing Hardware State Restoration after System Sleep / Runtime PM --commit
90e30b4d9c6082a265da7f7091bf9e2cd31aec81
Author: Huan He <[email protected]>hwmon: Add Eswin EIC7700 PVT sensor driver
This commit introduces support for the ESWIN EIC7700 Voltage and Temperature (PVT) sensor. The driver implements temperature and voltage monitoring using polynomial conversion and provides a sysfs interface for accessing the sensor data.
Quoted 4 lines
drivers/hwmon/eic7700-pvt.c new file +0
-0[ ... ]
drivers/hwmon/eic7700-pvt.c line 469
Quoted 11 lines
drivers/hwmon/eic7700-pvt.c new file +11
-0+static int __maybe_unused eic7700_pvt_runtime_resume (struct device *dev) +{ +struct pvt_hwmon *pvt =dev_get_drvdata (dev); +int ret; + + ret =clk_bulk_prepare_enable (PVT_CLK_NUM , pvt->clks); +if (ret) { +dev_err (dev,"Failed to enable clocks: %d\n" , ret); +return ret; + } +[Severity: Medium]
Does this code need to restore the hardware trim value after resuming?
Quoted 9 lines
The driver initializes the sensor mode and trim configuration via
eic7700_pvt_init_iface()during probe.If the device enters system suspend or runtime suspend and the power domain is disabled, the hardware configuration could be lost. Since the driver utilizes
pm_runtime_force_resume()for system suspend paths, should this callback re-apply the trim values to prevent incorrect sensor readings upon wake?
Huan He - Please take a look and fix if necessary.
Thanks,
Guenter
Re: [PATCH v8 2/2] hwmon: Add Eswin EIC7700 PVT sensor driver
In reply to [email protected]Hi Huan,
drivers/hwmon/Kconfig config SENSORS_DME1737 · line 2073
Quoted 4 lines · On 6/25/26 07:12, [email protected] wrote:
drivers/hwmon/Kconfig +4
-0+config SENSORS_EIC7700_PVT + tristate "Eswin EIC7700 Voltage, Temperature sensor driver" + depends on ARCH_ESWIN || COMPILE_TEST + depends on HWMON
You already put SENSORS_EIC7700_PVT inside the 'if HWMON .. endif', so you don't need the 'depends on HWMON'. It creates a duplicate dependency.
- Julian Braha
Re: Re: [PATCH v8 2/2] hwmon: Add Eswin EIC7700 PVT sensor driver
Hi Julian,
Quoted 11 lines · On 6/25/26 07:12, [email protected] wrote:
drivers/hwmon/Kconfig config SENSORS_DME1737 · line 2073
Quoted 4 lines
drivers/hwmon/Kconfig +4
-0+config SENSORS_EIC7700_PVT + tristate "Eswin EIC7700 Voltage, Temperature sensor driver" + depends on ARCH_ESWIN || COMPILE_TEST + depends on HWMONYou already put
SENSORS_EIC7700_PVTinside the 'if HWMON .. endif', so you don't need the 'depends on HWMON'. It creates a duplicate dependency.
Will drop the 'depends on HWMON' in the next version.
Best regards,
Xuyang Dong