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@gmail.com>
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
# 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
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
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
# 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
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
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
# 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
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
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
# 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
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
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
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
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
+++ /dev/null
-From 12c7ea43b930976f35ce75d11fd3f55438868e13 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@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@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");
+++ /dev/null
-From 0a09088e24c013ef608b1bb79501ef890cefc767 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@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@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;
- }
-
+++ /dev/null
-From 660d569b1a623e4b64350e608bbf8bc2cc6332e9 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.com>
-Date: Tue, 19 Dec 2023 11:27:20 +0000
-Subject: [PATCH] dts: rp1: Add I2C timings
-
-Signed-off-by: Phil Elwell <phil@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";
- };
-
--- /dev/null
+From d8e53e0b83c947123c38c81d2fb5162c86d26fb5 Mon Sep 17 00:00:00 2001
+From: Dave Stevenson <dave.stevenson@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@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);
--- /dev/null
+From c0d4ab94e37991db311b0d4e955a349e359fc73a Mon Sep 17 00:00:00 2001
+From: Dave Stevenson <dave.stevenson@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@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;
--- /dev/null
+From cd62562b276b5724d1c75ea1465937a5bd9037db Mon Sep 17 00:00:00 2001
+From: Giedrius <giedrius@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@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);
--- /dev/null
+From 273139b285f7a1a825eb689943626a0172b8802b Mon Sep 17 00:00:00 2001
+From: Giedrius <giedrius@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@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,
+ };
--- /dev/null
+From 92123f0abd5e24c150b54c56261813ced432ac87 Mon Sep 17 00:00:00 2001
+From: Giedrius <giedrius@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@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";
++};
--- /dev/null
+From f85acc3d0fb33ce5c92578dca7b1345915f744ff Mon Sep 17 00:00:00 2001
+From: Tiago Freire <41837236+tiagofreire-pt@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
--- /dev/null
+From f2ada4aa6b1d214c67b7efe874a408be9b4eaf3f Mon Sep 17 00:00:00 2001
+From: Tiago Freire <41837236+tiagofreire-pt@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@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")
+
--- /dev/null
+From 1cdbd99f402b76c61632d09a49b20ce90af0cc72 Mon Sep 17 00:00:00 2001
+From: Rodrigo Rosmaninho <quico.rosmaninho@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@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@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>;
++ };
++ };
++
++};
--- /dev/null
+From b660279cc83aff2018cecfc3fb55757a8d64f607 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@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@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);
+ }
--- /dev/null
+From 6868dba87e2765042ac376a4a8427b9b981cd410 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@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@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);
--- /dev/null
+From 4c7a8e9e40d915c61df188d6b9f82836b616bd4f Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@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@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";
+ };
+
--- /dev/null
+From 86450c7dc4df99c3b16677cb00c2d3caf01a40f6 Mon Sep 17 00:00:00 2001
+From: Ratchanan Srirattanamet <peathot@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@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
--- /dev/null
+From 57695002a68bdd4c077ea2173b64aeee6e1ef24f Mon Sep 17 00:00:00 2001
+From: Ratchanan Srirattanamet <peathot@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@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
--- /dev/null
+From 1c2a93ce0e1cf6d278cf565346183d7592cfbb24 Mon Sep 17 00:00:00 2001
+From: Melissa LeBlanc-Williams <melissa@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@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@0 {
+- target = <&spidev0>;
+- __overlay__ {
+- status = "disabled";
+- };
++ fragment@0 {
++ target = <&spidev0>;
++ __overlay__ {
++ status = "disabled";
++ };
+ };
+
+- fragment@1 {
+- target = <&spidev1>;
+- __overlay__ {
+- status = "disabled";
+- };
+- };
+-
+- fragment@2 {
+- target = <&gpio>;
+- __overlay__ {
+- pitft_pins: pitft_pins {
+- brcm,pins = <25>;
+- brcm,function = <1>; /* out */
+- brcm,pull = <0>; /* none */
+- };
+- };
+- };
+-
+- fragment@3 {
+- target = <&spi0>;
+- __overlay__ {
+- /* needed to avoid dtc warning */
+- #address-cells = <1>;
+- #size-cells = <0>;
+- status = "okay";
+-
+- pitft: pitft@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@1 {
++ target = <&spidev1>;
++ __overlay__ {
++ status = "disabled";
++ };
++ };
++
++ fragment@2 {
++ target = <&gpio>;
++ __overlay__ {
++ pitft_pins: pitft_pins {
++ brcm,pins = <25>;
++ brcm,function = <1>; /* out */
++ brcm,pull = <0>; /* none */
++ };
++ };
++ };
++
++ fragment@3 {
++ target = <&spi0>;
++ __overlay__ {
++ /* needed to avoid dtc warning */
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "okay";
++
++ pitft: pitft@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@0 {
+- target = <&spi0>;
+- __overlay__ {
+- status = "okay";
+- };
+- };
++ fragment@0 {
++ target = <&spi0>;
++ __overlay__ {
++ status = "okay";
++ };
++ };
+
+ fragment@1 {
+ target = <&spidev0>;
+@@ -23,69 +23,71 @@
+ };
+ };
+
+- fragment@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@3 {
+- target = <&spi0>;
+- __overlay__ {
+- /* needed to avoid dtc warning */
+- #address-cells = <1>;
+- #size-cells = <0>;
+-
+- pitft: pitft@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@4 {
+- target = <&i2c1>;
+- __overlay__ {
+- /* needed to avoid dtc warning */
+- #address-cells = <1>;
+- #size-cells = <0>;
+-
+- ft6236: ft6236@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@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@3 {
++ target = <&spi0>;
++ __overlay__ {
++ /* needed to avoid dtc warning */
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ pitft: pitft@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@4 {
++ target = <&i2c1>;
++ __overlay__ {
++ /* needed to avoid dtc warning */
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ ft6236: ft6236@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@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@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@0{
+- compatible = "himax,hx8357d", "adafruit,yx350hv15";
++ compatible = "himax,hx8357d";
+ reg = <0>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pitft_pins>;
+@@ -64,6 +64,9 @@
+ };
+
+ pitft_ts@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?";
+ };
+ };
--- /dev/null
+From ea9b088747d379256e2582dd5c29638bf4ff9928 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@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@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;
+ };
+
--- /dev/null
+From 15dedc2ad5a9073b8639881680672214f605a5c6 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@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@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";
+ };
+
--- /dev/null
+From 89bd4e64da3345c2764a42875b99c96fa8931967 Mon Sep 17 00:00:00 2001
+From: Joerg Schambacher <joerg@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@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));
+
--- /dev/null
+From d58c054ba30b313bacbb7d19f559ecb4e3bb5c76 Mon Sep 17 00:00:00 2001
+From: Joerg Schambacher <joerg@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@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;
--- /dev/null
+From 98ac9b84709dc01ee936b6fe79eaac5e3a4aa6e7 Mon Sep 17 00:00:00 2001
+From: Joerg Schambacher <joerg@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@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@0 {
++ target-path = "/";
++ __overlay__ {
++ dacpro_osc: dacpro_osc {
++ compatible = "hifiberry,dacpro-clk";
++ #clock-cells = <0>;
++ };
++ };
++ };
++
++ frag1: fragment@1 {
++ target = <&i2s_clk_consumer>;
++ __overlay__ {
++ status = "okay";
++ };
++ };
++
++ fragment@2 {
++ target = <&i2c1>;
++ __overlay__ {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "okay";
++
++ tas5756@4d {
++ #sound-dai-cells = <0>;
++ compatible = "ti,tas5756";
++ reg = <0x4d>;
++ clocks = <&dacpro_osc>;
++ status = "okay";
++ };
++ };
++ };
++
++ fragment@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>;
++ };
++};
--- /dev/null
+From ba86793796525f8276fafbaf9d31d5156a2cfcb5 Mon Sep 17 00:00:00 2001
+From: Joerg Schambacher <joerg@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@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));
+
--- /dev/null
+From 707f6e221946ec2025e8f0e2fedf92016ed8a5b7 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@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@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@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@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@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@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@0 {
+ target = <&rmem>;
--- /dev/null
+From 223d1247c0b0c0659a65949b6b9c3de53fd14223 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@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@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@0 {
+- target = <&i2c1>;
+- __overlay__ {
+- #address-cells = <1>;
+- #size-cells = <0>;
+- status = "okay";
+- clock-frequency = <400000>;
+-
+- mpu6050: mpu6050@68 {
+- compatible = "invensense,mpu6050";
+- reg = <0x68>;
+- interrupt-parent = <&gpio>;
+- interrupts = <4 1>;
+- };
+- };
+- };
+-
+- __overrides__ {
+- interrupt = <&mpu6050>,"interrupts:0";
+- addr = <&mpu6050>,"reg:0";
+- };
+-};
--- /dev/null
+From beba81b0b77268f72d717ab8ec98afe11a176ee0 Mon Sep 17 00:00:00 2001
+From: Naushir Patuck <naush@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@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,
--- /dev/null
+From 58c600f728f2787e905eff2f678fa9cf09694004 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@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@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:
--- /dev/null
+From fb21611efd7cd916646d9ab2988c3af08f139761 Mon Sep 17 00:00:00 2001
+From: Ben Payne <ben@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 },
+ {},
+ };
+
--- /dev/null
+From d787ecf50d7a6ec32f8e1afcb8559600396c0f45 Mon Sep 17 00:00:00 2001
+From: Ben Payne <ben@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@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@1 {
++ target = <&i2s_clk_consumer>;
++ __overlay__ {
++ status = "okay";
++ };
++ };
++
++ fragment@2 {
++ target = <&i2c1>;
++ __overlay__ {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "okay";
++
++ cs4271: cs4271@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@0 {
++ target = <&i2s_clk_consumer>;
++ __overlay__ {
++ status = "okay";
++ };
++ };
++
++ fragment@1 {
++ target = <&i2c1>;
++ __overlay__ {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "okay";
++
++ wm8804@3b {
++ #sound-dai-cells = <0>;
++ compatible = "wlf,wm8804";
++ reg = <0x3b>;
++ PVDD-supply = <&vdd_3v3_reg>;
++ DVDD-supply = <&vdd_3v3_reg>;
++ status = "okay";
++ };
++ };
++ };
++
++
++ fragment@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>;
++ };
++ };
++
++};
--- /dev/null
+From eb06d31da3e2025a2e578d8de9843e24b68137a6 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ma=C3=ADra=20Canal?= <mcanal@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@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.
+ */
--- /dev/null
+From aa00918b9562daa3b776600f48d8264b20fd54f6 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@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@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@0 {
+- target = <&i2c>;
++ target = <&i2c1>;
+
+ __overlay__ {
+ #address-cells = <1>;
--- /dev/null
+From afd5f659b0453e4c710ce5cf74c577563ff16239 Mon Sep 17 00:00:00 2001
+From: Andrew Scheller <andrew.scheller@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";
--- /dev/null
+From d4acd8b7ea890c01453cdcf9b04a999ca04dfd2a Mon Sep 17 00:00:00 2001
+From: j-schambacher <joerg@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@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},
--- /dev/null
+From 813135a7ff3f0c2b91dc06a5b3f8deac15570466 Mon Sep 17 00:00:00 2001
+From: j-schambacher <joerg@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@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@0 {
++ target = <&gpio>;
++ __overlay__ {
++ rp1_i2s0_dac8x: rp1_i2s0_dac8x {
++ function = "i2s0";
++ pins = "gpio18", "gpio19", "gpio21",
++ "gpio23", "gpio25", "gpio27";
++ bias-disable;
++ status = "okay";
++ };
++ };
++ };
++
++ fragment@1 {
++ target = <&i2s_clk_producer>;
++ __overlay__ {
++ pinctrl-names = "default";
++ pinctrl-0 = <&rp1_i2s0_dac8x>;
++ status = "okay";
++ };
++ };
++
++ fragment@2 {
++ target-path = "/";
++ __overlay__ {
++ pcm5102a-codec {
++ #sound-dai-cells = <0>;
++ compatible = "ti,pcm5102a";
++ status = "okay";
++ };
++ };
++ };
++
++ fragment@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;
+ };
--- /dev/null
+From c0169f2c197d005aff8acfbc618de6e7f6b1ab94 Mon Sep 17 00:00:00 2001
+From: Florian Wesch <fw@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@gmail.com>
+Co-authored-by: Dom Cobley <popcornmix@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;
--- /dev/null
+From 50da59d237df59b38c5e3c375b3df8fabbda1069 Mon Sep 17 00:00:00 2001
+From: Eng33 <eng33@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@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 */
+ }
+ };
--- /dev/null
+From bb2f912c94d11a0f0b5f13c91793fa9f79eb92aa Mon Sep 17 00:00:00 2001
+From: Eng33 <eng33@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@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";
--- /dev/null
+From 29cc64d7d94f9a6ee0e97e8009b832514d2525e0 Mon Sep 17 00:00:00 2001
+From: Eng33 <eng33@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@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",
--- /dev/null
+From 8db8a2b856a24dd30b201c9af3238cedaf5f0c58 Mon Sep 17 00:00:00 2001
+From: Eng33 <eng33@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@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
--- /dev/null
+From 9e31e8ce44ef11cabcb1b95830e1fdd8a9655ad3 Mon Sep 17 00:00:00 2001
+From: j-schambacher <joerg@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@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@0 {
++ target-path = "/";
++ __overlay__ {
++ dacpro_osc: dacpro_osc {
++ compatible = "hifiberry,dacpro-clk";
++ #clock-cells = <0>;
++ };
++ };
++ };
++
++ frag1: fragment@1 {
++ target = <&i2s_clk_consumer>;
++ __overlay__ {
++ status = "okay";
++ };
++ };
++
++ fragment@2 {
++ target = <&i2c1>;
++ __overlay__ {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "okay";
++
++ pcm5122@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@60 {
++ compatible = "ti,tpa6130a2";
++ reg = <0x60>;
++ status = "disabled";
++ };
++ };
++ };
++
++ fragment@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@0 {
++ target-path = "/";
++ __overlay__ {
++ dacpro_osc: dacpro_osc {
++ compatible = "hifiberry,dacpro-clk";
++ #clock-cells = <0>;
++ };
++ };
++ };
++
++ fragment@1 {
++ target = <&i2s_clk_producer>;
++ __overlay__ {
++ status = "okay";
++ };
++ };
++
++ fragment@2 {
++ target = <&i2c1>;
++ __overlay__ {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "okay";
++
++ pcm5122@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@60 {
++ compatible = "ti,tpa6130a2";
++ reg = <0x60>;
++ status = "disabled";
++ };
++ };
++ };
++
++ fragment@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?";
++ };
++};
--- /dev/null
+From fae2848e87c2696d1eeaeb3f449ad871874b699f Mon Sep 17 00:00:00 2001
+From: j-schambacher <joerg@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@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";
--- /dev/null
+From f87bf7dfa65cce1d46800c0769351fef59abba55 Mon Sep 17 00:00:00 2001
+From: j-schambacher <joerg@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@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));
+
--- /dev/null
+From 5d1972f99f893ac9394d2a795a3b21385b9e34a5 Mon Sep 17 00:00:00 2001
+From: j-schambacher <joerg@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@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@1 {
+- target = <&i2s_clk_consumer>;
++ fragment@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?";
+ };
+ };
--- /dev/null
+From f4102d30e760482e9f2fc94dcf8ce223afef3230 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Erik=20Bot=C3=B6?= <erik.boto@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@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)) {
--- /dev/null
+From d02bd251d7f85e3aec02e5752df2f44a35961360 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Erik=20Bot=C3=B6?= <erik.boto@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@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";
++ };
++};