lkml.org 
[lkml]   [2018]   [Mar]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.9 018/219] drm/sun4i: Fix TCON clock and regmap initialization sequence
    Date
    From: Chen-Yu Tsai <wens@csie.org>

    [ Upstream commit 4c7f16d14a33a9cfb4af9cb780d8a73bcca64a92 ]

    The TCON driver calls sun4i_tcon_init_regmap and sun4i_tcon_init_clocks
    in its bind function. The former creates a regmap and writes to several
    register to clear its configuration to a known default. The latter
    initializes various clocks. This includes enabling the bus clock for
    register access and creating the dotclock.

    In order for the first step's writes to work, the bus clock must be
    enabled which is done in the second step. but the dotclock's ops use
    the regmap created in the first step.

    Rearrange the function calls such that the clocks are initialized before
    the regmap, and split out the dot clock creation to after the regmap is
    initialized.

    Fixes: 9026e0d122ac ("drm: Add Allwinner A10 Display Engine support")
    Signed-off-by: Chen-Yu Tsai <wens@csie.org>
    Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    drivers/gpu/drm/sun4i/sun4i_tcon.c | 22 +++++++++++++++-------
    1 file changed, 15 insertions(+), 7 deletions(-)

    diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.c b/drivers/gpu/drm/sun4i/sun4i_tcon.c
    index c6afb2448655..f2975a1525be 100644
    --- a/drivers/gpu/drm/sun4i/sun4i_tcon.c
    +++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c
    @@ -336,12 +336,11 @@ static int sun4i_tcon_init_clocks(struct device *dev,
    }
    }

    - return sun4i_dclk_create(dev, tcon);
    + return 0;
    }

    static void sun4i_tcon_free_clocks(struct sun4i_tcon *tcon)
    {
    - sun4i_dclk_free(tcon);
    clk_disable_unprepare(tcon->clk);
    }

    @@ -506,22 +505,28 @@ static int sun4i_tcon_bind(struct device *dev, struct device *master,
    return ret;
    }

    + ret = sun4i_tcon_init_clocks(dev, tcon);
    + if (ret) {
    + dev_err(dev, "Couldn't init our TCON clocks\n");
    + goto err_assert_reset;
    + }
    +
    ret = sun4i_tcon_init_regmap(dev, tcon);
    if (ret) {
    dev_err(dev, "Couldn't init our TCON regmap\n");
    - goto err_assert_reset;
    + goto err_free_clocks;
    }

    - ret = sun4i_tcon_init_clocks(dev, tcon);
    + ret = sun4i_dclk_create(dev, tcon);
    if (ret) {
    - dev_err(dev, "Couldn't init our TCON clocks\n");
    - goto err_assert_reset;
    + dev_err(dev, "Couldn't create our TCON dot clock\n");
    + goto err_free_clocks;
    }

    ret = sun4i_tcon_init_irq(dev, tcon);
    if (ret) {
    dev_err(dev, "Couldn't init our TCON interrupts\n");
    - goto err_free_clocks;
    + goto err_free_dotclock;
    }

    ret = sun4i_rgb_init(drm);
    @@ -530,6 +535,8 @@ static int sun4i_tcon_bind(struct device *dev, struct device *master,

    return 0;

    +err_free_dotclock:
    + sun4i_dclk_free(tcon);
    err_free_clocks:
    sun4i_tcon_free_clocks(tcon);
    err_assert_reset:
    @@ -542,6 +549,7 @@ static void sun4i_tcon_unbind(struct device *dev, struct device *master,
    {
    struct sun4i_tcon *tcon = dev_get_drvdata(dev);

    + sun4i_dclk_free(tcon);
    sun4i_tcon_free_clocks(tcon);
    }

    --
    2.14.1
    \
     
     \ /
      Last update: 2022-09-17 16:04    [W:3.503 / U:0.440 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site