From c3ea14f44fbf4bdde21dd80ee49e9c1398f61058 Mon Sep 17 00:00:00 2001
From: Robert Nelson <robertcnelson@gmail.com>
Date: Sun, 14 Jan 2024 20:46:41 -0600
Subject: [PATCH] kernel v6.7-arm64-k3-r15.1 rebase external git projects
 BBDTBS:
 https://openbeagle.org/beagleboard/BeagleBoard-DeviceTrees/-/commit/fb6f54ec2b36cac20da460d0e51164fa428625d6
 WIRELESS_REGDB:
 https://git.kernel.org/pub/scm/linux/kernel/git/sforshee/wireless-regdb.git/commit/?id=37dcea0e6e5effb4228fe385e906edba3cbee389

Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
---
 patch.sh                                      |   13 +-
 ...-backports-edt-ft5x06-from-linux.git.patch |    4 +-
 .../0001-backports-gpu-from-linux.git.patch   | 1905 +++++++++++++++--
 ...-BeagleBoard.org-Device-Tree-Changes.patch |  771 ++++++-
 patches/external/git/BBDTBS                   |    2 +-
 patches/get_debian_configs.sh                 |    4 +-
 repo_maintenance/push-kernel-n-test.sh        |    4 -
 repo_maintenance/push-n-tag-release.sh        |    4 -
 tools/host_det.sh                             |    5 +
 version.sh                                    |    2 +-
 10 files changed, 2401 insertions(+), 313 deletions(-)

