Devicetree
 help / color / mirror / Atom feed
* [PATCH v2 0/2] Add support for the BOE BF068MWM-TD0
@ 2026-06-05 18:27 Alexander Koskovich
  2026-06-05 18:27 ` [PATCH v2 1/2] dt-bindings: display: panel: Document Raydium RM69220 DDIC Alexander Koskovich
  2026-06-05 18:27 ` [PATCH v2 2/2] drm/panel: Add driver for " Alexander Koskovich
  0 siblings, 2 replies; 6+ messages in thread
From: Alexander Koskovich @ 2026-06-05 18:27 UTC (permalink / raw)
  To: Neil Armstrong, Jessica Zhang, David Airlie, Simona Vetter,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley
  Cc: dri-devel, devicetree, linux-kernel, Alexander Koskovich

Add the bindings and driver for the BOE BF068MWM-TD0 panel used in the Nothing
Phone (3a).

This series depends on support for DSC configurations with slice_per_pkt > 1,
technically it boots up and displays stuff without it but you see artifacting
without it:
https://lore.kernel.org/linux-arm-msm/20260318-dsi-dsc-slice-per-pkt-v2-0-0a1b316f8250@pm.me

Signed-off-by: Alexander Koskovich <akoskovich@pm.me>
---
Changes in v2:
- Rename binding & driver to DDIC instead of panel assembly (Neil)
- Clean up hardware resources in prepare() on errors (Sashiko AI review)
- Link to v1: https://lore.kernel.org/r/20260603-asteroids-panel-support-v1-0-109c6ac81c8f@pm.me

---
Alexander Koskovich (2):
      dt-bindings: display: panel: Document Raydium RM69220 DDIC
      drm/panel: Add driver for Raydium RM69220 DDIC

 .../bindings/display/panel/raydium,rm69220.yaml    |  74 ++++
 MAINTAINERS                                        |   6 +
 drivers/gpu/drm/panel/Kconfig                      |  15 +
 drivers/gpu/drm/panel/Makefile                     |   1 +
 drivers/gpu/drm/panel/panel-raydium-rm69220.c      | 435 +++++++++++++++++++++
 5 files changed, 531 insertions(+)
---
base-commit: 15a038bc8d93f92c80d9ba6844d4f16333234f39
change-id: 20260603-asteroids-panel-support-d55c929a89a8

Best regards,
-- 
Alexander Koskovich <akoskovich@pm.me>



^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2 1/2] dt-bindings: display: panel: Document Raydium RM69220 DDIC
  2026-06-05 18:27 [PATCH v2 0/2] Add support for the BOE BF068MWM-TD0 Alexander Koskovich
