]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
arm64: dts: rockchip: describe Gru/Kevin OPPs + CPU regulators
authorBrian Norris <briannorris@chromium.org>
Mon, 20 Mar 2017 23:53:43 +0000 (16:53 -0700)
committerHeiko Stuebner <heiko@sntech.de>
Wed, 22 Mar 2017 10:54:47 +0000 (11:54 +0100)
Used for Gru/Kevin only, as they're the only ones which have a described
CPU regulator. Also, I'm not sure we've validated this table non-Gru
boards.

At the same time, partially describe PWM regulators for Gru, so cpufreq
doesn't think it can crank up the clock speed without changing the
voltage. However, we don't yet have the DT bindings to fully describe
the Over Voltage Protection (OVP) circuits on these boards. Without that
description, we might end up changing the voltage too much, too fast.

Add the pwm-regulator descriptions and associate the CPU OPPs, but leave
them disabled.

Signed-off-by: Brian Norris <briannorris@chromium.org>
[shared gru/kevin parts on a gru device]
Tested-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
[with a bit of reordering]
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi
arch/arm64/boot/dts/rockchip/rk3399-opp.dtsi [new file with mode: 0644]

index 1a57014a7b590d2398249319299acf41e7e6454c..0d960b7f7625e6e9fa1eeb805a0e27a530a006be 100644 (file)
@@ -44,6 +44,7 @@
 
 #include <dt-bindings/input/input.h>
 #include "rk3399.dtsi"
+#include "rk3399-opp.dtsi"
 
 / {
        chosen {
                vin-supply = <&ppvar_sys>;
        };
 
+       ppvar_bigcpu: ppvar-bigcpu {
+               compatible = "pwm-regulator";
+               regulator-name = "ppvar_bigcpu";
+               /*
+                * OVP circuit requires special handling which is not yet
+                * represented. Keep disabled for now.
+                */
+               status = "disabled";
+
+               pwms = <&pwm1 0 3337 0>;
+               pwm-supply = <&ppvar_sys>;
+               pwm-dutycycle-range = <100 0>;
+               pwm-dutycycle-unit = <100>;
+
+               /* EC turns on w/ ap_core_en; always on for AP */
+               regulator-always-on;
+               regulator-boot-on;
+               regulator-min-microvolt = <798674>;
+               regulator-max-microvolt = <1302172>;
+       };
+
+       ppvar_litcpu: ppvar-litcpu {
+               compatible = "pwm-regulator";
+               regulator-name = "ppvar_litcpu";
+               /*
+                * OVP circuit requires special handling which is not yet
+                * represented. Keep disabled for now.
+                */
+               status = "disabled";
+
+               pwms = <&pwm2 0 3337 0>;
+               pwm-supply = <&ppvar_sys>;
+               pwm-dutycycle-range = <100 0>;
+               pwm-dutycycle-unit = <100>;
+
+               /* EC turns on w/ ap_core_en; always on for AP */
+               regulator-always-on;
+               regulator-boot-on;
+               regulator-min-microvolt = <799065>;
+               regulator-max-microvolt = <1303738>;
+       };
+
+       ppvar_gpu: ppvar-gpu {
+               compatible = "pwm-regulator";
+               regulator-name = "ppvar_gpu";
+               /*
+                * OVP circuit requires special handling which is not yet
+                * represented. Keep disabled for now.
+                */
+               status = "disabled";
+
+               pwms = <&pwm0 0 3337 0>;
+               pwm-supply = <&ppvar_sys>;
+               pwm-dutycycle-range = <100 0>;
+               pwm-dutycycle-unit = <100>;
+
+               /* EC turns on w/ ap_core_en; always on for AP */
+               regulator-always-on;
+               regulator-boot-on;
+               regulator-min-microvolt = <785782>;
+               regulator-max-microvolt = <1217729>;
+       };
+
+       ppvar_centerlogic: ppvar-centerlogic {
+               compatible = "pwm-regulator";
+               regulator-name = "ppvar_centerlogic";
+               /*
+                * OVP circuit requires special handling which is not yet
+                * represented. Keep disabled for now.
+                */
+               status = "disabled";
+
+               pwms = <&pwm3 0 3337 0>;
+               pwm-supply = <&ppvar_sys>;
+               pwm-dutycycle-range = <100 0>;
+               pwm-dutycycle-unit = <100>;
+
+               /* EC turns on w/ ppvar_centerlogic_en; always on for AP */
+               regulator-always-on;
+               regulator-boot-on;
+               regulator-min-microvolt = <800069>;
+               regulator-max-microvolt = <1049692>;
+       };
+
        /* Schematics call this PPVAR even though it's fixed */
        ppvar_logic: ppvar-logic {
                compatible = "regulator-fixed";
        };
 };
 
