[openwrt/openwrt] mvebu: improve thermal management of IEI Puzzle devices

LEDE Commits lede-commits at lists.infradead.org
Sat Jun 1 08:40:31 PDT 2024


dangole pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/ac783b419b279cf2b026baa4bb3626bc00f0c8a9

commit ac783b419b279cf2b026baa4bb3626bc00f0c8a9
Author: Daniel Golle <daniel at makrotopia.org>
AuthorDate: Thu May 2 13:21:09 2024 +0100

    mvebu: improve thermal management of IEI Puzzle devices
    
     - Make step_wise thermal governor respect hysteresis
       This is done by importing a downstream patch, backporting the same feature
       now present in Linux v6.10+ would be too messy.
     - Introduce thermal zone for the WT61P803 uC (chassis and board sensors)
     - Introduce thermal zones for AQR NBase-T PHYs
     - No longer modify existing SoC thermal zones (which are now only in charge
       for emergency shutdown, and can be interrupt driven instead of polled)
    
    Signed-off-by: Daniel Golle <daniel at makrotopia.org>
    Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
---
 .../arm64/boot/dts/marvell/cn9131-puzzle-m901.dts  | 106 ++++++++++++++--
 .../arm64/boot/dts/marvell/cn9132-puzzle-m902.dts  | 134 +++++++++++++++++----
 .../arm64/boot/dts/marvell/puzzle-thermal.dtsi     | 128 ++++++++++----------
 ...rmal-step_wise-add-support-for-hysteresis.patch |  65 ++++++++++
 ...rivers-hwmon-wt61p803-puzzle-thermal-zone.patch |  10 ++
 5 files changed, 337 insertions(+), 106 deletions(-)

diff --git a/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/cn9131-puzzle-m901.dts b/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/cn9131-puzzle-m901.dts
index d214853f1b..b3e3d0a1e0 100644
--- a/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/cn9131-puzzle-m901.dts
+++ b/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/cn9131-puzzle-m901.dts
@@ -54,6 +54,91 @@
 			gpios = <&cp0_gpio2 4 GPIO_ACTIVE_LOW>;
 		};
 	};
+
+	thermal-zones {
+		chassis-thermal {
+			polling-delay = <5000>;
+			thermal-sensors = <&puzzle_hwmon 0>, <&puzzle_hwmon 1>;
+
+			trips {
+				chassis_very_hot: trip-point3 {
+					temperature = <55000>;
+					hysteresis = <5000>;
+					type = "active";
+				};
+
+				chassis_hot: trip-point2 {
+					temperature = <50000>;
+					hysteresis = <5000>;
+					type = "active";
+				};
+
+				chassis_warm: trip-point1 {
+					temperature = <45000>;
+					hysteresis = <5000>;
+					type = "active";
+				};
+
+				chassis_cold: trip-point0 {
+					temperature = <40000>;
+					hysteresis = <5000>;
+					type = "active";
+				};
+			};
+
+			cooling-maps {
+				map3 {
+					trip = <&chassis_very_hot>;
+					cooling-device = <&chassis_fan_group0 6 6>;
+				};
+
+				map2 {
+					trip = <&chassis_hot>;
+					cooling-device = <&chassis_fan_group0 3 3>;
+				};
+
+				map1 {
+					trip = <&chassis_warm>;
+					cooling-device = <&chassis_fan_group0 1 1>;
+				};
+
+				map0 {
+					trip = <&chassis_cold>;
+					cooling-device = <&chassis_fan_group0 0 0>;
+				};
+			};
+		};
+
+		cp0-phy0-thermal {
+			thermal-sensors = <&cp0_nbaset_phy0>;
+			PUZZLE_FAN_THERMAL(cp0_phy0, &chassis_fan_group0);
+		};
+
+		cp0-phy1-thermal {
+			thermal-sensors = <&cp0_nbaset_phy1>;
+			PUZZLE_FAN_THERMAL(cp0_phy1, &chassis_fan_group0);
+		};
+
+		cp0-phy2-thermal {
+			thermal-sensors = <&cp0_nbaset_phy2>;
+			PUZZLE_FAN_THERMAL(cp0_phy2, &chassis_fan_group0);
+		};
+
+		cp1-phy0-thermal {
+			thermal-sensors = <&cp1_nbaset_phy0>;
+			PUZZLE_FAN_THERMAL(cp1_phy0, &chassis_fan_group0);
+		};
+
+		cp1-phy1-thermal {
+			thermal-sensors = <&cp1_nbaset_phy1>;
+			PUZZLE_FAN_THERMAL(cp1_phy1, &chassis_fan_group0);
+		};
+
+		cp1-phy2-thermal {
+			thermal-sensors = <&cp1_nbaset_phy2>;
+			PUZZLE_FAN_THERMAL(cp1_phy2, &chassis_fan_group0);
+		};
+	};
 };
 
 &uart0 {
@@ -104,10 +189,11 @@
 			};
 		};
 
