Messages in this thread | | | Date | Tue, 16 Apr 2024 22:27:56 +0200 | Subject | Re: [PATCH v3 2/2] drm/panel: Add driver for EDO RM69380 OLED panel | From | Christophe JAILLET <> |
| |
Le 16/04/2024 à 20:30, David Wronek a écrit : > Add support for the 2560x1600@90Hz OLED panel by EDO bundled with a > Raydium RM69380 controller, as found on the Lenovo Xiaoxin Pad Pro 2021. > > Signed-off-by: David Wronek <david-vu3DzTD92ROXwddmVfQv5g@public.gmane.org> > --- > drivers/gpu/drm/panel/Kconfig | 14 + > drivers/gpu/drm/panel/Makefile | 1 + > drivers/gpu/drm/panel/panel-raydium-rm69380.c | 367 ++++++++++++++++++++++++++ > 3 files changed, 382 insertions(+) >
..
> +static int rm69380_probe(struct mipi_dsi_device *dsi) > +{ > + struct mipi_dsi_host *dsi_sec_host; > + struct rm69380_panel *ctx; > + struct device *dev = &dsi->dev; > + struct device_node *dsi_sec; > + int ret, i; > + > + ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); > + if (!ctx) > + return -ENOMEM; > + > + ctx->supplies[0].supply = "vddio"; > + ctx->supplies[1].supply = "avdd"; > + ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(ctx->supplies), > + ctx->supplies); > + if (ret < 0) > + return dev_err_probe(dev, ret, "Failed to get regulators\n"); > + > + 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-gpios\n"); > + > + dsi_sec = of_graph_get_remote_node(dsi->dev.of_node, 1, -1); > + > + if (dsi_sec) { > + const struct mipi_dsi_device_info info = { "RM69380", 0, > + dsi_sec }; > + > + dev_dbg(dev, "Using Dual-DSI: found `%s`\n", dsi_sec->name); > + > + dsi_sec_host = of_find_mipi_dsi_host_by_node(dsi_sec); > + of_node_put(dsi_sec); > + if (!dsi_sec_host) > + return dev_err_probe(dev, -EPROBE_DEFER, > + "Cannot get secondary DSI host\n"); > + > + ctx->dsi[1] = > + devm_mipi_dsi_device_register_full(dev, dsi_sec_host, &info); > + if (IS_ERR(ctx->dsi[1])) > + return dev_err_probe(dev, PTR_ERR(ctx->dsi[1]), > + "Cannot get secondary DSI node\n"); > + > + dev_dbg(dev, "Second DSI name `%s`\n", ctx->dsi[1]->name); > + mipi_dsi_set_drvdata(ctx->dsi[1], ctx); > + } else { > + dev_dbg(dev, "Using Single-DSI\n"); > + } > + > + ctx->dsi[0] = dsi; > + mipi_dsi_set_drvdata(dsi, ctx); > + > + drm_panel_init(&ctx->panel, dev, &rm69380_panel_funcs, > + DRM_MODE_CONNECTOR_DSI); > + ctx->panel.prepare_prev_first = true; > + > + ctx->panel.backlight = rm69380_create_backlight(dsi); > + if (IS_ERR(ctx->panel.backlight)) > + return dev_err_probe(dev, PTR_ERR(ctx->panel.backlight), > + "Failed to create backlight\n"); > + > + drm_panel_add(&ctx->panel); > + > + for (i = 0; i < ARRAY_SIZE(ctx->dsi); i++) { > + if (!ctx->dsi[i]) > + continue; > + > + dev_dbg(&ctx->dsi[i]->dev, "Binding DSI %d\n", i); > + > + ctx->dsi[i]->lanes = 4; > + ctx->dsi[i]->format = MIPI_DSI_FMT_RGB888; > + ctx->dsi[i]->mode_flags = MIPI_DSI_MODE_VIDEO_BURST | > + MIPI_DSI_CLOCK_NON_CONTINUOUS; > + > + ret = mipi_dsi_attach(ctx->dsi[i]); > + if (ret < 0) { > + mipi_dsi_detach(ctx->dsi[i]);
I don't think this works. if 'i' fails, you have to detach 0...i-1
maybe something like below (complety untested).
> + drm_panel_remove(&ctx->panel); > + return dev_err_probe(dev, ret, > + "Failed to attach to DSI%d\n", i); > + } > + } > + > + return 0; > +}
drm_panel_add(&ctx->panel);
for (i = 0; i < ARRAY_SIZE(ctx->dsi); i++) { if (!ctx->dsi[i]) continue;
dev_dbg(&ctx->dsi[i]->dev, "Binding DSI %d\n", i);
ctx->dsi[i]->lanes = 4; ctx->dsi[i]->format = MIPI_DSI_FMT_RGB888; ctx->dsi[i]->mode_flags = MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_CLOCK_NON_CONTINUOUS;
ret = mipi_dsi_attach(ctx->dsi[i]); if (ret < 0) { dev_err_probe(dev, ret, "Failed to attach to DSI%d\n", i); goto err_detach_dsi; } }
return 0;
err_detach_dsi: while (--i >= 0) if (ctx->dsi[i]) mipi_dsi_detach(ctx->dsi[i]);
drm_panel_remove(&ctx->panel);
return ret; }
| |