mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
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. Signed-off-by: Yulin Lu <luyulin@eswincomputing.com> Signed-off-by: Huan He <hehuan1@eswincomputing.com> Signed-off-by: Xuyang Dong <dongxuyang@eswincomputing.com> Link: https://lore.kernel.org/r/20260630091220.1608-1-dongxuyang@eswincomputing.com Signed-off-by: Guenter Roeck <linux@roeck-us.net>
100 lines
2.5 KiB
C
100 lines
2.5 KiB
C
/* 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__ */
|