-		hwmon {
+		puzzle_hwmon: hwmon {
 			compatible = "iei,wt61p803-puzzle-hwmon";
 			#address-cells = <1>;
 			#size-cells = <0>;
+			#thermal-sensor-cells = <1>;
 
 			chassis_fan_group0: fan-group at 0 {
 				#cooling-cells = <2>;
@@ -118,14 +204,6 @@
 	};
 };
 
-&ap_thermal_ic {
-	PUZZLE_FAN_THERMAL(ic, &chassis_fan_group0);
-};
-
-&cp0_thermal_ic {
-	PUZZLE_FAN_THERMAL(cp0, &chassis_fan_group0);
-};
-
 /* on-board eMMC - U9 */
 &ap_sdhci0 {
 	pinctrl-names = "default";
@@ -144,14 +222,17 @@
 	cp0_nbaset_phy0: ethernet-phy at 0 {
 		compatible = "ethernet-phy-ieee802.3-c45";
 		reg = <2>;
+		#thermal-sensor-cells = <0>;
 	};
 	cp0_nbaset_phy1: ethernet-phy at 1 {
 		compatible = "ethernet-phy-ieee802.3-c45";
 		reg = <0>;
+		#thermal-sensor-cells = <0>;
 	};
 	cp0_nbaset_phy2: ethernet-phy at 2 {
 		compatible = "ethernet-phy-ieee802.3-c45";
 		reg = <8>;
+		#thermal-sensor-cells = <0>;
 	};
 };
 
@@ -313,14 +394,17 @@
 	cp1_nbaset_phy0: ethernet-phy at 3 {
 		compatible = "ethernet-phy-ieee802.3-c45";
 		reg = <2>;
+		#thermal-sensor-cells = <0>;
 	};
 	cp1_nbaset_phy1: ethernet-phy at 4 {
 		compatible = "ethernet-phy-ieee802.3-c45";
 		reg = <0>;
+		#thermal-sensor-cells = <0>;
 	};
 	cp1_nbaset_phy2: ethernet-phy at 5 {
 		compatible = "ethernet-phy-ieee802.3-c45";
 		reg = <8>;
+		#thermal-sensor-cells = <0>;
 	};
 };
 
@@ -399,10 +483,6 @@
 	};
 };
 
-&cp1_thermal_ic {
-	PUZZLE_FAN_THERMAL(cp1, &chassis_fan_group0);
-};
-
 &cp1_usb3_1 {
 	status = "okay";
 	phys = <&cp1_comphy3 1>;
diff --git a/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/cn9132-puzzle-m902.dts b/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/cn9132-puzzle-m902.dts
index 8c775e4a4f..f1cae8e5e4 100644
--- a/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/cn9132-puzzle-m902.dts
+++ b/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/cn9132-puzzle-m902.dts
@@ -99,6 +99,96 @@
 		tx-fault-gpio = <&cp2_module_expander1 8 GPIO_ACTIVE_HIGH>;
 		status = "disabled";
 	};
+
+	thermal-zones {
+		chassis-thermal {
+			polling-delay = <5000>;
+			thermal-sensors = <&puzzle_hwmon 0>, <&puzzle_hwmon 1>;
+
+			trips {
+				chassis_very_hot: trip-point2 {
+					temperature = <55000>;
+					hysteresis = <5000>;
+					type = "active";
+				};
+
+				chassis_hot: trip-point1 {
+					temperature = <50000>;
+					hysteresis = <5000>;
+					type = "active";
+				};
+
+				chassis_warm: trip-point0 {
+					temperature = <45000>;
+					hysteresis = <5000>;
+					type = "active";
+				};
+			};
+
+			cooling-maps {
+				map2 {
+					trip = <&chassis_very_hot>;
+					cooling-device = <&chassis_fan_group0 6 6>;
+				};
+
+				map1 {
+					trip = <&chassis_hot>;
+					cooling-device = <&chassis_fan_group0 3 3>;
+				};
+
+				map0 {
+					trip = <&chassis_warm>;
+					cooling-device = <&chassis_fan_group0 1 1>;
+				};
+			};
+		};
+
+		cp0-phy0-thermal {
+			thermal-sensors = <&cp0_nbaset_phy0>;
+			PUZZLE_FAN_THERMAL(cp0_phy0, &chassis_fan_group0);
+		};
+
+		cp0-phy1-thermal {
+			thermal-sensors = <&cp0_nbaset_phy1>;
+			PUZZLE_FAN_THERMAL(cp0_phy1, &chassis_fan_group0);
+		};
+
+		cp0-phy2-thermal {
+			thermal-sensors = <&cp0_nbaset_phy2>;
+			PUZZLE_FAN_THERMAL(cp0_phy2, &chassis_fan_group0);
+		};
+
+		cp1-phy0-thermal {
+			thermal-sensors = <&cp1_nbaset_phy0>;
+			PUZZLE_FAN_THERMAL(cp1_phy0, &chassis_fan_group0);
+		};
+
+		cp1-phy1-thermal {
+			thermal-sensors = <&cp1_nbaset_phy1>;
+			PUZZLE_FAN_THERMAL(cp1_phy1, &chassis_fan_group0);
+		};
+
+		cp1-phy2-thermal {
+			thermal-sensors = <&cp1_nbaset_phy2>;
+			PUZZLE_FAN_THERMAL(cp1_phy2, &chassis_fan_group0);
+		};
+
+		cp2-phy0-thermal {
+			thermal-sensors = <&cp2_nbaset_phy0>;
+			PUZZLE_FAN_THERMAL(cp2_phy0, &chassis_fan_group0);
+		};
+
+		cp2-phy1-thermal {
+			thermal-sensors = <&cp2_nbaset_phy1>;
+			PUZZLE_FAN_THERMAL(cp2_phy1, &chassis_fan_group0);
+		};
+
+		cp2-phy2-thermal {
+			thermal-sensors = <&cp2_nbaset_phy2>;
+			PUZZLE_FAN_THERMAL(cp2_phy2, &chassis_fan_group0);
+		};
+	};
+
 };
 
 &uart0 {
@@ -149,7 +239,7 @@
 			};
 		};
 
-		hwmon {
+		puzzle_hwmon: hwmon {
 			compatible = "iei,wt61p803-puzzle-hwmon";
 			#address-cells = <1>;
 			#size-cells = <0>;
@@ -163,15 +253,6 @@
 	};
 };
 
-&ap_thermal_ic {
-	PUZZLE_FAN_THERMAL(ic, &chassis_fan_group0);
-};
-
-&cp0_thermal_ic {
-	PUZZLE_FAN_THERMAL(cp0, &chassis_fan_group0);
-};
-
-
 /* on-board eMMC - U9 */
 &ap_sdhci0 {
 	pinctrl-names = "default";
@@ -187,17 +268,20 @@
 
 &cp0_xmdio {
 	status = "okay";
-	cp0_nbaset_phy0: ethernet-phy at 0 {
+	cp0_nbaset_phy0: ethernet-phy at 2 {
 		compatible = "ethernet-phy-ieee802.3-c45";
 		reg = <2>;
+		#thermal-sensor-cells = <0>;
 	};
-	cp0_nbaset_phy1: ethernet-phy at 1 {
+	cp0_nbaset_phy1: ethernet-phy at 0 {
 		compatible = "ethernet-phy-ieee802.3-c45";
 		reg = <0>;
+		#thermal-sensor-cells = <0>;
 	};
-	cp0_nbaset_phy2: ethernet-phy at 2 {
+	cp0_nbaset_phy2: ethernet-phy at 8 {
 		compatible = "ethernet-phy-ieee802.3-c45";
 		reg = <8>;
+		#thermal-sensor-cells = <0>;
 	};
 };
 
@@ -374,17 +458,20 @@
 
 &cp1_xmdio {
 	status = "okay";
-	cp1_nbaset_phy0: ethernet-phy at 3 {
+	cp1_nbaset_phy0: ethernet-phy at 2 {
 		compatible = "ethernet-phy-ieee802.3-c45";
 		reg = <2>;
+		#thermal-sensor-cells = <0>;
 	};
-	cp1_nbaset_phy1: ethernet-phy at 4 {
+	cp1_nbaset_phy1: ethernet-phy at 0 {
 		compatible = "ethernet-phy-ieee802.3-c45";
 		reg = <0>;
+		#thermal-sensor-cells = <0>;
 	};
-	cp1_nbaset_phy2: ethernet-phy at 5 {
+	cp1_nbaset_phy2: ethernet-phy at 8 {
 		compatible = "ethernet-phy-ieee802.3-c45";
 		reg = <8>;
+		#thermal-sensor-cells = <0>;
 	};
 };
 
@@ -451,10 +538,6 @@
 	};
 };
 
-&cp1_thermal_ic {
-	PUZZLE_FAN_THERMAL(cp1, &chassis_fan_group0);
-};
-
 /*
  * Instantiate the second connected CP115
  */
@@ -487,17 +570,20 @@
 
 &cp2_xmdio {
 	status = "okay";
-	cp2_nbaset_phy0: ethernet-phy at 6 {
+	cp2_nbaset_phy0: ethernet-phy at 2 {
 		compatible = "ethernet-phy-ieee802.3-c45";
 		reg = <2>;
+		#thermal-sensor-cells = <0>;
 	};
-	cp2_nbaset_phy1: ethernet-phy at 7 {
+	cp2_nbaset_phy1: ethernet-phy at 0 {
 		compatible = "ethernet-phy-ieee802.3-c45";
 		reg = <0>;
+		#thermal-sensor-cells = <0>;
 	};
 	cp2_nbaset_phy2: ethernet-phy at 8 {
 		compatible = "ethernet-phy-ieee802.3-c45";
 		reg = <8>;
+		#thermal-sensor-cells = <0>;
 	};
 };
 
@@ -574,7 +660,3 @@
 		};
 	};
 };
-
-&cp2_thermal_ic {
-	PUZZLE_FAN_THERMAL(cp2, &chassis_fan_group0);
-};
diff --git a/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/puzzle-thermal.dtsi b/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/puzzle-thermal.dtsi
index ea79ab224e..d347a429ae 100644
--- a/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/puzzle-thermal.dtsi
+++ b/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/puzzle-thermal.dtsi
@@ -1,68 +1,62 @@
-#define PUZZLE_FAN_THERMAL(_cname, _fan)					\
-	polling-delay-passive = <500>;						\
-	polling-delay = <1000>;							\
-										\
-	trips {									\
-		cpu-hot {							\
-			temperature = <75000>;					\
-			hysteresis = <5000>;					\
-			type = "hot";						\
-		};								\
-		_cname##_active_full: cpu-active-full {				\
-			temperature = <70000>;					\
-			hysteresis = <5000>;					\
-			type = "active";					\
-		};								\
-		_cname##_active_high: cpu-active-high {				\
-			temperature = <65000>;					\
-			hysteresis = <5000>;					\
-			type = "active";					\
-		};								\
-		_cname##_active_med: cpu-active-med {				\
-			temperature = <62500>;					\
-			hysteresis = <3000>;					\
-			type = "active";					\
-		};								\
-		_cname##_active_low: cpu-active-low {				\
-			temperature = <60000>;					\
-			hysteresis = <3000>;					\
-			type = "active";					\
-		};								\
-		_cname##_active_min: cpu-active-min {				\
-			temperature = <55000>;					\
-			hysteresis = <5000>;					\
-			type = "active";					\
-		};								\
-		_cname##_active_idle: cpu-active-idle {				\
-			temperature = <50000>;					\
-			hysteresis = <5000>;					\
-			type = "active";					\
-		};								\
-	};									\
-	cooling-maps {								\
-		cpu-active-full {						\
-			trip = <&_cname##_active_full>;				\
-			cooling-device = <_fan THERMAL_NO_LIMIT			\
-					       THERMAL_NO_LIMIT>;		\
-		};								\
-		cpu-active-high {						\
-			trip = <&_cname##_active_high>;				\
-			cooling-device = <_fan 4 5>;				\
-		};								\
-		cpu-active-med {						\
-			trip = <&_cname##_active_med>;				\
-			cooling-device = <_fan 3 4>;				\
-		};								\
-		cpu-active-low {						\
-			trip = <&_cname##_active_low>;				\
-			cooling-device = <_fan 2 3>;				\
-		};								\
-		cpu-active-min {						\
-			trip = <&_cname##_active_min>;				\
-			cooling-device = <_fan 1 2>;				\
-		};								\
-		cpu-active-idle {						\
-			trip = <&_cname##_active_idle>;				\
-			cooling-device = <_fan 0 0>;				\
-		};								\
+#define PUZZLE_FAN_THERMAL(_cname, _fan)				\
+	polling-delay-passive = <500>;					\
+	polling-delay = <1000>;						\
+									\
+	trips {								\
+		_cname##_active_full: trip-point5 {			\
+			temperature = <70000>;				\
+			hysteresis = <3000>;				\
+			type = "active";				\
+		};							\
+		_cname##_active_very_high: trip-point4 {		\
+			temperature = <67500>;				\
+			hysteresis = <3000>;				\
+			type = "active";				\
+		};							\
+		_cname##_active_high: trip-point3 {			\
+			temperature = <65000>;				\
+			hysteresis = <5000>;				\
+			type = "active";				\
+		};							\
+		_cname##_active_med: trip-point2 {			\
+			temperature = <62500>;				\
+			hysteresis = <3000>;				\
+			type = "active";				\
+		};							\
+		_cname##_active_low: trip-point1 {			\
+			temperature = <60000>;				\
+			hysteresis = <3000>;				\
+			type = "active";				\
+		};							\
+		_cname##_active_min: trip-point0 {			\
+			temperature = <55000>;				\
+			hysteresis = <5000>;				\
+			type = "active";				\
+		};							\
+	};								\
+	cooling-maps {							\
+		map5 {							\
+			trip = <&_cname##_active_full>;			\
+			cooling-device = <_fan 6 6>;			\
+		};							\
+		map4 {							\
+			trip = <&_cname##_active_very_high>;		\
+			cooling-device = <_fan 5 5>;			\
+		};							\
+		map3 {							\
+			trip = <&_cname##_active_high>;			\
+			cooling-device = <_fan 4 4>;			\
+		};							\
+		map2 {							\
+			trip = <&_cname##_active_med>;			\
+			cooling-device = <_fan 3 3>;			\
+		};							\
+		map1 {							\
+			trip = <&_cname##_active_low>;			\
+			cooling-device = <_fan 2 2>;			\
+		};							\
+		map0 {							\
+			trip = <&_cname##_active_min>;			\
+			cooling-device = <_fan 1 1>;			\
+		};							\
 	}
