* [PATCH v4 0/2] drm/panel: Add support for the FocusLCDs E35GH-I-MW800CB
@ 2026-05-27 6:22 Igor Reznichenko
2026-05-27 6:22 ` [PATCH v4 1/2] dt-bindings: display: panel: Add Ilitek ILI9488 panel controller Igor Reznichenko
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Igor Reznichenko @ 2026-05-27 6:22 UTC (permalink / raw)
To: Neil Armstrong, Jessica Zhang, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Lad Prabhakar,
Manivannan Sadhasivam, Kael D'Alcamo, Kever Yang
Cc: dri-devel, devicetree, linux-kernel
Add support for E35GH-I-MW800CB 320x480 MIPI DSI panel by FocusLCDs.
The panel uses Ilitek ILI9488 driver IC in DSI mode specifically.
ILI9488 also appears in DBI/SPI panels, but those require different bus drivers.
This is a resend of v3. Since v3, this panel driver has been tested on
STM32MP157D-DK1 in addition to TI AM62P EVK. The panel works in video mode on
both platforms. Additional panels using ILI9488 DSI can be added later
with their own timings.
v4: Rebased
Tested 7.1-rc5 on STM32MP157D-DK1
Adjusted E35GH-I-MW800CB mode timing to a 14.4 MHz pixel clock with
slightly increased blanking to make it more synthesizable across DSI hosts
v3: Fixed missing Reviewed-by tag
https://lore.kernel.org/all/20260204060114.345219-1-igor@reznichenko.net/
v2: Added comment explaining the "focuslcds" vendor prefix
https://lore.kernel.org/all/20260203054121.335441-1-igor@reznichenko.net/
v1:
https://lore.kernel.org/all/20260131034101.307486-1-igor@reznichenko.net/
Igor Reznichenko (2):
dt-bindings: display: panel: Add Ilitek ILI9488 panel controller
drm/panel: Add Ilitek ILI9488 controller driver
.../display/panel/ilitek,ili9488.yaml | 63 ++++
.../devicetree/bindings/vendor-prefixes.yaml | 2 +
MAINTAINERS | 6 +
drivers/gpu/drm/panel/Kconfig | 9 +
drivers/gpu/drm/panel/Makefile | 1 +
drivers/gpu/drm/panel/panel-ilitek-ili9488.c | 299 ++++++++++++++++++
6 files changed, 380 insertions(+)
create mode 100644 Documentation/devicetree/bindings/display/panel/ilitek,ili9488.yaml
create mode 100644 drivers/gpu/drm/panel/panel-ilitek-ili9488.c
--
2.43.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v4 1/2] dt-bindings: display: panel: Add Ilitek ILI9488 panel controller
2026-05-27 6:22 [PATCH v4 0/2] drm/panel: Add support for the FocusLCDs E35GH-I-MW800CB Igor Reznichenko
@ 2026-05-27 6:22 ` Igor Reznichenko
2026-05-28 2:40 ` Claude review: " Claude Code Review Bot
2026-05-27 6:23 ` [PATCH v4 2/2] drm/panel: Add Ilitek ILI9488 controller driver Igor Reznichenko
2026-05-28 2:40 ` Claude review: drm/panel: Add support for the FocusLCDs E35GH-I-MW800CB Claude Code Review Bot
2 siblings, 1 reply; 6+ messages in thread
From: Igor Reznichenko @ 2026-05-27 6:22 UTC (permalink / raw)
To: Neil Armstrong, Jessica Zhang, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Lad Prabhakar,
Manivannan Sadhasivam, Kael D'Alcamo, Kever Yang
Cc: dri-devel, devicetree, linux-kernel, Conor Dooley
Add binding for the Ilitek ILI9488 panel controller which is found on
the FocusLCDs E35GH-I-MW800-CB MIPI DSI panel. Add "focuslcds" to
vendor-prefixes.yaml as it's a brandname and a website
(https://focuslcds.com/) for Focus Display Solutions, Inc.
Reviewed-by: Conor Dooley <conor.dooley@microchip.com>
Signed-off-by: Igor Reznichenko <igor@reznichenko.net>
---
.../display/panel/ilitek,ili9488.yaml | 63 +++++++++++++++++++
.../devicetree/bindings/vendor-prefixes.yaml | 2 +
2 files changed, 65 insertions(+)
create mode 100644 Documentation/devicetree/bindings/display/panel/ilitek,ili9488.yaml
diff --git a/Documentation/devicetree/bindings/display/panel/ilitek,ili9488.yaml b/Documentation/devicetree/bindings/display/panel/ilitek,ili9488.yaml
new file mode 100644
index 000000000000..ea7449273022
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/panel/ilitek,ili9488.yaml
@@ -0,0 +1,63 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/panel/ilitek,ili9488.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Ilitek ILI9488 based MIPI-DSI panels
+
+maintainers:
+ - Igor Reznichenko <igor@reznichenko.net>
+
+allOf:
+ - $ref: panel-common.yaml#
+
+properties:
+ compatible:
+ items:
+ - enum:
+ - focuslcds,e35gh-i-mw800cb
+ - const: ilitek,ili9488
+
+ reg:
+ maxItems: 1
+
+ vci-supply: true
+ iovcc-supply: true
+
+required:
+ - compatible
+ - reg
+ - vci-supply
+ - iovcc-supply
+ - reset-gpios
+ - backlight
+ - port
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/gpio/gpio.h>
+
+ dsi {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ panel@0 {
+ compatible = "focuslcds,e35gh-i-mw800cb", "ilitek,ili9488";
+ reg = <0>;
+ vci-supply = <®_vci_panel>;
+ iovcc-supply = <®_iovcc_panel>;
+ reset-gpios = <&gpio3 6 GPIO_ACTIVE_LOW>;
+ backlight = <&pwm_bl>;
+
+ port {
+ panel_in: endpoint {
+ remote-endpoint = <&dsi_out>;
+ };
+ };
+ };
+ };
+
+...
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml
index 28784d66ae7b..5ab758570248 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.yaml
+++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml
@@ -600,6 +600,8 @@ patternProperties:
description: Flipkart Inc.
"^focaltech,.*":
description: FocalTech Systems Co.,Ltd
+ "^focuslcds,.*":
+ description: Focus Display Solutions, Inc.
"^forlinx,.*":
description: Baoding Forlinx Embedded Technology Co., Ltd.
"^foursemi,.*":
--
2.43.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v4 2/2] drm/panel: Add Ilitek ILI9488 controller driver
2026-05-27 6:22 [PATCH v4 0/2] drm/panel: Add support for the FocusLCDs E35GH-I-MW800CB Igor Reznichenko
2026-05-27 6:22 ` [PATCH v4 1/2] dt-bindings: display: panel: Add Ilitek ILI9488 panel controller Igor Reznichenko
@ 2026-05-27 6:23 ` Igor Reznichenko
2026-05-28 2:40 ` Claude review: " Claude Code Review Bot
2026-05-28 2:40 ` Claude review: drm/panel: Add support for the FocusLCDs E35GH-I-MW800CB Claude Code Review Bot
2 siblings, 1 reply; 6+ messages in thread
From: Igor Reznichenko @ 2026-05-27 6:23 UTC (permalink / raw)
To: Neil Armstrong, Jessica Zhang, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Lad Prabhakar,
Manivannan Sadhasivam, Kael D'Alcamo, Kever Yang
Cc: dri-devel, devicetree, linux-kernel
Add support for Ilitek ILI9488 DSI controller which is used in
FocusLCDs E35GH-I-MW800-CB 320x480 MIPI DSI panel. The mode timing
was adjusted after STM32MP157 testing. The previous 14.256 MHz mode
worked on AM62P, but was awkward for STM32 DSI/LTDC clock synthesis.
Signed-off-by: Igor Reznichenko <igor@reznichenko.net>
---
MAINTAINERS | 6 +
drivers/gpu/drm/panel/Kconfig | 9 +
drivers/gpu/drm/panel/Makefile | 1 +
drivers/gpu/drm/panel/panel-ilitek-ili9488.c | 299 +++++++++++++++++++
4 files changed, 315 insertions(+)
create mode 100644 drivers/gpu/drm/panel/panel-ilitek-ili9488.c
diff --git a/MAINTAINERS b/MAINTAINERS
index 461a3eed6129..a70aacb4f6fb 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8038,6 +8038,12 @@ T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
F: Documentation/devicetree/bindings/display/ilitek,ili9486.yaml
F: drivers/gpu/drm/tiny/ili9486.c
+DRM DRIVER FOR ILITEK ILI9488 PANELS
+M: Igor Reznichenko <igor@reznichenko.net>
+S: Maintained
+F: Documentation/devicetree/bindings/display/panel/ilitek,ili9488.yaml
+F: drivers/gpu/drm/panel/panel-ilitek-ili9488.c
+
DRM DRIVER FOR ILITEK ILI9805 PANELS
M: Michael Trimarchi <michael@amarulasolutions.com>
S: Maintained
diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig
index d592f4f4b939..03397e652cae 100644
--- a/drivers/gpu/drm/panel/Kconfig
+++ b/drivers/gpu/drm/panel/Kconfig
@@ -260,6 +260,15 @@ config DRM_PANEL_ILITEK_ILI9341
QVGA (240x320) RGB panels. support serial & parallel rgb
interface.
+config DRM_PANEL_ILITEK_ILI9488
+ tristate "Ilitek ILI9488-based panels"
+ depends on OF
+ depends on DRM_MIPI_DSI
+ depends on BACKLIGHT_CLASS_DEVICE
+ help
+ Say Y if you want to enable support for panels based on the
+ Ilitek ILI9488 controller.
+
config DRM_PANEL_ILITEK_ILI9805
tristate "Ilitek ILI9805-based panels"
depends on OF
diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile
index a4291dc3905b..753b18842e7a 100644
--- a/drivers/gpu/drm/panel/Makefile
+++ b/drivers/gpu/drm/panel/Makefile
@@ -26,6 +26,7 @@ obj-$(CONFIG_DRM_PANEL_HIMAX_HX8394) += panel-himax-hx8394.o
obj-$(CONFIG_DRM_PANEL_HYDIS_HV101HD1) += panel-hydis-hv101hd1.o
obj-$(CONFIG_DRM_PANEL_ILITEK_IL9322) += panel-ilitek-ili9322.o
obj-$(CONFIG_DRM_PANEL_ILITEK_ILI9341) += panel-ilitek-ili9341.o
+obj-$(CONFIG_DRM_PANEL_ILITEK_ILI9488) += panel-ilitek-ili9488.o
obj-$(CONFIG_DRM_PANEL_ILITEK_ILI9805) += panel-ilitek-ili9805.o
obj-$(CONFIG_DRM_PANEL_ILITEK_ILI9806E_CORE) += panel-ilitek-ili9806e-core.o
obj-$(CONFIG_DRM_PANEL_ILITEK_ILI9806E_DSI) += panel-ilitek-ili9806e-dsi.o
diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9488.c b/drivers/gpu/drm/panel/panel-ilitek-ili9488.c
new file mode 100644
index 000000000000..b2145cbe8c30
--- /dev/null
+++ b/drivers/gpu/drm/panel/panel-ilitek-ili9488.c
@@ -0,0 +1,299 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/errno.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of.h>
+
+#include <linux/gpio/consumer.h>
+#include <linux/regulator/consumer.h>
+
+#include <drm/drm_mipi_dsi.h>
+#include <drm/drm_modes.h>
+#include <drm/drm_panel.h>
+#include <drm/drm_probe_helper.h>
+
+#include <video/mipi_display.h>
+
+struct ili9488_desc {
+ const struct drm_display_mode *display_mode;
+ unsigned long mode_flags;
+ enum mipi_dsi_pixel_format format;
+ unsigned int lanes;
+ void (*init_sequence)(struct mipi_dsi_multi_context *ctx);
+};
+
+struct ili9488 {
+ struct drm_panel panel;
+ struct mipi_dsi_device *dsi;
+ struct gpio_desc *reset;
+ struct regulator_bulk_data supplies[2];
+ const struct ili9488_desc *desc;
+ enum drm_panel_orientation orientation;
+};
+
+static const char * const regulator_names[] = {
+ "vci",
+ "iovcc",
+};
+
+static void e35gh_i_mw800cb_init(struct mipi_dsi_multi_context *ctx)
+{
+ /* Gamma control 1,2 */
+ mipi_dsi_dcs_write_seq_multi(ctx, 0xE0, 0x00, 0x10, 0x14, 0x01, 0x0E, 0x04, 0x33,
+ 0x56, 0x48, 0x03, 0x0C, 0x0B, 0x2B, 0x34, 0x0F);
+ mipi_dsi_dcs_write_seq_multi(ctx, 0xE1, 0x00, 0x12, 0x18, 0x05, 0x12, 0x06, 0x40,
+ 0x34, 0x57, 0x06, 0x10, 0x0C, 0x3B, 0x3F, 0x0F);
+ /* Power control 1,2 */
+ mipi_dsi_dcs_write_seq_multi(ctx, 0xC0, 0x0F, 0x0C);
+ mipi_dsi_dcs_write_seq_multi(ctx, 0xC1, 0x41);
+ /* VCOM Control */
+ mipi_dsi_dcs_write_seq_multi(ctx, 0xC5, 0x00, 0x25, 0x80);
+ mipi_dsi_dcs_write_seq_multi(ctx, 0x36, 0x48);
+ /* Interface pixel format 18bpp */
+ mipi_dsi_dcs_write_seq_multi(ctx, 0x3A, 0x66);
+ mipi_dsi_dcs_write_seq_multi(ctx, 0xB0, 0x00);
+ mipi_dsi_dcs_write_seq_multi(ctx, 0xB1, 0xA0);
+ mipi_dsi_dcs_write_seq_multi(ctx, 0xB4, 0x02);
+ mipi_dsi_dcs_write_seq_multi(ctx, 0xB6, 0x02, 0x02, 0x3B);
+ mipi_dsi_dcs_write_seq_multi(ctx, 0xE9, 0x00);
+ mipi_dsi_dcs_write_seq_multi(ctx, 0xF7, 0xA9, 0x51, 0x2C, 0x82);
+ mipi_dsi_dcs_write_seq_multi(ctx, 0x21, 0x00);
+}
+
+static const struct drm_display_mode e35gh_i_mw800cb_display_mode = {
+ .clock = 14400,
+
+ .hdisplay = 320,
+ .hsync_start = 320 + 60,
+ .hsync_end = 320 + 60 + 20,
+ .htotal = 320 + 60 + 20 + 42,
+
+ .vdisplay = 480,
+ .vsync_start = 480 + 20,
+ .vsync_end = 480 + 20 + 10,
+ .vtotal = 480 + 20 + 10 + 33,
+
+ .width_mm = 48,
+ .height_mm = 73,
+
+ .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
+ .type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,
+};
+
+static inline struct ili9488 *panel_to_ili9488(struct drm_panel *panel)
+{
+ return container_of(panel, struct ili9488, panel);
+}
+
+static int ili9488_power_on(struct ili9488 *ili)
+{
+ struct mipi_dsi_device *dsi = ili->dsi;
+ int ret;
+
+ ret = regulator_bulk_enable(ARRAY_SIZE(ili->supplies), ili->supplies);
+ if (ret < 0) {
+ dev_err(&dsi->dev, "regulator bulk enable failed: %d\n", ret);
+ return ret;
+ }
+
+ gpiod_set_value_cansleep(ili->reset, 0);
+ usleep_range(1000, 5000);
+ gpiod_set_value_cansleep(ili->reset, 1);
+ usleep_range(1000, 5000);
+ gpiod_set_value_cansleep(ili->reset, 0);
+ usleep_range(5000, 10000);
+
+ return 0;
+}
+
+static int ili9488_power_off(struct ili9488 *ili)
+{
+ struct mipi_dsi_device *dsi = ili->dsi;
+ int ret;
+
+ gpiod_set_value_cansleep(ili->reset, 1);
+
+ ret = regulator_bulk_disable(ARRAY_SIZE(ili->supplies), ili->supplies);
+ if (ret)
+ dev_err(&dsi->dev, "regulator bulk disable failed: %d\n", ret);
+
+ return ret;
+}
+
+static int ili9488_activate(struct ili9488 *ili)
+{
+ struct mipi_dsi_multi_context ctx = { .dsi = ili->dsi };
+
+ if (ili->desc->init_sequence)
+ ili->desc->init_sequence(&ctx);
+
+ mipi_dsi_dcs_exit_sleep_mode_multi(&ctx);
+ mipi_dsi_msleep(&ctx, 120);
+ mipi_dsi_dcs_set_display_on_multi(&ctx);
+
+ return ctx.accum_err;
+}
+
+static int ili9488_prepare(struct drm_panel *panel)
+{
+ struct ili9488 *ili = panel_to_ili9488(panel);
+ int ret;
+
+ ret = ili9488_power_on(ili);
+ if (ret)
+ return ret;
+
+ ret = ili9488_activate(ili);
+ if (ret) {
+ ili9488_power_off(ili);
+ return ret;
+ }
+
+ return 0;
+}
+
+static int ili9488_deactivate(struct ili9488 *ili)
+{
+ struct mipi_dsi_multi_context ctx = { .dsi = ili->dsi };
+
+ mipi_dsi_dcs_set_display_off_multi(&ctx);
+ mipi_dsi_dcs_enter_sleep_mode_multi(&ctx);
+ mipi_dsi_msleep(&ctx, 120);
+
+ return ctx.accum_err;
+}
+
+static int ili9488_unprepare(struct drm_panel *panel)
+{
+ struct ili9488 *ili = panel_to_ili9488(panel);
+ struct mipi_dsi_device *dsi = ili->dsi;
+ int ret;
+
+ ili9488_deactivate(ili);
+ ret = ili9488_power_off(ili);
+ if (ret < 0)
+ dev_err(&dsi->dev, "power off failed: %d\n", ret);
+
+ return ret;
+}
+
+static int ili9488_get_modes(struct drm_panel *panel, struct drm_connector *connector)
+{
+ struct ili9488 *ili = panel_to_ili9488(panel);
+ const struct drm_display_mode *mode = ili->desc->display_mode;
+
+ return drm_connector_helper_get_modes_fixed(connector, mode);
+}
+
+static enum drm_panel_orientation ili9488_get_orientation(struct drm_panel *panel)
+{
+ struct ili9488 *ili = panel_to_ili9488(panel);
+
+ return ili->orientation;
+}
+
+static const struct drm_panel_funcs ili9488_funcs = {
+ .prepare = ili9488_prepare,
+ .unprepare = ili9488_unprepare,
+ .get_modes = ili9488_get_modes,
+ .get_orientation = ili9488_get_orientation,
+};
+
+static int ili9488_dsi_probe(struct mipi_dsi_device *dsi)
+{
+ struct device *dev = &dsi->dev;
+ struct ili9488 *ili;
+ int i, ret;
+
+ ili = devm_drm_panel_alloc(dev, struct ili9488, panel, &ili9488_funcs,
+ DRM_MODE_CONNECTOR_DSI);
+ if (IS_ERR(ili))
+ return PTR_ERR(ili);
+
+ ili->desc = device_get_match_data(dev);
+ mipi_dsi_set_drvdata(dsi, ili);
+ ili->dsi = dsi;
+
+ dsi->mode_flags = ili->desc->mode_flags;
+ dsi->format = ili->desc->format;
+ dsi->lanes = ili->desc->lanes;
+
+ ili->reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+ if (IS_ERR(ili->reset))
+ return dev_err_probe(dev, PTR_ERR(ili->reset),
+ "failed to get reset-gpios\n");
+
+ for (i = 0; i < ARRAY_SIZE(ili->supplies); i++)
+ ili->supplies[i].supply = regulator_names[i];
+
+ ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(ili->supplies),
+ ili->supplies);
+ if (ret < 0)
+ return dev_err_probe(dev, ret, "failed to get regulators\n");
+
+ ret = of_drm_get_panel_orientation(dev->of_node, &ili->orientation);
+ if (ret)
+ return dev_err_probe(dev, ret, "failed to get orientation\n");
+
+ ret = drm_panel_of_backlight(&ili->panel);
+ if (ret)
+ return dev_err_probe(dev, ret, "failed to get backlight\n");
+
+ ili->panel.prepare_prev_first = true;
+ drm_panel_add(&ili->panel);
+
+ ret = mipi_dsi_attach(dsi);
+ if (ret < 0) {
+ dev_err_probe(dev, ret, "failed to attach to DSI host\n");
+ drm_panel_remove(&ili->panel);
+ return ret;
+ }
+
+ return 0;
+}
+
+static void ili9488_dsi_remove(struct mipi_dsi_device *dsi)
+{
+ struct ili9488 *ili = 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(&ili->panel);
+}
+
+static const struct ili9488_desc e35gh_i_mw800cb_desc = {
+ .init_sequence = e35gh_i_mw800cb_init,
+ .display_mode = &e35gh_i_mw800cb_display_mode,
+ .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
+ MIPI_DSI_MODE_LPM | MIPI_DSI_CLOCK_NON_CONTINUOUS,
+ .format = MIPI_DSI_FMT_RGB666_PACKED,
+ .lanes = 1,
+};
+
+static const struct of_device_id ili9488_of_match[] = {
+ { .compatible = "focuslcds,e35gh-i-mw800cb", .data = &e35gh_i_mw800cb_desc },
+ { }
+};
+
+MODULE_DEVICE_TABLE(of, ili9488_of_match);
+
+static struct mipi_dsi_driver ili9488_dsi_driver = {
+ .probe = ili9488_dsi_probe,
+ .remove = ili9488_dsi_remove,
+ .driver = {
+ .name = "ili9488-dsi",
+ .of_match_table = ili9488_of_match,
+ },
+};
+module_mipi_dsi_driver(ili9488_dsi_driver);
+
+MODULE_AUTHOR("Igor Reznichenko <igor@reznichenko.net>");
+MODULE_DESCRIPTION("Ilitek ILI9488 Controller Driver");
+MODULE_LICENSE("GPL");
--
2.43.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Claude review: drm/panel: Add support for the FocusLCDs E35GH-I-MW800CB
2026-05-27 6:22 [PATCH v4 0/2] drm/panel: Add support for the FocusLCDs E35GH-I-MW800CB Igor Reznichenko
2026-05-27 6:22 ` [PATCH v4 1/2] dt-bindings: display: panel: Add Ilitek ILI9488 panel controller Igor Reznichenko
2026-05-27 6:23 ` [PATCH v4 2/2] drm/panel: Add Ilitek ILI9488 controller driver Igor Reznichenko
@ 2026-05-28 2:40 ` Claude Code Review Bot
2 siblings, 0 replies; 6+ messages in thread
From: Claude Code Review Bot @ 2026-05-28 2:40 UTC (permalink / raw)
To: dri-devel-reviews
Overall Series Review
Subject: drm/panel: Add support for the FocusLCDs E35GH-I-MW800CB
Author: Igor Reznichenko <igor@reznichenko.net>
Patches: 3
Reviewed: 2026-05-28T12:40:40.918299
---
This is a clean, well-structured 2-patch series adding support for the FocusLCDs E35GH-I-MW800CB 320x480 MIPI DSI panel driven by an Ilitek ILI9488 controller IC. The code follows modern DRM panel driver conventions (`devm_drm_panel_alloc`, `mipi_dsi_multi_context`, `drm_connector_helper_get_modes_fixed`), and is closely modeled on the existing ILI9805 driver. The DT binding is straightforward and has already been reviewed by Conor Dooley.
The driver is v4, tested on two platforms (AM62P and STM32MP157D-DK1), and looks close to merge-ready. I have only minor observations, no blocking issues.
---
Generated by Claude Code Patch Reviewer
^ permalink raw reply [flat|nested] 6+ messages in thread
* Claude review: dt-bindings: display: panel: Add Ilitek ILI9488 panel controller
2026-05-27 6:22 ` [PATCH v4 1/2] dt-bindings: display: panel: Add Ilitek ILI9488 panel controller Igor Reznichenko
@ 2026-05-28 2:40 ` Claude Code Review Bot
0 siblings, 0 replies; 6+ messages in thread
From: Claude Code Review Bot @ 2026-05-28 2:40 UTC (permalink / raw)
To: dri-devel-reviews
Patch Review
**Reviewed-by: Conor Dooley** — this patch already carries a DT binding review tag.
The binding is clean and follows the established pattern from `ilitek,ili9805.yaml`. The `focuslcds` vendor prefix addition is correctly placed alphabetically.
**Minor observation — `backlight` as required:**
```yaml
required:
- compatible
- reg
- vci-supply
- iovcc-supply
- reset-gpios
- backlight
- port
```
Making `backlight` required means every board using this panel *must* specify a backlight phandle in DT. This is consistent with the ILI9805 binding, so it's a deliberate pattern choice and acceptable, but some DT reviewers prefer `backlight` as optional since some deployments use fixed-on backlights. Since this already has Conor's Reviewed-by, this is fine as-is.
No other issues with patch 1.
---
Generated by Claude Code Patch Reviewer
^ permalink raw reply [flat|nested] 6+ messages in thread
* Claude review: drm/panel: Add Ilitek ILI9488 controller driver
2026-05-27 6:23 ` [PATCH v4 2/2] drm/panel: Add Ilitek ILI9488 controller driver Igor Reznichenko
@ 2026-05-28 2:40 ` Claude Code Review Bot
0 siblings, 0 replies; 6+ messages in thread
From: Claude Code Review Bot @ 2026-05-28 2:40 UTC (permalink / raw)
To: dri-devel-reviews
Patch Review
**Structure and patterns — good:**
- Uses `devm_drm_panel_alloc()` (modern pattern, matches ILI9805).
- Uses `mipi_dsi_multi_context` for the init sequence (correct modern approach).
- Uses `drm_connector_helper_get_modes_fixed()` instead of manual `drm_mode_duplicate` + `drm_mode_probed_add` (cleaner than ILI9805).
- Panel descriptor pattern allows future ILI9488-based panels with different timings to be added easily.
**Mode timing — correct:**
```c
.clock = 14400,
.htotal = 320 + 60 + 20 + 42, /* = 442 */
.vtotal = 480 + 20 + 10 + 33, /* = 543 */
```
14400000 / (442 × 543) = ~59.97 Hz. Sensible for a 60 Hz panel.
**Init sequence — minor observation on command 0x21:**
```c
mipi_dsi_dcs_write_seq_multi(ctx, 0x21, 0x00);
```
DCS command 0x21 (`set_display_inversion_on`) is defined as a no-parameter command per the MIPI DCS spec. The extra `0x00` data byte is likely harmless (the panel probably ignores it), but could be simplified to just the command byte. This is likely copied from the vendor's reference init code, so it's fine to leave as-is.
**Reset sequence — correct:**
```c
gpiod_set_value_cansleep(ili->reset, 0); /* deassert */
usleep_range(1000, 5000);
gpiod_set_value_cansleep(ili->reset, 1); /* assert reset */
usleep_range(1000, 5000);
gpiod_set_value_cansleep(ili->reset, 0); /* deassert */
usleep_range(5000, 10000);
```
Standard reset pulse pattern — deassert, pulse assert, deassert. Uses `_cansleep` variant which is safer than the ILI9805's non-cansleep version (since the GPIO controller might be on an I2C/SPI bus).
**Unprepare — deactivate error ignored:**
```c
static int ili9488_unprepare(struct drm_panel *panel)
{
struct ili9488 *ili = panel_to_ili9488(panel);
struct mipi_dsi_device *dsi = ili->dsi;
int ret;
ili9488_deactivate(ili);
ret = ili9488_power_off(ili);
```
The return value from `ili9488_deactivate()` is silently discarded. This is reasonable — you still want to power off even if the display-off/sleep-in commands fail — but a `dev_warn` on failure would be helpful for debugging. Not a blocking issue.
**Probe ordering — correct:**
```c
ili->panel.prepare_prev_first = true;
drm_panel_add(&ili->panel);
ret = mipi_dsi_attach(dsi);
if (ret < 0) {
dev_err_probe(dev, ret, "failed to attach to DSI host\n");
drm_panel_remove(&ili->panel);
return ret;
}
```
The `drm_panel_add` before `mipi_dsi_attach` with rollback on failure is the correct ordering.
**MAINTAINERS entry — correct:**
```
+DRM DRIVER FOR ILITEK ILI9488 PANELS
+M: Igor Reznichenko <igor@reznichenko.net>
+S: Maintained
+F: Documentation/devicetree/bindings/display/panel/ilitek,ili9488.yaml
+F: drivers/gpu/drm/panel/panel-ilitek-ili9488.c
```
Missing a `T:` (git tree) line, but this is common for new drivers that go through drm-misc. Not required.
**Overall for patch 2:** Clean driver, no correctness bugs found. Ready for merge with the minor nits above optionally addressed.
---
Generated by Claude Code Patch Reviewer
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-05-28 2:40 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-27 6:22 [PATCH v4 0/2] drm/panel: Add support for the FocusLCDs E35GH-I-MW800CB Igor Reznichenko
2026-05-27 6:22 ` [PATCH v4 1/2] dt-bindings: display: panel: Add Ilitek ILI9488 panel controller Igor Reznichenko
2026-05-28 2:40 ` Claude review: " Claude Code Review Bot
2026-05-27 6:23 ` [PATCH v4 2/2] drm/panel: Add Ilitek ILI9488 controller driver Igor Reznichenko
2026-05-28 2:40 ` Claude review: " Claude Code Review Bot
2026-05-28 2:40 ` Claude review: drm/panel: Add support for the FocusLCDs E35GH-I-MW800CB 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