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