lkml.org 
[lkml]   [2019]   [Jan]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.20 071/304] drm: rcar-du: Fix external clock error checks
    Date
    From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>

    [ Upstream commit 63a298f22a6183b5b7536a203596c6570dfcfe8e ]

    The rcar-du driver supports probe deferral for external clocks, but
    implements it badly by checking the wrong pointer due to a bad copy and
    paste. Fix it.

    While at it, reject invalid clocks outright for DU channels that have a
    display PLL, as the external clock is mandatory in that case. This
    avoids a WARN_ON() at runtime.

    Fixes: 1b30dbde8596 ("drm: rcar-du: Add support for external pixel clock")
    Reported-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
    Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
    Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 14 +++++++++-----
    1 file changed, 9 insertions(+), 5 deletions(-)

    diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
    index 17741843cf51..40a9afe818a8 100644
    --- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
    +++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
    @@ -226,9 +226,6 @@ static void rcar_du_crtc_set_display_timing(struct rcar_du_crtc *rcrtc)
    * system clock, and have no internal clock divider.
    */

    - if (WARN_ON(!rcrtc->extclock))
    - return;
    -
    /*
    * The H3 ES1.x exhibits dot clock duty cycle stability issues.
    * We can work around them by configuring the DPLL to twice the
    @@ -1113,9 +1110,16 @@ int rcar_du_crtc_create(struct rcar_du_group *rgrp, unsigned int swindex,
    clk = devm_clk_get(rcdu->dev, clk_name);
    if (!IS_ERR(clk)) {
    rcrtc->extclock = clk;
    - } else if (PTR_ERR(rcrtc->clock) == -EPROBE_DEFER) {
    - dev_info(rcdu->dev, "can't get external clock %u\n", hwindex);
    + } else if (PTR_ERR(clk) == -EPROBE_DEFER) {
    return -EPROBE_DEFER;
    + } else if (rcdu->info->dpll_mask & BIT(hwindex)) {
    + /*
    + * DU channels that have a display PLL can't use the internal
    + * system clock and thus require an external clock.
    + */
    + ret = PTR_ERR(clk);
    + dev_err(rcdu->dev, "can't get dclkin.%u: %d\n", hwindex, ret);
    + return ret;
    }

    init_waitqueue_head(&rcrtc->flip_wait);
    --
    2.19.1
    \
     
     \ /
      Last update: 2019-01-28 18:47    [W:3.738 / U:1.700 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site