lkml.org 
[lkml]   [2021]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 018/243] drm/ingenic: Fix non-OSD mode
    Date
    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
    @@ -455,7 +455,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_hwdesc_f0;
    else
    hwdesc = priv->dma_hwdesc_f1;
    @@ -692,6 +692,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;
    @@ -784,9 +785,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,
    ingenic_drm_primary_formats,
    ARRAY_SIZE(ingenic_drm_primary_formats),
    @@ -798,7 +801,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);

    \
     
     \ /
      Last update: 2021-07-19 19:04    [W:4.114 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site