mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 11:21:26 -04:00
drm/mipi-dbi: Only modify planes on enabled CRTCs
Use drm_atomic_helper_commit_tail_rpm() as commit tail to update the plane after enabling the CRTC. Then remove the plane-update code from mipi_dbi_enable_flush() and inline the remaining backlight code where necessary. Mipi-dbi's current commit tail drm_atomic_helper_commit_tail() first updates the plane and then enables the CRTC. But the CRTC enablement includes power management that prevents the initial plane update from working. Hence, each mipi-dbi driver includes a plane update in their CRTC enablement; in the form of mipi_dbi_enable_flush() or custom code. Using drm_atomic_helper_commit_tail_rpm() enables the CRTC before any plane updates. Hence the additional plane update can be removed from mipi_dbi_enable_flush() and a number of drivers. This leaves backlight_enable() in the helper, which can now be inlined into affected drivers. Drivers now enable the CRTC plus an optional backlight and then automatically update the plane. In the case of disabling the display, drm_atomic_helper_commit_tail_rpm() only disables the CRTC without touching the plane at all. Mipi-dbi's mipi_dbi_pipe_disable() already contains the necessary logic. Removing the plane update from the CRTC enablement will also help with converting mipi-dbi from simple-pipe helpers to regular atomic helpers. v3: - st7586: remove unused variable v2: - ili9225: remove unused variables (David) - st7586: remove unused variables (David) Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Acked-by: David Lechner <david@lechnology.com> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> Link: https://patch.msgid.link/20260319160110.109610-2-tzimmermann@suse.de
This commit is contained in:
@@ -368,44 +368,6 @@ void mipi_dbi_pipe_update(struct drm_simple_display_pipe *pipe,
|
||||
}
|
||||
EXPORT_SYMBOL(mipi_dbi_pipe_update);
|
||||
|
||||
/**
|
||||
* mipi_dbi_enable_flush - MIPI DBI enable helper
|
||||
* @dbidev: MIPI DBI device structure
|
||||
* @crtc_state: CRTC state
|
||||
* @plane_state: Plane state
|
||||
*
|
||||
* Flushes the whole framebuffer and enables the backlight. Drivers can use this
|
||||
* in their &drm_simple_display_pipe_funcs->enable callback.
|
||||
*
|
||||
* Note: Drivers which don't use mipi_dbi_pipe_update() because they have custom
|
||||
* framebuffer flushing, can't use this function since they both use the same
|
||||
* flushing code.
|
||||
*/
|
||||
void mipi_dbi_enable_flush(struct mipi_dbi_dev *dbidev,
|
||||
struct drm_crtc_state *crtc_state,
|
||||
struct drm_plane_state *plane_state)
|
||||
{
|
||||
struct drm_shadow_plane_state *shadow_plane_state = to_drm_shadow_plane_state(plane_state);
|
||||
struct drm_framebuffer *fb = plane_state->fb;
|
||||
struct drm_rect rect = {
|
||||
.x1 = 0,
|
||||
.x2 = fb->width,
|
||||
.y1 = 0,
|
||||
.y2 = fb->height,
|
||||
};
|
||||
int idx;
|
||||
|
||||
if (!drm_dev_enter(&dbidev->drm, &idx))
|
||||
return;
|
||||
|
||||
mipi_dbi_fb_dirty(&shadow_plane_state->data[0], fb, &rect,
|
||||
&shadow_plane_state->fmtcnv_state);
|
||||
backlight_enable(dbidev->backlight);
|
||||
|
||||
drm_dev_exit(idx);
|
||||
}
|
||||
EXPORT_SYMBOL(mipi_dbi_enable_flush);
|
||||
|
||||
static void mipi_dbi_blank(struct mipi_dbi_dev *dbidev)
|
||||
{
|
||||
struct drm_device *drm = &dbidev->drm;
|
||||
@@ -577,6 +539,10 @@ static int mipi_dbi_rotate_mode(struct drm_display_mode *mode,
|
||||
}
|
||||
}
|
||||
|
||||
static const struct drm_mode_config_helper_funcs mipi_dbi_mode_config_helper_funcs = {
|
||||
.atomic_commit_tail = drm_atomic_helper_commit_tail_rpm,
|
||||
};
|
||||
|
||||
static const struct drm_mode_config_funcs mipi_dbi_mode_config_funcs = {
|
||||
.fb_create = drm_gem_fb_create_with_dirty,
|
||||
.atomic_check = drm_atomic_helper_check,
|
||||
@@ -660,6 +626,8 @@ int mipi_dbi_dev_init_with_formats(struct mipi_dbi_dev *dbidev,
|
||||
drm->mode_config.max_width = dbidev->mode.hdisplay;
|
||||
drm->mode_config.min_height = dbidev->mode.vdisplay;
|
||||
drm->mode_config.max_height = dbidev->mode.vdisplay;
|
||||
drm->mode_config.helper_private = &mipi_dbi_mode_config_helper_funcs;
|
||||
|
||||
dbidev->rotation = rotation;
|
||||
dbidev->pixel_format = formats[0];
|
||||
if (formats[0] == DRM_FORMAT_RGB888)
|
||||
|
||||
@@ -174,15 +174,7 @@ static void st7586_pipe_enable(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *plane_state)
|
||||
{
|
||||
struct mipi_dbi_dev *dbidev = drm_to_mipi_dbi_dev(pipe->crtc.dev);
|
||||
struct drm_shadow_plane_state *shadow_plane_state = to_drm_shadow_plane_state(plane_state);
|
||||
struct drm_framebuffer *fb = plane_state->fb;
|
||||
struct mipi_dbi *dbi = &dbidev->dbi;
|
||||
struct drm_rect rect = {
|
||||
.x1 = 0,
|
||||
.x2 = fb->width,
|
||||
.y1 = 0,
|
||||
.y2 = fb->height,
|
||||
};
|
||||
int idx, ret;
|
||||
u8 addr_mode;
|
||||
|
||||
@@ -242,9 +234,6 @@ static void st7586_pipe_enable(struct drm_simple_display_pipe *pipe,
|
||||
|
||||
msleep(100);
|
||||
|
||||
st7586_fb_dirty(&shadow_plane_state->data[0], fb, &rect,
|
||||
&shadow_plane_state->fmtcnv_state);
|
||||
|
||||
mipi_dbi_command(dbi, MIPI_DCS_SET_DISPLAY_ON);
|
||||
out_exit:
|
||||
drm_dev_exit(idx);
|
||||
|
||||
@@ -129,7 +129,7 @@ static void st7735r_pipe_enable(struct drm_simple_display_pipe *pipe,
|
||||
|
||||
msleep(20);
|
||||
|
||||
mipi_dbi_enable_flush(dbidev, crtc_state, plane_state);
|
||||
backlight_enable(dbidev->backlight);
|
||||
out_exit:
|
||||
drm_dev_exit(idx);
|
||||
}
|
||||
|
||||
@@ -177,7 +177,8 @@ static void yx240qv29_enable(struct drm_simple_display_pipe *pipe,
|
||||
break;
|
||||
}
|
||||
mipi_dbi_command(dbi, MIPI_DCS_SET_ADDRESS_MODE, addr_mode);
|
||||
mipi_dbi_enable_flush(dbidev, crtc_state, plane_state);
|
||||
|
||||
backlight_enable(dbidev->backlight);
|
||||
out_exit:
|
||||
drm_dev_exit(idx);
|
||||
}
|
||||
|
||||
@@ -96,7 +96,8 @@ static void yx240qv29_enable(struct drm_simple_display_pipe *pipe,
|
||||
}
|
||||
addr_mode |= ILI9163_MADCTL_BGR;
|
||||
mipi_dbi_command(dbi, MIPI_DCS_SET_ADDRESS_MODE, addr_mode);
|
||||
mipi_dbi_enable_flush(dbidev, crtc_state, plane_state);
|
||||
|
||||
backlight_enable(dbidev->backlight);
|
||||
out_exit:
|
||||
drm_dev_exit(idx);
|
||||
}
|
||||
|
||||
@@ -184,16 +184,8 @@ static void ili9225_pipe_enable(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *plane_state)
|
||||
{
|
||||
struct mipi_dbi_dev *dbidev = drm_to_mipi_dbi_dev(pipe->crtc.dev);
|
||||
struct drm_shadow_plane_state *shadow_plane_state = to_drm_shadow_plane_state(plane_state);
|
||||
struct drm_framebuffer *fb = plane_state->fb;
|
||||
struct device *dev = pipe->crtc.dev->dev;
|
||||
struct mipi_dbi *dbi = &dbidev->dbi;
|
||||
struct drm_rect rect = {
|
||||
.x1 = 0,
|
||||
.x2 = fb->width,
|
||||
.y1 = 0,
|
||||
.y2 = fb->height,
|
||||
};
|
||||
int ret, idx;
|
||||
u8 am_id;
|
||||
|
||||
@@ -284,9 +276,6 @@ static void ili9225_pipe_enable(struct drm_simple_display_pipe *pipe,
|
||||
|
||||
ili9225_command(dbi, ILI9225_DISPLAY_CONTROL_1, 0x1017);
|
||||
|
||||
ili9225_fb_dirty(&shadow_plane_state->data[0], fb, &rect,
|
||||
&shadow_plane_state->fmtcnv_state);
|
||||
|
||||
out_exit:
|
||||
drm_dev_exit(idx);
|
||||
}
|
||||
|
||||
@@ -133,7 +133,8 @@ static void yx240qv29_enable(struct drm_simple_display_pipe *pipe,
|
||||
}
|
||||
addr_mode |= ILI9341_MADCTL_BGR;
|
||||
mipi_dbi_command(dbi, MIPI_DCS_SET_ADDRESS_MODE, addr_mode);
|
||||
mipi_dbi_enable_flush(dbidev, crtc_state, plane_state);
|
||||
|
||||
backlight_enable(dbidev->backlight);
|
||||
out_exit:
|
||||
drm_dev_exit(idx);
|
||||
}
|
||||
|
||||
@@ -155,7 +155,8 @@ static void waveshare_enable(struct drm_simple_display_pipe *pipe,
|
||||
}
|
||||
addr_mode |= ILI9486_MADCTL_BGR;
|
||||
mipi_dbi_command(dbi, MIPI_DCS_SET_ADDRESS_MODE, addr_mode);
|
||||
mipi_dbi_enable_flush(dbidev, crtc_state, plane_state);
|
||||
|
||||
backlight_enable(dbidev->backlight);
|
||||
out_exit:
|
||||
drm_dev_exit(idx);
|
||||
}
|
||||
|
||||
@@ -137,7 +137,8 @@ static void mi0283qt_enable(struct drm_simple_display_pipe *pipe,
|
||||
}
|
||||
addr_mode |= ILI9341_MADCTL_BGR;
|
||||
mipi_dbi_command(dbi, MIPI_DCS_SET_ADDRESS_MODE, addr_mode);
|
||||
mipi_dbi_enable_flush(dbidev, crtc_state, plane_state);
|
||||
|
||||
backlight_enable(dbidev->backlight);
|
||||
out_exit:
|
||||
drm_dev_exit(idx);
|
||||
}
|
||||
|
||||
@@ -252,7 +252,7 @@ static void panel_mipi_dbi_enable(struct drm_simple_display_pipe *pipe,
|
||||
if (!ret)
|
||||
panel_mipi_dbi_commands_execute(dbi, dbidev->driver_private);
|
||||
|
||||
mipi_dbi_enable_flush(dbidev, crtc_state, plane_state);
|
||||
backlight_enable(dbidev->backlight);
|
||||
out_exit:
|
||||
drm_dev_exit(idx);
|
||||
}
|
||||
|
||||
@@ -176,9 +176,6 @@ enum drm_mode_status mipi_dbi_pipe_mode_valid(struct drm_simple_display_pipe *pi
|
||||
const struct drm_display_mode *mode);
|
||||
void mipi_dbi_pipe_update(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *old_state);
|
||||
void mipi_dbi_enable_flush(struct mipi_dbi_dev *dbidev,
|
||||
struct drm_crtc_state *crtc_state,
|
||||
struct drm_plane_state *plan_state);
|
||||
void mipi_dbi_pipe_disable(struct drm_simple_display_pipe *pipe);
|
||||
int mipi_dbi_pipe_begin_fb_access(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *plane_state);
|
||||
|
||||
Reference in New Issue
Block a user