2017-03-21 0:53 GMT+01:00 Brian Norris <briannorris@xxxxxxxxxxxx>: > 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@xxxxxxxxxxxx> > --- > v2 --> v3: no change > > v1 --> v2: > * combine the OPP table into the regulator patch, to keep from > regressing > * don't include the OPP table in top-level rk3399.dtsi, to avoid > breaking other boards > --- > arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi | 147 +++++++++++++++++++++++++++ > arch/arm64/boot/dts/rockchip/rk3399-opp.dtsi | 145 ++++++++++++++++++++++++++ > 2 files changed, 292 insertions(+) > create mode 100644 arch/arm64/boot/dts/rockchip/rk3399-opp.dtsi > > diff --git a/arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi > index 9c581173cb64..b512b27c78c5 100644 > --- a/arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi > +++ b/arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi > @@ -44,6 +44,7 @@ > > #include <dt-bindings/input/input.h> > #include "rk3399.dtsi" > +#include "rk3399-opp.dtsi" > > / { > chosen { > @@ -170,6 +171,98 @@ > 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>; > + > + /* 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>; > + > + pwm-supply = <&ppvar_sys>; > + pwm-dutycycle-range = <100 0>; > + pwm-dutycycle-unit = <100>; > + }; > + > + 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>; > + > + /* 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>; > + > + pwm-supply = <&ppvar_sys>; > + pwm-dutycycle-range = <100 0>; > + pwm-dutycycle-unit = <100>; > + }; > + > + 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>; > + > + /* 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>; > + > + pwm-supply = <&ppvar_sys>; > + pwm-dutycycle-range = <100 0>; > + pwm-dutycycle-unit = <100>; > + }; > + > + 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>; > + > + /* 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>; > + > + pwm-supply = <&ppvar_sys>; > + pwm-dutycycle-range = <100 0>; > + pwm-dutycycle-unit = <100>; > + }; > + > /* Schematics call this PPVAR even though it's fixed */ > ppvar_logic: ppvar-logic { > compatible = "regulator-fixed"; > @@ -405,6 +498,60 @@ > }; > }; > > +/* > + * 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 > index 000000000000..dd82e16236a8 > --- /dev/null > +++ b/arch/arm64/boot/dts/rockchip/rk3399-opp.dtsi > @@ -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>; > +}; > -- > 2.12.0.367.g23dc2f6d3c-goog > I don't have a kevin but I have a gru, so for the shared parts I can say Tested-by: Enric Balletbo i Serra <enric.balletbo@xxxxxxxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html