--- /dev/null
+From stable+bounces-144883-greg=kroah.com@vger.kernel.org Mon May 19 18:34:21 2025
+From: Fabio Estevam <festevam@gmail.com>
+Date: Mon, 19 May 2025 13:32:28 -0300
+Subject: drm/fbdev-dma: Support struct drm_driver.fbdev_probe
+To: stable@vger.kernel.org
+Cc: tzimmermann@suse.de, javierm@redhat.com, gregkh@linuxfoundation.org, Fabio Estevam <festevam@denx.de>
+Message-ID: <20250519163230.1303438-1-festevam@gmail.com>
+
+From: Thomas Zimmermann <tzimmermann@suse.de>
+
+commit 8998eedda2539d2528cfebdc7c17eed0ad35b714 upstream.
+
+Rework fbdev probing to support fbdev_probe in struct drm_driver
+and reimplement the old fb_probe callback on top of it. Provide an
+initializer macro for struct drm_driver that sets the callback
+according to the kernel configuration.
+
+This change allows the common fbdev client to run on top of DMA-
+based DRM drivers.
+
+Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
+Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20240924071734.98201-6-tzimmermann@suse.de
+Signed-off-by: Fabio Estevam <festevam@denx.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/drm_fbdev_dma.c | 60 ++++++++++++++++++++++++----------------
+ include/drm/drm_fbdev_dma.h | 12 ++++++++
+ 2 files changed, 48 insertions(+), 24 deletions(-)
+
+--- a/drivers/gpu/drm/drm_fbdev_dma.c
++++ b/drivers/gpu/drm/drm_fbdev_dma.c
+@@ -106,6 +106,40 @@ static const struct fb_ops drm_fbdev_dma
+ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
+ struct drm_fb_helper_surface_size *sizes)
+ {
++ return drm_fbdev_dma_driver_fbdev_probe(fb_helper, sizes);
++}
++
++static int drm_fbdev_dma_helper_fb_dirty(struct drm_fb_helper *helper,
++ struct drm_clip_rect *clip)
++{
++ struct drm_device *dev = helper->dev;
++ int ret;
++
++ /* Call damage handlers only if necessary */
++ if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
++ return 0;
++
++ if (helper->fb->funcs->dirty) {
++ ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
++ if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", ret))
++ return ret;
++ }
++
++ return 0;
++}
++
++static const struct drm_fb_helper_funcs drm_fbdev_dma_helper_funcs = {
++ .fb_probe = drm_fbdev_dma_helper_fb_probe,
++ .fb_dirty = drm_fbdev_dma_helper_fb_dirty,
++};
++
++/*
++ * struct drm_fb_helper
++ */
++
++int drm_fbdev_dma_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
++ struct drm_fb_helper_surface_size *sizes)
++{
+ struct drm_client_dev *client = &fb_helper->client;
+ struct drm_device *dev = fb_helper->dev;
+ bool use_deferred_io = false;
+@@ -148,6 +182,7 @@ static int drm_fbdev_dma_helper_fb_probe
+ goto err_drm_client_buffer_delete;
+ }
+
++ fb_helper->funcs = &drm_fbdev_dma_helper_funcs;
+ fb_helper->buffer = buffer;
+ fb_helper->fb = fb;
+
+@@ -211,30 +246,7 @@ err_drm_client_buffer_delete:
+ drm_client_framebuffer_delete(buffer);
+ return ret;
+ }
+-
+-static int drm_fbdev_dma_helper_fb_dirty(struct drm_fb_helper *helper,
+- struct drm_clip_rect *clip)
+-{
+- struct drm_device *dev = helper->dev;
+- int ret;
+-
+- /* Call damage handlers only if necessary */
+- if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
+- return 0;
+-
+- if (helper->fb->funcs->dirty) {
+- ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
+- if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", ret))
+- return ret;
+- }
+-
+- return 0;
+-}
+-
+-static const struct drm_fb_helper_funcs drm_fbdev_dma_helper_funcs = {
+- .fb_probe = drm_fbdev_dma_helper_fb_probe,
+- .fb_dirty = drm_fbdev_dma_helper_fb_dirty,
+-};
++EXPORT_SYMBOL(drm_fbdev_dma_driver_fbdev_probe);
+
+ /*
+ * struct drm_client_funcs
+--- a/include/drm/drm_fbdev_dma.h
++++ b/include/drm/drm_fbdev_dma.h
+@@ -4,12 +4,24 @@
+ #define DRM_FBDEV_DMA_H
+
+ struct drm_device;
++struct drm_fb_helper;
++struct drm_fb_helper_surface_size;
+
+ #ifdef CONFIG_DRM_FBDEV_EMULATION
++int drm_fbdev_dma_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
++ struct drm_fb_helper_surface_size *sizes);
++
++#define DRM_FBDEV_DMA_DRIVER_OPS \
++ .fbdev_probe = drm_fbdev_dma_driver_fbdev_probe
++
+ void drm_fbdev_dma_setup(struct drm_device *dev, unsigned int preferred_bpp);
+ #else
+ static inline void drm_fbdev_dma_setup(struct drm_device *dev, unsigned int preferred_bpp)
+ { }
++
++#define DRM_FBDEV_DMA_DRIVER_OPS \
++ .fbdev_probe = NULL
++
+ #endif
+
+ #endif
--- /dev/null
+From stable+bounces-144884-greg=kroah.com@vger.kernel.org Mon May 19 18:34:15 2025
+From: Fabio Estevam <festevam@gmail.com>
+Date: Mon, 19 May 2025 13:32:29 -0300
+Subject: drm/panel-mipi-dbi: Run DRM default client setup
+To: stable@vger.kernel.org
+Cc: tzimmermann@suse.de, javierm@redhat.com, gregkh@linuxfoundation.org, "Noralf Trønnes" <noralf@tronnes.org>, "Fabio Estevam" <festevam@denx.de>
+Message-ID: <20250519163230.1303438-2-festevam@gmail.com>
+
+From: Thomas Zimmermann <tzimmermann@suse.de>
+
+commit 1b0caa5f5ac20bcaf82fc89a5c849b21ce3bfdf6 uptream.
+
+Call drm_client_setup() to run the kernel's default client setup
+for DRM. Set fbdev_probe in struct drm_driver, so that the client
+setup can start the common fbdev client.
+
+v5:
+- select DRM_CLIENT_SELECTION
+
+Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
+Cc: "Noralf Trønnes" <noralf@tronnes.org>
+Acked-by: Noralf Trønnes <noralf@tronnes.org>
+Link: https://patchwork.freedesktop.org/patch/msgid/20240924071734.98201-32-tzimmermann@suse.de
+Signed-off-by: Fabio Estevam <festevam@denx.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/tiny/Kconfig | 1 +
+ drivers/gpu/drm/tiny/panel-mipi-dbi.c | 4 +++-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/tiny/Kconfig
++++ b/drivers/gpu/drm/tiny/Kconfig
+@@ -67,6 +67,7 @@ config DRM_OFDRM
+ config DRM_PANEL_MIPI_DBI
+ tristate "DRM support for MIPI DBI compatible panels"
+ depends on DRM && SPI
++ select DRM_CLIENT_SELECTION
+ select DRM_KMS_HELPER
+ select DRM_GEM_DMA_HELPER
+ select DRM_MIPI_DBI
+--- a/drivers/gpu/drm/tiny/panel-mipi-dbi.c
++++ b/drivers/gpu/drm/tiny/panel-mipi-dbi.c
+@@ -15,6 +15,7 @@
+ #include <linux/spi/spi.h>
+
+ #include <drm/drm_atomic_helper.h>
++#include <drm/drm_client_setup.h>
+ #include <drm/drm_drv.h>
+ #include <drm/drm_fbdev_dma.h>
+ #include <drm/drm_gem_atomic_helper.h>
+@@ -264,6 +265,7 @@ static const struct drm_driver panel_mip
+ .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
+ .fops = &panel_mipi_dbi_fops,
+ DRM_GEM_DMA_DRIVER_OPS_VMAP,
++ DRM_FBDEV_DMA_DRIVER_OPS,
+ .debugfs_init = mipi_dbi_debugfs_init,
+ .name = "panel-mipi-dbi",
+ .desc = "MIPI DBI compatible display panel",
+@@ -388,7 +390,7 @@ static int panel_mipi_dbi_spi_probe(stru
+
+ spi_set_drvdata(spi, drm);
+
+- drm_fbdev_dma_setup(drm, 0);
++ drm_client_setup(drm, NULL);
+
+ return 0;
+ }
--- /dev/null
+From stable+bounces-144885-greg=kroah.com@vger.kernel.org Mon May 19 18:34:26 2025
+From: Fabio Estevam <festevam@gmail.com>
+Date: Mon, 19 May 2025 13:32:30 -0300
+Subject: drm/tiny: panel-mipi-dbi: Use drm_client_setup_with_fourcc()
+To: stable@vger.kernel.org
+Cc: tzimmermann@suse.de, javierm@redhat.com, gregkh@linuxfoundation.org, Fabio Estevam <festevam@denx.de>
+Message-ID: <20250519163230.1303438-3-festevam@gmail.com>
+
+From: Fabio Estevam <festevam@denx.de>
+
+commit 9c1798259b9420f38f1fa1b83e3d864c3eb1a83e upstream.
+
+Since commit 559358282e5b ("drm/fb-helper: Don't use the preferred depth
+for the BPP default"), RGB565 displays such as the CFAF240320X no longer
+render correctly: colors are distorted and the content is shown twice
+horizontally.
+
+This regression is due to the fbdev emulation layer defaulting to 32 bits
+per pixel, whereas the display expects 16 bpp (RGB565). As a result, the
+framebuffer data is incorrectly interpreted by the panel.
+
+Fix the issue by calling drm_client_setup_with_fourcc() with a format
+explicitly selected based on the display's bits-per-pixel value. For 16
+bpp, use DRM_FORMAT_RGB565; for other values, fall back to the previous
+behavior. This ensures that the allocated framebuffer format matches the
+hardware expectations, avoiding color and layout corruption.
+
+Tested on a CFAF240320X display with an RGB565 configuration, confirming
+correct colors and layout after applying this patch.
+
+Cc: stable@vger.kernel.org
+Fixes: 559358282e5b ("drm/fb-helper: Don't use the preferred depth for the BPP default")
+Signed-off-by: Fabio Estevam <festevam@denx.de>
+Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
+Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
+Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
+Link: https://lore.kernel.org/r/20250417103458.2496790-1-festevam@gmail.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/tiny/panel-mipi-dbi.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/tiny/panel-mipi-dbi.c
++++ b/drivers/gpu/drm/tiny/panel-mipi-dbi.c
+@@ -390,7 +390,10 @@ static int panel_mipi_dbi_spi_probe(stru
+
+ spi_set_drvdata(spi, drm);
+
+- drm_client_setup(drm, NULL);
++ if (bpp == 16)
++ drm_client_setup_with_fourcc(drm, DRM_FORMAT_RGB565);
++ else
++ drm_client_setup_with_fourcc(drm, DRM_FORMAT_RGB888);
+
+ return 0;
+ }
accel-ivpu-fix-fw-log-printing.patch
iio-light-opt3001-fix-deadlock-due-to-concurrent-flag-access.patch
bluetooth-btnxpuart-fix-kernel-panic-during-fw-release.patch
+drm-fbdev-dma-support-struct-drm_driver.fbdev_probe.patch
+drm-panel-mipi-dbi-run-drm-default-client-setup.patch
+drm-tiny-panel-mipi-dbi-use-drm_client_setup_with_fourcc.patch