mirror of
https://abf.rosa.ru/djam/kernel-5.15.git
synced 2025-02-23 04:42:47 +00:00
92 lines
2.5 KiB
Diff
92 lines
2.5 KiB
Diff
From b81e26c4ffd2546847bb09194b02107f65e23a00 Mon Sep 17 00:00:00 2001
|
|
From: Alexey Sheplyakov <asheplyakov@basealt.ru>
|
|
Date: Tue, 25 Jan 2022 17:55:03 +0400
|
|
Subject: [PATCH 606/634] hwmon: bt1-pvt: define pvt_readl/pvt_writel for
|
|
Baikal-M SoC
|
|
|
|
On Baikal-M Linux has to call into firmware (ARM-TF) to access
|
|
PVT registers.
|
|
|
|
Signed-off-by: Alexey Sheplyakov <asheplyakov@basealt.ru>
|
|
---
|
|
drivers/hwmon/bt1-pvt.c | 23 +++++++++++++++++++++++
|
|
drivers/hwmon/bt1-pvt.h | 8 ++++++++
|
|
2 files changed, 31 insertions(+)
|
|
|
|
diff --git a/drivers/hwmon/bt1-pvt.c b/drivers/hwmon/bt1-pvt.c
|
|
index c05fe8df0..2f2a222bd 100644
|
|
--- a/drivers/hwmon/bt1-pvt.c
|
|
+++ b/drivers/hwmon/bt1-pvt.c
|
|
@@ -29,6 +29,9 @@
|
|
#include <linux/seqlock.h>
|
|
#include <linux/sysfs.h>
|
|
#include <linux/types.h>
|
|
+#ifdef CONFIG_ARM64
|
|
+#include <linux/arm-smccc.h>
|
|
+#endif
|
|
|
|
#include "bt1-pvt.h"
|
|
|
|
@@ -138,6 +141,7 @@ static long pvt_calc_poly(const struct pvt_poly *poly, long data)
|
|
return ret / poly->total_divider;
|
|
}
|
|
|
|
+#ifdef BT1_PVT_DIRECT_REG_ACCESS
|
|
static inline u32 pvt_readl(struct pvt_hwmon const *pvt, int reg) {
|
|
return readl(pvt->regs + reg);
|
|
}
|
|
@@ -149,6 +153,25 @@ static inline u32 pvt_readl_relaxed(struct pvt_hwmon const *pvt, int reg) {
|
|
static inline void pvt_writel(u32 data, struct pvt_hwmon const *pvt, int reg) {
|
|
writel(data, pvt->regs + reg);
|
|
}
|
|
+#else
|
|
+static inline u32 pvt_readl(struct pvt_hwmon const *pvt, int reg) {
|
|
+ struct arm_smccc_res res;
|
|
+ arm_smccc_smc(BAIKAL_SMC_PVT_ID, PVT_READ, pvt->pvt_id, reg,
|
|
+ 0, 0, 0, 0, &res);
|
|
+ return res.a0;
|
|
+}
|
|
+
|
|
+static inline u32 pvt_readl_relaxed(struct pvt_hwmon const *pvt, int reg) {
|
|
+ return pvt_readl(pvt, reg);
|
|
+}
|
|
+
|
|
+static inline void pvt_writel(u32 data, struct pvt_hwmon const *pvt, int reg) {
|
|
+ struct arm_smccc_res res;
|
|
+ arm_smccc_smc(BAIKAL_SMC_PVT_ID, PVT_WRITE, pvt->pvt_id, reg,
|
|
+ data, 0, 0, 0, &res);
|
|
+}
|
|
+#endif
|
|
+
|
|
static inline u32 pvt_update(struct pvt_hwmon *pvt, int reg, u32 mask, u32 data)
|
|
{
|
|
u32 old;
|
|
diff --git a/drivers/hwmon/bt1-pvt.h b/drivers/hwmon/bt1-pvt.h
|
|
index 93b8dd5e7..0cea95b01 100644
|
|
--- a/drivers/hwmon/bt1-pvt.h
|
|
+++ b/drivers/hwmon/bt1-pvt.h
|
|
@@ -101,6 +101,13 @@
|
|
# define PVT_TOUT_DEF 0
|
|
#endif
|
|
|
|
+#define BAIKAL_SMC_PVT_ID 0x82000001
|
|
+#define PVT_READ 0
|
|
+#define PVT_WRITE 1
|
|
+#ifndef CONFIG_ARM64
|
|
+#define BT1_PVT_DIRECT_REG_ACCESS
|
|
+#endif
|
|
+
|
|
/*
|
|
* enum pvt_sensor_type - Baikal-T1 PVT sensor types (correspond to each PVT
|
|
* sampling mode)
|
|
@@ -217,6 +224,7 @@ struct pvt_hwmon {
|
|
enum pvt_sensor_type sensor;
|
|
struct pvt_cache cache[PVT_SENSORS_NUM];
|
|
ktime_t timeout;
|
|
+ int pvt_id;
|
|
};
|
|
|
|
/*
|
|
--
|
|
2.33.2
|
|
|