Message ID | 20231109215007.66826-3-macroalpha82@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | rockchip: Add Powkiddy RK2023 | expand |
On 11/9/2023 1:50 PM, Chris Morgan wrote: > From: Chris Morgan <macromorgan@hotmail.com> > > Refactor the driver to add support for the powkiddy,rk2023-panel > panel. This panel is extremely similar to the rg353p-panel but > requires a smaller vertical back porch and isn't as tolerant of > higher speeds. Note that while all of these panels are identical in > size (70x57) it is possible future panels may not be. > > Tested on my RG351V, RG353P, RG353V, and RK2023. > > Signed-off-by: Chris Morgan <macromorgan@hotmail.com> > --- > .../gpu/drm/panel/panel-newvision-nv3051d.c | 57 +++++++++++++++---- > 1 file changed, 46 insertions(+), 11 deletions(-) > > diff --git a/drivers/gpu/drm/panel/panel-newvision-nv3051d.c b/drivers/gpu/drm/panel/panel-newvision-nv3051d.c > index 79de6c886292..94d89ffd596b 100644 > --- a/drivers/gpu/drm/panel/panel-newvision-nv3051d.c > +++ b/drivers/gpu/drm/panel/panel-newvision-nv3051d.c > @@ -28,6 +28,7 @@ struct nv3051d_panel_info { > unsigned int num_modes; > u16 width_mm, height_mm; > u32 bus_flags; > + u32 mode_flags; > }; > > struct panel_nv3051d { > @@ -261,6 +262,8 @@ static int panel_nv3051d_unprepare(struct drm_panel *panel) > > usleep_range(10000, 15000); > > + gpiod_set_value_cansleep(ctx->reset_gpio, 1); > + Hi Chris, Is this to address a suspend/resume issue similar to what was done here [1]? If so, I think maybe this can go as a separate Fixes patch. Thanks, Jessica Zhang [1] https://patchwork.freedesktop.org/patch/567670/?series=126479&rev=1 > regulator_disable(ctx->vdd); > > return 0; > @@ -385,15 +388,7 @@ static int panel_nv3051d_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_LPM | MIPI_DSI_MODE_NO_EOT_PACKET; > - > - /* > - * The panel in the RG351V is identical to the 353P, except it > - * requires MIPI_DSI_CLOCK_NON_CONTINUOUS to operate correctly. > - */ > - if (of_device_is_compatible(dev->of_node, "anbernic,rg351v-panel")) > - dsi->mode_flags |= MIPI_DSI_CLOCK_NON_CONTINUOUS; > + dsi->mode_flags = ctx->panel_info->mode_flags; > > drm_panel_init(&ctx->panel, &dsi->dev, &panel_nv3051d_funcs, > DRM_MODE_CONNECTOR_DSI); > @@ -481,16 +476,56 @@ static const struct drm_display_mode nv3051d_rgxx3_modes[] = { > }, > }; > > -static const struct nv3051d_panel_info nv3051d_rgxx3_info = { > +static const struct drm_display_mode nv3051d_rk2023_modes[] = { > + { > + .hdisplay = 640, > + .hsync_start = 640 + 40, > + .hsync_end = 640 + 40 + 2, > + .htotal = 640 + 40 + 2 + 80, > + .vdisplay = 480, > + .vsync_start = 480 + 18, > + .vsync_end = 480 + 18 + 2, > + .vtotal = 480 + 18 + 2 + 4, > + .clock = 24150, > + .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, > + }, > +}; > + > +static const struct nv3051d_panel_info nv3051d_rg351v_info = { > .display_modes = nv3051d_rgxx3_modes, > .num_modes = ARRAY_SIZE(nv3051d_rgxx3_modes), > .width_mm = 70, > .height_mm = 57, > .bus_flags = DRM_BUS_FLAG_DE_LOW | DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE, > + .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | > + MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_NO_EOT_PACKET | > + MIPI_DSI_CLOCK_NON_CONTINUOUS, > +}; > + > +static const struct nv3051d_panel_info nv3051d_rg353p_info = { > + .display_modes = nv3051d_rgxx3_modes, > + .num_modes = ARRAY_SIZE(nv3051d_rgxx3_modes), > + .width_mm = 70, > + .height_mm = 57, > + .bus_flags = DRM_BUS_FLAG_DE_LOW | DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE, > + .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | > + MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_NO_EOT_PACKET, > +}; > + > +static const struct nv3051d_panel_info nv3051d_rk2023_info = { > + .display_modes = nv3051d_rk2023_modes, > + .num_modes = ARRAY_SIZE(nv3051d_rk2023_modes), > + .width_mm = 70, > + .height_mm = 57, > + .bus_flags = DRM_BUS_FLAG_DE_LOW | DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE, > + .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | > + MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_NO_EOT_PACKET, > }; > > static const struct of_device_id newvision_nv3051d_of_match[] = { > - { .compatible = "newvision,nv3051d", .data = &nv3051d_rgxx3_info }, > + { .compatible = "anbernic,rg351v-panel", .data = &nv3051d_rg351v_info }, > + { .compatible = "anbernic,rg353p-panel", .data = &nv3051d_rg353p_info }, > + { .compatible = "powkiddy,rk2023-panel", .data = &nv3051d_rk2023_info }, > { /* sentinel */ } > }; > MODULE_DEVICE_TABLE(of, newvision_nv3051d_of_match); > -- > 2.34.1 >
diff --git a/drivers/gpu/drm/panel/panel-newvision-nv3051d.c b/drivers/gpu/drm/panel/panel-newvision-nv3051d.c index 79de6c886292..94d89ffd596b 100644 --- a/drivers/gpu/drm/panel/panel-newvision-nv3051d.c +++ b/drivers/gpu/drm/panel/panel-newvision-nv3051d.c @@ -28,6 +28,7 @@ struct nv3051d_panel_info { unsigned int num_modes; u16 width_mm, height_mm; u32 bus_flags; + u32 mode_flags; }; struct panel_nv3051d { @@ -261,6 +262,8 @@ static int panel_nv3051d_unprepare(struct drm_panel *panel) usleep_range(10000, 15000); + gpiod_set_value_cansleep(ctx->reset_gpio, 1); + regulator_disable(ctx->vdd); return 0; @@ -385,15 +388,7 @@ static int panel_nv3051d_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_LPM | MIPI_DSI_MODE_NO_EOT_PACKET; - - /* - * The panel in the RG351V is identical to the 353P, except it - * requires MIPI_DSI_CLOCK_NON_CONTINUOUS to operate correctly. - */ - if (of_device_is_compatible(dev->of_node, "anbernic,rg351v-panel")) - dsi->mode_flags |= MIPI_DSI_CLOCK_NON_CONTINUOUS; + dsi->mode_flags = ctx->panel_info->mode_flags; drm_panel_init(&ctx->panel, &dsi->dev, &panel_nv3051d_funcs, DRM_MODE_CONNECTOR_DSI); @@ -481,16 +476,56 @@ static const struct drm_display_mode nv3051d_rgxx3_modes[] = { }, }; -static const struct nv3051d_panel_info nv3051d_rgxx3_info = { +static const struct drm_display_mode nv3051d_rk2023_modes[] = { + { + .hdisplay = 640, + .hsync_start = 640 + 40, + .hsync_end = 640 + 40 + 2, + .htotal = 640 + 40 + 2 + 80, + .vdisplay = 480, + .vsync_start = 480 + 18, + .vsync_end = 480 + 18 + 2, + .vtotal = 480 + 18 + 2 + 4, + .clock = 24150, + .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, + }, +}; + +static const struct nv3051d_panel_info nv3051d_rg351v_info = { .display_modes = nv3051d_rgxx3_modes, .num_modes = ARRAY_SIZE(nv3051d_rgxx3_modes), .width_mm = 70, .height_mm = 57, .bus_flags = DRM_BUS_FLAG_DE_LOW | DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE, + .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | + MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_NO_EOT_PACKET | + MIPI_DSI_CLOCK_NON_CONTINUOUS, +}; + +static const struct nv3051d_panel_info nv3051d_rg353p_info = { + .display_modes = nv3051d_rgxx3_modes, + .num_modes = ARRAY_SIZE(nv3051d_rgxx3_modes), + .width_mm = 70, + .height_mm = 57, + .bus_flags = DRM_BUS_FLAG_DE_LOW | DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE, + .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | + MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_NO_EOT_PACKET, +}; + +static const struct nv3051d_panel_info nv3051d_rk2023_info = { + .display_modes = nv3051d_rk2023_modes, + .num_modes = ARRAY_SIZE(nv3051d_rk2023_modes), + .width_mm = 70, + .height_mm = 57, + .bus_flags = DRM_BUS_FLAG_DE_LOW | DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE, + .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | + MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_NO_EOT_PACKET, }; static const struct of_device_id newvision_nv3051d_of_match[] = { - { .compatible = "newvision,nv3051d", .data = &nv3051d_rgxx3_info }, + { .compatible = "anbernic,rg351v-panel", .data = &nv3051d_rg351v_info }, + { .compatible = "anbernic,rg353p-panel", .data = &nv3051d_rg353p_info }, + { .compatible = "powkiddy,rk2023-panel", .data = &nv3051d_rk2023_info }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, newvision_nv3051d_of_match);