+/*
+ * Set some suspend operating points to avoid OVP in suspend
+ *
+ * When we go into S3 ARM Trusted Firmware will transition our PWM regulators
+ * from wherever they're at back to the "default" operating point (whatever
+ * voltage we get when we set the PWM pins to "input").
+ *
+ * This quick transition under light load has the possibility to trigger the
+ * regulator "over voltage protection" (OVP).
+ *
+ * To make extra certain that we don't hit this OVP at suspend time, we'll
+ * transition to a voltage that's much closer to the default (~1.0 V) so that
+ * there will not be a big jump.  Technically we only need to get within 200 mV
+ * of the default voltage, but the speed here should be fast enough and we need
+ * suspend/resume to be rock solid.
+ */
+
+&cluster0_opp {
+       opp05 {
+               opp-suspend;
+       };
+};
+
+&cluster1_opp {
+       opp06 {
+               opp-suspend;
+       };
+};
+
+&cpu_l0 {
+       cpu-supply = <&ppvar_litcpu>;
+};
+
+&cpu_l1 {
+       cpu-supply = <&ppvar_litcpu>;
+};
+
+&cpu_l2 {
+       cpu-supply = <&ppvar_litcpu>;
+};
+
+&cpu_l3 {
+       cpu-supply = <&ppvar_litcpu>;
+};
+
+&cpu_b0 {
+       cpu-supply = <&ppvar_bigcpu>;
+};
+
+&cpu_b1 {
+       cpu-supply = <&ppvar_bigcpu>;
+};
+
+
 &cru {
        assigned-clocks =
                <&cru PLL_GPLL>, <&cru PLL_CPLL>,
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-opp.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-opp.dtsi
new file mode 100644 (file)
index 0000000..dd82e16
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2016-2017 Fuzhou Rockchip Electronics Co., Ltd
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ *  a) This library is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU General Public License as
+ *     published by the Free Software Foundation; either version 2 of the
+ *     License, or (at your option) any later version.
+ *
+ *     This library is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ *  b) Permission is hereby granted, free of charge, to any person
+ *     obtaining a copy of this software and associated documentation
+ *     files (the "Software"), to deal in the Software without
+ *     restriction, including without limitation the rights to use,
+ *     copy, modify, merge, publish, distribute, sublicense, and/or
+ *     sell copies of the Software, and to permit persons to whom the
+ *     Software is furnished to do so, subject to the following
+ *     conditions:
+ *
+ *     The above copyright notice and this permission notice shall be
+ *     included in all copies or substantial portions of the Software.
+ *
+ *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *     OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/ {
+       cluster0_opp: opp-table0 {
+               compatible = "operating-points-v2";
+               opp-shared;
+
+               opp00 {
+                       opp-hz = /bits/ 64 <408000000>;
+                       opp-microvolt = <800000>;
+                       clock-latency-ns = <40000>;
+               };
+               opp01 {
+                       opp-hz = /bits/ 64 <600000000>;
+                       opp-microvolt = <800000>;
+               };
+               opp02 {
+                       opp-hz = /bits/ 64 <816000000>;
+                       opp-microvolt = <800000>;
+               };
+               opp03 {
+                       opp-hz = /bits/ 64 <1008000000>;
+                       opp-microvolt = <875000>;
+               };
+               opp04 {
+                       opp-hz = /bits/ 64 <1200000000>;
+                       opp-microvolt = <925000>;
+               };
+               opp05 {
+                       opp-hz = /bits/ 64 <1416000000>;
+                       opp-microvolt = <1050000>;
+               };
+               opp06 {
+                       opp-hz = /bits/ 64 <1512000000>;
+                       opp-microvolt = <1125000>;
+               };
+       };
+
+       cluster1_opp: opp-table1 {
+               compatible = "operating-points-v2";
+               opp-shared;
+
+               opp00 {
+                       opp-hz = /bits/ 64 <408000000>;
+                       opp-microvolt = <800000>;
+                       clock-latency-ns = <40000>;
+               };
+               opp01 {
+                       opp-hz = /bits/ 64 <600000000>;
+                       opp-microvolt = <800000>;
+               };
+               opp02 {
+                       opp-hz = /bits/ 64 <816000000>;
+                       opp-microvolt = <825000>;
+               };
+               opp03 {
+                       opp-hz = /bits/ 64 <1008000000>;
+                       opp-microvolt = <875000>;
+               };
+               opp04 {
+                       opp-hz = /bits/ 64 <1200000000>;
+                       opp-microvolt = <950000>;
+               };
+               opp05 {
+                       opp-hz = /bits/ 64 <1416000000>;
+                       opp-microvolt = <1025000>;
+               };
+               opp06 {
+                       opp-hz = /bits/ 64 <1608000000>;
+                       opp-microvolt = <1075000>;
+               };
+               opp07 {
+                       opp-hz = /bits/ 64 <1800000000>;
+                       opp-microvolt = <1150000>;
+               };
+               opp08 {
+                       opp-hz = /bits/ 64 <2016000000>;
+                       opp-microvolt = <1250000>;
+               };
+       };
+};
+
+&cpu_l0 {
+       operating-points-v2 = <&cluster0_opp>;
+};
+
+&cpu_l1 {
+       operating-points-v2 = <&cluster0_opp>;
+};
+
+&cpu_l2 {
+       operating-points-v2 = <&cluster0_opp>;
+};
+
+&cpu_l3 {
+       operating-points-v2 = <&cluster0_opp>;
+};
+
+&cpu_b0 {
+       operating-points-v2 = <&cluster1_opp>;
+};
+
+&cpu_b1 {
+       operating-points-v2 = <&cluster1_opp>;
+};