mirror of
https://github.com/armbian/build
synced 2025-09-24 19:47:06 +07:00
Enable thermal support for sun55i-a523
Add patch for enable thermal in Allwinner A523 (taken from: ff1c05c893)
- tested on Cubie A5E.
This commit is contained in:
@@ -0,0 +1,307 @@
|
||||
From a5476261558ca640f5c414d66f4f7f619796d7b3 Mon Sep 17 00:00:00 2001
|
||||
From: iuncuim <iuncuim@gmail.com>
|
||||
Date: Sat, 22 Mar 2025 05:11:02 +0300
|
||||
Subject: [PATCH] thermal/drivers/sun8i: Add initial support for A523 THS0/THS1
|
||||
controller
|
||||
|
||||
Signed-off-by: Mikhail Kalashnikov <iuncuim@gmail.com>
|
||||
---
|
||||
.../arm64/boot/dts/allwinner/sun55i-a523.dtsi | 123 ++++++++++++++++++
|
||||
drivers/thermal/sun8i_thermal.c | 51 +++++++-
|
||||
2 files changed, 171 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun55i-a523.dtsi b/arch/arm64/boot/dts/allwinner/sun55i-a523.dtsi
|
||||
index ee485899b..ad3722b5c 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun55i-a523.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun55i-a523.dtsi
|
||||
@@ -22,6 +22,7 @@ cpu0: cpu@0 {
|
||||
device_type = "cpu";
|
||||
reg = <0x000>;
|
||||
enable-method = "psci";
|
||||
+ #cooling-cells = <2>;
|
||||
};
|
||||
|
||||
cpu1: cpu@100 {
|
||||
@@ -29,6 +30,7 @@ cpu1: cpu@100 {
|
||||
device_type = "cpu";
|
||||
reg = <0x100>;
|
||||
enable-method = "psci";
|
||||
+ #cooling-cells = <2>;
|
||||
};
|
||||
|
||||
cpu2: cpu@200 {
|
||||
@@ -36,6 +38,7 @@ cpu2: cpu@200 {
|
||||
device_type = "cpu";
|
||||
reg = <0x200>;
|
||||
enable-method = "psci";
|
||||
+ #cooling-cells = <2>;
|
||||
};
|
||||
|
||||
cpu3: cpu@300 {
|
||||
@@ -43,6 +46,7 @@ cpu3: cpu@300 {
|
||||
device_type = "cpu";
|
||||
reg = <0x300>;
|
||||
enable-method = "psci";
|
||||
+ #cooling-cells = <2>;
|
||||
};
|
||||
|
||||
cpu4: cpu@400 {
|
||||
@@ -50,6 +54,7 @@ cpu4: cpu@400 {
|
||||
device_type = "cpu";
|
||||
reg = <0x400>;
|
||||
enable-method = "psci";
|
||||
+ #cooling-cells = <2>;
|
||||
};
|
||||
|
||||
cpu5: cpu@500 {
|
||||
@@ -57,6 +62,7 @@ cpu5: cpu@500 {
|
||||
device_type = "cpu";
|
||||
reg = <0x500>;
|
||||
enable-method = "psci";
|
||||
+ #cooling-cells = <2>;
|
||||
};
|
||||
|
||||
cpu6: cpu@600 {
|
||||
@@ -64,6 +70,7 @@ cpu6: cpu@600 {
|
||||
device_type = "cpu";
|
||||
reg = <0x600>;
|
||||
enable-method = "psci";
|
||||
+ #cooling-cells = <2>;
|
||||
};
|
||||
|
||||
cpu7: cpu@700 {
|
||||
@@ -71,6 +78,7 @@ cpu7: cpu@700 {
|
||||
device_type = "cpu";
|
||||
reg = <0x700>;
|
||||
enable-method = "psci";
|
||||
+ #cooling-cells = <2>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -171,6 +179,40 @@ ccu: clock-controller@2001000 {
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
|
||||
+ ths1: thermal-sensor@2009400 {
|
||||
+ compatible = "allwinner,sun55i-a523-ths1";
|
||||
+ reg = <0x02009400 0x400>;
|
||||
+ interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_THS>, <&ccu CLK_GPADC1>;
|
||||
+ clock-names = "bus", "gpadc";
|
||||
+ resets = <&ccu RST_BUS_THS>;
|
||||
+ nvmem-cells = <&ths_calibration>;
|
||||
+ nvmem-cell-names = "calibration";
|
||||
+ #thermal-sensor-cells = <1>;
|
||||
+ };
|
||||
+
|
||||
+ ths0: thermal-sensor@200a000 {
|
||||
+ compatible = "allwinner,sun55i-a523-ths0";
|
||||
+ reg = <0x0200a000 0x400>;
|
||||
+ interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_THS>, <&ccu CLK_GPADC0>;
|
||||
+ clock-names = "bus", "gpadc";
|
||||
+ nvmem-cells = <&ths_calibration>;
|
||||
+ nvmem-cell-names = "calibration";
|
||||
+ #thermal-sensor-cells = <1>;
|
||||
+ };
|
||||
+
|
||||
+ sid: efuse@3006000 {
|
||||
+ compatible = "allwinner,sun50i-a523-sid", "allwinner,sun50i-a64-sid";
|
||||
+ reg = <0x03006000 0x1000>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ /* TODO: we need set proper calibration values */
|
||||
+ ths_calibration: thermal-sensor-calibration@38 {
|
||||
+ reg = <0x38 0x10>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
mmc0: mmc@4020000 {
|
||||
compatible = "allwinner,sun55i-a523-mmc",
|
||||
"allwinner,sun20i-d1-mmc";
|
||||
@@ -595,4 +637,85 @@ rtc: rtc@7090000 {
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
};
|
||||
+
|
||||
+ thermal-zones {
|
||||
+ cpu0_thermal: cpu0-thermal {
|
||||
+ polling-delay-passive = <100>;
|
||||
+ polling-delay = <1000>;
|
||||
+ thermal-sensors = <&ths1 1>;
|
||||
+ sustainable-power = <1200>;
|
||||
+
|
||||
+ trips {
|
||||
+ cpu0_threshold: cpu-trip-0 {
|
||||
+ temperature = <70000>;
|
||||
+ type = "passive";
|
||||
+ hysteresis = <0>;
|
||||
+ };
|
||||
+ cpu0_target: cpu-trip-1 {
|
||||
+ temperature = <90000>;
|
||||
+ type = "passive";
|
||||
+ hysteresis = <0>;
|
||||
+ };
|
||||
+ cpu0_critical: cpu-trip-2 {
|
||||
+ temperature = <110000>;
|
||||
+ type = "critical";
|
||||
+ hysteresis = <0>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ cpu4_thermal: cpu4-thermal {
|
||||
+ polling-delay-passive = <100>;
|
||||
+ polling-delay = <1000>;
|
||||
+ thermal-sensors = <&ths1 0>;
|
||||
+ sustainable-power = <1600>;
|
||||
+
|
||||
+ trips {
|
||||
+ cpu4_threshold: cpu-trip-0 {
|
||||
+ temperature = <70000>;
|
||||
+ type = "passive";
|
||||
+ hysteresis = <0>;
|
||||
+ };
|
||||
+ cpu4_target: cpu-trip-1 {
|
||||
+ temperature = <90000>;
|
||||
+ type = "passive";
|
||||
+ hysteresis = <0>;
|
||||
+ };
|
||||
+ cpu4_critical: cpu-trip-2 {
|
||||
+ temperature = <110000>;
|
||||
+ type = "critical";
|
||||
+ hysteresis = <0>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ gpu-thermal {
|
||||
+ polling-delay-passive = <100>;
|
||||
+ polling-delay = <1000>;
|
||||
+ thermal-sensors = <&ths1 2>;
|
||||
+ sustainable-power = <2400>;
|
||||
+
|
||||
+ trips {
|
||||
+ gpu_temp_critical: gpu-trip-0 {
|
||||
+ temperature = <110000>;
|
||||
+ type = "critical";
|
||||
+ hysteresis = <0>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ ddr-thermal {
|
||||
+ polling-delay-passive = <0>;
|
||||
+ polling-delay = <0>;
|
||||
+ thermal-sensors = <&ths0 0>;
|
||||
+
|
||||
+ trips {
|
||||
+ ddr_temp_critical: ddr-trip-0 {
|
||||
+ temperature = <110000>;
|
||||
+ type = "critical";
|
||||
+ hysteresis = <0>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
diff --git a/drivers/thermal/sun8i_thermal.c b/drivers/thermal/sun8i_thermal.c
|
||||
index 226747906..bd4f7d781 100644
|
||||
--- a/drivers/thermal/sun8i_thermal.c
|
||||
+++ b/drivers/thermal/sun8i_thermal.c
|
||||
@@ -66,8 +66,9 @@ struct tsensor {
|
||||
};
|
||||
|
||||
struct ths_thermal_chip {
|
||||
- bool has_mod_clk;
|
||||
- bool has_bus_clk_reset;
|
||||
+ bool has_gpadc_clk;
|
||||
+ bool has_mod_clk;
|
||||
+ bool has_bus_clk_reset;
|
||||
bool needs_sram;
|
||||
int sensor_num;
|
||||
int offset;
|
||||
@@ -89,7 +90,8 @@ struct ths_device {
|
||||
struct regmap_field *sram_regmap_field;
|
||||
struct reset_control *reset;
|
||||
struct clk *bus_clk;
|
||||
- struct clk *mod_clk;
|
||||
+ struct clk *mod_clk;
|
||||
+ struct clk *gpadc_clk;
|
||||
struct tsensor sensor[MAX_SENSOR_NUM];
|
||||
};
|
||||
|
||||
@@ -114,6 +116,15 @@ static int sun50i_h5_calc_temp(struct ths_device *tmdev,
|
||||
return -1590 * reg / 10 + 276000;
|
||||
}
|
||||
|
||||
+static int sun55i_a523_calc_temp(struct ths_device *tmdev,
|
||||
+ int id, int reg)
|
||||
+{
|
||||
+ if (reg >= 0x7c8)
|
||||
+ return 74 * (2736 - reg);
|
||||
+ else
|
||||
+ return 65 * (2825 - reg);
|
||||
+}
|
||||
+
|
||||
static int sun8i_ths_get_temp(struct thermal_zone_device *tz, int *temp)
|
||||
{
|
||||
struct tsensor *s = thermal_zone_device_priv(tz);
|
||||
@@ -417,6 +428,16 @@ static int sun8i_ths_resource_init(struct ths_device *tmdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
+ if (tmdev->chip->has_gpadc_clk) {
|
||||
+ tmdev->gpadc_clk = devm_clk_get_enabled(&pdev->dev, "gpadc");
|
||||
+ if (IS_ERR(tmdev->gpadc_clk))
|
||||
+ return PTR_ERR(tmdev->gpadc_clk);
|
||||
+ }
|
||||
+
|
||||
+ ret = clk_prepare_enable(tmdev->gpadc_clk);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
if (tmdev->chip->needs_sram) {
|
||||
struct regmap *regmap;
|
||||
|
||||
@@ -709,6 +730,28 @@ static const struct ths_thermal_chip sun50i_h616_ths = {
|
||||
.calc_temp = sun8i_ths_calc_temp,
|
||||
};
|
||||
|
||||
+static const struct ths_thermal_chip sun55i_a523_ths0 = {
|
||||
+ .sensor_num = 1,
|
||||
+ .has_bus_clk_reset = false, /* TODO: same reset with sun55i_a523_ths1, gives an error */
|
||||
+ .has_gpadc_clk = true,
|
||||
+ .temp_data_base = SUN50I_H6_THS_TEMP_DATA,
|
||||
+ .calibrate = sun50i_h6_ths_calibrate, /* TODO: calibration function has not yet been added */
|
||||
+ .init = sun50i_h6_thermal_init,
|
||||
+ .irq_ack = sun50i_h6_irq_ack,
|
||||
+ .calc_temp = sun55i_a523_calc_temp,
|
||||
+};
|
||||
+
|
||||
+static const struct ths_thermal_chip sun55i_a523_ths1 = {
|
||||
+ .sensor_num = 3,
|
||||
+ .has_bus_clk_reset = true,
|
||||
+ .has_gpadc_clk = true,
|
||||
+ .temp_data_base = SUN50I_H6_THS_TEMP_DATA,
|
||||
+ .calibrate = sun50i_h6_ths_calibrate, /* TODO: calibration function has not yet been added */
|
||||
+ .init = sun50i_h6_thermal_init,
|
||||
+ .irq_ack = sun50i_h6_irq_ack,
|
||||
+ .calc_temp = sun55i_a523_calc_temp,
|
||||
+};
|
||||
+
|
||||
static const struct of_device_id of_ths_match[] = {
|
||||
{ .compatible = "allwinner,sun8i-a83t-ths", .data = &sun8i_a83t_ths },
|
||||
{ .compatible = "allwinner,sun8i-h3-ths", .data = &sun8i_h3_ths },
|
||||
@@ -719,6 +762,8 @@ static const struct of_device_id of_ths_match[] = {
|
||||
{ .compatible = "allwinner,sun50i-h6-ths", .data = &sun50i_h6_ths },
|
||||
{ .compatible = "allwinner,sun20i-d1-ths", .data = &sun20i_d1_ths },
|
||||
{ .compatible = "allwinner,sun50i-h616-ths", .data = &sun50i_h616_ths },
|
||||
+ { .compatible = "allwinner,sun55i-a523-ths0", .data = &sun55i_a523_ths0 },
|
||||
+ { .compatible = "allwinner,sun55i-a523-ths1", .data = &sun55i_a523_ths1 },
|
||||
{ /* sentinel */ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, of_ths_match);
|
||||
--
|
||||
2.49.0
|
||||
|
||||
Reference in New Issue
Block a user