Re: [PATCH v2] drm: shmobile: Fix blank screen after resume when LCDC is stopped

From: Geert Uytterhoeven

Date: Fri Mar 13 2026 - 04:40:08 EST


Hi Bui,

On Fri, 27 Feb 2026 at 10:57, <phucduc.bui@xxxxxxxxx> wrote:
> > What do you mean by "deep sleep"? s2ram? In upstream, s2ram behaves
> > the same as s2idle, and the LCD works fine after resume from s2ram on
> > my Amadillo, with and without your patch,
>
> > What am I missing?
> > Thanks!
>
> Thank you for your feedback.
>
> To clarify the "deep sleep" context, I have tested both s2idle and deep
> states using:
> - echo freeze > /sys/power/state
> - echo mem > /sys/power/state

OK, same for me.

> On my hardware, the issue is consistently reproducible in both cases,
> resulting in a completely white screen after resume.

TL;DR it depends on kernel config.
With my .config, your patch is not needed (but it doesn't hurt).
With your .config, your patch is needed.
Unfortunately I haven't found yet which config options causes this.
I will send you my .config by personal email.

Your change looks valid to me, so
Reviewed-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx>

> Regarding why it works on your side: I cannot be certain about the
> specific differences in our hardware configurations. However, on my
> setup, the debug traces clearly confirm that the LDSA1R register is
> reset to 0 after resume.
>
> Video demonstration:

[...]

> Detailed Logs and Configuration:

[...]

Thanks for this very detailed information!
Since I did the investigation anyway, here are my results:

1) Using commit a75cb869a8ccc88b + debug info:

I get:

>>> ENTER: shmob_drm_plane_atomic_update
>>> ENTER: shmob_drm_primary_plane_setup
shmob-drm fe940000.lcd-controller: [BEFORE] LDSA1R: A=0x00000000
B=0x00000000 MIRROR=0x00000000

Same as yours, OK

shmob-drm fe940000.lcd-controller: [AFTER MIRROR] LDSA1R:
A=0x00000000 B=0x43a00000 MIRROR=0x43a00000

A and B are similar to yours, B is just a different address, so OK.
In your log, the MIRROR value is truncated, so nothing can be decided.

shmob-drm fe940000.lcd-controller: [AFTER SWAP] LDSA1R:
A=0x00000000 B=0x43a00000 MIRROR=0x43a00000

A and B are similar to yours, so OK
Your MIRROR value is truncated (I don't trust the final zero)

>>> ENTER: shmob_drm_crtc_atomic_enable
>>> ENTER: shmob_drm_plane_atomic_update
>>> ENTER: shmob_drm_primary_plane_setup
shmob-drm fe940000.lcd-controller: [BEFORE] LDSA1R: A=0x00000000
B=0x43a00000 MIRROR=0x00000000

A and B are similar to yours, so OK
Your MIRROR value is truncated, but different from zero!

shmob-drm fe940000.lcd-controller: [AFTER MIRROR] LDSA1R:
A=0x43a00000 B=0x43a00000 MIRROR=0x43a00000

Your A value is zero!
B is similar to yours, so OK
Your MIRROR value is truncated (I don't trust the final zero)

shmob-drm fe940000.lcd-controller: [AFTER SWAP] LDSA1R:
A=0x43a00000 B=0x43a00000 MIRROR=0x43a00000

Your A value is zero!
B is similar to yours, so OK
Your MIRROR value is truncated (I don't trust the final zero)


2) Using commit a75cb869a8ccc88b + debug info + fix:

I get:

shmob-drm: LDCNT2R=0x00000000 (DO=0)
shmob-drm fe940000.lcd-controller: [BEFORE] LDSA1R: A=0x00000000
B=0x00000000 MIRROR=0x00000000
shmob-drm: >>> BRANCH: DO = 0 (Direct write path)

Taking the new path

shmob-drm fe940000.lcd-controller: [AFTER DIRECT WRITE] LDSA1R:
A=0x43a00000 B=0x43a00000 MIRROR=0x43a00000

A is now set, too

>>> ENTER: shmob_drm_crtc_atomic_enable
>>> ENTER: shmob_drm_plane_atomic_update
>>> ENTER: shmob_drm_primary_plane_setup
shmob-drm: LDCNT2R=0x00000003 (DO=1)
shmob-drm fe940000.lcd-controller: [BEFORE] LDSA1R: A=0x43a00000
B=0x43a00000 MIRROR=0x43a00000

A is now set, too

shmob-drm: >>> BRANCH: DO = 1 (Mirror path)
shmob-drm fe940000.lcd-controller: [AFTER MIRROR] LDSA1R:
A=0x43a00000 B=0x43a00000 MIRROR=0x43a00000
shmob-drm fe940000.lcd-controller: [AFTER SWAP] LDSA1R:
A=0x43a00000 B=0x43a00000 MIRROR=0x43a00000

End result is the same as before.

Without the fix, I ended up with the correct value for A, while you didn't.
With the fix, we get the same results.

Using your .config, I get the same results as you did.

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds