Skip to content
Snippets Groups Projects

RCORE RK3588 Module Support and Pocket A311D Support

Closed minute requested to merge rk3588-reform2 into main
All threads resolved!
Files
11
diff --git a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
index 81b4680..998e77b 100644
--- a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
+++ b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c
@@ -145,9 +145,9 @@ static int jdi_panel_unprepare(struct drm_panel *panel)
gpiod_set_value(jdi->enable_gpio, 0);
- gpiod_set_value(jdi->reset_gpio, 1);
+ if (!IS_ERR(jdi->reset_gpio)) gpiod_set_value(jdi->reset_gpio, 1);
- gpiod_set_value(jdi->dcdc_en_gpio, 0);
+ if (!IS_ERR(jdi->dcdc_en_gpio)) gpiod_set_value(jdi->dcdc_en_gpio, 0);
jdi->prepared = false;
@@ -171,10 +171,10 @@ static int jdi_panel_prepare(struct drm_panel *panel)
msleep(20);
- gpiod_set_value(jdi->dcdc_en_gpio, 1);
+ if (!IS_ERR(jdi->dcdc_en_gpio)) gpiod_set_value(jdi->dcdc_en_gpio, 1);
usleep_range(10, 20);
- gpiod_set_value(jdi->reset_gpio, 0);
+ if (!IS_ERR(jdi->reset_gpio)) gpiod_set_value(jdi->reset_gpio, 0);
usleep_range(10, 20);
gpiod_set_value(jdi->enable_gpio, 1);
@@ -237,6 +237,15 @@ static int jdi_panel_get_modes(struct drm_panel *panel,
return -ENOMEM;
}
+ // on A311D, we shift the vsync by one line to counteract VIU_OSD_HOLD_FIFO_LINES
+ if (of_property_present(dev->of_node, "vsync-shift")) {
+ uint32_t vsync_shift = 0;
+ of_property_read_u32(dev->of_node, "vsync-shift", &vsync_shift);
+ dev_warn(dev, "vsync-shift from device tree: %d\n", vsync_shift);
+ mode->vsync_start += vsync_shift;
+ mode->vsync_end += vsync_shift;
+ }
+
drm_mode_set_name(mode);
drm_mode_probed_add(connector, mode);
@@ -331,12 +340,12 @@ static int jdi_panel_add(struct jdi_panel *jdi)
jdi->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
if (IS_ERR(jdi->reset_gpio))
- return dev_err_probe(dev, PTR_ERR(jdi->reset_gpio),
+ dev_err_probe(dev, PTR_ERR(jdi->reset_gpio),
"cannot get reset-gpios %d\n", ret);
jdi->dcdc_en_gpio = devm_gpiod_get(dev, "dcdc-en", GPIOD_OUT_LOW);
if (IS_ERR(jdi->dcdc_en_gpio))
- return dev_err_probe(dev, PTR_ERR(jdi->dcdc_en_gpio),
+ dev_err_probe(dev, PTR_ERR(jdi->dcdc_en_gpio),
"cannot get dcdc-en-gpio %d\n", ret);
jdi->backlight = drm_panel_create_dsi_backlight(jdi);
@@ -365,7 +374,13 @@ static int jdi_panel_probe(struct mipi_dsi_device *dsi)
dsi->lanes = 4;
dsi->format = MIPI_DSI_FMT_RGB888;
- dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_VIDEO_HSE;
+ dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_HSE;
+
+ // on a311d it works only without burst, but imx8mplus needs burst mode
+ if (of_property_present(dsi->dev.of_node, "burst-mode")) {
+ dsi->mode_flags |= MIPI_DSI_MODE_VIDEO_BURST;
+ dev_warn(&dsi->dev, "DSI burst mode enabled via device tree\n");
+ }
jdi = devm_kzalloc(&dsi->dev, sizeof(*jdi), GFP_KERNEL);
if (!jdi)
Loading