From 7d4346817f31105ed07dd4e3e9fd2294c85a5fee Mon Sep 17 00:00:00 2001
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
Date: Wed, 19 Jan 2022 17:29:13 +0000
Subject: [PATCH] dtoverlays: Add option for PoE HAT to use Linux I2C
 instead of FW.

Adds parameter "i2c" to use the PoE HAT I2C MFD driver to instantiate
the PoE HAT drivers, instead of being off the firmware.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
---
 arch/arm/boot/dts/overlays/README             |  4 ++
 .../arm/boot/dts/overlays/rpi-poe-overlay.dts | 62 +++++++++++++++----
 .../dts/overlays/rpi-poe-plus-overlay.dts     | 15 +++++
 3 files changed, 69 insertions(+), 12 deletions(-)

--- a/arch/arm/boot/dts/overlays/README
+++ b/arch/arm/boot/dts/overlays/README
@@ -2858,6 +2858,8 @@ Params: poe_fan_temp0           Temperat
                                 speeds up (default 55000)
         poe_fan_temp3_hyst      Temperature delta (in millicelcius) at which
                                 the fan slows down (default 5000)
+        i2c                     Control the fan via Linux I2C drivers instead of
+                                the firmware.
 
 
 Name:   rpi-poe-plus
@@ -2879,6 +2881,8 @@ Params: poe_fan_temp0           Temperat
                                 speeds up (default 55000)
         poe_fan_temp3_hyst      Temperature delta (in millicelcius) at which
                                 the fan slows down (default 5000)
+        i2c                     Control the fan via Linux I2C drivers instead of
+                                the firmware.
 
 
 Name:   rpi-proto
--- a/arch/arm/boot/dts/overlays/rpi-poe-overlay.dts
+++ b/arch/arm/boot/dts/overlays/rpi-poe-overlay.dts
@@ -8,16 +8,6 @@
 	compatible = "brcm,bcm2835";
 
 	fragment@0 {
-		target = <&firmware>;
-		__overlay__ {
-			fwpwm: pwm {
-				compatible = "raspberrypi,firmware-poe-pwm";
-				#pwm-cells = <2>;
-			};
-		};
-	};
-
-	fragment@1 {
 		target-path = "/";
 		__overlay__ {
 			fan: pwm-fan {
@@ -29,7 +19,7 @@
 		};
 	};
 
-	fragment@2 {
+	fragment@1 {
 		target = <&cpu_thermal>;
 		__overlay__ {
 			trips {
@@ -75,7 +65,7 @@
 		};
 	};
 
-	fragment@3 {
+	fragment@2 {
 		target-path = "/__overrides__";
 		__overlay__ {
 			poe_fan_temp0 =		<&trip0>,"temperature:0";
@@ -89,6 +79,52 @@
 		};
 	};
 
+	fragment@3 {
+		target = <&firmware>;
+		__overlay__ {
+			fwpwm: pwm {
+				compatible = "raspberrypi,firmware-poe-pwm";
+				#pwm-cells = <2>;
+			};
+		};
+	};
+
+	fragment@4 {
+		target = <&i2c0>;
+		__dormant__ {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			status = "okay";
+
+			poe_mfd: poe@51 {
+				compatible = "raspberrypi,poe-core";
+				reg = <0x51>;
+				status = "okay";
+
+				poe_mfd_pwm: poe_pwm@f0 {
+					compatible = "raspberrypi,poe-pwm";
+					reg = <0xf0>;
+					status = "okay";
+					#pwm-cells = <2>;
+				};
+			};
+		};
+	};
+
+	fragment@5 {
+		target = <&i2c0if>;
+		__dormant__ {
+			status = "okay";
+		};
+	};
+
+	fragment@6 {
+		target = <&i2c0mux>;
+		__dormant__ {
+			status = "okay";
+		};
+	};
+
 	__overrides__ {
 		poe_fan_temp0 =		<&trip0>,"temperature:0";
 		poe_fan_temp0_hyst =	<&trip0>,"hysteresis:0";
@@ -98,5 +134,7 @@
 		poe_fan_temp2_hyst =	<&trip2>,"hysteresis:0";
 		poe_fan_temp3 =		<&trip3>,"temperature:0";
 		poe_fan_temp3_hyst =	<&trip3>,"hysteresis:0";
+		i2c =			<0>, "-3+4+5+6",
+					<&fan>,"pwms:0=",<&poe_mfd_pwm>;
 	};
 };
--- a/arch/arm/boot/dts/overlays/rpi-poe-plus-overlay.dts
+++ b/arch/arm/boot/dts/overlays/rpi-poe-plus-overlay.dts
@@ -16,6 +16,21 @@
 			};
 		};
 	};
+	fragment@11 {
+		target = <&poe_mfd>;
+		__dormant__ {
+			rpi-poe-power-supply@f2 {
+				compatible = "raspberrypi,rpi-poe-power-supply";
+				reg = <0xf2>;
+				status = "okay";
+			};
+		};
+	};
+
+	__overrides__ {
+		i2c =	<0>, "-3+4+5+6-10+11",
+			<&fan>,"pwms:0=",<&poe_mfd_pwm>;
+	};
 };
 
 &fan {