diff --git a/patch.sh b/patch.sh
index 523b8d62..d386abdf 100644
--- a/patch.sh
+++ b/patch.sh
@@ -237,6 +237,17 @@ beagleboard_dtbs () {
 		cp -v ../${work_dir}/src/arm64/ti/*.h arch/arm64/boot/dts/ti/
 		cp -vr ../${work_dir}/include/dt-bindings/* ./include/dt-bindings/
 
+		device="AM335X-PRU-UIO-00A0" ; arm_dtbo_makefile_append
+		device="AM57XX-PRU-UIO-00A0" ; arm_dtbo_makefile_append
+		device="BB-ADC-00A0" ; arm_dtbo_makefile_append
+
+		device="BB-BONE-eMMC1-01-00A0" ; arm_dtbo_makefile_append
+
+		device="BBORG_COMMS-00A2" ; arm_dtbo_makefile_append
+		device="BBORG_FAN-A000" ; arm_dtbo_makefile_append
+
+		device="BONE-ADC" ; arm_dtbo_makefile_append
+
 		device="am335x-boneblack-uboot.dtb" ; arm_dtb_makefile_append
 
 		${git_bin} add -f arch/arm/boot/dts/
@@ -377,7 +388,7 @@ backports () {
 
 	dir 'eventfd'
 
-	backport_tag_next="next-20240108"
+	backport_tag_next="next-20240109"
 
 	subsystem="gpu"
 	#regenerate="enable"
diff --git a/patches/backports/edt-ft5x06/0001-backports-edt-ft5x06-from-linux.git.patch b/patches/backports/edt-ft5x06/0001-backports-edt-ft5x06-from-linux.git.patch
index a07a86cc..bb446f54 100644
--- a/patches/backports/edt-ft5x06/0001-backports-edt-ft5x06-from-linux.git.patch
+++ b/patches/backports/edt-ft5x06/0001-backports-edt-ft5x06-from-linux.git.patch
@@ -1,6 +1,6 @@
-From 66c3422e4667c1910115d84ffc79660843f67f74 Mon Sep 17 00:00:00 2001
+From 546717ad2818072f5e0fc04286edce363010bd1f Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Mon, 8 Jan 2024 20:59:22 -0600
+Date: Sun, 14 Jan 2024 20:41:47 -0600
 Subject: [PATCH] backports: edt-ft5x06: from: linux.git
 
 Reference: rpi-6.7.y
diff --git a/patches/backports/gpu/0001-backports-gpu-from-linux.git.patch b/patches/backports/gpu/0001-backports-gpu-from-linux.git.patch
index 3a7e3a37..8a9223fe 100644
--- a/patches/backports/gpu/0001-backports-gpu-from-linux.git.patch
+++ b/patches/backports/gpu/0001-backports-gpu-from-linux.git.patch
@@ -1,9 +1,9 @@
-From ecb5bc1e74092b77fe6e6e88361ed0b0e7cb1076 Mon Sep 17 00:00:00 2001
+From b92b78b49b5b3fc5aceb1bb0c61191bded3fc18d Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Mon, 8 Jan 2024 21:03:30 -0600
+Date: Sun, 14 Jan 2024 20:45:26 -0600
 Subject: [PATCH] backports: gpu: from: linux.git
 
-Reference: next-20240108
+Reference: next-20240109
 Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
 ---
  drivers/gpu/drm/Kconfig                       |   38 +-
@@ -523,6 +523,7 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  drivers/gpu/drm/gma500/psb_intel_sdvo.c       |    1 -
  drivers/gpu/drm/gud/gud_pipe.c                |   30 +-
  .../gpu/drm/hisilicon/hibmc/hibmc_drm_i2c.c   |    1 -
+ drivers/gpu/drm/hyperv/hyperv_drm_drv.c       |    8 +-
  drivers/gpu/drm/i915/Kconfig                  |    2 +-
  drivers/gpu/drm/i915/Kconfig.debug            |   18 +
  drivers/gpu/drm/i915/Makefile                 |  184 +-
@@ -538,40 +539,41 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  drivers/gpu/drm/i915/display/intel_bios.c     |   43 +-
  drivers/gpu/drm/i915/display/intel_bios.h     |    3 -
  drivers/gpu/drm/i915/display/intel_bw.c       |    7 +-
- drivers/gpu/drm/i915/display/intel_cdclk.c    |  393 +-
+ drivers/gpu/drm/i915/display/intel_cdclk.c    |  483 +-
  drivers/gpu/drm/i915/display/intel_color.c    |   70 +-
- drivers/gpu/drm/i915/display/intel_crt.c      |    4 +-
+ drivers/gpu/drm/i915/display/intel_crt.c      |    9 +-
  drivers/gpu/drm/i915/display/intel_crtc.c     |    9 +-
  .../drm/i915/display/intel_crtc_state_dump.c  |   10 +
  drivers/gpu/drm/i915/display/intel_cursor.c   |   42 +-
- drivers/gpu/drm/i915/display/intel_cx0_phy.c  |  374 +-
+ drivers/gpu/drm/i915/display/intel_cx0_phy.c  |  381 +-
  drivers/gpu/drm/i915/display/intel_cx0_phy.h  |   16 +-
- drivers/gpu/drm/i915/display/intel_ddi.c      |  229 +-
+ drivers/gpu/drm/i915/display/intel_ddi.c      |  232 +-
  drivers/gpu/drm/i915/display/intel_ddi.h      |    8 +-
- drivers/gpu/drm/i915/display/intel_display.c  |  598 +-
+ drivers/gpu/drm/i915/display/intel_display.c  |  601 +-
  drivers/gpu/drm/i915/display/intel_display.h  |    9 +-
- .../gpu/drm/i915/display/intel_display_core.h |   26 +-
+ .../gpu/drm/i915/display/intel_display_core.h |   37 +-
  .../drm/i915/display/intel_display_debugfs.c  |  237 +-
  .../display/intel_display_debugfs_params.c    |  176 +
  .../display/intel_display_debugfs_params.h    |   13 +
  .../drm/i915/display/intel_display_device.c   |   15 +-
  .../drm/i915/display/intel_display_device.h   |    5 +-
- .../drm/i915/display/intel_display_driver.c   |   14 +-
+ .../drm/i915/display/intel_display_driver.c   |  163 +-
+ .../drm/i915/display/intel_display_driver.h   |    6 +
  .../gpu/drm/i915/display/intel_display_irq.c  |   23 +-
  .../drm/i915/display/intel_display_params.c   |  217 +
  .../drm/i915/display/intel_display_params.h   |   61 +
  .../drm/i915/display/intel_display_power.c    |   24 +-
  .../i915/display/intel_display_power_well.c   |   23 +-
  .../drm/i915/display/intel_display_reset.c    |    2 +-
- .../drm/i915/display/intel_display_types.h    |   41 +-
+ .../drm/i915/display/intel_display_types.h    |   44 +-
  drivers/gpu/drm/i915/display/intel_dmc.c      |  108 +-
  drivers/gpu/drm/i915/display/intel_dmc_regs.h |    1 +
- drivers/gpu/drm/i915/display/intel_dp.c       |  580 +-
- drivers/gpu/drm/i915/display/intel_dp.h       |   33 +-
- drivers/gpu/drm/i915/display/intel_dp_aux.c   |   99 +-
+ drivers/gpu/drm/i915/display/intel_dp.c       |  638 +-
+ drivers/gpu/drm/i915/display/intel_dp.h       |   36 +-
+ drivers/gpu/drm/i915/display/intel_dp_aux.c   |  128 +-
  .../drm/i915/display/intel_dp_aux_backlight.c |    4 +-
  .../gpu/drm/i915/display/intel_dp_aux_regs.h  |   14 +-
- drivers/gpu/drm/i915/display/intel_dp_mst.c   |  662 +-
+ drivers/gpu/drm/i915/display/intel_dp_mst.c   |  666 +-
  drivers/gpu/drm/i915/display/intel_dp_mst.h   |    5 +
  drivers/gpu/drm/i915/display/intel_dpio_phy.c |  171 +-
  drivers/gpu/drm/i915/display/intel_dpio_phy.h |    5 +
@@ -588,6 +590,7 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  .../gpu/drm/i915/display/intel_dsb_buffer.h   |   29 +
  drivers/gpu/drm/i915/display/intel_dsi_vbt.c  |  368 +-
  drivers/gpu/drm/i915/display/intel_dsi_vbt.h  |    1 -
+ drivers/gpu/drm/i915/display/intel_dvo.c      |    5 +
  drivers/gpu/drm/i915/display/intel_fb.c       |  168 +-
  drivers/gpu/drm/i915/display/intel_fb.h       |    2 +
  drivers/gpu/drm/i915/display/intel_fb_bo.c    |   97 +
@@ -602,7 +605,9 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  drivers/gpu/drm/i915/display/intel_hdcp.c     |  115 +-
  drivers/gpu/drm/i915/display/intel_hdcp.h     |    8 +-
  .../gpu/drm/i915/display/intel_hdcp_regs.h    |   28 +-
- drivers/gpu/drm/i915/display/intel_hdmi.c     |   18 +-
+ drivers/gpu/drm/i915/display/intel_hdmi.c     |   26 +-
+ drivers/gpu/drm/i915/display/intel_hotplug.c  |  165 +-
+ drivers/gpu/drm/i915/display/intel_hotplug.h  |    4 +
  .../gpu/drm/i915/display/intel_hotplug_irq.c  |   22 +-
  drivers/gpu/drm/i915/display/intel_link_bw.c  |   30 +-
  drivers/gpu/drm/i915/display/intel_link_bw.h  |    1 +
@@ -610,18 +615,19 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  .../drm/i915/display/intel_modeset_setup.c    |    6 +
  .../drm/i915/display/intel_modeset_verify.c   |    2 +-
  drivers/gpu/drm/i915/display/intel_opregion.c |    2 +-
- drivers/gpu/drm/i915/display/intel_panel.c    |    4 +-
+ drivers/gpu/drm/i915/display/intel_panel.c    |    8 +-
  .../gpu/drm/i915/display/intel_pch_display.c  |    1 +
  drivers/gpu/drm/i915/display/intel_pps.c      |    4 +-
  drivers/gpu/drm/i915/display/intel_psr.c      |  474 +-
  drivers/gpu/drm/i915/display/intel_psr.h      |   17 +-
  drivers/gpu/drm/i915/display/intel_psr_regs.h |    2 +
  .../gpu/drm/i915/display/intel_qp_tables.c    |    3 -
- drivers/gpu/drm/i915/display/intel_sdvo.c     |   25 +-
+ drivers/gpu/drm/i915/display/intel_sdvo.c     |   31 +-
  drivers/gpu/drm/i915/display/intel_snps_phy.c |    2 +-
  drivers/gpu/drm/i915/display/intel_sprite.c   |    7 +-
- drivers/gpu/drm/i915/display/intel_tc.c       |   25 +-
- drivers/gpu/drm/i915/display/intel_tv.c       |    8 +-
+ drivers/gpu/drm/i915/display/intel_tc.c       |   49 +-
+ drivers/gpu/drm/i915/display/intel_tc.h       |    2 +-
+ drivers/gpu/drm/i915/display/intel_tv.c       |   13 +-
  drivers/gpu/drm/i915/display/intel_vblank.c   |   51 +-
  drivers/gpu/drm/i915/display/intel_vdsc.c     |   50 +-
  .../drm/i915/display/skl_universal_plane.c    |  106 +-
@@ -691,7 +697,7 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  drivers/gpu/drm/i915/gvt/handlers.c           |    3 +-
  drivers/gpu/drm/i915/gvt/interrupt.c          |   13 +-
  drivers/gpu/drm/i915/i915_debugfs.c           |  112 +-
- drivers/gpu/drm/i915/i915_driver.c            |   14 +-
+ drivers/gpu/drm/i915/i915_driver.c            |   39 +-
  drivers/gpu/drm/i915/i915_drm_client.c        |  108 +
  drivers/gpu/drm/i915/i915_drm_client.h        |   42 +
  drivers/gpu/drm/i915/i915_drv.h               |   20 +-
@@ -1509,8 +1515,9 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  sound/pci/hda/hda_controller.c                |   10 +-
  sound/pci/hda/hda_intel.c                     |    2 +
  sound/pci/hda/patch_ca0132.c                  |    3 +-
+ sound/pci/hda/patch_conexant.c                |  115 +-
  sound/pci/hda/patch_hdmi.c                    |    6 +-
- sound/pci/hda/patch_realtek.c                 |   31 +
+ sound/pci/hda/patch_realtek.c                 |   32 +
  sound/pci/hda/tas2781_hda_i2c.c               |  117 +-
  sound/soc/amd/acp-config.c                    |   39 +-
  sound/soc/amd/acp/Kconfig                     |   13 +
@@ -1610,6 +1617,8 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  sound/soc/intel/avs/topology.c                |   13 +-
  sound/soc/intel/boards/Kconfig                |    2 +
  sound/soc/intel/boards/Makefile               |    3 +-
+ sound/soc/intel/boards/bxt_da7219_max98357a.c |    6 +
+ sound/soc/intel/boards/bxt_rt298.c            |    3 +-
  sound/soc/intel/boards/bytcht_es8316.c        |   71 +-
  sound/soc/intel/boards/cht_bsw_rt5645.c       |    8 +
  sound/soc/intel/boards/cht_bsw_rt5672.c       |    8 +-
@@ -1724,7 +1733,7 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  sound/usb/mixer_quirks.c                      |    3 +
  sound/usb/mixer_scarlett2.c                   | 4841 ++++++++++---
  sound/x86/intel_hdmi_audio.c                  |    1 +
- 1718 files changed, 138088 insertions(+), 25796 deletions(-)
+ 1727 files changed, 138721 insertions(+), 25915 deletions(-)
  create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_seq64.c
  create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_seq64.h
  create mode 100644 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
@@ -44263,6 +44272,39 @@ index 410bd019bb35..e6e48651c15c 100644
  	snprintf(connector->adapter.name, I2C_NAME_SIZE, "HIS i2c bit bus");
  	connector->adapter.dev.parent = drm_dev->dev;
  	i2c_set_adapdata(&connector->adapter, connector);
+diff --git a/drivers/gpu/drm/hyperv/hyperv_drm_drv.c b/drivers/gpu/drm/hyperv/hyperv_drm_drv.c
+index d511d17c5bdf..cff85086f2d6 100644
+--- a/drivers/gpu/drm/hyperv/hyperv_drm_drv.c
++++ b/drivers/gpu/drm/hyperv/hyperv_drm_drv.c
+@@ -7,7 +7,6 @@
+ #include <linux/hyperv.h>
+ #include <linux/module.h>
+ #include <linux/pci.h>
+-#include <linux/screen_info.h>
+ 
+ #include <drm/drm_aperture.h>
+ #include <drm/drm_atomic_helper.h>
+@@ -73,11 +72,6 @@ static int hyperv_setup_vram(struct hyperv_drm_device *hv,
+ 	struct drm_device *dev = &hv->dev;
+ 	int ret;
+ 
+-	if (IS_ENABLED(CONFIG_SYSFB))
+-		drm_aperture_remove_conflicting_framebuffers(screen_info.lfb_base,
+-							     screen_info.lfb_size,
+-							     &hyperv_driver);
+-
+ 	hv->fb_size = (unsigned long)hv->mmio_megabytes * 1024 * 1024;
+ 
+ 	ret = vmbus_allocate_mmio(&hv->mem, hdev, 0, -1, hv->fb_size, 0x100000,
+@@ -130,6 +124,8 @@ static int hyperv_vmbus_probe(struct hv_device *hdev,
+ 		goto err_hv_set_drv_data;
+ 	}
+ 
++	drm_aperture_remove_framebuffers(&hyperv_driver);
++
+ 	ret = hyperv_setup_vram(hv, hdev);
+ 	if (ret)
+ 		goto err_vmbus_close;
 diff --git a/drivers/gpu/drm/i915/Kconfig b/drivers/gpu/drm/i915/Kconfig
 index ce397a8797f7..b5d6e3352071 100644
 --- a/drivers/gpu/drm/i915/Kconfig
@@ -45424,7 +45466,7 @@ index bef96db62c80..7f2a50b4f494 100644
  		else
  			idx = icl_max_bw_index(i915, num_active_planes, i);
 diff --git a/drivers/gpu/drm/i915/display/intel_cdclk.c b/drivers/gpu/drm/i915/display/intel_cdclk.c
-index c4839c67cb0f..c5fecde7afa8 100644
+index c4839c67cb0f..26200ee3e23f 100644
 --- a/drivers/gpu/drm/i915/display/intel_cdclk.c
 +++ b/drivers/gpu/drm/i915/display/intel_cdclk.c
 @@ -1180,7 +1180,7 @@ static void skl_sanitize_cdclk(struct drm_i915_private *dev_priv)
@@ -45889,19 +45931,57 @@ index c4839c67cb0f..c5fecde7afa8 100644
  
  	/* make sure the mid clock came out sane */
  
-@@ -1878,9 +1906,9 @@ static void _bxt_set_cdclk(struct drm_i915_private *dev_priv,
+@@ -1872,15 +1900,47 @@ static bool pll_enable_wa_needed(struct drm_i915_private *dev_priv)
+ 		dev_priv->display.cdclk.hw.vco > 0;
+ }
+ 
++static u32 bxt_cdclk_ctl(struct drm_i915_private *i915,
++			 const struct intel_cdclk_config *cdclk_config,
++			 enum pipe pipe)
++{
++	int cdclk = cdclk_config->cdclk;
++	int vco = cdclk_config->vco;
++	int unsquashed_cdclk;
++	u16 waveform;
++	u32 val;
++
++	waveform = cdclk_squash_waveform(i915, cdclk);
++
++	unsquashed_cdclk = DIV_ROUND_CLOSEST(cdclk * cdclk_squash_len,
++					     cdclk_squash_divider(waveform));
++
++	val = bxt_cdclk_cd2x_div_sel(i915, unsquashed_cdclk, vco) |
++		bxt_cdclk_cd2x_pipe(i915, pipe);
++
++	/*
++	 * Disable SSA Precharge when CD clock frequency < 500 MHz,
++	 * enable otherwise.
++	 */
++	if ((IS_GEMINILAKE(i915) || IS_BROXTON(i915)) &&
++	    cdclk >= 500000)
++		val |= BXT_CDCLK_SSA_PRECHARGE_ENABLE;
++
++	if (DISPLAY_VER(i915) >= 20)
++		val |= MDCLK_SOURCE_SEL_CDCLK_PLL;
++	else
++		val |= skl_cdclk_decimal(cdclk);
++
++	return val;
++}
++
+ static void _bxt_set_cdclk(struct drm_i915_private *dev_priv,
+ 			   const struct intel_cdclk_config *cdclk_config,
+ 			   enum pipe pipe)
  {
  	int cdclk = cdclk_config->cdclk;
  	int vco = cdclk_config->vco;
 -	u32 val;
-+	int unsquashed_cdclk;
  	u16 waveform;
 -	int clock;
-+	u32 val;
  
  	if (HAS_CDCLK_CRAWL(dev_priv) && dev_priv->display.cdclk.hw.vco > 0 && vco > 0 &&
  	    !cdclk_pll_is_unknown(dev_priv->display.cdclk.hw.vco)) {
-@@ -1897,15 +1925,13 @@ static void _bxt_set_cdclk(struct drm_i915_private *dev_priv,
+@@ -1897,31 +1957,10 @@ static void _bxt_set_cdclk(struct drm_i915_private *dev_priv,
  
  	waveform = cdclk_squash_waveform(dev_priv, cdclk);
  
@@ -45909,18 +45989,99 @@ index c4839c67cb0f..c5fecde7afa8 100644
 -		clock = vco / 2;
 -	else
 -		clock = cdclk;
-+	unsquashed_cdclk = DIV_ROUND_CLOSEST(cdclk * cdclk_squash_len,
-+					     cdclk_squash_divider(waveform));
- 
+-
  	if (HAS_CDCLK_SQUASH(dev_priv))
  		dg2_cdclk_squash_program(dev_priv, waveform);
  
 -	val = bxt_cdclk_cd2x_div_sel(dev_priv, clock, vco) |
-+	val = bxt_cdclk_cd2x_div_sel(dev_priv, unsquashed_cdclk, vco) |
- 		bxt_cdclk_cd2x_pipe(dev_priv, pipe);
+-		bxt_cdclk_cd2x_pipe(dev_priv, pipe);
+-
+-	/*
+-	 * Disable SSA Precharge when CD clock frequency < 500 MHz,
+-	 * enable otherwise.
+-	 */
+-	if ((IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) &&
+-	    cdclk >= 500000)
+-		val |= BXT_CDCLK_SSA_PRECHARGE_ENABLE;
+-
+-	if (DISPLAY_VER(dev_priv) >= 20)
+-		val |= MDCLK_SOURCE_SEL_CDCLK_PLL;
+-	else
+-		val |= skl_cdclk_decimal(cdclk);
+-
+-	intel_de_write(dev_priv, CDCLK_CTL, val);
++	intel_de_write(dev_priv, CDCLK_CTL, bxt_cdclk_ctl(dev_priv, cdclk_config, pipe));
+ 
+ 	if (pipe != INVALID_PIPE)
+ 		intel_crtc_wait_for_next_vblank(intel_crtc_for_pipe(dev_priv, pipe));
+@@ -2012,7 +2051,7 @@ static void bxt_set_cdclk(struct drm_i915_private *dev_priv,
+ static void bxt_sanitize_cdclk(struct drm_i915_private *dev_priv)
+ {
+ 	u32 cdctl, expected;
+-	int cdclk, clock, vco;
++	int cdclk, vco;
+ 
+ 	intel_update_cdclk(dev_priv);
+ 	intel_cdclk_dump_config(dev_priv, &dev_priv->display.cdclk.hw, "Current CDCLK");
+@@ -2021,20 +2060,6 @@ static void bxt_sanitize_cdclk(struct drm_i915_private *dev_priv)
+ 	    dev_priv->display.cdclk.hw.cdclk == dev_priv->display.cdclk.hw.bypass)
+ 		goto sanitize;
+ 
+-	/* DPLL okay; verify the cdclock
+-	 *
+-	 * Some BIOS versions leave an incorrect decimal frequency value and
+-	 * set reserved MBZ bits in CDCLK_CTL at least during exiting from S4,
+-	 * so sanitize this register.
+-	 */
+-	cdctl = intel_de_read(dev_priv, CDCLK_CTL);
+-	/*
+-	 * Let's ignore the pipe field, since BIOS could have configured the
+-	 * dividers both synching to an active pipe, or asynchronously
+-	 * (PIPE_NONE).
+-	 */
+-	cdctl &= ~bxt_cdclk_cd2x_pipe(dev_priv, INVALID_PIPE);
+-
+ 	/* Make sure this is a legal cdclk value for the platform */
+ 	cdclk = bxt_calc_cdclk(dev_priv, dev_priv->display.cdclk.hw.cdclk);
+ 	if (cdclk != dev_priv->display.cdclk.hw.cdclk)
+@@ -2045,24 +2070,21 @@ static void bxt_sanitize_cdclk(struct drm_i915_private *dev_priv)
+ 	if (vco != dev_priv->display.cdclk.hw.vco)
+ 		goto sanitize;
+ 
+-	expected = skl_cdclk_decimal(cdclk);
+-
+-	/* Figure out what CD2X divider we should be using for this cdclk */
+-	if (HAS_CDCLK_SQUASH(dev_priv))
+-		clock = dev_priv->display.cdclk.hw.vco / 2;
+-	else
+-		clock = dev_priv->display.cdclk.hw.cdclk;
+-
+-	expected |= bxt_cdclk_cd2x_div_sel(dev_priv, clock,
+-					   dev_priv->display.cdclk.hw.vco);
++	/*
++	 * Some BIOS versions leave an incorrect decimal frequency value and
++	 * set reserved MBZ bits in CDCLK_CTL at least during exiting from S4,
++	 * so sanitize this register.
++	 */
++	cdctl = intel_de_read(dev_priv, CDCLK_CTL);
++	expected = bxt_cdclk_ctl(dev_priv, &dev_priv->display.cdclk.hw, INVALID_PIPE);
  
  	/*
-@@ -2075,7 +2101,7 @@ static void bxt_sanitize_cdclk(struct drm_i915_private *dev_priv)
+-	 * Disable SSA Precharge when CD clock frequency < 500 MHz,
+-	 * enable otherwise.
++	 * Let's ignore the pipe field, since BIOS could have configured the
++	 * dividers both synching to an active pipe, or asynchronously
++	 * (PIPE_NONE).
+ 	 */
+-	if ((IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) &&
+-	    dev_priv->display.cdclk.hw.cdclk >= 500000)
+-		expected |= BXT_CDCLK_SSA_PRECHARGE_ENABLE;
++	cdctl &= ~bxt_cdclk_cd2x_pipe(dev_priv, INVALID_PIPE);
++	expected &= ~bxt_cdclk_cd2x_pipe(dev_priv, INVALID_PIPE);
+ 
+ 	if (cdctl == expected)
+ 		/* All well; nothing to sanitize */
+@@ -2075,7 +2097,7 @@ static void bxt_sanitize_cdclk(struct drm_i915_private *dev_priv)
  	dev_priv->display.cdclk.hw.cdclk = 0;
  
  	/* force full PLL disable + enable */
@@ -45929,7 +46090,7 @@ index c4839c67cb0f..c5fecde7afa8 100644
  }
  
  static void bxt_cdclk_init_hw(struct drm_i915_private *dev_priv)
-@@ -2597,9 +2623,10 @@ static int intel_vdsc_min_cdclk(const struct intel_crtc_state *crtc_state)
+@@ -2597,9 +2619,10 @@ static int intel_vdsc_min_cdclk(const struct intel_crtc_state *crtc_state)
  		 * Since PPC = 2 with bigjoiner
  		 * => CDCLK >= compressed_bpp * Pixel clock  / 2 * Bigjoiner Interface bits
  		 */
@@ -45943,7 +46104,7 @@ index c4839c67cb0f..c5fecde7afa8 100644
  
  		min_cdclk = max(min_cdclk, min_cdclk_bj);
  	}
-@@ -3439,15 +3466,15 @@ u32 intel_read_rawclk(struct drm_i915_private *dev_priv)
+@@ -3439,15 +3462,15 @@ u32 intel_read_rawclk(struct drm_i915_private *dev_priv)
  {
  	u32 freq;
  
@@ -45962,7 +46123,7 @@ index c4839c67cb0f..c5fecde7afa8 100644
  	else if (INTEL_PCH_TYPE(dev_priv) >= PCH_CNP)
  		freq = cnp_rawclk(dev_priv);
  	else if (HAS_PCH_SPLIT(dev_priv))
-@@ -3488,7 +3515,7 @@ static const struct intel_cdclk_funcs mtl_cdclk_funcs = {
+@@ -3488,7 +3511,7 @@ static const struct intel_cdclk_funcs mtl_cdclk_funcs = {
  	.get_cdclk = bxt_get_cdclk,
  	.set_cdclk = bxt_set_cdclk,
  	.modeset_calc_cdclk = bxt_modeset_calc_cdclk,
@@ -46088,19 +46249,30 @@ index 1d26be54ddfc..c5092b7e87d5 100644
  
  	intel_de_write_fw(dev_priv, PRE_CSC_GAMC_INDEX(pipe),
 diff --git a/drivers/gpu/drm/i915/display/intel_crt.c b/drivers/gpu/drm/i915/display/intel_crt.c
-index 6f6b348b8a40..abaacea5c2cc 100644
+index 6f6b348b8a40..b9733a73e21d 100644
 --- a/drivers/gpu/drm/i915/display/intel_crt.c
 +++ b/drivers/gpu/drm/i915/display/intel_crt.c
-@@ -846,7 +846,7 @@ intel_crt_detect(struct drm_connector *connector,
+@@ -42,6 +42,7 @@
+ #include "intel_ddi.h"
+ #include "intel_ddi_buf_trans.h"
+ #include "intel_de.h"
++#include "intel_display_driver.h"
+ #include "intel_display_types.h"
+ #include "intel_fdi.h"
+ #include "intel_fdi_regs.h"
+@@ -846,7 +847,10 @@ intel_crt_detect(struct drm_connector *connector,
  	if (!intel_display_device_enabled(dev_priv))
  		return connector_status_disconnected;
  
 -	if (dev_priv->params.load_detect_test) {
++	if (!intel_display_driver_check_access(dev_priv))
++		return connector->status;
++
 +	if (dev_priv->display.params.load_detect_test) {
  		wakeref = intel_display_power_get(dev_priv,
  						  intel_encoder->power_domain);
  		goto load_detect;
-@@ -906,7 +906,7 @@ intel_crt_detect(struct drm_connector *connector,
+@@ -906,7 +910,7 @@ intel_crt_detect(struct drm_connector *connector,
  		else if (DISPLAY_VER(dev_priv) < 4)
  			status = intel_crt_load_detect(crt,
  				to_intel_crtc(connector->state->crtc)->pipe);
@@ -46109,6 +46281,14 @@ index 6f6b348b8a40..abaacea5c2cc 100644
  			status = connector_status_disconnected;
  		else
  			status = connector_status_unknown;
+@@ -1069,6 +1073,7 @@ void intel_crt_init(struct drm_i915_private *dev_priv)
+ 	} else {
+ 		intel_connector->polled = DRM_CONNECTOR_POLL_CONNECT;
+ 	}
++	intel_connector->base.polled = intel_connector->polled;
+ 
+ 	if (HAS_DDI(dev_priv)) {
+ 		assert_port_valid(dev_priv, PORT_E);
 diff --git a/drivers/gpu/drm/i915/display/intel_crtc.c b/drivers/gpu/drm/i915/display/intel_crtc.c
 index 1fd068e6e26c..8a84a31c7b48 100644
 --- a/drivers/gpu/drm/i915/display/intel_crtc.c
@@ -46239,7 +46419,7 @@ index b342fad180ca..926e2de00eb5 100644
  	if (plane->cursor.base != base ||
  	    plane->cursor.size != fbc_ctl ||
 diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
-index ccf225afeb2a..ce1bddf74a82 100644
+index ccf225afeb2a..e67c25975947 100644
 --- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
 +++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
 @@ -31,7 +31,7 @@
@@ -46485,17 +46665,23 @@ index ccf225afeb2a..ce1bddf74a82 100644
  			crtc_state->cx0pll_state.c20 = *tables[i];
  			return 0;
  		}
-@@ -2094,17 +2096,53 @@ int intel_cx0pll_calc_state(struct intel_crtc_state *crtc_state,
+@@ -2094,17 +2096,58 @@ int intel_cx0pll_calc_state(struct intel_crtc_state *crtc_state,
  	return intel_c20pll_calc_state(crtc_state, encoder);
  }
  
 -static bool intel_c20_use_mplla(u32 clock)
-+static int intel_c20pll_calc_port_clock(struct intel_encoder *encoder,
-+					const struct intel_c20pll_state *pll_state)
++static bool intel_c20phy_use_mpllb(const struct intel_c20pll_state *state)
  {
 -	/* 10G and 20G rates use MPLLA */
 -	if (clock == 312500 || clock == 625000)
 -		return true;
++	return state->tx[0] & C20_PHY_USE_MPLLB;
++}
+ 
+-	return false;
++static int intel_c20pll_calc_port_clock(struct intel_encoder *encoder,
++					const struct intel_c20pll_state *pll_state)
++{
 +	unsigned int frac, frac_en, frac_quot, frac_rem, frac_den;
 +	unsigned int multiplier, refclk = 38400;
 +	unsigned int tx_clk_div;
@@ -46504,9 +46690,8 @@ index ccf225afeb2a..ce1bddf74a82 100644
 +	unsigned int ref, vco;
 +	unsigned int tx_rate_mult;
 +	unsigned int tx_rate = REG_FIELD_GET(C20_PHY_TX_RATE, pll_state->tx[0]);
- 
--	return false;
-+	if (pll_state->tx[0] & C20_PHY_USE_MPLLB) {
++
++	if (intel_c20phy_use_mpllb(pll_state)) {
 +		tx_rate_mult = 1;
 +		frac_en = REG_FIELD_GET(C20_MPLLB_FRACEN, pll_state->mpllb[6]);
 +		frac_quot = pll_state->mpllb[8];
@@ -46546,7 +46731,16 @@ index ccf225afeb2a..ce1bddf74a82 100644
  {
  	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
  	bool cntx;
-@@ -2158,6 +2196,8 @@ void intel_c20pll_readout_hw_state(struct intel_encoder *encoder,
+@@ -2136,7 +2179,7 @@ void intel_c20pll_readout_hw_state(struct intel_encoder *encoder,
+ 								PHY_C20_A_CMN_CNTX_CFG(i));
+ 	}
+ 
+-	if (pll_state->tx[0] & C20_PHY_USE_MPLLB) {
++	if (intel_c20phy_use_mpllb(pll_state)) {
+ 		/* MPLLB configuration */
+ 		for (i = 0; i < ARRAY_SIZE(pll_state->mpllb); i++) {
+ 			if (cntx)
+@@ -2158,6 +2201,8 @@ void intel_c20pll_readout_hw_state(struct intel_encoder *encoder,
  		}
  	}
  
@@ -46555,7 +46749,7 @@ index ccf225afeb2a..ce1bddf74a82 100644
  	intel_cx0_phy_transaction_end(encoder, wakeref);
  }
  
-@@ -2172,12 +2212,12 @@ void intel_c20pll_dump_hw_state(struct drm_i915_private *i915,
+@@ -2172,12 +2217,12 @@ void intel_c20pll_dump_hw_state(struct drm_i915_private *i915,
  	drm_dbg_kms(&i915->drm, "cmn[0] = 0x%.4x, cmn[1] = 0x%.4x, cmn[2] = 0x%.4x, cmn[3] = 0x%.4x\n",
  		    hw_state->cmn[0], hw_state->cmn[1], hw_state->cmn[2], hw_state->cmn[3]);
  
@@ -46563,7 +46757,7 @@ index ccf225afeb2a..ce1bddf74a82 100644
 -		for (i = 0; i < ARRAY_SIZE(hw_state->mplla); i++)
 -			drm_dbg_kms(&i915->drm, "mplla[%d] = 0x%.4x\n", i, hw_state->mplla[i]);
 -	} else {
-+	if (hw_state->tx[0] & C20_PHY_USE_MPLLB) {
++	if (intel_c20phy_use_mpllb(hw_state)) {
  		for (i = 0; i < ARRAY_SIZE(hw_state->mpllb); i++)
  			drm_dbg_kms(&i915->drm, "mpllb[%d] = 0x%.4x\n", i, hw_state->mpllb[i]);
 +	} else {
@@ -46572,7 +46766,7 @@ index ccf225afeb2a..ce1bddf74a82 100644
  	}
  }
  
-@@ -2200,11 +2240,11 @@ static u8 intel_c20_get_dp_rate(u32 clock)
+@@ -2200,11 +2245,11 @@ static u8 intel_c20_get_dp_rate(u32 clock)
  		return 6;
  	case 432000: /* 4.32 Gbps eDP */
  		return 7;
@@ -46587,7 +46781,7 @@ index ccf225afeb2a..ce1bddf74a82 100644
  		return 10;
  	case 648000: /* 6.48 Gbps eDP*/
  		return 11;
-@@ -2222,13 +2262,13 @@ static u8 intel_c20_get_hdmi_rate(u32 clock)
+@@ -2222,13 +2267,13 @@ static u8 intel_c20_get_hdmi_rate(u32 clock)
  		return 0;
  
  	switch (clock) {
@@ -46606,7 +46800,7 @@ index ccf225afeb2a..ce1bddf74a82 100644
  		return 3;
  	default:
  		MISSING_CASE(clock);
-@@ -2239,7 +2279,7 @@ static u8 intel_c20_get_hdmi_rate(u32 clock)
+@@ -2239,7 +2284,7 @@ static u8 intel_c20_get_hdmi_rate(u32 clock)
  static bool is_dp2(u32 clock)
  {
  	/* DP2.0 clock rates */
@@ -46615,7 +46809,7 @@ index ccf225afeb2a..ce1bddf74a82 100644
  		return true;
  
  	return false;
-@@ -2248,11 +2288,11 @@ static bool is_dp2(u32 clock)
+@@ -2248,11 +2293,11 @@ static bool is_dp2(u32 clock)
  static bool is_hdmi_frl(u32 clock)
  {
  	switch (clock) {
@@ -46632,7 +46826,7 @@ index ccf225afeb2a..ce1bddf74a82 100644
  		return true;
  	default:
  		return false;
-@@ -2285,6 +2325,7 @@ static void intel_c20_pll_program(struct drm_i915_private *i915,
+@@ -2285,6 +2330,7 @@ static void intel_c20_pll_program(struct drm_i915_private *i915,
  	const struct intel_c20pll_state *pll_state = &crtc_state->cx0pll_state.c20;
  	bool dp = false;
  	int lane = crtc_state->lane_count > 2 ? INTEL_CX0_BOTH_LANES : INTEL_CX0_LANE0;
@@ -46640,13 +46834,13 @@ index ccf225afeb2a..ce1bddf74a82 100644
  	bool cntx;
  	int i;
  
-@@ -2323,50 +2364,50 @@ static void intel_c20_pll_program(struct drm_i915_private *i915,
+@@ -2323,50 +2369,50 @@ static void intel_c20_pll_program(struct drm_i915_private *i915,
  	}
  
  	/* 3.3 mpllb or mplla configuration */
 -	if (intel_c20_use_mplla(pll_state->clock)) {
 -		for (i = 0; i < ARRAY_SIZE(pll_state->mplla); i++) {
-+	if (pll_state->tx[0] & C20_PHY_USE_MPLLB) {
++	if (intel_c20phy_use_mpllb(pll_state)) {
 +		for (i = 0; i < ARRAY_SIZE(pll_state->mpllb); i++) {
  			if (cntx)
  				intel_c20_sram_write(i915, encoder->port, INTEL_CX0_LANE0,
@@ -46706,7 +46900,7 @@ index ccf225afeb2a..ce1bddf74a82 100644
  				MB_WRITE_COMMITTED);
  	}
  
-@@ -2378,8 +2419,8 @@ static void intel_c20_pll_program(struct drm_i915_private *i915,
+@@ -2378,8 +2424,8 @@ static void intel_c20_pll_program(struct drm_i915_private *i915,
  		      BIT(0), cntx ? 0 : 1, MB_WRITE_COMMITTED);
  }
  
@@ -46717,7 +46911,7 @@ index ccf225afeb2a..ce1bddf74a82 100644
  {
  	unsigned int frac_quot = 0, frac_rem = 0, frac_den = 1;
  	unsigned int multiplier, tx_clk_div, hdmi_div, refclk = 38400;
-@@ -2405,51 +2446,6 @@ int intel_c10pll_calc_port_clock(struct intel_encoder *encoder,
+@@ -2405,51 +2451,6 @@ int intel_c10pll_calc_port_clock(struct intel_encoder *encoder,
  	return tmpclk;
  }
  
@@ -46769,7 +46963,7 @@ index ccf225afeb2a..ce1bddf74a82 100644
  static void intel_program_port_clock_ctl(struct intel_encoder *encoder,
  					 const struct intel_crtc_state *crtc_state,
  					 bool lane_reversal)
-@@ -3004,17 +3000,123 @@ intel_mtl_port_pll_type(struct intel_encoder *encoder,
+@@ -3004,17 +3005,123 @@ intel_mtl_port_pll_type(struct intel_encoder *encoder,
  		return ICL_PORT_DPLL_DEFAULT;
  }
  
@@ -46837,8 +47031,8 @@ index ccf225afeb2a..ce1bddf74a82 100644
 +{
 +	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
 +	const struct intel_c20pll_state *mpll_sw_state = &state->cx0pll_state.c20;
-+	bool sw_use_mpllb = mpll_sw_state->tx[0] & C20_PHY_USE_MPLLB;
-+	bool hw_use_mpllb = mpll_hw_state->tx[0] & C20_PHY_USE_MPLLB;
++	bool sw_use_mpllb = intel_c20phy_use_mpllb(mpll_sw_state);
++	bool hw_use_mpllb = intel_c20phy_use_mpllb(mpll_hw_state);
 +	int i;
 +
 +	I915_STATE_WARN(i915, mpll_hw_state->clock != mpll_sw_state->clock,
@@ -46897,7 +47091,7 @@ index ccf225afeb2a..ce1bddf74a82 100644
  
  	if (DISPLAY_VER(i915) < 14)
  		return;
-@@ -3030,27 +3132,13 @@ void intel_c10pll_state_verify(struct intel_atomic_state *state,
+@@ -3030,27 +3137,13 @@ void intel_c10pll_state_verify(struct intel_atomic_state *state,
  	encoder = intel_get_crtc_new_encoder(state, new_crtc_state);
  	phy = intel_port_to_phy(i915, encoder->port);
  
@@ -46972,7 +47166,7 @@ index 0e0a38dac8cd..c6682677253a 100644
  				     const struct intel_crtc_state *crtc_state);
  int intel_cx0_phy_check_hdmi_link_rate(struct intel_hdmi *hdmi, int clock);
 diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
-index 9151d5add960..2746655bcb26 100644
+index 9151d5add960..922194b957be 100644
 --- a/drivers/gpu/drm/i915/display/intel_ddi.c
 +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
 @@ -25,6 +25,7 @@
@@ -47420,6 +47614,16 @@ index 9151d5add960..2746655bcb26 100644
  	encoder->get_hw_state = intel_ddi_get_hw_state;
  	encoder->sync_state = intel_ddi_sync_state;
  	encoder->initial_fastset_check = intel_ddi_initial_fastset_check;
+@@ -5000,6 +5117,9 @@ void intel_ddi_init(struct drm_i915_private *dev_priv,
+ 		encoder->suspend_complete = intel_ddi_tc_encoder_suspend_complete;
+ 		encoder->shutdown_complete = intel_ddi_tc_encoder_shutdown_complete;
+ 
++		dig_port->lock = intel_tc_port_lock;
++		dig_port->unlock = intel_tc_port_unlock;
++
+ 		if (intel_tc_port_init(dig_port, is_legacy) < 0)
+ 			goto err;
+ 	}
 diff --git a/drivers/gpu/drm/i915/display/intel_ddi.h b/drivers/gpu/drm/i915/display/intel_ddi.h
 index 4999c0ee229b..434de7196875 100644
 --- a/drivers/gpu/drm/i915/display/intel_ddi.h
@@ -47452,7 +47656,7 @@ index 4999c0ee229b..434de7196875 100644
  			       enum transcoder cpu_transcoder,
  			       bool enable, u32 hdcp_mask);
 diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
-index df582ff81b45..927d124457b6 100644
+index df582ff81b45..31a6a82c1261 100644
 --- a/drivers/gpu/drm/i915/display/intel_display.c
 +++ b/drivers/gpu/drm/i915/display/intel_display.c
 @@ -48,6 +48,7 @@
@@ -48213,7 +48417,17 @@ index df582ff81b45..927d124457b6 100644
  		new_crtc_state->update_pipe = true;
  }
  
-@@ -6476,15 +6372,14 @@ int intel_atomic_check(struct drm_device *dev,
+@@ -6414,6 +6310,9 @@ int intel_atomic_check(struct drm_device *dev,
+ 	int ret, i;
+ 	bool any_ms = false;
+ 
++	if (!intel_display_driver_check_access(dev_priv))
++		return -ENODEV;
++
+ 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
+ 					    new_crtc_state, i) {
+ 		/*
+@@ -6476,15 +6375,14 @@ int intel_atomic_check(struct drm_device *dev,
  		if (!new_crtc_state->hw.enable || intel_crtc_needs_modeset(new_crtc_state))
  			continue;
  
@@ -48234,7 +48448,7 @@ index df582ff81b45..927d124457b6 100644
  		}
  
  		if (is_trans_port_sync_mode(new_crtc_state)) {
-@@ -6493,21 +6388,13 @@ int intel_atomic_check(struct drm_device *dev,
+@@ -6493,21 +6391,13 @@ int intel_atomic_check(struct drm_device *dev,
  			if (new_crtc_state->master_transcoder != INVALID_TRANSCODER)
  				trans |= BIT(new_crtc_state->master_transcoder);
  
@@ -48260,7 +48474,7 @@ index df582ff81b45..927d124457b6 100644
  		}
  	}
  
-@@ -6528,10 +6415,6 @@ int intel_atomic_check(struct drm_device *dev,
+@@ -6528,10 +6418,6 @@ int intel_atomic_check(struct drm_device *dev,
  		goto fail;
  	}
  
@@ -48271,7 +48485,7 @@ index df582ff81b45..927d124457b6 100644
  	ret = intel_atomic_check_planes(state);
  	if (ret)
  		goto fail;
-@@ -6767,8 +6650,8 @@ static void intel_enable_crtc(struct intel_atomic_state *state,
+@@ -6767,8 +6653,8 @@ static void intel_enable_crtc(struct intel_atomic_state *state,
  	intel_crtc_enable_pipe_crc(crtc);
  }
  
@@ -48282,7 +48496,7 @@ index df582ff81b45..927d124457b6 100644
  {
  	struct drm_i915_private *i915 = to_i915(state->base.dev);
  	const struct intel_crtc_state *old_crtc_state =
-@@ -6810,6 +6693,15 @@ static void intel_update_crtc(struct intel_atomic_state *state,
+@@ -6810,6 +6696,15 @@ static void intel_update_crtc(struct intel_atomic_state *state,
  		intel_color_commit_noarm(new_crtc_state);
  
  	intel_crtc_planes_update_noarm(state, crtc);
@@ -48298,7 +48512,7 @@ index df582ff81b45..927d124457b6 100644
  
  	/* Perform vblank evasion around commit operation */
  	intel_pipe_update_start(state, crtc);
-@@ -6838,7 +6730,7 @@ static void intel_update_crtc(struct intel_atomic_state *state,
+@@ -6838,7 +6733,7 @@ static void intel_update_crtc(struct intel_atomic_state *state,
  	 * valid pipe configuration from the BIOS we need to take care
  	 * of enabling them on the CRTC's first fastset.
  	 */
@@ -48307,7 +48521,7 @@ index df582ff81b45..927d124457b6 100644
  	    old_crtc_state->inherited)
  		intel_crtc_arm_fifo_underrun(crtc, new_crtc_state);
  }
-@@ -6934,6 +6826,13 @@ static void intel_commit_modeset_enables(struct intel_atomic_state *state)
+@@ -6934,6 +6829,13 @@ static void intel_commit_modeset_enables(struct intel_atomic_state *state)
  			continue;
  
  		intel_enable_crtc(state, crtc);
@@ -48321,7 +48535,7 @@ index df582ff81b45..927d124457b6 100644
  		intel_update_crtc(state, crtc);
  	}
  }
-@@ -6971,6 +6870,15 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
+@@ -6971,6 +6873,15 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
  	 * So first lets enable all pipes that do not need a fullmodeset as
  	 * those don't have any external dependency.
  	 */
@@ -48337,7 +48551,7 @@ index df582ff81b45..927d124457b6 100644
  	while (update_pipes) {
  		for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
  						    new_crtc_state, i) {
-@@ -7041,6 +6949,15 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
+@@ -7041,6 +6952,15 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
  	/*
  	 * Finally we do the plane updates/etc. for all pipes that got enabled.
  	 */
@@ -48353,7 +48567,7 @@ index df582ff81b45..927d124457b6 100644
  	for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
  		enum pipe pipe = crtc->pipe;
  
-@@ -7060,49 +6977,24 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
+@@ -7060,49 +6980,24 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
  	drm_WARN_ON(&dev_priv->drm, update_pipes);
  }
  
@@ -48416,7 +48630,7 @@ index df582ff81b45..927d124457b6 100644
  }
  
  static void intel_atomic_cleanup_work(struct work_struct *work)
-@@ -7120,8 +7012,6 @@ static void intel_atomic_cleanup_work(struct work_struct *work)
+@@ -7120,8 +7015,6 @@ static void intel_atomic_cleanup_work(struct work_struct *work)
  	drm_atomic_helper_cleanup_planes(&i915->drm, &state->base);
  	drm_atomic_helper_commit_cleanup_done(&state->base);
  	drm_atomic_state_put(&state->base);
@@ -48425,7 +48639,7 @@ index df582ff81b45..927d124457b6 100644
  }
  
  static void intel_atomic_prepare_plane_clear_colors(struct intel_atomic_state *state)
-@@ -7394,32 +7284,6 @@ static void intel_atomic_commit_work(struct work_struct *work)
+@@ -7394,32 +7287,6 @@ static void intel_atomic_commit_work(struct work_struct *work)
  	intel_atomic_commit_tail(state);
  }
  
@@ -48458,7 +48672,7 @@ index df582ff81b45..927d124457b6 100644
  static void intel_atomic_track_fbs(struct intel_atomic_state *state)
  {
  	struct intel_plane_state *old_plane_state, *new_plane_state;
-@@ -7442,10 +7306,6 @@ int intel_atomic_commit(struct drm_device *dev, struct drm_atomic_state *_state,
+@@ -7442,10 +7309,6 @@ int intel_atomic_commit(struct drm_device *dev, struct drm_atomic_state *_state,
  
  	state->wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
  
@@ -48469,7 +48683,7 @@ index df582ff81b45..927d124457b6 100644
  	/*
  	 * The intel_legacy_cursor_update() fast path takes care
  	 * of avoiding the vblank waits for simple cursor
-@@ -7478,7 +7338,6 @@ int intel_atomic_commit(struct drm_device *dev, struct drm_atomic_state *_state,
+@@ -7478,7 +7341,6 @@ int intel_atomic_commit(struct drm_device *dev, struct drm_atomic_state *_state,
  	if (ret) {
  		drm_dbg_atomic(&dev_priv->drm,
  			       "Preparing state failed with %i\n", ret);
@@ -48477,7 +48691,7 @@ index df582ff81b45..927d124457b6 100644
  		intel_runtime_pm_put(&dev_priv->runtime_pm, state->wakeref);
  		return ret;
  	}
-@@ -7494,8 +7353,6 @@ int intel_atomic_commit(struct drm_device *dev, struct drm_atomic_state *_state,
+@@ -7494,8 +7356,6 @@ int intel_atomic_commit(struct drm_device *dev, struct drm_atomic_state *_state,
  		struct intel_crtc *crtc;
  		int i;
  
@@ -48486,7 +48700,7 @@ index df582ff81b45..927d124457b6 100644
  		for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i)
  			intel_color_cleanup_commit(new_crtc_state);
  
-@@ -7509,7 +7366,6 @@ int intel_atomic_commit(struct drm_device *dev, struct drm_atomic_state *_state,
+@@ -7509,7 +7369,6 @@ int intel_atomic_commit(struct drm_device *dev, struct drm_atomic_state *_state,
  	drm_atomic_state_get(&state->base);
  	INIT_WORK(&state->base.commit_work, intel_atomic_commit_work);
  
@@ -48494,7 +48708,7 @@ index df582ff81b45..927d124457b6 100644
  	if (nonblock && state->modeset) {
  		queue_work(dev_priv->display.wq.modeset, &state->base.commit_work);
  	} else if (nonblock) {
-@@ -7909,7 +7765,7 @@ enum drm_mode_status intel_cpu_transcoder_mode_valid(struct drm_i915_private *de
+@@ -7909,7 +7768,7 @@ enum drm_mode_status intel_cpu_transcoder_mode_valid(struct drm_i915_private *de
  	 * Cantiga+ cannot handle modes with a hsync front porch of 0.
  	 * WaPruneModeWithIncorrectHsyncOffset:ctg,elk,ilk,snb,ivb,vlv,hsw.
  	 */
@@ -48545,7 +48759,7 @@ index a05c7e2b782e..f4a0773f0fca 100644
  	unlikely(__ret_warn_on);					\
  })
 diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
-index ccfe27630fb6..47297ed85822 100644
+index ccfe27630fb6..8853a05dc331 100644
 --- a/drivers/gpu/drm/i915/display/intel_display_core.h
 +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
 @@ -19,6 +19,7 @@
@@ -48556,7 +48770,29 @@ index ccfe27630fb6..47297ed85822 100644
  #include "intel_display_power.h"
  #include "intel_dpll_mgr.h"
  #include "intel_fbc.h"
-@@ -297,12 +298,6 @@ struct intel_display {
+@@ -27,6 +28,8 @@
+ #include "intel_opregion.h"
+ #include "intel_wm_types.h"
+ 
++struct task_struct;
++
+ struct drm_i915_private;
+ struct drm_property;
+ struct drm_property_blob;
+@@ -171,6 +174,12 @@ struct intel_hotplug {
+ 	struct work_struct poll_init_work;
+ 	bool poll_enabled;
+ 
++	/*
++	 * Queuing of hotplug_work, reenable_work and poll_init_work is
++	 * enabled. Protected by drm_i915_private::irq_lock.
++	 */
++	bool detection_work_enabled;
++
+ 	unsigned int hpd_storm_threshold;
+ 	/* Whether or not to count short HPD IRQs in HPD storms */
+ 	u8 hpd_short_storm_enabled;
+@@ -297,11 +306,10 @@ struct intel_display {
  		const struct intel_audio_funcs *audio;
  	} funcs;
  
@@ -48565,11 +48801,14 @@ index ccfe27630fb6..47297ed85822 100644
 -		struct llist_head free_list;
 -		struct work_struct free_work;
 -	} atomic_helper;
--
++	struct {
++		bool any_task_allowed;
++		struct task_struct *allowed_task;
++	} access;
+ 
  	struct {
  		/* backlight registers and fields in struct intel_panel */
- 		struct mutex lock;
-@@ -347,15 +342,6 @@ struct intel_display {
+@@ -347,15 +355,6 @@ struct intel_display {
  		struct intel_global_obj obj;
  	} dbuf;
  
@@ -48585,7 +48824,7 @@ index ccfe27630fb6..47297ed85822 100644
  	struct {
  		/*
  		 * dkl.phy_lock protects against concurrent access of the
-@@ -443,6 +429,15 @@ struct intel_display {
+@@ -443,6 +442,15 @@ struct intel_display {
  		bool false_color;
  	} ips;
  
@@ -48601,7 +48840,7 @@ index ccfe27630fb6..47297ed85822 100644
  	struct {
  		struct i915_power_domains domains;
  
-@@ -520,6 +515,7 @@ struct intel_display {
+@@ -520,6 +528,7 @@ struct intel_display {
  	struct intel_hotplug hotplug;
  	struct intel_opregion opregion;
  	struct intel_overlay *overlay;
@@ -49337,10 +49576,18 @@ index 5b5c0e53307f..fe4268813786 100644
  
  void intel_display_device_info_print(const struct intel_display_device_info *info,
 diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
-index 44b59ac301e6..9df9097a0255 100644
+index 44b59ac301e6..ecf9cb74734b 100644
 --- a/drivers/gpu/drm/i915/display/intel_display_driver.c
 +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
-@@ -181,6 +181,13 @@ void intel_display_driver_early_probe(struct drm_i915_private *i915)
+@@ -45,6 +45,7 @@
+ #include "intel_hdcp.h"
+ #include "intel_hotplug.h"
+ #include "intel_hti.h"
++#include "intel_modeset_lock.h"
+ #include "intel_modeset_setup.h"
+ #include "intel_opregion.h"
+ #include "intel_overlay.h"
+@@ -181,6 +182,13 @@ void intel_display_driver_early_probe(struct drm_i915_private *i915)
  	if (!HAS_DISPLAY(i915))
  		return;
  
@@ -49354,7 +49601,7 @@ index 44b59ac301e6..9df9097a0255 100644
  	intel_display_irq_init(i915);
  	intel_dkl_phy_init(i915);
  	intel_color_init_hooks(i915);
-@@ -252,10 +259,6 @@ int intel_display_driver_probe_noirq(struct drm_i915_private *i915)
+@@ -252,10 +260,6 @@ int intel_display_driver_probe_noirq(struct drm_i915_private *i915)
  	if (ret)
  		goto cleanup_vga_client_pw_domain_dmc;
  
@@ -49365,7 +49612,181 @@ index 44b59ac301e6..9df9097a0255 100644
  	intel_init_quirks(i915);
  
  	intel_fbc_init(i915);
-@@ -423,9 +426,6 @@ void intel_display_driver_remove(struct drm_i915_private *i915)
+@@ -273,6 +277,139 @@ int intel_display_driver_probe_noirq(struct drm_i915_private *i915)
+ 	return ret;
+ }
+ 
++static void set_display_access(struct drm_i915_private *i915,
++			       bool any_task_allowed,
++			       struct task_struct *allowed_task)
++{
++	struct drm_modeset_acquire_ctx ctx;
++	int err;
++
++	intel_modeset_lock_ctx_retry(&ctx, NULL, 0, err) {
++		err = drm_modeset_lock_all_ctx(&i915->drm, &ctx);
++		if (err)
++			continue;
++
++		i915->display.access.any_task_allowed = any_task_allowed;
++		i915->display.access.allowed_task = allowed_task;
++	}
++
++	drm_WARN_ON(&i915->drm, err);
++}
++
++/**
++ * intel_display_driver_enable_user_access - Enable display HW access for all threads
++ * @i915: i915 device instance
++ *
++ * Enable the display HW access for all threads. Examples for such accesses
++ * are modeset commits and connector probing.
++ *
++ * This function should be called during driver loading and system resume once
++ * all the HW initialization steps are done.
++ */
++void intel_display_driver_enable_user_access(struct drm_i915_private *i915)
++{
++	set_display_access(i915, true, NULL);
++
++	intel_hpd_enable_detection_work(i915);
++}
++
++/**
++ * intel_display_driver_disable_user_access - Disable display HW access for user threads
++ * @i915: i915 device instance
++ *
++ * Disable the display HW access for user threads. Examples for such accesses
++ * are modeset commits and connector probing. For the current thread the
++ * access is still enabled, which should only perform HW init/deinit
++ * programming (as the initial modeset during driver loading or the disabling
++ * modeset during driver unloading and system suspend/shutdown). This function
++ * should be followed by calling either intel_display_driver_enable_user_access()
++ * after completing the HW init programming or
++ * intel_display_driver_suspend_access() after completing the HW deinit
++ * programming.
++ *
++ * This function should be called during driver loading/unloading and system
++ * suspend/shutdown before starting the HW init/deinit programming.
++ */
++void intel_display_driver_disable_user_access(struct drm_i915_private *i915)
++{
++	intel_hpd_disable_detection_work(i915);
++
++	set_display_access(i915, false, current);
++}
++
++/**
++ * intel_display_driver_suspend_access - Suspend display HW access for all threads
++ * @i915: i915 device instance
++ *
++ * Disable the display HW access for all threads. Examples for such accesses
++ * are modeset commits and connector probing. This call should be either
++ * followed by calling intel_display_driver_resume_access(), or the driver
++ * should be unloaded/shutdown.
++ *
++ * This function should be called during driver unloading and system
++ * suspend/shutdown after completing the HW deinit programming.
++ */
++void intel_display_driver_suspend_access(struct drm_i915_private *i915)
++{
++	set_display_access(i915, false, NULL);
++}
++
++/**
++ * intel_display_driver_resume_access - Resume display HW access for the resume thread
++ * @i915: i915 device instance
++ *
++ * Enable the display HW access for the current resume thread, keeping the
++ * access disabled for all other (user) threads. Examples for such accesses
++ * are modeset commits and connector probing. The resume thread should only
++ * perform HW init programming (as the restoring modeset). This function
++ * should be followed by calling intel_display_driver_enable_user_access(),
++ * after completing the HW init programming steps.
++ *
++ * This function should be called during system resume before starting the HW
++ * init steps.
++ */
++void intel_display_driver_resume_access(struct drm_i915_private *i915)
++{
++	set_display_access(i915, false, current);
++}
++
++/**
++ * intel_display_driver_check_access - Check if the current thread has disaplay HW access
++ * @i915: i915 device instance
++ *
++ * Check whether the current thread has display HW access, print a debug
++ * message if it doesn't. Such accesses are modeset commits and connector
++ * probing. If the function returns %false any HW access should be prevented.
++ *
++ * Returns %true if the current thread has display HW access, %false
++ * otherwise.
++ */
++bool intel_display_driver_check_access(struct drm_i915_private *i915)
++{
++	char comm[TASK_COMM_LEN];
++	char current_task[TASK_COMM_LEN + 16];
++	char allowed_task[TASK_COMM_LEN + 16] = "none";
++
++	if (i915->display.access.any_task_allowed ||
++	    i915->display.access.allowed_task == current)
++		return true;
++
++	snprintf(current_task, sizeof(current_task), "%s[%d]",
++		 get_task_comm(comm, current),
++		 task_pid_vnr(current));
++
++	if (i915->display.access.allowed_task)
++		snprintf(allowed_task, sizeof(allowed_task), "%s[%d]",
++			 get_task_comm(comm, i915->display.access.allowed_task),
++			 task_pid_vnr(i915->display.access.allowed_task));
++
++	drm_dbg_kms(&i915->drm,
++		    "Reject display access from task %s (allowed to %s)\n",
++		    current_task, allowed_task);
++
++	return false;
++}
++
+ /* part #2: call after irq install, but before gem init */
+ int intel_display_driver_probe_nogem(struct drm_i915_private *i915)
+ {
+@@ -323,6 +460,8 @@ int intel_display_driver_probe_nogem(struct drm_i915_private *i915)
+ 	intel_vga_disable(i915);
+ 	intel_setup_outputs(i915);
+ 
++	intel_display_driver_disable_user_access(i915);
++
+ 	drm_modeset_lock_all(dev);
+ 	intel_modeset_setup_hw_state(i915, dev->mode_config.acquire_ctx);
+ 	intel_acpi_assign_connector_fwnodes(i915);
+@@ -371,7 +510,6 @@ int intel_display_driver_probe(struct drm_i915_private *i915)
+ 
+ 	/* Only enable hotplug handling once the fbdev is fully set up. */
+ 	intel_hpd_init(i915);
+-	intel_hpd_poll_disable(i915);
+ 
+ 	skl_watermark_ipc_init(i915);
+ 
+@@ -391,6 +529,8 @@ void intel_display_driver_register(struct drm_i915_private *i915)
+ 
+ 	intel_audio_init(i915);
+ 
++	intel_display_driver_enable_user_access(i915);
++
+ 	intel_display_debugfs_register(i915);
+ 
+ 	/*
+@@ -409,6 +549,7 @@ void intel_display_driver_register(struct drm_i915_private *i915)
+ 	 * fbdev->async_cookie.
+ 	 */
+ 	drm_kms_helper_poll_init(&i915->drm);
++	intel_hpd_poll_disable(i915);
+ 
+ 	intel_display_device_info_print(DISPLAY_INFO(i915),
+ 					DISPLAY_RUNTIME_INFO(i915), &p);
+@@ -423,9 +564,6 @@ void intel_display_driver_remove(struct drm_i915_private *i915)
  	flush_workqueue(i915->display.wq.flip);
  	flush_workqueue(i915->display.wq.modeset);
  
@@ -49375,6 +49796,51 @@ index 44b59ac301e6..9df9097a0255 100644
  	/*
  	 * MST topology needs to be suspended so we don't have any calls to
  	 * fbdev after it's finalized. MST will be destroyed later as part of
+@@ -440,6 +578,8 @@ void intel_display_driver_remove_noirq(struct drm_i915_private *i915)
+ 	if (!HAS_DISPLAY(i915))
+ 		return;
+ 
++	intel_display_driver_suspend_access(i915);
++
+ 	/*
+ 	 * Due to the hpd irq storm handling the hotplug work can re-arm the
+ 	 * poll handlers. Hence disable polling after hpd handling is shut down.
+@@ -486,14 +626,17 @@ void intel_display_driver_unregister(struct drm_i915_private *i915)
+ 		return;
+ 
+ 	intel_fbdev_unregister(i915);
+-	intel_audio_deinit(i915);
+-
+ 	/*
+ 	 * After flushing the fbdev (incl. a late async config which
+ 	 * will have delayed queuing of a hotplug event), then flush
+ 	 * the hotplug events.
+ 	 */
+ 	drm_kms_helper_poll_fini(&i915->drm);
++
++	intel_display_driver_disable_user_access(i915);
++
++	intel_audio_deinit(i915);
++
+ 	drm_atomic_helper_shutdown(&i915->drm);
+ 
+ 	acpi_video_unregister();
+diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.h b/drivers/gpu/drm/i915/display/intel_display_driver.h
+index c276a58ee329..42cc4af6d3fd 100644
+--- a/drivers/gpu/drm/i915/display/intel_display_driver.h
++++ b/drivers/gpu/drm/i915/display/intel_display_driver.h
+@@ -32,5 +32,11 @@ int __intel_display_driver_resume(struct drm_i915_private *i915,
+ 				  struct drm_atomic_state *state,
+ 				  struct drm_modeset_acquire_ctx *ctx);
+ 
++void intel_display_driver_enable_user_access(struct drm_i915_private *i915);
++void intel_display_driver_disable_user_access(struct drm_i915_private *i915);
++void intel_display_driver_suspend_access(struct drm_i915_private *i915);
++void intel_display_driver_resume_access(struct drm_i915_private *i915);
++bool intel_display_driver_check_access(struct drm_i915_private *i915);
++
+ #endif /* __INTEL_DISPLAY_DRIVER_H__ */
+ 
 diff --git a/drivers/gpu/drm/i915/display/intel_display_irq.c b/drivers/gpu/drm/i915/display/intel_display_irq.c
 index bff4a76310c0..99843883cef7 100644
 --- a/drivers/gpu/drm/i915/display/intel_display_irq.c
@@ -49903,7 +50369,7 @@ index 17178d5d7788..c2c347b22448 100644
  		return;
  
 diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
-index 65ea37fe8cff..b9b9d9f2bc0b 100644
+index 65ea37fe8cff..3556ccedbe4c 100644
 --- a/drivers/gpu/drm/i915/display/intel_display_types.h
 +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
 @@ -198,6 +198,12 @@ struct intel_encoder {
@@ -50019,7 +50485,17 @@ index 65ea37fe8cff..b9b9d9f2bc0b 100644
  };
  
  enum lspcon_vendor {
-@@ -1992,17 +2006,6 @@ dp_to_lspcon(struct intel_dp *intel_dp)
+@@ -1876,6 +1890,9 @@ struct intel_digital_port {
+ 	u32 (*infoframes_enabled)(struct intel_encoder *encoder,
+ 				  const struct intel_crtc_state *pipe_config);
+ 	bool (*connected)(struct intel_encoder *encoder);
++
++	void (*lock)(struct intel_digital_port *dig_port);
++	void (*unlock)(struct intel_digital_port *dig_port);
+ };
+ 
+ struct intel_dp_mst_encoder {
+@@ -1992,17 +2009,6 @@ dp_to_lspcon(struct intel_dp *intel_dp)
  
  #define dp_to_i915(__intel_dp) to_i915(dp_to_dig_port(__intel_dp)->base.base.dev)
  
@@ -50207,10 +50683,18 @@ index cf10094acae3..90d0dbb41cfe 100644
  #define DMC_EVT_CTL_EVENT_ID_CLK_MSEC	0xbf
  
 diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
-index 62ce92772367..9ff0cbd9c0df 100644
+index 62ce92772367..77ba6de6ba08 100644
 --- a/drivers/gpu/drm/i915/display/intel_dp.c
 +++ b/drivers/gpu/drm/i915/display/intel_dp.c
-@@ -85,8 +85,8 @@
+@@ -56,6 +56,7 @@
+ #include "intel_cx0_phy.h"
+ #include "intel_ddi.h"
+ #include "intel_de.h"
++#include "intel_display_driver.h"
+ #include "intel_display_types.h"
+ #include "intel_dp.h"
+ #include "intel_dp_aux.h"
+@@ -85,8 +86,8 @@
  #define DP_DSC_MAX_ENC_THROUGHPUT_0		340000
  #define DP_DSC_MAX_ENC_THROUGHPUT_1		400000
  
@@ -50221,7 +50705,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  
  /* Compliance test status bits  */
  #define INTEL_DP_RESOLUTION_SHIFT_MASK	0
-@@ -124,7 +124,31 @@ static void intel_dp_unset_edid(struct intel_dp *intel_dp);
+@@ -124,7 +125,31 @@ static void intel_dp_unset_edid(struct intel_dp *intel_dp);
  /* Is link rate UHBR and thus 128b/132b? */
  bool intel_dp_is_uhbr(const struct intel_crtc_state *crtc_state)
  {
@@ -50254,7 +50738,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  }
  
  static void intel_dp_set_default_sink_rates(struct intel_dp *intel_dp)
-@@ -331,6 +355,9 @@ int intel_dp_max_lane_count(struct intel_dp *intel_dp)
+@@ -331,6 +356,9 @@ int intel_dp_max_lane_count(struct intel_dp *intel_dp)
  /*
   * The required data bandwidth for a mode with given pixel clock and bpp. This
   * is the required net bandwidth independent of the data bandwidth efficiency.
@@ -50264,7 +50748,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
   */
  int
  intel_dp_link_required(int pixel_clock, int bpp)
-@@ -339,6 +366,22 @@ intel_dp_link_required(int pixel_clock, int bpp)
+@@ -339,6 +367,22 @@ intel_dp_link_required(int pixel_clock, int bpp)
  	return DIV_ROUND_UP(pixel_clock * bpp, 8);
  }
  
@@ -50287,7 +50771,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  /*
   * Given a link rate and lanes, get the data bandwidth.
   *
-@@ -362,29 +405,27 @@ intel_dp_link_required(int pixel_clock, int bpp)
+@@ -362,29 +406,27 @@ intel_dp_link_required(int pixel_clock, int bpp)
  int
  intel_dp_max_data_rate(int max_link_rate, int max_lanes)
  {
@@ -50330,7 +50814,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  }
  
  bool intel_dp_can_bigjoiner(struct intel_dp *intel_dp)
-@@ -680,8 +721,22 @@ int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
+@@ -680,8 +722,22 @@ int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
  
  u32 intel_dp_mode_to_fec_clock(u32 mode_clock)
  {
@@ -50355,7 +50839,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  }
  
  static int
-@@ -1373,9 +1428,9 @@ static bool intel_dp_source_supports_fec(struct intel_dp *intel_dp,
+@@ -1373,9 +1429,9 @@ static bool intel_dp_source_supports_fec(struct intel_dp *intel_dp,
  	return false;
  }
  
@@ -50368,7 +50852,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  {
  	return intel_dp_source_supports_fec(intel_dp, pipe_config) &&
  		drm_dp_sink_supports_fec(connector->dp.fec_capability);
-@@ -1388,6 +1443,7 @@ static bool intel_dp_supports_dsc(const struct intel_connector *connector,
+@@ -1388,6 +1444,7 @@ static bool intel_dp_supports_dsc(const struct intel_connector *connector,
  		return false;
  
  	return intel_dsc_source_support(crtc_state) &&
@@ -50376,7 +50860,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  		drm_dp_sink_supports_dsc(connector->dp.dsc_dpcd);
  }
  
-@@ -1721,15 +1777,15 @@ static bool intel_dp_dsc_supports_format(const struct intel_connector *connector
+@@ -1721,15 +1778,15 @@ static bool intel_dp_dsc_supports_format(const struct intel_connector *connector
  	return drm_dp_dsc_sink_supports_format(connector->dp.dsc_dpcd, sink_dsc_format);
  }
  
@@ -50395,7 +50879,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  
  	return available_bw > required_bw;
  }
-@@ -1737,7 +1793,7 @@ static bool is_bw_sufficient_for_dsc_config(u16 compressed_bpp, u32 link_clock,
+@@ -1737,7 +1794,7 @@ static bool is_bw_sufficient_for_dsc_config(u16 compressed_bpp, u32 link_clock,
  static int dsc_compute_link_config(struct intel_dp *intel_dp,
  				   struct intel_crtc_state *pipe_config,
  				   struct link_config_limits *limits,
@@ -50404,7 +50888,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  				   int timeslots)
  {
  	const struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
-@@ -1752,8 +1808,8 @@ static int dsc_compute_link_config(struct intel_dp *intel_dp,
+@@ -1752,8 +1809,8 @@ static int dsc_compute_link_config(struct intel_dp *intel_dp,
  		for (lane_count = limits->min_lane_count;
  		     lane_count <= limits->max_lane_count;
  		     lane_count <<= 1) {
@@ -50415,7 +50899,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  							     pipe_config->output_format,
  							     timeslots))
  				continue;
-@@ -1795,7 +1851,7 @@ u16 intel_dp_dsc_max_sink_compressed_bppx16(const struct intel_connector *connec
+@@ -1795,7 +1852,7 @@ u16 intel_dp_dsc_max_sink_compressed_bppx16(const struct intel_connector *connec
  	return 0;
  }
  
@@ -50424,7 +50908,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  {
  	/* From Mandatory bit rate range Support Table 2-157 (DP v2.0) */
  	switch (pipe_config->output_format) {
-@@ -1812,9 +1868,9 @@ static int dsc_sink_min_compressed_bpp(struct intel_crtc_state *pipe_config)
+@@ -1812,9 +1869,9 @@ static int dsc_sink_min_compressed_bpp(struct intel_crtc_state *pipe_config)
  	return 0;
  }
  
@@ -50437,7 +50921,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  {
  	return intel_dp_dsc_max_sink_compressed_bppx16(connector,
  						       pipe_config, bpc) >> 4;
-@@ -1834,7 +1890,7 @@ static int dsc_src_max_compressed_bpp(struct intel_dp *intel_dp)
+@@ -1834,7 +1891,7 @@ static int dsc_src_max_compressed_bpp(struct intel_dp *intel_dp)
  	 * Max Compressed bpp for Gen 13+ is 27bpp.
  	 * For earlier platform is 23bpp. (Bspec:49259).
  	 */
@@ -50446,7 +50930,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  		return 23;
  	else
  		return 27;
-@@ -1866,10 +1922,11 @@ icl_dsc_compute_link_config(struct intel_dp *intel_dp,
+@@ -1866,10 +1923,11 @@ icl_dsc_compute_link_config(struct intel_dp *intel_dp,
  		ret = dsc_compute_link_config(intel_dp,
  					      pipe_config,
  					      limits,
@@ -50460,7 +50944,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  			return 0;
  		}
  	}
-@@ -1885,6 +1942,7 @@ icl_dsc_compute_link_config(struct intel_dp *intel_dp,
+@@ -1885,6 +1943,7 @@ icl_dsc_compute_link_config(struct intel_dp *intel_dp,
   */
  static int
  xelpd_dsc_compute_link_config(struct intel_dp *intel_dp,
@@ -50468,7 +50952,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  			      struct intel_crtc_state *pipe_config,
  			      struct link_config_limits *limits,
  			      int dsc_max_bpp,
-@@ -1892,22 +1950,38 @@ xelpd_dsc_compute_link_config(struct intel_dp *intel_dp,
+@@ -1892,22 +1951,38 @@ xelpd_dsc_compute_link_config(struct intel_dp *intel_dp,
  			      int pipe_bpp,
  			      int timeslots)
  {
@@ -50515,7 +50999,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  			return 0;
  		}
  	}
-@@ -1928,12 +2002,14 @@ static int dsc_compute_compressed_bpp(struct intel_dp *intel_dp,
+@@ -1928,12 +2003,14 @@ static int dsc_compute_compressed_bpp(struct intel_dp *intel_dp,
  	int dsc_joiner_max_bpp;
  
  	dsc_src_min_bpp = dsc_src_min_compressed_bpp();
@@ -50532,7 +51016,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  	dsc_max_bpp = dsc_sink_max_bpp ? min(dsc_sink_max_bpp, dsc_src_max_bpp) : dsc_src_max_bpp;
  
  	dsc_joiner_max_bpp = get_max_compressed_bpp_with_joiner(i915, adjusted_mode->clock,
-@@ -1943,7 +2019,7 @@ static int dsc_compute_compressed_bpp(struct intel_dp *intel_dp,
+@@ -1943,7 +2020,7 @@ static int dsc_compute_compressed_bpp(struct intel_dp *intel_dp,
  	dsc_max_bpp = min(dsc_max_bpp, to_bpp_int(limits->link.max_bpp_x16));
  
  	if (DISPLAY_VER(i915) >= 13)
@@ -50541,7 +51025,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  						     dsc_max_bpp, dsc_min_bpp, pipe_bpp, timeslots);
  	return icl_dsc_compute_link_config(intel_dp, pipe_config, limits,
  					   dsc_max_bpp, dsc_min_bpp, pipe_bpp, timeslots);
-@@ -2088,19 +2164,22 @@ static int intel_edp_dsc_compute_pipe_bpp(struct intel_dp *intel_dp,
+@@ -2088,19 +2165,22 @@ static int intel_edp_dsc_compute_pipe_bpp(struct intel_dp *intel_dp,
  	pipe_config->lane_count = limits->max_lane_count;
  
  	dsc_src_min_bpp = dsc_src_min_compressed_bpp();
@@ -50567,7 +51051,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  
  	pipe_config->pipe_bpp = pipe_bpp;
  
-@@ -2122,8 +2201,9 @@ int intel_dp_dsc_compute_config(struct intel_dp *intel_dp,
+@@ -2122,8 +2202,9 @@ int intel_dp_dsc_compute_config(struct intel_dp *intel_dp,
  		&pipe_config->hw.adjusted_mode;
  	int ret;
  
@@ -50579,7 +51063,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  
  	if (!intel_dp_supports_dsc(connector, pipe_config))
  		return -EINVAL;
-@@ -2188,18 +2268,18 @@ int intel_dp_dsc_compute_config(struct intel_dp *intel_dp,
+@@ -2188,18 +2269,18 @@ int intel_dp_dsc_compute_config(struct intel_dp *intel_dp,
  	ret = intel_dp_dsc_compute_params(connector, pipe_config);
  	if (ret < 0) {
  		drm_dbg_kms(&dev_priv->drm,
@@ -50603,7 +51087,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  		    pipe_config->dsc.slice_count);
  
  	return 0;
-@@ -2311,6 +2391,8 @@ intel_dp_compute_link_config(struct intel_encoder *encoder,
+@@ -2311,6 +2392,8 @@ intel_dp_compute_link_config(struct intel_encoder *encoder,
  {
  	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
  	struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
@@ -50612,7 +51096,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  	const struct drm_display_mode *adjusted_mode =
  		&pipe_config->hw.adjusted_mode;
  	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
-@@ -2319,6 +2401,10 @@ intel_dp_compute_link_config(struct intel_encoder *encoder,
+@@ -2319,6 +2402,10 @@ intel_dp_compute_link_config(struct intel_encoder *encoder,
  	bool dsc_needed;
  	int ret = 0;
  
@@ -50623,7 +51107,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  	if (intel_dp_need_bigjoiner(intel_dp, adjusted_mode->crtc_hdisplay,
  				    adjusted_mode->crtc_clock))
  		pipe_config->bigjoiner_pipes = GENMASK(crtc->pipe + 1, crtc->pipe);
-@@ -2366,15 +2452,15 @@ intel_dp_compute_link_config(struct intel_encoder *encoder,
+@@ -2366,15 +2453,15 @@ intel_dp_compute_link_config(struct intel_encoder *encoder,
  
  	if (pipe_config->dsc.compression_enable) {
  		drm_dbg_kms(&i915->drm,
@@ -50642,7 +51126,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  			    intel_dp_max_data_rate(pipe_config->port_clock,
  						   pipe_config->lane_count));
  	} else {
-@@ -2443,12 +2529,22 @@ static void intel_dp_compute_vsc_colorimetry(const struct intel_crtc_state *crtc
+@@ -2443,12 +2530,22 @@ static void intel_dp_compute_vsc_colorimetry(const struct intel_crtc_state *crtc
  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
  
@@ -50671,7 +51155,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  	vsc->length = 0x13;
  
  	/* DP 1.4a spec, Table 2-120 */
-@@ -2520,43 +2616,38 @@ static void intel_dp_compute_vsc_sdp(struct intel_dp *intel_dp,
+@@ -2520,43 +2617,38 @@ static void intel_dp_compute_vsc_sdp(struct intel_dp *intel_dp,
  				     struct intel_crtc_state *crtc_state,
  				     const struct drm_connector_state *conn_state)
  {
@@ -50694,14 +51178,14 @@ index 62ce92772367..9ff0cbd9c0df 100644
 -	intel_dp_compute_vsc_colorimetry(crtc_state, conn_state,
 -					 &crtc_state->infoframes.vsc);
 -}
--
+ 
 -void intel_dp_compute_psr_vsc_sdp(struct intel_dp *intel_dp,
 -				  const struct intel_crtc_state *crtc_state,
 -				  const struct drm_connector_state *conn_state,
 -				  struct drm_dp_vsc_sdp *vsc)
 -{
 -	vsc->sdp_type = DP_SDP_VSC;
- 
+-
 -	if (crtc_state->has_psr2) {
 -		if (intel_dp->psr.colorimetry_support &&
 -		    intel_dp_needs_vsc_sdp(crtc_state, conn_state)) {
@@ -50740,7 +51224,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  	} else {
  		/*
  		 * [PSR1]
-@@ -2633,7 +2724,7 @@ static bool can_enable_drrs(struct intel_connector *connector,
+@@ -2633,7 +2725,7 @@ static bool can_enable_drrs(struct intel_connector *connector,
  static void
  intel_dp_drrs_compute_config(struct intel_connector *connector,
  			     struct intel_crtc_state *pipe_config,
@@ -50749,7 +51233,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  {
  	struct drm_i915_private *i915 = to_i915(connector->base.dev);
  	const struct drm_display_mode *downclock_mode =
-@@ -2658,9 +2749,10 @@ intel_dp_drrs_compute_config(struct intel_connector *connector,
+@@ -2658,9 +2750,10 @@ intel_dp_drrs_compute_config(struct intel_connector *connector,
  	if (pipe_config->splitter.enable)
  		pixel_clock /= pipe_config->splitter.link_count;
  
@@ -50763,7 +51247,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  
  	/* FIXME: abstract this better */
  	if (pipe_config->splitter.enable)
-@@ -2736,19 +2828,12 @@ intel_dp_audio_compute_config(struct intel_encoder *encoder,
+@@ -2736,19 +2829,12 @@ intel_dp_audio_compute_config(struct intel_encoder *encoder,
  			      struct intel_crtc_state *pipe_config,
  			      struct drm_connector_state *conn_state)
  {
@@ -50783,7 +51267,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  }
  
  int
-@@ -2761,7 +2846,7 @@ intel_dp_compute_config(struct intel_encoder *encoder,
+@@ -2761,7 +2847,7 @@ intel_dp_compute_config(struct intel_encoder *encoder,
  	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
  	const struct drm_display_mode *fixed_mode;
  	struct intel_connector *connector = intel_dp->attached_connector;
@@ -50792,7 +51276,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  
  	if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv) && encoder->port != PORT_A)
  		pipe_config->has_pch_encoder = true;
-@@ -2810,10 +2895,10 @@ intel_dp_compute_config(struct intel_encoder *encoder,
+@@ -2810,10 +2896,10 @@ intel_dp_compute_config(struct intel_encoder *encoder,
  		drm_dp_enhanced_frame_cap(intel_dp->dpcd);
  
  	if (pipe_config->dsc.compression_enable)
@@ -50806,7 +51290,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  
  	if (intel_dp->mso_link_count) {
  		int n = intel_dp->mso_link_count;
-@@ -2837,12 +2922,12 @@ intel_dp_compute_config(struct intel_encoder *encoder,
+@@ -2837,12 +2923,12 @@ intel_dp_compute_config(struct intel_encoder *encoder,
  
  	intel_dp_audio_compute_config(encoder, pipe_config, conn_state);
  
@@ -50822,7 +51306,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  
  	/* FIXME: abstract this better */
  	if (pipe_config->splitter.enable)
-@@ -2853,7 +2938,7 @@ intel_dp_compute_config(struct intel_encoder *encoder,
+@@ -2853,7 +2939,7 @@ intel_dp_compute_config(struct intel_encoder *encoder,
  
  	intel_vrr_compute_config(pipe_config, conn_state);
  	intel_psr_compute_config(intel_dp, pipe_config, conn_state);
@@ -50831,7 +51315,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  	intel_dp_compute_vsc_sdp(intel_dp, pipe_config, conn_state);
  	intel_dp_compute_hdr_metadata_infoframe_sdp(intel_dp, pipe_config, conn_state);
  
-@@ -2921,24 +3006,179 @@ static bool downstream_hpd_needs_d0(struct intel_dp *intel_dp)
+@@ -2921,24 +3007,179 @@ static bool downstream_hpd_needs_d0(struct intel_dp *intel_dp)
  		intel_dp->downstream_ports[0] & DP_DS_PORT_HPD;
  }
  
@@ -51021,7 +51505,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  static void
  intel_edp_init_source_oui(struct intel_dp *intel_dp, bool careful)
  {
-@@ -3775,7 +4015,7 @@ intel_dp_can_mst(struct intel_dp *intel_dp)
+@@ -3775,7 +4016,7 @@ intel_dp_can_mst(struct intel_dp *intel_dp)
  {
  	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
  
@@ -51030,7 +51514,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  		intel_dp_mst_source_support(intel_dp) &&
  		drm_dp_read_mst_cap(&intel_dp->aux, intel_dp->dpcd);
  }
-@@ -3793,13 +4033,13 @@ intel_dp_configure_mst(struct intel_dp *intel_dp)
+@@ -3793,13 +4034,13 @@ intel_dp_configure_mst(struct intel_dp *intel_dp)
  		    encoder->base.base.id, encoder->base.name,
  		    str_yes_no(intel_dp_mst_source_support(intel_dp)),
  		    str_yes_no(sink_can_mst),
@@ -51046,7 +51530,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  
  	drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
  					intel_dp->is_mst);
-@@ -3869,11 +4109,16 @@ static ssize_t intel_dp_vsc_sdp_pack(const struct drm_dp_vsc_sdp *vsc,
+@@ -3869,11 +4110,16 @@ static ssize_t intel_dp_vsc_sdp_pack(const struct drm_dp_vsc_sdp *vsc,
  	sdp->sdp_header.HB2 = vsc->revision; /* Revision Number */
  	sdp->sdp_header.HB3 = vsc->length; /* Number of Valid Data Bytes */
  
@@ -51066,7 +51550,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  		goto out;
  
  	/* VSC SDP Payload for DB16 through DB18 */
-@@ -4023,24 +4268,6 @@ static void intel_write_dp_sdp(struct intel_encoder *encoder,
+@@ -4023,24 +4269,6 @@ static void intel_write_dp_sdp(struct intel_encoder *encoder,
  	dig_port->write_infoframe(encoder, crtc_state, type, &sdp, len);
  }
  
@@ -51091,7 +51575,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  void intel_dp_set_infoframes(struct intel_encoder *encoder,
  			     bool enable,
  			     const struct intel_crtc_state *crtc_state,
-@@ -4053,7 +4280,10 @@ void intel_dp_set_infoframes(struct intel_encoder *encoder,
+@@ -4053,7 +4281,10 @@ void intel_dp_set_infoframes(struct intel_encoder *encoder,
  			 VIDEO_DIP_ENABLE_SPD_HSW | VIDEO_DIP_ENABLE_DRM_GLK;
  	u32 val = intel_de_read(dev_priv, reg) & ~dip_enable;
  
@@ -51103,7 +51587,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  	/* When PSR is enabled, this routine doesn't disable VSC DIP */
  	if (!crtc_state->has_psr)
  		val &= ~VIDEO_DIP_ENABLE_VSC_HSW;
-@@ -4064,9 +4294,7 @@ void intel_dp_set_infoframes(struct intel_encoder *encoder,
+@@ -4064,9 +4295,7 @@ void intel_dp_set_infoframes(struct intel_encoder *encoder,
  	if (!enable)
  		return;
  
@@ -51114,7 +51598,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  
  	intel_write_dp_sdp(encoder, crtc_state, HDMI_PACKET_TYPE_GAMUT_METADATA);
  }
-@@ -4197,10 +4425,6 @@ static void intel_read_dp_vsc_sdp(struct intel_encoder *encoder,
+@@ -4197,10 +4426,6 @@ static void intel_read_dp_vsc_sdp(struct intel_encoder *encoder,
  	struct dp_sdp sdp = {};
  	int ret;
  
@@ -51125,7 +51609,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  	if ((crtc_state->infoframes.enable &
  	     intel_hdmi_infoframe_enable(type)) == 0)
  		return;
-@@ -4411,31 +4635,36 @@ static void intel_dp_phy_pattern_update(struct intel_dp *intel_dp,
+@@ -4411,31 +4636,36 @@ static void intel_dp_phy_pattern_update(struct intel_dp *intel_dp,
  	struct drm_dp_phy_test_params *data =
  			&intel_dp->compliance.test_data.phytest;
  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
@@ -51167,7 +51651,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  		/*
  		 * FIXME: Ideally pattern should come from DPCD 0x250. As
  		 * current firmware of DPR-100 could not set it, so hardcoding
-@@ -4453,7 +4682,7 @@ static void intel_dp_phy_pattern_update(struct intel_dp *intel_dp,
+@@ -4453,7 +4683,7 @@ static void intel_dp_phy_pattern_update(struct intel_dp *intel_dp,
  			       DDI_DP_COMP_CTL_ENABLE |
  			       DDI_DP_COMP_CTL_CUSTOM80);
  		break;
@@ -51176,7 +51660,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  		/*
  		 * FIXME: Ideally pattern should come from DPCD 0x24A. As
  		 * current firmware of DPR-100 could not set it, so hardcoding
-@@ -4465,8 +4694,19 @@ static void intel_dp_phy_pattern_update(struct intel_dp *intel_dp,
+@@ -4465,8 +4695,19 @@ static void intel_dp_phy_pattern_update(struct intel_dp *intel_dp,
  			       DDI_DP_COMP_CTL_ENABLE | DDI_DP_COMP_CTL_HBR2 |
  			       pattern_val);
  		break;
@@ -51197,7 +51681,91 @@ index 62ce92772367..9ff0cbd9c0df 100644
  	}
  }
  
-@@ -5413,6 +5653,7 @@ intel_dp_detect(struct drm_connector *connector,
+@@ -5185,8 +5426,24 @@ edp_detect(struct intel_dp *intel_dp)
+ 	return connector_status_connected;
+ }
+ 
++void intel_digital_port_lock(struct intel_encoder *encoder)
++{
++	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
++
++	if (dig_port->lock)
++		dig_port->lock(dig_port);
++}
++
++void intel_digital_port_unlock(struct intel_encoder *encoder)
++{
++	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
++
++	if (dig_port->unlock)
++		dig_port->unlock(dig_port);
++}
++
+ /*
+- * intel_digital_port_connected - is the specified port connected?
++ * intel_digital_port_connected_locked - is the specified port connected?
+  * @encoder: intel_encoder
+  *
+  * In cases where there's a connector physically connected but it can't be used
+@@ -5194,21 +5451,44 @@ edp_detect(struct intel_dp *intel_dp)
+  * pretty much treat the port as disconnected. This is relevant for type-C
+  * (starting on ICL) where there's ownership involved.
+  *
++ * The caller must hold the lock acquired by calling intel_digital_port_lock()
++ * when calling this function.
++ *
+  * Return %true if port is connected, %false otherwise.
+  */
+-bool intel_digital_port_connected(struct intel_encoder *encoder)
++bool intel_digital_port_connected_locked(struct intel_encoder *encoder)
+ {
+ 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+ 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
++	bool is_glitch_free = intel_tc_port_handles_hpd_glitches(dig_port);
+ 	bool is_connected = false;
+ 	intel_wakeref_t wakeref;
+ 
+-	with_intel_display_power(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref)
+-		is_connected = dig_port->connected(encoder);
++	with_intel_display_power(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref) {
++		unsigned long wait_expires = jiffies + msecs_to_jiffies_timeout(4);
++
++		do {
++			is_connected = dig_port->connected(encoder);
++			if (is_connected || is_glitch_free)
++				break;
++			usleep_range(10, 30);
++		} while (time_before(jiffies, wait_expires));
++	}
+ 
+ 	return is_connected;
+ }
+ 
++bool intel_digital_port_connected(struct intel_encoder *encoder)
++{
++	bool ret;
++
++	intel_digital_port_lock(encoder);
++	ret = intel_digital_port_connected_locked(encoder);
++	intel_digital_port_unlock(encoder);
++
++	return ret;
++}
++
+ static const struct drm_edid *
+ intel_dp_get_edid(struct intel_dp *intel_dp)
+ {
+@@ -5402,6 +5682,9 @@ intel_dp_detect(struct drm_connector *connector,
+ 	if (!intel_display_device_enabled(dev_priv))
+ 		return connector_status_disconnected;
+ 
++	if (!intel_display_driver_check_access(dev_priv))
++		return connector->status;
++
+ 	/* Can't disconnect eDP */
+ 	if (intel_dp_is_edp(intel_dp))
+ 		status = edp_detect(intel_dp);
+@@ -5413,6 +5696,7 @@ intel_dp_detect(struct drm_connector *connector,
  	if (status == connector_status_disconnected) {
  		memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance));
  		memset(intel_connector->dp.dsc_dpcd, 0, sizeof(intel_connector->dp.dsc_dpcd));
@@ -51205,7 +51773,35 @@ index 62ce92772367..9ff0cbd9c0df 100644
  
  		if (intel_dp->is_mst) {
  			drm_dbg_kms(&dev_priv->drm,
-@@ -6258,15 +6499,8 @@ intel_dp_init_connector(struct intel_digital_port *dig_port,
+@@ -5501,6 +5785,10 @@ intel_dp_force(struct drm_connector *connector)
+ 
+ 	drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s]\n",
+ 		    connector->base.id, connector->name);
++
++	if (!intel_display_driver_check_access(dev_priv))
++		return;
++
+ 	intel_dp_unset_edid(intel_dp);
+ 
+ 	if (connector->status != connector_status_connected)
+@@ -5785,7 +6073,7 @@ static void intel_dp_oob_hotplug_event(struct drm_connector *connector,
+ 	spin_unlock_irq(&i915->irq_lock);
+ 
+ 	if (need_work)
+-		queue_delayed_work(i915->unordered_wq, &i915->display.hotplug.hotplug_work, 0);
++		intel_hpd_schedule_detection(i915);
+ }
+ 
+ static const struct drm_connector_funcs intel_dp_connector_funcs = {
+@@ -6228,6 +6516,7 @@ intel_dp_init_connector(struct intel_digital_port *dig_port,
+ 		connector->interlace_allowed = true;
+ 
+ 	intel_connector->polled = DRM_CONNECTOR_POLL_HPD;
++	intel_connector->base.polled = intel_connector->polled;
+ 
+ 	intel_connector_attach_encoder(intel_connector, intel_encoder);
+ 
+@@ -6258,15 +6547,8 @@ intel_dp_init_connector(struct intel_digital_port *dig_port,
  				    "HDCP init failed, skipping.\n");
  	}
  
@@ -51224,7 +51820,7 @@ index 62ce92772367..9ff0cbd9c0df 100644
  	intel_dp->frl.is_trained = false;
  	intel_dp->frl.trained_rate_gbps = 0;
 diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h
-index 484aea215a25..b911706d2e95 100644
+index 484aea215a25..530cc97bc42f 100644
 --- a/drivers/gpu/drm/i915/display/intel_dp.h
 +++ b/drivers/gpu/drm/i915/display/intel_dp.h
 @@ -57,9 +57,12 @@ int intel_dp_retrain_link(struct intel_encoder *encoder,
@@ -51252,7 +51848,7 @@ index 484aea215a25..b911706d2e95 100644
  bool intel_dp_is_port_edp(struct drm_i915_private *dev_priv, enum port port);
  enum irqreturn intel_dp_hpd_pulse(struct intel_digital_port *dig_port,
  				  bool long_hpd);
-@@ -98,17 +103,12 @@ bool intel_dp_source_supports_tps4(struct drm_i915_private *i915);
+@@ -98,24 +103,22 @@ bool intel_dp_source_supports_tps4(struct drm_i915_private *i915);
  
  bool intel_dp_get_colorimetry_status(struct intel_dp *intel_dp);
  int intel_dp_link_required(int pixel_clock, int bpp);
@@ -51272,7 +51868,17 @@ index 484aea215a25..b911706d2e95 100644
  void intel_dp_set_infoframes(struct intel_encoder *encoder, bool enable,
  			     const struct intel_crtc_state *crtc_state,
  			     const struct drm_connector_state *conn_state);
-@@ -125,6 +125,10 @@ u16 intel_dp_dsc_get_max_compressed_bpp(struct drm_i915_private *i915,
+ void intel_read_dp_sdp(struct intel_encoder *encoder,
+ 		       struct intel_crtc_state *crtc_state,
+ 		       unsigned int type);
++void intel_digital_port_lock(struct intel_encoder *encoder);
++void intel_digital_port_unlock(struct intel_encoder *encoder);
+ bool intel_digital_port_connected(struct intel_encoder *encoder);
++bool intel_digital_port_connected_locked(struct intel_encoder *encoder);
+ int intel_dp_dsc_compute_max_bpp(const struct intel_connector *connector,
+ 				 u8 dsc_max_bpc);
+ u16 intel_dp_dsc_get_max_compressed_bpp(struct drm_i915_private *i915,
+@@ -125,6 +128,10 @@ u16 intel_dp_dsc_get_max_compressed_bpp(struct drm_i915_private *i915,
  					enum intel_output_format output_format,
  					u32 pipe_bpp,
  					u32 timeslots);
@@ -51283,7 +51889,7 @@ index 484aea215a25..b911706d2e95 100644
  u8 intel_dp_dsc_get_slice_count(const struct intel_connector *connector,
  				int mode_clock, int mode_hdisplay,
  				bool bigjoiner);
-@@ -136,7 +140,16 @@ static inline unsigned int intel_dp_unused_lane_mask(int lane_count)
+@@ -136,7 +143,16 @@ static inline unsigned int intel_dp_unused_lane_mask(int lane_count)
  	return ~((1 << lane_count) - 1) & 0xf;
  }
  
@@ -51301,10 +51907,18 @@ index 484aea215a25..b911706d2e95 100644
  
  void intel_ddi_update_pipe(struct intel_atomic_state *state,
 diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux.c b/drivers/gpu/drm/i915/display/intel_dp_aux.c
-index 4431b6290c4c..2e2af71bcd5a 100644
+index 4431b6290c4c..4f4a0e3b3114 100644
 --- a/drivers/gpu/drm/i915/display/intel_dp_aux.c
 +++ b/drivers/gpu/drm/i915/display/intel_dp_aux.c
-@@ -74,7 +74,7 @@ intel_dp_aux_wait_done(struct intel_dp *intel_dp)
+@@ -9,6 +9,7 @@
+ #include "intel_bios.h"
+ #include "intel_de.h"
+ #include "intel_display_types.h"
++#include "intel_dp.h"
+ #include "intel_dp_aux.h"
+ #include "intel_dp_aux_regs.h"
+ #include "intel_pps.h"
+@@ -74,7 +75,7 @@ intel_dp_aux_wait_done(struct intel_dp *intel_dp)
  
  static u32 g4x_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
  {
@@ -51313,7 +51927,7 @@ index 4431b6290c4c..2e2af71bcd5a 100644
  
  	if (index)
  		return 0;
-@@ -83,12 +83,12 @@ static u32 g4x_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
+@@ -83,12 +84,12 @@ static u32 g4x_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
  	 * The clock divider is based off the hrawclk, and would like to run at
  	 * 2MHz.  So, take the hrawclk value and divide by 2000 and use that
  	 */
@@ -51328,7 +51942,7 @@ index 4431b6290c4c..2e2af71bcd5a 100644
  	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
  	u32 freq;
  
-@@ -101,18 +101,18 @@ static u32 ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
+@@ -101,18 +102,18 @@ static u32 ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
  	 * divide by 2000 and use that
  	 */
  	if (dig_port->aux_ch == AUX_CH_A)
@@ -51351,7 +51965,7 @@ index 4431b6290c4c..2e2af71bcd5a 100644
  		/* Workaround for non-ULT HSW */
  		switch (index) {
  		case 0: return 63;
-@@ -165,12 +165,11 @@ static u32 g4x_get_aux_send_ctl(struct intel_dp *intel_dp,
+@@ -165,12 +166,11 @@ static u32 g4x_get_aux_send_ctl(struct intel_dp *intel_dp,
  				u32 aux_clock_divider)
  {
  	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
@@ -51366,17 +51980,59 @@ index 4431b6290c4c..2e2af71bcd5a 100644
  		timeout = DP_AUX_CH_CTL_TIME_OUT_600us;
  	else
  		timeout = DP_AUX_CH_CTL_TIME_OUT_400us;
-@@ -229,8 +228,7 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp,
+@@ -229,10 +229,8 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp,
  		  u32 aux_send_ctl_flags)
  {
  	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 -	struct drm_i915_private *i915 =
 -			to_i915(dig_port->base.base.dev);
+-	enum phy phy = intel_port_to_phy(i915, dig_port->base.port);
+-	bool is_tc_port = intel_phy_is_tc(i915, phy);
++	struct intel_encoder *encoder = &dig_port->base;
 +	struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
- 	enum phy phy = intel_port_to_phy(i915, dig_port->base.port);
- 	bool is_tc_port = intel_phy_is_tc(i915, phy);
  	i915_reg_t ch_ctl, ch_data[5];
-@@ -531,9 +529,40 @@ intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
+ 	u32 aux_clock_divider;
+ 	enum intel_display_power_domain aux_domain;
+@@ -247,18 +245,16 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp,
+ 	for (i = 0; i < ARRAY_SIZE(ch_data); i++)
+ 		ch_data[i] = intel_dp->aux_ch_data_reg(intel_dp, i);
+ 
+-	if (is_tc_port) {
+-		intel_tc_port_lock(dig_port);
+-		/*
+-		 * Abort transfers on a disconnected port as required by
+-		 * DP 1.4a link CTS 4.2.1.5, also avoiding the long AUX
+-		 * timeouts that would otherwise happen.
+-		 * TODO: abort the transfer on non-TC ports as well.
+-		 */
+-		if (!intel_tc_port_connected_locked(&dig_port->base)) {
+-			ret = -ENXIO;
+-			goto out_unlock;
+-		}
++	intel_digital_port_lock(encoder);
++	/*
++	 * Abort transfers on a disconnected port as required by
++	 * DP 1.4a link CTS 4.2.1.5, also avoiding the long AUX
++	 * timeouts that would otherwise happen.
++	 */
++	if (!intel_dp_is_edp(intel_dp) &&
++	    !intel_digital_port_connected_locked(&dig_port->base)) {
++		ret = -ENXIO;
++		goto out_unlock;
+ 	}
+ 
+ 	aux_domain = intel_aux_power_domain(dig_port);
+@@ -425,8 +421,7 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp,
+ 	intel_pps_unlock(intel_dp, pps_wakeref);
+ 	intel_display_power_put_async(i915, aux_domain, aux_wakeref);
+ out_unlock:
+-	if (is_tc_port)
+-		intel_tc_port_unlock(dig_port);
++	intel_digital_port_unlock(encoder);
+ 
+ 	return ret;
+ }
+@@ -531,9 +526,40 @@ intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
  	return ret;
  }
  
@@ -51418,7 +52074,7 @@ index 4431b6290c4c..2e2af71bcd5a 100644
  	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
  	enum aux_ch aux_ch = dig_port->aux_ch;
  
-@@ -550,7 +579,6 @@ static i915_reg_t g4x_aux_ctl_reg(struct intel_dp *intel_dp)
+@@ -550,7 +576,6 @@ static i915_reg_t g4x_aux_ctl_reg(struct intel_dp *intel_dp)
  
  static i915_reg_t g4x_aux_data_reg(struct intel_dp *intel_dp, int index)
  {
@@ -51426,7 +52082,7 @@ index 4431b6290c4c..2e2af71bcd5a 100644
  	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
  	enum aux_ch aux_ch = dig_port->aux_ch;
  
-@@ -567,7 +595,6 @@ static i915_reg_t g4x_aux_data_reg(struct intel_dp *intel_dp, int index)
+@@ -567,7 +592,6 @@ static i915_reg_t g4x_aux_data_reg(struct intel_dp *intel_dp, int index)
  
  static i915_reg_t ilk_aux_ctl_reg(struct intel_dp *intel_dp)
  {
@@ -51434,7 +52090,7 @@ index 4431b6290c4c..2e2af71bcd5a 100644
  	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
  	enum aux_ch aux_ch = dig_port->aux_ch;
  
-@@ -586,7 +613,6 @@ static i915_reg_t ilk_aux_ctl_reg(struct intel_dp *intel_dp)
+@@ -586,7 +610,6 @@ static i915_reg_t ilk_aux_ctl_reg(struct intel_dp *intel_dp)
  
  static i915_reg_t ilk_aux_data_reg(struct intel_dp *intel_dp, int index)
  {
@@ -51442,7 +52098,7 @@ index 4431b6290c4c..2e2af71bcd5a 100644
  	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
  	enum aux_ch aux_ch = dig_port->aux_ch;
  
-@@ -605,7 +631,6 @@ static i915_reg_t ilk_aux_data_reg(struct intel_dp *intel_dp, int index)
+@@ -605,7 +628,6 @@ static i915_reg_t ilk_aux_data_reg(struct intel_dp *intel_dp, int index)
  
  static i915_reg_t skl_aux_ctl_reg(struct intel_dp *intel_dp)
  {
@@ -51450,7 +52106,7 @@ index 4431b6290c4c..2e2af71bcd5a 100644
  	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
  	enum aux_ch aux_ch = dig_port->aux_ch;
  
-@@ -625,7 +650,6 @@ static i915_reg_t skl_aux_ctl_reg(struct intel_dp *intel_dp)
+@@ -625,7 +647,6 @@ static i915_reg_t skl_aux_ctl_reg(struct intel_dp *intel_dp)
  
  static i915_reg_t skl_aux_data_reg(struct intel_dp *intel_dp, int index)
  {
@@ -51458,7 +52114,7 @@ index 4431b6290c4c..2e2af71bcd5a 100644
  	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
  	enum aux_ch aux_ch = dig_port->aux_ch;
  
-@@ -645,7 +669,6 @@ static i915_reg_t skl_aux_data_reg(struct intel_dp *intel_dp, int index)
+@@ -645,7 +666,6 @@ static i915_reg_t skl_aux_data_reg(struct intel_dp *intel_dp, int index)
  
  static i915_reg_t tgl_aux_ctl_reg(struct intel_dp *intel_dp)
  {
@@ -51466,7 +52122,7 @@ index 4431b6290c4c..2e2af71bcd5a 100644
  	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
  	enum aux_ch aux_ch = dig_port->aux_ch;
  
-@@ -668,7 +691,6 @@ static i915_reg_t tgl_aux_ctl_reg(struct intel_dp *intel_dp)
+@@ -668,7 +688,6 @@ static i915_reg_t tgl_aux_ctl_reg(struct intel_dp *intel_dp)
  
  static i915_reg_t tgl_aux_data_reg(struct intel_dp *intel_dp, int index)
  {
@@ -51474,7 +52130,7 @@ index 4431b6290c4c..2e2af71bcd5a 100644
  	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
  	enum aux_ch aux_ch = dig_port->aux_ch;
  
-@@ -691,7 +713,7 @@ static i915_reg_t tgl_aux_data_reg(struct intel_dp *intel_dp, int index)
+@@ -691,7 +710,7 @@ static i915_reg_t tgl_aux_data_reg(struct intel_dp *intel_dp, int index)
  
  static i915_reg_t xelpdp_aux_ctl_reg(struct intel_dp *intel_dp)
  {
@@ -51483,7 +52139,7 @@ index 4431b6290c4c..2e2af71bcd5a 100644
  	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
  	enum aux_ch aux_ch = dig_port->aux_ch;
  
-@@ -702,16 +724,16 @@ static i915_reg_t xelpdp_aux_ctl_reg(struct intel_dp *intel_dp)
+@@ -702,16 +721,16 @@ static i915_reg_t xelpdp_aux_ctl_reg(struct intel_dp *intel_dp)
  	case AUX_CH_USBC2:
  	case AUX_CH_USBC3:
  	case AUX_CH_USBC4:
@@ -51503,7 +52159,7 @@ index 4431b6290c4c..2e2af71bcd5a 100644
  	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
  	enum aux_ch aux_ch = dig_port->aux_ch;
  
-@@ -722,10 +744,10 @@ static i915_reg_t xelpdp_aux_data_reg(struct intel_dp *intel_dp, int index)
+@@ -722,10 +741,10 @@ static i915_reg_t xelpdp_aux_data_reg(struct intel_dp *intel_dp, int index)
  	case AUX_CH_USBC2:
  	case AUX_CH_USBC3:
  	case AUX_CH_USBC4:
@@ -51516,7 +52172,7 @@ index 4431b6290c4c..2e2af71bcd5a 100644
  	}
  }
  
-@@ -739,49 +761,52 @@ void intel_dp_aux_fini(struct intel_dp *intel_dp)
+@@ -739,49 +758,52 @@ void intel_dp_aux_fini(struct intel_dp *intel_dp)
  
  void intel_dp_aux_init(struct intel_dp *intel_dp)
  {
@@ -51643,7 +52299,7 @@ index 34f6e0a48ed2..e642445364d2 100644
  		_MMIO(_PICK_EVEN_2RANGES(aux_ch, AUX_CH_USBC1,			\
  					 _DPA_AUX_CH_DATA1, _DPB_AUX_CH_DATA1,	\
 diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
-index aa1061262613..8a9432335030 100644
+index aa1061262613..5fa25a5a36b5 100644
 --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
 +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
 @@ -26,6 +26,7 @@
@@ -51654,7 +52310,15 @@ index aa1061262613..8a9432335030 100644
  #include <drm/drm_probe_helper.h>
  
  #include "i915_drv.h"
-@@ -43,6 +44,9 @@
+@@ -36,6 +37,7 @@
+ #include "intel_crtc.h"
+ #include "intel_ddi.h"
+ #include "intel_de.h"
++#include "intel_display_driver.h"
+ #include "intel_display_types.h"
+ #include "intel_dp.h"
+ #include "intel_dp_hdcp.h"
+@@ -43,6 +45,9 @@
  #include "intel_dpio_phy.h"
  #include "intel_hdcp.h"
  #include "intel_hotplug.h"
@@ -51664,7 +52328,7 @@ index aa1061262613..8a9432335030 100644
  #include "skl_scaler.h"
  
  static int intel_dp_mst_check_constraints(struct drm_i915_private *i915, int bpp,
-@@ -50,7 +54,7 @@ static int intel_dp_mst_check_constraints(struct drm_i915_private *i915, int bpp
+@@ -50,7 +55,7 @@ static int intel_dp_mst_check_constraints(struct drm_i915_private *i915, int bpp
  					  struct intel_crtc_state *crtc_state,
  					  bool dsc)
  {
@@ -51673,7 +52337,7 @@ index aa1061262613..8a9432335030 100644
  		int output_bpp = bpp;
  		/* DisplayPort 2 128b/132b, bits per lane is always 32 */
  		int symbol_clock = crtc_state->port_clock / 32;
-@@ -66,6 +70,73 @@ static int intel_dp_mst_check_constraints(struct drm_i915_private *i915, int bpp
+@@ -66,6 +71,73 @@ static int intel_dp_mst_check_constraints(struct drm_i915_private *i915, int bpp
  	return 0;
  }
  
@@ -51747,7 +52411,7 @@ index aa1061262613..8a9432335030 100644
  static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
  						struct intel_crtc_state *crtc_state,
  						int max_bpp,
-@@ -94,20 +165,67 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
+@@ -94,20 +166,67 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
  	crtc_state->lane_count = limits->max_lane_count;
  	crtc_state->port_clock = limits->max_rate;
  
@@ -51818,7 +52482,7 @@ index aa1061262613..8a9432335030 100644
  
  		slots = drm_dp_atomic_find_time_slots(state, &intel_dp->mst_mgr,
  						      connector->port,
-@@ -116,13 +234,9 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
+@@ -116,13 +235,9 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
  			return slots;
  
  		if (slots >= 0) {
@@ -51835,7 +52499,7 @@ index aa1061262613..8a9432335030 100644
  		}
  	}
  
-@@ -137,7 +251,7 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
+@@ -137,7 +252,7 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
  		if (!dsc)
  			crtc_state->pipe_bpp = bpp;
  		else
@@ -51844,7 +52508,7 @@ index aa1061262613..8a9432335030 100644
  		drm_dbg_kms(&i915->drm, "Got %d slots for pipe bpp %d dsc %d\n", slots, bpp, dsc);
  	}
  
-@@ -149,10 +263,7 @@ static int intel_dp_mst_compute_link_config(struct intel_encoder *encoder,
+@@ -149,10 +264,7 @@ static int intel_dp_mst_compute_link_config(struct intel_encoder *encoder,
  					    struct drm_connector_state *conn_state,
  					    struct link_config_limits *limits)
  {
@@ -51855,7 +52519,7 @@ index aa1061262613..8a9432335030 100644
  
  	/*
  	 * FIXME: allocate the BW according to link_bpp, which in the case of
-@@ -167,16 +278,6 @@ static int intel_dp_mst_compute_link_config(struct intel_encoder *encoder,
+@@ -167,16 +279,6 @@ static int intel_dp_mst_compute_link_config(struct intel_encoder *encoder,
  	if (slots < 0)
  		return slots;
  
@@ -51872,7 +52536,7 @@ index aa1061262613..8a9432335030 100644
  	return 0;
  }
  
-@@ -188,15 +289,12 @@ static int intel_dp_dsc_mst_compute_link_config(struct intel_encoder *encoder,
+@@ -188,15 +290,12 @@ static int intel_dp_dsc_mst_compute_link_config(struct intel_encoder *encoder,
  	struct intel_connector *connector =
  		to_intel_connector(conn_state->connector);
  	struct drm_i915_private *i915 = to_i915(connector->base.dev);
@@ -51889,7 +52553,7 @@ index aa1061262613..8a9432335030 100644
  
  	/* Max DSC Input BPC for ICL is 10 and for TGL+ is 12 */
  	if (DISPLAY_VER(i915) >= 12)
-@@ -232,45 +330,31 @@ static int intel_dp_dsc_mst_compute_link_config(struct intel_encoder *encoder,
+@@ -232,45 +331,31 @@ static int intel_dp_dsc_mst_compute_link_config(struct intel_encoder *encoder,
  	if (max_bpp > sink_max_bpp)
  		max_bpp = sink_max_bpp;
  
@@ -51955,7 +52619,7 @@ index aa1061262613..8a9432335030 100644
  
  	return 0;
  }
-@@ -297,8 +381,103 @@ static int intel_dp_mst_update_slots(struct intel_encoder *encoder,
+@@ -297,8 +382,103 @@ static int intel_dp_mst_update_slots(struct intel_encoder *encoder,
  	return 0;
  }
  
@@ -52059,7 +52723,7 @@ index aa1061262613..8a9432335030 100644
  				   struct intel_crtc_state *crtc_state,
  				   bool dsc,
  				   struct link_config_limits *limits)
-@@ -326,10 +505,16 @@ intel_dp_mst_compute_config_limits(struct intel_dp *intel_dp,
+@@ -326,10 +506,16 @@ intel_dp_mst_compute_config_limits(struct intel_dp *intel_dp,
  
  	intel_dp_adjust_compliance_config(intel_dp, crtc_state, limits);
  
@@ -52080,7 +52744,7 @@ index aa1061262613..8a9432335030 100644
  }
  
  static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
-@@ -339,12 +524,18 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
+@@ -339,12 +525,18 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
  	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
  	struct intel_dp *intel_dp = &intel_mst->primary->dp;
@@ -52099,7 +52763,7 @@ index aa1061262613..8a9432335030 100644
  	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
  		return -EINVAL;
  
-@@ -354,6 +545,7 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
+@@ -354,6 +546,7 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
  
  	dsc_needed = intel_dp->force_dsc_en ||
  		     !intel_dp_mst_compute_config_limits(intel_dp,
@@ -52107,7 +52771,7 @@ index aa1061262613..8a9432335030 100644
  							 pipe_config,
  							 false,
  							 &limits);
-@@ -375,7 +567,11 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
+@@ -375,7 +568,11 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
  			    str_yes_no(ret),
  			    str_yes_no(intel_dp->force_dsc_en));
  
@@ -52119,7 +52783,7 @@ index aa1061262613..8a9432335030 100644
  							pipe_config,
  							true,
  							&limits))
-@@ -418,7 +614,9 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
+@@ -418,7 +615,9 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
  
  	intel_dp_audio_compute_config(encoder, pipe_config, conn_state);
  
@@ -52130,7 +52794,7 @@ index aa1061262613..8a9432335030 100644
  
  	return 0;
  }
-@@ -459,6 +657,130 @@ intel_dp_mst_transcoder_mask(struct intel_atomic_state *state,
+@@ -459,6 +658,130 @@ intel_dp_mst_transcoder_mask(struct intel_atomic_state *state,
  	return transcoders;
  }
  
@@ -52261,7 +52925,7 @@ index aa1061262613..8a9432335030 100644
  static int intel_dp_mst_compute_config_late(struct intel_encoder *encoder,
  					    struct intel_crtc_state *crtc_state,
  					    struct drm_connector_state *conn_state)
-@@ -479,19 +801,23 @@ static int intel_dp_mst_compute_config_late(struct intel_encoder *encoder,
+@@ -479,19 +802,23 @@ static int intel_dp_mst_compute_config_late(struct intel_encoder *encoder,
   * that shares the same MST stream as mode changed,
   * intel_modeset_pipe_config()+intel_crtc_check_fastset() will take care to do
   * a fastset when possible.
@@ -52290,7 +52954,7 @@ index aa1061262613..8a9432335030 100644
  	if (!intel_connector_needs_modeset(state, &connector->base))
  		return 0;
  
-@@ -545,7 +871,7 @@ intel_dp_mst_atomic_check(struct drm_connector *connector,
+@@ -545,7 +872,7 @@ intel_dp_mst_atomic_check(struct drm_connector *connector,
  	if (ret)
  		return ret;
  
@@ -52299,7 +52963,7 @@ index aa1061262613..8a9432335030 100644
  	if (ret)
  		return ret;
  
-@@ -587,10 +913,6 @@ static void intel_mst_disable_dp(struct intel_atomic_state *state,
+@@ -587,10 +914,6 @@ static void intel_mst_disable_dp(struct intel_atomic_state *state,
  	struct intel_dp *intel_dp = &dig_port->dp;
  	struct intel_connector *connector =
  		to_intel_connector(old_conn_state->connector);
@@ -52310,7 +52974,7 @@ index aa1061262613..8a9432335030 100644
  	struct drm_i915_private *i915 = to_i915(connector->base.dev);
  
  	drm_dbg_kms(&i915->drm, "active links %d\n",
-@@ -598,9 +920,7 @@ static void intel_mst_disable_dp(struct intel_atomic_state *state,
+@@ -598,9 +921,7 @@ static void intel_mst_disable_dp(struct intel_atomic_state *state,
  
  	intel_hdcp_disable(intel_mst->connector);
  
@@ -52321,7 +52985,7 @@ index aa1061262613..8a9432335030 100644
  }
  
  static void intel_mst_post_disable_dp(struct intel_atomic_state *state,
-@@ -634,6 +954,8 @@ static void intel_mst_post_disable_dp(struct intel_atomic_state *state,
+@@ -634,6 +955,8 @@ static void intel_mst_post_disable_dp(struct intel_atomic_state *state,
  
  	intel_disable_transcoder(old_crtc_state);
  
@@ -52330,7 +52994,7 @@ index aa1061262613..8a9432335030 100644
  	clear_act_sent(encoder, old_crtc_state);
  
  	intel_de_rmw(dev_priv, TRANS_DDI_FUNC_CTL(old_crtc_state->cpu_transcoder),
-@@ -646,6 +968,8 @@ static void intel_mst_post_disable_dp(struct intel_atomic_state *state,
+@@ -646,6 +969,8 @@ static void intel_mst_post_disable_dp(struct intel_atomic_state *state,
  
  	intel_ddi_disable_transcoder_func(old_crtc_state);
  
@@ -52339,7 +53003,7 @@ index aa1061262613..8a9432335030 100644
  	if (DISPLAY_VER(dev_priv) >= 9)
  		skl_scaler_disable(old_crtc_state);
  	else
-@@ -662,9 +986,8 @@ static void intel_mst_post_disable_dp(struct intel_atomic_state *state,
+@@ -662,9 +987,8 @@ static void intel_mst_post_disable_dp(struct intel_atomic_state *state,
  	 * BSpec 4287: disable DIP after the transcoder is disabled and before
  	 * the transcoder clock select is set to none.
  	 */
@@ -52351,7 +53015,7 @@ index aa1061262613..8a9432335030 100644
  	/*
  	 * From TGL spec: "If multi-stream slave transcoder: Configure
  	 * Transcoder Clock Select to direct no clock to the transcoder"
-@@ -754,6 +1077,8 @@ static void intel_mst_pre_enable_dp(struct intel_atomic_state *state,
+@@ -754,6 +1078,8 @@ static void intel_mst_pre_enable_dp(struct intel_atomic_state *state,
  
  	drm_dp_send_power_updown_phy(&intel_dp->mst_mgr, connector->port, true);
  
@@ -52360,7 +53024,7 @@ index aa1061262613..8a9432335030 100644
  	if (first_mst_stream)
  		dig_port->base.pre_enable(state, &dig_port->base,
  						pipe_config, NULL);
-@@ -776,6 +1101,7 @@ static void intel_mst_pre_enable_dp(struct intel_atomic_state *state,
+@@ -776,6 +1102,7 @@ static void intel_mst_pre_enable_dp(struct intel_atomic_state *state,
  	if (DISPLAY_VER(dev_priv) < 12 || !first_mst_stream)
  		intel_ddi_enable_transcoder_clock(encoder, pipe_config);
  
@@ -52368,7 +53032,7 @@ index aa1061262613..8a9432335030 100644
  	intel_ddi_set_dp_msa(pipe_config, conn_state);
  }
  
-@@ -792,11 +1118,10 @@ static void intel_mst_enable_dp(struct intel_atomic_state *state,
+@@ -792,11 +1119,10 @@ static void intel_mst_enable_dp(struct intel_atomic_state *state,
  	struct drm_dp_mst_topology_state *mst_state =
  		drm_atomic_get_new_mst_topology_state(&state->base, &intel_dp->mst_mgr);
  	enum transcoder trans = pipe_config->cpu_transcoder;
@@ -52381,7 +53045,7 @@ index aa1061262613..8a9432335030 100644
  	if (intel_dp_is_uhbr(pipe_config)) {
  		const struct drm_display_mode *adjusted_mode =
  			&pipe_config->hw.adjusted_mode;
-@@ -810,6 +1135,8 @@ static void intel_mst_enable_dp(struct intel_atomic_state *state,
+@@ -810,6 +1136,8 @@ static void intel_mst_enable_dp(struct intel_atomic_state *state,
  
  	intel_ddi_enable_transcoder_func(encoder, pipe_config);
  
@@ -52390,7 +53054,7 @@ index aa1061262613..8a9432335030 100644
  	intel_de_rmw(dev_priv, TRANS_DDI_FUNC_CTL(trans), 0,
  		     TRANS_DDI_DP_VC_PAYLOAD_ALLOC);
  
-@@ -818,15 +1145,16 @@ static void intel_mst_enable_dp(struct intel_atomic_state *state,
+@@ -818,15 +1146,16 @@ static void intel_mst_enable_dp(struct intel_atomic_state *state,
  
  	wait_for_act_sent(encoder, pipe_config);
  
@@ -52413,7 +53077,7 @@ index aa1061262613..8a9432335030 100644
  
  	intel_audio_sdp_split_update(pipe_config);
  
-@@ -834,12 +1162,7 @@ static void intel_mst_enable_dp(struct intel_atomic_state *state,
+@@ -834,12 +1163,7 @@ static void intel_mst_enable_dp(struct intel_atomic_state *state,
  
  	intel_crtc_vblank_on(pipe_config);
  
@@ -52427,7 +53091,7 @@ index aa1061262613..8a9432335030 100644
  }
  
  static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder,
-@@ -978,8 +1301,20 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
+@@ -978,8 +1302,20 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
  	if (ret)
  		return ret;
  
@@ -52449,7 +53113,17 @@ index aa1061262613..8a9432335030 100644
  		*status = MODE_CLOCK_HIGH;
  		return 0;
  	}
-@@ -1151,6 +1486,36 @@ intel_dp_mst_read_decompression_port_dsc_caps(struct intel_dp *intel_dp,
+@@ -1075,6 +1411,9 @@ intel_dp_mst_detect(struct drm_connector *connector,
+ 	if (drm_connector_is_unregistered(connector))
+ 		return connector_status_disconnected;
+ 
++	if (!intel_display_driver_check_access(i915))
++		return connector->status;
++
+ 	return drm_dp_mst_detect_port(connector, ctx, &intel_dp->mst_mgr,
+ 				      intel_connector->port);
+ }
+@@ -1151,6 +1490,36 @@ intel_dp_mst_read_decompression_port_dsc_caps(struct intel_dp *intel_dp,
  	intel_dp_get_dsc_sink_cap(dpcd_caps[DP_DPCD_REV], connector);
  }
  
@@ -52486,7 +53160,7 @@ index aa1061262613..8a9432335030 100644
  static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
  							struct drm_dp_mst_port *port,
  							const char *pathprop)
-@@ -1173,13 +1538,10 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo
+@@ -1173,13 +1542,10 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo
  	intel_connector->port = port;
  	drm_dp_mst_get_port_malloc(port);
  
@@ -52503,7 +53177,7 @@ index aa1061262613..8a9432335030 100644
  
  	connector = &intel_connector->base;
  	ret = drm_connector_init(dev, connector, &intel_dp_mst_connector_funcs,
-@@ -1272,6 +1634,8 @@ intel_dp_create_fake_mst_encoder(struct intel_digital_port *dig_port, enum pipe
+@@ -1272,6 +1638,8 @@ intel_dp_create_fake_mst_encoder(struct intel_digital_port *dig_port, enum pipe
  	intel_encoder->pre_pll_enable = intel_mst_pre_pll_enable_dp;
  	intel_encoder->pre_enable = intel_mst_pre_enable_dp;
  	intel_encoder->enable = intel_mst_enable_dp;
@@ -52512,7 +53186,7 @@ index aa1061262613..8a9432335030 100644
  	intel_encoder->get_hw_state = intel_dp_mst_enc_get_hw_state;
  	intel_encoder->get_config = intel_dp_mst_enc_get_config;
  	intel_encoder->initial_fastset_check = intel_dp_mst_initial_fastset_check;
-@@ -1419,3 +1783,91 @@ int intel_dp_mst_add_topology_state_for_crtc(struct intel_atomic_state *state,
+@@ -1419,3 +1787,91 @@ int intel_dp_mst_add_topology_state_for_crtc(struct intel_atomic_state *state,
  
  	return 0;
  }
@@ -55003,6 +55677,36 @@ index 468d873fab1a..3462fcc760e6 100644
  void intel_dsi_vbt_exec_sequence(struct intel_dsi *intel_dsi,
  				 enum mipi_seq seq_id);
  void intel_dsi_log_params(struct intel_dsi *intel_dsi);
+diff --git a/drivers/gpu/drm/i915/display/intel_dvo.c b/drivers/gpu/drm/i915/display/intel_dvo.c
+index 9111e9d46486..8ca9ae4798a8 100644
+--- a/drivers/gpu/drm/i915/display/intel_dvo.c
++++ b/drivers/gpu/drm/i915/display/intel_dvo.c
+@@ -35,6 +35,7 @@
+ #include "i915_reg.h"
+ #include "intel_connector.h"
+ #include "intel_de.h"
++#include "intel_display_driver.h"
+ #include "intel_display_types.h"
+ #include "intel_dvo.h"
+ #include "intel_dvo_dev.h"
+@@ -328,6 +329,9 @@ intel_dvo_detect(struct drm_connector *_connector, bool force)
+ 	if (!intel_display_device_enabled(i915))
+ 		return connector_status_disconnected;
+ 
++	if (!intel_display_driver_check_access(i915))
++		return connector->base.status;
++
+ 	return intel_dvo->dev.dev_ops->detect(&intel_dvo->dev);
+ }
+ 
+@@ -536,6 +540,7 @@ void intel_dvo_init(struct drm_i915_private *i915)
+ 	if (intel_dvo->dev.type == INTEL_DVO_CHIP_TMDS)
+ 		connector->polled = DRM_CONNECTOR_POLL_CONNECT |
+ 			DRM_CONNECTOR_POLL_DISCONNECT;
++	connector->base.polled = connector->polled;
+ 
+ 	drm_connector_init_with_ddc(&i915->drm, &connector->base,
+ 				    &intel_dvo_connector_funcs,
 diff --git a/drivers/gpu/drm/i915/display/intel_fb.c b/drivers/gpu/drm/i915/display/intel_fb.c
 index 646f367a13f5..0c0144eaa8fa 100644
 --- a/drivers/gpu/drm/i915/display/intel_fb.c
@@ -56460,10 +57164,18 @@ index 8023c85c7fa0..a568a457e532 100644
  					 PORT_HDCP2_AUTH_STREAM(port))
  
 diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
-index bfa456fa7d25..eedef8121ff7 100644
+index bfa456fa7d25..7020e5806109 100644
 --- a/drivers/gpu/drm/i915/display/intel_hdmi.c
 +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
-@@ -523,10 +523,12 @@ void hsw_write_infoframe(struct intel_encoder *encoder,
+@@ -49,6 +49,7 @@
+ #include "intel_cx0_phy.h"
+ #include "intel_ddi.h"
+ #include "intel_de.h"
++#include "intel_display_driver.h"
+ #include "intel_display_types.h"
+ #include "intel_dp.h"
+ #include "intel_gmbus.h"
+@@ -523,10 +524,12 @@ void hsw_write_infoframe(struct intel_encoder *encoder,
  			       0);
  
  	/* Wa_14013475917 */
@@ -56479,7 +57191,35 @@ index bfa456fa7d25..eedef8121ff7 100644
  	intel_de_write(dev_priv, ctl_reg, val);
  	intel_de_posting_read(dev_priv, ctl_reg);
  }
-@@ -3034,16 +3036,6 @@ void intel_hdmi_init_connector(struct intel_digital_port *dig_port,
+@@ -2503,6 +2506,9 @@ intel_hdmi_detect(struct drm_connector *connector, bool force)
+ 	if (!intel_display_device_enabled(dev_priv))
+ 		return connector_status_disconnected;
+ 
++	if (!intel_display_driver_check_access(dev_priv))
++		return connector->status;
++
+ 	wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
+ 
+ 	if (DISPLAY_VER(dev_priv) >= 11 &&
+@@ -2531,6 +2537,9 @@ intel_hdmi_force(struct drm_connector *connector)
+ 	drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s]\n",
+ 		    connector->base.id, connector->name);
+ 
++	if (!intel_display_driver_check_access(i915))
++		return;
++
+ 	intel_hdmi_unset_edid(connector);
+ 
+ 	if (connector->status != connector_status_connected)
+@@ -3015,6 +3024,7 @@ void intel_hdmi_init_connector(struct intel_digital_port *dig_port,
+ 		connector->ycbcr_420_allowed = true;
+ 
+ 	intel_connector->polled = DRM_CONNECTOR_POLL_HPD;
++	intel_connector->base.polled = intel_connector->polled;
+ 
+ 	if (HAS_DDI(dev_priv))
+ 		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
+@@ -3034,16 +3044,6 @@ void intel_hdmi_init_connector(struct intel_digital_port *dig_port,
  				    "HDCP init failed, skipping.\n");
  	}
  
@@ -56496,6 +57236,288 @@ index bfa456fa7d25..eedef8121ff7 100644
  	cec_fill_conn_info_from_drm(&conn_info, connector);
  
  	intel_hdmi->cec_notifier =
+diff --git a/drivers/gpu/drm/i915/display/intel_hotplug.c b/drivers/gpu/drm/i915/display/intel_hotplug.c
+index 0c0700c6ec66..d9ec349f3c8c 100644
+--- a/drivers/gpu/drm/i915/display/intel_hotplug.c
++++ b/drivers/gpu/drm/i915/display/intel_hotplug.c
+@@ -177,6 +177,46 @@ static bool intel_hpd_irq_storm_detect(struct drm_i915_private *dev_priv,
+ 	return storm;
+ }
+ 
++static bool detection_work_enabled(struct drm_i915_private *i915)
++{
++	lockdep_assert_held(&i915->irq_lock);
++
++	return i915->display.hotplug.detection_work_enabled;
++}
++
++static bool
++mod_delayed_detection_work(struct drm_i915_private *i915, struct delayed_work *work, int delay)
++{
++	lockdep_assert_held(&i915->irq_lock);
++
++	if (!detection_work_enabled(i915))
++		return false;
++
++	return mod_delayed_work(i915->unordered_wq, work, delay);
++}
++
++static bool
++queue_delayed_detection_work(struct drm_i915_private *i915, struct delayed_work *work, int delay)
++{
++	lockdep_assert_held(&i915->irq_lock);
++
++	if (!detection_work_enabled(i915))
++		return false;
++
++	return queue_delayed_work(i915->unordered_wq, work, delay);
++}
++
++static bool
++queue_detection_work(struct drm_i915_private *i915, struct work_struct *work)
++{
++	lockdep_assert_held(&i915->irq_lock);
++
++	if (!detection_work_enabled(i915))
++		return false;
++
++	return queue_work(i915->unordered_wq, work);
++}
++
+ static void
+ intel_hpd_irq_storm_switch_to_polling(struct drm_i915_private *dev_priv)
+ {
+@@ -213,9 +253,9 @@ intel_hpd_irq_storm_switch_to_polling(struct drm_i915_private *dev_priv)
+ 	/* Enable polling and queue hotplug re-enabling. */
+ 	if (hpd_disabled) {
+ 		drm_kms_helper_poll_reschedule(&dev_priv->drm);
+-		mod_delayed_work(dev_priv->unordered_wq,
+-				 &dev_priv->display.hotplug.reenable_work,
+-				 msecs_to_jiffies(HPD_STORM_REENABLE_DELAY));
++		mod_delayed_detection_work(dev_priv,
++					   &dev_priv->display.hotplug.reenable_work,
++					   msecs_to_jiffies(HPD_STORM_REENABLE_DELAY));
+ 	}
+ }
+ 
+@@ -348,9 +388,9 @@ static void i915_digport_work_func(struct work_struct *work)
+ 	if (old_bits) {
+ 		spin_lock_irq(&dev_priv->irq_lock);
+ 		dev_priv->display.hotplug.event_bits |= old_bits;
++		queue_delayed_detection_work(dev_priv,
++					     &dev_priv->display.hotplug.hotplug_work, 0);
+ 		spin_unlock_irq(&dev_priv->irq_lock);
+-		queue_delayed_work(dev_priv->unordered_wq,
+-				   &dev_priv->display.hotplug.hotplug_work, 0);
+ 	}
+ }
+ 
+@@ -467,11 +507,11 @@ static void i915_hotplug_work_func(struct work_struct *work)
+ 	if (retry) {
+ 		spin_lock_irq(&dev_priv->irq_lock);
+ 		dev_priv->display.hotplug.retry_bits |= retry;
+-		spin_unlock_irq(&dev_priv->irq_lock);
+ 
+-		mod_delayed_work(dev_priv->unordered_wq,
+-				 &dev_priv->display.hotplug.hotplug_work,
+-				 msecs_to_jiffies(HPD_RETRY_DELAY));
++		mod_delayed_detection_work(dev_priv,
++					   &dev_priv->display.hotplug.hotplug_work,
++					   msecs_to_jiffies(HPD_RETRY_DELAY));
++		spin_unlock_irq(&dev_priv->irq_lock);
+ 	}
+ }
+ 
+@@ -590,7 +630,6 @@ void intel_hpd_irq_handler(struct drm_i915_private *dev_priv,
+ 	 */
+ 	if (storm_detected)
+ 		intel_hpd_irq_setup(dev_priv);
+-	spin_unlock(&dev_priv->irq_lock);
+ 
+ 	/*
+ 	 * Our hotplug handler can grab modeset locks (by calling down into the
+@@ -601,8 +640,10 @@ void intel_hpd_irq_handler(struct drm_i915_private *dev_priv,
+ 	if (queue_dig)
+ 		queue_work(dev_priv->display.hotplug.dp_wq, &dev_priv->display.hotplug.dig_port_work);
+ 	if (queue_hp)
+-		queue_delayed_work(dev_priv->unordered_wq,
+-				   &dev_priv->display.hotplug.hotplug_work, 0);
++		queue_delayed_detection_work(dev_priv,
++					     &dev_priv->display.hotplug.hotplug_work, 0);
++
++	spin_unlock(&dev_priv->irq_lock);
+ }
+ 
+ /**
+@@ -710,6 +751,8 @@ static void i915_hpd_poll_init_work(struct work_struct *work)
+ 		cancel_work(&dev_priv->display.hotplug.poll_init_work);
+ 	}
+ 
++	spin_lock_irq(&dev_priv->irq_lock);
++
+ 	drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter);
+ 	for_each_intel_connector_iter(connector, &conn_iter) {
+ 		enum hpd_pin pin;
+@@ -718,6 +761,9 @@ static void i915_hpd_poll_init_work(struct work_struct *work)
+ 		if (pin == HPD_NONE)
+ 			continue;
+ 
++		if (dev_priv->display.hotplug.stats[pin].state == HPD_DISABLED)
++			continue;
++
+ 		connector->base.polled = connector->polled;
+ 
+ 		if (enabled && connector->base.polled == DRM_CONNECTOR_POLL_HPD)
+@@ -726,6 +772,8 @@ static void i915_hpd_poll_init_work(struct work_struct *work)
+ 	}
+ 	drm_connector_list_iter_end(&conn_iter);
+ 
++	spin_unlock_irq(&dev_priv->irq_lock);
++
+ 	if (enabled)
+ 		drm_kms_helper_poll_reschedule(&dev_priv->drm);
+ 
+@@ -774,8 +822,10 @@ void intel_hpd_poll_enable(struct drm_i915_private *dev_priv)
+ 	 * As well, there's no issue if we race here since we always reschedule
+ 	 * this worker anyway
+ 	 */
+-	queue_work(dev_priv->unordered_wq,
+-		   &dev_priv->display.hotplug.poll_init_work);
++	spin_lock_irq(&dev_priv->irq_lock);
++	queue_detection_work(dev_priv,
++			     &dev_priv->display.hotplug.poll_init_work);
++	spin_unlock_irq(&dev_priv->irq_lock);
+ }
+ 
+ /**
+@@ -803,8 +853,11 @@ void intel_hpd_poll_disable(struct drm_i915_private *dev_priv)
+ 		return;
+ 
+ 	WRITE_ONCE(dev_priv->display.hotplug.poll_enabled, false);
+-	queue_work(dev_priv->unordered_wq,
+-		   &dev_priv->display.hotplug.poll_init_work);
++
++	spin_lock_irq(&dev_priv->irq_lock);
++	queue_detection_work(dev_priv,
++			     &dev_priv->display.hotplug.poll_init_work);
++	spin_unlock_irq(&dev_priv->irq_lock);
+ }
+ 
+ void intel_hpd_init_early(struct drm_i915_private *i915)
+@@ -826,6 +879,20 @@ void intel_hpd_init_early(struct drm_i915_private *i915)
+ 	i915->display.hotplug.hpd_short_storm_enabled = !HAS_DP_MST(i915);
+ }
+ 
++static bool cancel_all_detection_work(struct drm_i915_private *i915)
++{
++	bool was_pending = false;
++
++	if (cancel_delayed_work_sync(&i915->display.hotplug.hotplug_work))
++		was_pending = true;
++	if (cancel_work_sync(&i915->display.hotplug.poll_init_work))
++		was_pending = true;
++	if (cancel_delayed_work_sync(&i915->display.hotplug.reenable_work))
++		was_pending = true;
++
++	return was_pending;
++}
++
+ void intel_hpd_cancel_work(struct drm_i915_private *dev_priv)
+ {
+ 	if (!HAS_DISPLAY(dev_priv))
+@@ -841,9 +908,13 @@ void intel_hpd_cancel_work(struct drm_i915_private *dev_priv)
+ 	spin_unlock_irq(&dev_priv->irq_lock);
+ 
+ 	cancel_work_sync(&dev_priv->display.hotplug.dig_port_work);
+-	cancel_delayed_work_sync(&dev_priv->display.hotplug.hotplug_work);
+-	cancel_work_sync(&dev_priv->display.hotplug.poll_init_work);
+-	cancel_delayed_work_sync(&dev_priv->display.hotplug.reenable_work);
++
++	/*
++	 * All other work triggered by hotplug events should be canceled by
++	 * now.
++	 */
++	if (cancel_all_detection_work(dev_priv))
++		drm_dbg_kms(&dev_priv->drm, "Hotplug detection work still active\n");
+ }
+ 
+ bool intel_hpd_disable(struct drm_i915_private *dev_priv, enum hpd_pin pin)
+@@ -873,6 +944,62 @@ void intel_hpd_enable(struct drm_i915_private *dev_priv, enum hpd_pin pin)
+ 	spin_unlock_irq(&dev_priv->irq_lock);
+ }
+ 
++static void queue_work_for_missed_irqs(struct drm_i915_private *i915)
++{
++	bool queue_work = false;
++	enum hpd_pin pin;
++
++	lockdep_assert_held(&i915->irq_lock);
++
++	if (i915->display.hotplug.event_bits ||
++	    i915->display.hotplug.retry_bits)
++		queue_work = true;
++
++	for_each_hpd_pin(pin) {
++		switch (i915->display.hotplug.stats[pin].state) {
++		case HPD_MARK_DISABLED:
++			queue_work = true;
++			break;
++		case HPD_ENABLED:
++			break;
++		default:
++			MISSING_CASE(i915->display.hotplug.stats[pin].state);
++		}
++	}
++
++	if (queue_work)
++		queue_delayed_detection_work(i915, &i915->display.hotplug.hotplug_work, 0);
++}
++
++void intel_hpd_enable_detection_work(struct drm_i915_private *i915)
++{
++	spin_lock_irq(&i915->irq_lock);
++	i915->display.hotplug.detection_work_enabled = true;
++	queue_work_for_missed_irqs(i915);
++	spin_unlock_irq(&i915->irq_lock);
++}
++
++void intel_hpd_disable_detection_work(struct drm_i915_private *i915)
++{
++	spin_lock_irq(&i915->irq_lock);
++	i915->display.hotplug.detection_work_enabled = false;
++	spin_unlock_irq(&i915->irq_lock);
++
++	cancel_all_detection_work(i915);
++}
++
++bool intel_hpd_schedule_detection(struct drm_i915_private *i915)
++{
++	unsigned long flags;
++	bool ret;
++
++	spin_lock_irqsave(&i915->irq_lock, flags);
++	ret = queue_delayed_detection_work(i915, &i915->display.hotplug.hotplug_work, 0);
++	spin_unlock_irqrestore(&i915->irq_lock, flags);
++
++	return ret;
++}
++
+ static int i915_hpd_storm_ctl_show(struct seq_file *m, void *data)
+ {
+ 	struct drm_i915_private *dev_priv = m->private;
+diff --git a/drivers/gpu/drm/i915/display/intel_hotplug.h b/drivers/gpu/drm/i915/display/intel_hotplug.h
+index 424ae5dbf5a0..a17253ddec83 100644
+--- a/drivers/gpu/drm/i915/display/intel_hotplug.h
++++ b/drivers/gpu/drm/i915/display/intel_hotplug.h
+@@ -30,4 +30,8 @@ bool intel_hpd_disable(struct drm_i915_private *dev_priv, enum hpd_pin pin);
+ void intel_hpd_enable(struct drm_i915_private *dev_priv, enum hpd_pin pin);
+ void intel_hpd_debugfs_register(struct drm_i915_private *i915);
+ 
++void intel_hpd_enable_detection_work(struct drm_i915_private *i915);
++void intel_hpd_disable_detection_work(struct drm_i915_private *i915);
++bool intel_hpd_schedule_detection(struct drm_i915_private *i915);
++
+ #endif /* __INTEL_HOTPLUG_H__ */
 diff --git a/drivers/gpu/drm/i915/display/intel_hotplug_irq.c b/drivers/gpu/drm/i915/display/intel_hotplug_irq.c
 index f07047e9cb30..76076509f771 100644
 --- a/drivers/gpu/drm/i915/display/intel_hotplug_irq.c
@@ -56739,10 +57761,18 @@ index 84078fb82b2f..1ce785db6a5e 100644
  
  	if (!name || !*name)
 diff --git a/drivers/gpu/drm/i915/display/intel_panel.c b/drivers/gpu/drm/i915/display/intel_panel.c
-index 483beedac5b8..0d8e5320a4f8 100644
+index 483beedac5b8..073ea3166c36 100644
 --- a/drivers/gpu/drm/i915/display/intel_panel.c
 +++ b/drivers/gpu/drm/i915/display/intel_panel.c
-@@ -46,8 +46,8 @@
+@@ -37,6 +37,7 @@
+ #include "intel_backlight.h"
+ #include "intel_connector.h"
+ #include "intel_de.h"
++#include "intel_display_driver.h"
+ #include "intel_display_types.h"
+ #include "intel_drrs.h"
+ #include "intel_lvds_regs.h"
+@@ -46,8 +47,8 @@
  
  bool intel_panel_use_ssc(struct drm_i915_private *i915)
  {
@@ -56753,6 +57783,16 @@ index 483beedac5b8..0d8e5320a4f8 100644
  	return i915->display.vbt.lvds_use_ssc &&
  		!intel_has_quirk(i915, QUIRK_LVDS_SSC_DISABLE);
  }
+@@ -683,6 +684,9 @@ intel_panel_detect(struct drm_connector *connector, bool force)
+ 	if (!intel_display_device_enabled(i915))
+ 		return connector_status_disconnected;
+ 
++	if (!intel_display_driver_check_access(i915))
++		return connector->status;
++
+ 	return connector_status_connected;
+ }
+ 
 diff --git a/drivers/gpu/drm/i915/display/intel_pch_display.c b/drivers/gpu/drm/i915/display/intel_pch_display.c
 index 866786e6b32f..baf679759e00 100644
 --- a/drivers/gpu/drm/i915/display/intel_pch_display.c
@@ -57736,7 +58776,7 @@ index 543cdc46aa1d..600c815e37e4 100644
  static const u8 rc_range_minqp444_8bpc[DSC_NUM_BUF_RANGES][RC_RANGE_QP444_8BPC_MAX_NUM_BPP] = {
  	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c b/drivers/gpu/drm/i915/display/intel_sdvo.c
-index a9ac7d45d1f3..acc6b6804105 100644
+index a9ac7d45d1f3..2571ef5a1b21 100644
 --- a/drivers/gpu/drm/i915/display/intel_sdvo.c
 +++ b/drivers/gpu/drm/i915/display/intel_sdvo.c
 @@ -35,6 +35,7 @@
@@ -57747,7 +58787,15 @@ index a9ac7d45d1f3..acc6b6804105 100644
  
  #include "i915_drv.h"
  #include "i915_reg.h"
-@@ -1787,17 +1788,28 @@ static void intel_sdvo_get_config(struct intel_encoder *encoder,
+@@ -43,6 +44,7 @@
+ #include "intel_connector.h"
+ #include "intel_crtc.h"
+ #include "intel_de.h"
++#include "intel_display_driver.h"
+ #include "intel_display_types.h"
+ #include "intel_fdi.h"
+ #include "intel_fifo_underrun.h"
+@@ -1787,17 +1789,28 @@ static void intel_sdvo_get_config(struct intel_encoder *encoder,
  	intel_sdvo_get_eld(intel_sdvo, pipe_config);
  }
  
@@ -57778,7 +58826,7 @@ index a9ac7d45d1f3..acc6b6804105 100644
  	intel_sdvo_set_audio_state(intel_sdvo, 0);
  
  	intel_sdvo_write_infoframe(intel_sdvo, SDVO_HBUF_INDEX_ELD,
-@@ -1818,8 +1830,7 @@ static void intel_disable_sdvo(struct intel_atomic_state *state,
+@@ -1818,8 +1831,7 @@ static void intel_disable_sdvo(struct intel_atomic_state *state,
  	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
  	u32 temp;
  
@@ -57788,7 +58836,7 @@ index a9ac7d45d1f3..acc6b6804105 100644
  
  	intel_sdvo_set_active_outputs(intel_sdvo, 0);
  	if (0)
-@@ -1913,8 +1924,7 @@ static void intel_enable_sdvo(struct intel_atomic_state *state,
+@@ -1913,8 +1925,7 @@ static void intel_enable_sdvo(struct intel_atomic_state *state,
  						   DRM_MODE_DPMS_ON);
  	intel_sdvo_set_active_outputs(intel_sdvo, intel_sdvo_connector->output_flag);
  
@@ -57798,7 +58846,33 @@ index a9ac7d45d1f3..acc6b6804105 100644
  }
  
  static enum drm_mode_status
-@@ -3317,7 +3327,6 @@ intel_sdvo_init_ddc_proxy(struct intel_sdvo_ddc *ddc,
+@@ -2130,6 +2141,9 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
+ 	if (!intel_display_device_enabled(i915))
+ 		return connector_status_disconnected;
+ 
++	if (!intel_display_driver_check_access(i915))
++		return connector->status;
++
+ 	if (!intel_sdvo_set_target_output(intel_sdvo,
+ 					  intel_sdvo_connector->output_flag))
+ 		return connector_status_unknown;
+@@ -2795,6 +2809,7 @@ intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, u16 type)
+ 	} else {
+ 		intel_connector->polled = DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT;
+ 	}
++	intel_connector->base.polled = intel_connector->polled;
+ 	encoder->encoder_type = DRM_MODE_ENCODER_TMDS;
+ 	connector->connector_type = DRM_MODE_CONNECTOR_DVID;
+ 
+@@ -2870,6 +2885,7 @@ intel_sdvo_analog_init(struct intel_sdvo *intel_sdvo, u16 type)
+ 	intel_connector = &intel_sdvo_connector->base;
+ 	connector = &intel_connector->base;
+ 	intel_connector->polled = DRM_CONNECTOR_POLL_CONNECT;
++	intel_connector->base.polled = intel_connector->polled;
+ 	encoder->encoder_type = DRM_MODE_ENCODER_DAC;
+ 	connector->connector_type = DRM_MODE_CONNECTOR_VGA;
+ 
+@@ -3317,7 +3333,6 @@ intel_sdvo_init_ddc_proxy(struct intel_sdvo_ddc *ddc,
  	ddc->ddc_bus = ddc_bus;
  
  	ddc->ddc.owner = THIS_MODULE;
@@ -57806,7 +58880,7 @@ index a9ac7d45d1f3..acc6b6804105 100644
  	snprintf(ddc->ddc.name, I2C_NAME_SIZE, "SDVO %c DDC%d",
  		 port_name(sdvo->base.port), ddc_bus);
  	ddc->ddc.dev.parent = &pdev->dev;
-@@ -3396,6 +3405,8 @@ bool intel_sdvo_init(struct drm_i915_private *dev_priv,
+@@ -3396,6 +3411,8 @@ bool intel_sdvo_init(struct drm_i915_private *dev_priv,
  	}
  	intel_encoder->pre_enable = intel_sdvo_pre_enable;
  	intel_encoder->enable = intel_enable_sdvo;
@@ -57854,10 +58928,26 @@ index 1fb16510f750..d7b440c8caef 100644
  
  	if (ret)
 diff --git a/drivers/gpu/drm/i915/display/intel_tc.c b/drivers/gpu/drm/i915/display/intel_tc.c
-index f64d348a969e..dcf05e00e505 100644
+index f64d348a969e..f34743e6eeed 100644
 --- a/drivers/gpu/drm/i915/display/intel_tc.c
 +++ b/drivers/gpu/drm/i915/display/intel_tc.c
-@@ -1030,18 +1030,25 @@ static bool xelpdp_tc_phy_enable_tcss_power(struct intel_tc_port *tc, bool enabl
+@@ -122,6 +122,15 @@ bool intel_tc_port_in_legacy_mode(struct intel_digital_port *dig_port)
+ 	return intel_tc_port_in_mode(dig_port, TC_PORT_LEGACY);
+ }
+ 
++bool intel_tc_port_handles_hpd_glitches(struct intel_digital_port *dig_port)
++{
++	struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
++	enum phy phy = intel_port_to_phy(i915, dig_port->base.port);
++	struct intel_tc_port *tc = to_tc_port(dig_port);
++
++	return intel_phy_is_tc(i915, phy) && !tc->legacy_port;
++}
++
+ /*
+  * The display power domains used for TC ports depending on the
+  * platform and TC mode (legacy, DP-alt, TBT):
+@@ -1030,18 +1039,25 @@ static bool xelpdp_tc_phy_enable_tcss_power(struct intel_tc_port *tc, bool enabl
  
  	__xelpdp_tc_phy_enable_tcss_power(tc, enable);
  
@@ -57892,11 +58982,63 @@ index f64d348a969e..dcf05e00e505 100644
  }
  
  static void xelpdp_tc_phy_take_ownership(struct intel_tc_port *tc, bool take)
+@@ -1583,7 +1599,7 @@ void intel_tc_port_sanitize_mode(struct intel_digital_port *dig_port,
+  * connected ports are usable, and avoids exposing to the users objects they
+  * can't really use.
+  */
+-bool intel_tc_port_connected_locked(struct intel_encoder *encoder)
++bool intel_tc_port_connected(struct intel_encoder *encoder)
+ {
+ 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
+ 	struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
+@@ -1598,19 +1614,6 @@ bool intel_tc_port_connected_locked(struct intel_encoder *encoder)
+ 	return tc_phy_hpd_live_status(tc) & mask;
+ }
+ 
+-bool intel_tc_port_connected(struct intel_encoder *encoder)
+-{
+-	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
+-	struct intel_tc_port *tc = to_tc_port(dig_port);
+-	bool is_connected;
+-
+-	mutex_lock(&tc->lock);
+-	is_connected = intel_tc_port_connected_locked(encoder);
+-	mutex_unlock(&tc->lock);
+-
+-	return is_connected;
+-}
+-
+ static bool __intel_tc_port_link_needs_reset(struct intel_tc_port *tc)
+ {
+ 	bool ret;
+diff --git a/drivers/gpu/drm/i915/display/intel_tc.h b/drivers/gpu/drm/i915/display/intel_tc.h
+index 80a61e52850e..26c4265368c1 100644
+--- a/drivers/gpu/drm/i915/display/intel_tc.h
++++ b/drivers/gpu/drm/i915/display/intel_tc.h
+@@ -15,9 +15,9 @@ struct intel_encoder;
+ bool intel_tc_port_in_tbt_alt_mode(struct intel_digital_port *dig_port);
+ bool intel_tc_port_in_dp_alt_mode(struct intel_digital_port *dig_port);
+ bool intel_tc_port_in_legacy_mode(struct intel_digital_port *dig_port);
++bool intel_tc_port_handles_hpd_glitches(struct intel_digital_port *dig_port);
+ 
+ bool intel_tc_port_connected(struct intel_encoder *encoder);
+-bool intel_tc_port_connected_locked(struct intel_encoder *encoder);
+ 
+ u32 intel_tc_port_get_pin_assignment_mask(struct intel_digital_port *dig_port);
+ int intel_tc_port_max_lane_count(struct intel_digital_port *dig_port);
 diff --git a/drivers/gpu/drm/i915/display/intel_tv.c b/drivers/gpu/drm/i915/display/intel_tv.c
-index 2ee4f0d95851..9a217805d2f6 100644
+index 2ee4f0d95851..a96bcfcf90a3 100644
 --- a/drivers/gpu/drm/i915/display/intel_tv.c
 +++ b/drivers/gpu/drm/i915/display/intel_tv.c
-@@ -1327,7 +1327,7 @@ intel_tv_compute_config(struct intel_encoder *encoder,
+@@ -40,6 +40,7 @@
+ #include "intel_crtc.h"
+ #include "intel_de.h"
+ #include "intel_display_irq.h"
++#include "intel_display_driver.h"
+ #include "intel_display_types.h"
+ #include "intel_dpll.h"
+ #include "intel_hotplug.h"
+@@ -1327,7 +1328,7 @@ intel_tv_compute_config(struct intel_encoder *encoder,
  	 * the active portion. Hence following this formula seems
  	 * more trouble that it's worth.
  	 *
@@ -57905,7 +59047,7 @@ index 2ee4f0d95851..9a217805d2f6 100644
  	 *	num = cdclk * (tv_mode->oversample >> !tv_mode->progressive);
  	 *	den = tv_mode->clock;
  	 * } else {
-@@ -1417,9 +1417,6 @@ set_tv_mode_timings(struct drm_i915_private *dev_priv,
+@@ -1417,9 +1418,6 @@ set_tv_mode_timings(struct drm_i915_private *dev_priv,
  static void set_color_conversion(struct drm_i915_private *dev_priv,
  				 const struct color_conversion *color_conversion)
  {
@@ -57915,7 +59057,7 @@ index 2ee4f0d95851..9a217805d2f6 100644
  	intel_de_write(dev_priv, TV_CSC_Y,
  		       (color_conversion->ry << 16) | color_conversion->gy);
  	intel_de_write(dev_priv, TV_CSC_Y2,
-@@ -1454,9 +1451,6 @@ static void intel_tv_pre_enable(struct intel_atomic_state *state,
+@@ -1454,9 +1452,6 @@ static void intel_tv_pre_enable(struct intel_atomic_state *state,
  	int xpos, ypos;
  	unsigned int xsize, ysize;
  
@@ -57925,6 +59067,24 @@ index 2ee4f0d95851..9a217805d2f6 100644
  	tv_ctl = intel_de_read(dev_priv, TV_CTL);
  	tv_ctl &= TV_CTL_SAVE;
  
+@@ -1729,6 +1724,9 @@ intel_tv_detect(struct drm_connector *connector,
+ 	if (!intel_display_device_enabled(i915))
+ 		return connector_status_disconnected;
+ 
++	if (!intel_display_driver_check_access(i915))
++		return connector->status;
++
+ 	if (force) {
+ 		struct drm_atomic_state *state;
+ 
+@@ -1996,6 +1994,7 @@ intel_tv_init(struct drm_i915_private *dev_priv)
+ 	 * More recent chipsets favour HDMI rather than integrated S-Video.
+ 	 */
+ 	intel_connector->polled = DRM_CONNECTOR_POLL_CONNECT;
++	intel_connector->base.polled = intel_connector->polled;
+ 
+ 	drm_connector_init(&dev_priv->drm, connector, &intel_tv_connector_funcs,
+ 			   DRM_MODE_CONNECTOR_SVIDEO);
 diff --git a/drivers/gpu/drm/i915/display/intel_vblank.c b/drivers/gpu/drm/i915/display/intel_vblank.c
 index 2cec2abf9746..fe256bf7b485 100644
 --- a/drivers/gpu/drm/i915/display/intel_vblank.c
@@ -61052,7 +62212,7 @@ index e9b79c2c37d8..db99c2ef66db 100644
 +	i915_gpu_error_debugfs_register(dev_priv);
  }
 diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
-index 802de2c6decb..c7d7c3b7ecc6 100644
+index 802de2c6decb..a951050f6a75 100644
 --- a/drivers/gpu/drm/i915/i915_driver.c
 +++ b/drivers/gpu/drm/i915/i915_driver.c
 @@ -231,16 +231,10 @@ static int i915_driver_early_probe(struct drm_i915_private *dev_priv)
@@ -61092,7 +62252,28 @@ index 802de2c6decb..c7d7c3b7ecc6 100644
  }
  
  static int i915_driver_open(struct drm_device *dev, struct drm_file *file)
-@@ -1037,7 +1035,7 @@ void i915_driver_shutdown(struct drm_i915_private *i915)
+@@ -1005,8 +1003,10 @@ void i915_driver_shutdown(struct drm_i915_private *i915)
+ 	intel_runtime_pm_disable(&i915->runtime_pm);
+ 	intel_power_domains_disable(i915);
+ 
++	intel_fbdev_set_suspend(&i915->drm, FBINFO_STATE_SUSPENDED, true);
+ 	if (HAS_DISPLAY(i915)) {
+ 		drm_kms_helper_poll_disable(&i915->drm);
++		intel_display_driver_disable_user_access(i915);
+ 
+ 		drm_atomic_helper_shutdown(&i915->drm);
+ 	}
+@@ -1016,6 +1016,9 @@ void i915_driver_shutdown(struct drm_i915_private *i915)
+ 	intel_runtime_pm_disable_interrupts(i915);
+ 	intel_hpd_cancel_work(i915);
+ 
++	if (HAS_DISPLAY(i915))
++		intel_display_driver_suspend_access(i915);
++
+ 	intel_suspend_encoders(i915);
+ 	intel_shutdown_encoders(i915);
+ 
+@@ -1037,7 +1040,7 @@ void i915_driver_shutdown(struct drm_i915_private *i915)
  	intel_power_domains_driver_remove(i915);
  	enable_rpm_wakeref_asserts(&i915->runtime_pm);
  
@@ -61101,6 +62282,62 @@ index 802de2c6decb..c7d7c3b7ecc6 100644
  }
  
  static bool suspend_to_idle(struct drm_i915_private *dev_priv)
+@@ -1082,8 +1085,11 @@ static int i915_drm_suspend(struct drm_device *dev)
+ 	/* We do a lot of poking in a lot of registers, make sure they work
+ 	 * properly. */
+ 	intel_power_domains_disable(dev_priv);
+-	if (HAS_DISPLAY(dev_priv))
++	intel_fbdev_set_suspend(dev, FBINFO_STATE_SUSPENDED, true);
++	if (HAS_DISPLAY(dev_priv)) {
+ 		drm_kms_helper_poll_disable(dev);
++		intel_display_driver_disable_user_access(dev_priv);
++	}
+ 
+ 	pci_save_state(pdev);
+ 
+@@ -1094,6 +1100,9 @@ static int i915_drm_suspend(struct drm_device *dev)
+ 	intel_runtime_pm_disable_interrupts(dev_priv);
+ 	intel_hpd_cancel_work(dev_priv);
+ 
++	if (HAS_DISPLAY(dev_priv))
++		intel_display_driver_suspend_access(dev_priv);
++
+ 	intel_suspend_encoders(dev_priv);
+ 
+ 	/* Must be called before GGTT is suspended. */
+@@ -1105,8 +1114,6 @@ static int i915_drm_suspend(struct drm_device *dev)
+ 	opregion_target_state = suspend_to_idle(dev_priv) ? PCI_D1 : PCI_D3cold;
+ 	intel_opregion_suspend(dev_priv, opregion_target_state);
+ 
+-	intel_fbdev_set_suspend(dev, FBINFO_STATE_SUSPENDED, true);
+-
+ 	dev_priv->suspend_count++;
+ 
+ 	intel_dmc_suspend(dev_priv);
+@@ -1245,15 +1252,21 @@ static int i915_drm_resume(struct drm_device *dev)
+ 	intel_display_driver_init_hw(dev_priv);
+ 
+ 	intel_clock_gating_init(dev_priv);
++
++	if (HAS_DISPLAY(dev_priv))
++		intel_display_driver_resume_access(dev_priv);
++
+ 	intel_hpd_init(dev_priv);
+ 
+ 	/* MST sideband requires HPD interrupts enabled */
+ 	intel_dp_mst_resume(dev_priv);
+ 	intel_display_driver_resume(dev_priv);
+ 
+-	intel_hpd_poll_disable(dev_priv);
+-	if (HAS_DISPLAY(dev_priv))
++	if (HAS_DISPLAY(dev_priv)) {
++		intel_display_driver_enable_user_access(dev_priv);
+ 		drm_kms_helper_poll_enable(dev);
++	}
++	intel_hpd_poll_disable(dev_priv);
+ 
+ 	intel_opregion_resume(dev_priv);
+ 
 diff --git a/drivers/gpu/drm/i915/i915_drm_client.c b/drivers/gpu/drm/i915/i915_drm_client.c
 index 2a44b3876cb5..fa6852713bee 100644
 --- a/drivers/gpu/drm/i915/i915_drm_client.c
@@ -194482,6 +195719,174 @@ index 748a3c40966e..aa312441604f 100644
  
  	if (hda_format)
  		*hda_format = (unsigned short)format_val;
+diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
+index a889cccdd607..e8819e8a9876 100644
+--- a/sound/pci/hda/patch_conexant.c
++++ b/sound/pci/hda/patch_conexant.c
+@@ -21,6 +21,12 @@
+ #include "hda_jack.h"
+ #include "hda_generic.h"
+ 
++enum {
++	CX_HEADSET_NOPRESENT = 0,
++	CX_HEADSET_PARTPRESENT,
++	CX_HEADSET_ALLPRESENT,
++};
++
+ struct conexant_spec {
+ 	struct hda_gen_spec gen;
+ 
+@@ -42,7 +48,8 @@ struct conexant_spec {
+ 	unsigned int gpio_led;
+ 	unsigned int gpio_mute_led_mask;
+ 	unsigned int gpio_mic_led_mask;
+-
++	unsigned int headset_present_flag;
++	bool is_cx8070_sn6140;
+ };
+ 
+ 
+@@ -164,6 +171,27 @@ static void cxt_init_gpio_led(struct hda_codec *codec)
+ 	}
+ }
+ 
++static void cx_fixup_headset_recog(struct hda_codec *codec)
++{
++	unsigned int mic_persent;
++
++	/* fix some headset type recognize fail issue, such as EDIFIER headset */
++	/* set micbiasd output current comparator threshold from 66% to 55%. */
++	snd_hda_codec_write(codec, 0x1c, 0, 0x320, 0x010);
++	/* set OFF voltage for DFET from -1.2V to -0.8V, set headset micbias registor
++	 * value adjustment trim from 2.2K ohms to 2.0K ohms.
++	 */
++	snd_hda_codec_write(codec, 0x1c, 0, 0x3b0, 0xe10);
++	/* fix reboot headset type recognize fail issue */
++	mic_persent = snd_hda_codec_read(codec, 0x19, 0, AC_VERB_GET_PIN_SENSE, 0x0);
++	if (mic_persent & AC_PINSENSE_PRESENCE)
++		/* enable headset mic VREF */
++		snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24);
++	else
++		/* disable headset mic VREF */
++		snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20);
++}
++
+ static int cx_auto_init(struct hda_codec *codec)
+ {
+ 	struct conexant_spec *spec = codec->spec;
+@@ -174,6 +202,9 @@ static int cx_auto_init(struct hda_codec *codec)
+ 	cxt_init_gpio_led(codec);
+ 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
+ 
++	if (spec->is_cx8070_sn6140)
++		cx_fixup_headset_recog(codec);
++
+ 	return 0;
+ }
+ 
+@@ -192,6 +223,77 @@ static void cx_auto_free(struct hda_codec *codec)
+ 	snd_hda_gen_free(codec);
+ }
+ 
++static void cx_process_headset_plugin(struct hda_codec *codec)
++{
++	unsigned int val;
++	unsigned int count = 0;
++
++	/* Wait headset detect done. */
++	do {
++		val = snd_hda_codec_read(codec, 0x1c, 0, 0xca0, 0x0);
++		if (val & 0x080) {
++			codec_dbg(codec, "headset type detect done!\n");
++			break;
++		}
++		msleep(20);
++		count++;
++	} while (count < 3);
++	val = snd_hda_codec_read(codec, 0x1c, 0, 0xcb0, 0x0);
++	if (val & 0x800) {
++		codec_dbg(codec, "headset plugin, type is CTIA\n");
++		snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24);
++	} else if (val & 0x400) {
++		codec_dbg(codec, "headset plugin, type is OMTP\n");
++		snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24);
++	} else {
++		codec_dbg(codec, "headphone plugin\n");
++	}
++}
++
++static void cx_update_headset_mic_vref(struct hda_codec *codec, unsigned int res)
++{
++	unsigned int phone_present, mic_persent, phone_tag, mic_tag;
++	struct conexant_spec *spec = codec->spec;
++
++	/* In cx8070 and sn6140, the node 16 can only be config to headphone or disabled,
++	 * the node 19 can only be config to microphone or disabled.
++	 * Check hp&mic tag to process headset pulgin&plugout.
++	 */
++	phone_tag = snd_hda_codec_read(codec, 0x16, 0, AC_VERB_GET_UNSOLICITED_RESPONSE, 0x0);
++	mic_tag = snd_hda_codec_read(codec, 0x19, 0, AC_VERB_GET_UNSOLICITED_RESPONSE, 0x0);
++	if ((phone_tag & (res >> AC_UNSOL_RES_TAG_SHIFT)) ||
++	    (mic_tag & (res >> AC_UNSOL_RES_TAG_SHIFT))) {
++		phone_present = snd_hda_codec_read(codec, 0x16, 0, AC_VERB_GET_PIN_SENSE, 0x0);
++		if (!(phone_present & AC_PINSENSE_PRESENCE)) {/* headphone plugout */
++			spec->headset_present_flag = CX_HEADSET_NOPRESENT;
++			snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20);
++			return;
++		}
++		if (spec->headset_present_flag == CX_HEADSET_NOPRESENT) {
++			spec->headset_present_flag = CX_HEADSET_PARTPRESENT;
++		} else if (spec->headset_present_flag == CX_HEADSET_PARTPRESENT) {
++			mic_persent = snd_hda_codec_read(codec, 0x19, 0,
++							 AC_VERB_GET_PIN_SENSE, 0x0);
++			/* headset is present */
++			if ((phone_present & AC_PINSENSE_PRESENCE) &&
++			    (mic_persent & AC_PINSENSE_PRESENCE)) {
++				cx_process_headset_plugin(codec);
++				spec->headset_present_flag = CX_HEADSET_ALLPRESENT;
++			}
++		}
++	}
++}
++
++static void cx_jack_unsol_event(struct hda_codec *codec, unsigned int res)
++{
++	struct conexant_spec *spec = codec->spec;
++
++	if (spec->is_cx8070_sn6140)
++		cx_update_headset_mic_vref(codec, res);
++
++	snd_hda_jack_unsol_event(codec, res);
++}
++
+ #ifdef CONFIG_PM
+ static int cx_auto_suspend(struct hda_codec *codec)
+ {
+@@ -205,7 +307,7 @@ static const struct hda_codec_ops cx_auto_patch_ops = {
+ 	.build_pcms = snd_hda_gen_build_pcms,
+ 	.init = cx_auto_init,
+ 	.free = cx_auto_free,
+-	.unsol_event = snd_hda_jack_unsol_event,
++	.unsol_event = cx_jack_unsol_event,
+ #ifdef CONFIG_PM
+ 	.suspend = cx_auto_suspend,
+ 	.check_power_status = snd_hda_gen_check_power_status,
+@@ -1042,6 +1144,15 @@ static int patch_conexant_auto(struct hda_codec *codec)
+ 	codec->spec = spec;
+ 	codec->patch_ops = cx_auto_patch_ops;
+ 
++	/* init cx8070/sn6140 flag and reset headset_present_flag */
++	switch (codec->core.vendor_id) {
++	case 0x14f11f86:
++	case 0x14f11f87:
++		spec->is_cx8070_sn6140 = true;
++		spec->headset_present_flag = CX_HEADSET_NOPRESENT;
++		break;
++	}
++
+ 	cx_auto_parse_eapd(codec);
+ 	spec->gen.own_eapd_ctl = 1;
+ 
 diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
 index 78cee53fee02..200779296a1b 100644
 --- a/sound/pci/hda/patch_hdmi.c
@@ -194514,7 +195919,7 @@ index 78cee53fee02..200779296a1b 100644
  	if (err < 0)
  		return err;
 diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
-index 70b17b08d4ff..1dcfba27e075 100644
+index 70b17b08d4ff..b68c94757051 100644
 --- a/sound/pci/hda/patch_realtek.c
 +++ b/sound/pci/hda/patch_realtek.c
 @@ -6956,6 +6956,11 @@ static void cs35l41_fixup_i2c_two(struct hda_codec *cdc, const struct hda_fixup
@@ -194599,7 +196004,15 @@ index 70b17b08d4ff..1dcfba27e075 100644
  	SND_PCI_QUIRK(0x1028, 0x0cbd, "Dell Oasis 13 CS MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
  	SND_PCI_QUIRK(0x1028, 0x0cbe, "Dell Oasis 13 2-IN-1 MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
  	SND_PCI_QUIRK(0x1028, 0x0cbf, "Dell Oasis 13 Low Weight MTU-L", ALC289_FIXUP_DELL_CS35L41_SPI_2),
-@@ -10221,6 +10247,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
+@@ -9816,6 +9842,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
+ 	SND_PCI_QUIRK(0x103c, 0x8735, "HP ProBook 435 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
+ 	SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
+ 	SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),
++	SND_PCI_QUIRK(0x103c, 0x876e, "HP ENVY x360 Convertible 13-ay0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
+ 	SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
+ 	SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
+ 	SND_PCI_QUIRK(0x103c, 0x8780, "HP ZBook Fury 17 G7 Mobile Workstation",
+@@ -10221,6 +10248,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
  	SND_PCI_QUIRK(0x17aa, 0x3853, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
  	SND_PCI_QUIRK(0x17aa, 0x3855, "Legion 7 16ITHG6", ALC287_FIXUP_LEGION_16ITHG6),
  	SND_PCI_QUIRK(0x17aa, 0x3869, "Lenovo Yoga7 14IAL7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
@@ -194607,7 +196020,7 @@ index 70b17b08d4ff..1dcfba27e075 100644
  	SND_PCI_QUIRK(0x17aa, 0x387d, "Yoga S780-16 pro Quad AAC", ALC287_FIXUP_TAS2781_I2C),
  	SND_PCI_QUIRK(0x17aa, 0x387e, "Yoga S780-16 pro Quad YC", ALC287_FIXUP_TAS2781_I2C),
  	SND_PCI_QUIRK(0x17aa, 0x3881, "YB9 dual power mode2 YC", ALC287_FIXUP_TAS2781_I2C),
-@@ -10229,6 +10256,10 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
+@@ -10229,6 +10257,10 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
  	SND_PCI_QUIRK(0x17aa, 0x3886, "Y780 VECO DUAL", ALC287_FIXUP_TAS2781_I2C),
  	SND_PCI_QUIRK(0x17aa, 0x38a7, "Y780P AMD YG dual", ALC287_FIXUP_TAS2781_I2C),
  	SND_PCI_QUIRK(0x17aa, 0x38a8, "Y780P AMD VECO dual", ALC287_FIXUP_TAS2781_I2C),
@@ -201843,6 +203256,44 @@ index 943bf8b80e01..bbf796a5f7ba 100644
  			sof_sdw_hdmi.o
  obj-$(CONFIG_SND_SOC_INTEL_SOF_RT5682_MACH) += snd-soc-sof_rt5682.o
  obj-$(CONFIG_SND_SOC_INTEL_SOF_CS42L42_MACH) += snd-soc-sof_cs42l42.o
+diff --git a/sound/soc/intel/boards/bxt_da7219_max98357a.c b/sound/soc/intel/boards/bxt_da7219_max98357a.c
+index 816fad8c1ff0..540f7a29310a 100644
+--- a/sound/soc/intel/boards/bxt_da7219_max98357a.c
++++ b/sound/soc/intel/boards/bxt_da7219_max98357a.c
+@@ -797,6 +797,9 @@ static int broxton_audio_probe(struct platform_device *pdev)
+ 		broxton_audio_card.name = "glkda7219max";
+ 		/* Fixup the SSP entries for geminilake */
+ 		for (i = 0; i < ARRAY_SIZE(broxton_dais); i++) {
++			if (!broxton_dais[i].codecs->dai_name)
++				continue;
++
+ 			/* MAXIM_CODEC is connected to SSP1. */
+ 			if (!strcmp(broxton_dais[i].codecs->dai_name,
+ 				    BXT_MAXIM_CODEC_DAI)) {
+@@ -822,6 +825,9 @@ static int broxton_audio_probe(struct platform_device *pdev)
+ 			broxton_audio_card.name = "cmlda7219max";
+ 
+ 		for (i = 0; i < ARRAY_SIZE(broxton_dais); i++) {
++			if (!broxton_dais[i].codecs->dai_name)
++				continue;
++
+ 			/* MAXIM_CODEC is connected to SSP1. */
+ 			if (!strcmp(broxton_dais[i].codecs->dai_name,
+ 					BXT_MAXIM_CODEC_DAI)) {
+diff --git a/sound/soc/intel/boards/bxt_rt298.c b/sound/soc/intel/boards/bxt_rt298.c
+index 4631106f2a28..c0eb65c14aa9 100644
+--- a/sound/soc/intel/boards/bxt_rt298.c
++++ b/sound/soc/intel/boards/bxt_rt298.c
+@@ -604,7 +604,8 @@ static int broxton_audio_probe(struct platform_device *pdev)
+ 	int i;
+ 
+ 	for (i = 0; i < ARRAY_SIZE(broxton_rt298_dais); i++) {
+-		if (!strncmp(card->dai_link[i].codecs->name, "i2c-INT343A:00",
++		if (card->dai_link[i].codecs->name &&
++		    !strncmp(card->dai_link[i].codecs->name, "i2c-INT343A:00",
+ 			     I2C_NAME_SIZE)) {
+ 			if (!strncmp(card->name, "broxton-rt298",
+ 				     PLATFORM_NAME_SIZE)) {
 diff --git a/sound/soc/intel/boards/bytcht_es8316.c b/sound/soc/intel/boards/bytcht_es8316.c
 index 8a0b0e864fbb..1564a88a885e 100644
 --- a/sound/soc/intel/boards/bytcht_es8316.c
diff --git a/patches/external/bbb.io/0001-Add-BeagleBoard.org-Device-Tree-Changes.patch b/patches/external/bbb.io/0001-Add-BeagleBoard.org-Device-Tree-Changes.patch
index a7eb251b..896e1bc1 100644
--- a/patches/external/bbb.io/0001-Add-BeagleBoard.org-Device-Tree-Changes.patch
+++ b/patches/external/bbb.io/0001-Add-BeagleBoard.org-Device-Tree-Changes.patch
@@ -1,16 +1,23 @@
-From 0e9d8f0447a6893829b88b07d1b33c4471c06b4a Mon Sep 17 00:00:00 2001
+From ad80862996dfc63be9f96ae06ca894871fc69527 Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Mon, 8 Jan 2024 20:57:36 -0600
+Date: Sun, 14 Jan 2024 20:40:48 -0600
 Subject: [PATCH] Add BeagleBoard.org Device Tree Changes
 
 https://openbeagle.org/beagleboard/BeagleBoard-DeviceTrees/-/tree/v6.7.x
 
-https://openbeagle.org/beagleboard/BeagleBoard-DeviceTrees/-/commit/2baa426865df1d6f3e90bb91fa488bd168f45b75
+https://openbeagle.org/beagleboard/BeagleBoard-DeviceTrees/-/commit/fb6f54ec2b36cac20da460d0e51164fa428625d6
 Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
 ---
- arch/arm/boot/dts/ti/omap/Makefile            |   6 +
- .../dts/ti/omap/am335x-bbb-bone-buses.dtsi    |  85 ++++++++
- .../boot/dts/ti/omap/am335x-bone-common.dtsi  |  25 ++-
+ .../boot/dts/ti/omap/AM335X-PRU-UIO-00A0.dtso |  28 +++
+ .../boot/dts/ti/omap/AM57XX-PRU-UIO-00A0.dtso |  55 +++++
+ arch/arm/boot/dts/ti/omap/BB-ADC-00A0.dtso    | 112 ++++++++++
+ .../dts/ti/omap/BB-BONE-eMMC1-01-00A0.dtso    |  61 ++++++
+ .../boot/dts/ti/omap/BBORG_COMMS-00A2.dtso    |  39 ++++
+ arch/arm/boot/dts/ti/omap/BBORG_FAN-A000.dtso |  16 ++
+ arch/arm/boot/dts/ti/omap/BONE-ADC.dtso       |  28 +++
+ arch/arm/boot/dts/ti/omap/Makefile            |  13 ++
+ .../dts/ti/omap/am335x-bbb-bone-buses.dtsi    |  69 +++++++
+ .../boot/dts/ti/omap/am335x-bone-common.dtsi  |  27 ++-
  arch/arm/boot/dts/ti/omap/am335x-bone.dts     |   5 +
  .../dts/ti/omap/am335x-boneblack-uboot.dts    | 194 ++++++++++++++++++
  .../dts/ti/omap/am335x-boneblack-wireless.dts |   5 +
@@ -18,17 +25,22 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  arch/arm/boot/dts/ti/omap/am335x-boneblue.dts |   2 +
  .../dts/ti/omap/am335x-bonegreen-common.dtsi  |   1 +
  .../dts/ti/omap/am335x-bonegreen-wireless.dts |   5 +
- .../arm/boot/dts/ti/omap/am335x-bonegreen.dts |   5 +
+ .../arm/boot/dts/ti/omap/am335x-bonegreen.dts | 153 ++++++++++++++
  .../dts/ti/omap/am335x-osd3358-sm-red.dts     |   5 +
  .../dts/ti/omap/am335x-osd335x-common.dtsi    |   1 +
  .../boot/dts/ti/omap/am335x-pocketbeagle.dts  |   2 +
  .../am335x-sancloud-bbe-extended-wifi.dts     |   5 +
  .../dts/ti/omap/am335x-sancloud-bbe-lite.dts  |   6 +
  .../boot/dts/ti/omap/am335x-sancloud-bbe.dts  |   5 +
+ arch/arm/boot/dts/ti/omap/am33xx-l4.dtsi      |   2 +-
+ arch/arm/boot/dts/ti/omap/am33xx.dtsi         |   5 +
  .../boot/dts/ti/omap/am5729-beagleboneai.dts  |  11 +-
  .../dts/ti/omap/am57xx-beagle-x15-revb1.dts   |   5 +
  .../dts/ti/omap/am57xx-beagle-x15-revc.dts    |   5 +
  .../boot/dts/ti/omap/am57xx-beagle-x15.dts    |   5 +
+ arch/arm/boot/dts/ti/omap/dra7.dtsi           |   6 +
+ arch/arm/boot/dts/ti/omap/omap34xx.dtsi       |   6 +
+ arch/arm/boot/dts/ti/omap/omap4.dtsi          |   6 +
  arch/arm64/boot/dts/ti/k3-am62-main.dtsi      |  96 ++++++++-
  .../arm64/boot/dts/ti/k3-am625-beagleplay.dts |  23 ++-
  .../arm64/boot/dts/ti/k3-am62x-sk-common.dtsi |  16 ++
@@ -41,12 +53,400 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  arch/arm64/boot/dts/ti/k3-j784s4-evm.dts      | 102 +++++++++
  arch/arm64/boot/dts/ti/k3-j784s4-main.dtsi    |   9 +-
  .../boot/dts/ti/k3-j784s4-mcu-wakeup.dtsi     |  22 +-
- 33 files changed, 1067 insertions(+), 35 deletions(-)
+ 45 files changed, 1571 insertions(+), 36 deletions(-)
+ create mode 100644 arch/arm/boot/dts/ti/omap/AM335X-PRU-UIO-00A0.dtso
+ create mode 100644 arch/arm/boot/dts/ti/omap/AM57XX-PRU-UIO-00A0.dtso
+ create mode 100644 arch/arm/boot/dts/ti/omap/BB-ADC-00A0.dtso
+ create mode 100644 arch/arm/boot/dts/ti/omap/BB-BONE-eMMC1-01-00A0.dtso
+ create mode 100644 arch/arm/boot/dts/ti/omap/BBORG_COMMS-00A2.dtso
+ create mode 100644 arch/arm/boot/dts/ti/omap/BBORG_FAN-A000.dtso
+ create mode 100644 arch/arm/boot/dts/ti/omap/BONE-ADC.dtso
  create mode 100644 arch/arm/boot/dts/ti/omap/am335x-bbb-bone-buses.dtsi
  create mode 100644 arch/arm/boot/dts/ti/omap/am335x-boneblack-uboot.dts
 
+diff --git a/arch/arm/boot/dts/ti/omap/AM335X-PRU-UIO-00A0.dtso b/arch/arm/boot/dts/ti/omap/AM335X-PRU-UIO-00A0.dtso
+new file mode 100644
+index 000000000000..f3016efca2d7
+--- /dev/null
++++ b/arch/arm/boot/dts/ti/omap/AM335X-PRU-UIO-00A0.dtso
+@@ -0,0 +1,28 @@
++// SPDX-License-Identifier: GPL-2.0-only
++/*
++ * Copyright (C) 2012 Texas Instruments Incorporated - https://www.ti.com/
++ */
++
++/dts-v1/;
++/plugin/;
++
++/*
++ * Helper to show loaded overlays under: /proc/device-tree/chosen/overlays/
++ */
++&{/chosen} {
++	overlays {
++		AM335X-PRU-UIO-00A0.kernel = __TIMESTAMP__;
++	};
++};
++
++
++&pruss_tm {
++	status = "okay";
++};
++
++&pruss {
++	compatible = "ti,pruss-v2";
++	ti,pintc-offset = <0x20000>;
++	interrupt-parent = <&intc>;
++	interrupts = <20 21 22 23 24 25 26 27>;
++};
+diff --git a/arch/arm/boot/dts/ti/omap/AM57XX-PRU-UIO-00A0.dtso b/arch/arm/boot/dts/ti/omap/AM57XX-PRU-UIO-00A0.dtso
+new file mode 100644
+index 000000000000..b3f2aaf9abc0
+--- /dev/null
++++ b/arch/arm/boot/dts/ti/omap/AM57XX-PRU-UIO-00A0.dtso
+@@ -0,0 +1,55 @@
++// SPDX-License-Identifier: GPL-2.0-only
++/*
++ * Copyright (C) 2012 Texas Instruments Incorporated - https://www.ti.com/
++ */
++
++/dts-v1/;
++/plugin/;
++
++#include <dt-bindings/interrupt-controller/arm-gic.h>
++#include <dt-bindings/interrupt-controller/irq.h>
++
++/*
++ * Helper to show loaded overlays under: /proc/device-tree/chosen/overlays/
++ */
++&{/chosen} {
++	overlays {
++		AM57XX-PRU-UIO-00A0.kernel = __TIMESTAMP__;
++	};
++};
++
++&pruss1_tm {
++	status = "okay";
++};
++
++&pruss1 {
++	compatible = "ti,pruss-v2";
++	ti,pintc-offset = <0x20000>;
++	interrupts = <GIC_SPI 186 IRQ_TYPE_LEVEL_HIGH>,
++		     <GIC_SPI 187 IRQ_TYPE_LEVEL_HIGH>,
++		     <GIC_SPI 188 IRQ_TYPE_LEVEL_HIGH>,
++		     <GIC_SPI 189 IRQ_TYPE_LEVEL_HIGH>,
++		     <GIC_SPI 190 IRQ_TYPE_LEVEL_HIGH>,
++		     <GIC_SPI 191 IRQ_TYPE_LEVEL_HIGH>,
++		     <GIC_SPI 192 IRQ_TYPE_LEVEL_HIGH>,
++		     <GIC_SPI 193 IRQ_TYPE_LEVEL_HIGH>;
++	pruss-instance = "pruss1";
++};
++
++&pruss2_tm {
++	status = "okay";
++};
++
++&pruss2 {
++	compatible = "ti,pruss-v2";
++	ti,pintc-offset = <0x20000>;
++	interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>,
++		     <GIC_SPI 197 IRQ_TYPE_LEVEL_HIGH>,
++		     <GIC_SPI 198 IRQ_TYPE_LEVEL_HIGH>,
++		     <GIC_SPI 199 IRQ_TYPE_LEVEL_HIGH>,
++		     <GIC_SPI 200 IRQ_TYPE_LEVEL_HIGH>,
++		     <GIC_SPI 201 IRQ_TYPE_LEVEL_HIGH>,
++		     <GIC_SPI 202 IRQ_TYPE_LEVEL_HIGH>,
++		     <GIC_SPI 203 IRQ_TYPE_LEVEL_HIGH>;
++	pruss-instance = "pruss2";
++};
+diff --git a/arch/arm/boot/dts/ti/omap/BB-ADC-00A0.dtso b/arch/arm/boot/dts/ti/omap/BB-ADC-00A0.dtso
+new file mode 100644
+index 000000000000..914b7aa3df43
+--- /dev/null
++++ b/arch/arm/boot/dts/ti/omap/BB-ADC-00A0.dtso
+@@ -0,0 +1,112 @@
++// SPDX-License-Identifier: GPL-2.0-only
++/*
++ * Copyright (C) 2012 Texas Instruments Incorporated - https://www.ti.com/
++ */
++
++/dts-v1/;
++/plugin/;
++
++/*
++ * Helper to show loaded overlays under: /proc/device-tree/chosen/overlays/
++ */
++&{/chosen} {
++	overlays {
++		BB-ADC-00A0.kernel = __TIMESTAMP__;
++	};
++};
++
++&tscadc {
++	status = "okay";
++	adc {
++		// Configure one or more (up to 8) steps for the adc to execute:
++
++
++		// For each step, the channel to sample.
++		//	range: 0 .. 7
++		ti,adc-channels = <0 1 2 3 4 5 6 7>;
++		//
++		// BeagleBone Black (and most other variants):
++		//	ch 0	P9.39
++		//	ch 1	P9.40
++		//	ch 2	P9.37
++		//	ch 3	P9.38
++		//	ch 4	P9.33
++		//	ch 5	P9.36
++		//	ch 6	P9.35
++		//	ch 7	measures 0.5 * VDD_3V3B with 2.4 kΩ source impedance
++		//
++		// PocketBeagle:
++		//	ch 0	P1.19
++		//	ch 1	P1.21
++		//	ch 2	P1.23
++		//	ch 3	P1.25
++		//	ch 4	P1.27
++		//	ch 5	P2.35 via 10k/10k voltage divider
++		//	ch 6	P1.02 via 10k/10k voltage divider
++		//	ch 7	P2.36 via pmic mux
++		//
++		// The divider used on PocketBeagle channels 5 and 6 makes the effective voltage V_eff and
++		// source impedance Z_eff seen by the adc on these channels depend on the voltage V_src and
++		// impedance Z_src of the source connected to the corresponding pin as follows:
++		//
++		//	V_eff = V_src / (2 + Z_src / (10 kΩ))
++		//	Z_eff = 5 kΩ * (1 + Z_src / (Z_src + 20 kΩ))
++		//		≈ 5 kΩ + Z_src / 4    for small values of Z_src (up to 2 kΩ or so)
++
++
++		// For each step, number of adc clock cycles to wait between setting up muxes and sampling.
++		//	range: 0 .. 262143
++		//	optional, default is 152 (XXX but why?!)
++		ti,chan-step-opendelay = <152 152 152 152 152 152 152 152>;
++		//`
++		// XXX is there any purpose to set this nonzero other than to fine-tune the sample rate?
++
++
++		// For each step, how many times it should sample to average.
++		//	range: 1 .. 16, must be power of two (i.e. 1, 2, 4, 8, or 16)
++		//	optional, default is 16
++		ti,chan-step-avg = <16 16 16 16 16 16 16 16>;
++		//
++		// If you're using periodic sampling (using the iio block device rather than sysfs) then
++		// you should consider setting this to 1 and if desired reduce the samplerate in userspace
++		// instead since averaging isn't a particularly good low-pass filter.
++		//
++		// If you're using sysfs to occasionally read a value, then the default value of 16 will
++		// still get you the most accurate readings.
++
++
++		// For each step, number of adc clock cycles to sample minus two.
++		//	range: 0 .. 255   (resulting in sampling time of 2 .. 257 cycles)
++		//	optional, default is 0
++		ti,chan-step-sampledelay = <0 0 0 0 0 0 0 0>;
++		//
++		// If this is set too low, accuracy will deteriorate when the thing you're measuring has a
++		// high source impedance.  The maximum source impedance recommended (by erratum 1.0.32) is:
++		//	(2 + sampledelay) * 2.873 kΩ - 0.2 kΩ
++		// which means that the default should be fine for source impedance up to 5.5 kΩ.
++		//
++		// (This seems to ensure the sampling time is at least 21 times the RC constant, based on
++		// the 5.5 pF nominal capacitance specified in the datasheet.)
++
++
++		// After sampling, conversion time is 13 adc clock cycles.
++		//
++		// The adc clock frequency is 3 MHz, therefore the total time per step in microseconds is:
++		//	( opendelay + avg * ( 2 + sampledelay + 13 ) ) / 3
++		//
++		// If all steps use the same timings then the sample rate will be:
++		//	3 MHz / ( opendelay + avg * ( 2 + sampledelay + 13 ) ) / number_of_steps
++		//
++		// The highest samplerate obtainable (avg=1, opendelay=0, sampledelay=0) is therefore:
++		//	200 kHz / number_of_steps
++		//	= 25 kHz    when using all 8 steps.
++		//
++		// Using avg=16 reduces that to:
++		//	12.5 kHz / number_of_steps
++		//	= 1.5625 kHz    when using all 8 steps.
++		//
++		// Using the default values (avg=16, opendelay=152, sampledelay=0) reduces that to:
++		//	7.653 kHz / number_of_steps
++		//	= 0.9566 kHz    when using all 8 steps.
++	};
++};
+diff --git a/arch/arm/boot/dts/ti/omap/BB-BONE-eMMC1-01-00A0.dtso b/arch/arm/boot/dts/ti/omap/BB-BONE-eMMC1-01-00A0.dtso
+new file mode 100644
+index 000000000000..edc70070f278
+--- /dev/null
++++ b/arch/arm/boot/dts/ti/omap/BB-BONE-eMMC1-01-00A0.dtso
+@@ -0,0 +1,61 @@
++// SPDX-License-Identifier: GPL-2.0-only
++/*
++ * Copyright (C) 2012 Texas Instruments Incorporated - https://www.ti.com/
++ */
++
++/dts-v1/;
++/plugin/;
++
++#include <dt-bindings/gpio/gpio.h>
++#include <dt-bindings/pinctrl/am33xx.h>
++
++/*
++ * Helper to show loaded overlays under: /proc/device-tree/chosen/overlays/
++ */
++&{/chosen} {
++	overlays {
++		BB-BONE-eMMC1-01-00A0.kernel = __TIMESTAMP__;
++	};
++};
++
++/*
++ * Free up the pins used by the cape from the pinmux helpers.
++ */
++&ocp {
++	P8_21_pinmux { status = "disabled"; };	/* mmc1_clk */
++	P8_20_pinmux { status = "disabled"; };	/* mmc1_cmd */
++	P8_25_pinmux { status = "disabled"; };	/* mmc1_dat0 */
++	P8_24_pinmux { status = "disabled"; };	/* mmc1_dat1 */
++	P8_05_pinmux { status = "disabled"; };	/* mmc1_dat2 */
++	P8_06_pinmux { status = "disabled"; };	/* mmc1_dat3 */
++	P8_23_pinmux { status = "disabled"; };	/* mmc1_dat4 */
++	P8_22_pinmux { status = "disabled"; };	/* mmc1_dat5 */
++	P8_03_pinmux { status = "disabled"; };	/* mmc1_dat6 */
++	P8_04_pinmux { status = "disabled"; };	/* mmc1_dat7 */
++};
++
++&am33xx_pinmux {
++	emmc_pins: pinmux_emmc_pins {
++		pinctrl-single,pins = <
++			AM33XX_PADCONF(AM335X_PIN_GPMC_CSN1, PIN_INPUT_PULLUP, MUX_MODE2) /* gpmc_csn1.mmc1_clk */
++			AM33XX_PADCONF(AM335X_PIN_GPMC_CSN2, PIN_INPUT_PULLUP, MUX_MODE2) /* gpmc_csn2.mmc1_cmd */
++			AM33XX_PADCONF(AM335X_PIN_GPMC_AD0, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad0.mmc1_dat0 */
++			AM33XX_PADCONF(AM335X_PIN_GPMC_AD1, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad1.mmc1_dat1 */
++			AM33XX_PADCONF(AM335X_PIN_GPMC_AD2, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad2.mmc1_dat2 */
++			AM33XX_PADCONF(AM335X_PIN_GPMC_AD3, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad3.mmc1_dat3 */
++			AM33XX_PADCONF(AM335X_PIN_GPMC_AD4, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad4.mmc1_dat4 */
++			AM33XX_PADCONF(AM335X_PIN_GPMC_AD5, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad5.mmc1_dat5 */
++			AM33XX_PADCONF(AM335X_PIN_GPMC_AD6, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad6.mmc1_dat6 */
++			AM33XX_PADCONF(AM335X_PIN_GPMC_AD7, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad7.mmc1_dat7 */
++		>;
++	};
++};
++
++&mmc2 {
++	vmmc-supply = <&vmmcsd_fixed>;
++	pinctrl-names = "default";
++	pinctrl-0 = <&emmc_pins>;
++	bus-width = <8>;
++	status = "okay";
++	non-removable;
++};
+diff --git a/arch/arm/boot/dts/ti/omap/BBORG_COMMS-00A2.dtso b/arch/arm/boot/dts/ti/omap/BBORG_COMMS-00A2.dtso
+new file mode 100644
+index 000000000000..b724d9426568
+--- /dev/null
++++ b/arch/arm/boot/dts/ti/omap/BBORG_COMMS-00A2.dtso
+@@ -0,0 +1,39 @@
++// SPDX-License-Identifier: GPL-2.0-only
++/*
++ * Copyright (C) 2012,2019 Texas Instruments Incorporated - https://www.ti.com/
++ * Copyright (C) 2015 Robert Nelson <robertcnelson@gmail.com>
++ * Copyright (C) 2015 Sebastian Jegerås
++ */
++
++/dts-v1/;
++/plugin/;
++
++#include <dt-bindings/pinctrl/am33xx.h>
++#include <dt-bindings/gpio/gpio.h>
++
++/*
++ * Helper to show loaded overlays under: /proc/device-tree/chosen/overlays/
++ */
++&{/chosen} {
++	overlays {
++		BBORG_COMMS-00A2.kernel = __TIMESTAMP__;
++	};
++};
++
++/*
++ * Free up the pins used by the cape from the pinmux helpers.
++ */
++&ocp {
++	P9_24_pinmux { status = "disabled"; };	/* P9_24: uart1_txd.d_can1_rx */
++	P9_26_pinmux { status = "disabled"; };	/* P9_26: uart1_rxd.d_can1_tx */
++	P9_13_pinmux { status = "disabled"; };	/* P9_13: gpmc_wpn.uart4_txd_mux2 */
++	P9_11_pinmux { status = "disabled"; };	/* P9_11: gpmc_wait0.uart4_rxd_mux2 */
++};
++
++&bone_can_1 {
++	status = "okay";
++};
++
++&bone_uart_4 {
++	status = "okay";
++};
+diff --git a/arch/arm/boot/dts/ti/omap/BBORG_FAN-A000.dtso b/arch/arm/boot/dts/ti/omap/BBORG_FAN-A000.dtso
+new file mode 100644
+index 000000000000..fb2b4ac4e44b
+--- /dev/null
++++ b/arch/arm/boot/dts/ti/omap/BBORG_FAN-A000.dtso
+@@ -0,0 +1,16 @@
++// SPDX-License-Identifier: GPL-2.0-only
++/*
++ * Copyright (C) 2020 Robert Nelson <robercnelson@gmail.com>
++ */
++
++/dts-v1/;
++/plugin/;
++
++/*
++ * Helper to show loaded overlays under: /proc/device-tree/chosen/overlays/
++ */
++&{/chosen} {
++	overlays {
++		BBORG_FAN-A000.kernel = __TIMESTAMP__;
++	};
++};
+diff --git a/arch/arm/boot/dts/ti/omap/BONE-ADC.dtso b/arch/arm/boot/dts/ti/omap/BONE-ADC.dtso
+new file mode 100644
+index 000000000000..dafd8a26fbe0
+--- /dev/null
++++ b/arch/arm/boot/dts/ti/omap/BONE-ADC.dtso
+@@ -0,0 +1,28 @@
++// SPDX-License-Identifier: GPL-2.0-only
++/*
++ * Copyright (C) 2020 Deepak Khatri <deepaklorkhatri7@gmail.com>
++ * See Cape Interface Spec page for more info on Bone Buses
++ * https://elinux.org/Beagleboard:BeagleBone_cape_interface_spec
++ *
++ * Virtual cape for Bone ADC
++ */
++
++/dts-v1/;
++/plugin/;
++
++/*
++ * Helper to show loaded overlays under: /proc/device-tree/chosen/overlays/
++ */
++&{/chosen} {
++	overlays {
++		BONE-ADC.kernel = __TIMESTAMP__;
++	};
++};
++
++/*
++ * See these files for the phandles (&bone_*) and other bone bus nodes
++ * am335x-bbb-bone-buses.dtsi
++ */
++&bone_adc {
++	status = "okay";
++};
 diff --git a/arch/arm/boot/dts/ti/omap/Makefile b/arch/arm/boot/dts/ti/omap/Makefile
-index d2b590004fed..8cb2512c578e 100644
+index d2b590004fed..31aec0fcb90f 100644
 --- a/arch/arm/boot/dts/ti/omap/Makefile
 +++ b/arch/arm/boot/dts/ti/omap/Makefile
 @@ -1,4 +1,9 @@
@@ -59,26 +459,34 @@ index d2b590004fed..8cb2512c578e 100644
  dtb-$(CONFIG_ARCH_OMAP2) += \
  	omap2420-h4.dtb \
  	omap2420-n800.dtb \
-@@ -87,6 +92,7 @@ dtb-$(CONFIG_SOC_AM33XX) += \
+@@ -87,6 +92,14 @@ dtb-$(CONFIG_SOC_AM33XX) += \
  	am335x-base0033.dtb \
  	am335x-bone.dtb \
  	am335x-boneblack.dtb \
 +	am335x-boneblack-uboot.dtb \
++	BONE-ADC.dtbo \
++	BBORG_FAN-A000.dtbo \
++	BBORG_COMMS-00A2.dtbo \
++	BB-BONE-eMMC1-01-00A0.dtbo \
++	BB-ADC-00A0.dtbo \
++	AM57XX-PRU-UIO-00A0.dtbo \
++	AM335X-PRU-UIO-00A0.dtbo \
  	am335x-boneblack-wireless.dtb \
  	am335x-boneblue.dtb \
  	am335x-bonegreen.dtb \
 diff --git a/arch/arm/boot/dts/ti/omap/am335x-bbb-bone-buses.dtsi b/arch/arm/boot/dts/ti/omap/am335x-bbb-bone-buses.dtsi
 new file mode 100644
-index 000000000000..5fc09cbd8840
+index 000000000000..01fa6b98a655
 --- /dev/null
 +++ b/arch/arm/boot/dts/ti/omap/am335x-bbb-bone-buses.dtsi
-@@ -0,0 +1,85 @@
+@@ -0,0 +1,69 @@
 +// SPDX-License-Identifier: GPL-2.0-only
 +/*
 + * Copyright (C) 2020 Deepak Khatri <deepaklorkhatri7@gmail.com>
 + * Copyright (C) 2021 Robert Nelson <robertcnelson@gmail.com>
 + * See Cape Interface Spec page for more info on Bone Buses
 + * https://elinux.org/Beagleboard:BeagleBone_cape_interface_spec
++ * https://docs.beagleboard.io/latest/boards/capes/cape-interface-spec.html
 + */
 +
 +#include <dt-bindings/gpio/gpio.h>
@@ -96,60 +504,17 @@ index 000000000000..5fc09cbd8840
 +
 +// For compatible bone pinmuxing
 +bone_pinmux: &am33xx_pinmux {
-+	emmc_pins: emmc-pins {
++	bborg_comms_can_pins: pinmux_comms_can_pins {
 +		pinctrl-single,pins = <
-+			AM33XX_PADCONF(AM335X_PIN_GPMC_CSN1, PIN_INPUT_PULLUP, MUX_MODE2) /* gpmc_csn1.mmc1_clk */
-+			AM33XX_PADCONF(AM335X_PIN_GPMC_CSN2, PIN_INPUT_PULLUP, MUX_MODE2) /* gpmc_csn2.mmc1_cmd */
-+			AM33XX_PADCONF(AM335X_PIN_GPMC_AD0, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad0.mmc1_dat0 */
-+			AM33XX_PADCONF(AM335X_PIN_GPMC_AD1, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad1.mmc1_dat1 */
-+			AM33XX_PADCONF(AM335X_PIN_GPMC_AD2, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad2.mmc1_dat2 */
-+			AM33XX_PADCONF(AM335X_PIN_GPMC_AD3, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad3.mmc1_dat3 */
-+			AM33XX_PADCONF(AM335X_PIN_GPMC_AD4, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad4.mmc1_dat4 */
-+			AM33XX_PADCONF(AM335X_PIN_GPMC_AD5, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad5.mmc1_dat5 */
-+			AM33XX_PADCONF(AM335X_PIN_GPMC_AD6, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad6.mmc1_dat6 */
-+			AM33XX_PADCONF(AM335X_PIN_GPMC_AD7, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad7.mmc1_dat7 */
++			0x184 (PIN_INPUT_PULLUP | MUX_MODE2)	/* P9_24: uart1_txd.d_can1_rx */
++			0x180 (PIN_OUTPUT_PULLUP | MUX_MODE2)	/* P9_26: uart1_rxd.d_can1_tx */
 +		>;
 +	};
 +
-+	nxp_hdmi_bonelt_pins: nxp-hdmi-bonelt-pins {
++	bborg_comms_rs485_pins: pinmux_comms_rs485_pins {
 +		pinctrl-single,pins = <
-+			AM33XX_PADCONF(AM335X_PIN_XDMA_EVENT_INTR0, PIN_OUTPUT_PULLDOWN, MUX_MODE3)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_DATA0, PIN_OUTPUT, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_DATA1, PIN_OUTPUT, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_DATA2, PIN_OUTPUT, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_DATA3, PIN_OUTPUT, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_DATA4, PIN_OUTPUT, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_DATA5, PIN_OUTPUT, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_DATA6, PIN_OUTPUT, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_DATA7, PIN_OUTPUT, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_DATA8, PIN_OUTPUT, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_DATA9, PIN_OUTPUT, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_DATA10, PIN_OUTPUT, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_DATA11, PIN_OUTPUT, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_DATA12, PIN_OUTPUT, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_DATA13, PIN_OUTPUT, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_DATA14, PIN_OUTPUT, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_DATA15, PIN_OUTPUT, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_VSYNC, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_HSYNC, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_PCLK, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_LCD_AC_BIAS_EN, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
-+		>;
-+	};
-+
-+	nxp_hdmi_bonelt_off_pins: nxp-hdmi-bonelt-off-pins {
-+		pinctrl-single,pins = <
-+			AM33XX_PADCONF(AM335X_PIN_XDMA_EVENT_INTR0, PIN_OUTPUT_PULLDOWN, MUX_MODE3)
-+		>;
-+	};
-+
-+	mcasp0_pins: mcasp0_pins {
-+		pinctrl-single,pins = <
-+			AM33XX_PADCONF(AM335X_PIN_MCASP0_AHCLKX, PIN_INPUT_PULLUP, MUX_MODE0) /* mcasp0_ahcklx.mcasp0_ahclkx */
-+			AM33XX_PADCONF(AM335X_PIN_MCASP0_AHCLKR, PIN_OUTPUT_PULLDOWN, MUX_MODE2) /* mcasp0_ahclkr.mcasp0_axr2*/
-+			AM33XX_PADCONF(AM335X_PIN_MCASP0_FSX, PIN_OUTPUT_PULLUP, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_MCASP0_ACLKX, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
-+			AM33XX_PADCONF(AM335X_PIN_GPMC_A11, PIN_OUTPUT_PULLDOWN, MUX_MODE7) /* gpmc_a11.GPIO1_27 */
++			0x074 (PIN_OUTPUT | MUX_MODE6)	/* P9_13: gpmc_wpn.uart4_txd_mux2 */
++			0x070 (PIN_INPUT  | MUX_MODE6)	/* P9_11: gpmc_wait0.uart4_rxd_mux2 */
 +		>;
 +	};
 +};
@@ -158,11 +523,47 @@ index 000000000000..5fc09cbd8840
 +bone_adc: &tscadc {
 +
 +};
++
++// CAN
++// https://docs.beagleboard.io/latest/boards/capes/cape-interface-spec.html#can
++bone_can_1: &dcan1 {
++	symlink = "bone/can/1";
++	status = "disabled";
++	pinctrl-names = "default";
++//	pinctrl-0 = <
++//		&P9_26_can_pin /* tx */
++//		&P9_24_can_pin /* rx */
++//	>;
++	pinctrl-0 = <&bborg_comms_can_pins>;
++};
++
++// UART
++// https://docs.beagleboard.io/latest/boards/capes/cape-interface-spec.html#uart
++bone_uart_4: &uart4 {
++	symlink = "bone/uart/4";
++	status = "disabled";
++	pinctrl-names = "default";
++	pinctrl-0 = <&bborg_comms_rs485_pins>;
++	//rs485-rts-delay = <0 0>;
++	//rts-gpio = <&gpio3 19 1>; /*  GPIO_ACTIVE_HIGH>; */
++	//rs485-rts-active-high;
++	//linux,rs485-enabled-at-boot-time;
++};
+\ No newline at end of file
 diff --git a/arch/arm/boot/dts/ti/omap/am335x-bone-common.dtsi b/arch/arm/boot/dts/ti/omap/am335x-bone-common.dtsi
-index 96451c8a815c..509bd51b3e30 100644
+index 96451c8a815c..cc515a8cdb5d 100644
 --- a/arch/arm/boot/dts/ti/omap/am335x-bone-common.dtsi
 +++ b/arch/arm/boot/dts/ti/omap/am335x-bone-common.dtsi
-@@ -26,14 +26,14 @@ leds {
+@@ -3,6 +3,8 @@
+  * Copyright (C) 2012 Texas Instruments Incorporated - https://www.ti.com/
+  */
+ 
++#include "am335x-bbb-bone-buses.dtsi"
++
+ / {
+ 	cpus {
+ 		cpu@0 {
+@@ -26,14 +28,14 @@ leds {
  		compatible = "gpio-leds";
  
  		led2 {
@@ -179,7 +580,7 @@ index 96451c8a815c..509bd51b3e30 100644
  			gpios = <&gpio1 22 GPIO_ACTIVE_HIGH>;
  			linux,default-trigger = "mmc0";
  			default-state = "off";
-@@ -63,9 +63,6 @@ vmmcsd_fixed: fixedregulator0 {
+@@ -63,9 +65,6 @@ vmmcsd_fixed: fixedregulator0 {
  };
  
  &am33xx_pinmux {
@@ -189,7 +590,7 @@ index 96451c8a815c..509bd51b3e30 100644
  	user_leds_s0: user-leds-s0-pins {
  		pinctrl-single,pins = <
  			AM33XX_PADCONF(AM335X_PIN_GPMC_A5, PIN_OUTPUT_PULLDOWN, MUX_MODE7)	/* gpmc_a5.gpio1_21 */
-@@ -96,12 +93,6 @@ AM33XX_PADCONF(AM335X_PIN_UART0_TXD, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
+@@ -96,12 +95,6 @@ AM33XX_PADCONF(AM335X_PIN_UART0_TXD, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
  		>;
  	};
  
@@ -202,7 +603,7 @@ index 96451c8a815c..509bd51b3e30 100644
  	cpsw_default: cpsw-default-pins {
  		pinctrl-single,pins = <
  			/* Slave 1 */
-@@ -193,6 +184,7 @@ &uart0 {
+@@ -193,6 +186,7 @@ &uart0 {
  	pinctrl-0 = <&uart0_pins>;
  
  	status = "okay";
@@ -210,7 +611,7 @@ index 96451c8a815c..509bd51b3e30 100644
  };
  
  &usb0 {
-@@ -211,6 +203,7 @@ &i2c0 {
+@@ -211,6 +205,7 @@ &i2c0 {
  
  	status = "okay";
  	clock-frequency = <400000>;
@@ -218,7 +619,7 @@ index 96451c8a815c..509bd51b3e30 100644
  
  	tps: tps@24 {
  		reg = <0x24>;
-@@ -235,6 +228,7 @@ &i2c2 {
+@@ -235,6 +230,7 @@ &i2c2 {
  
  	status = "okay";
  	clock-frequency = <100000>;
@@ -226,7 +627,7 @@ index 96451c8a815c..509bd51b3e30 100644
  
  	cape_eeprom0: cape_eeprom0@54 {
  		compatible = "atmel,24c256";
-@@ -418,3 +412,12 @@ &pruss_tm {
+@@ -418,3 +414,12 @@ &pruss_tm {
  &wkup_m3_ipc {
  	firmware-name = "am335x-bone-scale-data.bin";
  };
@@ -538,10 +939,10 @@ index a4f5b5262645..860eeb03b70e 100644
  		compatible = "regulator-fixed";
  		regulator-name = "wlan-en-regulator";
 diff --git a/arch/arm/boot/dts/ti/omap/am335x-bonegreen.dts b/arch/arm/boot/dts/ti/omap/am335x-bonegreen.dts
-index 18cc0f49e999..62ca9c8764bd 100644
+index 18cc0f49e999..769733f0b822 100644
 --- a/arch/arm/boot/dts/ti/omap/am335x-bonegreen.dts
 +++ b/arch/arm/boot/dts/ti/omap/am335x-bonegreen.dts
-@@ -11,4 +11,9 @@
+@@ -11,4 +11,157 @@
  / {
  	model = "TI AM335x BeagleBone Green";
  	compatible = "ti,am335x-bone-green", "ti,am335x-bone-black", "ti,am335x-bone", "ti,am33xx";
@@ -550,6 +951,154 @@ index 18cc0f49e999..62ca9c8764bd 100644
 +		base_dtb = "am335x-bonegreen.dts";
 +		base_dtb_timestamp = __TIMESTAMP__;
 +	};
++};
++
++&gpio0 {
++	gpio-line-names =
++		"[mdio_data]",
++		"[mdio_clk]",
++		"P9_22 [spi0_sclk]",
++		"P9_21 [spi0_d0]",
++		"P9_18 [spi0_d1]",
++		"P9_17 [spi0_cs0]",
++		"[mmc0_cd]",
++		"P9_42A [ecappwm0]",
++		"P8_35 [lcd d12]",
++		"P8_33 [lcd d13]",
++		"P8_31 [lcd d14]",
++		"P8_32 [lcd d15]",
++		"P9_20 [i2c2_sda]",
++		"P9_19 [i2c2_scl]",
++		"P9_26 [uart1_rxd]",
++		"P9_24 [uart1_txd]",
++		"[rmii1_txd3]",
++		"[rmii1_txd2]",
++		"[usb0_drvvbus]",
++		"[hdmi cec]",
++		"P9_41B",
++		"[rmii1_txd1]",
++		"P8_19 [ehrpwm2a]",
++		"P8_13 [ehrpwm2b]",
++		"NC",
++		"NC",
++		"P8_14",
++		"P8_17",
++		"[rmii1_txd0]",
++		"[rmii1_refclk]",
++		"P9_11 [uart4_rxd]",
++		"P9_13 [uart4_txd]";
++};
++
++&gpio1 {
++	gpio-line-names =
++		"P8_25 [mmc1_dat0]",
++		"[mmc1_dat1]",
++		"P8_5 [mmc1_dat2]",
++		"P8_6 [mmc1_dat3]",
++		"P8_23 [mmc1_dat4]",
++		"P8_22 [mmc1_dat5]",
++		"P8_3 [mmc1_dat6]",
++		"P8_4 [mmc1_dat7]",
++		"NC",
++		"NC",
++		"NC",
++		"NC",
++		"P8_12",
++		"P8_11",
++		"P8_16",
++		"P8_15",
++		"P9_15A",
++		"P9_23",
++		"P9_14 [ehrpwm1a]",
++		"P9_16 [ehrpwm1b]",
++		"[emmc rst]",
++		"[usr0 led]",
++		"[usr1 led]",
++		"[usr2 led]",
++		"[usr3 led]",
++		"[hdmi irq]",
++		"[usb vbus oc]",
++		"[hdmi audio]",
++		"P9_12",
++		"P8_26",
++		"P8_21 [emmc]",
++		"P8_20 [emmc]";
++};
++
++&gpio2 {
++	gpio-line-names =
++		"P9_15B",
++		"P8_18",
++		"P8_7",
++		"P8_8",
++		"P8_10",
++		"P8_9",
++		"P8_45",
++		"P8_46",
++		"P8_43",
++		"P8_44",
++		"P8_41",
++		"P8_42",
++		"P8_39",
++		"P8_40",
++		"P8_37",
++		"P8_38",
++		"P8_36",
++		"P8_34",
++		"[rmii1_rxd3]",
++		"[rmii1_rxd2]",
++		"[rmii1_rxd1]",
++		"[rmii1_rxd0]",
++		"P8_27",
++		"P8_29",
++		"P8_28",
++		"P8_30",
++		"[mmc0_dat3]",
++		"[mmc0_dat2]",
++		"[mmc0_dat1]",
++		"[mmc0_dat0]",
++		"[mmc0_clk]",
++		"[mmc0_cmd]";
++};
++
++&gpio3 {
++	gpio-line-names =
++		"[mii col]",
++		"[mii crs]",
++		"[mii rx err]",
++		"[mii tx en]",
++		"[mii rx dv]",
++		"[i2c0 sda]",
++		"[i2c0 scl]",
++		"[jtag emu0]",
++		"[jtag emu1]",
++		"[mii tx clk]",
++		"[mii rx clk]",
++		"NC",
++		"NC",
++		"[usb vbus en]",
++		"P9_31 [spi1_sclk]",
++		"P9_29 [spi1_d0]",
++		"P9_30 [spi1_d1]",
++		"P9_28 [spi1_cs0]",
++		"P9_42B [ecappwm0]",
++		"P9_27",
++		"P9_41A",
++		"P9_25",
++		"NC",
++		"NC",
++		"NC",
++		"NC",
++		"NC",
++		"NC",
++		"NC",
++		"NC",
++		"NC",
++		"NC";
++};
++
++&baseboard_eeprom {
++	vcc-supply = <&ldo4_reg>;
  };
 diff --git a/arch/arm/boot/dts/ti/omap/am335x-osd3358-sm-red.dts b/arch/arm/boot/dts/ti/omap/am335x-osd3358-sm-red.dts
 index d28d39728847..0c8a1a1d4fa3 100644
@@ -648,6 +1197,35 @@ index 32669346cefe..4110677c43bc 100644
  };
  
  &am33xx_pinmux {
+diff --git a/arch/arm/boot/dts/ti/omap/am33xx-l4.dtsi b/arch/arm/boot/dts/ti/omap/am33xx-l4.dtsi
+index d6a143abae5f..ee795fd2832b 100644
+--- a/arch/arm/boot/dts/ti/omap/am33xx-l4.dtsi
++++ b/arch/arm/boot/dts/ti/omap/am33xx-l4.dtsi
+@@ -854,7 +854,7 @@ pruss_tm: target-module@300000 {	/* 0x4a300000, ap 9 04.0 */
+ 			#address-cells = <1>;
+ 			#size-cells = <1>;
+ 			ranges = <0x0 0x300000 0x80000>;
+-			status = "disabled";
++			status = "okay";
+ 
+ 			pruss: pruss@0 {
+ 				compatible = "ti,am3356-pruss";
+diff --git a/arch/arm/boot/dts/ti/omap/am33xx.dtsi b/arch/arm/boot/dts/ti/omap/am33xx.dtsi
+index 5b9e01a8aa5d..6657c9c4b040 100644
+--- a/arch/arm/boot/dts/ti/omap/am33xx.dtsi
++++ b/arch/arm/boot/dts/ti/omap/am33xx.dtsi
+@@ -644,6 +644,11 @@ target-module@56000000 {
+ 			 * Closed source PowerVR driver, no child device
+ 			 * binding or driver in mainline
+ 			 */
++			gpu: gpu@0 {
++				compatible = "ti,am3352-sgx530", "img,sgx530";
++				reg = <0x0 0x10000>;
++				interrupts = <37>;
++			};
+ 		};
+ 	};
+ };
 diff --git a/arch/arm/boot/dts/ti/omap/am5729-beagleboneai.dts b/arch/arm/boot/dts/ti/omap/am5729-beagleboneai.dts
 index 9a234dc1431d..6081cb88adc9 100644
 --- a/arch/arm/boot/dts/ti/omap/am5729-beagleboneai.dts
@@ -749,6 +1327,57 @@ index 0a8b16505ed9..028928f8d43e 100644
  };
  
  &tpd12s015 {
+diff --git a/arch/arm/boot/dts/ti/omap/dra7.dtsi b/arch/arm/boot/dts/ti/omap/dra7.dtsi
+index 6509c742fb58..0656e6306d03 100644
+--- a/arch/arm/boot/dts/ti/omap/dra7.dtsi
++++ b/arch/arm/boot/dts/ti/omap/dra7.dtsi
+@@ -856,6 +856,12 @@ target-module@56000000 {
+ 			#address-cells = <1>;
+ 			#size-cells = <1>;
+ 			ranges = <0 0x56000000 0x2000000>;
++
++			gpu: gpu@0 {
++				compatible = "ti,dra7-sgx544", "img,sgx544";
++				reg = <0x0 0x10000>;
++				interrupts = <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>;
++			};
+ 		};
+ 
+ 		crossbar_mpu: crossbar@4a002a48 {
+diff --git a/arch/arm/boot/dts/ti/omap/omap34xx.dtsi b/arch/arm/boot/dts/ti/omap/omap34xx.dtsi
+index fc7233ac183a..d646b61546af 100644
+--- a/arch/arm/boot/dts/ti/omap/omap34xx.dtsi
++++ b/arch/arm/boot/dts/ti/omap/omap34xx.dtsi
+@@ -170,6 +170,12 @@ sgx_module: target-module@50000000 {
+ 			 * Closed source PowerVR driver, no child device
+ 			 * binding or driver in mainline
+ 			 */
++
++			sgx: gpu@0 {
++				compatible = "ti,omap3530-sgx530", "img,sgx530";
++				reg = <0x0 0x10000>; /* 64kB */
++				interrupts = <21>;
++			};
+ 		};
+ 	};
+ 
+diff --git a/arch/arm/boot/dts/ti/omap/omap4.dtsi b/arch/arm/boot/dts/ti/omap/omap4.dtsi
+index 2bbff9032be3..a2c71e04ace2 100644
+--- a/arch/arm/boot/dts/ti/omap/omap4.dtsi
++++ b/arch/arm/boot/dts/ti/omap/omap4.dtsi
+@@ -505,6 +505,12 @@ sgx_module: target-module@56000000 {
+ 			 * Closed source PowerVR driver, no child device
+ 			 * binding or driver in mainline
+ 			 */
++
++			gpu@0 {
++				compatible = "ti,omap4430-sgx540", "img,sgx540";
++				reg = <0x0 0x2000000>; /* 32MB */
++				interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
++			};
+ 		};
+ 
+ 		/*
 diff --git a/arch/arm64/boot/dts/ti/k3-am62-main.dtsi b/arch/arm64/boot/dts/ti/k3-am62-main.dtsi
 index e5c64c86d1d5..464b7565d085 100644
 --- a/arch/arm64/boot/dts/ti/k3-am62-main.dtsi
diff --git a/patches/external/git/BBDTBS b/patches/external/git/BBDTBS
index b8132213..a0504d1b 100644
--- a/patches/external/git/BBDTBS
+++ b/patches/external/git/BBDTBS
@@ -1 +1 @@
-BBDTBS: https://openbeagle.org/beagleboard/BeagleBoard-DeviceTrees/-/commit/2baa426865df1d6f3e90bb91fa488bd168f45b75
+BBDTBS: https://openbeagle.org/beagleboard/BeagleBoard-DeviceTrees/-/commit/fb6f54ec2b36cac20da460d0e51164fa428625d6
diff --git a/patches/get_debian_configs.sh b/patches/get_debian_configs.sh
index dfa25628..6daf0d1f 100755
--- a/patches/get_debian_configs.sh
+++ b/patches/get_debian_configs.sh
@@ -3,8 +3,8 @@
 #
 #https://packages.debian.org/source/sid/linux
 #
-abi="6.6.9"
-kernel="6.6.9-1"
+abi="6.6.11"
+kernel="6.6.11-1"
 #
 
 debian_site="http://ftp.us.debian.org/debian/pool/main/l/linux"
diff --git a/repo_maintenance/push-kernel-n-test.sh b/repo_maintenance/push-kernel-n-test.sh
index e3a02171..ea58a28e 100755
--- a/repo_maintenance/push-kernel-n-test.sh
+++ b/repo_maintenance/push-kernel-n-test.sh
@@ -18,10 +18,6 @@ cat_files () {
 		cat ./patches/external/git/WIRELESS_REGDB >> ${wfile}
 	fi
 
-	if [ -f ./patches/external/git/KSMBD ] ; then
-		cat ./patches/external/git/KSMBD >> ${wfile}
-	fi
-
 	if [ -f ./patches/external/git/TI_AMX3_CM3 ] ; then
 		cat ./patches/external/git/TI_AMX3_CM3 >> ${wfile}
 	fi
diff --git a/repo_maintenance/push-n-tag-release.sh b/repo_maintenance/push-n-tag-release.sh
index 9451c364..4eb1ec22 100755
--- a/repo_maintenance/push-n-tag-release.sh
+++ b/repo_maintenance/push-n-tag-release.sh
@@ -18,10 +18,6 @@ cat_files () {
 		cat ./patches/external/git/WIRELESS_REGDB >> ${wfile}
 	fi
 
-	if [ -f ./patches/external/git/KSMBD ] ; then
-		cat ./patches/external/git/KSMBD >> ${wfile}
-	fi
-
 	if [ -f ./patches/external/git/TI_AMX3_CM3 ] ; then
 		cat ./patches/external/git/TI_AMX3_CM3 >> ${wfile}
 	fi
diff --git a/tools/host_det.sh b/tools/host_det.sh
index 577a48d0..cbdba7d0 100755
--- a/tools/host_det.sh
+++ b/tools/host_det.sh
@@ -447,6 +447,11 @@ debian_regs () {
 			#http://packages.linuxmint.com/index.php
 			deb_distro="jammy"
 			;;
+		virginia)
+			#21.3
+			#http://packages.linuxmint.com/index.php
+			deb_distro="jammy"
+			;;
 		esac
 
 		#Devuan: Compatibility Matrix
diff --git a/version.sh b/version.sh
index 4048f932..e2f4fc37 100644
--- a/version.sh
+++ b/version.sh
@@ -47,7 +47,7 @@ KERNEL_REL=6.7
 KERNEL_TAG=${KERNEL_REL}
 kernel_rt="-rt6"
 #Kernel Build
-BUILD=${build_prefix}15
+BUILD=${build_prefix}15.1
 
 #v6.X-rcX + upto SHA
 #prev_KERNEL_SHA=""
-- 
GitLab