[openwrt/openwrt] bcm27xx: update 6.1 patches from RPi foundation

LEDE Commits lede-commits at lists.infradead.org
Sun Apr 7 13:14:00 PDT 2024


noltari pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/20fe7e687e59bdc787362585f154a71227add004

commit 20fe7e687e59bdc787362585f154a71227add004
Author: Álvaro Fernández Rojas <noltari at gmail.com>
AuthorDate: Sat Apr 6 17:30:49 2024 +0200

    bcm27xx: update 6.1 patches from RPi foundation
    
    Sync 6.1 patches with the RPi foundation.
    Since rpi-6.6.y is now the main branch of the RPi foundation, there won't be
    any new patches for linux 6.1.
    
    Signed-off-by: Álvaro Fernández Rojas <noltari at gmail.com>
---
 target/linux/bcm27xx/bcm2708/config-6.1            |   3 +
 target/linux/bcm27xx/bcm2709/config-6.1            |   3 +
 target/linux/bcm27xx/bcm2710/config-6.1            |   3 +
 target/linux/bcm27xx/bcm2711/config-6.1            |   3 +
 target/linux/bcm27xx/bcm2712/config-6.1            |   3 +
 ...-v3d-Improve-MMU-support-for-larger-pages.patch |  64 ---
 ...-i2c-designware-Look-for-CNT-values-in-DT.patch |  57 ---
 .../950-1227-dts-rp1-Add-I2C-timings.patch         | 103 -----
 ...imise-vc4_hvs_dlist_free_work-to-only-rea.patch |  45 +++
 ...sh-stale-dlist-entries-if-allocation-fail.patch |  69 ++++
 ...-t-export-the-button-GPIO-via-sysfs-GPIO-.patch |  55 +++
 ...d-out-the-SPI-speed-to-use-from-the-Devic.patch |  94 +++++
 ...-the-spi-speed-hz-for-Pisound-in-the-Devi.patch | 129 ++++++
 ...-on-backup-switchover-mode-overlay-value-.patch |  51 +++
 ...-the-improvement-on-backup-switchover-mod.patch |  30 ++
 ...bit-dma-overlay-pi5-to-enable-32bit-DMA-o.patch |  85 ++++
 ...ignware-Use-SCL-rise-and-fall-times-in-DT.patch |  91 +++++
 ...esignware-Support-non-standard-bus-speeds.patch |  80 ++++
 .../950-1259-ARM-dts-rp1-Add-I2C-timings.patch     |  78 ++++
 ...mu-bcm2712-don-t-allow-building-as-module.patch |  28 ++
 ...-rp1-depends-on-instead-of-select-MFD_RP1.patch |  59 +++
 .../950-1262-Update-touch-PiTFT-overlays.patch     | 435 +++++++++++++++++++++
 ...-ARM-dts-rp1-Boost-the-I2C-drive-strength.patch |  95 +++++
 ...-ARM-dts-rp1-Add-a-safe-I2C-SDA-hold-time.patch |  75 ++++
 ...s-fix-16bit-sample-support-in-clock-consu.patch |  33 ++
 ...upport-for-AMP4-Pro-to-the-DAC-Plus-drive.patch | 114 ++++++
 ...rlays-adds-support-for-Hifiberry-AMP4-Pro.patch | 130 ++++++
 ...sADCPro-fix-16bit-sample-support-in-clock.patch |  38 ++
 ...-overlays-Correct-some-compatible-strings.patch |  72 ++++
 ...verlays-Delete-deprecated-overlay-mpu6050.patch |  57 +++
 ...ia-cfe-Increase-default-size-of-embedded-.patch |  36 ++
 ...-sc16is7xx-Don-t-spin-if-no-data-received.patch |  26 ++
 ...river-support-for-Interlude-Audio-Digital.patch | 196 ++++++++++
 ...s-needed-for-Interlude-Audio-Digital-and-.patch | 179 +++++++++
 ...v3d-Enable-V3D-to-use-different-PAGE_SIZE.patch | 118 ++++++
 ...ays-adau1977-adc-Replace-use-of-i2c-label.patch |  25 ++
 ...1281-Add-IQaudio-CodecZero-to-hat_map.dts.patch |  24 ++
 ...HiFiBerry-DAC8X-to-the-simple-card-driver.patch |  82 ++++
 ...d-definitions-for-HiFiBerry-8-channel-DAC.patch | 113 ++++++
 ...hvs-Fix-lbm-size-calculation-for-yuv-6012.patch |  31 ++
 ...iver-add-waveshare-4inch-dsi-lcd-C-driver.patch |  41 ++
 ...y-add-waveshare-4inch-dsi-lcd-C-dtoverlay.patch |  22 ++
 ...ix-waveshare-11.9inch-touch-orientation-e.patch |  22 ++
 ...dd-waveshare-4inch-dsi-lcd-C-parameters-t.patch |  21 +
 ...d-specific-clk-producer-consumer-overlays.patch | 223 +++++++++++
 ...1291-overlays-hat_map-Add-Hifiberry-cards.patch |  96 +++++
 ...bit-sample-support-for-Hifiberry-DACplusA.patch |  31 ++
 ...ts-i2s_clk_producer-as-default-for-Hifibe.patch |  79 ++++
 ...mx477-make-trigger-mode-more-configurable.patch |  77 ++++
 ...te-device-tree-overlays-to-support-trigge.patch | 129 ++++++
 50 files changed, 3529 insertions(+), 224 deletions(-)

diff --git a/target/linux/bcm27xx/bcm2708/config-6.1 b/target/linux/bcm27xx/bcm2708/config-6.1
index af5d0183ec..d874eb9f8a 100644
--- a/target/linux/bcm27xx/bcm2708/config-6.1
+++ b/target/linux/bcm27xx/bcm2708/config-6.1
@@ -169,6 +169,7 @@ CONFIG_FW_CACHE=y
 CONFIG_FW_LOADER_PAGED_BUF=y
 CONFIG_FW_LOADER_SYSFS=y
 CONFIG_GCC11_NO_ARRAY_BOUNDS=y
+CONFIG_GCC_ASM_GOTO_OUTPUT_WORKAROUND=y
 CONFIG_GENERIC_ALLOCATOR=y
 CONFIG_GENERIC_BUG=y
 CONFIG_GENERIC_CLOCKEVENTS=y
@@ -229,6 +230,7 @@ CONFIG_LOGO_LINUX_CLUT224=y
 # CONFIG_LOGO_LINUX_VGA16 is not set
 CONFIG_MAC_PARTITION=y
 CONFIG_MAGIC_SYSRQ=y
+CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1f6
 CONFIG_MAILBOX=y
 # CONFIG_MAILBOX_TEST is not set
 CONFIG_MDIO_BUS=y
@@ -290,6 +292,7 @@ CONFIG_PAGE_SIZE_LESS_THAN_64KB=y
 CONFIG_PERF_USE_VMALLOC=y
 CONFIG_PGTABLE_LEVELS=2
 CONFIG_PHYLIB=y
+CONFIG_PHYLIB_LEDS=y
 CONFIG_PINCTRL=y
 CONFIG_PINCTRL_BCM2835=y
 CONFIG_PM=y
diff --git a/target/linux/bcm27xx/bcm2709/config-6.1 b/target/linux/bcm27xx/bcm2709/config-6.1
index 58d695cff3..4dcca5dd04 100644
--- a/target/linux/bcm27xx/bcm2709/config-6.1
+++ b/target/linux/bcm27xx/bcm2709/config-6.1
@@ -206,6 +206,7 @@ CONFIG_FW_CACHE=y
 CONFIG_FW_LOADER_PAGED_BUF=y
 CONFIG_FW_LOADER_SYSFS=y
 CONFIG_GCC11_NO_ARRAY_BOUNDS=y
+CONFIG_GCC_ASM_GOTO_OUTPUT_WORKAROUND=y
 CONFIG_GENERIC_ALLOCATOR=y
 CONFIG_GENERIC_ARCH_TOPOLOGY=y
 CONFIG_GENERIC_BUG=y
@@ -287,6 +288,7 @@ CONFIG_LOGO_LINUX_CLUT224=y
 # CONFIG_LOGO_LINUX_VGA16 is not set
 CONFIG_MAC_PARTITION=y
 CONFIG_MAGIC_SYSRQ=y
+CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1f6
 CONFIG_MAILBOX=y
 # CONFIG_MAILBOX_TEST is not set
 CONFIG_MDIO_BCM_UNIMAC=y
@@ -367,6 +369,7 @@ CONFIG_PCI_MSI_IRQ_DOMAIN=y
 CONFIG_PERF_USE_VMALLOC=y
 CONFIG_PGTABLE_LEVELS=3
 CONFIG_PHYLIB=y
+CONFIG_PHYLIB_LEDS=y
 CONFIG_PHYS_ADDR_T_64BIT=y
 CONFIG_PINCTRL=y
 CONFIG_PINCTRL_BCM2835=y
diff --git a/target/linux/bcm27xx/bcm2710/config-6.1 b/target/linux/bcm27xx/bcm2710/config-6.1
index e5b357f2fa..8f262671c7 100644
--- a/target/linux/bcm27xx/bcm2710/config-6.1
+++ b/target/linux/bcm27xx/bcm2710/config-6.1
@@ -213,6 +213,7 @@ CONFIG_FW_CACHE=y
 CONFIG_FW_LOADER_PAGED_BUF=y
 CONFIG_FW_LOADER_SYSFS=y
 CONFIG_GCC11_NO_ARRAY_BOUNDS=y
+CONFIG_GCC_ASM_GOTO_OUTPUT_WORKAROUND=y
 CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_REGS=y
 CONFIG_GENERIC_ALLOCATOR=y
 CONFIG_GENERIC_ARCH_TOPOLOGY=y
@@ -286,6 +287,7 @@ CONFIG_LOGO_LINUX_CLUT224=y
 # CONFIG_LOGO_LINUX_VGA16 is not set
 CONFIG_MAC_PARTITION=y
 CONFIG_MAGIC_SYSRQ=y
+CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1f6
 CONFIG_MAILBOX=y
 # CONFIG_MAILBOX_TEST is not set
 CONFIG_MDIO_BUS=y
@@ -358,6 +360,7 @@ CONFIG_PCI_MSI=y
 CONFIG_PCI_MSI_IRQ_DOMAIN=y
 CONFIG_PGTABLE_LEVELS=3
 CONFIG_PHYLIB=y
+CONFIG_PHYLIB_LEDS=y
 CONFIG_PHYS_ADDR_T_64BIT=y
 CONFIG_PINCTRL=y
 CONFIG_PINCTRL_BCM2835=y
diff --git a/target/linux/bcm27xx/bcm2711/config-6.1 b/target/linux/bcm27xx/bcm2711/config-6.1
index 2feb6e9aea..1556ae5593 100644
--- a/target/linux/bcm27xx/bcm2711/config-6.1
+++ b/target/linux/bcm27xx/bcm2711/config-6.1
@@ -213,6 +213,7 @@ CONFIG_FW_CACHE=y
 CONFIG_FW_LOADER_PAGED_BUF=y
 CONFIG_FW_LOADER_SYSFS=y
 CONFIG_GCC11_NO_ARRAY_BOUNDS=y
+CONFIG_GCC_ASM_GOTO_OUTPUT_WORKAROUND=y
 CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_REGS=y
 CONFIG_GENERIC_ALLOCATOR=y
 CONFIG_GENERIC_ARCH_TOPOLOGY=y
@@ -287,6 +288,7 @@ CONFIG_LOGO_LINUX_CLUT224=y
 # CONFIG_LOGO_LINUX_VGA16 is not set
 CONFIG_MAC_PARTITION=y
 CONFIG_MAGIC_SYSRQ=y
+CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1f6
 CONFIG_MAILBOX=y
 # CONFIG_MAILBOX_TEST is not set
 CONFIG_MDIO_BCM_UNIMAC=y
@@ -362,6 +364,7 @@ CONFIG_PCI_MSI=y
 CONFIG_PCI_MSI_IRQ_DOMAIN=y
 CONFIG_PGTABLE_LEVELS=3
 CONFIG_PHYLIB=y
+CONFIG_PHYLIB_LEDS=y
 CONFIG_PHYS_ADDR_T_64BIT=y
 CONFIG_PINCTRL=y
 CONFIG_PINCTRL_BCM2835=y
diff --git a/target/linux/bcm27xx/bcm2712/config-6.1 b/target/linux/bcm27xx/bcm2712/config-6.1
index ddd29f78fb..ed2b623cfe 100644
--- a/target/linux/bcm27xx/bcm2712/config-6.1
+++ b/target/linux/bcm27xx/bcm2712/config-6.1
@@ -256,6 +256,7 @@ CONFIG_FW_CACHE=y
 CONFIG_FW_LOADER_PAGED_BUF=y
 CONFIG_FW_LOADER_SYSFS=y
 CONFIG_GCC11_NO_ARRAY_BOUNDS=y
+CONFIG_GCC_ASM_GOTO_OUTPUT_WORKAROUND=y
 CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_REGS=y
 CONFIG_GENERIC_ALLOCATOR=y
 CONFIG_GENERIC_ARCH_TOPOLOGY=y
@@ -360,6 +361,7 @@ CONFIG_MACB_PCI=y
 CONFIG_MACB_USE_HWSTAMP=y
 CONFIG_MAC_PARTITION=y
 CONFIG_MAGIC_SYSRQ=y
+CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1f6
 CONFIG_MAILBOX=y
 # CONFIG_MAILBOX_TEST is not set
 CONFIG_MDIO_BCM_UNIMAC=y
@@ -460,6 +462,7 @@ CONFIG_PCI_MSI_IRQ_DOMAIN=y
 CONFIG_PCI_STUB=y
 CONFIG_PGTABLE_LEVELS=3
 CONFIG_PHYLIB=y
+CONFIG_PHYLIB_LEDS=y
 CONFIG_PHYLINK=y
 CONFIG_PHYS_ADDR_T_64BIT=y
 # CONFIG_PHY_BRCM_SATA is not set