@ 2026-06-05 18:27 ` Alexander Koskovich
  2026-06-05 18:34   ` sashiko-bot
  2026-06-05 18:27 ` [PATCH v2 2/2] drm/panel: Add driver for " Alexander Koskovich
  1 sibling, 1 reply; 6+ messages in thread
From: Alexander Koskovich @ 2026-06-05 18:27 UTC (permalink / raw)
  To: Neil Armstrong, Jessica Zhang, David Airlie, Simona Vetter,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley
  Cc: dri-devel, devicetree, linux-kernel, Alexander Koskovich

Document the Raydium RM69220 DDIC and the BOE BF068MWM-TD0 6.77"
1080x2392 AMOLED display panel used in the Nothing Phone (3a).

Signed-off-by: Alexander Koskovich <akoskovich@pm.me>
---
 .../bindings/display/panel/raydium,rm69220.yaml    | 74 ++++++++++++++++++++++
 MAINTAINERS                                        |  5 ++
 2 files changed, 79 insertions(+)

diff --git a/Documentation/devicetree/bindings/display/panel/raydium,rm69220.yaml b/Documentation/devicetree/bindings/display/panel/raydium,rm69220.yaml
new file mode 100644
index 000000000000..7423b192d892
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/panel/raydium,rm69220.yaml
@@ -0,0 +1,74 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/panel/raydium,rm69220.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Raydium RM69220 based MIPI-DSI panels
+
+maintainers:
+  - Alexander Koskovich <akoskovich@pm.me>
+
+description:
+  The Raydium RM69220 is a generic DSI Panel IC used to control
+  AMOLED panels.
+
+allOf:
+  - $ref: panel-common.yaml#
+
+properties:
+  compatible:
+    items:
+      - enum:
+          - boe,bf068mwm-td0
+      - const: raydium,rm69220
+
+  reg:
+    maxItems: 1
+
+  dvdd-supply:
+    description: Digital voltage rail
+
+  vci-supply:
+    description: Analog voltage rail
+
+  vddio-supply:
+    description: I/O voltage rail
+
+required:
+  - compatible
+  - dvdd-supply
+  - port
+  - reg
+  - reset-gpios
+  - vci-supply
+  - vddio-supply
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/gpio/gpio.h>
+
+    dsi {
+        #address-cells = <1>;
+        #size-cells = <0>;
+
+        panel@0 {
+            compatible = "boe,bf068mwm-td0", "raydium,rm69220";
+            reg = <0>;
+
+            reset-gpios = <&tlmm 12 GPIO_ACTIVE_LOW>;
+            dvdd-supply = <&vreg_oled_dvdd_1p8>;
+            vci-supply = <&vreg_l19b>;
+            vddio-supply = <&vreg_l9b>;
+
+            port {
+                panel_in_0: endpoint {
+                    remote-endpoint = <&dsi0_out>;
+                };
+            };
+        };
+    };
+
+...
diff --git a/MAINTAINERS b/MAINTAINERS
index c9f2780b2d31..ca2417d9d238 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8354,6 +8354,11 @@ S:	Maintained
 F:	Documentation/devicetree/bindings/display/panel/raydium,rm67191.yaml
 F:	drivers/gpu/drm/panel/panel-raydium-rm67191.c
 
+DRM DRIVER FOR RAYDIUM RM69220 PANELS
+M:	Alexander Koskovich <akoskovich@pm.me>
+S:	Maintained
+F:	Documentation/devicetree/bindings/display/panel/raydium,rm69220.yaml
+
 DRM DRIVER FOR SAMSUNG DB7430 PANELS
 M:	Linus Walleij <linusw@kernel.org>
 S:	Maintained

-- 
2.53.0



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 2/2] drm/panel: Add driver for Raydium RM69220 DDIC
  2026-06-05 18:27 [PATCH v2 0/2] Add support for the BOE BF068MWM-TD0 Alexander Koskovich
  2026-06-05 18:27 ` [PATCH v2 1/2] dt-bindings: display: panel: Document Raydium RM69220 DDIC Alexander Koskovich
@ 2026-06-05 18:27 ` Alexander Koskovich
  2026-06-05 18:44   ` sashiko-bot
  1 sibling, 1 reply; 6+ messages in thread
From: Alexander Koskovich @ 2026-06-05 18:27 UTC (permalink / raw)
  To: Neil Armstrong, Jessica Zhang, David Airlie, Simona Vetter,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley
  Cc: dri-devel, devicetree, linux-kernel, Alexander Koskovich

Add a panel driver for Raydium RM69220 DDIC based displays such as the
BOE BF068MWM-TD0 found in the Nothing Phone (3a).

Signed-off-by: Alexander Koskovich <akoskovich@pm.me>
---
 MAINTAINERS                                   |   1 +
 drivers/gpu/drm/panel/Kconfig                 |  15 +
 drivers/gpu/drm/panel/Makefile                |   1 +
 drivers/gpu/drm/panel/panel-raydium-rm69220.c | 435 ++++++++++++++++++++++++++
 4 files changed, 452 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index ca2417d9d238..367f8a42e485 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8358,6 +8358,7 @@ DRM DRIVER FOR RAYDIUM RM69220 PANELS
 M:	Alexander Koskovich <akoskovich@pm.me>
 S:	Maintained
 F:	Documentation/devicetree/bindings/display/panel/raydium,rm69220.yaml
+F:	drivers/gpu/drm/panel/panel-raydium-rm69220.c
 
 DRM DRIVER FOR SAMSUNG DB7430 PANELS
 M:	Linus Walleij <linusw@kernel.org>
diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig
index 7450b27622a2..142c91202b8f 100644
--- a/drivers/gpu/drm/panel/Kconfig
+++ b/drivers/gpu/drm/panel/Kconfig
@@ -769,6 +769,21 @@ config DRM_PANEL_RAYDIUM_RM692E5
 	  Say Y here if you want to enable support for Raydium RM692E5-based
 	  display panels, such as the one found in the Fairphone 5 smartphone.
 
