Hi Tomi, On Thu, Jan 19, 2023 at 10:49:28AM +0200, Tomi Valkeinen wrote: > On 18/01/2023 23:12, Laurent Pinchart wrote: > > On Tue, Jan 17, 2023 at 03:51:51PM +0200, Tomi Valkeinen wrote: > >> From: Koji Matsuoka <koji.matsuoka.xm@xxxxxxxxxxx> > >> > >> According to H/W manual, LVDCR0 register must be cleared bit by bit when > > > > s@H/W@the hardware/ > > > >> disabling LVDS. > > > > I don't like this much, but I think I'll stop fighting :-) > > > >> Signed-off-by: Koji Matsuoka <koji.matsuoka.xm@xxxxxxxxxxx> > >> Signed-off-by: LUU HOAI <hoai.luu.ub@xxxxxxxxxxx> > >> [tomi.valkeinen: simplified the code a bit] > >> Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@xxxxxxxxxxxxxxxx> > >> --- > >> drivers/gpu/drm/rcar-du/rcar_lvds.c | 27 ++++++++++++++++++++++++++- > >> 1 file changed, 26 insertions(+), 1 deletion(-) > >> > >> diff --git a/drivers/gpu/drm/rcar-du/rcar_lvds.c b/drivers/gpu/drm/rcar-du/rcar_lvds.c > >> index 674b727cdaa2..01800cef1c33 100644 > >> --- a/drivers/gpu/drm/rcar-du/rcar_lvds.c > >> +++ b/drivers/gpu/drm/rcar-du/rcar_lvds.c > >> @@ -87,6 +87,11 @@ static void rcar_lvds_write(struct rcar_lvds *lvds, u32 reg, u32 data) > >> iowrite32(data, lvds->mmio + reg); > >> } > >> > >> +static u32 rcar_lvds_read(struct rcar_lvds *lvds, u32 reg) > >> +{ > >> + return ioread32(lvds->mmio + reg); > >> +} > > > > Could you please move read before write ? > > Sure. > > >> + > >> /* ----------------------------------------------------------------------------- > >> * PLL Setup > >> */ > >> @@ -549,8 +554,28 @@ static void rcar_lvds_atomic_disable(struct drm_bridge *bridge, > >> struct drm_bridge_state *old_bridge_state) > >> { > >> struct rcar_lvds *lvds = bridge_to_rcar_lvds(bridge); > >> + u32 lvdcr0; > >> + > >> + lvdcr0 = rcar_lvds_read(lvds, LVDCR0); > >> + > >> + lvdcr0 &= ~LVDCR0_LVRES; > >> + rcar_lvds_write(lvds, LVDCR0, lvdcr0); > >> + > >> + if (lvds->info->quirks & RCAR_LVDS_QUIRK_GEN3_LVEN) { > >> + lvdcr0 &= ~LVDCR0_LVEN; > >> + rcar_lvds_write(lvds, LVDCR0, lvdcr0); > >> + } > >> + > >> + if (lvds->info->quirks & RCAR_LVDS_QUIRK_PWD) { > >> + lvdcr0 &= ~LVDCR0_PWD; > >> + rcar_lvds_write(lvds, LVDCR0, lvdcr0); > >> + } > >> + > >> + if (!(lvds->info->quirks & RCAR_LVDS_QUIRK_EXT_PLL)) { > >> + lvdcr0 &= ~LVDCR0_PLLON; > >> + rcar_lvds_write(lvds, LVDCR0, lvdcr0); > >> + } > > > > This will leave LVDCR0_BEN and LVDCR0_LVEN on Gen2. Is that fine ? > > I don't know, I don't have the manuals or HW. But your point is a bit > worrying. > > I think we can just do a rcar_lvds_write(lvds, LVDCR0, 0) after the > above shenanigans, to make sure everything is disabled. The HW manual > doesn't tell us to do that, though, on gen3. Do you think that will be a > problem? > > And I'm not fully serious with the last sentence... :-) A write(lvds, LVDCR0, 0) should fix it, I'm fine with that. -- Regards, Laurent Pinchart