| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* |
| * ESWIN EIC7700 Voltage, Temperature sensor driver |
| * |
| * Copyright 2026, Beijing ESWIN Computing Technology Co., Ltd. |
| */ |
| #ifndef __HWMON_EIC7700_PVT_H__ |
| #define __HWMON_EIC7700_PVT_H__ |
| |
| #include <linux/completion.h> |
| #include <linux/hwmon.h> |
| #include <linux/kernel.h> |
| #include <linux/time.h> |
| |
| /* ESWIN EIC7700 PVT registers and their bitfields */ |
| #define PVT_TRIM 0x04 |
| #define PVT_MODE 0x08 |
| #define PVT_MODE_MASK GENMASK(2, 0) |
| #define PVT_CTRL_MODE_TEMP 0x0 |
| #define PVT_CTRL_MODE_VOLT 0x4 |
| #define PVT_ENA 0x0c |
| #define PVT_ENA_EN BIT(0) |
| #define PVT_INT 0x10 |
| #define PVT_INT_STAT BIT(0) |
| #define PVT_INT_CLR BIT(1) |
| #define PVT_DATA 0x14 |
| #define PVT_DATA_OUT GENMASK(9, 0) |
| |
| /* |
| * PVT sensors-related limits and default values |
| * @PVT_TEMP_CHS: Number of temperature hwmon channels. |
| * @PVT_VOLT_CHS: Number of voltage hwmon channels. |
| * @PVT_TRIM_DEF: Default temperature sensor trim value (set a proper value |
| * when one is determined for ESWIN EIC7700 SoC). |
| * @PVT_TOUT_MIN: Minimal timeout between samples in nanoseconds. |
| */ |
| #define PVT_TEMP_CHS 1 |
| #define PVT_VOLT_CHS 1 |
| #define PVT_TRIM_DEF 0 |
| #define PVT_TOUT_MIN (NSEC_PER_SEC / 3000) |
| |
| /* |
| * enum pvt_sensor_type - ESWIN EIC7700 PVT sensor types (correspond to each PVT |
| * sampling mode) |
| * @PVT_TEMP: PVT Temperature sensor. |
| * @PVT_VOLT: PVT Voltage sensor. |
| */ |
| enum pvt_sensor_type { |
| PVT_TEMP = 0, |
| PVT_VOLT |
| }; |
| |
| #define PVT_CLK_NUM 2 |
| |
| /* |
| * struct pvt_sensor_info - ESWIN EIC7700 PVT sensor informational structure |
| * @channel: Sensor channel ID. |
| * @label: hwmon sensor label. |
| * @mode: PVT mode corresponding to the channel. |
| * @type: Sensor type. |
| */ |
| struct pvt_sensor_info { |
| int channel; |
| const char *label; |
| u32 mode; |
| enum hwmon_sensor_types type; |
| }; |
| |
| #define PVT_SENSOR_INFO(_ch, _label, _type, _mode) \ |
| { \ |
| .channel = _ch, \ |
| .label = _label, \ |
| .mode = PVT_CTRL_MODE_ ##_mode, \ |
| .type = _type, \ |
| } |
| |
| /* |
| * struct pvt_hwmon - Eswin EIC7700 PVT private data |
| * @dev: device structure of the PVT platform device. |
| * @hwmon: hwmon device structure. |
| * @regs: pointer to the Eswin EIC7700 PVT registers region. |
| * @irq: PVT events IRQ number. |
| * @clks: PVT clock descriptors. |
| * @data_cache: data cache in raw format. |
| * @conversion: data conversion completion. |
| * @timeout: conversion timeout. |
| */ |
| struct pvt_hwmon { |
| struct device *dev; |
| struct device *hwmon; |
| void __iomem *regs; |
| int irq; |
| struct clk_bulk_data clks[PVT_CLK_NUM]; |
| u32 data_cache; |
| struct completion conversion; |
| ktime_t timeout; |
| }; |
| |
| #endif /* __HWMON_EIC7700_PVT_H__ */ |