diff --git a/target/linux/mvebu/patches-6.6/350-drivers-thermal-step_wise-add-support-for-hysteresis.patch b/target/linux/mvebu/patches-6.6/350-drivers-thermal-step_wise-add-support-for-hysteresis.patch
new file mode 100644
index 0000000000..e7332b6df0
--- /dev/null
+++ b/target/linux/mvebu/patches-6.6/350-drivers-thermal-step_wise-add-support-for-hysteresis.patch
@@ -0,0 +1,65 @@
+From 9685ce100f0d302501117113ef0a526ad1acca1d Mon Sep 17 00:00:00 2001
+From: Ram Chandrasekar <rkumbako at codeaurora.org>
+Date: Mon, 7 May 2018 11:54:08 -0600
+Subject: [PATCH] drivers: thermal: step_wise: add support for hysteresis
+
+Step wise governor increases the mitigation level when the temperature
+goes above a threshold and will decrease the mitigation when the
+temperature falls below the threshold. If it were a case, where the
+temperature hovers around a threshold, the mitigation will be applied
+and removed at every iteration. This reaction to the temperature is
+inefficient for performance.
+
+The use of hysteresis temperature could avoid this ping-pong of
+mitigation by relaxing the mitigation to happen only when the
+temperature goes below this lower hysteresis value.
+
+Signed-off-by: Ram Chandrasekar <rkumbako at codeaurora.org>
+Signed-off-by: Lina Iyer <ilina at codeaurora.org>
+[forward-ported for Linux 6.6, as stop-gap downstream solution]
+Signed-off-by: Daniel Golle <daniel at makrotopia.org>
+---
+ drivers/thermal/gov_step_wise.c | 23 ++++++++++++++++-------
+ 1 file changed, 16 insertions(+), 7 deletions(-)
+
+--- a/drivers/thermal/gov_step_wise.c
++++ b/drivers/thermal/gov_step_wise.c
+@@ -86,22 +86,31 @@ static void thermal_zone_trip_update(str
+ 	struct thermal_instance *instance;
+ 	bool throttle = false;
+ 	int old_target;
++	int hyst_temp;
+ 
+ 	trend = get_tz_trend(tz, trip_id);
+ 
+-	if (tz->temperature >= trip->temperature) {
+-		throttle = true;
+-		trace_thermal_zone_trip(tz, trip_id, trip->type);
+-	}
+-
+-	dev_dbg(&tz->device, "Trip%d[type=%d,temp=%d]:trend=%d,throttle=%d\n",
+-		trip_id, trip->type, trip->temperature, trend, throttle);
++	hyst_temp =  trip->temperature - trip->hysteresis;
++	dev_dbg(&tz->device, "Trip%d[type=%d,temp=%d,hyst=%d]:trend=%d,throttle=%d\n",
++		trip_id, trip->type, trip->temperature, hyst_temp, trend, throttle);
+ 
+ 	list_for_each_entry(instance, &tz->thermal_instances, tz_node) {
+ 		if (instance->trip != trip)
+ 			continue;
+ 
+ 		old_target = instance->target;
++		throttle = false;
++		/*
++		 * Lower the mitigation only if the temperature
++		 * goes below the hysteresis temperature.
++		 */
++		if (tz->temperature >= trip->temperature ||
++		   (tz->temperature >= hyst_temp &&
++		   old_target != THERMAL_NO_TARGET)) {
++			throttle = true;
++			trace_thermal_zone_trip(tz, trip_id, trip->type);
++		}
++
+ 		instance->target = get_target_state(instance, trend, throttle);
+ 		dev_dbg(&instance->cdev->device, "old_target=%d, target=%d\n",
+ 					old_target, (int)instance->target);
diff --git a/target/linux/mvebu/patches-6.6/912-drivers-hwmon-wt61p803-puzzle-thermal-zone.patch b/target/linux/mvebu/patches-6.6/912-drivers-hwmon-wt61p803-puzzle-thermal-zone.patch
new file mode 100644
index 0000000000..4633c03855
--- /dev/null
+++ b/target/linux/mvebu/patches-6.6/912-drivers-hwmon-wt61p803-puzzle-thermal-zone.patch
@@ -0,0 +1,10 @@
+--- a/drivers/hwmon/iei-wt61p803-puzzle-hwmon.c
++++ b/drivers/hwmon/iei-wt61p803-puzzle-hwmon.c
+@@ -251,6 +251,7 @@ static const struct hwmon_ops iei_wt61p8
+ };
+ 
+ static const struct hwmon_channel_info *iei_wt61p803_puzzle_info[] = {
++	HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ),
+ 	HWMON_CHANNEL_INFO(pwm,
+ 			   HWMON_PWM_INPUT,
+ 			   HWMON_PWM_INPUT),




More information about the lede-commits mailing list