diff --git a/patch/kernel/archive/sunxi-dev-6.14/1208-thermal-drivers-sun8i-Add-initial-support-for-A523-T.patch b/patch/kernel/archive/sunxi-dev-6.14/1208-thermal-drivers-sun8i-Add-initial-support-for-A523-T.patch new file mode 100644 index 000000000..1f16ec907 --- /dev/null +++ b/patch/kernel/archive/sunxi-dev-6.14/1208-thermal-drivers-sun8i-Add-initial-support-for-A523-T.patch @@ -0,0 +1,307 @@ +From a5476261558ca640f5c414d66f4f7f619796d7b3 Mon Sep 17 00:00:00 2001 +From: iuncuim +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 +--- + .../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 = ; ++ 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 = ; ++ 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 +