Message ID | 20180310110511.14697-1-megous@megous.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sat, Mar 10, 2018 at 12:05:11PM +0100, megous@megous.com wrote: > From: Ondrej Jirman <megous@megous.com> > > Currently the exclusivity is enabled when the rate is set by > the mode setting functions. These functions are called by > mode_set_nofb callback of drm_crc_helper. Then exclusivity > is disabled when tcon is disabled by atomic_disable > callback. > > What happens is that mode_set_nofb can be called once when > mode chnages, and afterwards the system can call atomic_enable > and atomic_disable multiple times without further calls to > mode_set_nofb. > > This happens: > > mode_set_nofb - clk exclusivity is enabled > atomic_enable > atomic_disable - clk exclusivity is disabled > atomic_enable > atomic_disable - clk exclusivity is already disabled, leading to WARN > in clk_rate_exclusive_put > > Solution is to enable exclusivity in sun4i_tcon_channel_set_status. > > Signed-off-by: Ondrej Jirman <megous@megous.com> > Cc: Jernej Skrabec <jernej.skrabec@siol.net> Applied, thanks! Maxime
diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.c b/drivers/gpu/drm/sun4i/sun4i_tcon.c index d4a29847dadd..cc29daa062f7 100644 --- a/drivers/gpu/drm/sun4i/sun4i_tcon.c +++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c @@ -104,6 +104,7 @@ static void sun4i_tcon_channel_set_status(struct sun4i_tcon *tcon, int channel, if (enabled) { clk_prepare_enable(clk); + clk_rate_exclusive_get(clk); } else { clk_rate_exclusive_put(clk); clk_disable_unprepare(clk); @@ -263,7 +264,7 @@ static void sun4i_tcon0_mode_set_common(struct sun4i_tcon *tcon, const struct drm_display_mode *mode) { /* Configure the dot clock */ - clk_set_rate_exclusive(tcon->dclk, mode->crtc_clock * 1000); + clk_set_rate(tcon->dclk, mode->crtc_clock * 1000); /* Set the resolution */ regmap_write(tcon->regs, SUN4I_TCON0_BASIC0_REG, @@ -428,7 +429,7 @@ static void sun4i_tcon1_mode_set(struct sun4i_tcon *tcon, WARN_ON(!tcon->quirks->has_channel_1); /* Configure the dot clock */ - clk_set_rate_exclusive(tcon->sclk1, mode->crtc_clock * 1000); + clk_set_rate(tcon->sclk1, mode->crtc_clock * 1000); /* Adjust clock delay */ clk_delay = sun4i_tcon_get_clk_delay(mode, 1);