From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f169.google.com (mail-pl1-f169.google.com [209.85.214.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1B27A387583 for ; Thu, 26 Feb 2026 05:40:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.169 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772084459; cv=none; b=f5oJKW7sdS5Dl6bT6o2FJujTwPwE7HYnfmKHA53UNlJQTSLLefNq8H7mBFniUGE4ZFR2whihDDp5O/gH0ajWgfDsYlDciEbCUhHhjBheitua+EXakU667axNluP1WD2qvmLQ+93t9WGSaOPIIx3T59cQXkQbJypySMiil0JwJIw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772084459; c=relaxed/simple; bh=IHUuUsvpGlnLM4yHfGPnWG2ZQvQGkIAE8S9I+XFQDY0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qzMhx5g1/vCZ5KlnEv03Uz+9nYWlrApkNJrDwjH2wVA4oT/1QvccUMHmzjPDCZBzyOEAdD6nTQO3SEab72NJ3v6/30jpTfkK2cP+nnkncJ/F+gooTJtAGR8uD51IKsSPNvRy2kKQNseEsl+9bWS+mc+0c5ezeh4bpz3ZsqB/5k8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=VhskgLD2; arc=none smtp.client-ip=209.85.214.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="VhskgLD2" Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-2adcede372cso1708355ad.0 for ; Wed, 25 Feb 2026 21:40:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772084457; x=1772689257; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=VaZyUwACUA0Qe6gGb/aYaVkPcTkTUmYev0wediivZlU=; b=VhskgLD2HCKQ5f2kFtLWzd0RPjBhbY75qPZWbMOigeW3HPm0OTCi/xAcZwnEwosrJb v7kdv+9bOX5bqH9vuCOLPrpMO2FSJVvyFLg8HmHGrqjuRG8JZFNDatZApOKJX45+dNv8 QVTJCNsxYwkrNM336pxoi5UbTCRe/XK7Za0E3UzgztJR1SkE9PVeB6uyOa67rXgNOSFw zJcpifIk4z3WJ/J77RMwxsxqpHn2YOgAzxibHApBx7STkcDwCbkzRK6U6KorEdMkBVkY nuOcW4ykI6+yDTcTyYFYSRVebMf99sv+HrlU+ZMxS8i1tv0DE2qWt5vRPmUr8sxTT/wN 3K8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772084457; x=1772689257; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=VaZyUwACUA0Qe6gGb/aYaVkPcTkTUmYev0wediivZlU=; b=CFvOjewDg9TKgHPuvm3dL5kW0aNkuh/XHYBYjNFla9GqNIGeCpmlS6lqMB5dQYnhx5 y2axHGzo5Az1nbtMTNMifRuPHi5YAwpxeRFrq34/KbJxCJwZQsMye5sPvkdsIBQc+IOi gNLwOCg7ZPdwijqhYRAJ/qEn69PWFlhlk1xJZqwwhXB1IYgJoSX1dE286OofqFOUXoSy JdMjPtB6djNbRH5oY/JKg3Eqp+rDi45h9ej3YX67v1aoUwLv/O6e4MqR9kXcgVRit07z vhQH7NPOSd9g0qbWa0eSRc07FlizKjeW9TegNnocC4l1a/o1F2+lNIg/6bSLOkqgR48R NKLA== X-Forwarded-Encrypted: i=1; AJvYcCUIX+eD38eeIhi7WdNyDuPN3xwZ1cKCPBG3g2CAwYFhzEKEVvUHrN3aMtd9KlswVMeYcfAkMzYbUFXotaE=@vger.kernel.org X-Gm-Message-State: AOJu0YzpDMh6i57id1z8KvEGGo8lgtO69Sv6Qv0Q2/dwh10r/D+cpVZB vpyZGoM7GUHqpQa/GASfSRRpZayMplB60MHQZfw0BoFaWDwQzTapp123 X-Gm-Gg: ATEYQzw3fDVMDlxK2DK0uaRFwOTD/sGZKeGu+KdT54kU1DkUL8Nm38lI49SE3saYTMw jpvV/uFwCeziy0rz5okwioMrmoYro9BGWh3SscRykh0AnfSeXwPgT7GPP8WRIzqTCoGtGeEjxt8 duI9SrvE3wgypDir9Wjtllsk2wQ9u7mV08I2VBtIQybOXssgoZjNxUtiZEpbVylE4H4LzIUJGjt 8DZ/vF9Gh4OAhFlTEbMP9tmety8VprsI3rcvHGlh0N1d7buwUm3/ijWGqJ3lcoFMgdHxolFUJ75 HA6fAl0rh9wKVrre1ROQBapbnWbsmpixluTojv8CrjmjsIBi49iYYtAznjaCqc9ALSz5wJHilv0 Nz6ZTM/aC8RZxYZgXsWmz2mU6q80+X8OyTkopFLRBC/2yNZPmc1+F10wonm9B5+cy+xxPEGlvhr bVBffZC5WigqkZIxrHoOhtIT0XSDn7jq1zIJ7wC6UwNm6NI8H76du5WdzwUA== X-Received: by 2002:a17:903:98d:b0:2a7:3dbe:353d with SMTP id d9443c01a7336-2ae03705fb6mr11325425ad.53.1772084457349; Wed, 25 Feb 2026 21:40:57 -0800 (PST) Received: from phuc-desktop.. ([183.91.15.56]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2adfb6f3436sm17026575ad.88.2026.02.25.21.40.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Feb 2026 21:40:56 -0800 (PST) From: phucduc.bui@gmail.com To: phucduc.bui@gmail.com Cc: airlied@gmail.com, dri-devel@lists.freedesktop.org, geert+renesas@glider.be, laurent.pinchart@ideasonboard.com, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, maarten.lankhorst@linux.intel.com, mripard@kernel.org, simona@ffwll.ch, tzimmermann@suse.de Subject: [PATCH v2] drm: shmobile: Fix blank screen after resume when LCDC is stopped Date: Thu, 26 Feb 2026 12:40:35 +0700 Message-ID: <20260226054035.30330-1-phucduc.bui@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260226051338.27460-1-phucduc.bui@gmail.com> References: <20260226051338.27460-1-phucduc.bui@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: bui duc phuc The LCDC controller on R8A7740 loses its register state during deep sleep. Upon resume, the driver's Mirror Register mechanism (MRS) fails to update active registers because the controller is stopped (DO=0). According to the datasheet (Section 38.7.1, Figure 38.13), the Two-Set Register Switching logic only triggers a change between Set A and Set B when a Frame End Interrupt occurs at the completion of a display frame. During resume, as the LCDC is stopped, no frame is processed and no Frame End pulse is generated. This leaves the Display Data Start Address (SA) pending in the standby set, while the active register (Side A) remains at 0x00000000, preventing the display engine from starting.Debug logs collected during resume confirm this behavior, showing the start address written to the standby set while the active register remains unchanged. Prime both register sets when the LCDC is stopped: If DO=0: Use lcdc_write() to force the Start Address (SA) into both Set A and Set B registers. This bypasses the switching logic and ensures the engine has a valid base address immediately upon being enabled. If DO=1: Maintain the standard Mirror mechanism and MRS toggle for normal, tear-free operation. Verified on R8A7740. Signed-off-by: bui duc phuc --- Changes in v2: - Fix incorrect use of lcdc_write_mirror() for LDSA2R in the DO=0 path; use lcdc_write() to update both register sets as intended. .../gpu/drm/renesas/shmobile/shmob_drm_plane.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/renesas/shmobile/shmob_drm_plane.c b/drivers/gpu/drm/renesas/shmobile/shmob_drm_plane.c index 9d166ab2af8b..6371bdc2371a 100644 --- a/drivers/gpu/drm/renesas/shmobile/shmob_drm_plane.c +++ b/drivers/gpu/drm/renesas/shmobile/shmob_drm_plane.c @@ -70,6 +70,7 @@ static void shmob_drm_primary_plane_setup(struct shmob_drm_plane *splane, struct shmob_drm_plane_state *sstate = to_shmob_plane_state(state); struct shmob_drm_device *sdev = to_shmob_device(splane->base.dev); struct drm_framebuffer *fb = state->fb; + u32 ldcnt2r; /* TODO: Handle YUV colorspaces. Hardcode REC709 for now. */ lcdc_write(sdev, LDDFR, sstate->format->lddfr | LDDFR_CF1); @@ -78,11 +79,19 @@ static void shmob_drm_primary_plane_setup(struct shmob_drm_plane *splane, /* Word and long word swap. */ lcdc_write(sdev, LDDDSR, sstate->format->ldddsr); - lcdc_write_mirror(sdev, LDSA1R, sstate->dma[0]); - if (shmob_drm_format_is_yuv(sstate->format)) - lcdc_write_mirror(sdev, LDSA2R, sstate->dma[1]); + ldcnt2r = lcdc_read(sdev, LDCNT2R); + + if (ldcnt2r & LDCNT2R_DO) { + lcdc_write_mirror(sdev, LDSA1R, sstate->dma[0]); + if (shmob_drm_format_is_yuv(sstate->format)) + lcdc_write_mirror(sdev, LDSA2R, sstate->dma[1]); - lcdc_write(sdev, LDRCNTR, lcdc_read(sdev, LDRCNTR) ^ LDRCNTR_MRS); + lcdc_write(sdev, LDRCNTR, lcdc_read(sdev, LDRCNTR) ^ LDRCNTR_MRS); + } else { + lcdc_write(sdev, LDSA1R, sstate->dma[0]); + if (shmob_drm_format_is_yuv(sstate->format)) + lcdc_write(sdev, LDSA2R, sstate->dma[1]); + } } static void shmob_drm_overlay_plane_setup(struct shmob_drm_plane *splane, -- 2.43.0