diff --git a/target/linux/bcm27xx/patches-6.1/950-0905-drm-v3d-Improve-MMU-support-for-larger-pages.patch b/target/linux/bcm27xx/patches-6.1/950-0905-drm-v3d-Improve-MMU-support-for-larger-pages.patch
deleted file mode 100644
index 3c53996ff0..0000000000
--- a/target/linux/bcm27xx/patches-6.1/950-0905-drm-v3d-Improve-MMU-support-for-larger-pages.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-From 12c7ea43b930976f35ce75d11fd3f55438868e13 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil at raspberrypi.com>
-Date: Fri, 4 Aug 2023 11:26:10 +0100
-Subject: [PATCH] drm/v3d: Improve MMU support for larger pages
-
-The built-in MMU driver went most of the way towards supporting larger
-kernel pages, but dropped the ball when it comes to calculating indexes
-into the page table. Fix it.
-
-Signed-off-by: Phil Elwell <phil at raspberrypi.com>
----
- drivers/gpu/drm/v3d/v3d_mmu.c | 15 ++++++++-------
- 1 file changed, 8 insertions(+), 7 deletions(-)
-
---- a/drivers/gpu/drm/v3d/v3d_mmu.c
-+++ b/drivers/gpu/drm/v3d/v3d_mmu.c
-@@ -22,6 +22,7 @@
- #include "v3d_regs.h"
- 
- #define V3D_MMU_PAGE_SHIFT 12
-+#define V3D_PAGE_FACTOR (PAGE_SIZE >> V3D_MMU_PAGE_SHIFT)
- 
- /* Note: All PTEs for the 1MB superpage must be filled with the
-  * superpage bit set.
-@@ -88,7 +89,7 @@ void v3d_mmu_insert_ptes(struct v3d_bo *
- {
- 	struct drm_gem_shmem_object *shmem_obj = &bo->base;
- 	struct v3d_dev *v3d = to_v3d_dev(shmem_obj->base.dev);
--	u32 page = bo->node.start;
-+	u32 page = bo->node.start * V3D_PAGE_FACTOR;
- 	u32 page_prot = V3D_PTE_WRITEABLE | V3D_PTE_VALID;
- 	struct sg_dma_page_iter dma_iter;
- 
-@@ -98,13 +99,13 @@ void v3d_mmu_insert_ptes(struct v3d_bo *
- 		u32 pte = page_prot | page_address;
- 		u32 i;
- 
--		BUG_ON(page_address + (PAGE_SIZE >> V3D_MMU_PAGE_SHIFT) >=
-+		BUG_ON(page_address + V3D_PAGE_FACTOR >=
- 		       BIT(24));
--		for (i = 0; i < PAGE_SIZE >> V3D_MMU_PAGE_SHIFT; i++)
-+		for (i = 0; i < V3D_PAGE_FACTOR; i++)
- 			v3d->pt[page++] = pte + i;
- 	}
- 
--	WARN_ON_ONCE(page - bo->node.start !=
-+	WARN_ON_ONCE(page - (bo->node.start * V3D_PAGE_FACTOR) !=
- 		     shmem_obj->base.size >> V3D_MMU_PAGE_SHIFT);
- 
- 	if (v3d_mmu_flush_all(v3d))
-@@ -115,10 +116,10 @@ void v3d_mmu_remove_ptes(struct v3d_bo *
- {
- 	struct v3d_dev *v3d = to_v3d_dev(bo->base.base.dev);
- 	u32 npages = bo->base.base.size >> V3D_MMU_PAGE_SHIFT;
--	u32 page;
-+	u32 page = bo->node.start * V3D_PAGE_FACTOR;
- 
--	for (page = bo->node.start; page < bo->node.start + npages; page++)
--		v3d->pt[page] = 0;
-+	while (npages--)
-+		v3d->pt[page++] = 0;
- 
- 	if (v3d_mmu_flush_all(v3d))
- 		dev_err(v3d->drm.dev, "MMU flush timeout\n");
diff --git a/target/linux/bcm27xx/patches-6.1/950-1226-i2c-designware-Look-for-CNT-values-in-DT.patch b/target/linux/bcm27xx/patches-6.1/950-1226-i2c-designware-Look-for-CNT-values-in-DT.patch
deleted file mode 100644
index ccba16ad8e..0000000000
--- a/target/linux/bcm27xx/patches-6.1/950-1226-i2c-designware-Look-for-CNT-values-in-DT.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From 0a09088e24c013ef608b1bb79501ef890cefc767 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil at raspberrypi.com>
-Date: Tue, 19 Dec 2023 11:16:25 +0000
-Subject: [PATCH] i2c: designware: Look for *CNT values in DT
-
-The i2c-designware driver supports reading precise timing values from
-ACPI, but the Device Tree support relies on a combination of standard
-rise and fall times and hard-coded minimum timings. The result of this
-is that it is difficult to get optimum timings, particularly given that
-the values are bus speed-specific and only one set can be stored in
-DT at a time.
-
-Add support for initialisation from DT that is similar to that for
-ACPI.
-
-Signed-off-by: Phil Elwell <phil at raspberrypi.com>
----
- drivers/i2c/busses/i2c-designware-platdrv.c | 18 ++++++++++++++++++
- 1 file changed, 18 insertions(+)
-
---- a/drivers/i2c/busses/i2c-designware-platdrv.c
-+++ b/drivers/i2c/busses/i2c-designware-platdrv.c
-@@ -132,9 +132,18 @@ static int mscc_twi_set_sda_hold_time(st
- 	return 0;
- }
- 
-+static void dw_i2c_read_of_cnt(struct device_node *np, const char *name, u16 *pval)
-+{
-+	u32 val;
-+
-+	if (!of_property_read_u32(np, name, &val))
-+		*pval = (u16)val;
-+}
-+
- static int dw_i2c_of_configure(struct platform_device *pdev)
- {
- 	struct dw_i2c_dev *dev = platform_get_drvdata(pdev);
-+	struct device_node *np = pdev->dev.of_node;
- 
- 	switch (dev->flags & MODEL_MASK) {
- 	case MODEL_MSCC_OCELOT:
-@@ -146,6 +155,15 @@ static int dw_i2c_of_configure(struct pl
- 		break;
- 	}
- 
-+	dw_i2c_read_of_cnt(np, "snps,ss_hcnt", &dev->ss_hcnt);
-+	dw_i2c_read_of_cnt(np, "snps,ss_lcnt", &dev->ss_lcnt);
-+	dw_i2c_read_of_cnt(np, "snps,fs_hcnt", &dev->fs_hcnt);
-+	dw_i2c_read_of_cnt(np, "snps,fs_lcnt", &dev->fs_lcnt);
-+	dw_i2c_read_of_cnt(np, "snps,fp_hcnt", &dev->fp_hcnt);
-+	dw_i2c_read_of_cnt(np, "snps,fp_lcnt", &dev->fp_lcnt);
-+	dw_i2c_read_of_cnt(np, "snps,hs_hcnt", &dev->hs_hcnt);
-+	dw_i2c_read_of_cnt(np, "snps,hs_lcnt", &dev->hs_lcnt);
-+
- 	return 0;
- }
- 
diff --git a/target/linux/bcm27xx/patches-6.1/950-1227-dts-rp1-Add-I2C-timings.patch b/target/linux/bcm27xx/patches-6.1/950-1227-dts-rp1-Add-I2C-timings.patch
deleted file mode 100644
index 892f31ec9f..0000000000
--- a/target/linux/bcm27xx/patches-6.1/950-1227-dts-rp1-Add-I2C-timings.patch
+++ /dev/null
@@ -1,103 +0,0 @@
-From 660d569b1a623e4b64350e608bbf8bc2cc6332e9 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil at raspberrypi.com>
-Date: Tue, 19 Dec 2023 11:27:20 +0000
-Subject: [PATCH] dts: rp1: Add I2C timings
-
-Signed-off-by: Phil Elwell <phil at raspberrypi.com>
----
- arch/arm/boot/dts/rp1.dtsi | 42 ++++++++++++++++++++++++++++++++++++++
- 1 file changed, 42 insertions(+)
-
---- a/arch/arm/boot/dts/rp1.dtsi
-+++ b/arch/arm/boot/dts/rp1.dtsi
-@@ -305,6 +305,12 @@
- 			compatible = "snps,designware-i2c";
- 			interrupts = <RP1_INT_I2C0 IRQ_TYPE_LEVEL_HIGH>;
- 			clocks = <&rp1_clocks RP1_CLK_SYS>;
-+			snps,ss_hcnt = <978>;
-+			snps,ss_lcnt = <990>;
-+			snps,fs_hcnt = <200>;
-+			snps,fs_lcnt = <268>;
-+			snps,fp_hcnt = <60>;
-+			snps,fp_lcnt = <107>;
- 			status = "disabled";
- 		};
- 
-@@ -313,6 +319,12 @@
- 			compatible = "snps,designware-i2c";
- 			interrupts = <RP1_INT_I2C1 IRQ_TYPE_LEVEL_HIGH>;
- 			clocks = <&rp1_clocks RP1_CLK_SYS>;
-+			snps,ss_hcnt = <978>;
-+			snps,ss_lcnt = <990>;
-+			snps,fs_hcnt = <200>;
-+			snps,fs_lcnt = <268>;
-+			snps,fp_hcnt = <60>;
-+			snps,fp_lcnt = <107>;
- 			status = "disabled";
- 		};
- 
-@@ -321,6 +333,12 @@
- 			compatible = "snps,designware-i2c";
- 			interrupts = <RP1_INT_I2C2 IRQ_TYPE_LEVEL_HIGH>;
- 			clocks = <&rp1_clocks RP1_CLK_SYS>;
-+			snps,ss_hcnt = <978>;
-+			snps,ss_lcnt = <990>;
-+			snps,fs_hcnt = <200>;
-+			snps,fs_lcnt = <268>;
-+			snps,fp_hcnt = <60>;
-+			snps,fp_lcnt = <107>;
- 			status = "disabled";
- 		};
- 
-@@ -329,6 +347,12 @@
- 			compatible = "snps,designware-i2c";
- 			interrupts = <RP1_INT_I2C3 IRQ_TYPE_LEVEL_HIGH>;
- 			clocks = <&rp1_clocks RP1_CLK_SYS>;
-+			snps,ss_hcnt = <978>;
-+			snps,ss_lcnt = <990>;
-+			snps,fs_hcnt = <200>;
-+			snps,fs_lcnt = <268>;
-+			snps,fp_hcnt = <60>;
-+			snps,fp_lcnt = <107>;
- 			status = "disabled";
- 		};
- 
-@@ -337,6 +361,12 @@
- 			compatible = "snps,designware-i2c";
- 			interrupts = <RP1_INT_I2C4 IRQ_TYPE_LEVEL_HIGH>;
- 			clocks = <&rp1_clocks RP1_CLK_SYS>;
-+			snps,ss_hcnt = <978>;
-+			snps,ss_lcnt = <990>;
-+			snps,fs_hcnt = <200>;
-+			snps,fs_lcnt = <268>;
-+			snps,fp_hcnt = <60>;
-+			snps,fp_lcnt = <107>;
- 			status = "disabled";
- 		};
- 
-@@ -345,6 +375,12 @@
- 			compatible = "snps,designware-i2c";
- 			interrupts = <RP1_INT_I2C5 IRQ_TYPE_LEVEL_HIGH>;
- 			clocks = <&rp1_clocks RP1_CLK_SYS>;
-+			snps,ss_hcnt = <978>;
-+			snps,ss_lcnt = <990>;
-+			snps,fs_hcnt = <200>;
-+			snps,fs_lcnt = <268>;
-+			snps,fp_hcnt = <60>;
-+			snps,fp_lcnt = <107>;
- 			status = "disabled";
- 		};
- 
-@@ -353,6 +389,12 @@
- 			compatible = "snps,designware-i2c";
- 			interrupts = <RP1_INT_I2C6 IRQ_TYPE_LEVEL_HIGH>;
- 			clocks = <&rp1_clocks RP1_CLK_SYS>;
-+			snps,ss_hcnt = <978>;
-+			snps,ss_lcnt = <990>;
-+			snps,fs_hcnt = <200>;
-+			snps,fs_lcnt = <268>;
-+			snps,fp_hcnt = <60>;
-+			snps,fp_lcnt = <107>;
- 			status = "disabled";
- 		};
- 
diff --git a/target/linux/bcm27xx/patches-6.1/950-1247-drm-vc4-Optimise-vc4_hvs_dlist_free_work-to-only-rea.patch b/target/linux/bcm27xx/patches-6.1/950-1247-drm-vc4-Optimise-vc4_hvs_dlist_free_work-to-only-rea.patch
new file mode 100644
index 0000000000..1e2893381d
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1247-drm-vc4-Optimise-vc4_hvs_dlist_free_work-to-only-rea.patch
@@ -0,0 +1,45 @@
+From d8e53e0b83c947123c38c81d2fb5162c86d26fb5 Mon Sep 17 00:00:00 2001
+From: Dave Stevenson <dave.stevenson at raspberrypi.com>
+Date: Thu, 4 Jan 2024 12:39:33 +0000
+Subject: [PATCH 1247/1295] drm/vc4: Optimise vc4_hvs_dlist_free_work to only
+ read frcnt and active once
+
+vc4_hvs_dlist_free_work was iterating through the list of stale
+dlist entries and reading the frame count and active flags from
+the hardware for each one.
+
+Read the frame count and active flags once, and then use the
+cached value in the loop.
+
+Signed-off-by: Dave Stevenson <dave.stevenson at raspberrypi.com>
+---
+ drivers/gpu/drm/vc4/vc4_hvs.c | 15 ++++++++++-----
+ 1 file changed, 10 insertions(+), 5 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_hvs.c
++++ b/drivers/gpu/drm/vc4/vc4_hvs.c
+@@ -796,14 +796,19 @@ static void vc4_hvs_dlist_free_work(stru
+ 	struct vc4_hvs *hvs = container_of(work, struct vc4_hvs, free_dlist_work);
+ 	struct vc4_hvs_dlist_allocation *cur, *next;
+ 	unsigned long flags;
++	bool active[3];
++	u8 frcnt[3];
++	int i;
++
+ 
+ 	spin_lock_irqsave(&hvs->mm_lock, flags);
++	for (i = 0; i < 3; i++) {
++		frcnt[i] = vc4_hvs_get_fifo_frame_count(hvs, i);
++		active[i] = vc4_hvs_check_channel_active(hvs, i);
++	}
+ 	list_for_each_entry_safe(cur, next, &hvs->stale_dlist_entries, node) {
+-		u8 frcnt;
+-
+-		frcnt = vc4_hvs_get_fifo_frame_count(hvs, cur->channel);
+-		if (vc4_hvs_check_channel_active(hvs, cur->channel) &&
+-		    !vc4_hvs_frcnt_lte(cur->target_frame_count, frcnt))
++		if (active[cur->channel] &&
++		    !vc4_hvs_frcnt_lte(cur->target_frame_count, frcnt[cur->channel]))
+ 			continue;
+ 
+ 		vc4_hvs_free_dlist_entry_locked(hvs, cur);
diff --git a/target/linux/bcm27xx/patches-6.1/950-1248-drm-vc4-Flush-stale-dlist-entries-if-allocation-fail.patch b/target/linux/bcm27xx/patches-6.1/950-1248-drm-vc4-Flush-stale-dlist-entries-if-allocation-fail.patch
new file mode 100644
index 0000000000..27497483da
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1248-drm-vc4-Flush-stale-dlist-entries-if-allocation-fail.patch
@@ -0,0 +1,69 @@
+From c0d4ab94e37991db311b0d4e955a349e359fc73a Mon Sep 17 00:00:00 2001
+From: Dave Stevenson <dave.stevenson at raspberrypi.com>
+Date: Wed, 17 Jan 2024 18:36:11 +0000
+Subject: [PATCH 1248/1295] drm/vc4: Flush stale dlist entries if allocation
+ fails
+
+This is largely for debug at present.
+For reasons unknown we are not getting the end of frame interrupts
+that should trigger a sweep of stale dlist entries.
+
+On allocation failure clear out ALL stale entries, and retry the
+allocation. Log the interrupt status so we have debug regarding
+whether the HVS believes the interrupt is enabled.
+
+Signed-off-by: Dave Stevenson <dave.stevenson at raspberrypi.com>
+---
+ drivers/gpu/drm/vc4/vc4_hvs.c | 27 ++++++++++++++++++++++++---
+ 1 file changed, 24 insertions(+), 3 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_hvs.c
++++ b/drivers/gpu/drm/vc4/vc4_hvs.c
+@@ -634,6 +634,9 @@ static void vc4_hvs_irq_clear_eof(struct
+ 	hvs->eof_irq[channel].enabled = false;
+ }
+ 
++static void vc4_hvs_free_dlist_entry_locked(struct vc4_hvs *hvs,
++					    struct vc4_hvs_dlist_allocation *alloc);
++
+ static struct vc4_hvs_dlist_allocation *
+ vc4_hvs_alloc_dlist_entry(struct vc4_hvs *hvs,
+ 			  unsigned int channel,
+@@ -642,6 +645,7 @@ vc4_hvs_alloc_dlist_entry(struct vc4_hvs
+ 	struct vc4_dev *vc4 = hvs->vc4;
+ 	struct drm_device *dev = &vc4->base;
+ 	struct vc4_hvs_dlist_allocation *alloc;
++	struct vc4_hvs_dlist_allocation *cur, *next;
+ 	unsigned long flags;
+ 	int ret;
+ 
+@@ -659,9 +663,26 @@ vc4_hvs_alloc_dlist_entry(struct vc4_hvs
+ 				 dlist_count);
+ 	spin_unlock_irqrestore(&hvs->mm_lock, flags);
+ 	if (ret) {
+-		drm_err(dev, "Failed to allocate DLIST entry. Requested size=%zu. ret=%d\n",
+-			dlist_count, ret);
+-		return ERR_PTR(ret);
++		drm_err(dev, "Failed to allocate DLIST entry. Requested size=%zu. ret=%d. DISPCTRL is %08x\n",
++			dlist_count, ret, HVS_READ(SCALER_DISPCTRL));
++
++		/* This should never happen as stale entries should get released
++		 * as the frame counter interrupt triggers.
++		 * However we've seen this fail for reasons currently unknown.
++		 * Free all stale entries now so we should be able to complete
++		 * this allocation.
++		 */
++		spin_lock_irqsave(&hvs->mm_lock, flags);
++		list_for_each_entry_safe(cur, next, &hvs->stale_dlist_entries, node) {
++			vc4_hvs_free_dlist_entry_locked(hvs, cur);
++		}
++
++		ret = drm_mm_insert_node(&hvs->dlist_mm, &alloc->mm_node,
++					 dlist_count);
++		spin_unlock_irqrestore(&hvs->mm_lock, flags);
++
++		if (ret)
++			return ERR_PTR(ret);
+ 	}
+ 
+ 	alloc->channel = channel;
diff --git a/target/linux/bcm27xx/patches-6.1/950-1249-Pisound-Don-t-export-the-button-GPIO-via-sysfs-GPIO-.patch b/target/linux/bcm27xx/patches-6.1/950-1249-Pisound-Don-t-export-the-button-GPIO-via-sysfs-GPIO-.patch
new file mode 100644
index 0000000000..73f308bba3
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1249-Pisound-Don-t-export-the-button-GPIO-via-sysfs-GPIO-.patch
@@ -0,0 +1,55 @@
+From cd62562b276b5724d1c75ea1465937a5bd9037db Mon Sep 17 00:00:00 2001
+From: Giedrius <giedrius at blokas.io>
+Date: Fri, 19 Jan 2024 10:55:55 +0000
+Subject: [PATCH 1249/1295] Pisound: Don't export the button GPIO via sysfs
+ GPIO class.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Giedrius Trainavičius <giedrius at blokas.io>
+---
+ sound/soc/bcm/pisound.c | 9 +--------
+ 1 file changed, 1 insertion(+), 8 deletions(-)
+
+--- a/sound/soc/bcm/pisound.c
++++ b/sound/soc/bcm/pisound.c
+@@ -857,7 +857,6 @@ static int pisnd_ctl_uninit(void)
+ 
+ static struct gpio_desc *osr0, *osr1, *osr2;
+ static struct gpio_desc *reset;
+-static struct gpio_desc *button;
+ 
+ static int pisnd_hw_params(
+ 	struct snd_pcm_substream *substream,
+@@ -1016,8 +1015,6 @@ static int pisnd_init_gpio(struct device
+ 
+ 	reset = gpiod_get_index(dev, "reset", 0, GPIOD_ASIS);
+ 
+-	button = gpiod_get_index(dev, "button", 0, GPIOD_ASIS);
+-
+ 	gpiod_direction_output(osr0,  1);
+ 	gpiod_direction_output(osr1,  1);
+ 	gpiod_direction_output(osr2,  1);
+@@ -1029,8 +1026,6 @@ static int pisnd_init_gpio(struct device
+ 	gpiod_set_value(osr2,  false);
+ 	gpiod_set_value(reset,  true);
+ 
+-	gpiod_export(button, false);
+-
+ 	return 0;
+ }
+ 
+@@ -1039,11 +1034,9 @@ static int pisnd_uninit_gpio(void)
+ 	int i;
+ 
+ 	struct gpio_desc **gpios[] = {
+-		&osr0, &osr1, &osr2, &reset, &button,
++		&osr0, &osr1, &osr2, &reset,
+ 	};
+ 
+-	gpiod_unexport(button);
+-
+ 	for (i = 0; i < ARRAY_SIZE(gpios); ++i) {
+ 		if (*gpios[i] == NULL) {
+ 			printd("weird, GPIO[%d] is NULL already\n", i);
diff --git a/target/linux/bcm27xx/patches-6.1/950-1250-Pisound-Read-out-the-SPI-speed-to-use-from-the-Devic.patch b/target/linux/bcm27xx/patches-6.1/950-1250-Pisound-Read-out-the-SPI-speed-to-use-from-the-Devic.patch
new file mode 100644
index 0000000000..5da78175b1
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1250-Pisound-Read-out-the-SPI-speed-to-use-from-the-Devic.patch
@@ -0,0 +1,94 @@
+From 273139b285f7a1a825eb689943626a0172b8802b Mon Sep 17 00:00:00 2001
+From: Giedrius <giedrius at blokas.io>
+Date: Mon, 22 Jan 2024 13:26:58 +0000
+Subject: [PATCH 1250/1295] Pisound: Read out the SPI speed to use from the
+ Device Tree.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Giedrius Trainavičius <giedrius at blokas.io>
+---
+ sound/soc/bcm/pisound.c | 31 ++++++++++++++++++++++++++-----
+ 1 file changed, 26 insertions(+), 5 deletions(-)
+
+--- a/sound/soc/bcm/pisound.c
++++ b/sound/soc/bcm/pisound.c
+@@ -1,6 +1,6 @@
+ /*
+  * Pisound Linux kernel module.
+- * Copyright (C) 2016-2020  Vilniaus Blokas UAB, https://blokas.io/pisound
++ * Copyright (C) 2016-2024  Vilniaus Blokas UAB, https://blokas.io/pisound
+  *
+  * This program is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU General Public License
+@@ -142,14 +142,14 @@ static void pisnd_input_trigger(struct s
+ 	}
+ }
+ 
+-static struct snd_rawmidi_ops pisnd_output_ops = {
++static const struct snd_rawmidi_ops pisnd_output_ops = {
+ 	.open = pisnd_output_open,
+ 	.close = pisnd_output_close,
+ 	.trigger = pisnd_output_trigger,
+ 	.drain = pisnd_output_drain,
+ };
+ 
+-static struct snd_rawmidi_ops pisnd_input_ops = {
++static const struct snd_rawmidi_ops pisnd_input_ops = {
+ 	.open = pisnd_input_open,
+ 	.close = pisnd_input_close,
+ 	.trigger = pisnd_input_trigger,
+@@ -226,6 +226,7 @@ static char g_id[25];
+ enum { MAX_VERSION_STR_LEN = 6 };
+ static char g_fw_version[MAX_VERSION_STR_LEN];
+ static char g_hw_version[MAX_VERSION_STR_LEN];
++static u32 g_spi_speed_hz;
+ 
+ static uint8_t g_ledFlashDuration;
+ static bool    g_ledFlashDurationChanged;
+@@ -329,7 +330,7 @@ static void spi_transfer(const uint8_t *
+ 	transfer.tx_buf = txbuf;
+ 	transfer.rx_buf = rxbuf;
+ 	transfer.len = len;
+-	transfer.speed_hz = 150000;
++	transfer.speed_hz = g_spi_speed_hz;
+ 	transfer.delay.value = 10;
+ 	transfer.delay.unit = SPI_DELAY_UNIT_USECS;
+ 
+@@ -646,6 +647,26 @@ static int pisnd_spi_init(struct device
+ 	memset(g_fw_version, 0, sizeof(g_fw_version));
+ 	memset(g_hw_version, 0, sizeof(g_hw_version));
+ 
++	g_spi_speed_hz = 150000;
++	if (dev->of_node) {
++		struct device_node *spi_node;
++
++		spi_node = of_parse_phandle(
++			dev->of_node,
++			"spi-controller",
++			0
++			);
++
++		if (spi_node) {
++			ret = of_property_read_u32(spi_node, "spi-speed-hz", &g_spi_speed_hz);
++			if (ret != 0)
++				printe("Failed reading spi-speed-hz! (%d)\n", ret);
++
++			of_node_put(spi_node);
++		}
++	}
++	printi("Using SPI speed: %u\n", g_spi_speed_hz);
++
+ 	spi = pisnd_spi_find_device();
+ 
+ 	if (spi != NULL) {
+@@ -950,7 +971,7 @@ static int pisnd_startup(struct snd_pcm_
+ 	return 0;
+ }
+ 
+-static struct snd_soc_ops pisnd_ops = {
++static const struct snd_soc_ops pisnd_ops = {
+ 	.startup = pisnd_startup,
+ 	.hw_params = pisnd_hw_params,
+ };
diff --git a/target/linux/bcm27xx/patches-6.1/950-1251-Pisound-Set-the-spi-speed-hz-for-Pisound-in-the-Devi.patch b/target/linux/bcm27xx/patches-6.1/950-1251-Pisound-Set-the-spi-speed-hz-for-Pisound-in-the-Devi.patch
new file mode 100644
index 0000000000..b0ddd8f5ab
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1251-Pisound-Set-the-spi-speed-hz-for-Pisound-in-the-Devi.patch
@@ -0,0 +1,129 @@
+From 92123f0abd5e24c150b54c56261813ced432ac87 Mon Sep 17 00:00:00 2001
+From: Giedrius <giedrius at blokas.io>
+Date: Mon, 22 Jan 2024 13:29:24 +0000
+Subject: [PATCH 1251/1295] Pisound: Set the spi-speed-hz for Pisound in the
+ Device Tree overlay, and specify spi-speed-hz override for Pi 5.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Giedrius Trainavičius <giedrius at blokas.io>
+---
+ arch/arm/boot/dts/overlays/Makefile           |  1 +
+ arch/arm/boot/dts/overlays/README             |  8 ++++-
+ arch/arm/boot/dts/overlays/overlay_map.dts    | 10 ++++++
+ .../arm/boot/dts/overlays/pisound-overlay.dts |  4 ++-
+ .../boot/dts/overlays/pisound-pi5-overlay.dts | 31 +++++++++++++++++++
+ 5 files changed, 52 insertions(+), 2 deletions(-)
+ create mode 100644 arch/arm/boot/dts/overlays/pisound-pi5-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -192,6 +192,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
+ 	piscreen.dtbo \
+ 	piscreen2r.dtbo \
+ 	pisound.dtbo \
++	pisound-pi5.dtbo \
+ 	pitft22.dtbo \
+ 	pitft28-capacitive.dtbo \
+ 	pitft28-resistive.dtbo \
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -3486,11 +3486,17 @@ Params: speed                   Display
+ 
+ 
+ Name:   pisound
+-Info:   Configures the Blokas Labs pisound card
++Info:   Configures the Blokas Labs Pisound card
+ Load:   dtoverlay=pisound
+ Params: <None>
+ 
+ 
++Name:   pisound-pi5
++Info:   Pi 5 specific overlay override for Blokas Labs Pisound card, see pisound
++Load:   dtoverlay=pisound-pi5
++Params: <None>
++
++
+ Name:   pitft22
+ Info:   Adafruit PiTFT 2.2" screen
+ Load:   dtoverlay=pitft22,<param>=<val>
+--- a/arch/arm/boot/dts/overlays/overlay_map.dts
++++ b/arch/arm/boot/dts/overlays/overlay_map.dts
+@@ -203,6 +203,16 @@
+ 		renamed = "miniuart-bt";
+ 	};
+ 
++	pisound {
++		bcm2835;
++		bcm2711;
++		bcm2712 = "pisound-pi5";
++	};
++
++	pisound-pi5 {
++		bcm2712;
++	};
++
+ 	pwm1 {
+ 		bcm2711;
+ 	};
+--- a/arch/arm/boot/dts/overlays/pisound-overlay.dts
++++ b/arch/arm/boot/dts/overlays/pisound-overlay.dts
+@@ -1,6 +1,6 @@
+ /*
+  * Pisound Linux kernel module.
+- * Copyright (C) 2016-2017  Vilniaus Blokas UAB, https://blokas.io/pisound
++ * Copyright (C) 2016-2024  Vilniaus Blokas UAB, https://blokas.io/pisound
+  *
+  * This program is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU General Public License
+@@ -56,6 +56,7 @@
+ 				compatible = "blokaslabs,pisound-spi";
+ 				reg = <0>;
+ 				spi-max-frequency = <1000000>;
++				spi-speed-hz = <150000>;
+ 			};
+ 		};
+ 	};
+@@ -76,6 +77,7 @@
+ 		__overlay__ {
+ 			compatible = "blokaslabs,pisound";
+ 			i2s-controller = <&i2s_clk_consumer>;
++			spi-controller = <&pisound_spi>;
+ 			status = "okay";
+ 
+ 			pinctrl-names = "default";
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/pisound-pi5-overlay.dts
+@@ -0,0 +1,31 @@
++/*
++ * Pisound Linux kernel module.
++ * Copyright (C) 2016-2024  Vilniaus Blokas UAB, https://blokas.io/pisound
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; version 2 of the
++ * License.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ */
++
++/dts-v1/;
++/plugin/;
++
++#include "pisound-overlay.dts"
++
++&pisound_spi {
++	spi-speed-hz = <100000>;
++};
++
++/ {
++	compatible = "brcm,bcm2712";
++};
diff --git a/target/linux/bcm27xx/patches-6.1/950-1252-Improvement-on-backup-switchover-mode-overlay-value-.patch b/target/linux/bcm27xx/patches-6.1/950-1252-Improvement-on-backup-switchover-mode-overlay-value-.patch
new file mode 100644
index 0000000000..9fabd9fd13
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1252-Improvement-on-backup-switchover-mode-overlay-value-.patch
@@ -0,0 +1,51 @@
+From f85acc3d0fb33ce5c92578dca7b1345915f744ff Mon Sep 17 00:00:00 2001
+From: Tiago Freire <41837236+tiagofreire-pt at users.noreply.github.com>
+Date: Tue, 23 Jan 2024 12:10:24 +0000
+Subject: [PATCH 1252/1295] Improvement on backup-switchover-mode overlay value
+ definitions (#5884)
+
+For the RV3028 RTC, the definitions for its `backup-switchover-mode` overlay
+were not intelligible neither complete/exhaustive.
+
+Accordingly to the https://github.com/raspberrypi/linux/issues/2912#issuecomment-477670051
+these one here proposed should be correct.
+
+`/boot/config.txt` should be as a configuration example, for rv3028, on a
+ Uputronics GPS Extension HAT:
+
+    # For GPS Expansion Board from Uputronics
+    dtparam=i2c_arm=on
+    dtoverlay=i2c-rtc,rv3028,backup-switchover-mode=3
+    dtoverlay=pps-gpio,gpiopin=18
+    init_uart_baud=115200
+
+From my tests (`sudo rmmod rtc_rv3028 && sudo i2cget -y 1 0x52 0x37`):
+
+`Default from factory`: `0x10`
+`Mode 0`: `0x10`
+`Mode 1`: `0x14`
+`Mode 2`: `0x18`
+`Mode 3`: `0x1c`
+
+`Mode 3`: `0x1c` is consistent with the manufacturer configuration script: http://store.uputronics.com/files/configure-rv3028.sh
+---
+ arch/arm/boot/dts/overlays/README | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -2106,7 +2106,13 @@ Params: abx80x                  Select o
+                                 source
+ 
+         backup-switchover-mode  Backup power supply switch mode. Must be 0 for
+-                                off or 1 for Vdd < VBackup (RV3028, RV3032)
++                                "Switchover disabled", 1 for "Direct Switching"
++                                (if Vdd < VBackup), 2 for "Standby
++                                Mode" (if Vdd < Vbackup,
++                                does not draw current) or 3 for
++                                "Level Switching" (if Vdd < Vbackup
++                                and Vdd < Vddsw and Vbackup > Vddsw)
++                                (RV3028, RV3032)
+ 
+ 
+ Name:   i2c-rtc-gpio
diff --git a/target/linux/bcm27xx/patches-6.1/950-1253-Harmonizing-the-improvement-on-backup-switchover-mod.patch b/target/linux/bcm27xx/patches-6.1/950-1253-Harmonizing-the-improvement-on-backup-switchover-mod.patch
new file mode 100644
index 0000000000..b5fe17b959
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1253-Harmonizing-the-improvement-on-backup-switchover-mod.patch
@@ -0,0 +1,30 @@
+From f2ada4aa6b1d214c67b7efe874a408be9b4eaf3f Mon Sep 17 00:00:00 2001
+From: Tiago Freire <41837236+tiagofreire-pt at users.noreply.github.com>
+Date: Wed, 24 Jan 2024 10:03:03 +0000
+Subject: [PATCH 1253/1295] Harmonizing the improvement on
+ backup-switchover-mode overlay value definitions
+
+On the followup of https://github.com/raspberrypi/linux/pull/5884, I missed a second duplicate definition. Now, harmonized the entire document.
+
+Signed-off-by: Tiago Freire <41837236+tiagofreire-pt at users.noreply.github.com>
+---
+ arch/arm/boot/dts/overlays/README | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -2184,7 +2184,13 @@ Params: abx80x                  Select o
+                                 source
+ 
+         backup-switchover-mode  Backup power supply switch mode. Must be 0 for
+-                                off or 1 for Vdd < VBackup (RV3028, RV3032)
++                                "Switchover disabled", 1 for "Direct Switching"
++                                (if Vdd < VBackup), 2 for "Standby
++                                Mode" (if Vdd < Vbackup,
++                                does not draw current) or 3 for
++                                "Level Switching" (if Vdd < Vbackup
++                                and Vdd < Vddsw and Vbackup > Vddsw)
++                                (RV3028, RV3032)
+ 
+         i2c_gpio_sda            GPIO used for I2C data (default "23")
+ 
diff --git a/target/linux/bcm27xx/patches-6.1/950-1254-Add-pcie-32bit-dma-overlay-pi5-to-enable-32bit-DMA-o.patch b/target/linux/bcm27xx/patches-6.1/950-1254-Add-pcie-32bit-dma-overlay-pi5-to-enable-32bit-DMA-o.patch
new file mode 100644
index 0000000000..2127d2ca4f
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1254-Add-pcie-32bit-dma-overlay-pi5-to-enable-32bit-DMA-o.patch
@@ -0,0 +1,85 @@
+From 1cdbd99f402b76c61632d09a49b20ce90af0cc72 Mon Sep 17 00:00:00 2001
+From: Rodrigo Rosmaninho <quico.rosmaninho at gmail.com>
+Date: Tue, 23 Jan 2024 18:50:19 +0000
+Subject: [PATCH 1254/1295] Add pcie-32bit-dma-overlay-pi5 to enable 32bit DMA
+ on the Pi 5's external PCIe
+
+Changes dma-ranges in the pcie1 component of the bcm2712 dts in order to ensure that the DMA addressing space is 32bits, at the expense of having to bounce buffers.
+
+Signed-off-by: Rodrigo Rosmaninho <r.rosmaninho at ua.pt>
+---
+ arch/arm/boot/dts/overlays/Makefile           |  1 +
+ arch/arm/boot/dts/overlays/README             |  6 +++++
+ arch/arm/boot/dts/overlays/overlay_map.dts    |  5 ++++
+ .../overlays/pcie-32bit-dma-pi5-overlay.dts   | 26 +++++++++++++++++++
+ 4 files changed, 38 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/pcie-32bit-dma-pi5-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -182,6 +182,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
+ 	pca953x.dtbo \
+ 	pcf857x.dtbo \
+ 	pcie-32bit-dma.dtbo \
++	pcie-32bit-dma-pi5.dtbo \
+ 	pibell.dtbo \
+ 	pifacedigital.dtbo \
+ 	pifi-40.dtbo \
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -3388,6 +3388,12 @@ Load:   dtoverlay=pcie-32bit-dma
+ Params: <None>
+ 
+ 
++Name:   pcie-32bit-dma-pi5
++Info:   Force PCIe config to support 32bit DMA addresses at the expense of
++        having to bounce buffers (on the Pi 5).
++Load:   dtoverlay=pcie-32bit-dma-pi5
++Params: <None>
++
+ [ The pcf2127-rtc overlay has been deleted. See i2c-rtc. ]
+ 
+ 
+--- a/arch/arm/boot/dts/overlays/overlay_map.dts
++++ b/arch/arm/boot/dts/overlays/overlay_map.dts
+@@ -185,6 +185,11 @@
+ 
+ 	pcie-32bit-dma {
+ 		bcm2711;
++		bcm2712 = "pcie-32bit-dma-pi5";
++	};
++
++	pcie-32bit-dma-pi5 {
++		bcm2712;
+ 	};
+ 
+ 	pi3-act-led {
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/pcie-32bit-dma-pi5-overlay.dts
+@@ -0,0 +1,26 @@
++/*
++ * pcie-32bit-dma-pi5-overlay.dts
++ */
++
++/dts-v1/;
++/plugin/;
++
++/ {
++	compatible = "brcm,bcm2712";
++
++	fragment at 0 {
++		target = <&pcie1>;
++		__overlay__ {
++			/*
++			 * The size of the range is rounded up to a power of 2,
++			 * so the range ends up being 0-4GB, and the MSI vector
++			 * gets pushed beyond 4GB.
++			 */
++			#address-cells = <3>;
++			#size-cells = <2>;
++			dma-ranges = <0x02000000 0x0 0x00000000 0x0 0x00000000
++				      0x0 0x80000000>;
++		};
++	};
++
++};
diff --git a/target/linux/bcm27xx/patches-6.1/950-1257-i2c-designware-Use-SCL-rise-and-fall-times-in-DT.patch b/target/linux/bcm27xx/patches-6.1/950-1257-i2c-designware-Use-SCL-rise-and-fall-times-in-DT.patch
new file mode 100644
index 0000000000..3aa719cc80
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1257-i2c-designware-Use-SCL-rise-and-fall-times-in-DT.patch
@@ -0,0 +1,91 @@
+From b660279cc83aff2018cecfc3fb55757a8d64f607 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil at raspberrypi.com>
+Date: Tue, 16 Jan 2024 15:54:22 +0000
+Subject: [PATCH 1257/1295] i2c: designware: Use SCL rise and fall times in DT
+
+Calculate the HCNT and LCNT values for all modes using the rise and
+fall times of SCL, the aim being a 50/50 mark/space ratio.
+
+Signed-off-by: Phil Elwell <phil at raspberrypi.com>
+---
+ drivers/i2c/busses/i2c-designware-master.c | 26 ++++++++++++++++++++++
+ 1 file changed, 26 insertions(+)
+
+--- a/drivers/i2c/busses/i2c-designware-master.c
++++ b/drivers/i2c/busses/i2c-designware-master.c
+@@ -16,6 +16,7 @@
+ #include <linux/i2c.h>
+ #include <linux/interrupt.h>
+ #include <linux/io.h>
++#include <linux/math64.h>
+ #include <linux/module.h>
+ #include <linux/pm_runtime.h>
+ #include <linux/regmap.h>
+@@ -37,6 +38,22 @@ static void i2c_dw_configure_fifo_master
+ 	regmap_write(dev->map, DW_IC_CON, dev->master_cfg);
+ }
+ 
++static u16 clock_calc(struct dw_i2c_dev *dev, bool want_high)
++{
++	struct i2c_timings *t = &dev->timings;
++	u32 wanted_speed = t->bus_freq_hz;
++	u32 clk_khz = i2c_dw_clk_rate(dev);
++	u32 extra_ns = want_high ? t->scl_fall_ns : t->scl_rise_ns;
++	u32 extra_cycles = (u32)div_u64((u64)clk_khz * extra_ns, 1000000);
++	u32 period = div_u64((u64)clk_khz * 1000 + wanted_speed - 1, wanted_speed);
++	u32 cycles = (period + want_high)/2 - extra_cycles;
++
++	if (cycles > 0xffff)
++		cycles = 0xffff;
++
++	return (u16)cycles;
++}
++
+ static int i2c_dw_set_timings_master(struct dw_i2c_dev *dev)
+ {
+ 	u32 comp_param1;
+@@ -44,6 +61,7 @@ static int i2c_dw_set_timings_master(str
+ 	struct i2c_timings *t = &dev->timings;
+ 	const char *fp_str = "";
+ 	u32 ic_clk;
++	u32 hcnt, lcnt;
+ 	int ret;
+ 
+ 	ret = i2c_dw_acquire_lock(dev);
+@@ -59,6 +77,9 @@ static int i2c_dw_set_timings_master(str
+ 	sda_falling_time = t->sda_fall_ns ?: 300; /* ns */
+ 	scl_falling_time = t->scl_fall_ns ?: 300; /* ns */
+ 
++	hcnt = clock_calc(dev, true);
++	lcnt = clock_calc(dev, false);
++
+ 	/* Calculate SCL timing parameters for standard mode if not set */
+ 	if (!dev->ss_hcnt || !dev->ss_lcnt) {
+ 		ic_clk = i2c_dw_clk_rate(dev);
+@@ -74,6 +95,8 @@ static int i2c_dw_set_timings_master(str
+ 					scl_falling_time,
+ 					0);	/* No offset */
+ 	}
++	dev->ss_hcnt = hcnt;
++	dev->ss_lcnt = lcnt;
+ 	dev_dbg(dev->dev, "Standard Mode HCNT:LCNT = %d:%d\n",
+ 		dev->ss_hcnt, dev->ss_lcnt);
+ 
+@@ -124,6 +147,8 @@ static int i2c_dw_set_timings_master(str
+ 					scl_falling_time,
+ 					0);	/* No offset */
+ 	}
++	dev->fs_hcnt = hcnt;
++	dev->fs_lcnt = lcnt;
+ 	dev_dbg(dev->dev, "Fast Mode%s HCNT:LCNT = %d:%d\n",
+ 		fp_str, dev->fs_hcnt, dev->fs_lcnt);
+ 
+@@ -152,6 +177,8 @@ static int i2c_dw_set_timings_master(str
+ 						scl_falling_time,
+ 						0);	/* No offset */
+ 		}
++		dev->hs_hcnt = hcnt;
++		dev->hs_lcnt = lcnt;
+ 		dev_dbg(dev->dev, "High Speed Mode HCNT:LCNT = %d:%d\n",
+ 			dev->hs_hcnt, dev->hs_lcnt);
+ 	}
diff --git a/target/linux/bcm27xx/patches-6.1/950-1258-i2c-designware-Support-non-standard-bus-speeds.patch b/target/linux/bcm27xx/patches-6.1/950-1258-i2c-designware-Support-non-standard-bus-speeds.patch
new file mode 100644
index 0000000000..fc24d508e0
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1258-i2c-designware-Support-non-standard-bus-speeds.patch
@@ -0,0 +1,80 @@
+From 6868dba87e2765042ac376a4a8427b9b981cd410 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil at raspberrypi.com>
+Date: Tue, 16 Jan 2024 16:03:14 +0000
+Subject: [PATCH 1258/1295] i2c: designware: Support non-standard bus speeds
+
+Add support for non-standard bus speeds by treating them as detuned
+versions of the slowest standard speed not less than the requested
+speed.
+
+Signed-off-by: Phil Elwell <phil at raspberrypi.com>
+---
+ drivers/i2c/busses/i2c-designware-common.c | 27 ++++++++++++++++++++++
+ drivers/i2c/busses/i2c-designware-core.h   |  1 +
+ drivers/i2c/busses/i2c-designware-master.c |  2 +-
+ 3 files changed, 29 insertions(+), 1 deletion(-)
+
+--- a/drivers/i2c/busses/i2c-designware-common.c
++++ b/drivers/i2c/busses/i2c-designware-common.c
+@@ -318,6 +318,9 @@ void i2c_dw_adjust_bus_speed(struct dw_i
+ {
+ 	u32 acpi_speed = i2c_dw_acpi_round_bus_speed(dev->dev);
+ 	struct i2c_timings *t = &dev->timings;
++	u32 wanted_speed;
++	u32 legal_speed = 0;
++	int i;
+ 
+ 	/*
+ 	 * Find bus speed from the "clock-frequency" device property, ACPI
+@@ -329,6 +332,30 @@ void i2c_dw_adjust_bus_speed(struct dw_i
+ 		t->bus_freq_hz = max(t->bus_freq_hz, acpi_speed);
+ 	else
+ 		t->bus_freq_hz = I2C_MAX_FAST_MODE_FREQ;
++
++	wanted_speed = t->bus_freq_hz;
++
++	/* For unsupported speeds, scale down the lowest speed which is faster. */
++	for (i = 0; i < ARRAY_SIZE(supported_speeds); i++) {
++		/* supported speeds is in decreasing order */
++		if (wanted_speed == supported_speeds[i]) {
++			legal_speed = 0;
++			break;
++		}
++		if (wanted_speed > supported_speeds[i])
++			break;
++
++		legal_speed = supported_speeds[i];
++	}
++
++	if (legal_speed) {
++		/*
++		 * Pretend this was the requested speed, but preserve the preferred
++		 * speed so the clock counts can be scaled.
++		 */
++		t->bus_freq_hz = legal_speed;
++		dev->wanted_bus_speed = wanted_speed;
++	}
+ }
+ EXPORT_SYMBOL_GPL(i2c_dw_adjust_bus_speed);
+ 
+--- a/drivers/i2c/busses/i2c-designware-core.h
++++ b/drivers/i2c/busses/i2c-designware-core.h
+@@ -287,6 +287,7 @@ struct dw_i2c_dev {
+ 	u16			fp_lcnt;
+ 	u16			hs_hcnt;
+ 	u16			hs_lcnt;
++	u32			wanted_bus_speed;
+ 	int			(*acquire_lock)(void);
+ 	void			(*release_lock)(void);
+ 	int			semaphore_idx;
+--- a/drivers/i2c/busses/i2c-designware-master.c
++++ b/drivers/i2c/busses/i2c-designware-master.c
+@@ -41,7 +41,7 @@ static void i2c_dw_configure_fifo_master
+ static u16 clock_calc(struct dw_i2c_dev *dev, bool want_high)
+ {
+ 	struct i2c_timings *t = &dev->timings;
+-	u32 wanted_speed = t->bus_freq_hz;
++	u32 wanted_speed = dev->wanted_bus_speed ?: t->bus_freq_hz;
+ 	u32 clk_khz = i2c_dw_clk_rate(dev);
+ 	u32 extra_ns = want_high ? t->scl_fall_ns : t->scl_rise_ns;
+ 	u32 extra_cycles = (u32)div_u64((u64)clk_khz * extra_ns, 1000000);
diff --git a/target/linux/bcm27xx/patches-6.1/950-1259-ARM-dts-rp1-Add-I2C-timings.patch b/target/linux/bcm27xx/patches-6.1/950-1259-ARM-dts-rp1-Add-I2C-timings.patch
new file mode 100644
index 0000000000..adf7cc25bc
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1259-ARM-dts-rp1-Add-I2C-timings.patch
@@ -0,0 +1,78 @@
+From 4c7a8e9e40d915c61df188d6b9f82836b616bd4f Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil at raspberrypi.com>
+Date: Tue, 16 Jan 2024 16:05:18 +0000
+Subject: [PATCH 1259/1295] ARM: dts: rp1: Add I2C timings
+
+Add SCL rise and fall times, to allow the derivation of timings at
+arbitrary speeds.
+
+Signed-off-by: Phil Elwell <phil at raspberrypi.com>
+---
+ arch/arm/boot/dts/rp1.dtsi | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+--- a/arch/arm/boot/dts/rp1.dtsi
++++ b/arch/arm/boot/dts/rp1.dtsi
+@@ -305,6 +305,8 @@
+ 			compatible = "snps,designware-i2c";
+ 			interrupts = <RP1_INT_I2C0 IRQ_TYPE_LEVEL_HIGH>;
+ 			clocks = <&rp1_clocks RP1_CLK_SYS>;
++			i2c-scl-rising-time-ns = <65>;
++			i2c-scl-falling-time-ns = <100>;
+ 			status = "disabled";
+ 		};
+ 
+@@ -313,6 +315,8 @@
+ 			compatible = "snps,designware-i2c";
+ 			interrupts = <RP1_INT_I2C1 IRQ_TYPE_LEVEL_HIGH>;
+ 			clocks = <&rp1_clocks RP1_CLK_SYS>;
++			i2c-scl-rising-time-ns = <65>;
++			i2c-scl-falling-time-ns = <100>;
+ 			status = "disabled";
+ 		};
+ 
+@@ -321,6 +325,8 @@
+ 			compatible = "snps,designware-i2c";
+ 			interrupts = <RP1_INT_I2C2 IRQ_TYPE_LEVEL_HIGH>;
+ 			clocks = <&rp1_clocks RP1_CLK_SYS>;
++			i2c-scl-rising-time-ns = <65>;
++			i2c-scl-falling-time-ns = <100>;
+ 			status = "disabled";
+ 		};
+ 
+@@ -329,6 +335,8 @@
+ 			compatible = "snps,designware-i2c";
+ 			interrupts = <RP1_INT_I2C3 IRQ_TYPE_LEVEL_HIGH>;
+ 			clocks = <&rp1_clocks RP1_CLK_SYS>;
++			i2c-scl-rising-time-ns = <65>;
++			i2c-scl-falling-time-ns = <100>;
+ 			status = "disabled";
+ 		};
+ 
+@@ -337,6 +345,8 @@
+ 			compatible = "snps,designware-i2c";
+ 			interrupts = <RP1_INT_I2C4 IRQ_TYPE_LEVEL_HIGH>;
+ 			clocks = <&rp1_clocks RP1_CLK_SYS>;
++			i2c-scl-rising-time-ns = <65>;
++			i2c-scl-falling-time-ns = <100>;
+ 			status = "disabled";
+ 		};
+ 
+@@ -345,6 +355,8 @@
+ 			compatible = "snps,designware-i2c";
+ 			interrupts = <RP1_INT_I2C5 IRQ_TYPE_LEVEL_HIGH>;
+ 			clocks = <&rp1_clocks RP1_CLK_SYS>;
++			i2c-scl-rising-time-ns = <65>;
++			i2c-scl-falling-time-ns = <100>;
+ 			status = "disabled";
+ 		};
+ 
+@@ -353,6 +365,8 @@
+ 			compatible = "snps,designware-i2c";
+ 			interrupts = <RP1_INT_I2C6 IRQ_TYPE_LEVEL_HIGH>;
+ 			clocks = <&rp1_clocks RP1_CLK_SYS>;
++			i2c-scl-rising-time-ns = <65>;
++			i2c-scl-falling-time-ns = <100>;
+ 			status = "disabled";
+ 		};
+ 
diff --git a/target/linux/bcm27xx/patches-6.1/950-1260-iommu-bcm2712-don-t-allow-building-as-module.patch b/target/linux/bcm27xx/patches-6.1/950-1260-iommu-bcm2712-don-t-allow-building-as-module.patch
new file mode 100644
index 0000000000..98790267f6
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1260-iommu-bcm2712-don-t-allow-building-as-module.patch
@@ -0,0 +1,28 @@
+From 86450c7dc4df99c3b16677cb00c2d3caf01a40f6 Mon Sep 17 00:00:00 2001
+From: Ratchanan Srirattanamet <peathot at hotmail.com>
+Date: Tue, 30 Jan 2024 14:09:00 +0700
+Subject: [PATCH 1260/1295] iommu/bcm2712: don't allow building as module
+
+Since bcm2712-iommu{,-cache}.c doesn't have usual module descriptors
+such as `MODULE_LICENSE`, configuring this as 'M' fails the build with
+`ERROR: modpost: missing MODULE_LICENSE() in <...>/bcm2712-iommu.o`.
+Since it seems like the code is not intended to be built as a module
+anyway (it registers the driver with `builtin_platform_driver()`), don't
+allow building this code as a module.
+
+Signed-off-by: Ratchanan Srirattanamet <peathot at hotmail.com>
+---
+ drivers/iommu/Kconfig | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/iommu/Kconfig
++++ b/drivers/iommu/Kconfig
+@@ -507,7 +507,7 @@ config SPRD_IOMMU
+ 	  Say Y here if you want to use the multimedia devices listed above.
+ 
+ config BCM2712_IOMMU
+-       tristate "BCM2712 IOMMU driver"
++       bool "BCM2712 IOMMU driver"
+        depends on ARM64 && ARCH_BCM
+        select IOMMU_API
+        help
diff --git a/target/linux/bcm27xx/patches-6.1/950-1261-drm-rp1-depends-on-instead-of-select-MFD_RP1.patch b/target/linux/bcm27xx/patches-6.1/950-1261-drm-rp1-depends-on-instead-of-select-MFD_RP1.patch
new file mode 100644
index 0000000000..9e6755b378
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1261-drm-rp1-depends-on-instead-of-select-MFD_RP1.patch
@@ -0,0 +1,59 @@
+From 57695002a68bdd4c077ea2173b64aeee6e1ef24f Mon Sep 17 00:00:00 2001
+From: Ratchanan Srirattanamet <peathot at hotmail.com>
+Date: Fri, 26 Jan 2024 18:49:42 +0700
+Subject: [PATCH 1261/1295] drm/rp1: depends on, instead of select, MFD_RP1
+
+According to kconfig-language.txt [1], select should be used only for
+"non-visible symbols ... and for symbols with no dependencies". Since
+MFD_RP1 both is visible and has a dependency, "select" should not be
+used and "depends on" should be used instead.
+
+In particular, this fixes the build of this kernel tree on NixOS, where
+its kernel config system will try to answer 'M' to as many config as
+possible.
+
+[1] https://www.kernel.org/doc/html/latest/kbuild/kconfig-language.html
+
+Signed-off-by: Ratchanan Srirattanamet <peathot at hotmail.com>
+---
+ drivers/gpu/drm/rp1/rp1-dpi/Kconfig | 3 +--
+ drivers/gpu/drm/rp1/rp1-dsi/Kconfig | 3 +--
+ drivers/gpu/drm/rp1/rp1-vec/Kconfig | 3 +--
+ 3 files changed, 3 insertions(+), 6 deletions(-)
+
+--- a/drivers/gpu/drm/rp1/rp1-dpi/Kconfig
++++ b/drivers/gpu/drm/rp1/rp1-dpi/Kconfig
+@@ -1,8 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0-only
+ config DRM_RP1_DPI
+ 	tristate "DRM Support for RP1 DPI"
+-	depends on DRM
+-	select MFD_RP1
++	depends on DRM && MFD_RP1
+ 	select DRM_GEM_DMA_HELPER
+ 	select DRM_KMS_HELPER
+ 	select DRM_VRAM_HELPER
+--- a/drivers/gpu/drm/rp1/rp1-dsi/Kconfig
++++ b/drivers/gpu/drm/rp1/rp1-dsi/Kconfig
+@@ -1,8 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0-only
+ config DRM_RP1_DSI
+ 	tristate "DRM Support for RP1 DSI"
+-	depends on DRM
+-	select MFD_RP1
++	depends on DRM && MFD_RP1
+ 	select DRM_GEM_DMA_HELPER
+ 	select DRM_KMS_HELPER
+ 	select DRM_MIPI_DSI
+--- a/drivers/gpu/drm/rp1/rp1-vec/Kconfig
++++ b/drivers/gpu/drm/rp1/rp1-vec/Kconfig
+@@ -1,8 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0-only
+ config DRM_RP1_VEC
+ 	tristate "DRM Support for RP1 VEC"
+-	depends on DRM
+-	select MFD_RP1
++	depends on DRM && MFD_RP1
+ 	select DRM_GEM_DMA_HELPER
+ 	select DRM_KMS_HELPER
+ 	select DRM_VRAM_HELPER
diff --git a/target/linux/bcm27xx/patches-6.1/950-1262-Update-touch-PiTFT-overlays.patch b/target/linux/bcm27xx/patches-6.1/950-1262-Update-touch-PiTFT-overlays.patch
new file mode 100644
index 0000000000..43c275fde1
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1262-Update-touch-PiTFT-overlays.patch
@@ -0,0 +1,435 @@
+From 1c2a93ce0e1cf6d278cf565346183d7592cfbb24 Mon Sep 17 00:00:00 2001
+From: Melissa LeBlanc-Williams <melissa at adafruit.com>
+Date: Fri, 26 Jan 2024 14:41:42 -0800
+Subject: [PATCH 1262/1295] Update touch PiTFT overlays
+
+Expose the invert and swap touch parameters on 2.8" and 3.5" resistive touchscreens. Add
+the DRM parameter to the PiTFT 2.2" and 2.8" Capacitive overlay in the same
+way it is on the resistive overlays. Change the DRM driver to `adafruit,yx240qv29`
+because the rotations are consistent with the FBTFT Driver. Fix the override size parameters
+on the 2.8" capacitive PiTFT.
+
+Signed-off-by: Melissa LeBlanc-Williams <melissa at adafruit.com>
+---
+ arch/arm/boot/dts/overlays/README             |  20 +++
+ .../arm/boot/dts/overlays/pitft22-overlay.dts | 102 +++++++-------
+ .../overlays/pitft28-capacitive-overlay.dts   | 132 +++++++++---------
+ .../overlays/pitft28-resistive-overlay.dts    |  12 +-
+ .../overlays/pitft35-resistive-overlay.dts    |  10 +-
+ 5 files changed, 156 insertions(+), 120 deletions(-)
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -3526,6 +3526,10 @@ Params: speed                   Display
+ 
+         debug                   Debug output level {0-7}
+ 
++        drm                     Force the use of the mi0283qt DRM driver (by
++                                default the ili9340 framebuffer driver will
++                                be used in preference if available)
++
+ 
+ Name:   pitft28-capacitive
+ Info:   Adafruit PiTFT 2.8" capacitive touch screen
+@@ -3538,6 +3542,10 @@ Params: speed                   Display
+ 
+         debug                   Debug output level {0-7}
+ 
++        drm                     Force the use of the mi0283qt DRM driver (by
++                                default the ili9340 framebuffer driver will
++                                be used in preference if available)
++
+         touch-sizex             Touchscreen size x (default 240)
+ 
+         touch-sizey             Touchscreen size y (default 320)
+@@ -3564,6 +3572,12 @@ Params: speed                   Display
+                                 default the ili9340 framebuffer driver will
+                                 be used in preference if available)
+ 
++        touch-invx              Touchscreen inverted x axis
++
++        touch-invy              Touchscreen inverted y axis
++
++        touch-swapxy            Touchscreen swapped x y axis
++
+ 
+ Name:   pitft35-resistive
+ Info:   Adafruit PiTFT 3.5" resistive touch screen
+@@ -3580,6 +3594,12 @@ Params: speed                   Display
+                                 default the fb_hx8357d framebuffer driver will
+                                 be used in preference if available)
+ 
++        touch-invx              Touchscreen inverted x axis
++
++        touch-invy              Touchscreen inverted y axis
++
++        touch-swapxy            Touchscreen swapped x y axis
++
+ 
+ Name:   pps-gpio
+ Info:   Configures the pps-gpio (pulse-per-second time signal via GPIO).
+--- a/arch/arm/boot/dts/overlays/pitft22-overlay.dts
++++ b/arch/arm/boot/dts/overlays/pitft22-overlay.dts
+@@ -7,63 +7,65 @@
+ /plugin/;
+ 
+ / {
+-        compatible = "brcm,bcm2835";
++	compatible = "brcm,bcm2835";
+ 
+-        fragment at 0 {
+-                target = <&spidev0>;
+-                __overlay__ {
+-                        status = "disabled";
+-                };
++	fragment at 0 {
++		target = <&spidev0>;
++		__overlay__ {
++			status = "disabled";
++		};
+         };
+ 
+-        fragment at 1 {
+-                target = <&spidev1>;
+-                __overlay__ {
+-                        status = "disabled";
+-                };
+-        };
+-
+-        fragment at 2 {
+-                target = <&gpio>;
+-                __overlay__ {
+-                        pitft_pins: pitft_pins {
+-                                brcm,pins = <25>;
+-                                brcm,function = <1>; /* out */
+-                                brcm,pull = <0>; /* none */
+-                        };
+-                };
+-        };
+-
+-        fragment at 3 {
+-                target = <&spi0>;
+-                __overlay__ {
+-                        /* needed to avoid dtc warning */
+-                        #address-cells = <1>;
+-                        #size-cells = <0>;
+-                        status = "okay";
+-
+-                        pitft: pitft at 0{
+-                                compatible = "ilitek,ili9340";
+-                                reg = <0>;
+-                                pinctrl-names = "default";
+-                                pinctrl-0 = <&pitft_pins>;
+-
+-                                spi-max-frequency = <32000000>;
+-                                rotate = <90>;
+-                                fps = <25>;
+-                                bgr;
+-                                buswidth = <8>;
+-                                dc-gpios = <&gpio 25 0>;
+-                                debug = <0>;
+-                        };
+-
+-                };
+-        };
+-
+-        __overrides__ {
+-                speed =   <&pitft>,"spi-max-frequency:0";
+-                rotate =  <&pitft>,"rotate:0";
+-                fps =     <&pitft>,"fps:0";
+-                debug =   <&pitft>,"debug:0";
+-        };
++	fragment at 1 {
++		target = <&spidev1>;
++		__overlay__ {
++			status = "disabled";
++		};
++	};
++
++	fragment at 2 {
++		target = <&gpio>;
++		__overlay__ {
++			pitft_pins: pitft_pins {
++				brcm,pins = <25>;
++				brcm,function = <1>; /* out */
++				brcm,pull = <0>; /* none */
++			};
++		};
++	};
++
++	fragment at 3 {
++		target = <&spi0>;
++		__overlay__ {
++			/* needed to avoid dtc warning */
++			#address-cells = <1>;
++			#size-cells = <0>;
++			status = "okay";
++
++			pitft: pitft at 0{
++				compatible = "ilitek,ili9340";
++				reg = <0>;
++				pinctrl-names = "default";
++				pinctrl-0 = <&pitft_pins>;
++
++				spi-max-frequency = <32000000>;
++				rotate = <90>;
++				fps = <25>;
++				bgr;
++				buswidth = <8>;
++				dc-gpios = <&gpio 25 0>;
++				debug = <0>;
++			};
++
++		};
++	};
++
++	__overrides__ {
++		speed =   <&pitft>,"spi-max-frequency:0";
++		rotate =  <&pitft>,"rotate:0", /* fbtft */
++				<&pitft>,"rotation:0"; /* drm */
++		fps =     <&pitft>,"fps:0";
++		debug =   <&pitft>,"debug:0";
++		drm =     <&pitft>,"compatible=adafruit,yx240qv29";
++	};
+ };
+--- a/arch/arm/boot/dts/overlays/pitft28-capacitive-overlay.dts
++++ b/arch/arm/boot/dts/overlays/pitft28-capacitive-overlay.dts
+@@ -7,14 +7,14 @@
+ /plugin/;
+ 
+ / {
+-        compatible = "brcm,bcm2835";
++	compatible = "brcm,bcm2835";
+ 
+-        fragment at 0 {
+-                target = <&spi0>;
+-                __overlay__ {
+-                        status = "okay";
+-                };
+-        };
++	fragment at 0 {
++		target = <&spi0>;
++		__overlay__ {
++			status = "okay";
++		};
++	};
+ 
+ 	fragment at 1 {
+ 		target = <&spidev0>;
+@@ -23,69 +23,71 @@
+ 		};
+ 	};
+ 
+-        fragment at 2 {
+-                target = <&gpio>;
+-                __overlay__ {
+-                        pitft_pins: pitft_pins {
+-                                brcm,pins = <24 25>;
+-                                brcm,function = <0 1>; /* in out */
+-                                brcm,pull = <2 0>; /* pullup none */
+-                        };
+-                };
+-        };
+-
+-        fragment at 3 {
+-                target = <&spi0>;
+-                __overlay__ {
+-                        /* needed to avoid dtc warning */
+-                        #address-cells = <1>;
+-                        #size-cells = <0>;
+-
+-                        pitft: pitft at 0{
+-                                compatible = "ilitek,ili9340";
+-                                reg = <0>;
+-                                pinctrl-names = "default";
+-                                pinctrl-0 = <&pitft_pins>;
+-
+-                                spi-max-frequency = <32000000>;
+-                                rotate = <90>;
+-                                fps = <25>;
+-                                bgr;
+-                                buswidth = <8>;
+-                                dc-gpios = <&gpio 25 0>;
+-                                debug = <0>;
+-                        };
+-                };
+-        };
+-
+-        fragment at 4 {
+-                target = <&i2c1>;
+-                __overlay__ {
+-                        /* needed to avoid dtc warning */
+-                        #address-cells = <1>;
+-                        #size-cells = <0>;
+-
+-                        ft6236: ft6236 at 38 {
+-                                compatible = "focaltech,ft6236";
+-                                reg = <0x38>;
+-
+-                                interrupt-parent = <&gpio>;
+-                                interrupts = <24 2>;
+-                                touchscreen-size-x = <240>;
+-                                touchscreen-size-y = <320>;
+-                        };
+-                };
+-        };
+-
+-        __overrides__ {
+-                speed =   <&pitft>,"spi-max-frequency:0";
+-                rotate =  <&pitft>,"rotate:0";
+-                fps =     <&pitft>,"fps:0";
+-                debug =   <&pitft>,"debug:0";
+-                touch-sizex = <&ft6236>,"touchscreen-size-x?";
+-                touch-sizey = <&ft6236>,"touchscreen-size-y?";
+-                touch-invx  = <&ft6236>,"touchscreen-inverted-x?";
+-                touch-invy  = <&ft6236>,"touchscreen-inverted-y?";
+-                touch-swapxy = <&ft6236>,"touchscreen-swapped-x-y?";
+-        };
++	fragment at 2 {
++		target = <&gpio>;
++		__overlay__ {
++			pitft_pins: pitft_pins {
++				brcm,pins = <24 25>;
++				brcm,function = <0 1>; /* in out */
++				brcm,pull = <2 0>; /* pullup none */
++			};
++		};
++	};
++
++	fragment at 3 {
++		target = <&spi0>;
++		__overlay__ {
++			/* needed to avoid dtc warning */
++			#address-cells = <1>;
++			#size-cells = <0>;
++
++			pitft: pitft at 0{
++				compatible = "ilitek,ili9340";
++				reg = <0>;
++				pinctrl-names = "default";
++				pinctrl-0 = <&pitft_pins>;
++
++				spi-max-frequency = <32000000>;
++				rotate = <90>;
++				fps = <25>;
++				bgr;
++				buswidth = <8>;
++				dc-gpios = <&gpio 25 0>;
++				debug = <0>;
++			};
++		};
++	};
++
++	fragment at 4 {
++		target = <&i2c1>;
++		__overlay__ {
++			/* needed to avoid dtc warning */
++			#address-cells = <1>;
++			#size-cells = <0>;
++
++			ft6236: ft6236 at 38 {
++				compatible = "focaltech,ft6236";
++				reg = <0x38>;
++
++				interrupt-parent = <&gpio>;
++				interrupts = <24 2>;
++				touchscreen-size-x = <240>;
++				touchscreen-size-y = <320>;
++			};
++		};
++	};
++
++	__overrides__ {
++		speed =   <&pitft>,"spi-max-frequency:0";
++		rotate =  <&pitft>,"rotate:0", /* fbtft */
++				<&pitft>,"rotation:0"; /* drm */
++		fps =     <&pitft>,"fps:0";
++		debug =   <&pitft>,"debug:0";
++		drm =     <&pitft>,"compatible=adafruit,yx240qv29";
++		touch-sizex = <&ft6236>,"touchscreen-size-x:0";
++		touch-sizey = <&ft6236>,"touchscreen-size-y:0";
++		touch-invx  = <&ft6236>,"touchscreen-inverted-x?";
++		touch-invy  = <&ft6236>,"touchscreen-inverted-y?";
++		touch-swapxy = <&ft6236>,"touchscreen-swapped-x-y?";
++	};
+ };
+--- a/arch/arm/boot/dts/overlays/pitft28-resistive-overlay.dts
++++ b/arch/arm/boot/dts/overlays/pitft28-resistive-overlay.dts
+@@ -49,7 +49,7 @@
+ 			#size-cells = <0>;
+ 
+ 			pitft: pitft at 0{
+-				compatible = "ilitek,ili9340", "multi-inno,mi0283qt";
++				compatible = "ilitek,ili9340";
+ 				reg = <0>;
+ 				pinctrl-names = "default";
+ 				pinctrl-0 = <&pitft_pins>;
+@@ -64,6 +64,9 @@
+ 			};
+ 
+ 			pitft_ts at 1 {
++				/* needed to avoid dtc warning */
++				#address-cells = <1>;
++				#interrupt-cells = <1>;
+ 				compatible = "st,stmpe610";
+ 				reg = <1>;
+ 
+@@ -72,7 +75,7 @@
+ 				interrupt-parent = <&gpio>;
+ 				interrupt-controller;
+ 
+-				stmpe_touchscreen {
++				stmpe_touchscreen: stmpe_touchscreen {
+ 					compatible = "st,stmpe-ts";
+ 					st,sample-time = <4>;
+ 					st,mod-12b = <1>;
+@@ -115,6 +118,9 @@
+ 			  <&pitft>,"rotation:0"; /* drm */
+ 		fps =     <&pitft>,"fps:0";
+ 		debug =   <&pitft>,"debug:0";
+-		drm =     <&pitft>,"compatible=multi-inno,mi0283qt";
++		drm =     <&pitft>,"compatible=adafruit,yx240qv29";
++		touch-invx  = <&stmpe_touchscreen>,"touchscreen-inverted-x?";
++		touch-invy  = <&stmpe_touchscreen>,"touchscreen-inverted-y?";
++		touch-swapxy = <&stmpe_touchscreen>,"touchscreen-swapped-x-y?";
+ 	};
+ };
+--- a/arch/arm/boot/dts/overlays/pitft35-resistive-overlay.dts
++++ b/arch/arm/boot/dts/overlays/pitft35-resistive-overlay.dts
+@@ -49,7 +49,7 @@
+ 			#size-cells = <0>;
+ 
+ 			pitft: pitft at 0{
+-				compatible = "himax,hx8357d", "adafruit,yx350hv15";
++				compatible = "himax,hx8357d";
+ 				reg = <0>;
+ 				pinctrl-names = "default";
+ 				pinctrl-0 = <&pitft_pins>;
+@@ -64,6 +64,9 @@
+ 			};
+ 
+ 			pitft_ts at 1 {
++				/* needed to avoid dtc warning */
++				#address-cells = <1>;
++				#interrupt-cells = <1>;
+ 				compatible = "st,stmpe610";
+ 				reg = <1>;
+ 
+@@ -72,7 +75,7 @@
+ 				interrupt-parent = <&gpio>;
+ 				interrupt-controller;
+ 
+-				stmpe_touchscreen {
++				stmpe_touchscreen: stmpe_touchscreen {
+ 					compatible = "st,stmpe-ts";
+ 					st,sample-time = <4>;
+ 					st,mod-12b = <1>;
+@@ -117,5 +120,8 @@
+ 		debug =   <&pitft>,"debug:0";
+ 		drm =     <&pitft>,"compatible=adafruit,yx350hv15",
+ 			  <&pitft>,"backlight:0=",<&backlight>;
++		touch-invx  = <&stmpe_touchscreen>,"touchscreen-inverted-x?";
++		touch-invy  = <&stmpe_touchscreen>,"touchscreen-inverted-y?";
++		touch-swapxy = <&stmpe_touchscreen>,"touchscreen-swapped-x-y?";
+ 	};
+ };
diff --git a/target/linux/bcm27xx/patches-6.1/950-1263-ARM-dts-rp1-Boost-the-I2C-drive-strength.patch b/target/linux/bcm27xx/patches-6.1/950-1263-ARM-dts-rp1-Boost-the-I2C-drive-strength.patch
new file mode 100644
index 0000000000..55ce6523db
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1263-ARM-dts-rp1-Boost-the-I2C-drive-strength.patch
@@ -0,0 +1,95 @@
+From ea9b088747d379256e2582dd5c29638bf4ff9928 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil at raspberrypi.com>
+Date: Wed, 31 Jan 2024 17:20:07 +0000
+Subject: [PATCH 1263/1295] ARM: dts: rp1: Boost the I2C drive strength
+
+Boosting the drive strength on I2C pins allows SCL to achieve safe
+voltage swings, even at 1MHz.
+
+Signed-off-by: Phil Elwell <phil at raspberrypi.com>
+---
+ arch/arm/boot/dts/rp1.dtsi | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+--- a/arch/arm/boot/dts/rp1.dtsi
++++ b/arch/arm/boot/dts/rp1.dtsi
+@@ -650,66 +650,79 @@
+ 			rp1_i2c4_34_35: rp1_i2c4_34_35 {
+ 				function = "i2c4";
+ 				pins = "gpio34", "gpio35";
++				drive-strength = <12>;
+ 				bias-pull-up;
+ 			};
+ 			rp1_i2c6_38_39: rp1_i2c6_38_39 {
+ 				function = "i2c6";
+ 				pins = "gpio38", "gpio39";
++				drive-strength = <12>;
+ 				bias-pull-up;
+ 			};
+ 			rp1_i2c4_40_41: rp1_i2c4_40_41 {
+ 				function = "i2c4";
+ 				pins = "gpio40", "gpio41";
++				drive-strength = <12>;
+ 				bias-pull-up;
+ 			};
+ 			rp1_i2c5_44_45: rp1_i2c5_44_45 {
+ 				function = "i2c5";
+ 				pins = "gpio44", "gpio45";
++				drive-strength = <12>;
+ 				bias-pull-up;
+ 			};
+ 			rp1_i2c0_0_1: rp1_i2c0_0_1 {
+ 				function = "i2c0";
+ 				pins = "gpio0", "gpio1";
++				drive-strength = <12>;
+ 				bias-pull-up;
+ 			};
+ 			rp1_i2c0_8_9: rp1_i2c0_8_9 {
+ 				function = "i2c0";
+ 				pins = "gpio8", "gpio9";
++				drive-strength = <12>;
+ 				bias-pull-up;
+ 			};
+ 			rp1_i2c1_2_3: rp1_i2c1_2_3 {
+ 				function = "i2c1";
+ 				pins = "gpio2", "gpio3";
++				drive-strength = <12>;
+ 				bias-pull-up;
+ 			};
+ 			rp1_i2c1_10_11: rp1_i2c1_10_11 {
+ 				function = "i2c1";
+ 				pins = "gpio10", "gpio11";
++				drive-strength = <12>;
+ 				bias-pull-up;
+ 			};
+ 			rp1_i2c2_4_5: rp1_i2c2_4_5 {
+ 				function = "i2c2";
+ 				pins = "gpio4", "gpio5";
++				drive-strength = <12>;
+ 				bias-pull-up;
+ 			};
+ 			rp1_i2c2_12_13: rp1_i2c2_12_13 {
+ 				function = "i2c2";
+ 				pins = "gpio12", "gpio13";
++				drive-strength = <12>;
+ 				bias-pull-up;
+ 			};
+ 			rp1_i2c3_6_7: rp1_i2c3_6_7 {
+ 				function = "i2c3";
+ 				pins = "gpio6", "gpio7";
++				drive-strength = <12>;
+ 				bias-pull-up;
+ 			};
+ 			rp1_i2c3_14_15: rp1_i2c3_14_15 {
+ 				function = "i2c3";
+ 				pins = "gpio14", "gpio15";
++				drive-strength = <12>;
+ 				bias-pull-up;
+ 			};
+ 			rp1_i2c3_22_23: rp1_i2c3_22_23 {
+ 				function = "i2c3";
+ 				pins = "gpio22", "gpio23";
++				drive-strength = <12>;
+ 				bias-pull-up;
+ 			};
+ 
diff --git a/target/linux/bcm27xx/patches-6.1/950-1264-ARM-dts-rp1-Add-a-safe-I2C-SDA-hold-time.patch b/target/linux/bcm27xx/patches-6.1/950-1264-ARM-dts-rp1-Add-a-safe-I2C-SDA-hold-time.patch
new file mode 100644
index 0000000000..7052239224
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1264-ARM-dts-rp1-Add-a-safe-I2C-SDA-hold-time.patch
@@ -0,0 +1,75 @@
+From 15dedc2ad5a9073b8639881680672214f605a5c6 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil at raspberrypi.com>
+Date: Wed, 31 Jan 2024 17:44:02 +0000
+Subject: [PATCH 1264/1295] ARM: dts: rp1: Add a safe I2C SDA hold time
+
+Failing to set a reasonable SDA hold time can cause SDA to change too
+close to the falling edge of SCL. 300ns is the recommended minimum
+interval between the two at 100kHz and 400kHz, and also seems to
+work at 1MHz, so use that.
+
+See: https://github.com/raspberrypi/linux/issues/5914
+
+Signed-off-by: Phil Elwell <phil at raspberrypi.com>
+---
+ arch/arm/boot/dts/rp1.dtsi | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+--- a/arch/arm/boot/dts/rp1.dtsi
++++ b/arch/arm/boot/dts/rp1.dtsi
+@@ -307,6 +307,7 @@
+ 			clocks = <&rp1_clocks RP1_CLK_SYS>;
+ 			i2c-scl-rising-time-ns = <65>;
+ 			i2c-scl-falling-time-ns = <100>;
++			i2c-sda-hold-time-ns = <300>;
+ 			status = "disabled";
+ 		};
+ 
+@@ -317,6 +318,7 @@
+ 			clocks = <&rp1_clocks RP1_CLK_SYS>;
+ 			i2c-scl-rising-time-ns = <65>;
+ 			i2c-scl-falling-time-ns = <100>;
++			i2c-sda-hold-time-ns = <300>;
+ 			status = "disabled";
+ 		};
+ 
+@@ -327,6 +329,7 @@
+ 			clocks = <&rp1_clocks RP1_CLK_SYS>;
+ 			i2c-scl-rising-time-ns = <65>;
+ 			i2c-scl-falling-time-ns = <100>;
++			i2c-sda-hold-time-ns = <300>;
+ 			status = "disabled";
+ 		};
+ 
+@@ -337,6 +340,7 @@
+ 			clocks = <&rp1_clocks RP1_CLK_SYS>;
+ 			i2c-scl-rising-time-ns = <65>;
+ 			i2c-scl-falling-time-ns = <100>;
++			i2c-sda-hold-time-ns = <300>;
+ 			status = "disabled";
+ 		};
+ 
+@@ -347,6 +351,7 @@
+ 			clocks = <&rp1_clocks RP1_CLK_SYS>;
+ 			i2c-scl-rising-time-ns = <65>;
+ 			i2c-scl-falling-time-ns = <100>;
++			i2c-sda-hold-time-ns = <300>;
+ 			status = "disabled";
+ 		};
+ 
+@@ -357,6 +362,7 @@
+ 			clocks = <&rp1_clocks RP1_CLK_SYS>;
+ 			i2c-scl-rising-time-ns = <65>;
+ 			i2c-scl-falling-time-ns = <100>;
++			i2c-sda-hold-time-ns = <300>;
+ 			status = "disabled";
+ 		};
+ 
+@@ -367,6 +373,7 @@
+ 			clocks = <&rp1_clocks RP1_CLK_SYS>;
+ 			i2c-scl-rising-time-ns = <65>;
+ 			i2c-scl-falling-time-ns = <100>;
++			i2c-sda-hold-time-ns = <300>;
+ 			status = "disabled";
+ 		};
+ 
diff --git a/target/linux/bcm27xx/patches-6.1/950-1265-ASoC-DACplus-fix-16bit-sample-support-in-clock-consu.patch b/target/linux/bcm27xx/patches-6.1/950-1265-ASoC-DACplus-fix-16bit-sample-support-in-clock-consu.patch
new file mode 100644
index 0000000000..ba1b3edda5
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1265-ASoC-DACplus-fix-16bit-sample-support-in-clock-consu.patch
@@ -0,0 +1,33 @@
+From 89bd4e64da3345c2764a42875b99c96fa8931967 Mon Sep 17 00:00:00 2001
+From: Joerg Schambacher <joerg at hifiberry.com>
+Date: Thu, 1 Feb 2024 17:32:44 +0100
+Subject: [PATCH 1265/1295] ASoC: DACplus - fix 16bit sample support in clock
+ consumer mode
+
+The former code did not adjust the physical sample width when
+in clock consumer mode and has taken the fixed 32 bit default.
+This has caused the audio to be played at half its frequency due to
+the fixed bclk_ratio of 64.
+
+Signed-off-by: Joerg Schambacher <joerg at hifiberry.com>
+---
+ sound/soc/bcm/hifiberry_dacplus.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+--- a/sound/soc/bcm/hifiberry_dacplus.c
++++ b/sound/soc/bcm/hifiberry_dacplus.c
+@@ -279,13 +279,11 @@ static int snd_rpi_hifiberry_dacplus_hw_
+ 	int ret = 0;
+ 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ 	int channels = params_channels(params);
+-	int width = 32;
++	int width = snd_pcm_format_physical_width(params_format(params));
+ 
+ 	if (snd_rpi_hifiberry_is_dacpro) {
+ 		struct snd_soc_component *component = asoc_rtd_to_codec(rtd, 0)->component;
+ 
+-		width = snd_pcm_format_physical_width(params_format(params));
+-
+ 		snd_rpi_hifiberry_dacplus_set_sclk(component,
+ 			params_rate(params));
+ 
diff --git a/target/linux/bcm27xx/patches-6.1/950-1266-ASoC-adds-support-for-AMP4-Pro-to-the-DAC-Plus-drive.patch b/target/linux/bcm27xx/patches-6.1/950-1266-ASoC-adds-support-for-AMP4-Pro-to-the-DAC-Plus-drive.patch
new file mode 100644
index 0000000000..84251f2800
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1266-ASoC-adds-support-for-AMP4-Pro-to-the-DAC-Plus-drive.patch
@@ -0,0 +1,114 @@
+From d58c054ba30b313bacbb7d19f559ecb4e3bb5c76 Mon Sep 17 00:00:00 2001
+From: Joerg Schambacher <joerg at hifiberry.com>
+Date: Fri, 19 Jan 2024 10:58:39 +0100
+Subject: [PATCH 1266/1295] ASoC: adds support for AMP4 Pro to the DAC Plus
+ driver
+
+The AMP4 Pro is a I2S master mode capable amplifier with
+clean onboard clock generators.
+We can share the card driver between TAS575x amplifiers
+and the PCM512x DACs as they are SW compatible.
+From a HW perspective though we need to limit the sample
+rates to the standard audio rates to avoid running the
+onboard clocks through the PLL. Using the PLL would require
+even a different HW.
+DAI/stream name are also set accordingly to allow the user
+a convenient identification of the soundcard
+
+Needs the pcm512x driver with TAS575x support (already in
+upstream kernel).
+
+Signed-off-by: Joerg Schambacher <joerg at hifiberry.com>
+---
+ sound/soc/bcm/hifiberry_dacplus.c | 41 ++++++++++++++++++++++++++++---
+ 1 file changed, 38 insertions(+), 3 deletions(-)
+
+--- a/sound/soc/bcm/hifiberry_dacplus.c
++++ b/sound/soc/bcm/hifiberry_dacplus.c
+@@ -58,10 +58,21 @@ static bool leds_off;
+ static bool auto_mute;
+ static int mute_ext_ctl;
+ static int mute_ext;
++static bool tas_device;
+ static struct gpio_desc *snd_mute_gpio;
+ static struct gpio_desc *snd_reset_gpio;
+ static struct snd_soc_card snd_rpi_hifiberry_dacplus;
+ 
++static const u32 master_dai_rates[] = {
++	44100, 48000, 88200, 96000,
++	176400, 192000, 352800, 384000,
++};
++
++static const struct snd_pcm_hw_constraint_list constraints_master = {
++	.count = ARRAY_SIZE(master_dai_rates),
++	.list  = master_dai_rates,
++};
++
+ static int snd_rpi_hifiberry_dacplus_mute_set(int mute)
+ {
+ 	gpiod_set_value_cansleep(snd_mute_gpio, mute);
+@@ -197,8 +208,13 @@ static int snd_rpi_hifiberry_dacplus_ini
+ 	if (snd_rpi_hifiberry_is_dacpro) {
+ 		struct snd_soc_dai_link *dai = rtd->dai_link;
+ 
+-		dai->name = "HiFiBerry DAC+ Pro";
+-		dai->stream_name = "HiFiBerry DAC+ Pro HiFi";
++		if (tas_device) {
++			dai->name = "HiFiBerry AMP4 Pro";
++			dai->stream_name = "HiFiBerry AMP4 Pro HiFi";
++		} else {
++			dai->name = "HiFiBerry DAC+ Pro";
++			dai->stream_name = "HiFiBerry DAC+ Pro HiFi";
++		}
+ 		dai->dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
+ 			| SND_SOC_DAIFMT_CBM_CFM;
+ 
+@@ -303,6 +319,18 @@ static int snd_rpi_hifiberry_dacplus_sta
+ {
+ 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ 	struct snd_soc_component *component = asoc_rtd_to_codec(rtd, 0)->component;
++	int ret;
++
++	if (tas_device && !slave) {
++		ret = snd_pcm_hw_constraint_list(substream->runtime, 0,
++					  SNDRV_PCM_HW_PARAM_RATE,
++					  &constraints_master);
++		if (ret < 0) {
++			dev_err(rtd->card->dev,
++				"Cannot apply constraints for sample rates\n");
++			return ret;
++		}
++	}
+ 
+ 	if (auto_mute)
+ 		gpiod_set_value_cansleep(snd_mute_gpio, 0);
+@@ -324,7 +352,7 @@ static void snd_rpi_hifiberry_dacplus_sh
+ }
+ 
+ /* machine stream operations */
+-static struct snd_soc_ops snd_rpi_hifiberry_dacplus_ops = {
++static const struct snd_soc_ops snd_rpi_hifiberry_dacplus_ops = {
+ 	.hw_params = snd_rpi_hifiberry_dacplus_hw_params,
+ 	.startup = snd_rpi_hifiberry_dacplus_startup,
+ 	.shutdown = snd_rpi_hifiberry_dacplus_shutdown,
+@@ -394,6 +422,7 @@ static int snd_rpi_hifiberry_dacplus_pro
+ 	struct snd_soc_card *card = &snd_rpi_hifiberry_dacplus;
+ 	int len;
+ 	struct device_node *tpa_node;
++	struct device_node *tas_node;
+ 	struct property *tpa_prop;
+ 	struct of_changeset ocs;
+ 	struct property *pp;
+@@ -430,6 +459,12 @@ static int snd_rpi_hifiberry_dacplus_pro
+ 		}
+ 	}
+ 
++	tas_node = of_find_compatible_node(NULL, NULL, "ti,tas5756");
++	if (tas_node) {
++		tas_device = true;
++		dev_info(&pdev->dev, "TAS5756 device found!\n");
++	};
++
+ 	snd_rpi_hifiberry_dacplus.dev = &pdev->dev;
+ 	if (pdev->dev.of_node) {
+ 		struct device_node *i2s_node;
diff --git a/target/linux/bcm27xx/patches-6.1/950-1267-DT-overlays-adds-support-for-Hifiberry-AMP4-Pro.patch b/target/linux/bcm27xx/patches-6.1/950-1267-DT-overlays-adds-support-for-Hifiberry-AMP4-Pro.patch
new file mode 100644
index 0000000000..49429bca06
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1267-DT-overlays-adds-support-for-Hifiberry-AMP4-Pro.patch
@@ -0,0 +1,130 @@
+From 98ac9b84709dc01ee936b6fe79eaac5e3a4aa6e7 Mon Sep 17 00:00:00 2001
+From: Joerg Schambacher <joerg at hifiberry.com>
+Date: Fri, 19 Jan 2024 10:44:22 +0100
+Subject: [PATCH 1267/1295] DT-overlays: adds support for Hifiberry AMP4 Pro
+
+The AMP4 Pro uses a TI TAS5756 amplifier in master mode
+and requires the DAC Plus card driver and the
+pcm512x component driver with TAS support.
+
+Signed-off-by: Joerg Schambacher <joerg at hifiberry.com>
+---
+ arch/arm/boot/dts/overlays/Makefile           |  1 +
+ arch/arm/boot/dts/overlays/README             | 28 +++++++++
+ .../overlays/hifiberry-amp4pro-overlay.dts    | 63 +++++++++++++++++++
+ 3 files changed, 92 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/hifiberry-amp4pro-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -86,6 +86,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
+ 	hifiberry-amp.dtbo \
+ 	hifiberry-amp100.dtbo \
+ 	hifiberry-amp3.dtbo \
++	hifiberry-amp4pro.dtbo \
+ 	hifiberry-dac.dtbo \
+ 	hifiberry-dacplus.dtbo \
+ 	hifiberry-dacplusadc.dtbo \
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -1738,6 +1738,34 @@ Load:   dtoverlay=hifiberry-amp3
+ Params: <None>
+ 
+ 
++Name:   hifiberry-amp4pro
++Info:   Configures the HifiBerry AMP4 Pro audio card
++Load:   dtoverlay=hifiberry-amp4pro,<param>=<val>
++Params: 24db_digital_gain       Allow gain to be applied via the TAS5756
++                                Digital volume control. Enable with
++                                "dtoverlay=hifiberry-amp4pro,24db_digital_gain"
++                                (The default behaviour is that the Digital
++                                volume control is limited to a maximum of
++                                0dB. ie. it can attenuate but not provide
++                                gain. For most users, this will be desired
++                                as it will prevent clipping. By appending
++                                the 24dB_digital_gain parameter, the Digital
++                                volume control will allow up to 24dB of
++                                gain. If this parameter is enabled, it is the
++                                responsibility of the user to ensure that
++                                the Digital volume control is set to a value
++                                that does not result in clipping/distortion!)
++        slave                   Force the amp into slave mode, using Pi as
++                                master for bit clock and frame clock.
++        leds_off                If set to 'true' the onboard indicator LEDs
++                                are switched off at all times.
++        auto_mute               If set to 'true' the amplifier is automatically
++                                muted when it is not playing.
++        mute_ext_ctl            The amplifier's HW mute control is enabled
++                                in ALSA mixer and set to <val>.
++                                Will be overwritten by ALSA user settings.
++
++
+ Name:   hifiberry-dac
+ Info:   Configures the HifiBerry DAC audio cards
+ Load:   dtoverlay=hifiberry-dac
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/hifiberry-amp4pro-overlay.dts
+@@ -0,0 +1,63 @@
++// Definitions for HiFiBerry AMP4PRO
++/dts-v1/;
++/plugin/;
++#include <dt-bindings/gpio/gpio.h>
++
++/ {
++	compatible = "brcm,bcm2835";
++
++	fragment at 0 {
++		target-path = "/";
++		__overlay__ {
++			dacpro_osc: dacpro_osc {
++				compatible = "hifiberry,dacpro-clk";
++				#clock-cells = <0>;
++			};
++		};
++	};
++
++	frag1: fragment at 1 {
++		target = <&i2s_clk_consumer>;
++		__overlay__ {
++			status = "okay";
++		};
++	};
++
++	fragment at 2 {
++		target = <&i2c1>;
++		__overlay__ {
++			#address-cells = <1>;
++			#size-cells = <0>;
++			status = "okay";
++
++			tas5756 at 4d {
++				#sound-dai-cells = <0>;
++				compatible = "ti,tas5756";
++				reg = <0x4d>;
++				clocks = <&dacpro_osc>;
++				status = "okay";
++			};
++		};
++	};
++
++	fragment at 3 {
++		target = <&sound>;
++		hifiberry_dacplus: __overlay__ {
++			compatible = "hifiberry,hifiberry-dacplus";
++			i2s-controller = <&i2s_clk_consumer>;
++			status = "okay";
++			mute-gpio = <&gpio 4 GPIO_ACTIVE_LOW>;
++		};
++	};
++
++	__overrides__ {
++		24db_digital_gain =
++			<&hifiberry_dacplus>,"hifiberry-amp4,24db_digital_gain?";
++		leds_off = <&hifiberry_dacplus>,"hifiberry-amp4,leds_off?";
++		mute_ext_ctl = <&hifiberry_dacplus>,"hifiberry-amp4,mute_ext_ctl:0";
++		auto_mute = <&hifiberry_dacplus>,"hifiberry-amp4,auto_mute?";
++		slave = <&hifiberry_dacplus>,"hifiberry-dacplus,slave?",
++			<&frag1>,"target:0=",<&i2s_clk_producer>,
++			<&hifiberry_dacplus>,"i2s-controller:0=",<&i2s_clk_producer>;
++	};
++};
diff --git a/target/linux/bcm27xx/patches-6.1/950-1268-ASoC-DACplusADCPro-fix-16bit-sample-support-in-clock.patch b/target/linux/bcm27xx/patches-6.1/950-1268-ASoC-DACplusADCPro-fix-16bit-sample-support-in-clock.patch
new file mode 100644
index 0000000000..f608e5ee7d
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1268-ASoC-DACplusADCPro-fix-16bit-sample-support-in-clock.patch
@@ -0,0 +1,38 @@
+From ba86793796525f8276fafbaf9d31d5156a2cfcb5 Mon Sep 17 00:00:00 2001
+From: Joerg Schambacher <joerg at hifiberry.com>
+Date: Fri, 2 Feb 2024 08:51:06 +0100
+Subject: [PATCH 1268/1295] ASoC: DACplusADCPro - fix 16bit sample support in
+ clock consumer mode
+
+The former code did not adjust the physical sample width when in
+clock consumer mode and has taken the fixed 32 bit default. This
+has caused the audio to be played at half its frequency due to
+the fixed bclk_ratio of 64.
+
+Problem appears only on PI5 as on the former PIs the I2S module
+did simply run at fixed 64x rate.
+
+Signed-off-by: Joerg Schambacher <joerg at hifiberry.com>
+---
+ sound/soc/bcm/hifiberry_dacplusadcpro.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+--- a/sound/soc/bcm/hifiberry_dacplusadcpro.c
++++ b/sound/soc/bcm/hifiberry_dacplusadcpro.c
+@@ -383,15 +383,13 @@ static int snd_rpi_hifiberry_dacplusadcp
+ 	int ret = 0;
+ 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ 	int channels = params_channels(params);
+-	int width = 32;
++	int width = snd_pcm_format_physical_width(params_format(params));
+ 	struct snd_soc_component *dac = asoc_rtd_to_codec(rtd, 0)->component;
+ 	struct snd_soc_dai *dai = asoc_rtd_to_codec(rtd, 0);
+ 	struct snd_soc_dai_driver *drv = dai->driver;
+ 	const struct snd_soc_dai_ops *ops = drv->ops;
+ 
+ 	if (snd_rpi_hifiberry_is_dacpro) {
+-		width = snd_pcm_format_physical_width(params_format(params));
+-
+ 		snd_rpi_hifiberry_dacplusadcpro_set_sclk(dac,
+ 			params_rate(params));
+ 
diff --git a/target/linux/bcm27xx/patches-6.1/950-1269-overlays-Correct-some-compatible-strings.patch b/target/linux/bcm27xx/patches-6.1/950-1269-overlays-Correct-some-compatible-strings.patch
new file mode 100644
index 0000000000..f29e20d7bf
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1269-overlays-Correct-some-compatible-strings.patch
@@ -0,0 +1,72 @@
+From 707f6e221946ec2025e8f0e2fedf92016ed8a5b7 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil at raspberrypi.com>
+Date: Fri, 2 Feb 2024 14:08:14 +0000
+Subject: [PATCH 1269/1295] overlays: Correct some compatible strings
+
+More thorough overlay testing has identified some Pi 4-specific
+overlays that has "brcm,bcm2835" compatible strings. Correct them.
+
+Signed-off-by: Phil Elwell <phil at raspberrypi.com>
+---
+ arch/arm/boot/dts/overlays/midi-uart2-overlay.dts  | 2 +-
+ arch/arm/boot/dts/overlays/midi-uart3-overlay.dts  | 2 +-
+ arch/arm/boot/dts/overlays/midi-uart4-overlay.dts  | 2 +-
+ arch/arm/boot/dts/overlays/midi-uart5-overlay.dts  | 2 +-
+ arch/arm/boot/dts/overlays/ramoops-pi4-overlay.dts | 2 +-
+ 5 files changed, 5 insertions(+), 5 deletions(-)
+
+--- a/arch/arm/boot/dts/overlays/midi-uart2-overlay.dts
++++ b/arch/arm/boot/dts/overlays/midi-uart2-overlay.dts
+@@ -12,7 +12,7 @@
+  */
+ 
+ /{
+-        compatible = "brcm,bcm2835";
++        compatible = "brcm,bcm2711";
+ 
+         fragment at 0 {
+                 target-path = "/";
+--- a/arch/arm/boot/dts/overlays/midi-uart3-overlay.dts
++++ b/arch/arm/boot/dts/overlays/midi-uart3-overlay.dts
+@@ -12,7 +12,7 @@
+  */
+ 
+ /{
+-        compatible = "brcm,bcm2835";
++        compatible = "brcm,bcm2711";
+ 
+         fragment at 0 {
+                 target-path = "/";
+--- a/arch/arm/boot/dts/overlays/midi-uart4-overlay.dts
++++ b/arch/arm/boot/dts/overlays/midi-uart4-overlay.dts
+@@ -12,7 +12,7 @@
+  */
+ 
+ /{
+-        compatible = "brcm,bcm2835";
++        compatible = "brcm,bcm2711";
+ 
+         fragment at 0 {
+                 target-path = "/";
+--- a/arch/arm/boot/dts/overlays/midi-uart5-overlay.dts
++++ b/arch/arm/boot/dts/overlays/midi-uart5-overlay.dts
+@@ -12,7 +12,7 @@
+  */
+ 
+ /{
+-        compatible = "brcm,bcm2835";
++        compatible = "brcm,bcm2711";
+ 
+         fragment at 0 {
+                 target-path = "/";
+--- a/arch/arm/boot/dts/overlays/ramoops-pi4-overlay.dts
++++ b/arch/arm/boot/dts/overlays/ramoops-pi4-overlay.dts
+@@ -2,7 +2,7 @@
+ /plugin/;
+ 
+ / {
+-	compatible = "brcm,bcm2835";
++	compatible = "brcm,bcm2711";
+ 
+ 	fragment at 0 {
+ 		target = <&rmem>;
diff --git a/target/linux/bcm27xx/patches-6.1/950-1270-overlays-Delete-deprecated-overlay-mpu6050.patch b/target/linux/bcm27xx/patches-6.1/950-1270-overlays-Delete-deprecated-overlay-mpu6050.patch
new file mode 100644
index 0000000000..3f1864f4ec
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1270-overlays-Delete-deprecated-overlay-mpu6050.patch
@@ -0,0 +1,57 @@
+From 223d1247c0b0c0659a65949b6b9c3de53fd14223 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil at raspberrypi.com>
+Date: Fri, 2 Feb 2024 14:14:47 +0000
+Subject: [PATCH 1270/1295] overlays: Delete deprecated overlay mpu6050
+
+The mpu6050 overlay has been deprecated for a year (when we were still
+shipping rpi-5.15.y). Delete it.
+
+Signed-off-by: Phil Elwell <phil at raspberrypi.com>
+---
+ arch/arm/boot/dts/overlays/Makefile           |  1 -
+ .../arm/boot/dts/overlays/mpu6050-overlay.dts | 29 -------------------
+ 2 files changed, 30 deletions(-)
+ delete mode 100644 arch/arm/boot/dts/overlays/mpu6050-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -172,7 +172,6 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
+ 	mipi-dbi-spi.dtbo \
+ 	mlx90640.dtbo \
+ 	mmc.dtbo \
+-	mpu6050.dtbo \
+ 	mz61581.dtbo \
+ 	ov2311.dtbo \
+ 	ov5647.dtbo \
+--- a/arch/arm/boot/dts/overlays/mpu6050-overlay.dts
++++ /dev/null
+@@ -1,29 +0,0 @@
+-// Definitions for MPU6050
+-/dts-v1/;
+-/plugin/;
+-
+-/ {
+-        compatible = "brcm,bcm2835";
+-
+-        fragment at 0 {
+-                target = <&i2c1>;
+-                __overlay__ {
+-                        #address-cells = <1>;
+-                        #size-cells = <0>;
+-                        status = "okay";
+-                        clock-frequency = <400000>;
+-
+-                        mpu6050: mpu6050 at 68 {
+-                                compatible = "invensense,mpu6050";
+-                                reg = <0x68>;
+-                                interrupt-parent = <&gpio>;
+-                                interrupts = <4 1>;
+-                        };
+-                };
+-        };
+-
+-        __overrides__ {
+-                interrupt = <&mpu6050>,"interrupts:0";
+-                addr = <&mpu6050>,"reg:0";
+-        };
+-};
diff --git a/target/linux/bcm27xx/patches-6.1/950-1271-drivers-media-cfe-Increase-default-size-of-embedded-.patch b/target/linux/bcm27xx/patches-6.1/950-1271-drivers-media-cfe-Increase-default-size-of-embedded-.patch
new file mode 100644
index 0000000000..90cfdc4ebe
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1271-drivers-media-cfe-Increase-default-size-of-embedded-.patch
@@ -0,0 +1,36 @@
+From beba81b0b77268f72d717ab8ec98afe11a176ee0 Mon Sep 17 00:00:00 2001
+From: Naushir Patuck <naush at raspberrypi.com>
+Date: Mon, 5 Feb 2024 12:12:17 +0000
+Subject: [PATCH 1271/1295] drivers: media: cfe: Increase default size of
+ embedded buffer
+
+Increase the size of the default embedded buffer to 16k. This is done to
+match what is advertised by the IMX219 driver and workaround a problem
+where the embedded stream is not actually used. Without full streams API
+support, the media pipeline validation will fail in these circumstances.
+
+Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
+---
+ drivers/media/platform/raspberrypi/rp1_cfe/cfe.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/media/platform/raspberrypi/rp1_cfe/cfe.c
++++ b/drivers/media/platform/raspberrypi/rp1_cfe/cfe.c
+@@ -93,7 +93,7 @@ MODULE_PARM_DESC(verbose_debug, "verbose
+ #define MIN_WIDTH 16
+ #define MIN_HEIGHT 16
+ /* Default size of the embedded buffer */
+-#define DEFAULT_EMBEDDED_SIZE 8192
++#define DEFAULT_EMBEDDED_SIZE 16384
+ 
+ const struct v4l2_mbus_framefmt cfe_default_format = {
+ 	.width = 640,
+@@ -107,7 +107,7 @@ const struct v4l2_mbus_framefmt cfe_defa
+ };
+ 
+ const struct v4l2_mbus_framefmt cfe_default_meta_format = {
+-	.width = 8192,
++	.width = DEFAULT_EMBEDDED_SIZE,
+ 	.height = 1,
+ 	.code = MEDIA_BUS_FMT_SENSOR_DATA,
+ 	.field = V4L2_FIELD_NONE,
diff --git a/target/linux/bcm27xx/patches-6.1/950-1274-serial-sc16is7xx-Don-t-spin-if-no-data-received.patch b/target/linux/bcm27xx/patches-6.1/950-1274-serial-sc16is7xx-Don-t-spin-if-no-data-received.patch
new file mode 100644
index 0000000000..e469b44880
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1274-serial-sc16is7xx-Don-t-spin-if-no-data-received.patch
@@ -0,0 +1,26 @@
+From 58c600f728f2787e905eff2f678fa9cf09694004 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil at raspberrypi.com>
+Date: Fri, 2 Feb 2024 15:41:29 +0000
+Subject: [PATCH 1274/1295] serial: sc16is7xx: Don't spin if no data received
+
+There are multiple causes of interrupts, errors being one, and only the
+receipt of data warrants continued polling.
+
+See: https://github.com/raspberrypi/linux/issues/2676
+
+Signed-off-by: Phil Elwell <phil at raspberrypi.com>
+---
+ drivers/tty/serial/sc16is7xx.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/tty/serial/sc16is7xx.c
++++ b/drivers/tty/serial/sc16is7xx.c
+@@ -762,6 +762,8 @@ static bool sc16is7xx_port_irq(struct sc
+ 
+ 		if (rxlen)
+ 			sc16is7xx_handle_rx(port, rxlen, iir);
++		else
++			rc = false;
+ 		break;
+ 		/* CTSRTS interrupt comes only when CTS goes inactive */
+ 	case SC16IS7XX_IIR_CTSRTS_SRC:
diff --git a/target/linux/bcm27xx/patches-6.1/950-1276-Impliment-driver-support-for-Interlude-Audio-Digital.patch b/target/linux/bcm27xx/patches-6.1/950-1276-Impliment-driver-support-for-Interlude-Audio-Digital.patch
new file mode 100644
index 0000000000..ff638aed61
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1276-Impliment-driver-support-for-Interlude-Audio-Digital.patch
@@ -0,0 +1,196 @@
+From fb21611efd7cd916646d9ab2988c3af08f139761 Mon Sep 17 00:00:00 2001
+From: Ben Payne <ben at bluerocksoft.com>
+Date: Tue, 13 Feb 2024 14:55:14 -0800
+Subject: [PATCH 1276/1295] Impliment driver support for Interlude Audio
+ Digital Hat
+
+Implementing driver support for
+Interlude audio's WM8805 based digital hat
+by leveraging existing drivers
+---
+ sound/soc/bcm/rpi-wm8804-soundcard.c | 139 +++++++++++++++++++++++++++
+ 1 file changed, 139 insertions(+)
+
+--- a/sound/soc/bcm/rpi-wm8804-soundcard.c
++++ b/sound/soc/bcm/rpi-wm8804-soundcard.c
+@@ -34,6 +34,7 @@
+ #include <linux/gpio/consumer.h>
+ #include <linux/platform_device.h>
+ #include <linux/module.h>
++#include <linux/delay.h>
+ 
+ #include <sound/core.h>
+ #include <sound/pcm.h>
+@@ -65,6 +66,10 @@ struct snd_rpi_wm8804_drvdata {
+ static struct gpio_desc *snd_clk44gpio;
+ static struct gpio_desc *snd_clk48gpio;
+ static int wm8804_samplerate = 0;
++static struct gpio_desc *led_gpio_1;
++static struct gpio_desc *led_gpio_2;
++static struct gpio_desc *led_gpio_3;
++static struct gpio_desc *custom_reset;
+ 
+ /* Forward declarations */
+ static struct snd_soc_dai_link snd_allo_digione_dai[];
+@@ -74,6 +79,37 @@ static struct snd_soc_card snd_rpi_wm880
+ #define CLK_44EN_RATE 22579200UL
+ #define CLK_48EN_RATE 24576000UL
+ 
++static const char * const wm8805_input_select_text[] = {
++	"Rx 0",
++	"Rx 1",
++	"Rx 2",
++	"Rx 3",
++	"Rx 4",
++	"Rx 5",
++	"Rx 6",
++	"Rx 7"
++};
++
++static const unsigned int wm8805_input_channel_select_value[] = {
++	0, 1, 2, 3, 4, 5, 6, 7
++};
++
++static const struct soc_enum wm8805_input_channel_sel[] = {
++	SOC_VALUE_ENUM_SINGLE(WM8804_PLL6, 0, 7, ARRAY_SIZE(wm8805_input_select_text),
++	wm8805_input_select_text, wm8805_input_channel_select_value),
++};
++
++static const struct snd_kcontrol_new wm8805_input_controls_card[] = {
++	SOC_ENUM("Select Input Channel", wm8805_input_channel_sel[0]),
++};
++
++static int wm8805_add_input_controls(struct snd_soc_component *component)
++{
++	snd_soc_add_component_controls(component, wm8805_input_controls_card,
++	ARRAY_SIZE(wm8805_input_controls_card));
++	return 0;
++}
++
+ static unsigned int snd_rpi_wm8804_enable_clock(unsigned int samplerate)
+ {
+ 	switch (samplerate) {
+@@ -187,6 +223,53 @@ static struct snd_soc_ops snd_rpi_wm8804
+ 	.hw_params = snd_rpi_wm8804_hw_params,
+ };
+ 
++static int snd_interlude_audio_hw_params(struct snd_pcm_substream *substream,
++		struct snd_pcm_hw_params *params)
++{
++	int ret = snd_rpi_wm8804_hw_params(substream, params);
++	int samplerate = params_rate(params);
++
++	switch (samplerate) {
++	case 44100:
++		gpiod_set_value_cansleep(led_gpio_1, 1);
++		gpiod_set_value_cansleep(led_gpio_2, 0);
++		gpiod_set_value_cansleep(led_gpio_3, 0);
++		break;
++	case 48000:
++		gpiod_set_value_cansleep(led_gpio_1, 1);
++		gpiod_set_value_cansleep(led_gpio_2, 0);
++		gpiod_set_value_cansleep(led_gpio_3, 0);
++		break;
++	case 88200:
++		gpiod_set_value_cansleep(led_gpio_1, 0);
++		gpiod_set_value_cansleep(led_gpio_2, 1);
++		gpiod_set_value_cansleep(led_gpio_3, 0);
++		break;
++	case 96000:
++		gpiod_set_value_cansleep(led_gpio_1, 0);
++		gpiod_set_value_cansleep(led_gpio_2, 1);
++		gpiod_set_value_cansleep(led_gpio_3, 0);
++		break;
++	case 176400:
++		gpiod_set_value_cansleep(led_gpio_1, 0);
++		gpiod_set_value_cansleep(led_gpio_2, 0);
++		gpiod_set_value_cansleep(led_gpio_3, 1);
++		break;
++	case 192000:
++		gpiod_set_value_cansleep(led_gpio_1, 0);
++		gpiod_set_value_cansleep(led_gpio_2, 0);
++		gpiod_set_value_cansleep(led_gpio_3, 1);
++		break;
++	default:
++		break;
++	}
++	return ret;
++}
++
++const struct snd_soc_ops interlude_audio_digital_dai_ops = {
++	.hw_params = snd_interlude_audio_hw_params,
++};
++
+ SND_SOC_DAILINK_DEFS(justboom_digi,
+ 	DAILINK_COMP_ARRAY(COMP_EMPTY()),
+ 	DAILINK_COMP_ARRAY(COMP_EMPTY()),
+@@ -287,6 +370,60 @@ static struct snd_rpi_wm8804_drvdata drv
+ 	.probe     = snd_hifiberry_digi_probe,
+ };
+ 
++SND_SOC_DAILINK_DEFS(interlude_audio_digital,
++	DAILINK_COMP_ARRAY(COMP_EMPTY()),
++	DAILINK_COMP_ARRAY(COMP_EMPTY()),
++	DAILINK_COMP_ARRAY(COMP_EMPTY()));
++
++static int snd_interlude_audio_init(struct snd_soc_pcm_runtime *rtd)
++{
++	struct snd_soc_component *component = asoc_rtd_to_codec(rtd, 0)->component;
++	int ret;
++
++	ret = wm8805_add_input_controls(component);
++	if (ret != 0)
++		pr_err("failed to add input controls");
++
++	return 0;
++}
++
++
++static struct snd_soc_dai_link snd_interlude_audio_digital_dai[] = {
++{
++	.name        = "Interlude Audio Digital",
++	.stream_name = "Interlude Audio Digital HiFi",
++	.init        = snd_interlude_audio_init,
++	.ops		 = &interlude_audio_digital_dai_ops,
++	SND_SOC_DAILINK_REG(interlude_audio_digital),
++},
++};
++
++
++static int snd_interlude_audio_digital_probe(struct platform_device *pdev)
++{
++	if (IS_ERR(snd_clk44gpio) || IS_ERR(snd_clk48gpio))
++		return 0;
++
++	custom_reset = devm_gpiod_get(&pdev->dev, "reset", GPIOD_OUT_LOW);
++	gpiod_set_value_cansleep(custom_reset, 0);
++	mdelay(10);
++	gpiod_set_value_cansleep(custom_reset, 1);
++
++	snd_interlude_audio_digital_dai->name = "Interlude Audio Digital";
++	snd_interlude_audio_digital_dai->stream_name = "Interlude Audio Digital HiFi";
++	led_gpio_1 = devm_gpiod_get(&pdev->dev, "led1", GPIOD_OUT_LOW);
++	led_gpio_2 = devm_gpiod_get(&pdev->dev, "led2", GPIOD_OUT_LOW);
++	led_gpio_3 = devm_gpiod_get(&pdev->dev, "led3", GPIOD_OUT_LOW);
++	return 0;
++}
++
++
++static struct snd_rpi_wm8804_drvdata drvdata_interlude_audio_digital = {
++	.card_name = "snd_IA_Digital_Hat",
++	.dai       = snd_interlude_audio_digital_dai,
++	.probe     = snd_interlude_audio_digital_probe,
++};
++
+ static const struct of_device_id snd_rpi_wm8804_of_match[] = {
+ 	{ .compatible = "justboom,justboom-digi",
+ 		.data = (void *) &drvdata_justboom_digi },
+@@ -296,6 +433,8 @@ static const struct of_device_id snd_rpi
+ 		.data = (void *) &drvdata_allo_digione },
+ 	{ .compatible = "hifiberry,hifiberry-digi",
+ 		.data = (void *) &drvdata_hifiberry_digi },
++	{ .compatible = "interludeaudio,interludeaudio-digital",
++		.data = (void *) &drvdata_interlude_audio_digital },
+ 	{},
+ };
+ 
diff --git a/target/linux/bcm27xx/patches-6.1/950-1277-Add-overlays-needed-for-Interlude-Audio-Digital-and-.patch b/target/linux/bcm27xx/patches-6.1/950-1277-Add-overlays-needed-for-Interlude-Audio-Digital-and-.patch
new file mode 100644
index 0000000000..2c4196ad4d
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1277-Add-overlays-needed-for-Interlude-Audio-Digital-and-.patch
@@ -0,0 +1,179 @@
+From d787ecf50d7a6ec32f8e1afcb8559600396c0f45 Mon Sep 17 00:00:00 2001
+From: Ben Payne <ben at bluerocksoft.com>
+Date: Tue, 13 Feb 2024 14:56:28 -0800
+Subject: [PATCH 1277/1295] Add overlays needed for Interlude Audio Digital and
+ Analog hats
+
+Adding 2 new overlays for use with
+Interlude Audio's Digital and Analog hats
+adding descriptions for both in README
+adding changes to Makefile to include both DT's
+---
+ arch/arm/boot/dts/overlays/Makefile           |  2 +
+ arch/arm/boot/dts/overlays/README             | 12 +++
+ .../interludeaudio-analog-overlay.dts         | 73 +++++++++++++++++++
+ .../interludeaudio-digital-overlay.dts        | 49 +++++++++++++
+ 4 files changed, 136 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/interludeaudio-analog-overlay.dts
+ create mode 100644 arch/arm/boot/dts/overlays/interludeaudio-digital-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -131,6 +131,8 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
+ 	imx477.dtbo \
+ 	imx519.dtbo \
+ 	imx708.dtbo \
++	interludeaudio-analog.dtbo \
++	interludeaudio-digital.dtbo \
+ 	iqaudio-codec.dtbo \
+ 	iqaudio-dac.dtbo \
+ 	iqaudio-dacplus.dtbo \
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -2708,6 +2708,18 @@ Params: rotation                Mounting
+                                 450000000 (default), 447000000, 453000000.
+ 
+ 
++Name:   interludeaudio-analog
++Info:   Configures Interlude Audio Analog Hat audio card
++Load:   dtoverlay=interludeaudio-analog,<param>=<val>
++Params: gpiopin                 GPIO pin for codec reset
++
++
++Name:   interludeaudio-digital
++Info:   Configures Interlude Audio Digital Hat audio card
++Load:   dtoverlay=interludeaudio-digital
++Params: <None>
++
++
+ Name:   iqaudio-codec
+ Info:   Configures the IQaudio Codec audio card
+ Load:   dtoverlay=iqaudio-codec
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/interludeaudio-analog-overlay.dts
+@@ -0,0 +1,73 @@
++// Definitions for Interlude audio analog hat
++/dts-v1/;
++/plugin/;
++
++/ {
++	compatible = "brcm,bcm2835";
++
++	fragment at 0 {
++		target = <&sound>;
++		__overlay__ {
++			compatible = "simple-audio-card";
++			i2s-controller = <&i2s_clk_consumer>;
++			status = "okay";
++
++			simple-audio-card,name = "snd_IA_Analog_Hat";
++
++			simple-audio-card,widgets =
++				"Line", "Line In",
++				"Line", "Line Out";
++
++			simple-audio-card,routing =
++				"Line Out","AOUTA+",
++				"Line Out","AOUTA-",
++				"Line Out","AOUTB+",
++				"Line Out","AOUTB-",
++				"AINA","Line In",
++				"AINB","Line In";
++
++			simple-audio-card,format = "i2s";
++
++			simple-audio-card,bitclock-master = <&sound_master>;
++			simple-audio-card,frame-master = <&sound_master>;
++
++			simple-audio-card,cpu {
++				sound-dai = <&i2s>;
++				dai-tdm-slot-num = <2>;
++				dai-tdm-slot-width = <32>;
++			};
++
++			sound_master: simple-audio-card,codec {
++				sound-dai = <&cs4271>;
++				system-clock-frequency = <24576000>;
++			};
++		};
++	};
++
++	fragment at 1 {
++		target = <&i2s_clk_consumer>;
++		__overlay__ {
++			status = "okay";
++		};
++	};
++
++	fragment at 2 {
++		target = <&i2c1>;
++		__overlay__ {
++			#address-cells = <1>;
++			#size-cells = <0>;
++			status = "okay";
++
++			cs4271: cs4271 at 10 {
++				#sound-dai-cells = <0>;
++				compatible = "cirrus,cs4271";
++				reg = <0x10>;
++				status = "okay";
++				reset-gpio = <&gpio 24 0>; /* Pin 26, active high */
++			};
++		};
++	};
++	__overrides__ {
++		gpiopin = <&cs4271>,"reset-gpio:4";
++	};
++};
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/interludeaudio-digital-overlay.dts
+@@ -0,0 +1,49 @@
++// Definitions for Interlude Audio Digital Hat
++/dts-v1/;
++/plugin/;
++
++/ {
++	compatible = "brcm,bcm2835";
++
++	fragment at 0 {
++		target = <&i2s_clk_consumer>;
++		__overlay__ {
++			status = "okay";
++		};
++	};
++
++	fragment at 1 {
++		target = <&i2c1>;
++		__overlay__ {
++			#address-cells = <1>;
++			#size-cells = <0>;
++			status = "okay";
++
++			wm8804 at 3b {
++				#sound-dai-cells = <0>;
++				compatible = "wlf,wm8804";
++				reg = <0x3b>;
++				PVDD-supply = <&vdd_3v3_reg>;
++				DVDD-supply = <&vdd_3v3_reg>;
++				status = "okay";
++			};
++		};
++	};
++
++
++	fragment at 2 {
++		target = <&sound>;
++		__overlay__ {
++			compatible = "interludeaudio,interludeaudio-digital";
++			i2s-controller = <&i2s_clk_consumer>;
++			status = "okay";
++			clock44-gpio = <&gpio 22 0>;
++			clock48-gpio = <&gpio 27 0>;
++			led1-gpio = <&gpio 13 0>;
++			led2-gpio = <&gpio 12 0>;
++			led3-gpio = <&gpio 6 0>;
++			reset-gpio = <&gpio 23 0>;
++		};
++	};
++
++};
diff --git a/target/linux/bcm27xx/patches-6.1/950-1279-drm-v3d-Enable-V3D-to-use-different-PAGE_SIZE.patch b/target/linux/bcm27xx/patches-6.1/950-1279-drm-v3d-Enable-V3D-to-use-different-PAGE_SIZE.patch
new file mode 100644
index 0000000000..39d4ce9067
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1279-drm-v3d-Enable-V3D-to-use-different-PAGE_SIZE.patch
@@ -0,0 +1,118 @@
+From eb06d31da3e2025a2e578d8de9843e24b68137a6 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ma=C3=ADra=20Canal?= <mcanal at igalia.com>
+Date: Tue, 13 Feb 2024 15:26:44 -0300
+Subject: [PATCH 1279/1295] drm/v3d: Enable V3D to use different PAGE_SIZE
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Currently, the V3D driver uses PAGE_SHIFT over the assumption that
+PAGE_SHIFT = 12, as the PAGE_SIZE = 4KB. But, the RPi 5 is using
+PAGE_SIZE = 16KB, so the MMU PAGE_SHIFT is different than the system's
+PAGE_SHIFT.
+
+Enable V3D to be used in system's with any PAGE_SIZE by making sure that
+everything MMU-related uses the MMU page shift.
+
+Signed-off-by: Maíra Canal <mcanal at igalia.com>
+---
+ drivers/gpu/drm/v3d/v3d_bo.c      | 12 ++++++------
+ drivers/gpu/drm/v3d/v3d_debugfs.c |  2 +-
+ drivers/gpu/drm/v3d/v3d_drv.h     |  2 ++
+ drivers/gpu/drm/v3d/v3d_irq.c     |  2 +-
+ drivers/gpu/drm/v3d/v3d_mmu.c     |  2 --
+ 5 files changed, 10 insertions(+), 10 deletions(-)
+
+--- a/drivers/gpu/drm/v3d/v3d_bo.c
++++ b/drivers/gpu/drm/v3d/v3d_bo.c
+@@ -37,7 +37,7 @@ void v3d_free_object(struct drm_gem_obje
+ 
+ 	mutex_lock(&v3d->bo_lock);
+ 	v3d->bo_stats.num_allocated--;
+-	v3d->bo_stats.pages_allocated -= obj->size >> PAGE_SHIFT;
++	v3d->bo_stats.pages_allocated -= obj->size >> V3D_MMU_PAGE_SHIFT;
+ 	mutex_unlock(&v3d->bo_lock);
+ 
+ 	spin_lock(&v3d->mm_lock);
+@@ -106,8 +106,8 @@ v3d_bo_create_finish(struct drm_gem_obje
+ 	 * lifetime of the BO.
+ 	 */
+ 	ret = drm_mm_insert_node_generic(&v3d->mm, &bo->node,
+-					 obj->size >> PAGE_SHIFT,
+-					 GMP_GRANULARITY >> PAGE_SHIFT, 0, 0);
++					 obj->size >> V3D_MMU_PAGE_SHIFT,
++					 GMP_GRANULARITY >> V3D_MMU_PAGE_SHIFT, 0, 0);
+ 	spin_unlock(&v3d->mm_lock);
+ 	if (ret)
+ 		return ret;
+@@ -115,7 +115,7 @@ v3d_bo_create_finish(struct drm_gem_obje
+ 	/* Track stats for /debug/dri/n/bo_stats. */
+ 	mutex_lock(&v3d->bo_lock);
+ 	v3d->bo_stats.num_allocated++;
+-	v3d->bo_stats.pages_allocated += obj->size >> PAGE_SHIFT;
++	v3d->bo_stats.pages_allocated += obj->size >> V3D_MMU_PAGE_SHIFT;
+ 	mutex_unlock(&v3d->bo_lock);
+ 
+ 	v3d_mmu_insert_ptes(bo);
+@@ -183,7 +183,7 @@ int v3d_create_bo_ioctl(struct drm_devic
+ 	if (IS_ERR(bo))
+ 		return PTR_ERR(bo);
+ 
+-	args->offset = bo->node.start << PAGE_SHIFT;
++	args->offset = bo->node.start << V3D_MMU_PAGE_SHIFT;
+ 
+ 	ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle);
+ 	drm_gem_object_put(&bo->base.base);
+@@ -228,7 +228,7 @@ int v3d_get_bo_offset_ioctl(struct drm_d
+ 	}
+ 	bo = to_v3d_bo(gem_obj);
+ 
+-	args->offset = bo->node.start << PAGE_SHIFT;
++	args->offset = bo->node.start << V3D_MMU_PAGE_SHIFT;
+ 
+ 	drm_gem_object_put(gem_obj);
+ 	return 0;
+--- a/drivers/gpu/drm/v3d/v3d_debugfs.c
++++ b/drivers/gpu/drm/v3d/v3d_debugfs.c
+@@ -220,7 +220,7 @@ static int v3d_debugfs_bo_stats(struct s
+ 	seq_printf(m, "allocated bos:          %d\n",
+ 		   v3d->bo_stats.num_allocated);
+ 	seq_printf(m, "allocated bo size (kb): %ld\n",
+-		   (long)v3d->bo_stats.pages_allocated << (PAGE_SHIFT - 10));
++		   (long)v3d->bo_stats.pages_allocated << (V3D_MMU_PAGE_SHIFT - 10));
+ 	mutex_unlock(&v3d->bo_lock);
+ 
+ 	return 0;
+--- a/drivers/gpu/drm/v3d/v3d_drv.h
++++ b/drivers/gpu/drm/v3d/v3d_drv.h
+@@ -19,6 +19,8 @@ struct reset_control;
+ 
+ #define GMP_GRANULARITY (128 * 1024)
+ 
++#define V3D_MMU_PAGE_SHIFT 12
++
+ #define V3D_MAX_QUEUES (V3D_CACHE_CLEAN + 1)
+ 
+ static inline char *
+--- a/drivers/gpu/drm/v3d/v3d_irq.c
++++ b/drivers/gpu/drm/v3d/v3d_irq.c
+@@ -70,7 +70,7 @@ v3d_overflow_mem_work(struct work_struct
+ 	list_add_tail(&bo->unref_head, &v3d->bin_job->render->unref_list);
+ 	spin_unlock_irqrestore(&v3d->job_lock, irqflags);
+ 
+-	V3D_CORE_WRITE(0, V3D_PTB_BPOA, bo->node.start << PAGE_SHIFT);
++	V3D_CORE_WRITE(0, V3D_PTB_BPOA, bo->node.start << V3D_MMU_PAGE_SHIFT);
+ 	V3D_CORE_WRITE(0, V3D_PTB_BPOS, obj->size);
+ 
+ out:
+--- a/drivers/gpu/drm/v3d/v3d_mmu.c
++++ b/drivers/gpu/drm/v3d/v3d_mmu.c
+@@ -21,8 +21,6 @@
+ #include "v3d_drv.h"
+ #include "v3d_regs.h"
+ 
+-#define V3D_MMU_PAGE_SHIFT 12
+-
+ /* Note: All PTEs for the 1MB superpage must be filled with the
+  * superpage bit set.
+  */
diff --git a/target/linux/bcm27xx/patches-6.1/950-1280-overlays-adau1977-adc-Replace-use-of-i2c-label.patch b/target/linux/bcm27xx/patches-6.1/950-1280-overlays-adau1977-adc-Replace-use-of-i2c-label.patch
new file mode 100644
index 0000000000..bb28d9369e
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1280-overlays-adau1977-adc-Replace-use-of-i2c-label.patch
@@ -0,0 +1,25 @@
+From aa00918b9562daa3b776600f48d8264b20fd54f6 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil at raspberrypi.com>
+Date: Sun, 18 Feb 2024 15:31:50 +0000
+Subject: [PATCH 1280/1295] overlays: adau1977-adc: Replace use of i2c label
+
+The label 'i2c' is no longer created by the firmware - i2c_arm or
+i2c1 should be used instead. Replace the last occurrence of &i2c with
+&i2c1.
+
+Signed-off-by: Phil Elwell <phil at raspberrypi.com>
+---
+ arch/arm/boot/dts/overlays/adau1977-adc-overlay.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/arm/boot/dts/overlays/adau1977-adc-overlay.dts
++++ b/arch/arm/boot/dts/overlays/adau1977-adc-overlay.dts
+@@ -6,7 +6,7 @@
+ 	compatible = "brcm,bcm2835";
+     
+ 	fragment at 0 {
+-        	target = <&i2c>;
++		target = <&i2c1>;
+         	
+ 		__overlay__ {
+ 			#address-cells = <1>;
diff --git a/target/linux/bcm27xx/patches-6.1/950-1281-Add-IQaudio-CodecZero-to-hat_map.dts.patch b/target/linux/bcm27xx/patches-6.1/950-1281-Add-IQaudio-CodecZero-to-hat_map.dts.patch
new file mode 100644
index 0000000000..399c293e1f
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1281-Add-IQaudio-CodecZero-to-hat_map.dts.patch
@@ -0,0 +1,24 @@
+From afd5f659b0453e4c710ce5cf74c577563ff16239 Mon Sep 17 00:00:00 2001
+From: Andrew Scheller <andrew.scheller at raspberrypi.com>
+Date: Tue, 20 Feb 2024 17:53:03 +0000
+Subject: [PATCH 1281/1295] Add IQaudio CodecZero to hat_map.dts
+
+Fixes https://github.com/raspberrypi/Pi-Codec/issues/9
+---
+ arch/arm/boot/dts/overlays/hat_map.dts | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/arch/arm/boot/dts/overlays/hat_map.dts
++++ b/arch/arm/boot/dts/overlays/hat_map.dts
+@@ -6,6 +6,11 @@
+ 		overlay = "iqaudio-codec";
+ 	};
+ 
++	iqaudio-pi-codeczero {
++		uuid = [ e15c739c 877d 4e29 ab36 4dc73c21127c ];
++		overlay = "iqaudio-codec";
++	};
++
+ 	pisound {
+ 		uuid = [ a7ee5d28 da03 41f5 bbd7 20438a4bec5d ];
+ 		overlay = "pisound";
diff --git a/target/linux/bcm27xx/patches-6.1/950-1282-ASOc-Add-HiFiBerry-DAC8X-to-the-simple-card-driver.patch b/target/linux/bcm27xx/patches-6.1/950-1282-ASOc-Add-HiFiBerry-DAC8X-to-the-simple-card-driver.patch
new file mode 100644
index 0000000000..dadd8123be
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1282-ASOc-Add-HiFiBerry-DAC8X-to-the-simple-card-driver.patch
@@ -0,0 +1,82 @@
+From d4acd8b7ea890c01453cdcf9b04a999ca04dfd2a Mon Sep 17 00:00:00 2001
+From: j-schambacher <joerg at hifiberry.com>
+Date: Wed, 28 Feb 2024 11:25:14 +0100
+Subject: [PATCH 1282/1295] ASOc: Add HiFiBerry DAC8X to the simple card driver
+
+Defines the settings for the 8 channel version of the standard
+DAC by overwriting the number of channels in the DAI defs.
+It can run in 8ch mode only on PI5 using the 4 lane data output
+of the designware I2S0 module.
+
+Signed-off-by: j-schambacher <joerg at hifiberry.com>
+---
+ sound/soc/bcm/Kconfig                |  5 +++--
+ sound/soc/bcm/rpi-simple-soundcard.c | 33 ++++++++++++++++++++++++++++
+ 2 files changed, 36 insertions(+), 2 deletions(-)
+
+--- a/sound/soc/bcm/Kconfig
++++ b/sound/soc/bcm/Kconfig
+@@ -40,11 +40,12 @@ config SND_BCM2708_SOC_GOOGLEVOICEHAT_SO
+           Say Y or M if you want to add support for voiceHAT soundcard.
+ 
+ config SND_BCM2708_SOC_HIFIBERRY_DAC
+-        tristate "Support for HifiBerry DAC"
++        tristate "Support for HifiBerry DAC and DAC8X"
+         select SND_SOC_PCM5102A
+         select SND_RPI_SIMPLE_SOUNDCARD
+         help
+-         Say Y or M if you want to add support for HifiBerry DAC.
++         Say Y or M if you want to add support for HifiBerry DAC and DAC8X.
++         Note: DAC8X only works on PI5
+ 
+ config SND_BCM2708_SOC_HIFIBERRY_DACPLUS
+         tristate "Support for HifiBerry DAC+"
+--- a/sound/soc/bcm/rpi-simple-soundcard.c
++++ b/sound/soc/bcm/rpi-simple-soundcard.c
+@@ -316,6 +316,37 @@ static struct snd_rpi_simple_drvdata drv
+ 	.dai       = snd_hifiberry_dac_dai,
+ };
+ 
++static int hifiberry_dac8x_init(struct snd_soc_pcm_runtime *rtd)
++{
++	struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
++
++	/* override the defaults to reflect 4 x PCM5102A on the card
++	 * and limit the sample rate to 192ksps
++	 */
++	codec_dai->driver->playback.channels_max = 8;
++	codec_dai->driver->playback.rates = SNDRV_PCM_RATE_8000_192000;
++
++	return 0;
++}
++
++static struct snd_soc_dai_link snd_hifiberry_dac8x_dai[] = {
++	{
++		.name           = "HifiBerry DAC8x",
++		.stream_name    = "HifiBerry DAC8x HiFi",
++		.dai_fmt        = SND_SOC_DAIFMT_I2S |
++					SND_SOC_DAIFMT_NB_NF |
++					SND_SOC_DAIFMT_CBS_CFS,
++		.init           = hifiberry_dac8x_init,
++		SND_SOC_DAILINK_REG(hifiberry_dac),
++	},
++};
++
++static struct snd_rpi_simple_drvdata drvdata_hifiberry_dac8x = {
++	.card_name = "snd_rpi_hifiberry_dac8x",
++	.dai       = snd_hifiberry_dac8x_dai,
++	.fixed_bclk_ratio = 64,
++};
++
+ SND_SOC_DAILINK_DEFS(dionaudio_kiwi,
+ 	DAILINK_COMP_ARRAY(COMP_EMPTY()),
+ 	DAILINK_COMP_ARRAY(COMP_CODEC("pcm1794a-codec", "pcm1794a-hifi")),
+@@ -417,6 +448,8 @@ static const struct of_device_id snd_rpi
+ 		.data = (void *) &drvdata_hifiberry_amp3 },
+ 	{ .compatible = "hifiberry,hifiberry-dac",
+ 		.data = (void *) &drvdata_hifiberry_dac },
++	{ .compatible = "hifiberry,hifiberry-dac8x",
++		.data = (void *) &drvdata_hifiberry_dac8x },
+ 	{ .compatible = "dionaudio,dionaudio-kiwi",
+ 		.data = (void *) &drvdata_dionaudio_kiwi },
+ 	{ .compatible = "rpi,rpi-dac", &drvdata_rpi_dac},
diff --git a/target/linux/bcm27xx/patches-6.1/950-1283-Overlays-Add-definitions-for-HiFiBerry-8-channel-DAC.patch b/target/linux/bcm27xx/patches-6.1/950-1283-Overlays-Add-definitions-for-HiFiBerry-8-channel-DAC.patch
new file mode 100644
index 0000000000..b383b744e7
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1283-Overlays-Add-definitions-for-HiFiBerry-8-channel-DAC.patch
@@ -0,0 +1,113 @@
+From 813135a7ff3f0c2b91dc06a5b3f8deac15570466 Mon Sep 17 00:00:00 2001
+From: j-schambacher <joerg at hifiberry.com>
+Date: Wed, 28 Feb 2024 11:34:05 +0100
+Subject: [PATCH 1283/1295] Overlays: Add definitions for HiFiBerry 8 channel
+ DAC8X
+
+Dedicated overlay claiming all 4 data lanes of the designware
+I2S0 module to drive 4x PCM5102. THe devices share BCLK and
+LRCLK, therefore all outputs will always run at the same
+samplerate and format.
+
+Compatible only with PI5!
+
+Signed-off-by: j-schambacher <joerg at hifiberry.com>
+---
+ arch/arm/boot/dts/overlays/Makefile           |  1 +
+ arch/arm/boot/dts/overlays/README             |  6 +++
+ .../dts/overlays/hifiberry-dac8x-overlay.dts  | 50 +++++++++++++++++++
+ arch/arm/boot/dts/overlays/overlay_map.dts    |  4 ++
+ 4 files changed, 61 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/hifiberry-dac8x-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -88,6 +88,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
+ 	hifiberry-amp3.dtbo \
+ 	hifiberry-amp4pro.dtbo \
+ 	hifiberry-dac.dtbo \
++	hifiberry-dac8x.dtbo \
+ 	hifiberry-dacplus.dtbo \
+ 	hifiberry-dacplusadc.dtbo \
+ 	hifiberry-dacplusadcpro.dtbo \
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -1772,6 +1772,12 @@ Load:   dtoverlay=hifiberry-dac
+ Params: <None>
+ 
+ 
++Name:   hifiberry-dac8x
++Info:   Configures the HifiBerry DAC8X audio cards (only on PI5)
++Load:   dtoverlay=hifiberry-dac8x
++Params: <None>
++
++
+ Name:   hifiberry-dacplus
+ Info:   Configures the HifiBerry DAC+ audio card
+ Load:   dtoverlay=hifiberry-dacplus,<param>=<val>
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/hifiberry-dac8x-overlay.dts
+@@ -0,0 +1,50 @@
++// Definitions for HiFiBerry DAC8x
++/dts-v1/;
++/plugin/;
++
++/ {
++	compatible = "brcm,bcm2712";
++
++	fragment at 0 {
++		target = <&gpio>;
++		__overlay__ {
++			rp1_i2s0_dac8x: rp1_i2s0_dac8x {
++				function = "i2s0";
++				pins = "gpio18", "gpio19", "gpio21",
++				       "gpio23", "gpio25", "gpio27";
++				bias-disable;
++				status = "okay";
++			};
++		};
++	};
++
++	fragment at 1 {
++		target = <&i2s_clk_producer>;
++		__overlay__ {
++			pinctrl-names = "default";
++			pinctrl-0 = <&rp1_i2s0_dac8x>;
++			status = "okay";
++		};
++	};
++
++	fragment at 2 {
++		target-path = "/";
++		__overlay__ {
++			pcm5102a-codec {
++				#sound-dai-cells = <0>;
++				compatible = "ti,pcm5102a";
++				status = "okay";
++			};
++		};
++	};
++
++	fragment at 3 {
++		target = <&sound>;
++		__overlay__ {
++			compatible = "hifiberry,hifiberry-dac8x";
++			i2s-controller = <&i2s_clk_producer>;
++			status = "okay";
++		};
++	};
++
++};
+--- a/arch/arm/boot/dts/overlays/overlay_map.dts
++++ b/arch/arm/boot/dts/overlays/overlay_map.dts
+@@ -48,6 +48,10 @@
+ 		bcm2712;
+ 	};
+ 
++	hifiberry-dac8x {
++		bcm2712;
++	};
++
+ 	highperi {
+ 		bcm2711;
+ 	};
diff --git a/target/linux/bcm27xx/patches-6.1/950-1285-vc4-hvs-Fix-lbm-size-calculation-for-yuv-6012.patch b/target/linux/bcm27xx/patches-6.1/950-1285-vc4-hvs-Fix-lbm-size-calculation-for-yuv-6012.patch
new file mode 100644
index 0000000000..cb4681909e
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1285-vc4-hvs-Fix-lbm-size-calculation-for-yuv-6012.patch
@@ -0,0 +1,31 @@
+From c0169f2c197d005aff8acfbc618de6e7f6b1ab94 Mon Sep 17 00:00:00 2001
+From: Florian Wesch <fw at dividuum.de>
+Date: Tue, 5 Mar 2024 15:17:56 +0100
+Subject: [PATCH 1285/1295] vc4/hvs: Fix lbm size calculation for yuv (#6012)
+
+The code was reducing the number of components by one when we were not
+blending with alpha. But that only makes sense if the components include
+alpha.
+
+For YUV, we were reducing the number of components for Y from one to zero
+which resulted in no lbm space being allocated.
+
+Fixes: https://github.com/raspberrypi/linux/issues/5912
+
+Signed-off-by: Dom Cobley <popcornmix at gmail.com>
+Co-authored-by: Dom Cobley <popcornmix at gmail.com>
+---
+ drivers/gpu/drm/vc4/vc4_plane.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_plane.c
++++ b/drivers/gpu/drm/vc4/vc4_plane.c
+@@ -733,7 +733,7 @@ static unsigned int vc4_lbm_channel_size
+ 	if (!components)
+ 		return 0;
+ 
+-	if (state->alpha != DRM_BLEND_ALPHA_OPAQUE)
++	if (state->alpha != DRM_BLEND_ALPHA_OPAQUE && info->has_alpha)
+ 		components -= 1;
+ 
+ 	words = width * wpc * components;
diff --git a/target/linux/bcm27xx/patches-6.1/950-1286-Driver-add-waveshare-4inch-dsi-lcd-C-driver.patch b/target/linux/bcm27xx/patches-6.1/950-1286-Driver-add-waveshare-4inch-dsi-lcd-C-driver.patch
new file mode 100644
index 0000000000..4bda41a791
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1286-Driver-add-waveshare-4inch-dsi-lcd-C-driver.patch
@@ -0,0 +1,41 @@
+From 50da59d237df59b38c5e3c375b3df8fabbda1069 Mon Sep 17 00:00:00 2001
+From: Eng33 <eng33 at waveshare.net>
+Date: Fri, 8 Mar 2024 18:36:37 +0800
+Subject: [PATCH 1286/1295] Driver:add waveshare 4inch dsi lcd (C) driver
+
+Signed-off-by: Eng33 <eng33 at waveshare.net>
+---
+ drivers/gpu/drm/panel/panel-waveshare-dsi.c | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+--- a/drivers/gpu/drm/panel/panel-waveshare-dsi.c
++++ b/drivers/gpu/drm/panel/panel-waveshare-dsi.c
+@@ -138,6 +138,18 @@ static const struct drm_display_mode ws_
+ 	.vtotal = 1480 + 60 + 60 + 60,
+ };
+ 
++static const struct drm_display_mode ws_panel_4_mode = {
++	.clock = 50000,
++	.hdisplay = 720,
++	.hsync_start = 720 + 32,
++	.hsync_end = 720 + 32 + 200,
++	.htotal = 720 + 32 + 200 + 120,
++	.vdisplay = 720,
++	.vsync_start = 720 + 8,
++	.vsync_end = 720 + 8 + 4,
++	.vtotal = 720 + 8 + 4 + 16,
++};
++
+ static struct ws_panel *panel_to_ts(struct drm_panel *panel)
+ {
+ 	return container_of(panel, struct ws_panel, base);
+@@ -399,6 +411,9 @@ static const struct of_device_id ws_pane
+ 		.compatible = "waveshare,11.9inch-panel",
+ 		.data = &ws_panel_11_9_mode,
+ 	}, {
++		.compatible = "waveshare,4inch-panel",
++		.data = &ws_panel_4_mode,
++	}, {
+ 		/* sentinel */
+ 	}
+ };
diff --git a/target/linux/bcm27xx/patches-6.1/950-1287-Dtoverlay-add-waveshare-4inch-dsi-lcd-C-dtoverlay.patch b/target/linux/bcm27xx/patches-6.1/950-1287-Dtoverlay-add-waveshare-4inch-dsi-lcd-C-dtoverlay.patch
new file mode 100644
index 0000000000..605ad842cf
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1287-Dtoverlay-add-waveshare-4inch-dsi-lcd-C-dtoverlay.patch
@@ -0,0 +1,22 @@
+From bb2f912c94d11a0f0b5f13c91793fa9f79eb92aa Mon Sep 17 00:00:00 2001
+From: Eng33 <eng33 at waveshare.net>
+Date: Fri, 8 Mar 2024 18:37:03 +0800
+Subject: [PATCH 1287/1295] Dtoverlay:add waveshare 4inch dsi lcd (C) dtoverlay
+
+Signed-off-by: Eng33 <eng33 at waveshare.net>
+---
+ .../boot/dts/overlays/vc4-kms-dsi-waveshare-panel-overlay.dts  | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/arch/arm/boot/dts/overlays/vc4-kms-dsi-waveshare-panel-overlay.dts
++++ b/arch/arm/boot/dts/overlays/vc4-kms-dsi-waveshare-panel-overlay.dts
+@@ -112,6 +112,9 @@
+ 				   <&touch>, "touchscreen-size-y:0=1480",
+ 				   <&touch>, "touchscreen-inverted-x?",
+ 				   <&touch>, "touchscreen-swapped-x-y?";
++		4_0_inchC = <&panel>, "compatible=waveshare,4inch-panel",
++				   <&touch>, "touchscreen-size-x:0=720",
++				   <&touch>, "touchscreen-size-y:0=720";
+ 		i2c1 = <&i2c_frag>, "target:0=",<&i2c1>,
+ 		       <0>, "-3-4+5";
+ 		disable_touch = <&touch>, "status=disabled";
diff --git a/target/linux/bcm27xx/patches-6.1/950-1288-Dtoverlay-fix-waveshare-11.9inch-touch-orientation-e.patch b/target/linux/bcm27xx/patches-6.1/950-1288-Dtoverlay-fix-waveshare-11.9inch-touch-orientation-e.patch
new file mode 100644
index 0000000000..868c162cc4
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1288-Dtoverlay-fix-waveshare-11.9inch-touch-orientation-e.patch
@@ -0,0 +1,22 @@
+From 29cc64d7d94f9a6ee0e97e8009b832514d2525e0 Mon Sep 17 00:00:00 2001
+From: Eng33 <eng33 at waveshare.net>
+Date: Fri, 8 Mar 2024 18:38:33 +0800
+Subject: [PATCH 1288/1295] Dtoverlay:fix waveshare 11.9inch touch orientation
+ error
+
+Signed-off-by: Eng33 <eng33 at waveshare.net>
+---
+ .../boot/dts/overlays/vc4-kms-dsi-waveshare-panel-overlay.dts   | 2 --
+ 1 file changed, 2 deletions(-)
+
+--- a/arch/arm/boot/dts/overlays/vc4-kms-dsi-waveshare-panel-overlay.dts
++++ b/arch/arm/boot/dts/overlays/vc4-kms-dsi-waveshare-panel-overlay.dts
+@@ -108,8 +108,6 @@
+ 				   <&touch>, "touchscreen-inverted-x?",
+ 				   <&touch>, "touchscreen-swapped-x-y?";
+ 		11_9_inch = <&panel>, "compatible=waveshare,11.9inch-panel",
+-				   <&touch>, "touchscreen-size-x:0=320",
+-				   <&touch>, "touchscreen-size-y:0=1480",
+ 				   <&touch>, "touchscreen-inverted-x?",
+ 				   <&touch>, "touchscreen-swapped-x-y?";
+ 		4_0_inchC = <&panel>, "compatible=waveshare,4inch-panel",
diff --git a/target/linux/bcm27xx/patches-6.1/950-1289-Dtoverlay-Add-waveshare-4inch-dsi-lcd-C-parameters-t.patch b/target/linux/bcm27xx/patches-6.1/950-1289-Dtoverlay-Add-waveshare-4inch-dsi-lcd-C-parameters-t.patch
new file mode 100644
index 0000000000..ea72100e52
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1289-Dtoverlay-Add-waveshare-4inch-dsi-lcd-C-parameters-t.patch
@@ -0,0 +1,21 @@
+From 8db8a2b856a24dd30b201c9af3238cedaf5f0c58 Mon Sep 17 00:00:00 2001
+From: Eng33 <eng33 at waveshare.net>
+Date: Mon, 11 Mar 2024 10:00:23 +0800
+Subject: [PATCH 1289/1295] Dtoverlay:Add waveshare 4inch dsi lcd (C)
+ parameters to the README
+
+Signed-off-by: Eng33 <eng33 at waveshare.net>
+---
+ arch/arm/boot/dts/overlays/README | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -5011,6 +5011,7 @@ Load:   dtoverlay=vc4-kms-dsi-waveshare-
+ Params: 2_8_inch                2.8" 480x640
+         3_4_inch                3.4" 800x800 round
+         4_0_inch                4.0" 480x800
++        4_0_inchC               4.0" 720x720
+         7_0_inchC               7.0" C 1024x600
+         7_9_inch                7.9" 400x1280
+         8_0_inch                8.0" 1280x800
diff --git a/target/linux/bcm27xx/patches-6.1/950-1290-Overlays-Add-specific-clk-producer-consumer-overlays.patch b/target/linux/bcm27xx/patches-6.1/950-1290-Overlays-Add-specific-clk-producer-consumer-overlays.patch
new file mode 100644
index 0000000000..477276a59a
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1290-Overlays-Add-specific-clk-producer-consumer-overlays.patch
@@ -0,0 +1,223 @@
+From 9e31e8ce44ef11cabcb1b95830e1fdd8a9655ad3 Mon Sep 17 00:00:00 2001
+From: j-schambacher <joerg at hifiberry.com>
+Date: Mon, 11 Mar 2024 15:32:28 +0100
+Subject: [PATCH 1290/1295] Overlays:Add specific clk-producer/-consumer
+ overlays for Hifiberry DAC+
+
+As the easy switching of the I2S module bewteen clock producer/consumer
+on the PI5 is not possible, two specific DT-overlays are introduced.
+The DAC+PRO boards with onboard clocks use the -PRO overlay, the boards
+without oscillators the -STD version.
+The "hifiberry-dacplus,slave" parameter in the -STD overlay disables
+the automatic clock detection inside the hifiberry-dacplus driver.
+
+The former hifiberry-dacplus overlay is kept for compatibility but
+will be deprecated.
+
+Signed-off-by: j-schambacher <joerg at hifiberry.com>
+---
+ arch/arm/boot/dts/overlays/Makefile           |  2 +
+ arch/arm/boot/dts/overlays/README             | 42 ++++++++++++
+ .../hifiberry-dacplus-pro-overlay.dts         | 64 ++++++++++++++++++
+ .../hifiberry-dacplus-std-overlay.dts         | 65 +++++++++++++++++++
+ 4 files changed, 173 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/hifiberry-dacplus-pro-overlay.dts
+ create mode 100644 arch/arm/boot/dts/overlays/hifiberry-dacplus-std-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -90,6 +90,8 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
+ 	hifiberry-dac.dtbo \
+ 	hifiberry-dac8x.dtbo \
+ 	hifiberry-dacplus.dtbo \
++	hifiberry-dacplus-pro.dtbo \
++	hifiberry-dacplus-std.dtbo \
+ 	hifiberry-dacplusadc.dtbo \
+ 	hifiberry-dacplusadcpro.dtbo \
+ 	hifiberry-dacplusdsp.dtbo \
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -1801,6 +1801,48 @@ Params: 24db_digital_gain       Allow ga
+                                 are switched off at all times.
+ 
+ 
++Name:   hifiberry-dacplus-pro
++Info:   Configures the HifiBerry DAC+ PRO audio card (onboard clocks)
++Load:   dtoverlay=hifiberry-dacplus-pro,<param>=<val>
++Params: 24db_digital_gain       Allow gain to be applied via the PCM512x codec
++                                Digital volume control. Enable with
++                                "dtoverlay=hifiberry-dacplus,24db_digital_gain"
++                                (The default behaviour is that the Digital
++                                volume control is limited to a maximum of
++                                0dB. ie. it can attenuate but not provide
++                                gain. For most users, this will be desired
++                                as it will prevent clipping. By appending
++                                the 24dB_digital_gain parameter, the Digital
++                                volume control will allow up to 24dB of
++                                gain. If this parameter is enabled, it is the
++                                responsibility of the user to ensure that
++                                the Digital volume control is set to a value
++                                that does not result in clipping/distortion!)
++        leds_off                If set to 'true' the onboard indicator LEDs
++                                are switched off at all times.
++
++
++Name:   hifiberry-dacplus-std
++Info:   Configures the HifiBerry DAC+ standard audio card (no onboard clocks)
++Load:   dtoverlay=hifiberry-dacplus-std,<param>=<val>
++Params: 24db_digital_gain       Allow gain to be applied via the PCM512x codec
++                                Digital volume control. Enable with
++                                "dtoverlay=hifiberry-dacplus,24db_digital_gain"
++                                (The default behaviour is that the Digital
++                                volume control is limited to a maximum of
++                                0dB. ie. it can attenuate but not provide
++                                gain. For most users, this will be desired
++                                as it will prevent clipping. By appending
++                                the 24dB_digital_gain parameter, the Digital
++                                volume control will allow up to 24dB of
++                                gain. If this parameter is enabled, it is the
++                                responsibility of the user to ensure that
++                                the Digital volume control is set to a value
++                                that does not result in clipping/distortion!)
++        leds_off                If set to 'true' the onboard indicator LEDs
++                                are switched off at all times.
++
++
+ Name:   hifiberry-dacplusadc
+ Info:   Configures the HifiBerry DAC+ADC audio card
+ Load:   dtoverlay=hifiberry-dacplusadc,<param>=<val>
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/hifiberry-dacplus-pro-overlay.dts
+@@ -0,0 +1,64 @@
++// Definitions for HiFiBerry DAC+ PRO, with onboard clocks
++/dts-v1/;
++/plugin/;
++
++/ {
++	compatible = "brcm,bcm2835";
++
++	fragment at 0 {
++		target-path = "/";
++		__overlay__ {
++			dacpro_osc: dacpro_osc {
++				compatible = "hifiberry,dacpro-clk";
++				#clock-cells = <0>;
++			};
++		};
++	};
++
++	frag1: fragment at 1 {
++		target = <&i2s_clk_consumer>;
++		__overlay__ {
++			status = "okay";
++		};
++	};
++
++	fragment at 2 {
++		target = <&i2c1>;
++		__overlay__ {
++			#address-cells = <1>;
++			#size-cells = <0>;
++			status = "okay";
++
++			pcm5122 at 4d {
++				#sound-dai-cells = <0>;
++				compatible = "ti,pcm5122";
++				reg = <0x4d>;
++				clocks = <&dacpro_osc>;
++				AVDD-supply = <&vdd_3v3_reg>;
++				DVDD-supply = <&vdd_3v3_reg>;
++				CPVDD-supply = <&vdd_3v3_reg>;
++				status = "okay";
++			};
++			hpamp: hpamp at 60 {
++				compatible = "ti,tpa6130a2";
++				reg = <0x60>;
++				status = "disabled";
++			};
++		};
++	};
++
++	fragment at 3 {
++		target = <&sound>;
++		hifiberry_dacplus: __overlay__ {
++			compatible = "hifiberry,hifiberry-dacplus";
++			i2s-controller = <&i2s_clk_consumer>;
++			status = "okay";
++		};
++	};
++
++	__overrides__ {
++		24db_digital_gain =
++			<&hifiberry_dacplus>,"hifiberry,24db_digital_gain?";
++		leds_off = <&hifiberry_dacplus>,"hifiberry-dacplus,leds_off?";
++	};
++};
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/hifiberry-dacplus-std-overlay.dts
+@@ -0,0 +1,65 @@
++// Definitions for HiFiBerry DAC+ Standard w/o onboard clocks
++/dts-v1/;
++/plugin/;
++
++/ {
++	compatible = "brcm,bcm2835";
++
++	fragment at 0 {
++		target-path = "/";
++		__overlay__ {
++			dacpro_osc: dacpro_osc {
++				compatible = "hifiberry,dacpro-clk";
++				#clock-cells = <0>;
++			};
++		};
++	};
++
++	fragment at 1 {
++		target = <&i2s_clk_producer>;
++		__overlay__ {
++			status = "okay";
++		};
++	};
++
++	fragment at 2 {
++		target = <&i2c1>;
++		__overlay__ {
++			#address-cells = <1>;
++			#size-cells = <0>;
++			status = "okay";
++
++			pcm5122 at 4d {
++				#sound-dai-cells = <0>;
++				compatible = "ti,pcm5122";
++				reg = <0x4d>;
++				clocks = <&dacpro_osc>;
++				AVDD-supply = <&vdd_3v3_reg>;
++				DVDD-supply = <&vdd_3v3_reg>;
++				CPVDD-supply = <&vdd_3v3_reg>;
++				status = "okay";
++			};
++			hpamp: hpamp at 60 {
++				compatible = "ti,tpa6130a2";
++				reg = <0x60>;
++				status = "disabled";
++			};
++		};
++	};
++
++	fragment at 3 {
++		target = <&sound>;
++		hifiberry_dacplus: __overlay__ {
++			compatible = "hifiberry,hifiberry-dacplus";
++			i2s-controller = <&i2s_clk_producer>;
++			hifiberry-dacplus,slave;
++			status = "okay";
++		};
++	};
++
++	__overrides__ {
++		24db_digital_gain =
++			<&hifiberry_dacplus>,"hifiberry,24db_digital_gain?";
++		leds_off = <&hifiberry_dacplus>,"hifiberry-dacplus,leds_off?";
++	};
++};
diff --git a/target/linux/bcm27xx/patches-6.1/950-1291-overlays-hat_map-Add-Hifiberry-cards.patch b/target/linux/bcm27xx/patches-6.1/950-1291-overlays-hat_map-Add-Hifiberry-cards.patch
new file mode 100644
index 0000000000..2e25c3c302
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1291-overlays-hat_map-Add-Hifiberry-cards.patch
@@ -0,0 +1,96 @@
+From fae2848e87c2696d1eeaeb3f449ad871874b699f Mon Sep 17 00:00:00 2001
+From: j-schambacher <joerg at hifiberry.com>
+Date: Tue, 12 Mar 2024 10:59:48 +0100
+Subject: [PATCH 1291/1295] overlays:hat_map: Add Hifiberry cards
+
+Adds all available Hifberry cards' UUIDs to the hat_map file.
+
+Signed-off-by: j-schambacher <joerg at hifiberry.com>
+---
+ arch/arm/boot/dts/overlays/hat_map.dts | 75 ++++++++++++++++++++++++++
+ 1 file changed, 75 insertions(+)
+
+--- a/arch/arm/boot/dts/overlays/hat_map.dts
++++ b/arch/arm/boot/dts/overlays/hat_map.dts
+@@ -1,6 +1,81 @@
+ /dts-v1/;
+ 
+ / {
++	hifiberry-amp100-1 {
++		uuid = [ 5eb863b8 12f9 41ad 978f 4cee1b3eca62 ];
++		overlay = "hifiberry-amp100";
++	};
++
++	hifiberry-amp100-2 {
++		uuid = [ b1a57dbe 8b52 447f 939e 1baf72157d79 ];
++		overlay = "hifiberry-amp100";
++	};
++
++	hifiberry-amp4pro {
++		uuid = [ 3619722a c92d 4092 95bd 493a2903e933 ];
++		overlay = "hifiberry-amp4pro";
++	};
++
++	hifiberry-amp4 {
++		uuid = [ fcb6ec42 a182 419d a314 7eeae416f608 ];
++		overlay = "hifiberry-dacplus-std";
++	};
++
++	hifiberry-dac2proadc {
++		uuid = [ 30660215 dbb2 4c57 953f 099370b63e2e ];
++		overlay = "hifiberry-dacplusadcpro";
++	};
++
++	hifiberry-dac2hd {
++		uuid = [ 482ad277 5586 480c 88e7 85ae89c4e501 ];
++		overlay = "hifiberry-dacplushd";
++	};
++
++	hifiberry-dac2pro {
++		uuid = [ ebf9cfc4 6d77 4880 89fd 353690467dfc ];
++		overlay = "hifiberry-dacplus-pro";
++	};
++
++	hifiberry-dac8x {
++		uuid = [ f65985f9 5354 4457 ae3b 3da39ba2cf6d ];
++		overlay = "hifiberry-dac8x";
++	};
++
++	hifiberry-dacplus-amp2-1 {
++		uuid = [ 81cac43d 27c6 4a1e a0b2 c70b4e608ab6 ];
++		overlay = "hifiberry-dacplus-std";
++	};
++
++	hifiberry-dacplus-amp2-2 {
++		uuid = [ ef586afc 2efa 47a0 be2e 95a7d952fe98 ];
++		overlay = "hifiberry-dacplus-std";
++	};
++
++	hifiberry-digiplus-pro {
++		uuid = [ 2154f80b 0f92 45e4 96db c1643ec2b46b ];
++		overlay = "hifiberry-digi-pro";
++	};
++
++	hifiberry-dacplusadcpro {
++		uuid = [ 36e3d3da 1ed9 468b aea3 cd165f6820f0 ];
++		overlay = "hifiberry-dacplusadcpro";
++	};
++
++	hifiberry-digi2pro {
++		uuid = [ 5af941bb 4dcf 4eac 82a8 e36e84fcabef ];
++		overlay = "hifiberry-digi-pro";
++	};
++
++	hifiberry-digi2standard {
++		uuid = [ 7c980a0e 9d15 40af 9f40 bddfbd3aee8c ];
++		overlay = "hifiberry-digi";
++	};
++
++	hifiberry-dsp2x4 {
++		uuid = [ 8f287583 429d 4206 a751 862264bbda63 ];
++		overlay = "hifiberry-dacplus-dsp";
++	};
++
+ 	iqaudio-pi-codecplus {
+ 		uuid = [ dc1c9594 c1ab 4c6c acda a88dc59a3c5b ];
+ 		overlay = "iqaudio-codec";
diff --git a/target/linux/bcm27xx/patches-6.1/950-1292-ASoC-Fix-16bit-sample-support-for-Hifiberry-DACplusA.patch b/target/linux/bcm27xx/patches-6.1/950-1292-ASoC-Fix-16bit-sample-support-for-Hifiberry-DACplusA.patch
new file mode 100644
index 0000000000..95c954ab5c
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1292-ASoC-Fix-16bit-sample-support-for-Hifiberry-DACplusA.patch
@@ -0,0 +1,31 @@
+From f87bf7dfa65cce1d46800c0769351fef59abba55 Mon Sep 17 00:00:00 2001
+From: j-schambacher <joerg at hifiberry.com>
+Date: Wed, 13 Mar 2024 10:31:18 +0100
+Subject: [PATCH 1292/1295] ASoC: Fix 16bit sample support for Hifiberry
+ DACplusADC
+
+Same issue as #5919.
+'width' needs to be set independent of clocking mode.
+
+Signed-off-by: j-schambacher <joerg at hifiberry.com>
+---
+ sound/soc/bcm/hifiberry_dacplusadc.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+--- a/sound/soc/bcm/hifiberry_dacplusadc.c
++++ b/sound/soc/bcm/hifiberry_dacplusadc.c
+@@ -229,13 +229,11 @@ static int snd_rpi_hifiberry_dacplusadc_
+ 	int ret = 0;
+ 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ 	int channels = params_channels(params);
+-	int width = 32;
++	int width = snd_pcm_format_width(params_format(params));
+ 
+ 	if (snd_rpi_hifiberry_is_dacpro) {
+ 		struct snd_soc_component *component = asoc_rtd_to_codec(rtd, 0)->component;
+ 
+-		width = snd_pcm_format_physical_width(params_format(params));
+-
+ 		snd_rpi_hifiberry_dacplusadc_set_sclk(component,
+ 			params_rate(params));
+ 
diff --git a/target/linux/bcm27xx/patches-6.1/950-1293-overlays-Sets-i2s_clk_producer-as-default-for-Hifibe.patch b/target/linux/bcm27xx/patches-6.1/950-1293-overlays-Sets-i2s_clk_producer-as-default-for-Hifibe.patch
new file mode 100644
index 0000000000..f1b39eb540
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1293-overlays-Sets-i2s_clk_producer-as-default-for-Hifibe.patch
@@ -0,0 +1,79 @@
+From 5d1972f99f893ac9394d2a795a3b21385b9e34a5 Mon Sep 17 00:00:00 2001
+From: j-schambacher <joerg at hifiberry.com>
+Date: Wed, 13 Mar 2024 10:11:27 +0100
+Subject: [PATCH 1293/1295] overlays: Sets i2s_clk_producer as default for
+ Hifiberry DACplusADC
+
+As we have never released a (standard) DACplusADC board with onboard
+clocks, we can simply use a fixed setup avoiding incompatibilities
+with Pi5 during driver init. Setting 'hifiberry-dacplusadc,slave' in
+the overlays disables the failing clock probing mechanism.
+
+Removes 'slave' parameter description from README which is still
+supported but not needed.
+
+Signed-off-by: j-schambacher <joerg at hifiberry.com>
+---
+ arch/arm/boot/dts/overlays/README                    |  4 +---
+ .../dts/overlays/hifiberry-dacplusadc-overlay.dts    | 12 +++++-------
+ 2 files changed, 6 insertions(+), 10 deletions(-)
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -1773,7 +1773,7 @@ Params: <None>
+ 
+ 
+ Name:   hifiberry-dac8x
+-Info:   Configures the HifiBerry DAC8X audio cards (only on PI5)
++Info:   Configures the HifiBerry DAC8X audio cards (only on Pi5)
+ Load:   dtoverlay=hifiberry-dac8x
+ Params: <None>
+ 
+@@ -1860,8 +1860,6 @@ Params: 24db_digital_gain       Allow ga
+                                 responsibility of the user to ensure that
+                                 the Digital volume control is set to a value
+                                 that does not result in clipping/distortion!)
+-        slave                   Force DAC+ADC into slave mode, using Pi as
+-                                master for bit clock and frame clock.
+         leds_off                If set to 'true' the onboard indicator LEDs
+                                 are switched off at all times.
+ 
+--- a/arch/arm/boot/dts/overlays/hifiberry-dacplusadc-overlay.dts
++++ b/arch/arm/boot/dts/overlays/hifiberry-dacplusadc-overlay.dts
+@@ -1,4 +1,4 @@
+-// Definitions for HiFiBerry DAC+ADC
++// Definitions for HiFiBerry DAC+ADC, no onboard clocks
+ /dts-v1/;
+ /plugin/;
+ 
+@@ -15,8 +15,8 @@
+ 		};
+ 	};
+ 
+-	frag1: fragment at 1 {
+-		target = <&i2s_clk_consumer>;
++	fragment at 1 {
++		target = <&i2s_clk_producer>;
+ 		__overlay__ {
+ 			status = "okay";
+ 		};
+@@ -58,7 +58,8 @@
+ 		target = <&sound>;
+ 		hifiberry_dacplusadc: __overlay__ {
+ 			compatible = "hifiberry,hifiberry-dacplusadc";
+-			i2s-controller = <&i2s_clk_consumer>;
++			i2s-controller = <&i2s_clk_producer>;
++			hifiberry-dacplusadc,slave;
+ 			status = "okay";
+ 		};
+ 	};
+@@ -66,9 +67,6 @@
+ 	__overrides__ {
+ 		24db_digital_gain =
+ 			<&hifiberry_dacplusadc>,"hifiberry,24db_digital_gain?";
+-		slave = <&hifiberry_dacplusadc>,"hifiberry-dacplusadc,slave?",
+-			<&frag1>,"target:0=",<&i2s_clk_producer>,
+-			<&hifiberry_dacplusadc>,"i2s-controller:0=",<&i2s_clk_producer>;
+ 		leds_off = <&hifiberry_dacplusadc>,"hifiberry-dacplusadc,leds_off?";
+ 	};
+ };
diff --git a/target/linux/bcm27xx/patches-6.1/950-1294-imx477-make-trigger-mode-more-configurable.patch b/target/linux/bcm27xx/patches-6.1/950-1294-imx477-make-trigger-mode-more-configurable.patch
new file mode 100644
index 0000000000..584782d25a
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1294-imx477-make-trigger-mode-more-configurable.patch
@@ -0,0 +1,77 @@
+From f4102d30e760482e9f2fc94dcf8ce223afef3230 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Erik=20Bot=C3=B6?= <erik.boto at gmail.com>
+Date: Fri, 9 Feb 2024 18:37:46 +0100
+Subject: [PATCH 1294/1295] imx477: make trigger-mode more configurable
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Allow trigger-mode to be overridden using device tree so that it can be
+set per camera. Previously the mode could only be changed using a module
+parameter, which would then affect all cameras.
+
+Signed-off-by: Erik Botö <erik.boto at gmail.com>
+---
+ drivers/media/i2c/imx477.c | 19 ++++++++++++++-----
+ 1 file changed, 14 insertions(+), 5 deletions(-)
+
+--- a/drivers/media/i2c/imx477.c
++++ b/drivers/media/i2c/imx477.c
+@@ -1124,6 +1124,9 @@ struct imx477 {
+ 	/* Current mode */
+ 	const struct imx477_mode *mode;
+ 
++	/* Trigger mode */
++	int trigger_mode_of;
++
+ 	/*
+ 	 * Mutex for serialized access:
+ 	 * Protect sensor module set pad format and start/stop streaming safely.
+@@ -1711,7 +1714,7 @@ static int imx477_start_streaming(struct
+ 	struct i2c_client *client = v4l2_get_subdevdata(&imx477->sd);
+ 	const struct imx477_reg_list *reg_list;
+ 	const struct imx477_reg_list *extra_regs;
+-	int ret;
++	int ret, tm;
+ 
+ 	if (!imx477->common_regs_written) {
+ 		ret = imx477_write_regs(imx477, mode_common_regs,
+@@ -1748,14 +1751,15 @@ static int imx477_start_streaming(struct
+ 		return ret;
+ 
+ 	/* Set vsync trigger mode: 0=standalone, 1=source, 2=sink */
++	tm = (imx477->trigger_mode_of >= 0) ? imx477->trigger_mode_of : trigger_mode;
+ 	imx477_write_reg(imx477, IMX477_REG_MC_MODE,
+-			 IMX477_REG_VALUE_08BIT, (trigger_mode > 0) ? 1 : 0);
++			 IMX477_REG_VALUE_08BIT, (tm > 0) ? 1 : 0);
+ 	imx477_write_reg(imx477, IMX477_REG_MS_SEL,
+-			 IMX477_REG_VALUE_08BIT, (trigger_mode <= 1) ? 1 : 0);
++			 IMX477_REG_VALUE_08BIT, (tm <= 1) ? 1 : 0);
+ 	imx477_write_reg(imx477, IMX477_REG_XVS_IO_CTRL,
+-			 IMX477_REG_VALUE_08BIT, (trigger_mode == 1) ? 1 : 0);
++			 IMX477_REG_VALUE_08BIT, (tm == 1) ? 1 : 0);
+ 	imx477_write_reg(imx477, IMX477_REG_EXTOUT_EN,
+-			 IMX477_REG_VALUE_08BIT, (trigger_mode == 1) ? 1 : 0);
++			 IMX477_REG_VALUE_08BIT, (tm == 1) ? 1 : 0);
+ 
+ 	/* set stream on register */
+ 	return imx477_write_reg(imx477, IMX477_REG_MODE_SELECT,
+@@ -2187,6 +2191,7 @@ static int imx477_probe(struct i2c_clien
+ 	struct imx477 *imx477;
+ 	const struct of_device_id *match;
+ 	int ret;
++	u32 tm_of;
+ 
+ 	imx477 = devm_kzalloc(&client->dev, sizeof(*imx477), GFP_KERNEL);
+ 	if (!imx477)
+@@ -2204,6 +2209,10 @@ static int imx477_probe(struct i2c_clien
+ 	if (imx477_check_hwcfg(dev))
+ 		return -EINVAL;
+ 
++	/* Default the trigger mode from OF to -1, which means invalid */
++	ret = of_property_read_u32(dev->of_node, "trigger-mode", &tm_of);
++	imx477->trigger_mode_of = (ret == 0) ? tm_of : -1;
++
+ 	/* Get system clock (xclk) */
+ 	imx477->xclk = devm_clk_get(dev, NULL);
+ 	if (IS_ERR(imx477->xclk)) {
diff --git a/target/linux/bcm27xx/patches-6.1/950-1295-imx477-Update-device-tree-overlays-to-support-trigge.patch b/target/linux/bcm27xx/patches-6.1/950-1295-imx477-Update-device-tree-overlays-to-support-trigge.patch
new file mode 100644
index 0000000000..d9df79412b
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-1295-imx477-Update-device-tree-overlays-to-support-trigge.patch
@@ -0,0 +1,129 @@
+From d02bd251d7f85e3aec02e5752df2f44a35961360 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Erik=20Bot=C3=B6?= <erik.boto at gmail.com>
+Date: Fri, 9 Feb 2024 18:41:24 +0100
+Subject: [PATCH 1295/1295] imx477: Update device tree overlays to support
+ trigger-mode
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Also create generic overrides in camera-mux-N-port, that can be extended
+to configure vsync modes for cameras supporting this.
+
+Example usages (to be combined with camera_auto_detect=0):
+dtoverlay=imx477,cam0,sync-source
+dtoverlay=imx477,sync-sink
+dtoverlay=camera-mux-2port,cam1-imx477,cam1-sync-sink
+dtoverlay=camera-mux-4port,cam3-imx477,cam3-sync-sink
+
+Signed-off-by: Erik Botö <erik.boto at gmail.com>
+---
+ arch/arm/boot/dts/overlays/README                | 16 ++++++++++++++++
+ .../dts/overlays/camera-mux-2port-overlay.dts    |  5 +++++
+ .../dts/overlays/camera-mux-4port-overlay.dts    |  9 +++++++++
+ arch/arm/boot/dts/overlays/imx378-overlay.dts    |  7 +++++++
+ arch/arm/boot/dts/overlays/imx477-overlay.dts    |  7 +++++++
+ 5 files changed, 44 insertions(+)
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -862,6 +862,10 @@ Params: cam0-arducam-64mp       Select A
+         cam1-ov7251             Select OV7251 for camera on port 1
+         cam1-ov9281             Select OV9281 for camera on port 1
+         cam1-imx290-clk-freq    Set clock frequency for an IMX290 on port 1
++        cam0-sync-source        Set camera on port 0 as vsync source
++        cam0-sync-sink          Set camera on port 0 as vsync sink
++        cam1-sync-source        Set camera on port 1 as vsync source
++        cam1-sync-sink          Set camera on port 1 as vsync sink
+ 
+         cam0                    Connect the mux to CAM0 port (default is CAM1)
+ 
+@@ -923,6 +927,14 @@ Params: cam0-arducam-64mp       Select A
+         cam3-ov7251             Select OV7251 for camera on port 3
+         cam3-ov9281             Select OV9281 for camera on port 3
+         cam3-imx290-clk-freq    Set clock frequency for an IMX290 on port 3
++        cam0-sync-source        Set camera on port 0 as vsync source
++        cam0-sync-sink          Set camera on port 0 as vsync sink
++        cam1-sync-source        Set camera on port 1 as vsync source
++        cam1-sync-sink          Set camera on port 1 as vsync sink
++        cam2-sync-source        Set camera on port 2 as vsync source
++        cam2-sync-sink          Set camera on port 2 as vsync sink
++        cam3-sync-source        Set camera on port 3 as vsync source
++        cam3-sync-sink          Set camera on port 3 as vsync sink
+ 
+         cam0                    Connect the mux to CAM0 port (default is CAM1)
+ 
+@@ -2676,6 +2688,8 @@ Params: rotation                Mounting
+                                 Compute Module (CSI0, i2c_vc, and cam0_reg).
+         always-on               Leave the regulator powered up, to stop the
+                                 camera clamping I/Os such as XVS to 0V.
++        sync-source             Configure as vsync source
++        sync-sink               Configure as vsync sink
+ 
+ 
+ Name:   imx462
+@@ -2716,6 +2730,8 @@ Params: rotation                Mounting
+                                 Compute Module (CSI0, i2c_vc, and cam0_reg).
+         always-on               Leave the regulator powered up, to stop the
+                                 camera clamping I/Os such as XVS to 0V.
++        sync-source             Configure as vsync source
++        sync-sink               Configure as vsync sink
+ 
+ 
+ Name:   imx519
+--- a/arch/arm/boot/dts/overlays/camera-mux-2port-overlay.dts
++++ b/arch/arm/boot/dts/overlays/camera-mux-2port-overlay.dts
+@@ -536,5 +536,10 @@
+ 
+ 		cam0 = <&i2c_frag>, "target:0=",<&i2c_csi_dsi0>,
+ 		       <&csi_frag>, "target:0=",<&csi0>;
++
++		cam0-sync-source = <&imx477_0>, "trigger-mode:0=1";
++		cam0-sync-sink = <&imx477_0>, "trigger-mode:0=2";
++		cam1-sync-source = <&imx477_1>, "trigger-mode:0=1";
++		cam1-sync-sink = <&imx477_1>, "trigger-mode:0=2";
+ 	};
+ };
+--- a/arch/arm/boot/dts/overlays/camera-mux-4port-overlay.dts
++++ b/arch/arm/boot/dts/overlays/camera-mux-4port-overlay.dts
+@@ -939,5 +939,14 @@
+ 
+ 		cam0 = <&i2c_frag>, "target:0=",<&i2c_csi_dsi0>,
+ 		       <&csi_frag>, "target:0=",<&csi0>;
++
++		cam0-sync-source = <&imx477_0>, "trigger-mode:0=1";
++		cam0-sync-sink = <&imx477_0>, "trigger-mode:0=2";
++		cam1-sync-source = <&imx477_1>, "trigger-mode:0=1";
++		cam1-sync-sink = <&imx477_1>, "trigger-mode:0=2";
++		cam2-sync-source = <&imx477_2>, "trigger-mode:0=1";
++		cam2-sync-sink = <&imx477_2>, "trigger-mode:0=2";
++		cam3-sync-source = <&imx477_3>, "trigger-mode:0=1";
++		cam3-sync-sink = <&imx477_3>, "trigger-mode:0=2";
+ 	};
+ };
+--- a/arch/arm/boot/dts/overlays/imx378-overlay.dts
++++ b/arch/arm/boot/dts/overlays/imx378-overlay.dts
+@@ -8,3 +8,10 @@
+ &cam_node {
+ 	compatible = "sony,imx378";
+ };
++
++/{
++	__overrides__ {
++		sync-sink = <&cam_node>,"trigger-mode:0=2";
++		sync-source = <&cam_node>,"trigger-mode:0=1";
++	};
++};
+--- a/arch/arm/boot/dts/overlays/imx477-overlay.dts
++++ b/arch/arm/boot/dts/overlays/imx477-overlay.dts
+@@ -8,3 +8,10 @@
+ &cam_node {
+ 	compatible = "sony,imx477";
+ };
++
++/{
++	__overrides__ {
++		sync-sink = <&cam_node>,"trigger-mode:0=2";
++		sync-source = <&cam_node>,"trigger-mode:0=1";
++	};
++};




More information about the lede-commits mailing list