+config DRM_PANEL_RAYDIUM_RM69220
+	tristate "Raydium RM69220-based DSI panel"
+	depends on OF
+	depends on DRM_MIPI_DSI
+	depends on BACKLIGHT_CLASS_DEVICE
+	select DRM_DISPLAY_DSC_HELPER
+	select DRM_DISPLAY_HELPER
+	help
+	  Say Y here if you want to enable support for Raydium RM69220-based
+	  display panels, such as the BOE BF068MWM-TD0 which can be found in
+	  the Nothing Phone (3a).
+
+	  To compile this driver as a module, choose M here: the module
+	  will be called panel-raydium-rm69220.
+
 config DRM_PANEL_RAYDIUM_RM69380
 	tristate "Raydium RM69380-based DSI panel"
 	depends on GPIOLIB
diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile
index c2c5cf817116..4c23ac013f12 100644
--- a/drivers/gpu/drm/panel/Makefile
+++ b/drivers/gpu/drm/panel/Makefile
@@ -76,6 +76,7 @@ obj-$(CONFIG_DRM_PANEL_RAYDIUM_RM67191) += panel-raydium-rm67191.o
 obj-$(CONFIG_DRM_PANEL_RAYDIUM_RM67200) += panel-raydium-rm67200.o
 obj-$(CONFIG_DRM_PANEL_RAYDIUM_RM68200) += panel-raydium-rm68200.o
 obj-$(CONFIG_DRM_PANEL_RAYDIUM_RM692E5) += panel-raydium-rm692e5.o
+obj-$(CONFIG_DRM_PANEL_RAYDIUM_RM69220) += panel-raydium-rm69220.o
 obj-$(CONFIG_DRM_PANEL_RAYDIUM_RM69380) += panel-raydium-rm69380.o
 obj-$(CONFIG_DRM_PANEL_RENESAS_R61307) += panel-renesas-r61307.o
 obj-$(CONFIG_DRM_PANEL_RENESAS_R69328) += panel-renesas-r69328.o
