Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add a different A64 DVFS implementation
Note: thermal sensor readouts are currently broken
- Loading branch information
1 parent
b321be0
commit ac82919
Showing
7 changed files
with
384 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,212 @@ | ||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | ||
index c8e7afa0..435e8f62 100644 | ||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | ||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | ||
@@ -50,12 +50,72 @@ | ||
#include <dt-bindings/reset/sun8i-de2.h> | ||
#include <dt-bindings/clock/sun8i-r-ccu.h> | ||
#include <dt-bindings/reset/sun8i-r-ccu.h> | ||
+#include <dt-bindings/thermal/thermal.h> | ||
|
||
/ { | ||
interrupt-parent = <&gic>; | ||
#address-cells = <1>; | ||
#size-cells = <1>; | ||
|
||
+ cpu0_opp_table: opp_table0 { | ||
+ compatible = "operating-points-v2"; | ||
+ opp-shared; | ||
+ | ||
+ opp@408000000 { | ||
+ opp-hz = /bits/ 64 <408000000>; | ||
+ opp-microvolt = <1000000 1000000 1300000>; | ||
+ clock-latency-ns = <244144>; /* 8 32k periods */ | ||
+ }; | ||
+ | ||
+ opp@648000000 { | ||
+ opp-hz = /bits/ 64 <648000000>; | ||
+ opp-microvolt = <1040000 1040000 1300000>; | ||
+ clock-latency-ns = <244144>; /* 8 32k periods */ | ||
+ }; | ||
+ | ||
+ opp@816000000 { | ||
+ opp-hz = /bits/ 64 <816000000>; | ||
+ opp-microvolt = <1080000 1080000 1300000>; | ||
+ clock-latency-ns = <244144>; /* 8 32k periods */ | ||
+ }; | ||
+ | ||
+ opp@912000000 { | ||
+ opp-hz = /bits/ 64 <912000000>; | ||
+ opp-microvolt = <1120000 1120000 1300000>; | ||
+ clock-latency-ns = <244144>; /* 8 32k periods */ | ||
+ }; | ||
+ | ||
+ opp@960000000 { | ||
+ opp-hz = /bits/ 64 <960000000>; | ||
+ opp-microvolt = <1160000 1160000 1300000>; | ||
+ clock-latency-ns = <244144>; /* 8 32k periods */ | ||
+ }; | ||
+ | ||
+ opp@1008000000 { | ||
+ opp-hz = /bits/ 64 <1008000000>; | ||
+ opp-microvolt = <1200000 1200000 1300000>; | ||
+ clock-latency-ns = <244144>; /* 8 32k periods */ | ||
+ }; | ||
+ | ||
+ opp@1056000000 { | ||
+ opp-hz = /bits/ 64 <1056000000>; | ||
+ opp-microvolt = <1240000 1240000 1300000>; | ||
+ clock-latency-ns = <244144>; /* 8 32k periods */ | ||
+ }; | ||
+ | ||
+ opp@1104000000 { | ||
+ opp-hz = /bits/ 64 <1104000000>; | ||
+ opp-microvolt = <1260000 1260000 1300000>; | ||
+ clock-latency-ns = <244144>; /* 8 32k periods */ | ||
+ }; | ||
+ | ||
+ opp@1152000000 { | ||
+ opp-hz = /bits/ 64 <1152000000>; | ||
+ opp-microvolt = <1300000 1300000 1300000>; | ||
+ clock-latency-ns = <244144>; /* 8 32k periods */ | ||
+ }; | ||
+ }; | ||
+ | ||
cpus { | ||
#address-cells = <1>; | ||
#size-cells = <0>; | ||
@@ -65,6 +125,12 @@ | ||
device_type = "cpu"; | ||
reg = <0>; | ||
enable-method = "psci"; | ||
+ clocks = <&ccu 21>; | ||
+ clock-names = "cpu"; | ||
+ operating-points-v2 = <&cpu0_opp_table>; | ||
+ #cooling-cells = <2>; | ||
+ cooling-min-level = <0>; | ||
+ cooling-max-level = <8>; | ||
}; | ||
|
||
cpu1: cpu@1 { | ||
@@ -72,6 +138,7 @@ | ||
device_type = "cpu"; | ||
reg = <1>; | ||
enable-method = "psci"; | ||
+ clocks = <&ccu 21>; | ||
}; | ||
|
||
cpu2: cpu@2 { | ||
@@ -79,6 +146,7 @@ | ||
device_type = "cpu"; | ||
reg = <2>; | ||
enable-method = "psci"; | ||
+ clocks = <&ccu 21>; | ||
}; | ||
|
||
cpu3: cpu@3 { | ||
@@ -86,6 +154,58 @@ | ||
device_type = "cpu"; | ||
reg = <3>; | ||
enable-method = "psci"; | ||
+ clocks = <&ccu 21>; | ||
+ }; | ||
+ }; | ||
+ | ||
+ thermal-zones { | ||
+ cpu_thermal: cpu_thermal { | ||
+ polling-delay-passive = <330>; | ||
+ polling-delay = <1000>; | ||
+ thermal-sensors = <&scpi_cpu_thermal 0>; | ||
+ | ||
+ trips { | ||
+ cpu_warm: cpu_warm { | ||
+ temperature = <65000>; | ||
+ hysteresis = <2000>; | ||
+ type = "passive"; | ||
+ }; | ||
+ | ||
+ cpu_hot: cpu_hot { | ||
+ temperature = <75000>; | ||
+ hysteresis = <2000>; | ||
+ type = "passive"; | ||
+ }; | ||
+ | ||
+ cpu_very_hot: cpu_very_hot { | ||
+ temperature = <90000>; | ||
+ hysteresis = <2000>; | ||
+ type = "passive"; | ||
+ }; | ||
+ | ||
+ cpu_crit: cpu_crit { | ||
+ temperature = <105000>; | ||
+ hysteresis = <2000>; | ||
+ type = "critical"; | ||
+ }; | ||
+ }; | ||
+ | ||
+ cooling-maps { | ||
+ cpu_warm_limit_cpu { | ||
+ trip = <&cpu_warm>; | ||
+ cooling-device = <&cpu0 THERMAL_NO_LIMIT 2>; | ||
+ }; | ||
+ | ||
+ cpu_hot_limit_cpu { | ||
+ trip = <&cpu_hot>; | ||
+ cooling-device = <&cpu0 3 5>; | ||
+ }; | ||
+ | ||
+ cpu_very_hot_limit_cpu { | ||
+ trip = <&cpu_very_hot>; | ||
+ cooling-device = <&cpu0 6 THERMAL_NO_LIMIT>; | ||
+ }; | ||
+ }; | ||
}; | ||
}; | ||
|
||
@@ -149,6 +269,37 @@ | ||
(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>; | ||
}; | ||
|
||
+ mailbox: mbox@0 { | ||
+ compatible = "arm,smc-mbox"; | ||
+ #mbox-cells = <1>; | ||
+ arm,smc-func-ids = <0x82000001>; | ||
+ }; | ||
+ | ||
+ sram: sram@10000{ | ||
+ compatible = "mmio-sram"; | ||
+ reg = <0x10000 0x8000>; | ||
+ | ||
+ #address-cells = <1>; | ||
+ #size-cells = <1>; | ||
+ ranges = <0 0x10000 0x8000>; | ||
+ | ||
+ cpu_scp_mem: scp-shmem@7e00 { | ||
+ compatible = "mmio-sram"; | ||
+ reg = <0x7e00 0x200>; | ||
+ }; | ||
+ }; | ||
+ | ||
+ scpi { | ||
+ compatible = "arm,scpi"; | ||
+ mboxes = <&mailbox 0>; | ||
+ shmem = <&cpu_scp_mem>; | ||
+ | ||
+ scpi_cpu_thermal: sensors { | ||
+ compatible = "arm,scpi-sensors"; | ||
+ #thermal-sensor-cells = <1>; | ||
+ }; | ||
+ }; | ||
+ | ||
soc { | ||
compatible = "simple-bus"; | ||
#address-cells = <1>; | ||
@@ -477,6 +628,8 @@ | ||
clock-names = "hosc", "losc"; | ||
#clock-cells = <1>; | ||
#reset-cells = <1>; | ||
+ assigned-clocks = <&ccu CLK_THS>; | ||
+ assigned-clock-rates = <4000000>; | ||
}; | ||
|
||
pio: pinctrl@1c20800 { |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts | ||
index 113ea66f..96cf1a73 100644 | ||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts | ||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts | ||
@@ -76,6 +76,10 @@ | ||
}; | ||
}; | ||
|
||
+&cpu0 { | ||
+ cpu-supply = <®_dcdc2>; | ||
+}; | ||
+ | ||
&de { | ||
status = "okay"; | ||
}; | ||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts | ||
index 523e1578..d19622f4 100644 | ||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts | ||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts | ||
@@ -94,6 +94,10 @@ | ||
}; | ||
}; | ||
|
||
+&cpu0 { | ||
+ cpu-supply = <®_dcdc2>; | ||
+}; | ||
+ | ||
&ehci0 { | ||
status = "okay"; | ||
}; | ||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine.dtsi | ||
index a5da18a6..44da934e 100644 | ||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine.dtsi | ||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine.dtsi | ||
@@ -54,6 +54,10 @@ | ||
}; | ||
}; | ||
|
||
+&cpu0 { | ||
+ cpu-supply = <®_dcdc2>; | ||
+}; | ||
+ | ||
&mmc0 { | ||
pinctrl-names = "default"; | ||
pinctrl-0 = <&mmc0_pins>; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c | ||
index 27954085..3c76c670 100644 | ||
--- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c | ||
+++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c | ||
@@ -879,11 +879,26 @@ static const struct sunxi_ccu_desc sun50i_a64_ccu_desc = { | ||
.num_resets = ARRAY_SIZE(sun50i_a64_ccu_resets), | ||
}; | ||
|
||
+static struct ccu_pll_nb sun50i_a64_pll_cpu_nb = { | ||
+ .common = &pll_cpux_clk.common, | ||
+ /* copy from pll_cpux_clk */ | ||
+ .enable = BIT(31), | ||
+ .lock = BIT(28), | ||
+}; | ||
+ | ||
+static struct ccu_mux_nb sun50i_a64_cpu_nb = { | ||
+ .common = &cpux_clk.common, | ||
+ .cm = &cpux_clk.mux, | ||
+ .delay_us = 1, /* > 8 clock cycles at 24 MHz */ | ||
+ .bypass_index = 1, /* index of 24 MHz oscillator */ | ||
+}; | ||
+ | ||
static int sun50i_a64_ccu_probe(struct platform_device *pdev) | ||
{ | ||
struct resource *res; | ||
void __iomem *reg; | ||
u32 val; | ||
+ int ret; | ||
|
||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
reg = devm_ioremap_resource(&pdev->dev, res); | ||
@@ -897,7 +912,16 @@ static int sun50i_a64_ccu_probe(struct platform_device *pdev) | ||
|
||
writel(0x515, reg + SUN50I_A64_PLL_MIPI_REG); | ||
|
||
- return sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_a64_ccu_desc); | ||
+ ret = sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_a64_ccu_desc); | ||
+ | ||
+ /* Gate then ungate PLL CPU after any rate changes */ | ||
+ ccu_pll_notifier_register(&sun50i_a64_pll_cpu_nb); | ||
+ | ||
+ /* Reparent CPU during PLL CPU rate changes */ | ||
+ ccu_mux_notifier_register(pll_cpux_clk.common.hw.clk, | ||
+ &sun50i_a64_cpu_nb); | ||
+ | ||
+ return ret; | ||
} | ||
|
||
static const struct of_device_id sun50i_a64_ccu_ids[] = { |
78 changes: 78 additions & 0 deletions
78
...ernel/sun50i-dev/cpufreq-dt-platdev-Automatically-create-cpufreq-device-with-OPP-v2.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
diff --git a/drivers/cpufreq/cpufreq-dt-platdev.c b/drivers/cpufreq/cpufreq-dt-platdev.c | ||
index bcee384b3251..061b468512a2 100644 | ||
--- a/drivers/cpufreq/cpufreq-dt-platdev.c | ||
+++ b/drivers/cpufreq/cpufreq-dt-platdev.c | ||
@@ -9,11 +9,16 @@ | ||
|
||
#include <linux/err.h> | ||
#include <linux/of.h> | ||
+#include <linux/of_device.h> | ||
#include <linux/platform_device.h> | ||
|
||
#include "cpufreq-dt.h" | ||
|
||
-static const struct of_device_id machines[] __initconst = { | ||
+/* | ||
+ * Machines for which the cpufreq device is *always* created, mostly used for | ||
+ * platforms using "operating-points" (V1) property. | ||
+ */ | ||
+static const struct of_device_id whitelist[] __initconst = { | ||
{ .compatible = "allwinner,sun4i-a10", }, | ||
{ .compatible = "allwinner,sun5i-a10s", }, | ||
{ .compatible = "allwinner,sun5i-a13", }, | ||
@@ -101,21 +106,51 @@ static const struct of_device_id machines[] __initconst = { | ||
{ } | ||
}; | ||
|
||
+/* | ||
+ * Machines for which the cpufreq device is *not* created, mostly used for | ||
+ * platforms using "operating-points-v2" property. | ||
+ */ | ||
+static const struct of_device_id blacklist[] __initconst = { | ||
+ { } | ||
+}; | ||
+ | ||
+static bool __init cpu0_node_has_opp_v2_prop(void) | ||
+{ | ||
+ struct device_node *np = of_cpu_device_node_get(0); | ||
+ bool ret = false; | ||
+ | ||
+ if (of_get_property(np, "operating-points-v2", NULL)) | ||
+ ret = true; | ||
+ | ||
+ of_node_put(np); | ||
+ return ret; | ||
+} | ||
+ | ||
static int __init cpufreq_dt_platdev_init(void) | ||
{ | ||
struct device_node *np = of_find_node_by_path("/"); | ||
const struct of_device_id *match; | ||
+ const void *data = NULL; | ||
|
||
if (!np) | ||
return -ENODEV; | ||
|
||
- match = of_match_node(machines, np); | ||
+ match = of_match_node(whitelist, np); | ||
+ if (match) { | ||
+ data = match->data; | ||
+ goto create_pdev; | ||
+ } | ||
+ | ||
+ if (cpu0_node_has_opp_v2_prop() && !of_match_node(blacklist, np)) | ||
+ goto create_pdev; | ||
+ | ||
of_node_put(np); | ||
- if (!match) | ||
- return -ENODEV; | ||
+ return -ENODEV; | ||
|
||
+create_pdev: | ||
+ of_node_put(np); | ||
return PTR_ERR_OR_ZERO(platform_device_register_data(NULL, "cpufreq-dt", | ||
- -1, match->data, | ||
+ -1, data, | ||
sizeof(struct cpufreq_dt_platform_data))); | ||
} | ||
device_initcall(cpufreq_dt_platdev_init); |
File renamed without changes.
File renamed without changes.
File renamed without changes.