| From 7b4957684e5d813fcbdc98144e3cc5c4467b3e2e Mon Sep 17 00:00:00 2001 |
| From: Paul Cercueil <paul@crapouillou.net> |
| Date: Sun, 24 Jan 2021 08:55:52 +0000 |
| Subject: drm/ingenic: Fix non-OSD mode |
| |
| From: Paul Cercueil <paul@crapouillou.net> |
| |
| commit 7b4957684e5d813fcbdc98144e3cc5c4467b3e2e upstream. |
| |
| Even though the JZ4740 did not have the OSD mode, it had (according to |
| the documentation) two DMA channels, but there is absolutely no |
| information about how to select the second DMA channel. |
| |
| Make the ingenic-drm driver work in non-OSD mode by using the |
| foreground0 plane (which is bound to the DMA0 channel) as the primary |
| plane, instead of the foreground1 plane, which is the primary plane |
| when in OSD mode. |
| |
| Fixes: 3c9bea4ef32b ("drm/ingenic: Add support for OSD mode") |
| Cc: <stable@vger.kernel.org> # v5.8+ |
| Signed-off-by: Paul Cercueil <paul@crapouillou.net> |
| Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| Tested-by: H. Nikolaus Schaller <hns@goldelico.com> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20210124085552.29146-5-paul@crapouillou.net |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 11 +++++++---- |
| 1 file changed, 7 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c |
| +++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c |
| @@ -553,7 +553,7 @@ static void ingenic_drm_plane_atomic_upd |
| height = state->src_h >> 16; |
| cpp = state->fb->format->cpp[0]; |
| |
| - if (priv->soc_info->has_osd && plane->type == DRM_PLANE_TYPE_OVERLAY) |
| + if (!priv->soc_info->has_osd || plane->type == DRM_PLANE_TYPE_OVERLAY) |
| hwdesc = &priv->dma_hwdescs->hwdesc_f0; |
| else |
| hwdesc = &priv->dma_hwdescs->hwdesc_f1; |
| @@ -809,6 +809,7 @@ static int ingenic_drm_bind(struct devic |
| const struct jz_soc_info *soc_info; |
| struct ingenic_drm *priv; |
| struct clk *parent_clk; |
| + struct drm_plane *primary; |
| struct drm_bridge *bridge; |
| struct drm_panel *panel; |
| struct drm_encoder *encoder; |
| @@ -923,9 +924,11 @@ static int ingenic_drm_bind(struct devic |
| if (soc_info->has_osd) |
| priv->ipu_plane = drm_plane_from_index(drm, 0); |
| |
| - drm_plane_helper_add(&priv->f1, &ingenic_drm_plane_helper_funcs); |
| + primary = priv->soc_info->has_osd ? &priv->f1 : &priv->f0; |
| |
| - ret = drm_universal_plane_init(drm, &priv->f1, 1, |
| + drm_plane_helper_add(primary, &ingenic_drm_plane_helper_funcs); |
| + |
| + ret = drm_universal_plane_init(drm, primary, 1, |
| &ingenic_drm_primary_plane_funcs, |
| priv->soc_info->formats_f1, |
| priv->soc_info->num_formats_f1, |
| @@ -937,7 +940,7 @@ static int ingenic_drm_bind(struct devic |
| |
| drm_crtc_helper_add(&priv->crtc, &ingenic_drm_crtc_helper_funcs); |
| |
| - ret = drm_crtc_init_with_planes(drm, &priv->crtc, &priv->f1, |
| + ret = drm_crtc_init_with_planes(drm, &priv->crtc, primary, |
| NULL, &ingenic_drm_crtc_funcs, NULL); |
| if (ret) { |
| dev_err(dev, "Failed to init CRTC: %i\n", ret); |