diff --git a/drivers/gpu/drm/panel/panel-raydium-rm69220.c b/drivers/gpu/drm/panel/panel-raydium-rm69220.c
new file mode 100644
index 000000000000..9f5dd51b4d5e
--- /dev/null
+++ b/drivers/gpu/drm/panel/panel-raydium-rm69220.c
@@ -0,0 +1,435 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Generated with linux-mdss-dsi-panel-driver-generator from vendor device tree.
+ * Copyright (c) 2026 Alexander Koskovich <akoskovich@pm.me>
+ */
+
+#include <linux/backlight.h>
+#include <linux/delay.h>
+#include <linux/gpio/consumer.h>
+#include <linux/mod_devicetable.h>
+#include <linux/module.h>
+#include <linux/regulator/consumer.h>
+
+#include <video/mipi_display.h>
+
+#include <drm/display/drm_dsc.h>
+#include <drm/display/drm_dsc_helper.h>
+#include <drm/drm_mipi_dsi.h>
+#include <drm/drm_modes.h>
+#include <drm/drm_panel.h>
+#include <drm/drm_probe_helper.h>
+
+struct raydium_rm69220 {
+	struct drm_panel panel;
+	struct mipi_dsi_device *dsi;
+	struct drm_dsc_config dsc;
+	struct regulator_bulk_data *supplies;
+	struct gpio_desc *reset_gpio;
+};
+
+static const struct regulator_bulk_data raydium_rm69220_supplies[] = {
+	{ .supply = "vddio" },
+	{ .supply = "dvdd" },
+	{ .supply = "vci" },
+};
+
+static inline
+struct raydium_rm69220 *to_raydium_rm69220(struct drm_panel *panel)
+{
+	return container_of(panel, struct raydium_rm69220, panel);
+}
+
+static void raydium_rm69220_reset(struct raydium_rm69220 *ctx)
+{
+	gpiod_set_value_cansleep(ctx->reset_gpio, 0);
+	usleep_range(1000, 2000);
+	gpiod_set_value_cansleep(ctx->reset_gpio, 1);
+	usleep_range(1000, 2000);
+	gpiod_set_value_cansleep(ctx->reset_gpio, 0);
+	msleep(32);
+}
+
+static int raydium_rm69220_on(struct raydium_rm69220 *ctx)
+{
+	struct mipi_dsi_multi_context dsi_ctx = { .dsi = ctx->dsi };
+
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x76);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x9a, 0x10);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x9b, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x77);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x9a, 0x10);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x9b, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x78);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x9a, 0x10);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x9b, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x79);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x9a, 0xf0);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x9b, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x74);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1a, 0xe0);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1b, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x40);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xa9, 0x68);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xab, 0x22);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x40);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xc0, 0xa6);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xbf, 0x87);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x82);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x90);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0xd4);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x61, 0x08);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xa2, 0x04);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfa, 0x01);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0xd2);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x97, 0x08);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x36, 0x11);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x39, 0xab);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3a, 0x30);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3b, 0x80);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3d, 0x09);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3f, 0x58);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x40, 0x04);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x41, 0x38);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x42, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x43, 0x0d);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x44, 0x02);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x45, 0x1c);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x46, 0x02);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x47, 0x1c);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x48, 0x02);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x49, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4a, 0x02);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4b, 0x0e);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4d, 0x20);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4e, 0x01);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4f, 0x39);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x50, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x51, 0x07);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x53, 0x0c);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x54, 0x08);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x55, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x56, 0x07);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x58, 0xd3);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x59, 0x18);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5a, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5b, 0x10);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5c, 0xf0);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5d, 0x07);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5e, 0x10);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5f, 0x20);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x60, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x61, 0x06);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x62, 0x0f);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x63, 0x0f);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x64, 0x33);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x65, 0x0e);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x66, 0x1c);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x67, 0x2a);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x68, 0x38);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x69, 0x46);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6a, 0x54);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6b, 0x62);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6c, 0x69);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6d, 0x70);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6e, 0x77);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6f, 0x79);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x70, 0x7b);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x71, 0x7d);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x72, 0x7e);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x73, 0x01);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x74, 0x02);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x75, 0x22);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x76, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x77, 0x2a);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x78, 0x40);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x79, 0x2a);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7a, 0xbe);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7b, 0x3a);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7c, 0xfc);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7d, 0x3a);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7e, 0xfa);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7f, 0x3a);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x80, 0xf8);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x81, 0x3b);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x82, 0x38);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x83, 0x3b);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x84, 0x78);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x85, 0x3b);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x86, 0xb6);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x87, 0x4b);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x88, 0xf6);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x89, 0x4c);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x8a, 0x34);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x8b, 0x4c);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x8c, 0x74);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x8d, 0x5c);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x8e, 0x74);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x8f, 0x8c);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x90, 0xf4);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x91, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x92, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x93, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x94, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x95, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x96, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0xa0);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x66, 0x06);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x49);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x87, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3f, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0xa0);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x04, 0x07);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4b, 0x40);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4d, 0x40);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0xa1);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x58, 0x67);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x75, 0xa7);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2f, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfa, 0x01);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xc1, 0x03);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xc2, 0x03);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x35, 0x00);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x51, 0x0d, 0xbb);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x00);
+	mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
+	mipi_dsi_msleep(&dsi_ctx, 80);
+	mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
+	mipi_dsi_usleep_range(&dsi_ctx, 10000, 11000);
+
+	return dsi_ctx.accum_err;
+}
+
+static int raydium_rm69220_off(struct raydium_rm69220 *ctx)
+{
+	struct mipi_dsi_multi_context dsi_ctx = { .dsi = ctx->dsi };
+
+	mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
+	mipi_dsi_msleep(&dsi_ctx, 100);
+	mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
+	mipi_dsi_msleep(&dsi_ctx, 100);
+
+	return dsi_ctx.accum_err;
+}
+
+static int raydium_rm69220_prepare(struct drm_panel *panel)
+{
+	struct raydium_rm69220 *ctx = to_raydium_rm69220(panel);
+	struct device *dev = &ctx->dsi->dev;
+	struct drm_dsc_picture_parameter_set pps;
+	int ret;
+
+	ret = regulator_bulk_enable(ARRAY_SIZE(raydium_rm69220_supplies), ctx->supplies);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable regulators: %d\n", ret);
+		return ret;
+	}
+
+	raydium_rm69220_reset(ctx);
+
+	ret = raydium_rm69220_on(ctx);
+	if (ret < 0) {
+		dev_err(dev, "Failed to initialize panel: %d\n", ret);
+		goto err;
+	}
+
+	drm_dsc_pps_payload_pack(&pps, &ctx->dsc);
+
+	ret = mipi_dsi_picture_parameter_set(ctx->dsi, &pps);
+	if (ret < 0) {
+		dev_err(dev, "failed to transmit PPS: %d\n", ret);
+		goto err;
+	}
+
+	ret = mipi_dsi_compression_mode(ctx->dsi, true);
+	if (ret < 0) {
+		dev_err(dev, "failed to enable compression mode: %d\n", ret);
+		goto err;
+	}
+
+	msleep(28);
+
+	return 0;
+
+err:
+	gpiod_set_value_cansleep(ctx->reset_gpio, 1);
+	regulator_bulk_disable(ARRAY_SIZE(raydium_rm69220_supplies), ctx->supplies);
+	return ret;
+}
+
+static int raydium_rm69220_unprepare(struct drm_panel *panel)
+{
+	struct raydium_rm69220 *ctx = to_raydium_rm69220(panel);
+	struct device *dev = &ctx->dsi->dev;
+	int ret;
+
+	ret = raydium_rm69220_off(ctx);
+	if (ret < 0)
+		dev_err(dev, "Failed to un-initialize panel: %d\n", ret);
+
+	gpiod_set_value_cansleep(ctx->reset_gpio, 1);
+	regulator_bulk_disable(ARRAY_SIZE(raydium_rm69220_supplies), ctx->supplies);
+
+	return 0;
+}
+
+static const struct drm_display_mode raydium_rm69220_mode = {
+	.clock = (1080 + 36 + 4 + 36) * (2392 + 72 + 4 + 52) * 120 / 1000,
+	.hdisplay = 1080,
+	.hsync_start = 1080 + 36,
+	.hsync_end = 1080 + 36 + 4,
+	.htotal = 1080 + 36 + 4 + 36,
+	.vdisplay = 2392,
+	.vsync_start = 2392 + 72,
+	.vsync_end = 2392 + 72 + 4,
+	.vtotal = 2392 + 72 + 4 + 52,
+	.width_mm = 71,
+	.height_mm = 157,
+	.type = DRM_MODE_TYPE_DRIVER,
+};
+
+static int raydium_rm69220_get_modes(struct drm_panel *panel,
+					    struct drm_connector *connector)
+{
+	return drm_connector_helper_get_modes_fixed(connector, &raydium_rm69220_mode);
+}
+
+static const struct drm_panel_funcs raydium_rm69220_panel_funcs = {
+	.prepare = raydium_rm69220_prepare,
+	.unprepare = raydium_rm69220_unprepare,
+	.get_modes = raydium_rm69220_get_modes,
+};
+
+static int raydium_rm69220_bl_update_status(struct backlight_device *bl)
+{
+	struct mipi_dsi_device *dsi = bl_get_data(bl);
+	u16 brightness = backlight_get_brightness(bl);
+	int ret;
+
+	dsi->mode_flags &= ~MIPI_DSI_MODE_LPM;
+
+	ret = mipi_dsi_dcs_set_display_brightness_large(dsi, brightness);
+	if (ret < 0)
+		return ret;
+
+	dsi->mode_flags |= MIPI_DSI_MODE_LPM;
+
+	return 0;
+}
+
+static const struct backlight_ops raydium_rm69220_bl_ops = {
+	.update_status = raydium_rm69220_bl_update_status,
+};
+
+static struct backlight_device *
+raydium_rm69220_create_backlight(struct mipi_dsi_device *dsi)
+{
+	struct device *dev = &dsi->dev;
+	const struct backlight_properties props = {
+		.type = BACKLIGHT_RAW,
+		.brightness = 2946,
+		.max_brightness = 3442, /* 4095 is HBM max */
+	};
+
+	return devm_backlight_device_register(dev, dev_name(dev), dev, dsi,
+					      &raydium_rm69220_bl_ops, &props);
+}
+
+static int raydium_rm69220_probe(struct mipi_dsi_device *dsi)
+{
+	struct device *dev = &dsi->dev;
+	struct raydium_rm69220 *ctx;
+	int ret;
+
+	ctx = devm_drm_panel_alloc(dev, struct raydium_rm69220, panel,
+				   &raydium_rm69220_panel_funcs,
+				   DRM_MODE_CONNECTOR_DSI);
+	if (IS_ERR(ctx))
+		return PTR_ERR(ctx);
+
+	ret = devm_regulator_bulk_get_const(dev,
+					    ARRAY_SIZE(raydium_rm69220_supplies),
+					    raydium_rm69220_supplies,
+					    &ctx->supplies);
+	if (ret < 0)
+		return ret;
+
+	ctx->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(ctx->reset_gpio))
+		return dev_err_probe(dev, PTR_ERR(ctx->reset_gpio),
+				     "Failed to get reset-gpios\n");
+
+	ctx->dsi = dsi;
+	mipi_dsi_set_drvdata(dsi, ctx);
+
+	dsi->lanes = 4;
+	dsi->format = MIPI_DSI_FMT_RGB101010;
+	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_NO_EOT_PACKET |
+			  MIPI_DSI_CLOCK_NON_CONTINUOUS | MIPI_DSI_MODE_LPM |
+			  MIPI_DSI_MODE_DSC_ALL_SLICES_IN_PKT;
+
+	ctx->panel.prepare_prev_first = true;
+
+	ctx->panel.backlight = raydium_rm69220_create_backlight(dsi);
+	if (IS_ERR(ctx->panel.backlight))
+		return dev_err_probe(dev, PTR_ERR(ctx->panel.backlight),
+				     "Failed to create backlight\n");
+
+	drm_panel_add(&ctx->panel);
+
+	/* This panel only supports DSC; unconditionally enable it */
+	dsi->dsc = &ctx->dsc;
+
+	ctx->dsc.dsc_version_major = 1;
+	ctx->dsc.dsc_version_minor = 1;
+	ctx->dsc.slice_height = 13;
+	ctx->dsc.slice_width = 540;
+
+	ctx->dsc.slice_count = 1080 / ctx->dsc.slice_width;
+	ctx->dsc.bits_per_component = 10;
+	ctx->dsc.bits_per_pixel = 8 << 4; /* 4 fractional bits */
+	ctx->dsc.block_pred_enable = true;
+
+	ret = mipi_dsi_attach(dsi);
+	if (ret < 0) {
+		drm_panel_remove(&ctx->panel);
+		return dev_err_probe(dev, ret, "Failed to attach to DSI host\n");
+	}
+
+	return 0;
+}
+
+static void raydium_rm69220_remove(struct mipi_dsi_device *dsi)
+{
+	struct raydium_rm69220 *ctx = mipi_dsi_get_drvdata(dsi);
+	int ret;
+
+	ret = mipi_dsi_detach(dsi);
+	if (ret < 0)
+		dev_err(&dsi->dev, "Failed to detach from DSI host: %d\n", ret);
+
+	drm_panel_remove(&ctx->panel);
+}
+
+static const struct of_device_id raydium_rm69220_of_match[] = {
+	{ .compatible = "boe,bf068mwm-td0" },
+	{ /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, raydium_rm69220_of_match);
+
+static struct mipi_dsi_driver raydium_rm69220_driver = {
+	.probe = raydium_rm69220_probe,
+	.remove = raydium_rm69220_remove,
+	.driver = {
+		.name = "panel-raydium-rm69220",
+		.of_match_table = raydium_rm69220_of_match,
+	},
+};
+module_mipi_dsi_driver(raydium_rm69220_driver);
+
+MODULE_AUTHOR("Alexander Koskovich <akoskovich@pm.me>");
+MODULE_DESCRIPTION("DRM driver for RM69220-equipped DSI panels");
+MODULE_LICENSE("GPL");

-- 
2.53.0



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 1/2] dt-bindings: display: panel: Document Raydium RM69220 DDIC
  2026-06-05 18:27 ` [PATCH v2 1/2] dt-bindings: display: panel: Document Raydium RM69220 DDIC Alexander Koskovich
@ 2026-06-05 18:34   ` sashiko-bot
  2026-06-05 18:37     ` Alexander Koskovich
  0 siblings, 1 reply; 6+ messages in thread
From: sashiko-bot @ 2026-06-05 18:34 UTC (permalink / raw)
  To: Alexander Koskovich; +Cc: dri-devel, robh, devicetree, conor+dt

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Low] The newly added DT binding schema introduces a dtbs_check regression for an existing dummy panel node in `arch/arm64/boot/dts/qcom/milos-nothing-asteroids.dts`. The existing device tree uses `compatible = "boe,bf068mwm-td0"` for a simple-framebuffer dummy node, but lacks the strictly required properties mandated by the new schema.
--

commit 6315e592e65e15de511f78a600454fa1ddbaf9e2
Author: Alexander Koskovich <akoskovich@pm.me>

dt-bindings: display: panel: Document Raydium RM69220 DDIC

Document the Raydium RM69220 DDIC and the BOE BF068MWM-TD0 6.77"
1080x2392 AMOLED display panel used in the Nothing Phone (3a).

> diff --git a/Documentation/devicetree/bindings/display/panel/raydium,rm69220.yaml b/Documentation/devicetree/bindings/display/panel/raydium,rm69220.yaml
> new file mode 100644
> index 0000000000000..7423b192d892c
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/display/panel/raydium,rm69220.yaml
[ ... ]
> +properties:
> +  compatible:
> +    items:
> +      - enum:
> +          - boe,bf068mwm-td0
> +      - const: raydium,rm69220

[Severity: Low]
Will this strict compatible requirement trigger dtbs_check failures for the
existing dummy panel node in
arch/arm64/boot/dts/qcom/milos-nothing-asteroids.dts?

That file currently uses this compatible string for a dummy node:

			/* Dummy panel for simple-framebuffer dimension info */
			panel: dummy-panel {
				compatible = "boe,bf068mwm-td0";
				height-mm = <157>;
				width-mm = <71>;
			};

Since the new schema mandates a two-item array with "raydium,rm69220" and
several other required properties like dvdd-supply, reg, and port, validating
the existing dts against this schema appears to cause validation failures.

Should the dummy node's compatible string be updated to avoid conflicting with
the actual hardware schema, or should the dts update be included in this
series?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260605-asteroids-panel-support-v2-0-44b96c6eca91@pm.me?part=1

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 1/2] dt-bindings: display: panel: Document Raydium RM69220 DDIC
  2026-06-05 18:34   ` sashiko-bot
@ 2026-06-05 18:37     ` Alexander Koskovich
  0 siblings, 0 replies; 6+ messages in thread
From: Alexander Koskovich @ 2026-06-05 18:37 UTC (permalink / raw)
  To: sashiko-reviews; +Cc: dri-devel, robh, devicetree, conor+dt

On Friday, June 5th, 2026 at 2:34 PM, sashiko-bot@kernel.org <sashiko-bot@kernel.org> wrote:

> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Low] The newly added DT binding schema introduces a dtbs_check regression for an existing dummy panel node in `arch/arm64/boot/dts/qcom/milos-nothing-asteroids.dts`. The existing device tree uses `compatible = "boe,bf068mwm-td0"` for a simple-framebuffer dummy node, but lacks the strictly required properties mandated by the new schema.
> --
> 
> commit 6315e592e65e15de511f78a600454fa1ddbaf9e2
> Author: Alexander Koskovich <akoskovich@pm.me>
> 
> dt-bindings: display: panel: Document Raydium RM69220 DDIC
> 
> Document the Raydium RM69220 DDIC and the BOE BF068MWM-TD0 6.77"
> 1080x2392 AMOLED display panel used in the Nothing Phone (3a).
> 
> > diff --git a/Documentation/devicetree/bindings/display/panel/raydium,rm69220.yaml b/Documentation/devicetree/bindings/display/panel/raydium,rm69220.yaml
> > new file mode 100644
> > index 0000000000000..7423b192d892c
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/display/panel/raydium,rm69220.yaml
> [ ... ]
> > +properties:
> > +  compatible:
> > +    items:
> > +      - enum:
> > +          - boe,bf068mwm-td0
> > +      - const: raydium,rm69220
> 
> [Severity: Low]
> Will this strict compatible requirement trigger dtbs_check failures for the
> existing dummy panel node in
> arch/arm64/boot/dts/qcom/milos-nothing-asteroids.dts?
> 
> That file currently uses this compatible string for a dummy node:
> 
> 			/* Dummy panel for simple-framebuffer dimension info */
> 			panel: dummy-panel {
> 				compatible = "boe,bf068mwm-td0";
> 				height-mm = <157>;
> 				width-mm = <71>;
> 			};
> 
> Since the new schema mandates a two-item array with "raydium,rm69220" and
> several other required properties like dvdd-supply, reg, and port, validating
> the existing dts against this schema appears to cause validation failures.
> 
> Should the dummy node's compatible string be updated to avoid conflicting with
> the actual hardware schema, or should the dts update be included in this
> series?

The dummy node is being dropped here:
https://lore.kernel.org/linux-arm-msm/20260603-asteroids-drop-simplefb-v1-1-34d73477c9d4@pm.me

> 
> --
> Sashiko AI review · https://sashiko.dev/#/patchset/20260605-asteroids-panel-support-v2-0-44b96c6eca91@pm.me?part=1
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 2/2] drm/panel: Add driver for Raydium RM69220 DDIC
  2026-06-05 18:27 ` [PATCH v2 2/2] drm/panel: Add driver for " Alexander Koskovich
