* Claude review: drm: panel: add support for the Renesas R63419 based dual-DSI video mode Display Panels
2026-05-04 8:02 ` [PATCH v3 2/2] drm: panel: add support for the Renesas " Neil Armstrong
@ 2026-05-04 22:29 ` Claude Code Review Bot
0 siblings, 0 replies; 10+ messages in thread
From: Claude Code Review Bot @ 2026-05-04 22:29 UTC (permalink / raw)
To: dri-devel-reviews
Patch Review
**Issue (medium): Reversed display-on / exit-sleep-mode order in `renesas_r63419_on()`**
```c
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);
```
The standard MIPI DCS sequence is exit-sleep-mode first, wait ~120ms, then display-on. The JDI dual-DSI driver (`panel-jdi-lpm102a188a.c`) confirms this ordering at lines 223-234 with an explicit comment: *"We need to wait 150ms between mipi_dsi_dcs_exit_sleep_mode_multi() and mipi_dsi_dcs_set_display_on_multi()."*
If the R63419 genuinely requires this reversed order, a comment explaining the deviation would be valuable. Otherwise this looks like a bug.
**Issue (medium): Second DSI link errors silently dropped**
Both `renesas_r63419_on()` and `renesas_r63419_disable()` use two separate `mipi_dsi_multi_context` structs but only return `dsi_ctx.accum_err`:
```c
mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
mipi_dsi_dcs_set_display_on_multi(&dsi_ctx1);
...
return dsi_ctx.accum_err;
```
Errors from operations on `dsi_ctx1` (the second DSI link) are never checked. The kernel provides the `mipi_dsi_dual()` macro (see `include/drm/drm_mipi_dsi.h:486`) that uses a single context and swaps the `.dsi` pointer between calls, ensuring `accum_err` captures failures from both links. Consider using it:
```c
mipi_dsi_dual(mipi_dsi_dcs_set_display_on_multi,
&dsi_ctx, ctx->dsi[0], ctx->dsi[1]);
```
**Issue (minor): `wt0600_desc` and `wt0630_desc` should be `const`**
```c
static struct panel_desc wt0600_desc = {
```
These are used as read-only match data via `of_device_get_match_data()` and are never modified. Other panel drivers (e.g., `panel-boe-tv101wum-nl6.c`) declare equivalent structs as `static const`. Mark these `const`.
**Nit: Misleading comment on `wt0630_desc`**
```c
.mode = &wt0600_mode, /* wt0600 only has different screen size */
```
This reads as "wt0600 only differs in screen size" but should say "wt0630 only has different physical size" since the comment is on the wt0630 descriptor.
**Observation: `prepare` error path vs. `unprepare` ordering**
In `renesas_r63419_prepare()`, the error cleanup path does:
```c
regulator_bulk_disable(...vcc_supplies);
regulator_bulk_disable(...vdd_supplies);
gpiod_set_value_cansleep(ctx->reset_gpio, 1);
```
While `renesas_r63419_unprepare()` does the same order. This is fine functionally, but the convention in many panel drivers is to assert reset before disabling regulators (reverse of the power-on sequence). Not a correctness issue, just a style observation.
---
Generated by Claude Code Patch Reviewer
^ permalink raw reply [flat|nested] 10+ 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 the Renesas " Neil Armstrong
@ 2026-05-05 0:27 ` Claude Code Review Bot
0 siblings, 0 replies; 10+ 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] 10+ messages in thread
* [PATCH v5 0/2] drm: panel: support the R63419 based dual-DSI video mode Display Panels
@ 2026-05-21 8:14 Neil Armstrong
2026-05-21 8:14 ` [PATCH v5 1/2] dt-bindings: display: panel: document the Renesas " Neil Armstrong
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Neil Armstrong @ 2026-05-21 8:14 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,
Dmitry Baryshkov, 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 v5:
- Import panel-common-dual.yaml in bindings
- Set reg as required
- fix bindings example typo
- Add helper to switch link in order to use single dsi_ctx to properly handle errors
- Disable vdd supplies if vcc supplied fail to enable
- Precise the power off sequence is recommended by the vendor spec
- Drop passing of node to second dsi to avoid re-probing the driver twice
- Link to v4: https://patch.msgid.link/20260519-topic-sm8650-ayaneo-pocket-s2-r63419-v4-0-b8929af5e951@linaro.org
Changes in v4:
- Moved height/width in the drm_mode, duplicated modes to use drm_connector_helper_get_modes_fixed
- Create dsi_info on the stack with proper OF node and name passed
- Switched to devm_drm_panel_add/devm_mipi_dsi_attach & dropped remove
- Link to v3: https://patch.msgid.link/20260504-topic-sm8650-ayaneo-pocket-s2-r63419-v3-0-9f61cf24aebf@linaro.org
Changes in v3:
- Added DDIC compatible as fallback
- Added rotation in bindings example
- Fixed bindings subject
- Added second MODULE_AUTHOR entry and re-ordered signed-off-by order
- Link to v2: https://patch.msgid.link/20260430-topic-sm8650-ayaneo-pocket-s2-r63419-v2-0-91ac10453d0c@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: display: panel: document the Renesas R63419 based dual-DSI video mode Display Panels
.../bindings/display/panel/renesas,r63419.yaml | 98 ++++++
drivers/gpu/drm/panel/Kconfig | 12 +
drivers/gpu/drm/panel/Makefile | 1 +
drivers/gpu/drm/panel/panel-renesas-r63419.c | 364 +++++++++++++++++++++
4 files changed, 475 insertions(+)
---
base-commit: e98d21c170b01ddef366f023bbfcf6b31509fa83
change-id: 20260428-topic-sm8650-ayaneo-pocket-s2-r63419-e72467e2db0f
Best regards,
--
Neil Armstrong <neil.armstrong@linaro.org>
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v5 1/2] dt-bindings: display: panel: document the Renesas R63419 based dual-DSI video mode Display Panels
2026-05-21 8:14 [PATCH v5 0/2] drm: panel: support the R63419 based dual-DSI video mode Display Panels Neil Armstrong
@ 2026-05-21 8:14 ` Neil Armstrong
2026-05-21 19:55 ` Conor Dooley
2026-05-25 10:36 ` Claude review: " Claude Code Review Bot
2026-05-21 8:14 ` [PATCH v5 2/2] drm: panel: add support for " Neil Armstrong
2026-05-25 10:36 ` Claude review: drm: panel: support the " Claude Code Review Bot
2 siblings, 2 replies; 10+ messages in thread
From: Neil Armstrong @ 2026-05-21 8:14 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,
Dmitry Baryshkov, 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 | 98 ++++++++++++++++++++++
1 file changed, 98 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..adfdd2c300a3
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/panel/renesas,r63419.yaml
@@ -0,0 +1,98 @@
+# 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-dual.yaml#
+
+properties:
+ compatible:
+ items:
+ - enum:
+ - ayaneo,wt0600-2k
+ - ayaneo,wt0630-2k
+ - const: renesas,r63419
+
+ 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
+ - reg
+ - 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", "renesas,r63419";
+ reg = <0>;
+
+ reset-gpios = <&gpio 176 GPIO_ACTIVE_LOW>;
+
+ vdd-supply = <&vdd_3v0_lcd>;
+ vddio-supply = <&vdd_1v8_io>;
+ vsn-supply = <&vdd_5v0_neg>;
+ vsp-supply = <&vdd_5v0_pos>;
+ vci-supply = <&vdd_3v0_vci>;
+
+ backlight = <&backlight>;
+
+ rotation = <90>;
+
+ 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] 10+ messages in thread
* [PATCH v5 2/2] drm: panel: add support for the Renesas R63419 based dual-DSI video mode Display Panels
2026-05-21 8:14 [PATCH v5 0/2] drm: panel: support the R63419 based dual-DSI video mode Display Panels Neil Armstrong
2026-05-21 8:14 ` [PATCH v5 1/2] dt-bindings: display: panel: document the Renesas " Neil Armstrong
@ 2026-05-21 8:14 ` Neil Armstrong
2026-05-25 10:36 ` Claude review: " Claude Code Review Bot
2026-05-25 10:36 ` Claude review: drm: panel: support the " Claude Code Review Bot
2 siblings, 1 reply; 10+ messages in thread
From: Neil Armstrong @ 2026-05-21 8:14 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,
Dmitry Baryshkov, 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: KancyJoe <kancy2333@outlook.com>
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
---
drivers/gpu/drm/panel/Kconfig | 12 +
drivers/gpu/drm/panel/Makefile | 1 +
drivers/gpu/drm/panel/panel-renesas-r63419.c | 364 +++++++++++++++++++++++++++
3 files changed, 377 insertions(+)
diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig
index 7450b27622a2..7295246cfa58 100644
--- a/drivers/gpu/drm/panel/Kconfig
+++ b/drivers/gpu/drm/panel/Kconfig
@@ -796,6 +796,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 c2c5cf817116..be9a6f3c9743 100644
--- a/drivers/gpu/drm/panel/Makefile
+++ b/drivers/gpu/drm/panel/Makefile
@@ -78,6 +78,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..fe62b3bfba63
--- /dev/null
+++ b/drivers/gpu/drm/panel/panel-renesas-r63419.c
@@ -0,0 +1,364 @@
+// 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;
+ 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,
+ .width_mm = 74,
+ .height_mm = 131,
+};
+
+static const struct drm_display_mode wt0630_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,
+ .width_mm = 78,
+ .height_mm = 140,
+};
+
+static struct panel_desc wt0600_desc = {
+ .lanes = 4,
+ .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,
+};
+
+static struct panel_desc wt0630_desc = {
+ .lanes = 4,
+ .mode = &wt0630_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,
+};
+
+static inline struct renesas_r63419_panel *
+to_renesas_r63419_panel(struct drm_panel *panel)
+{
+ return container_of(panel, struct renesas_r63419_panel, panel);
+}
+
+/*
+ * Helper to switch between DSI links, so we share a single dsi_ctx
+ * for both links, so in case of an error all writes & sleep for
+ * both links are ignored.
+ */
+static inline void dsi_link_switch(struct renesas_r63419_panel *ctx,
+ struct mipi_dsi_multi_context *dsi_ctx,
+ unsigned int link)
+{
+ dsi_ctx->dsi = ctx->dsi[link];
+}
+
+static int renesas_r63419_on(struct renesas_r63419_panel *ctx)
+{
+ struct mipi_dsi_multi_context dsi_ctx;
+
+ dsi_link_switch(ctx, &dsi_ctx, 0);
+ mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
+ dsi_link_switch(ctx, &dsi_ctx, 1);
+ mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
+ mipi_dsi_msleep(&dsi_ctx, 150);
+
+ dsi_link_switch(ctx, &dsi_ctx, 0);
+ mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
+ dsi_link_switch(ctx, &dsi_ctx, 1);
+ mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
+ 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_link_switch(ctx, &dsi_ctx, 0);
+ mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
+ dsi_link_switch(ctx, &dsi_ctx, 1);
+ mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
+ mipi_dsi_msleep(&dsi_ctx, 50);
+
+ dsi_link_switch(ctx, &dsi_ctx, 0);
+ mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
+ dsi_link_switch(ctx, &dsi_ctx, 1);
+ mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
+ 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) {
+ regulator_bulk_disable(ARRAY_SIZE(renesas_r63419_vdd_supplies),
+ ctx->vdd_supplies);
+ 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);
+
+ /* Power off sequence from the r63419 datasheet */
+ 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);
+
+ /* Power off sequence from the r63419 datasheet */
+ 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 renesas_r63419_panel *ctx = to_renesas_r63419_panel(panel);
+ const struct drm_display_mode *mode = ctx->desc->mode;
+
+ drm_connector_set_panel_orientation(connector, ctx->orientation);
+
+ return drm_connector_helper_get_modes_fixed(connector, mode);
+}
+
+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 mipi_dsi_device_info info = { };
+ 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");
+
+ /* Copy current DSI info, do not provide OF node since no driver needs to be attached */
+ strscpy(info.type, dsi->name, sizeof(info.type));
+ info.channel = dsi->channel;
+
+ /* Register the second DSI device */
+ ctx->dsi[1] = devm_mipi_dsi_device_register_full(dev, dsi1_host, &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");
+
+ ret = devm_drm_panel_add(dev, &ctx->panel);
+ if (ret)
+ return dev_err_probe(dev, ret, "Failed to add panel\n");
+
+ /* 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 = devm_mipi_dsi_attach(dev, ctx->dsi[i]);
+ if (ret < 0)
+ return dev_err_probe(dev, ret,
+ "Failed to attach DSI device %d\n", i);
+ }
+
+ return 0;
+}
+
+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,
+ .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_AUTHOR("Neil Armstrong <neil.armstrong@linaro.org>");
+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] 10+ messages in thread
* Re: [PATCH v5 1/2] dt-bindings: display: panel: document the Renesas R63419 based dual-DSI video mode Display Panels
2026-05-21 8:14 ` [PATCH v5 1/2] dt-bindings: display: panel: document the Renesas " Neil Armstrong
@ 2026-05-21 19:55 ` Conor Dooley
2026-05-25 10:36 ` Claude review: " Claude Code Review Bot
1 sibling, 0 replies; 10+ messages in thread
From: Conor Dooley @ 2026-05-21 19:55 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, Dmitry Baryshkov
[-- Attachment #1: Type: text/plain, Size: 75 bytes --]
Acked-by: Conor Dooley <conor.dooley@microchip.com>
pw-bot: not-applicable
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Claude review: drm: panel: add support for the Renesas R63419 based dual-DSI video mode Display Panels
2026-05-22 12:51 ` [PATCH v6 2/2] drm: panel: add support for the Renesas " Neil Armstrong
@ 2026-05-25 8:37 ` Claude Code Review Bot
0 siblings, 0 replies; 10+ messages in thread
From: Claude Code Review Bot @ 2026-05-25 8:37 UTC (permalink / raw)
To: dri-devel-reviews
Patch Review
**Overall: Good, minor issues only.**
**Issue 1 (minor): `wt0600_desc` and `wt0630_desc` should be `const`**
```c
static struct panel_desc wt0600_desc = {
```
```c
static struct panel_desc wt0630_desc = {
```
These are only ever read via `of_device_get_match_data()` and never modified. Every other panel driver in the tree declares its descriptor structs as `static const`. These should be:
```c
static const struct panel_desc wt0600_desc = {
```
**Issue 2 (minor): Dead `dsi_info` field in `struct panel_desc`**
```c
struct panel_desc {
const struct drm_display_mode *mode;
unsigned int lanes;
unsigned long mode_flags;
enum mipi_dsi_pixel_format format;
const struct mipi_dsi_device_info dsi_info;
};
```
The `dsi_info` field is declared in the struct but never initialized in either `wt0600_desc` or `wt0630_desc`, and never referenced anywhere. The probe function creates its own `struct mipi_dsi_device_info info = { }` on the stack instead. This appears to be a leftover from an earlier revision. It should be removed.
**Issue 3 (observation, not a bug): Display-on before exit-sleep ordering**
```c
static int renesas_r63419_on(struct renesas_r63419_panel *ctx)
{
struct mipi_dsi_multi_context dsi_ctx = { 0 };
dsi_link_switch(ctx, &dsi_ctx, 0);
mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
dsi_link_switch(ctx, &dsi_ctx, 1);
mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
mipi_dsi_msleep(&dsi_ctx, 150);
dsi_link_switch(ctx, &dsi_ctx, 0);
mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
dsi_link_switch(ctx, &dsi_ctx, 1);
mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
mipi_dsi_msleep(&dsi_ctx, 50);
return dsi_ctx.accum_err;
}
```
This sends `SET_DISPLAY_ON` before `EXIT_SLEEP_MODE`, which is the opposite of the typical MIPI DCS sequence (where the panel is brought out of sleep first, then display is enabled). If this is what the R63419 vendor spec requires, it's fine — but it's worth a double-check since it's unusual. Most panel drivers do `exit_sleep → delay → display_on`.
**No other issues.** The rest of the driver is solid:
- The `dsi_link_switch` helper pattern for sharing a single `mipi_dsi_multi_context` across both DSI links is a clean approach for error accumulation.
- Regulator error handling in `renesas_r63419_prepare()` correctly disables VDD supplies when VCC enable fails.
- The power-off sequence in `unprepare` correctly reverses the power-on order (VCC then VDD).
- Reset GPIO polarity (`GPIOD_OUT_HIGH` → active/asserted at probe, deasserted with `0` in prepare) is correct for active-low reset.
- Use of `devm_regulator_bulk_get_const()` with separate VDD and VCC arrays matches the need for sequenced power-on.
- `prepare_prev_first = true` is appropriate for DSI panels that need the host initialized before the panel.
- All devm APIs are used correctly, making a `remove` function unnecessary.
---
Generated by Claude Code Patch Reviewer
^ permalink raw reply [flat|nested] 10+ messages in thread
* Claude review: drm: panel: support the R63419 based dual-DSI video mode Display Panels
2026-05-21 8:14 [PATCH v5 0/2] drm: panel: support the R63419 based dual-DSI video mode Display Panels Neil Armstrong
2026-05-21 8:14 ` [PATCH v5 1/2] dt-bindings: display: panel: document the Renesas " Neil Armstrong
2026-05-21 8:14 ` [PATCH v5 2/2] drm: panel: add support for " Neil Armstrong
@ 2026-05-25 10:36 ` Claude Code Review Bot
2 siblings, 0 replies; 10+ messages in thread
From: Claude Code Review Bot @ 2026-05-25 10:36 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: 4
Reviewed: 2026-05-25T20:36:17.259091
---
This is a clean, well-structured v5 series adding support for Renesas R63419 based dual-DSI panels used in Ayaneo gaming handhelds. The DT binding is straightforward and properly references `panel-common-dual.yaml`. The driver follows modern patterns (`devm_drm_panel_alloc`, `devm_mipi_dsi_attach`, `devm_drm_panel_add`, `mipi_dsi_multi_context`). The cover letter shows good iteration addressing reviewer feedback over 5 revisions.
There is **one real bug** (uninitialized `accum_err`), one const-correctness issue, and a few minor observations.
---
---
Generated by Claude Code Patch Reviewer
^ permalink raw reply [flat|nested] 10+ messages in thread
* Claude review: dt-bindings: display: panel: document the Renesas R63419 based dual-DSI video mode Display Panels
2026-05-21 8:14 ` [PATCH v5 1/2] dt-bindings: display: panel: document the Renesas " Neil Armstrong
2026-05-21 19:55 ` Conor Dooley
@ 2026-05-25 10:36 ` Claude Code Review Bot
1 sibling, 0 replies; 10+ messages in thread
From: Claude Code Review Bot @ 2026-05-25 10:36 UTC (permalink / raw)
To: dri-devel-reviews
Patch Review
This binding looks correct and complete.
- Properly references `panel-common-dual.yaml` for the dual-DSI port pattern.
- Compatible strings follow the `<vendor>,<model>` + `<ddic-vendor>,<ddic>` fallback convention.
- All five supplies, reset-gpios, backlight, and ports are required, which matches the driver.
- The example includes `rotation = <90>` which is appropriate for a handheld gaming device with a portrait panel used in landscape orientation.
- `reg` is listed as required, matching v5 changelog.
No issues found with this patch.
---
---
Generated by Claude Code Patch Reviewer
^ permalink raw reply [flat|nested] 10+ messages in thread
* Claude review: drm: panel: add support for the Renesas R63419 based dual-DSI video mode Display Panels
2026-05-21 8:14 ` [PATCH v5 2/2] drm: panel: add support for " Neil Armstrong
@ 2026-05-25 10:36 ` Claude Code Review Bot
0 siblings, 0 replies; 10+ messages in thread
From: Claude Code Review Bot @ 2026-05-25 10:36 UTC (permalink / raw)
To: dri-devel-reviews
Patch Review
**Bug: `mipi_dsi_multi_context` not initialized**
In both `renesas_r63419_on()` and `renesas_r63419_disable()`, the `dsi_ctx` is declared on the stack without an initializer:
```c
static int renesas_r63419_on(struct renesas_r63419_panel *ctx)
{
struct mipi_dsi_multi_context dsi_ctx;
dsi_link_switch(ctx, &dsi_ctx, 0);
```
and:
```c
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_link_switch(ctx, &dsi_ctx, 0);
```
The `dsi_link_switch()` helper only sets `dsi_ctx->dsi` — it does not initialize `accum_err`. The `mipi_dsi_multi_context` documentation explicitly states `accum_err` must be "Init to 0", and all `_multi` functions are no-ops if `accum_err` is non-zero. Without `CONFIG_INIT_STACK_ALL_ZERO`, `accum_err` contains indeterminate stack data, and if it happens to be non-zero, the entire init/disable sequence silently does nothing.
Fix: either zero-initialize the struct (`struct mipi_dsi_multi_context dsi_ctx = { };`) or use designated initializers (`= { .dsi = ctx->dsi[0] }`).
**Style: `panel_desc` structs should be `const`**
```c
static struct panel_desc wt0600_desc = {
```
and
```c
static struct panel_desc wt0630_desc = {
```
These are never modified and are used as read-only match data. They should be `static const struct panel_desc`.
**Observation: DCS command ordering**
The `renesas_r63419_on()` function sends `set_display_on` before `exit_sleep_mode`:
```c
mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
/* ... */
mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
```
The standard MIPI DCS sequence is sleep-out first, then display-on (per MIPI DCS spec section 9.15/9.28). This is likely intentional per the R63419 vendor datasheet — but since it's unusual, a brief comment noting this is the vendor-specified sequence would prevent future "fix" attempts.
**Observation: `dsi_link_switch` pattern vs established dual-DSI patterns**
The existing in-tree dual-DSI driver (`panel-jdi-lpm102a188a.c`) uses two separate `mipi_dsi_multi_context` variables, each properly initialized with `= { .dsi = ... }`. The `dsi_link_switch` pattern introduced here is a reasonable idea for reducing boilerplate when both links share error accumulation, but it's novel. If it becomes a common pattern, it might be worth promoting to a helper in the DSI core, but for now a single driver introducing it is fine — once the initialization bug above is fixed.
**Minor: regulator bulk get lacks `dev_err_probe` wrapping**
```c
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;
```
Other error paths in probe use `dev_err_probe()` consistently. These two regulator calls return bare `ret`. While the regulator subsystem may log internally, using `dev_err_probe()` would be consistent with the rest of the function and properly handles `-EPROBE_DEFER` logging.
**Everything else looks good:**
- `devm_drm_panel_alloc` / `devm_drm_panel_add` / `devm_mipi_dsi_attach` usage is correct and eliminates the need for a `remove` callback.
- The dual-mode clock calculation (`2 * (720 + 100 + 8 + 40) * (2560 + 15 + 2 + 8) * 60 / 1000`) is consistent across both modes, with only physical dimensions differing.
- The `prepare_prev_first = true` setting is appropriate for a panel that needs the CRTC pipeline prepared before the panel powers on.
- GPIO is requested as `GPIOD_OUT_HIGH` (reset asserted at probe), then deasserted in `prepare` — correct active-low reset handling.
- OF match table properly maps board-specific compatibles to per-panel descriptors.
---
Generated by Claude Code Patch Reviewer
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2026-05-25 10:36 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-21 8:14 [PATCH v5 0/2] drm: panel: support the R63419 based dual-DSI video mode Display Panels Neil Armstrong
2026-05-21 8:14 ` [PATCH v5 1/2] dt-bindings: display: panel: document the Renesas " Neil Armstrong
2026-05-21 19:55 ` Conor Dooley
2026-05-25 10:36 ` Claude review: " Claude Code Review Bot
2026-05-21 8:14 ` [PATCH v5 2/2] drm: panel: add support for " Neil Armstrong
2026-05-25 10:36 ` Claude review: " Claude Code Review Bot
2026-05-25 10:36 ` Claude review: drm: panel: support the " Claude Code Review Bot
-- strict thread matches above, loose matches on Subject: below --
2026-05-22 12:51 [PATCH v6 0/2] " Neil Armstrong
2026-05-22 12:51 ` [PATCH v6 2/2] drm: panel: add support for the Renesas " Neil Armstrong
2026-05-25 8:37 ` Claude review: " Claude Code Review Bot
2026-05-04 8:02 [PATCH v3 0/2] drm: panel: support the " Neil Armstrong
2026-05-04 8:02 ` [PATCH v3 2/2] drm: panel: add support for the Renesas " Neil Armstrong
2026-05-04 22:29 ` Claude review: " Claude Code Review Bot
2026-04-30 12:22 [PATCH v2 0/2] drm: panel: support the " Neil Armstrong
2026-04-30 12:22 ` [PATCH v2 2/2] drm: panel: add support for the Renesas " Neil Armstrong
2026-05-05 0:27 ` Claude review: " 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