File 99-fairydust.patch of Package kernel-asahi

diff --git a/arch/arm64/boot/dts/apple/t6001-j375c.dts b/arch/arm64/boot/dts/apple/t6001-j375c.dts
index f3f98f038009..844bee0c4fdf 100644
--- a/arch/arm64/boot/dts/apple/t6001-j375c.dts
+++ b/arch/arm64/boot/dts/apple/t6001-j375c.dts
@@ -9,6 +9,8 @@
 
 /dts-v1/;
 
+#define ENABLE_DCPEXT_TYPEC
+
 #include "t6001.dtsi"
 #include "t600x-j375.dtsi"
 
diff --git a/arch/arm64/boot/dts/apple/t6002-j375d.dts b/arch/arm64/boot/dts/apple/t6002-j375d.dts
index 5cf30cd162b6..1eedbfecfc38 100644
--- a/arch/arm64/boot/dts/apple/t6002-j375d.dts
+++ b/arch/arm64/boot/dts/apple/t6002-j375d.dts
@@ -9,6 +9,8 @@
 
 /dts-v1/;
 
+#define ENABLE_DCPEXT_TYPEC
+
 #include "t6002.dtsi"
 #include "t600x-j375.dtsi"
 
diff --git a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi
index 8d030df13bf5..e8b58b8e8005 100644
--- a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi
+++ b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi
@@ -9,6 +9,8 @@
  * Copyright The Asahi Linux Contributors
  */
 
+#define ENABLE_DCPEXT_TYPEC
+
 #include <dt-bindings/leds/common.h>
 
 / {
@@ -22,6 +24,9 @@ aliases {
 		bluetooth0 = &bluetooth0;
 		dcp = &dcp;
 		dcpext0 = &dcpext0;
+#ifdef ENABLE_DCPEXT_TYPEC
+		dcpext1 = &dcpext1;
+#endif
 		disp0 = &display;
 		disp0_piodma = &disp0_piodma;
 		serial0 = &serial0;
@@ -186,6 +191,11 @@ typec1: connector {
 			power-role = "dual";
 			data-role = "dual";
 
+#ifdef ENABLE_DCPEXT_TYPEC
+			/* hacks */
+			displayport = <&dcpext1>;
+#endif
+
 			ports {
 				#address-cells = <1>;
 				#size-cells = <0>;
@@ -247,6 +257,50 @@ hpm5: usb-pd@3a {
 	};
 };
 
+#ifdef ENABLE_DCPEXT_TYPEC
+
+&display {
+	iommus = <&disp0_dart 0>, <&dispext0_dart 0>, <&dispext1_dart 0>;
+};
+
+&dispext1_dart {
+	status = "okay";
+};
+
+&dcpext1_dart {
+	status = "okay";
+};
+
+&dcpext1_mbox {
+	status = "okay";
+};
+
+&dcpext1 {
+	status = "okay";
+	apple,connector-type = "DP";
+
+	/* hacks */
+	apple,dptx-phy = <1>;
+	phys = <&atcphy1 PHY_TYPE_DP>;
+	phy-names = "dp-phy";
+	mux-controls = <&atcphy1_xbar 0>;
+	mux-control-names = "dp-xbar";
+	mux-index = <2>;
+};
+
+&dpaudio2 {
+	status = "okay";
+};
+
+&atcphy1_xbar {
+        status = "okay";
+};
+
+&ps_atc1_common {
+	apple,always-on; /* Needs to stay on for DP-alt suspend/resume */
+};
+#endif
+
 /* Virtual regulator representing the shared shutdown GPIO */
 / {
 	speaker_sdz: fixed-regulator-sn012776-sdz {
diff --git a/arch/arm64/boot/dts/apple/t600x-j375.dtsi b/arch/arm64/boot/dts/apple/t600x-j375.dtsi
index a5ee97241214..dda5f68b9782 100644
--- a/arch/arm64/boot/dts/apple/t600x-j375.dtsi
+++ b/arch/arm64/boot/dts/apple/t600x-j375.dtsi
@@ -23,6 +23,9 @@ aliases {
 		disp0 = &display;
 		disp0_piodma = &disp0_piodma;
 		#endif
+#ifdef ENABLE_DCPEXT_TYPEC
+		dcpext1 = &dcpext1;
+#endif
 		ethernet0 = &ethernet0;
 		serial0 = &serial0;
 		sio = &sio;
@@ -111,6 +114,11 @@ typec1: connector {
 			power-role = "dual";
 			data-role = "dual";
 
+#ifdef ENABLE_DCPEXT_TYPEC
+			/* hacks */
+			displayport = <&dcpext1>;
+#endif
+
 			ports {
 				#address-cells = <1>;
 				#size-cells = <0>;
@@ -195,6 +203,49 @@ typec3_connector_ss: endpoint {
 	};
 };
 
+#ifdef ENABLE_DCPEXT_TYPEC
+&display {
+	iommus = <&disp0_dart 0>, <&dispext1_dart 0>;
+};
+
+&dispext1_dart {
+	status = "okay";
+};
+
+&dcpext1_dart {
+	status = "okay";
+};
+
+&dcpext1_mbox {
+	status = "okay";
+};
+
+&dcpext1 {
+	status = "okay";
+	apple,connector-type = "DP";
+
+	/* hacks */
+	apple,dptx-phy = <1>;
+	phys = <&atcphy1 PHY_TYPE_DP>;
+	phy-names = "dp-phy";
+	mux-controls = <&atcphy1_xbar 0>;
+	mux-control-names = "dp-xbar";
+	mux-index = <2>;
+};
+
+&dpaudio2 {
+	status = "okay";
+};
+
+&atcphy1_xbar {
+        status = "okay";
+};
+
+&ps_atc1_common {
+	apple,always-on; /* Needs to stay on for DP-alt suspend/resume */
+};
+#endif
+
 /* USB controllers */
 &dwc3_0 {
 	ports {
diff --git a/arch/arm64/boot/dts/apple/t6020-j474s.dts b/arch/arm64/boot/dts/apple/t6020-j474s.dts
index 12dfe9693502..cfe7f8ac7306 100644
--- a/arch/arm64/boot/dts/apple/t6020-j474s.dts
+++ b/arch/arm64/boot/dts/apple/t6020-j474s.dts
@@ -9,6 +9,8 @@
 
 /dts-v1/;
 
+#define ENABLE_DCPEXT_TYPEC
+
 #include "t6020.dtsi"
 
 /*
@@ -85,7 +87,11 @@ &dcp {
 	status = "disabled";
 };
 &display {
+#ifdef ENABLE_DCPEXT_TYPEC
+	iommus = <&dispext0_dart 0>, <&dispext1_dart 0>;
+#else
 	iommus = <&dispext0_dart 0>;
+#endif
 };
 &dispext0_dart {
 	status = "okay";
diff --git a/arch/arm64/boot/dts/apple/t6021-j475c.dts b/arch/arm64/boot/dts/apple/t6021-j475c.dts
index e4321cfc5568..ce08d5a42761 100644
--- a/arch/arm64/boot/dts/apple/t6021-j475c.dts
+++ b/arch/arm64/boot/dts/apple/t6021-j475c.dts
@@ -9,6 +9,8 @@
 
 /dts-v1/;
 
+#define ENABLE_DCPEXT_TYPEC
+
 #include "t6021.dtsi"
 #include "t602x-j474-j475.dtsi"
 
@@ -81,7 +83,11 @@ &dcp {
 	status = "disabled";
 };
 &display {
+#ifdef ENABLE_DCPEXT_TYPEC
+	iommus = <&dispext0_dart 0>, <&dispext1_dart 0>;
+#else
 	iommus = <&dispext0_dart 0>;
+#endif
 };
 &dispext0_dart {
 	status = "okay";
diff --git a/arch/arm64/boot/dts/apple/t6022-j475d.dts b/arch/arm64/boot/dts/apple/t6022-j475d.dts
index cdfc78a1703c..1ab639556cb0 100644
--- a/arch/arm64/boot/dts/apple/t6022-j475d.dts
+++ b/arch/arm64/boot/dts/apple/t6022-j475d.dts
@@ -9,6 +9,8 @@
 
 /dts-v1/;
 
+#define ENABLE_DCPEXT_TYPEC
+
 #define NO_DCP
 
 #include "t6022.dtsi"
diff --git a/arch/arm64/boot/dts/apple/t6022-jxxxd.dtsi b/arch/arm64/boot/dts/apple/t6022-jxxxd.dtsi
index f11b017dc049..a186faa8738a 100644
--- a/arch/arm64/boot/dts/apple/t6022-jxxxd.dtsi
+++ b/arch/arm64/boot/dts/apple/t6022-jxxxd.dtsi
@@ -22,7 +22,11 @@ &lpdptxphy_die1 {
 };
 
 &display {
+#ifdef ENABLE_DCPEXT_TYPEC
+	iommus = <&dispext0_dart_die1 0>, <&dispext1_dart 0>;
+#else
 	iommus = <&dispext0_dart_die1 0>;
+#endif
 };
 
 &dispext0_dart_die1 {
diff --git a/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi b/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi
index 67a57fc507df..bf92d3e2c775 100644
--- a/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi
+++ b/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi
@@ -9,10 +9,15 @@
  * Copyright The Asahi Linux Contributors
  */
 
+#define ENABLE_DCPEXT_TYPEC
+
 / {
 	aliases {
 		bluetooth0 = &bluetooth0;
 		dcp = &dcp;
+#ifdef ENABLE_DCPEXT_TYPEC
+		dcpext = &dcpext;
+#endif
 		disp0 = &display;
 		disp0_piodma = &disp0_piodma;
 		serial0 = &serial0;
@@ -103,6 +108,11 @@ typec1: connector {
 			power-role = "dual";
 			data-role = "dual";
 
+#ifdef ENABLE_DCPEXT_TYPEC
+			/* hacks */
+			displayport = <&dcpext>;
+#endif
+
 			ports {
 				#address-cells = <1>;
 				#size-cells = <0>;
@@ -123,6 +133,45 @@ typec1_connector_ss: endpoint {
 	};
 };
 
+#ifdef ENABLE_DCPEXT_TYPEC
+&display {
+	iommus = <&disp0_dart 0>, <&dispext0_dart 0>;
+};
+
+&dispext0_dart {
+	status = "okay";
+};
+
+&dcpext_dart {
+	status = "okay";
+};
+
+&dcpext_mbox {
+	status = "okay";
+};
+
+&dcpext {
+	status = "okay";
+	apple,connector-type = "DP";
+
+	/* hacks */
+	apple,dptx-phy = <1>;
+	phys = <&atcphy1 PHY_TYPE_DP>;
+	phy-names = "dp-phy";
+	mux-controls = <&atcphy1_xbar 0>;
+	mux-control-names = "dp-xbar";
+	mux-index = <0>;
+};
+
+&dpaudio1 {
+	status = "okay";
+};
+
+&ps_atc1_common {
+	apple,always-on; /* Needs to stay on for DP-alt suspend/resume */
+};
+#endif
+
 /* USB controllers */
 &dwc3_0 {
 	ports {
diff --git a/arch/arm64/boot/dts/apple/t8112-j413.dts b/arch/arm64/boot/dts/apple/t8112-j413.dts
index 20285be747d9..b4c6a3c65408 100644
--- a/arch/arm64/boot/dts/apple/t8112-j413.dts
+++ b/arch/arm64/boot/dts/apple/t8112-j413.dts
@@ -9,6 +9,8 @@
 
 /dts-v1/;
 
+#define ENABLE_DCPEXT_TYPEC
+
 #include "t8112.dtsi"
 #include "t8112-jxxx.dtsi"
 #include <dt-bindings/leds/common.h>
diff --git a/arch/arm64/boot/dts/apple/t8112-j415.dts b/arch/arm64/boot/dts/apple/t8112-j415.dts
index c2c32ca5577e..26d774e99214 100644
--- a/arch/arm64/boot/dts/apple/t8112-j415.dts
+++ b/arch/arm64/boot/dts/apple/t8112-j415.dts
@@ -9,6 +9,8 @@
 
 /dts-v1/;
 
+#define ENABLE_DCPEXT_TYPEC
+
 #include "t8112.dtsi"
 #include "t8112-jxxx.dtsi"
 #include <dt-bindings/leds/common.h>
diff --git a/arch/arm64/boot/dts/apple/t8112-j473.dts b/arch/arm64/boot/dts/apple/t8112-j473.dts
index 4fc96779806e..dea9ef1eb734 100644
--- a/arch/arm64/boot/dts/apple/t8112-j473.dts
+++ b/arch/arm64/boot/dts/apple/t8112-j473.dts
@@ -9,6 +9,8 @@
 
 /dts-v1/;
 
+#define ENABLE_DCPEXT_TYPEC
+
 #include "t8112.dtsi"
 #include "t8112-jxxx.dtsi"
 
@@ -66,6 +68,51 @@ &dcpext {
 	apple,dptx-phy = <5>;
 };
 
+#ifdef ENABLE_DCPEXT_TYPEC
+/ {
+	aliases {
+		dcp = &dcp;
+	};
+};
+
+&display {
+	/* dispext0_dart needs to be first for m1n1's */
+	iommus = <&dispext0_dart 0>, <&disp0_dart 0>;
+};
+
+&disp0_dart {
+	status = "okay";
+};
+
+&dcp {
+	status = "okay";
+	apple,connector-type = "DP";
+
+	/* hacks */
+	apple,dptx-phy = <1>;
+	phys = <&atcphy1 PHY_TYPE_DP>;
+	phy-names = "dp-phy";
+	mux-controls = <&atcphy1_xbar 0>;
+	mux-control-names = "dp-xbar";
+	mux-index = <0>;
+};
+
+&dcpext {
+	/delete-property/ mux-controls;
+	/delete-property/ mux-control-names;
+	/delete-property/ mux-index;
+};
+
+&typec1 {
+	/* hacks */
+	displayport = <&dcp>;
+};
+
+&ps_atc1_common {
+	apple,always-on; /* Needs to stay on for DP-alt suspend/resume */
+};
+#endif
+
 /* remove once m1n1 enables sio nodes after setup */
 &sio {
         status = "okay";
diff --git a/arch/arm64/boot/dts/apple/t8112-j493.dts b/arch/arm64/boot/dts/apple/t8112-j493.dts
index 368c4a9cc017..7cfbd3c039f4 100644
--- a/arch/arm64/boot/dts/apple/t8112-j493.dts
+++ b/arch/arm64/boot/dts/apple/t8112-j493.dts
@@ -9,6 +9,8 @@
 
 /dts-v1/;
 
+#define ENABLE_DCPEXT_TYPEC
+
 #include "t8112.dtsi"
 #include "t8112-jxxx.dtsi"
 #include <dt-bindings/leds/common.h>
diff --git a/arch/arm64/boot/dts/apple/t8112-jxxx.dtsi b/arch/arm64/boot/dts/apple/t8112-jxxx.dtsi
index fb957f785d82..62fa3bc8f99f 100644
--- a/arch/arm64/boot/dts/apple/t8112-jxxx.dtsi
+++ b/arch/arm64/boot/dts/apple/t8112-jxxx.dtsi
@@ -96,6 +96,11 @@ typec1: connector {
 			power-role = "dual";
 			data-role = "dual";
 
+#ifdef ENABLE_DCPEXT_TYPEC
+			/* hacks */
+			displayport = <&dcpext>;
+#endif
+
 			ports {
 				#address-cells = <1>;
 				#size-cells = <0>;
@@ -116,6 +121,51 @@ typec1_connector_ss: endpoint {
 	};
 };
 
+#ifdef ENABLE_DCPEXT_TYPEC
+/ {
+	aliases {
+		dcpext = &dcpext;
+	};
+};
+
+&display {
+	iommus = <&disp0_dart 0>, <&dispext0_dart 0>;
+};
+
+&dispext0_dart {
+	status = "okay";
+};
+
+&dcpext_dart {
+	status = "okay";
+};
+
+&dcpext_mbox {
+	status = "okay";
+};
+
+&dcpext {
+	status = "okay";
+	apple,connector-type = "DP";
+
+	/* hacks */
+	apple,dptx-phy = <1>;
+	phys = <&atcphy1 PHY_TYPE_DP>;
+	phy-names = "dp-phy";
+	mux-controls = <&atcphy1_xbar 0>;
+	mux-control-names = "dp-xbar";
+	mux-index = <2>;
+};
+
+&dpaudio1 {
+	status = "okay";
+};
+
+&ps_atc1_common {
+	apple,always-on; /* Needs to stay on for DP-alt suspend/resume */
+};
+#endif
+
 /* USB controllers */
 &dwc3_0 {
 	ports {
diff --git a/drivers/usb/typec/tipd/core.c b/drivers/usb/typec/tipd/core.c
index 923477105483..26a89a1436e9 100644
--- a/drivers/usb/typec/tipd/core.c
+++ b/drivers/usb/typec/tipd/core.c
@@ -6,6 +6,8 @@
  * Author: Heikki Krogerus <heikki.krogerus@linux.intel.com>
  */
 
+#include <drm/drm_connector.h>
+
 #include <linux/i2c.h>
 #include <linux/acpi.h>
 #include <linux/gpio/consumer.h>
@@ -202,6 +204,7 @@ struct cd321x_status {
 	u32 pwr_status;
 	u32 data_status;
 	u32 status_changed;
+	u32 data_status_changed;
 	struct usb_pd_identity partner_identity;
 	struct tps6598x_dp_sid_status_reg dp_sid_status;
 	struct tps6598x_intel_vid_status_reg intel_vid_status;
@@ -224,6 +227,8 @@ struct cd321x {
 	struct cd321x_status update_status;
 	struct delayed_work update_work;
 	struct usb_pd_identity cur_partner_identity;
+
+	struct fwnode_handle *connector_fwnode;
 };
 
 static enum power_supply_property tps6598x_psy_props[] = {
@@ -753,6 +758,7 @@ static void cd321x_update_work(struct work_struct *work)
 
 	st = cd321x->update_status;
 	cd321x->update_status.status_changed = 0;
+	cd321x->update_status.data_status_changed = 0;
 
 	bool old_connected = !!tps->partner;
 	bool new_connected = st.status & TPS_STATUS_PLUG_PRESENT;
@@ -761,6 +767,9 @@ static void cd321x_update_work(struct work_struct *work)
 	bool usb_connection = st.data_status &
 			      (TPS_DATA_STATUS_USB2_CONNECTION | TPS_DATA_STATUS_USB3_CONNECTION);
 
+	bool dp_hpd = st.data_status & CD321X_DATA_STATUS_HPD_LEVEL;
+	bool dp_hpd_changed = st.data_status_changed & CD321X_DATA_STATUS_HPD_LEVEL;
+
 	enum usb_role old_role = usb_role_switch_get_role(tps->role_sw);
 	enum usb_role new_role = USB_ROLE_NONE;
 	enum typec_pwr_opmode pwr_opmode = TYPEC_PWR_MODE_USB;
@@ -789,6 +798,10 @@ static void cd321x_update_work(struct work_struct *work)
 	if (old_role != USB_ROLE_NONE && (new_role != old_role || was_disconnected))
 		usb_role_switch_set_role(tps->role_sw, USB_ROLE_NONE);
 
+	if (cd321x->connector_fwnode && (!dp_hpd || dp_hpd_changed)) {
+		drm_connector_oob_hotplug_event(cd321x->connector_fwnode, connector_status_disconnected);
+	}
+
 	/* Process partner disconnection or change */
 	if (!new_connected || partner_changed) {
 		if (!IS_ERR(tps->partner))
@@ -843,12 +856,16 @@ static void cd321x_update_work(struct work_struct *work)
 	/* Launch the USB role switch */
 	usb_role_switch_set_role(tps->role_sw, new_role);
 
+	if (cd321x->connector_fwnode && dp_hpd)
+		drm_connector_oob_hotplug_event(cd321x->connector_fwnode, connector_status_connected);
+
 	power_supply_changed(tps->psy);
 }
 
 static void cd321x_queue_status(struct cd321x *cd321x)
 {
 	cd321x->update_status.status_changed |= cd321x->update_status.status ^ cd321x->tps.status;
+	cd321x->update_status.data_status_changed |= cd321x->update_status.data_status ^ cd321x->tps.data_status;
 
 	cd321x->update_status.status = cd321x->tps.status;
 	cd321x->update_status.pwr_status = cd321x->tps.pwr_status;
@@ -1278,6 +1295,7 @@ static int
 cd321x_register_port(struct tps6598x *tps, struct fwnode_handle *fwnode)
 {
 	struct cd321x *cd321x = container_of(tps, struct cd321x, tps);
+	struct fwnode_handle *connector_fwnode = NULL;
 	int ret;
 
 	INIT_DELAYED_WORK(&cd321x->update_work, cd321x_update_work);
@@ -1296,6 +1314,11 @@ cd321x_register_port(struct tps6598x *tps, struct fwnode_handle *fwnode)
 		goto err_unregister_altmodes;
 	}
 
+	if (fwnode_property_present(fwnode, "displayport"))
+		connector_fwnode = fwnode_find_reference(fwnode, "displayport", 0);
+	if (!IS_ERR_OR_NULL(connector_fwnode))
+		cd321x->connector_fwnode = connector_fwnode;
+
 	cd321x->state.alt = NULL;
 	cd321x->state.mode = TYPEC_STATE_SAFE;
 	cd321x->state.data = NULL;
openSUSE Build Service is sponsored by