@ 2026-06-05 18:44   ` sashiko-bot
  0 siblings, 0 replies; 6+ messages in thread
From: sashiko-bot @ 2026-06-05 18:44 UTC (permalink / raw)
  To: Alexander Koskovich; +Cc: devicetree, robh, conor+dt, dri-devel

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [High] The reset GPIO is requested with `GPIOD_OUT_LOW`, which deasserts it and can backpower the unpowered panel.
- [High] The backlight callback modifies `dsi->mode_flags` without locking and permanently corrupts the state if the DSI transfer fails.
- [Low] The macro `MIPI_DSI_MODE_DSC_ALL_SLICES_IN_PKT` is undefined in the kernel, causing a build failure.
--

commit 3b5fdc2d207db00cc147a18d14281a4361ece19b
Author: Alexander Koskovich <akoskovich@pm.me>

drm/panel: Add driver for Raydium RM69220 DDIC

Add a panel driver for Raydium RM69220 DDIC based displays such as the
BOE BF068MWM-TD0 found in the Nothing Phone (3a).

> diff --git a/drivers/gpu/drm/panel/panel-raydium-rm69220.c b/drivers/gpu/drm/panel/panel-raydium-rm69220.c
> new file mode 100644
> --- /dev/null
> +++ b/drivers/gpu/drm/panel/panel-raydium-rm69220.c

[ ... ]

> +static int raydium_rm69220_bl_update_status(struct backlight_device *bl)
> +{
> +	struct mipi_dsi_device *dsi = bl_get_data(bl);
> +	u16 brightness = backlight_get_brightness(bl);
> +	int ret;
> +
> +	dsi->mode_flags &= ~MIPI_DSI_MODE_LPM;
> +
> +	ret = mipi_dsi_dcs_set_display_brightness_large(dsi, brightness);
> +	if (ret < 0)
> +		return ret;
> +
> +	dsi->mode_flags |= MIPI_DSI_MODE_LPM;
> +
> +	return 0;
> +}

[Severity: High]
Does this error path permanently corrupt the DSI mode flags?

If mipi_dsi_dcs_set_display_brightness_large() fails, the function returns
early without restoring MIPI_DSI_MODE_LPM. Userspace can trigger this easily
by writing to the backlight sysfs node while the display is powered off,
which will cause a transfer timeout. All future DSI initialization commands
will then incorrectly be sent in high-speed mode, preventing the panel from
turning back on until the system is rebooted.

[ ... ]

> +static int raydium_rm69220_probe(struct mipi_dsi_device *dsi)
> +{
> +	struct device *dev = &dsi->dev;
> +	struct raydium_rm69220 *ctx;
> +	int ret;

[ ... ]

> +	ctx->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
> +	if (IS_ERR(ctx->reset_gpio))
> +		return dev_err_probe(dev, PTR_ERR(ctx->reset_gpio),
> +				     "Failed to get reset-gpios\n");

[Severity: High]
Is GPIOD_OUT_LOW the correct initialization here?

Because the reset pin is typically active-low, a logical 0 translates to
driving the physical pin HIGH. This happens at probe time before the
regulators are enabled, which can drive voltage into the panel's reset pin
while its power supplies are off. This forward-biases the panel's ESD
protection diodes, leaking current into the power plane and potentially
causing hardware damage. Should this be initialized to GPIOD_OUT_HIGH to
hold it safely in reset (0V) until power is applied?

> +
> +	ctx->dsi = dsi;
> +	mipi_dsi_set_drvdata(dsi, ctx);
> +
> +	dsi->lanes = 4;
> +	dsi->format = MIPI_DSI_FMT_RGB101010;
> +	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_NO_EOT_PACKET |
> +			  MIPI_DSI_CLOCK_NON_CONTINUOUS | MIPI_DSI_MODE_LPM |
> +			  MIPI_DSI_MODE_DSC_ALL_SLICES_IN_PKT;

[Severity: Low]
Will this compile correctly?

The macro MIPI_DSI_MODE_DSC_ALL_SLICES_IN_PKT appears to be undefined in the
upstream kernel, possibly a leftover from a vendor tree. Compiling this
driver will likely result in an undeclared identifier error.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260605-asteroids-panel-support-v2-0-44b96c6eca91@pm.me?part=2

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-06-05 18:44 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-05 18:27 [PATCH v2 0/2] Add support for the BOE BF068MWM-TD0 Alexander Koskovich
2026-06-05 18:27 ` [PATCH v2 1/2] dt-bindings: display: panel: Document Raydium RM69220 DDIC Alexander Koskovich
2026-06-05 18:34   ` sashiko-bot
2026-06-05 18:37     ` Alexander Koskovich
2026-06-05 18:27 ` [PATCH v2 2/2] drm/panel: Add driver for " Alexander Koskovich
2026-06-05 18:44   ` sashiko-bot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox