Hi,

On 5/27/26 08:23, Igor Reznichenko wrote:
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 <[email protected]>
---
  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

<snip>

+
+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;
+       }

Please switch to devm_drm_panel_add() and devm_mipi_dsi_attach() and drop the 
remove callback.

+
+       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 <[email protected]>");
+MODULE_DESCRIPTION("Ilitek ILI9488 Controller Driver");
+MODULE_LICENSE("GPL");

Thanks,
Neil

Reply via email to