* [PATCH v2 0/2] drm: panel: support the R63419 based dual-DSI video mode Display Panels
@ 2026-04-30 12:22 Neil Armstrong
2026-04-30 12:22 ` [PATCH v2 1/2] dt-bindings: regulator: document the Renesas " Neil Armstrong
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Neil Armstrong @ 2026-04-30 12:22 UTC (permalink / raw)
To: Jessica Zhang, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Geert Uytterhoeven,
Magnus Damm
Cc: dri-devel, devicetree, linux-kernel, linux-renesas-soc,
Neil Armstrong, KancyJoe
Add support for the Renesas 63419 based dual-DSI video mode
Display Panels found in the Ayaneo gaming handled devices.
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
---
Changes in v2:
- Add missing rotation property into bindings
- Fix commit message & subject typos
- Link to v1: https://patch.msgid.link/20260428-topic-sm8650-ayaneo-pocket-s2-r63419-v1-0-981eb5ab5a51@linaro.org
---
KancyJoe (1):
drm: panel: add support for the Renesas R63419 based dual-DSI video mode Display Panels
Neil Armstrong (1):
dt-bindings: regulator: document the Renesas R63419 based dual-DSI video mode Display Panels
.../bindings/display/panel/renesas,r63419.yaml | 93 ++++++
drivers/gpu/drm/panel/Kconfig | 12 +
drivers/gpu/drm/panel/Makefile | 1 +
drivers/gpu/drm/panel/panel-renesas-r63419.c | 356 +++++++++++++++++++++
4 files changed, 462 insertions(+)
---
base-commit: 39704f00f747aba3144289870b5fd8ac230a9aaf
change-id: 20260428-topic-sm8650-ayaneo-pocket-s2-r63419-e72467e2db0f
Best regards,
--
Neil Armstrong <neil.armstrong@linaro.org>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 1/2] dt-bindings: regulator: document the Renesas R63419 based dual-DSI video mode Display Panels
2026-04-30 12:22 [PATCH v2 0/2] drm: panel: support the R63419 based dual-DSI video mode Display Panels Neil Armstrong
@ 2026-04-30 12:22 ` Neil Armstrong
2026-05-03 12:34 ` Krzysztof Kozlowski
2026-05-05 0:27 ` Claude review: " Claude Code Review Bot
2026-04-30 12:22 ` [PATCH v2 2/2] drm: panel: add support for " Neil Armstrong
2026-05-05 0:27 ` Claude review: drm: panel: support the " Claude Code Review Bot
2 siblings, 2 replies; 8+ messages in thread
From: Neil Armstrong @ 2026-04-30 12:22 UTC (permalink / raw)
To: Jessica Zhang, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Geert Uytterhoeven,
Magnus Damm
Cc: dri-devel, devicetree, linux-kernel, linux-renesas-soc,
Neil Armstrong
Document the Renesas R63419 based dual-DSI video mode Display Panels found
in the Ayaneo gaming handled devices.
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
---
.../bindings/display/panel/renesas,r63419.yaml | 93 ++++++++++++++++++++++
1 file changed, 93 insertions(+)
diff --git a/Documentation/devicetree/bindings/display/panel/renesas,r63419.yaml b/Documentation/devicetree/bindings/display/panel/renesas,r63419.yaml
new file mode 100644
index 000000000000..17f166db3ca3
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/panel/renesas,r63419.yaml
@@ -0,0 +1,93 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/panel/renesas,r63419.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Renesas R63419 based dual-DSI video mode Display Panel
+
+maintainers:
+ - Neil Armstrong <neil.armstrong@linaro.org>
+
+description:
+ The Renesas R63419 is a generic DDIC used to control dual-DSI LCD panels.
+
+allOf:
+ - $ref: panel-common.yaml#
+
+properties:
+ compatible:
+ enum:
+ - ayaneo,wt0600-2k
+ - ayaneo,wt0630-2k
+
+ reg:
+ maxItems: 1
+
+ vdd-supply: true
+ vddio-supply: true
+ vsp-supply: true
+ vsn-supply: true
+ vci-supply: true
+
+ backlight: true
+ reset-gpios: true
+ rotation: true
+ ports: true
+
+required:
+ - compatible
+ - vdd-supply
+ - vddio-supply
+ - vsp-supply
+ - vsn-supply
+ - vci-supply
+ - backlight
+ - reset-gpios
+ - ports
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/gpio/gpio.h>
+
+ dsi {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ panel@0 {
+ compatible = "ayaneo,wt0600-2k";
+ reg = <0>;
+
+ reset-gpios = <&gpio 176 GPIO_ACTIVE_LOW>;
+
+ vdd-supply = <&vdd_3v0_lcd>;
+ vddio-supply = <&vdd_1v8_io>;
+ vsn-supply = <&vdd_5v0_pos>;
+ vsp-supply = <&vdd_5v0_neg>;
+ vci-supply = <&vdd_3v0_vci>;
+
+ backlight = <&backlight>;
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+ panel_in0: endpoint {
+ remote-endpoint = <&dsi0_out>;
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+ panel_in1: endpoint {
+ remote-endpoint = <&dsi1_out>;
+ };
+ };
+ };
+ };
+ };
+...
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 2/2] drm: panel: add support for the Renesas R63419 based dual-DSI video mode Display Panels
2026-04-30 12:22 [PATCH v2 0/2] drm: panel: support the R63419 based dual-DSI video mode Display Panels Neil Armstrong
2026-04-30 12:22 ` [PATCH v2 1/2] dt-bindings: regulator: document the Renesas " Neil Armstrong
@ 2026-04-30 12:22 ` Neil Armstrong
2026-05-05 0:27 ` Claude review: " Claude Code Review Bot
2026-05-05 0:27 ` Claude review: drm: panel: support the " Claude Code Review Bot
2 siblings, 1 reply; 8+ messages in thread
From: Neil Armstrong @ 2026-04-30 12:22 UTC (permalink / raw)
To: Jessica Zhang, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Geert Uytterhoeven,
Magnus Damm
Cc: dri-devel, devicetree, linux-kernel, linux-renesas-soc,
Neil Armstrong, KancyJoe
From: KancyJoe <kancy2333@outlook.com>
Implement support for the Renesas 63419 based dual-DSI video mode
Display Panels found in the Ayaneo gaming handled devices.
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: KancyJoe <kancy2333@outlook.com>
---
drivers/gpu/drm/panel/Kconfig | 12 +
drivers/gpu/drm/panel/Makefile | 1 +
drivers/gpu/drm/panel/panel-renesas-r63419.c | 356 +++++++++++++++++++++++++++
3 files changed, 369 insertions(+)
diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig
index d6863b28ddc5..5404d918677f 100644
--- a/drivers/gpu/drm/panel/Kconfig
+++ b/drivers/gpu/drm/panel/Kconfig
@@ -755,6 +755,18 @@ config DRM_PANEL_RENESAS_R61307
This panel controller can be found in LG Optimus Vu P895 smartphone
in combination with LCD panel.
+config DRM_PANEL_RENESAS_R63419
+ tristate "Renesas R63419 dual-DSI video mode panels"
+ depends on OF && GPIOLIB
+ depends on DRM_MIPI_DSI
+ depends on BACKLIGHT_CLASS_DEVICE
+ help
+ Say Y here if you want to enable support for Ayaneo WT0600 and WT0630
+ 1440x2560 60Hz dual-DSI video mode display panels with Renesas
+ R63419 IC.
+
+ These panels are used in Ayaneo handheld gaming devices.
+
config DRM_PANEL_RENESAS_R69328
tristate "Renesas R69328 720x1280 DSI video mode panel"
depends on OF
diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile
index a4291dc3905b..b498ee9b5929 100644
--- a/drivers/gpu/drm/panel/Makefile
+++ b/drivers/gpu/drm/panel/Makefile
@@ -75,6 +75,7 @@ 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_RM69380) += panel-raydium-rm69380.o
obj-$(CONFIG_DRM_PANEL_RENESAS_R61307) += panel-renesas-r61307.o
+obj-$(CONFIG_DRM_PANEL_RENESAS_R63419) += panel-renesas-r63419.o
obj-$(CONFIG_DRM_PANEL_RENESAS_R69328) += panel-renesas-r69328.o
obj-$(CONFIG_DRM_PANEL_RONBO_RB070D30) += panel-ronbo-rb070d30.o
obj-$(CONFIG_DRM_PANEL_SAMSUNG_AMS581VF01) += panel-samsung-ams581vf01.o
diff --git a/drivers/gpu/drm/panel/panel-renesas-r63419.c b/drivers/gpu/drm/panel/panel-renesas-r63419.c
new file mode 100644
index 000000000000..cb4957914241
--- /dev/null
+++ b/drivers/gpu/drm/panel/panel-renesas-r63419.c
@@ -0,0 +1,356 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * DRM driver for Renesas R63419 based dual-DSI video mode panels
+ *
+ * Copyright (c) 2025, Kancy Joe <kancy2333@outlook.com>
+ * Copyright (C) 2026 Linaro Limited
+ * Author: Neil Armstrong <neil.armstrong@linaro.org>
+ */
+
+#include <linux/backlight.h>
+#include <linux/delay.h>
+#include <linux/gpio/consumer.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_graph.h>
+#include <linux/regulator/consumer.h>
+
+#include <video/mipi_display.h>
+
+#include <drm/drm_connector.h>
+#include <drm/drm_mipi_dsi.h>
+#include <drm/drm_modes.h>
+#include <drm/drm_panel.h>
+#include <drm/drm_probe_helper.h>
+
+struct renesas_r63419_panel {
+ struct drm_panel panel;
+ struct mipi_dsi_device *dsi[2];
+ const struct panel_desc *desc;
+
+ struct gpio_desc *reset_gpio;
+ struct regulator_bulk_data *vdd_supplies;
+ struct regulator_bulk_data *vcc_supplies;
+ enum drm_panel_orientation orientation;
+};
+
+/* VDDIO/VDD Supplies */
+static const struct regulator_bulk_data renesas_r63419_vdd_supplies[] = {
+ { .supply = "vddio" },
+ { .supply = "vdd" },
+};
+
+/* VSP/VSN/VCI Supplies */
+static const struct regulator_bulk_data renesas_r63419_vcc_supplies[] = {
+ { .supply = "vsp" },
+ { .supply = "vsn" },
+ { .supply = "vci" },
+};
+
+struct panel_desc {
+ const struct drm_display_mode *mode;
+ unsigned int lanes;
+ unsigned long mode_flags;
+ enum mipi_dsi_pixel_format format;
+ u16 height_mm;
+ u16 width_mm;
+ const struct mipi_dsi_device_info dsi_info;
+};
+
+static const struct drm_display_mode wt0600_mode = {
+ /* Dual dsi */
+ .clock = 2 * (720 + 100 + 8 + 40) * (2560 + 15 + 2 + 8) * 60 / 1000,
+ .hdisplay = 2 * 720,
+ .hsync_start = 2 * (720 + 100),
+ .hsync_end = 2 * (720 + 100 + 8),
+ .htotal = 2 * (720 + 100 + 8 + 40),
+ .vdisplay = 2560,
+ .vsync_start = 2560 + 15,
+ .vsync_end = 2560 + 15 + 2,
+ .vtotal = 2560 + 15 + 2 + 8,
+ .type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,
+};
+
+static struct panel_desc wt0600_desc = {
+ .lanes = 4,
+ .width_mm = 74,
+ .height_mm = 131,
+ .mode = &wt0600_mode,
+ .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
+ MIPI_DSI_CLOCK_NON_CONTINUOUS | MIPI_DSI_MODE_LPM,
+ .format = MIPI_DSI_FMT_RGB888,
+ .dsi_info = {
+ .type = "wt0600-2k",
+ .channel = 0,
+ .node = NULL,
+ },
+};
+
+static struct panel_desc wt0630_desc = {
+ .lanes = 4,
+ .width_mm = 78,
+ .height_mm = 140,
+ .mode = &wt0600_mode, /* wt0600 only has different screen size */
+ .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
+ MIPI_DSI_CLOCK_NON_CONTINUOUS | MIPI_DSI_MODE_LPM,
+ .format = MIPI_DSI_FMT_RGB888,
+ .dsi_info = {
+ .type = "wt0630-2k",
+ .channel = 0,
+ .node = NULL,
+ },
+};
+
+static inline struct renesas_r63419_panel *
+to_renesas_r63419_panel(struct drm_panel *panel)
+{
+ return container_of(panel, struct renesas_r63419_panel, panel);
+}
+
+static int renesas_r63419_on(struct renesas_r63419_panel *ctx)
+{
+ struct mipi_dsi_multi_context dsi_ctx = { .dsi = ctx->dsi[0] };
+ struct mipi_dsi_multi_context dsi_ctx1 = { .dsi = ctx->dsi[1] };
+
+ mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
+ mipi_dsi_dcs_set_display_on_multi(&dsi_ctx1);
+ mipi_dsi_msleep(&dsi_ctx, 150);
+
+ mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
+ mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx1);
+ mipi_dsi_msleep(&dsi_ctx, 50);
+
+ return dsi_ctx.accum_err;
+}
+
+static int renesas_r63419_disable(struct drm_panel *panel)
+{
+ struct renesas_r63419_panel *ctx = to_renesas_r63419_panel(panel);
+ struct mipi_dsi_multi_context dsi_ctx = { .dsi = ctx->dsi[0] };
+ struct mipi_dsi_multi_context dsi_ctx1 = { .dsi = ctx->dsi[1] };
+
+ mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
+ mipi_dsi_dcs_set_display_off_multi(&dsi_ctx1);
+ mipi_dsi_msleep(&dsi_ctx, 50);
+
+ mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
+ mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx1);
+ mipi_dsi_msleep(&dsi_ctx, 120);
+
+ return dsi_ctx.accum_err;
+}
+
+static int renesas_r63419_prepare(struct drm_panel *panel)
+{
+ struct renesas_r63419_panel *ctx = to_renesas_r63419_panel(panel);
+ int ret;
+
+ ret = regulator_bulk_enable(ARRAY_SIZE(renesas_r63419_vdd_supplies),
+ ctx->vdd_supplies);
+ if (ret < 0)
+ return ret;
+
+ usleep_range(1000, 2000);
+
+ ret = regulator_bulk_enable(ARRAY_SIZE(renesas_r63419_vcc_supplies),
+ ctx->vcc_supplies);
+ if (ret < 0)
+ return ret;
+
+ usleep_range(1000, 2000);
+
+ gpiod_set_value_cansleep(ctx->reset_gpio, 0);
+
+ usleep_range(3000, 4000);
+
+ ret = renesas_r63419_on(ctx);
+ if (ret < 0) {
+ dev_err(panel->dev, "Failed to initialize panel: %d\n", ret);
+ regulator_bulk_disable(ARRAY_SIZE(renesas_r63419_vcc_supplies),
+ ctx->vcc_supplies);
+ regulator_bulk_disable(ARRAY_SIZE(renesas_r63419_vdd_supplies),
+ ctx->vdd_supplies);
+
+ gpiod_set_value_cansleep(ctx->reset_gpio, 1);
+
+ return ret;
+ }
+
+ return 0;
+}
+
+static int renesas_r63419_unprepare(struct drm_panel *panel)
+{
+ struct renesas_r63419_panel *ctx = to_renesas_r63419_panel(panel);
+
+ regulator_bulk_disable(ARRAY_SIZE(renesas_r63419_vcc_supplies), ctx->vcc_supplies);
+ regulator_bulk_disable(ARRAY_SIZE(renesas_r63419_vdd_supplies), ctx->vdd_supplies);
+
+ gpiod_set_value_cansleep(ctx->reset_gpio, 1);
+
+ return 0;
+}
+
+static int renesas_r63419_get_modes(struct drm_panel *panel,
+ struct drm_connector *connector)
+{
+ struct drm_display_mode *mode;
+ struct renesas_r63419_panel *ctx = to_renesas_r63419_panel(panel);
+
+ mode = drm_mode_duplicate(connector->dev, ctx->desc->mode);
+ if (!mode)
+ return -ENOMEM;
+
+ /* Update panel size */
+ mode->width_mm = ctx->desc->width_mm;
+ mode->height_mm = ctx->desc->height_mm;
+
+ drm_mode_set_name(mode);
+ connector->display_info.width_mm = mode->width_mm;
+ connector->display_info.height_mm = mode->height_mm;
+ drm_mode_probed_add(connector, mode);
+
+ return 1;
+}
+
+static enum drm_panel_orientation
+renesas_r63419_get_orientation(struct drm_panel *panel)
+{
+ struct renesas_r63419_panel *ctx = to_renesas_r63419_panel(panel);
+
+ return ctx->orientation;
+}
+
+static const struct drm_panel_funcs renesas_r63419_panel_funcs = {
+ .disable = renesas_r63419_disable,
+ .prepare = renesas_r63419_prepare,
+ .unprepare = renesas_r63419_unprepare,
+ .get_modes = renesas_r63419_get_modes,
+ .get_orientation = renesas_r63419_get_orientation,
+};
+
+static int renesas_r63419_probe(struct mipi_dsi_device *dsi)
+{
+ struct device *dev = &dsi->dev;
+ struct renesas_r63419_panel *ctx;
+ struct device_node *dsi1_node;
+ struct mipi_dsi_host *dsi1_host;
+ int ret, i;
+
+ ctx = devm_drm_panel_alloc(dev, struct renesas_r63419_panel, panel,
+ &renesas_r63419_panel_funcs, DRM_MODE_CONNECTOR_DSI);
+ if (IS_ERR(ctx))
+ return PTR_ERR(ctx);
+
+ ctx->desc = of_device_get_match_data(dev);
+ if (!ctx->desc)
+ return dev_err_probe(dev, -ENODEV,
+ "Failed to get panel description\n");
+
+ ret = devm_regulator_bulk_get_const(&dsi->dev,
+ ARRAY_SIZE(renesas_r63419_vdd_supplies),
+ renesas_r63419_vdd_supplies, &ctx->vdd_supplies);
+ if (ret < 0)
+ return ret;
+
+ ret = devm_regulator_bulk_get_const(&dsi->dev,
+ ARRAY_SIZE(renesas_r63419_vcc_supplies),
+ renesas_r63419_vcc_supplies, &ctx->vcc_supplies);
+ if (ret < 0)
+ return ret;
+
+ ctx->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
+ if (IS_ERR(ctx->reset_gpio))
+ return dev_err_probe(dev, PTR_ERR(ctx->reset_gpio),
+ "Failed to get reset gpio\n");
+
+ /* Get second DSI host */
+ dsi1_node = of_graph_get_remote_node(dsi->dev.of_node, 1, -1);
+ if (!dsi1_node)
+ return dev_err_probe(dev, -ENODEV,
+ "Failed to get remote node for second DSI\n");
+
+ dsi1_host = of_find_mipi_dsi_host_by_node(dsi1_node);
+ of_node_put(dsi1_node);
+ if (!dsi1_host)
+ return dev_err_probe(dev, -EPROBE_DEFER,
+ "Failed to find second DSI host\n");
+
+ /* Register the second DSI device */
+ ctx->dsi[1] = devm_mipi_dsi_device_register_full(dev, dsi1_host,
+ &ctx->desc->dsi_info);
+ if (IS_ERR(ctx->dsi[1]))
+ return dev_err_probe(dev, PTR_ERR(ctx->dsi[1]),
+ "Failed to register second DSI device\n");
+
+ ctx->dsi[0] = dsi;
+ mipi_dsi_set_drvdata(dsi, ctx);
+
+ /* Get panel orientation */
+ ret = of_drm_get_panel_orientation(dev->of_node, &ctx->orientation);
+ if (ret < 0 && ret != -ENODEV)
+ return dev_err_probe(dev, ret,
+ "Failed to get panel orientation\n");
+
+ ctx->panel.prepare_prev_first = true;
+
+ ret = drm_panel_of_backlight(&ctx->panel);
+ if (ret)
+ return dev_err_probe(dev, ret, "Failed to get backlight\n");
+
+ drm_panel_add(&ctx->panel);
+
+ /* Configure and attach both DSI devices */
+ for (i = 0; i < ARRAY_SIZE(ctx->dsi); i++) {
+ ctx->dsi[i]->lanes = ctx->desc->lanes;
+ ctx->dsi[i]->format = ctx->desc->format;
+ ctx->dsi[i]->mode_flags = ctx->desc->mode_flags;
+
+ ret = mipi_dsi_attach(ctx->dsi[i]);
+ if (ret < 0) {
+ drm_panel_remove(&ctx->panel);
+ return dev_err_probe(dev, ret,
+ "Failed to attach DSI device %d\n", i);
+ }
+ }
+
+ return 0;
+}
+
+static void renesas_r63419_remove(struct mipi_dsi_device *dsi)
+{
+ struct renesas_r63419_panel *ctx = mipi_dsi_get_drvdata(dsi);
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(ctx->dsi); i++)
+ mipi_dsi_detach(ctx->dsi[i]);
+
+ drm_panel_remove(&ctx->panel);
+}
+
+static const struct of_device_id renesas_r63419_of_match[] = {
+ {
+ .compatible = "ayaneo,wt0600-2k",
+ .data = &wt0600_desc,
+ },
+ {
+ .compatible = "ayaneo,wt0630-2k",
+ .data = &wt0630_desc,
+ },
+ {}
+};
+MODULE_DEVICE_TABLE(of, renesas_r63419_of_match);
+
+static struct mipi_dsi_driver renesas_r63419_driver = {
+ .probe = renesas_r63419_probe,
+ .remove = renesas_r63419_remove,
+ .driver = {
+ .name = "panel-renesas-r63419",
+ .of_match_table = renesas_r63419_of_match,
+ },
+};
+module_mipi_dsi_driver(renesas_r63419_driver);
+
+MODULE_AUTHOR("Kancy Joe <kancy2333@outlook.com>");
+MODULE_DESCRIPTION("DRM driver for Renesas R63419 based dual-DSI video mode panels");
+MODULE_LICENSE("GPL");
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/2] dt-bindings: regulator: document the Renesas R63419 based dual-DSI video mode Display Panels
2026-04-30 12:22 ` [PATCH v2 1/2] dt-bindings: regulator: document the Renesas " Neil Armstrong
@ 2026-05-03 12:34 ` Krzysztof Kozlowski
2026-05-04 7:00 ` Neil Armstrong
2026-05-05 0:27 ` Claude review: " Claude Code Review Bot
1 sibling, 1 reply; 8+ messages in thread
From: Krzysztof Kozlowski @ 2026-05-03 12:34 UTC (permalink / raw)
To: Neil Armstrong
Cc: Jessica Zhang, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Geert Uytterhoeven,
Magnus Damm, dri-devel, devicetree, linux-kernel,
linux-renesas-soc
On Thu, Apr 30, 2026 at 02:22:17PM +0200, Neil Armstrong wrote:
> Document the Renesas R63419 based dual-DSI video mode Display Panels found
> in the Ayaneo gaming handled devices.
>
> Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
> ---
> .../bindings/display/panel/renesas,r63419.yaml | 93 ++++++++++++++++++++++
> 1 file changed, 93 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/display/panel/renesas,r63419.yaml b/Documentation/devicetree/bindings/display/panel/renesas,r63419.yaml
> new file mode 100644
> index 000000000000..17f166db3ca3
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/display/panel/renesas,r63419.yaml
> @@ -0,0 +1,93 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/display/panel/renesas,r63419.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Renesas R63419 based dual-DSI video mode Display Panel
> +
> +maintainers:
> + - Neil Armstrong <neil.armstrong@linaro.org>
> +
> +description:
> + The Renesas R63419 is a generic DDIC used to control dual-DSI LCD panels.
> +
> +allOf:
> + - $ref: panel-common.yaml#
> +
> +properties:
> + compatible:
> + enum:
> + - ayaneo,wt0600-2k
> + - ayaneo,wt0630-2k
Just like for all other panels (including other Renesas) you should have
fallback to indicate the actual panel IC, even if it is not used by the
driver. Some SW still could fine that fallback usable.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/2] dt-bindings: regulator: document the Renesas R63419 based dual-DSI video mode Display Panels
2026-05-03 12:34 ` Krzysztof Kozlowski
@ 2026-05-04 7:00 ` Neil Armstrong
0 siblings, 0 replies; 8+ messages in thread
From: Neil Armstrong @ 2026-05-04 7:00 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: Jessica Zhang, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Geert Uytterhoeven,
Magnus Damm, dri-devel, devicetree, linux-kernel,
linux-renesas-soc
On 5/3/26 14:34, Krzysztof Kozlowski wrote:
> On Thu, Apr 30, 2026 at 02:22:17PM +0200, Neil Armstrong wrote:
>> Document the Renesas R63419 based dual-DSI video mode Display Panels found
>> in the Ayaneo gaming handled devices.
>>
>> Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
>> ---
>> .../bindings/display/panel/renesas,r63419.yaml | 93 ++++++++++++++++++++++
>> 1 file changed, 93 insertions(+)
>>
>> diff --git a/Documentation/devicetree/bindings/display/panel/renesas,r63419.yaml b/Documentation/devicetree/bindings/display/panel/renesas,r63419.yaml
>> new file mode 100644
>> index 000000000000..17f166db3ca3
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/display/panel/renesas,r63419.yaml
>> @@ -0,0 +1,93 @@
>> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
>> +%YAML 1.2
>> +---
>> +$id: http://devicetree.org/schemas/display/panel/renesas,r63419.yaml#
>> +$schema: http://devicetree.org/meta-schemas/core.yaml#
>> +
>> +title: Renesas R63419 based dual-DSI video mode Display Panel
>> +
>> +maintainers:
>> + - Neil Armstrong <neil.armstrong@linaro.org>
>> +
>> +description:
>> + The Renesas R63419 is a generic DDIC used to control dual-DSI LCD panels.
>> +
>> +allOf:
>> + - $ref: panel-common.yaml#
>> +
>> +properties:
>> + compatible:
>> + enum:
>> + - ayaneo,wt0600-2k
>> + - ayaneo,wt0630-2k
>
> Just like for all other panels (including other Renesas) you should have
> fallback to indicate the actual panel IC, even if it is not used by the
> driver. Some SW still could fine that fallback usable.
Ack
Thanks,
Neil
>
> Best regards,
> Krzysztof
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Claude review: drm: panel: support the R63419 based dual-DSI video mode Display Panels
2026-04-30 12:22 [PATCH v2 0/2] drm: panel: support the R63419 based dual-DSI video mode Display Panels Neil Armstrong
2026-04-30 12:22 ` [PATCH v2 1/2] dt-bindings: regulator: document the Renesas " Neil Armstrong
2026-04-30 12:22 ` [PATCH v2 2/2] drm: panel: add support for " Neil Armstrong
@ 2026-05-05 0:27 ` Claude Code Review Bot
2 siblings, 0 replies; 8+ messages in thread
From: Claude Code Review Bot @ 2026-05-05 0:27 UTC (permalink / raw)
To: dri-devel-reviews
Overall Series Review
Subject: drm: panel: support the R63419 based dual-DSI video mode Display Panels
Author: Neil Armstrong <neil.armstrong@linaro.org>
Patches: 5
Reviewed: 2026-05-05T10:27:00.422343
---
This is a 2-patch series adding a new dual-DSI panel driver for the Renesas R63419 DDIC, used in Ayaneo handheld gaming devices. The series adds a DT binding (patch 1) and the panel driver (patch 2). The structure follows established dual-DSI panel driver patterns in the kernel (similar to `panel-sharp-lq079l1sx01.c` and `panel-himax-hx83121a.c`), and uses modern APIs like `devm_drm_panel_alloc` and `devm_regulator_bulk_get_const`.
However, there are several issues ranging from a critical MIPI DCS spec violation (incorrect command ordering) to cleanup path bugs and binding concerns.
**Key issues:**
1. **MIPI DCS command ordering is reversed** — `SET_DISPLAY_ON` is sent before `EXIT_SLEEP_MODE`, violating the MIPI DCS spec.
2. **Second DSI context errors are silently dropped** in both enable and disable paths.
3. **Should use `devm_mipi_dsi_attach()`** — the manual `mipi_dsi_attach()` has an incomplete cleanup path.
4. **DT binding subject line says "regulator"** instead of "display".
5. **DT binding should reference `panel-common-dual.yaml#`** for proper dual-DSI port schema validation.
---
---
Generated by Claude Code Patch Reviewer
^ permalink raw reply [flat|nested] 8+ messages in thread
* Claude review: dt-bindings: regulator: document the Renesas R63419 based dual-DSI video mode Display Panels
2026-04-30 12:22 ` [PATCH v2 1/2] dt-bindings: regulator: document the Renesas " Neil Armstrong
2026-05-03 12:34 ` Krzysztof Kozlowski
@ 2026-05-05 0:27 ` Claude Code Review Bot
1 sibling, 0 replies; 8+ messages in thread
From: Claude Code Review Bot @ 2026-05-05 0:27 UTC (permalink / raw)
To: dri-devel-reviews
Patch Review
**Subject line error:** The subject says `dt-bindings: regulator:` but this is a display panel binding, not a regulator binding. It should be `dt-bindings: display: panel:` to match the file path and convention.
**Should reference `panel-common-dual.yaml`:** The binding currently does:
```yaml
allOf:
- $ref: panel-common.yaml#
```
Since this is a dual-DSI panel with `ports` containing `port@0` and `port@1`, it should reference `panel-common-dual.yaml#` instead, as other dual-DSI panel bindings do (e.g., `himax,hx83121a.yaml`, `novatek,nt35950.yaml`). This provides proper schema validation for the dual-port structure.
**Supply descriptions missing:** The supplies (`vdd-supply`, `vddio-supply`, etc.) are declared as `true` without descriptions. Other bindings (e.g., `himax,hx83121a.yaml`) add brief description strings explaining what each supply powers. Not strictly required but improves documentation quality.
**Minor:** The example has `vsn-supply` and `vsp-supply` listed in a different order than the property definitions (the properties list `vsp` before `vsn`, but the example swaps them). This is cosmetically inconsistent but functionally fine.
Otherwise the binding structure looks correct — compatibles, supplies, required properties, and the dual-port example all look reasonable.
---
---
Generated by Claude Code Patch Reviewer
^ permalink raw reply [flat|nested] 8+ messages in thread
* Claude review: drm: panel: add support for the Renesas R63419 based dual-DSI video mode Display Panels
2026-04-30 12:22 ` [PATCH v2 2/2] drm: panel: add support for " Neil Armstrong
@ 2026-05-05 0:27 ` Claude Code Review Bot
0 siblings, 0 replies; 8+ messages in thread
From: Claude Code Review Bot @ 2026-05-05 0:27 UTC (permalink / raw)
To: dri-devel-reviews
Patch Review
**Signed-off-by order:** The patch has `From: KancyJoe` indicating KancyJoe is the author, but the Signed-off-by chain is:
```
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: KancyJoe <kancy2333@outlook.com>
```
Per kernel conventions, the author's Signed-off-by should come first in the chain. This should be:
```
Signed-off-by: KancyJoe <kancy2333@outlook.com>
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
```
**Critical: MIPI DCS command ordering is wrong in `renesas_r63419_on()`:**
```c
mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
mipi_dsi_dcs_set_display_on_multi(&dsi_ctx1);
mipi_dsi_msleep(&dsi_ctx, 150);
mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx1);
mipi_dsi_msleep(&dsi_ctx, 50);
```
The MIPI DCS specification requires `EXIT_SLEEP_MODE` **first**, followed by a delay (typically 120ms), then `SET_DISPLAY_ON`. Every other panel driver in the kernel tree follows this order. This is reversed here and will likely cause initialization failures or display corruption. The correct sequence would be:
```c
mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx1);
mipi_dsi_msleep(&dsi_ctx, 120);
mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
mipi_dsi_dcs_set_display_on_multi(&dsi_ctx1);
```
**Second DSI context error never checked:** In `renesas_r63419_on()`, two separate `mipi_dsi_multi_context` structs are used (`dsi_ctx` and `dsi_ctx1`), but only `dsi_ctx.accum_err` is returned. Errors on the second DSI link (`dsi_ctx1.accum_err`) are silently discarded. The same issue exists in `renesas_r63419_disable()`:
```c
return dsi_ctx.accum_err;
```
This should also check `dsi_ctx1.accum_err`, e.g.:
```c
return dsi_ctx.accum_err ?: dsi_ctx1.accum_err;
```
Alternatively, look at how `panel-sharp-lq079l1sx01.c` handles this — it uses a single context and helper functions that send to both DSI links in one call via `mipi_dsi_dual_dcs_write_seq_multi()`.
**Should use `devm_mipi_dsi_attach()` instead of `mipi_dsi_attach()`:** The probe function uses manual `mipi_dsi_attach()`:
```c
ret = mipi_dsi_attach(ctx->dsi[i]);
if (ret < 0) {
drm_panel_remove(&ctx->panel);
return dev_err_probe(dev, ret,
"Failed to attach DSI device %d\n", i);
}
```
If the second DSI attach (`i=1`) fails, the first DSI (`i=0`) was already attached but is never detached. Using `devm_mipi_dsi_attach()` (as `panel-sharp-lq079l1sx01.c` does) would handle cleanup automatically. With `devm_mipi_dsi_attach()`, the `remove` callback would also simplify to just `drm_panel_remove()`, since detach is handled by devres.
**Panel descriptors should be `const`:**
```c
static struct panel_desc wt0600_desc = {
...
static struct panel_desc wt0630_desc = {
```
These are never modified and should be `static const struct panel_desc`. The `desc` member pointer in the panel struct is already `const struct panel_desc *desc`, so the types are compatible.
**Unprepare reset/power ordering:** In `renesas_r63419_unprepare()`, the reset GPIO is asserted *after* disabling regulators:
```c
regulator_bulk_disable(..., ctx->vcc_supplies);
regulator_bulk_disable(..., ctx->vdd_supplies);
gpiod_set_value_cansleep(ctx->reset_gpio, 1);
```
The typical and safer convention (followed by most panel drivers) is to assert reset *before* cutting power, to ensure the panel IC enters a known state while it still has power. The prepare error path does the same thing — disables regulators first, then asserts reset. Consider reversing to: assert reset, then disable VCC, then disable VDD.
**Missing `#include` for `of_graph.h` may not be needed:** The driver includes `<linux/of_graph.h>` for `of_graph_get_remote_node()`. This is fine, but worth noting that some newer drivers use different patterns. Not a blocker.
**`width_mm`/`height_mm` set on mode struct:** In `renesas_r63419_get_modes()`:
```c
mode->width_mm = ctx->desc->width_mm;
mode->height_mm = ctx->desc->height_mm;
```
While these fields still exist in `struct drm_display_mode`, the canonical location is `connector->display_info.width_mm/height_mm` (which this driver also sets, so the mode fields are redundant). Minor nit.
**Otherwise well-structured:** The driver follows established patterns — `devm_drm_panel_alloc`, `devm_regulator_bulk_get_const`, `devm_mipi_dsi_device_register_full`, proper Kconfig dependencies, alphabetical Makefile ordering, and correct `prepare_prev_first = true` for dual-DSI. The mode clock computation is correctly doubled for the dual-DSI configuration.
---
Generated by Claude Code Patch Reviewer
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-05-05 0:27 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-30 12:22 [PATCH v2 0/2] drm: panel: support the R63419 based dual-DSI video mode Display Panels Neil Armstrong
2026-04-30 12:22 ` [PATCH v2 1/2] dt-bindings: regulator: document the Renesas " Neil Armstrong
2026-05-03 12:34 ` Krzysztof Kozlowski
2026-05-04 7:00 ` Neil Armstrong
2026-05-05 0:27 ` Claude review: " Claude Code Review Bot
2026-04-30 12:22 ` [PATCH v2 2/2] drm: panel: add support for " Neil Armstrong
2026-05-05 0:27 ` Claude review: " Claude Code Review Bot
2026-05-05 0:27 ` Claude review: drm: panel: support the " Claude Code Review Bot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox