From nobody Fri Jun 19 07:53:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ACB6F1552FD for ; Sun, 26 Apr 2026 00:20:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162836; cv=none; b=LjjihwB3JnUWHkKwXiF/6DJvfSEOmYedKTqu/z+XdP79jLL4wJHTL7aLirL3iXw+zZzI4CBrZcPCgZo7h8PmJkJBGOf0UyD9uGxiL3UZYnuH2/J0kL4DOlcv403yHerZCFYk7Fp+71z3CoQYiZBioq2SA2jxt1UG2DCv+1lruHY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162836; c=relaxed/simple; bh=+dJ/23iHbtk2/12b3JiLDopSaHxNe/BUJmE1pAxYI74=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GVt3hkNJD5Bmgaj9wj7o2/vjDsECH/tYD1GdOLN717XlP3xbU/aWuhSN4EJth074W3KO6eJmRgTQx1bsPPuJYfYOGCwHRjUnIFQfetFPcO+57HGAKVrQjlOohVEAtogtCdRwdRV/PuKiAXzz1Gz7zwjxI5f/kgzma8v6rnXiDAM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=ZD+yP5MU; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="ZD+yP5MU" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1777162828; bh=+dJ/23iHbtk2/12b3JiLDopSaHxNe/BUJmE1pAxYI74=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=ZD+yP5MUDK32Eh5pM4t+KlmIgUaw03KgTUQVrkF9LJSYh13eLLW1FVEL8WioKJQIg JAIJXpxezKfWCjGZfgSuXeCliPvD+uZiqHYtjctwQ7D8uux2EKoKKD7kmVBDRj/RNZ 41AEKaZQF5BJvL0TX7AqC8jsf1/jcKuM7/J2JYReMdc447lKD6WOuiyviRs5mYhzjQ zrsQrdw44DySgqkh5/inx1kVSIewspyeVdAy9p54IWwHtQLPzemc+P3rFqWIQQhyBE uWW9IjsXEdEhq4YUr9Toot2hVR1pB6pbsNnl/OhO+nBRoP7QZPsRUVuqW+KW3HnpD0 8iCYxSCbIjaHw== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 073B317E0EB6; Sun, 26 Apr 2026 02:20:28 +0200 (CEST) From: Cristian Ciocaltea Date: Sun, 26 Apr 2026 03:20:13 +0300 Subject: [PATCH v5 01/10] drm/bridge: Remove redundant error check in drm_bridge_helper_reset_crtc() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260426-dw-hdmi-qp-scramb-v5-1-d778e70c317b@collabora.com> References: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> In-Reply-To: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.1 Remove the no-op error check after drm_atomic_helper_reset_crtc() since the goto target is the immediately following label and the return value is already propagated correctly without it. Signed-off-by: Cristian Ciocaltea Reviewed-by: Dmitry Baryshkov --- drivers/gpu/drm/drm_bridge_helper.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/gpu/drm/drm_bridge_helper.c b/drivers/gpu/drm/drm_brid= ge_helper.c index 420f29cf3e54..0a3c8fee66b3 100644 --- a/drivers/gpu/drm/drm_bridge_helper.c +++ b/drivers/gpu/drm/drm_bridge_helper.c @@ -50,8 +50,6 @@ int drm_bridge_helper_reset_crtc(struct drm_bridge *bridg= e, =20 crtc =3D connector->state->crtc; ret =3D drm_atomic_helper_reset_crtc(crtc, ctx); - if (ret) - goto out; =20 out: drm_modeset_unlock(&dev->mode_config.connection_mutex); --=20 2.53.0 From nobody Fri Jun 19 07:53:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7726E156C6A for ; Sun, 26 Apr 2026 00:20:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162838; cv=none; b=AJ+4fNWks7NVePUKo1J/DOCLi9eeFnjM4SE1YPoA2PW9jfVFiGUYs6/vtQGb2TjJ3wWh4dICx/u88umvNT5JcpG37463i0CqdfUfimdwltYvznUDuM/b+VYqBU9h6/z9ZZ03OpnU62jK/da0PCq9UJPnaoCTPmCRqcVlFWai1ak= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162838; c=relaxed/simple; bh=PhCBUZ9LP1QlSA5Vw3scKGIP9YUqVnd7mb1z6jP2Cgg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=awFlk2DowaG259RJMyxP3RHghyJweJRh/OF6djAitJHbwrXtKoJHD0/b76u+U6tK/PXnfcrNYdMlqwjPEnrkmO1ybJkfDLD4JkWvJ32V1zh5X3/zMT61R24GIfCAW2K4xDe3WhS4ZBUNXE8HpkB5l5mptU880O1sKLVoR6pOVf4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=aIwmUvhZ; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="aIwmUvhZ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1777162828; bh=PhCBUZ9LP1QlSA5Vw3scKGIP9YUqVnd7mb1z6jP2Cgg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=aIwmUvhZYNxAN75eBf2UNQliuzeBxHsJEEbVb1RCVGgUbMO9qeL5XU9gid7Qrzye8 vZkHT8VBBeas2OJ0FZF5CXqEHikha37LCjau4Uc8gcgM/lzXbak/Dj5RcMYSyGhxrw /FRaR/J1Tz1PWz7ey2u+rR1LErU2N7UXhaDzJsAMQDAuVnx0eH2lnggmtMYAWrxoEs F2vN8moPy3BQJCfofzBJyJ0kPN4vb5gkQUDB8RXZC1gCoRLUTbjbF/6uS/TyPbTvJ3 gGv9a+cs3ensFHMv7bt5+2UDsBHPF2dbZzL+X9i6tIlbMZINdi0aoxaRSvEWvTHti/ JG2M/y0yUJqiQ== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id B7BAB17E107E; Sun, 26 Apr 2026 02:20:28 +0200 (CEST) From: Cristian Ciocaltea Date: Sun, 26 Apr 2026 03:20:14 +0300 Subject: [PATCH v5 02/10] drm/bridge: Add detect_ctx hook and drm_bridge_detect_ctx() helper Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260426-dw-hdmi-qp-scramb-v5-2-d778e70c317b@collabora.com> References: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> In-Reply-To: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Diederik de Haas , Maud Spierings X-Mailer: b4 0.15.1 Add an atomic-aware .detect_ctx() callback to drm_bridge_funcs and a drm_bridge_detect_ctx() helper that accepts an optional drm_modeset_acquire_ctx. This enables bridge drivers to perform operations requiring modeset locking during connector detection, such as SCDC management for HDMI 2.0. When both ->detect_ctx and ->detect are defined, the former takes precedence. When ctx is NULL, locking is managed internally with EDEADLK retry. Tested-by: Diederik de Haas Tested-by: Maud Spierings Signed-off-by: Cristian Ciocaltea Acked-by: Heiko Stuebner --- drivers/gpu/drm/drm_bridge.c | 66 ++++++++++++++++++++++++++++++++++++++++= ---- include/drm/drm_bridge.h | 43 +++++++++++++++++++++++++---- 2 files changed, 98 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c index 986e4c79a4e0..a5c6c2ea4ba6 100644 --- a/drivers/gpu/drm/drm_bridge.c +++ b/drivers/gpu/drm/drm_bridge.c @@ -1361,9 +1361,9 @@ EXPORT_SYMBOL(drm_atomic_bridge_chain_check); * @connector: attached connector * * If the bridge supports output detection, as reported by the - * DRM_BRIDGE_OP_DETECT bridge ops flag, call &drm_bridge_funcs.detect for= the - * bridge and return the connection status. Otherwise return - * connector_status_unknown. + * DRM_BRIDGE_OP_DETECT bridge ops flag, call &drm_bridge_funcs.detect_ctx + * or &drm_bridge_funcs.detect for the bridge and return the connection st= atus. + * Otherwise return connector_status_unknown. * * RETURNS: * The detection status on success, or connector_status_unknown if the bri= dge @@ -1372,12 +1372,68 @@ EXPORT_SYMBOL(drm_atomic_bridge_chain_check); enum drm_connector_status drm_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connect= or) { + return drm_bridge_detect_ctx(bridge, connector, NULL); +} +EXPORT_SYMBOL_GPL(drm_bridge_detect); + +/** + * drm_bridge_detect_ctx - check if anything is attached to the bridge out= put + * @bridge: bridge control structure + * @connector: attached connector + * @ctx: acquire_ctx, or NULL to let this function handle locking + * + * If the bridge supports output detection, as reported by the + * DRM_BRIDGE_OP_DETECT bridge ops flag, call &drm_bridge_funcs.detect_ctx + * or &drm_bridge_funcs.detect for the bridge and return the connection st= atus. + * Otherwise return connector_status_unknown. + * + * RETURNS: + * The detection status on success, or connector_status_unknown if the bri= dge + * doesn't support output detection. + * If @ctx is set, it might also return -EDEADLK. + */ +int drm_bridge_detect_ctx(struct drm_bridge *bridge, + struct drm_connector *connector, + struct drm_modeset_acquire_ctx *ctx) +{ + struct drm_modeset_acquire_ctx br_ctx; + int ret; + if (!(bridge->ops & DRM_BRIDGE_OP_DETECT)) return connector_status_unknown; =20 - return bridge->funcs->detect(bridge, connector); + if (!bridge->funcs->detect_ctx) + return bridge->funcs->detect(bridge, connector); + + if (ctx) { + ret =3D bridge->funcs->detect_ctx(bridge, connector, ctx); + if (ret =3D=3D -EDEADLK) + return ret; + + goto out; + } + + drm_modeset_acquire_init(&br_ctx, 0); +retry: + ret =3D drm_modeset_lock(&connector->dev->mode_config.connection_mutex, + &br_ctx); + if (!ret) + ret =3D bridge->funcs->detect_ctx(bridge, connector, &br_ctx); + + if (ret =3D=3D -EDEADLK) { + drm_modeset_backoff(&br_ctx); + goto retry; + } + + drm_modeset_drop_locks(&br_ctx); + drm_modeset_acquire_fini(&br_ctx); +out: + if (WARN_ON(ret < 0)) + ret =3D connector_status_unknown; + + return ret; } -EXPORT_SYMBOL_GPL(drm_bridge_detect); +EXPORT_SYMBOL_GPL(drm_bridge_detect_ctx); =20 /** * drm_bridge_get_modes - fill all modes currently valid for the sink into= the diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index d6cd0f5af045..6c751b96c3c9 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -535,10 +535,12 @@ struct drm_bridge_funcs { * * Check if anything is attached to the bridge output. * - * This callback is optional, if not implemented the bridge will be - * considered as always having a component attached to its output. - * Bridges that implement this callback shall set the - * DRM_BRIDGE_OP_DETECT flag in their &drm_bridge->ops. + * This is the non-atomic version of detect_ctx() callback, and is + * optional. If both are implemented, it is ignored. If none is + * implemented, the bridge will be considered as always having a + * component attached to its output. Bridges that implement this + * callback shall set the DRM_BRIDGE_OP_DETECT flag in their + * &drm_bridge->ops. * * RETURNS: * @@ -547,6 +549,32 @@ struct drm_bridge_funcs { enum drm_connector_status (*detect)(struct drm_bridge *bridge, struct drm_connector *connector); =20 + /** + * @detect_ctx: + * + * Check if anything is attached to the bridge output. + * + * This is the atomic version of detect() callback, and is optional. + * If both are implemented, it takes precedence. If none is implemented, + * the bridge will be considered as always having a component attached + * to its output. Bridges that implement this callback shall set the + * DRM_BRIDGE_OP_DETECT flag in their &drm_bridge->ops. + * + * To avoid races against concurrent connector state updates, the + * helper libraries always call this with ctx set to a valid context, + * and &drm_mode_config.connection_mutex will always be locked with + * the ctx parameter set to this ctx. This allows taking additional + * locks as required. + * + * RETURNS: + * + * &drm_connector_status indicating the bridge output status, + * or the error code returned by drm_modeset_lock(), -EDEADLK. + */ + int (*detect_ctx)(struct drm_bridge *bridge, + struct drm_connector *connector, + struct drm_modeset_acquire_ctx *ctx); + /** * @get_modes: * @@ -1002,8 +1030,8 @@ struct drm_bridge_timings { enum drm_bridge_ops { /** * @DRM_BRIDGE_OP_DETECT: The bridge can detect displays connected to - * its output. Bridges that set this flag shall implement the - * &drm_bridge_funcs->detect callback. + * its output. Bridges that set this flag shall implement either the + * &drm_bridge_funcs->detect or &drm_bridge_funcs->detect_ctx callbacks. */ DRM_BRIDGE_OP_DETECT =3D BIT(0), /** @@ -1565,6 +1593,9 @@ drm_atomic_helper_bridge_propagate_bus_fmt(struct drm= _bridge *bridge, =20 enum drm_connector_status drm_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connect= or); +int drm_bridge_detect_ctx(struct drm_bridge *bridge, + struct drm_connector *connector, + struct drm_modeset_acquire_ctx *ctx); int drm_bridge_get_modes(struct drm_bridge *bridge, struct drm_connector *connector); const struct drm_edid *drm_bridge_edid_read(struct drm_bridge *bridge, --=20 2.53.0 From nobody Fri Jun 19 07:53:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A11D31EE7C6 for ; Sun, 26 Apr 2026 00:20:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162839; cv=none; b=Ajf3AhjLlI7BIcRzuLuTNnjV8ETNVz4Ot+jPZacM3o+cTw62mTlTYVhLKkpBdZTzjN2VBb1YjCcjNWesK+IIsnbLd3Tud4ja/eJetvaEBK++MCZRVLxngsEoVKXPYkcHHMyeTUxw7DAtR5seGQemcpHoF6jdpDOakpx+kHqXVPI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162839; c=relaxed/simple; bh=uMG0hACNfX3bzliqXaK+xnuZ45BSVcWVDqUlwDgUeNc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ptYbPWCZ5PgfzosBBcQiyQzBIjfrmzW4ZW2hIvwFydm24+brR4Wn76QU3jEUtxA1IyR4dtsHUfQEqXeVzT6Pur6udEIADjfy7oRgzRoYoyZaBmYnPfaA4/zycY0pIhQW+SbHDW6DnEklLrCyIgzQKDo5q3AIMi6JB2JVwFw+mT4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=pGwUEwbR; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="pGwUEwbR" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1777162829; bh=uMG0hACNfX3bzliqXaK+xnuZ45BSVcWVDqUlwDgUeNc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=pGwUEwbRP5Z6OZqUsiPR+SqKkGyoB0oLNXUkAjOKxrAyPrGga0DRQioyDwzn8STMs 6kkPUAtP+8w5wwRLXIbaTJ3urXrvYTj7QRciiKSdoa++wzUjxtz5K11VIIGPKt6gBx AiESY3sQwsk5WGfKSO/4XYyLrO+3Yxu9N79ymxhd+qwyUfz0v5DGIrgN0tjSY/U2+x 6tNsCy2V1HByg45zVos0GzEUjgIvsxeecZ33K0vv6MH5enKG11fJtJF93Bv/ZVa0w3 90xJr/6pn6Vvz3j9emujiRoeTCJ/6Vp3J294c96wVvdg3fwpJKIBcHDcejnA1uA96X 6+BBnDfUurN8Q== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 862B317E1355; Sun, 26 Apr 2026 02:20:29 +0200 (CEST) From: Cristian Ciocaltea Date: Sun, 26 Apr 2026 03:20:15 +0300 Subject: [PATCH v5 03/10] drm/bridge-connector: Use cached connector status in .get_modes() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260426-dw-hdmi-qp-scramb-v5-3-d778e70c317b@collabora.com> References: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> In-Reply-To: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.1 Replace the active drm_bridge_connector_detect() call in get_modes() with a read of the already-cached connector->status. The .get_modes() callback is only invoked from drm_helper_probe_single_connector_modes(), which has already retrieved the connector status. Calling detect again is redundant and triggers a duplicate hotplug event. This is also a prerequisite for switching to the .detect_ctx() hook, which requires a drm_modeset_acquire_ctx not available in the .get_modes() path. Signed-off-by: Cristian Ciocaltea Reviewed-by: Dmitry Baryshkov --- drivers/gpu/drm/display/drm_bridge_connector.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index 39cc18f78eda..575c09e9cb73 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -294,12 +294,10 @@ static const struct drm_connector_funcs drm_bridge_co= nnector_funcs =3D { static int drm_bridge_connector_get_modes_edid(struct drm_connector *conne= ctor, struct drm_bridge *bridge) { - enum drm_connector_status status; const struct drm_edid *drm_edid; int n; =20 - status =3D drm_bridge_connector_detect(connector, false); - if (status !=3D connector_status_connected) + if (connector->status !=3D connector_status_connected) goto no_edid; =20 drm_edid =3D drm_bridge_edid_read(bridge, connector); --=20 2.53.0 From nobody Fri Jun 19 07:53:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A12E01EFFB7 for ; Sun, 26 Apr 2026 00:20:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162839; cv=none; b=Wa3MSsR5Ku7ES35TCheOd8YdbfYlt2tPSfrmRT3twpoVpJWU1GRRqQKKKkRuZWN3iRaOHDUz+9SqMXXZLUZGx1n0qstcc9U74j5ceydgzoOLGUmTfXm5rX3CFqixiD3g8z0ZmkH4I6DMBbKIghg8ceDeIaz3A/bKkO/on2MK3l0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162839; c=relaxed/simple; bh=fcEbyIihJgnPj9ukFlmFL9wflLXt6+j2bNjwts9etSs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pfSLzhQBQwOV25pTMChZsICnpMhjC5MqabXD5TNOFoCAWw5EpiBpmCVwXKYNQFj0qTyqe7jPSqCYdk7ezFsp5u8CKkDMhIP+gIw4zH+4XY1OxPwkQWizIQ9tO6uK++bewDemzebWQ+nA+YgU7CBHGMmJOYaIP9uChIK1XSO/jo8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=F70LlI41; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="F70LlI41" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1777162830; bh=fcEbyIihJgnPj9ukFlmFL9wflLXt6+j2bNjwts9etSs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=F70LlI41SZmLok+pw8V3ZWgZiveiqVmxaE0V+vvFt31pni8nSviFO+8eLDYc5tgfh Okb+QrBGzjrujGS1qQLxKCPLEiThJp6TaehGeLAu8QHq15XQYzozh+J0O+DgGo9CZR Fw90MfgOVhiJI7YtDQ/wqZsm1bHH96v/bWR+UxLELxypDXk7NG/wOw8qJBcLh2ntJ/ fOQ6AnZL70ezF6JDnRtLD1P+q3woXrF7Ktqtoi0xiG1pdX0tm9Pw04tAKZbhs4/3TB dQJQKPYTd31Q5bm4ZVIY4fRwmbobFbKAhmoxGZDs08J6ZNLmWBZNoqigNKlp+g5pb7 It5Gdmg7ZYyJA== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 43C1A17E1356; Sun, 26 Apr 2026 02:20:30 +0200 (CEST) From: Cristian Ciocaltea Date: Sun, 26 Apr 2026 03:20:16 +0300 Subject: [PATCH v5 04/10] drm/bridge-connector: Switch to .detect_ctx() for connector detection Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260426-dw-hdmi-qp-scramb-v5-4-d778e70c317b@collabora.com> References: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> In-Reply-To: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Diederik de Haas , Maud Spierings X-Mailer: b4 0.15.1 Use the atomic .detect_ctx() connector helper hook and invoke drm_bridge_detect_ctx() to propagate the modeset acquire context to bridge drivers. This enables bridge drivers to perform modeset operations during detection, which is needed for managing SCDC state lost on sink disconnects in HDMI 2.0 scenarios. Tested-by: Diederik de Haas Tested-by: Maud Spierings Signed-off-by: Cristian Ciocaltea Reviewed-by: Dmitry Baryshkov --- drivers/gpu/drm/display/drm_bridge_connector.c | 71 ++++++++++++++--------= ---- 1 file changed, 37 insertions(+), 34 deletions(-) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index 575c09e9cb73..ca2ba7630f6b 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -208,39 +208,6 @@ static void drm_bridge_connector_disable_hpd(struct dr= m_connector *connector) * Bridge Connector Functions */ =20 -static enum drm_connector_status -drm_bridge_connector_detect(struct drm_connector *connector, bool force) -{ - struct drm_bridge_connector *bridge_connector =3D - to_drm_bridge_connector(connector); - struct drm_bridge *detect =3D bridge_connector->bridge_detect; - struct drm_bridge *hdmi =3D bridge_connector->bridge_hdmi; - enum drm_connector_status status; - - if (detect) { - status =3D detect->funcs->detect(detect, connector); - - if (hdmi) - drm_atomic_helper_connector_hdmi_hotplug(connector, status); - - drm_bridge_connector_hpd_notify(connector, status); - } else { - switch (connector->connector_type) { - case DRM_MODE_CONNECTOR_DPI: - case DRM_MODE_CONNECTOR_LVDS: - case DRM_MODE_CONNECTOR_DSI: - case DRM_MODE_CONNECTOR_eDP: - status =3D connector_status_connected; - break; - default: - status =3D connector_status_unknown; - break; - } - } - - return status; -} - static void drm_bridge_connector_force(struct drm_connector *connector) { struct drm_bridge_connector *bridge_connector =3D @@ -278,7 +245,6 @@ static void drm_bridge_connector_reset(struct drm_conne= ctor *connector) =20 static const struct drm_connector_funcs drm_bridge_connector_funcs =3D { .reset =3D drm_bridge_connector_reset, - .detect =3D drm_bridge_connector_detect, .force =3D drm_bridge_connector_force, .fill_modes =3D drm_helper_probe_single_connector_modes, .atomic_duplicate_state =3D drm_atomic_helper_connector_duplicate_state, @@ -291,6 +257,42 @@ static const struct drm_connector_funcs drm_bridge_con= nector_funcs =3D { * Bridge Connector Helper Functions */ =20 +static int drm_bridge_connector_detect_ctx(struct drm_connector *connector, + struct drm_modeset_acquire_ctx *ctx, + bool force) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *detect =3D bridge_connector->bridge_detect; + struct drm_bridge *hdmi =3D bridge_connector->bridge_hdmi; + int ret; + + if (detect) { + ret =3D drm_bridge_detect_ctx(detect, connector, ctx); + if (ret < 0) + return ret; + + if (hdmi) + drm_atomic_helper_connector_hdmi_hotplug(connector, ret); + + drm_bridge_connector_hpd_notify(connector, ret); + } else { + switch (connector->connector_type) { + case DRM_MODE_CONNECTOR_DPI: + case DRM_MODE_CONNECTOR_LVDS: + case DRM_MODE_CONNECTOR_DSI: + case DRM_MODE_CONNECTOR_eDP: + ret =3D connector_status_connected; + break; + default: + ret =3D connector_status_unknown; + break; + } + } + + return ret; +} + static int drm_bridge_connector_get_modes_edid(struct drm_connector *conne= ctor, struct drm_bridge *bridge) { @@ -382,6 +384,7 @@ static int drm_bridge_connector_atomic_check(struct drm= _connector *connector, =20 static const struct drm_connector_helper_funcs drm_bridge_connector_helper= _funcs =3D { .get_modes =3D drm_bridge_connector_get_modes, + .detect_ctx =3D drm_bridge_connector_detect_ctx, .mode_valid =3D drm_bridge_connector_mode_valid, .enable_hpd =3D drm_bridge_connector_enable_hpd, .disable_hpd =3D drm_bridge_connector_disable_hpd, --=20 2.53.0 From nobody Fri Jun 19 07:53:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CDC3C1F4611 for ; Sun, 26 Apr 2026 00:20:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162856; cv=none; b=unsY4/Nj079dwWjTBy8oeN3XH7va7CdBFtMWPgQmqz3kPNBxRYLlNAiShJ7sLiPqOeovDq1K/pc62TZgayeabQ+jTZeJzIHekq8wZvoadiqXND5pbWvFrKpaz8Gwf6lHkMbBRL/J1lzgV+5bCUtX/hTdFujFzOVnQCzP0hQ/ZDk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162856; c=relaxed/simple; bh=HLgbrmIkpMH53FmQgE4bCcWpqN55/CnA4PL79ufqAp0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gEIq5t17JPqIubGViIWie7pxG/EGOuvHmMFFz1wmFr7oRSUB6J3+5FdFarN0f4gDODbvKY1ily0M89rXCDC6RKURIq147HoSJCsZ7eFMsX+ajS3UfZAJKWNllJE90gkUjqu8Z7ETA9eKBE2aek+btmM37f3lPKEmgu6laZT1Cpw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=jEH4WUdJ; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="jEH4WUdJ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1777162831; bh=HLgbrmIkpMH53FmQgE4bCcWpqN55/CnA4PL79ufqAp0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=jEH4WUdJOiMuhU4aCrAowqQ5snidqD5+mfb+mhpwkC7eV3GlYu0aih6Co8t8DOJNa MmBGGgvrMzHcm+BUrww8RuExGr+Peg4WZ7smiRoLXU+g7f9+VFs4FsW0F01PgQwonb vlaX9F3Wp/uqlCJlUmbKD2lMyXEKkw7l0plGYjSRqYco6te8jfEgkDHk1cReTnzXql 78mMd1kkIacwr9E3XUBxuXuqMlfFQrRMZQIqDw/SxQySpaAl0hAia85IeLEC/Fqn6v rgT+8K2zOOQtHclBfNlTOd647z+JcxXsvzh5rH0l0NFwSYPB4jYPlfVMOvxkxM0dRW STQJBzChdAX0Q== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 10F8317E1428; Sun, 26 Apr 2026 02:20:31 +0200 (CEST) From: Cristian Ciocaltea Date: Sun, 26 Apr 2026 03:20:17 +0300 Subject: [PATCH v5 05/10] drm/bridge: dw-hdmi-qp: Add HDMI 2.0 SCDC scrambling and high TMDS clock ratio support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260426-dw-hdmi-qp-scramb-v5-5-d778e70c317b@collabora.com> References: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> In-Reply-To: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Diederik de Haas , Maud Spierings X-Mailer: b4 0.15.1 Enable HDMI 2.0 display modes (e.g. 4K@60Hz) by adding SCDC management for the high TMDS clock ratio and scrambling, required when the TMDS character rate exceeds the 340 MHz HDMI 1.4b limit. A periodic work item monitors the sink's scrambling status to recover from sink-side resets. On hotplug detect, if SCDC scrambling state is out of sync with the driver, trigger a CRTC reset to re-establish the link. Reject modes requiring TMDS rates above 600 MHz, as those fall in the HDMI 2.1 FRL domain which is not supported. In no_hpd configurations, further restrict to 340 MHz since SCDC requires a connected sink. Tested-by: Diederik de Haas Tested-by: Maud Spierings Signed-off-by: Cristian Ciocaltea Acked-by: Heiko Stuebner --- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 188 +++++++++++++++++++++++= +--- 1 file changed, 172 insertions(+), 16 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/drivers/gpu/drm= /bridge/synopsys/dw-hdmi-qp.c index d649a1cf07f5..c482a8e7da25 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c @@ -2,6 +2,7 @@ /* * Copyright (c) 2021-2022 Rockchip Electronics Co., Ltd. * Copyright (c) 2024 Collabora Ltd. + * Copyright (c) 2025 Amazon.com, Inc. or its affiliates. * * Author: Algea Cao * Author: Cristian Ciocaltea @@ -21,9 +22,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -39,7 +42,9 @@ #define DDC_SEGMENT_ADDR 0x30 =20 #define HDMI14_MAX_TMDSCLK 340000000 +#define HDMI20_MAX_TMDSRATE 600000000 =20 +#define SCDC_MAX_SOURCE_VERSION 0x1 #define SCRAMB_POLL_DELAY_MS 3000 =20 /* @@ -164,6 +169,11 @@ struct dw_hdmi_qp { } phy; =20 unsigned long ref_clk_rate; + + struct drm_connector *curr_conn; + struct delayed_work scramb_work; + bool scramb_enabled; + struct regmap *regm; int main_irq; =20 @@ -749,28 +759,124 @@ static struct i2c_adapter *dw_hdmi_qp_i2c_adapter(st= ruct dw_hdmi_qp *hdmi) return adap; } =20 +static bool dw_hdmi_qp_supports_scrambling(struct drm_display_info *displa= y) +{ + if (!display->is_hdmi) + return false; + + return display->hdmi.scdc.supported && + display->hdmi.scdc.scrambling.supported; +} + +static int dw_hdmi_qp_set_scramb(struct dw_hdmi_qp *hdmi) +{ + bool done; + + dev_dbg(hdmi->dev, "set scrambling\n"); + + done =3D drm_scdc_set_high_tmds_clock_ratio(hdmi->curr_conn, true); + if (!done) + return -EIO; + + done =3D drm_scdc_set_scrambling(hdmi->curr_conn, true); + if (!done) { + drm_scdc_set_high_tmds_clock_ratio(hdmi->curr_conn, false); + return -EIO; + } + + schedule_delayed_work(&hdmi->scramb_work, + msecs_to_jiffies(SCRAMB_POLL_DELAY_MS)); + return 0; +} + +static void dw_hdmi_qp_scramb_work(struct work_struct *work) +{ + struct dw_hdmi_qp *hdmi =3D container_of(to_delayed_work(work), + struct dw_hdmi_qp, + scramb_work); + if (READ_ONCE(hdmi->scramb_enabled) && + !drm_scdc_get_scrambling_status(hdmi->curr_conn)) + dw_hdmi_qp_set_scramb(hdmi); +} + +static void dw_hdmi_qp_enable_scramb(struct dw_hdmi_qp *hdmi) +{ + int ret; + u8 ver; + + if (!dw_hdmi_qp_supports_scrambling(&hdmi->curr_conn->display_info)) + return; + + ret =3D drm_scdc_readb(hdmi->bridge.ddc, SCDC_SINK_VERSION, &ver); + if (ret) { + dev_err(hdmi->dev, "Failed to read SCDC_SINK_VERSION: %d\n", ret); + return; + } + + ret =3D drm_scdc_writeb(hdmi->bridge.ddc, SCDC_SOURCE_VERSION, + min_t(u8, ver, SCDC_MAX_SOURCE_VERSION)); + if (ret) { + dev_err(hdmi->dev, "Failed to write SCDC_SOURCE_VERSION: %d\n", ret); + return; + } + + WRITE_ONCE(hdmi->scramb_enabled, true); + + ret =3D dw_hdmi_qp_set_scramb(hdmi); + if (ret) { + hdmi->scramb_enabled =3D false; + return; + } + + dw_hdmi_qp_write(hdmi, 1, SCRAMB_CONFIG0); + + /* Wait at least 1 ms before resuming TMDS transmission */ + usleep_range(1000, 5000); +} + +static void dw_hdmi_qp_disable_scramb(struct dw_hdmi_qp *hdmi) +{ + if (!hdmi->scramb_enabled) + return; + + dev_dbg(hdmi->dev, "disable scrambling\n"); + + WRITE_ONCE(hdmi->scramb_enabled, false); + cancel_delayed_work_sync(&hdmi->scramb_work); + + dw_hdmi_qp_write(hdmi, 0, SCRAMB_CONFIG0); + + if (hdmi->curr_conn->status =3D=3D connector_status_connected) { + drm_scdc_set_scrambling(hdmi->curr_conn, false); + drm_scdc_set_high_tmds_clock_ratio(hdmi->curr_conn, false); + } +} + static void dw_hdmi_qp_bridge_atomic_enable(struct drm_bridge *bridge, struct drm_atomic_state *state) { struct dw_hdmi_qp *hdmi =3D bridge->driver_private; struct drm_connector_state *conn_state; - struct drm_connector *connector; unsigned int op_mode; =20 - connector =3D drm_atomic_get_new_connector_for_encoder(state, bridge->enc= oder); - if (WARN_ON(!connector)) + hdmi->curr_conn =3D drm_atomic_get_new_connector_for_encoder(state, + bridge->encoder); + if (WARN_ON(!hdmi->curr_conn)) return; =20 - conn_state =3D drm_atomic_get_new_connector_state(state, connector); + conn_state =3D drm_atomic_get_new_connector_state(state, hdmi->curr_conn); if (WARN_ON(!conn_state)) return; =20 - if (connector->display_info.is_hdmi) { + if (hdmi->curr_conn->display_info.is_hdmi) { dev_dbg(hdmi->dev, "%s mode=3DHDMI %s rate=3D%llu bpc=3D%u\n", __func__, drm_hdmi_connector_get_output_format_name(conn_state->hdmi.output_forma= t), conn_state->hdmi.tmds_char_rate, conn_state->hdmi.output_bpc); op_mode =3D 0; hdmi->tmds_char_rate =3D conn_state->hdmi.tmds_char_rate; + + if (conn_state->hdmi.tmds_char_rate > HDMI14_MAX_TMDSCLK) + dw_hdmi_qp_enable_scramb(hdmi); } else { dev_dbg(hdmi->dev, "%s mode=3DDVI\n", __func__); op_mode =3D OPMODE_DVI; @@ -781,7 +887,7 @@ static void dw_hdmi_qp_bridge_atomic_enable(struct drm_= bridge *bridge, dw_hdmi_qp_mod(hdmi, HDCP2_BYPASS, HDCP2_BYPASS, HDCP2LOGIC_CONFIG0); dw_hdmi_qp_mod(hdmi, op_mode, OPMODE_DVI, LINK_CONFIG0); =20 - drm_atomic_helper_connector_hdmi_update_infoframes(connector, state); + drm_atomic_helper_connector_hdmi_update_infoframes(hdmi->curr_conn, state= ); } =20 static void dw_hdmi_qp_bridge_atomic_disable(struct drm_bridge *bridge, @@ -791,14 +897,49 @@ static void dw_hdmi_qp_bridge_atomic_disable(struct d= rm_bridge *bridge, =20 hdmi->tmds_char_rate =3D 0; =20 + dw_hdmi_qp_disable_scramb(hdmi); + + hdmi->curr_conn =3D NULL; hdmi->phy.ops->disable(hdmi, hdmi->phy.data); } =20 -static enum drm_connector_status -dw_hdmi_qp_bridge_detect(struct drm_bridge *bridge, struct drm_connector *= connector) +static int dw_hdmi_qp_reset_crtc(struct dw_hdmi_qp *hdmi, + struct drm_connector *connector, + struct drm_modeset_acquire_ctx *ctx) +{ + u8 config; + int ret; + + ret =3D drm_scdc_readb(hdmi->bridge.ddc, SCDC_TMDS_CONFIG, &config); + if (ret < 0) { + dev_err(hdmi->dev, "Failed to read TMDS config: %d\n", ret); + return ret; + } + + if (!!(config & SCDC_SCRAMBLING_ENABLE) =3D=3D hdmi->scramb_enabled) + return 0; + + drm_atomic_helper_connector_hdmi_hotplug(connector, + connector_status_connected); + /* + * Conform to HDMI 2.0 spec by ensuring scrambled data is not sent + * before configuring the sink scrambling, as well as suspending any + * TMDS transmission while changing the TMDS clock rate in the sink. + */ + + dev_dbg(hdmi->dev, "resetting crtc\n"); + + return drm_bridge_helper_reset_crtc(&hdmi->bridge, ctx); +} + +static int dw_hdmi_qp_bridge_detect_ctx(struct drm_bridge *bridge, + struct drm_connector *connector, + struct drm_modeset_acquire_ctx *ctx) { struct dw_hdmi_qp *hdmi =3D bridge->driver_private; + enum drm_connector_status status; const struct drm_edid *drm_edid; + int ret; =20 if (hdmi->no_hpd) { drm_edid =3D drm_edid_read_ddc(connector, bridge->ddc); @@ -808,7 +949,20 @@ dw_hdmi_qp_bridge_detect(struct drm_bridge *bridge, st= ruct drm_connector *connec return connector_status_disconnected; } =20 - return hdmi->phy.ops->read_hpd(hdmi, hdmi->phy.data); + status =3D hdmi->phy.ops->read_hpd(hdmi, hdmi->phy.data); + + dev_dbg(hdmi->dev, "%s status=3D%d scramb=3D%d\n", __func__, + status, hdmi->scramb_enabled); + + if (status =3D=3D connector_status_connected && hdmi->scramb_enabled) { + ret =3D dw_hdmi_qp_reset_crtc(hdmi, connector, ctx); + if (ret =3D=3D -EDEADLK) + return ret; + if (ret < 0) + status =3D connector_status_unknown; + } + + return status; } =20 static const struct drm_edid * @@ -832,12 +986,12 @@ dw_hdmi_qp_bridge_tmds_char_rate_valid(const struct d= rm_bridge *bridge, { struct dw_hdmi_qp *hdmi =3D bridge->driver_private; =20 - /* - * TODO: when hdmi->no_hpd is 1 we must not support modes that - * require scrambling, including every mode with a clock above - * HDMI14_MAX_TMDSCLK. - */ - if (rate > HDMI14_MAX_TMDSCLK) { + if (hdmi->no_hpd && rate > HDMI14_MAX_TMDSCLK) { + dev_dbg(hdmi->dev, "Unsupported TMDS char rate in no_hpd mode: %lld\n", = rate); + return MODE_CLOCK_HIGH; + } + + if (rate > HDMI20_MAX_TMDSRATE) { dev_dbg(hdmi->dev, "Unsupported TMDS char rate: %lld\n", rate); return MODE_CLOCK_HIGH; } @@ -1197,7 +1351,7 @@ static const struct drm_bridge_funcs dw_hdmi_qp_bridg= e_funcs =3D { .atomic_reset =3D drm_atomic_helper_bridge_reset, .atomic_enable =3D dw_hdmi_qp_bridge_atomic_enable, .atomic_disable =3D dw_hdmi_qp_bridge_atomic_disable, - .detect =3D dw_hdmi_qp_bridge_detect, + .detect_ctx =3D dw_hdmi_qp_bridge_detect_ctx, .edid_read =3D dw_hdmi_qp_bridge_edid_read, .hdmi_tmds_char_rate_valid =3D dw_hdmi_qp_bridge_tmds_char_rate_valid, .hdmi_clear_avi_infoframe =3D dw_hdmi_qp_bridge_clear_avi_infoframe, @@ -1287,6 +1441,8 @@ struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_de= vice *pdev, if (IS_ERR(hdmi)) return ERR_CAST(hdmi); =20 + INIT_DELAYED_WORK(&hdmi->scramb_work, dw_hdmi_qp_scramb_work); + hdmi->dev =3D dev; =20 regs =3D devm_platform_ioremap_resource(pdev, 0); --=20 2.53.0 From nobody Fri Jun 19 07:53:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B5A2421A434 for ; Sun, 26 Apr 2026 00:20:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162854; cv=none; b=PhtkdDe7AQVmEkg4csQ5iJk2iDXBtQ3/KWWXz7M+vTLlQeL9jivwY1cDwL0InoPxDHOWD79z0rjGs8PmAukn456pDh+8IWCYGaOJO1NR2OSGNQ/aLG/f6f2DREXnsmpNCrifHhq47eZ5LVvfxuzytvxx/UbSv+yKf+kVBlmTPHI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162854; c=relaxed/simple; bh=daaKlUmCUDpudTuzdFYTPS5rQ4uiycPChJHZcwEmrbY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fPqOSgF0T0RvW1hOO7gv3WzeWDzB2pOq0ZAi+5qn+2/+fwIGkYtSbMy+iVIEI3JIRZISPVYApBly0fEC+90VzoE7U6YEKCHrMTmln0StEam4jLzS3eRoEE63qCQXy9k12cbgCP9qHTZJmOYxoMFqFa+lErBs7W1/0BTHNwq95Dk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=O/hY7psG; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="O/hY7psG" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1777162832; bh=daaKlUmCUDpudTuzdFYTPS5rQ4uiycPChJHZcwEmrbY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=O/hY7psGbQMYNKGnTUjMNHs6BwdIDA/iuhpIGG/nCM4BdjK/CF4YnuH4tA3ELBRh0 GHBRdTswQPbZlKBvFoGs4AwTdlBGgv9tmLE5H8TCrX1L3l2dxfoLmlOgj1lWCBj03j jvNuDV0Mk6NvOr32FDijUJpvwwTwU8GOU0/ZAEH2yyImEICxstEU0l+r47q1sHD8tg ufs/zhDU5v2bJja1qo98Sdzo1b/XS03+FP8/Gz0bE7eH0V+hsqExCUOSKWjGxhPXF/ +mRAFWtkk6mqiBMwM2532lHUrMBTkzU48GoxnN5xk/P6dcoaroCIw0XVkd3RYTKm5T 0RO3HnGOO1+Lg== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id D8EF817E151B; Sun, 26 Apr 2026 02:20:31 +0200 (CEST) From: Cristian Ciocaltea Date: Sun, 26 Apr 2026 03:20:18 +0300 Subject: [PATCH v5 06/10] drm/bridge: dw-hdmi-qp: Rate limit i2c read error messages Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260426-dw-hdmi-qp-scramb-v5-6-d778e70c317b@collabora.com> References: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> In-Reply-To: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.1 During EDID reads, repeated i2c errors can flood the kernel log: [ 25.361716] dwhdmiqp-rockchip fde80000.hdmi: i2c read error [ 25.363376] dwhdmiqp-rockchip fde80000.hdmi: i2c read error ... [ 25.368671] dwhdmiqp-rockchip fde80000.hdmi: i2c read error [ 25.369440] dwhdmiqp-rockchip fde80000.hdmi: failed to get edid Switch to dev_err_ratelimited() in dw_hdmi_qp_i2c_read() to reduce log spam while still reporting the condition. Signed-off-by: Cristian Ciocaltea Reviewed-by: Heiko Stuebner --- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/drivers/gpu/drm= /bridge/synopsys/dw-hdmi-qp.c index c482a8e7da25..36fbd3831bc4 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c @@ -573,7 +573,7 @@ static int dw_hdmi_qp_i2c_read(struct dw_hdmi_qp *hdmi, dev_dbg_ratelimited(hdmi->dev, "i2c read timed out\n"); else - dev_err(hdmi->dev, "i2c read timed out\n"); + dev_err_ratelimited(hdmi->dev, "i2c read timed out\n"); dw_hdmi_qp_write(hdmi, 0x01, I2CM_CONTROL0); return -EAGAIN; } @@ -584,7 +584,7 @@ static int dw_hdmi_qp_i2c_read(struct dw_hdmi_qp *hdmi, dev_dbg_ratelimited(hdmi->dev, "i2c read error\n"); else - dev_err(hdmi->dev, "i2c read error\n"); + dev_err_ratelimited(hdmi->dev, "i2c read error\n"); dw_hdmi_qp_write(hdmi, 0x01, I2CM_CONTROL0); return -EIO; } --=20 2.53.0 From nobody Fri Jun 19 07:53:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8B76F19ADA4 for ; Sun, 26 Apr 2026 00:20:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162840; cv=none; b=l85fWPdpNdnum0CNwBCXLgkgUvNXQp8HwVlXhAN5hkcQE+THwXmFpz6rck3By6Qtix9Sz+AkkKKOzjDg7e6NaS8Nnys8sy++0faoMoKTtW31lILe6dG2vtivSzDoqreEWXjm1clZcF8ko3fydMtohr7qIxQguPIstDxtfvEN0aU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162840; c=relaxed/simple; bh=THRDf5htJ4mAr3jc8Jb30WPyiei6X+041IHBxWgkQOc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=POL2pSMI/ME4HsPWAPt3DDJHQvrKAwDONoATc/AD7BVv/DGvQRMchFan9PPAHC7uYzKxoUxkK4H1hVH/d7JpZDiCR3oV5chmFSwOO8+4pNvdvf3TMAzM5GYN5fNfkE2prSUnZI/I97ALrQQ9oVuhG0UhmArN8vMUOiaioxk2APw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=pGKDOPxW; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="pGKDOPxW" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1777162832; bh=THRDf5htJ4mAr3jc8Jb30WPyiei6X+041IHBxWgkQOc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=pGKDOPxWeT06o7VwrYUhaDhRPBhm15il//5AZGwWV60QMU644HohKkNotTtfqXvSe q4HrwbCKx/XNQ/CXkZGOCqHPXFLJFUxoyCWFyU35eIp9rXKsA+dWGzYew850BJui4m TzmDVxWHtljBgOvNAc+ffSA4wkREdwzDRCc82n5r87fmxhyiHPMEqbB+qslLpMs69k E0NmH6tlftJAX2Vy8GAzh+rhk6DWb9a6miU2VmT2ujoQUEkpw9vS7ncHXHGNKUf91X 2/UHf9XdjHW91H2IdXLBPAGeeQzqprE/4ePSlVTj+qcjnMLf3JKjQ4soq0/tB3AnZ0 0tWDvQBN958Cw== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 9C88717E154C; Sun, 26 Apr 2026 02:20:32 +0200 (CEST) From: Cristian Ciocaltea Date: Sun, 26 Apr 2026 03:20:19 +0300 Subject: [PATCH v5 07/10] drm/rockchip: dw_hdmi_qp: Add missing newlines in dev_err_probe() messages Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260426-dw-hdmi-qp-scramb-v5-7-d778e70c317b@collabora.com> References: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> In-Reply-To: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.1 Add the missing trailing newlines to a couple of dev_err_probe() calls in dw_hdmi_qp_rockchip_bind(). Signed-off-by: Cristian Ciocaltea Reviewed-by: Heiko Stuebner --- drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c b/drivers/gpu/d= rm/rockchip/dw_hdmi_qp-rockchip.c index c78db7f8ab6c..d9333ad8996b 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c @@ -589,14 +589,14 @@ static int dw_hdmi_qp_rockchip_bind(struct device *de= v, struct device *master, drm_encoder_helper_add(encoder, &dw_hdmi_qp_rockchip_encoder_helper_funcs= ); ret =3D drmm_encoder_init(drm, encoder, NULL, DRM_MODE_ENCODER_TMDS, NULL= ); if (ret) - return dev_err_probe(hdmi->dev, ret, "Failed to init encoder"); + return dev_err_probe(hdmi->dev, ret, "Failed to init encoder\n"); =20 platform_set_drvdata(pdev, hdmi); =20 hdmi->hdmi =3D dw_hdmi_qp_bind(pdev, encoder, &plat_data); if (IS_ERR(hdmi->hdmi)) return dev_err_probe(hdmi->dev, PTR_ERR(hdmi->hdmi), - "Failed to bind dw-hdmi-qp"); + "Failed to bind dw-hdmi-qp\n"); =20 connector =3D drm_bridge_connector_init(drm, encoder); if (IS_ERR(connector)) --=20 2.53.0 From nobody Fri Jun 19 07:53:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8B80A2066DE for ; Sun, 26 Apr 2026 00:20:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162840; cv=none; b=soVXzh/9wVduyn+fdvRWVR6OymnW6j03JAb96vB3XhDZpxTlWVdVfhGNm6lNP/Z0TgrS8IeRfj/Dv4FIdxqlahBfVX8vIKa3ia8cMMdY+iWEXJZ8S7G9vFP77Ik8uK6J4stiiiAgh1Nx/S9rgvqXt7LAQHuTE4S/VBDx4TqtUU0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162840; c=relaxed/simple; bh=mcYcKV11L+FkP12+dnD49x//O1Dzy8xiVIwcEdLrxGI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=I5gbC39Iy5vEoCa+85ds0RpXBhaH+yJ/6fdDv+csjVSAYBqFIq1EHuH/YyI58ToaevbT7ZgEeJKfKhEQ2TEZEXWWqaJth40QXIT96BI0tVEZ4yxL17iD5AC0QpYbtuC91VPjAd6sxkmd5VTE6CCNVs09JuvuZwA3WuSzrV6TmuE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=MTuGRBfH; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="MTuGRBfH" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1777162833; bh=mcYcKV11L+FkP12+dnD49x//O1Dzy8xiVIwcEdLrxGI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=MTuGRBfH0HNSdgxO5ZKxaL/IUG23A04JImGeqPqSW2ay5NXaHcxF+XSbPwOlMRipQ LLUMm3/0cZlLltBULm03RFKvBvnlPvypZEZqOvASG+9u5mG0eNp3B94J4RDULoE4qu 1rJZo4ZoKMEuXZAXNGYnTcs26W3+G2mUbYYLSRci+mQ6bqR5d+7grNFAyK/dgXAqCM nDwUlQQEcdSCkp9XB8UlFwOWuXrakaKX6SUMqIzIe68Zto3UvWk6PdaPiIZ2iH4A9Z Y523duFh8kR7VrIayDMSsWlclxizFsfy1GqTAf3GFs6eEIIakE8jvHx90o4UC0zAl0 FAiTBkvls3zpg== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 5EE3717E157E; Sun, 26 Apr 2026 02:20:33 +0200 (CEST) From: Cristian Ciocaltea Date: Sun, 26 Apr 2026 03:20:20 +0300 Subject: [PATCH v5 08/10] drm/rockchip: dw_hdmi_qp: Use local dev variable consistently in bind() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260426-dw-hdmi-qp-scramb-v5-8-d778e70c317b@collabora.com> References: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> In-Reply-To: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.1 Replace indirect struct device accesses via hdmi->dev and pdev->dev with the local dev parameter already available in dw_hdmi_qp_rockchip_bind(), for consistency and readability. Signed-off-by: Cristian Ciocaltea Reviewed-by: Heiko Stuebner --- drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c | 33 +++++++++++++---------= ---- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c b/drivers/gpu/d= rm/rockchip/dw_hdmi_qp-rockchip.c index d9333ad8996b..618d2aaa5c7d 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c @@ -475,7 +475,7 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev,= struct device *master, struct clk *ref_clk; int ret, irq, i; =20 - if (!pdev->dev.of_node) + if (!dev->of_node) return -ENODEV; =20 hdmi =3D drmm_kzalloc(drm, sizeof(*hdmi), GFP_KERNEL); @@ -495,7 +495,7 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev,= struct device *master, return dev_err_probe(dev, -ENODEV, "Missing platform ctrl ops\n"); =20 hdmi->ctrl_ops =3D cfg->ctrl_ops; - hdmi->dev =3D &pdev->dev; + hdmi->dev =3D dev; hdmi->port_id =3D -ENODEV; =20 /* Identify port ID by matching base IO address */ @@ -506,7 +506,7 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev,= struct device *master, } } if (hdmi->port_id < 0) - return dev_err_probe(hdmi->dev, hdmi->port_id, + return dev_err_probe(dev, hdmi->port_id, "Failed to match HDMI port ID\n"); =20 plat_data.phy_ops =3D cfg->phy_ops; @@ -530,37 +530,36 @@ static int dw_hdmi_qp_rockchip_bind(struct device *de= v, struct device *master, hdmi->regmap =3D syscon_regmap_lookup_by_phandle(dev->of_node, "rockchip,grf"); if (IS_ERR(hdmi->regmap)) - return dev_err_probe(hdmi->dev, PTR_ERR(hdmi->regmap), + return dev_err_probe(dev, PTR_ERR(hdmi->regmap), "Unable to get rockchip,grf\n"); =20 hdmi->vo_regmap =3D syscon_regmap_lookup_by_phandle(dev->of_node, "rockchip,vo-grf"); if (IS_ERR(hdmi->vo_regmap)) - return dev_err_probe(hdmi->dev, PTR_ERR(hdmi->vo_regmap), + return dev_err_probe(dev, PTR_ERR(hdmi->vo_regmap), "Unable to get rockchip,vo-grf\n"); =20 - ret =3D devm_clk_bulk_get_all_enabled(hdmi->dev, &clks); + ret =3D devm_clk_bulk_get_all_enabled(dev, &clks); if (ret < 0) - return dev_err_probe(hdmi->dev, ret, "Failed to get clocks\n"); + return dev_err_probe(dev, ret, "Failed to get clocks\n"); =20 - ref_clk =3D clk_get(hdmi->dev, "ref"); + ref_clk =3D clk_get(dev, "ref"); if (IS_ERR(ref_clk)) - return dev_err_probe(hdmi->dev, PTR_ERR(ref_clk), + return dev_err_probe(dev, PTR_ERR(ref_clk), "Failed to get ref clock\n"); =20 plat_data.ref_clk_rate =3D clk_get_rate(ref_clk); clk_put(ref_clk); =20 - hdmi->frl_enable_gpio =3D devm_gpiod_get_optional(hdmi->dev, "frl-enable", + hdmi->frl_enable_gpio =3D devm_gpiod_get_optional(dev, "frl-enable", GPIOD_OUT_LOW); if (IS_ERR(hdmi->frl_enable_gpio)) - return dev_err_probe(hdmi->dev, PTR_ERR(hdmi->frl_enable_gpio), + return dev_err_probe(dev, PTR_ERR(hdmi->frl_enable_gpio), "Failed to request FRL enable GPIO\n"); =20 hdmi->phy =3D devm_of_phy_get_by_index(dev, dev->of_node, 0); if (IS_ERR(hdmi->phy)) - return dev_err_probe(hdmi->dev, PTR_ERR(hdmi->phy), - "Failed to get phy\n"); + return dev_err_probe(dev, PTR_ERR(hdmi->phy), "Failed to get phy\n"); =20 cfg->ctrl_ops->io_init(hdmi); =20 @@ -578,7 +577,7 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev,= struct device *master, if (irq < 0) return irq; =20 - ret =3D devm_request_threaded_irq(hdmi->dev, irq, + ret =3D devm_request_threaded_irq(dev, irq, cfg->ctrl_ops->hardirq_callback, cfg->ctrl_ops->irq_callback, IRQF_SHARED, "dw-hdmi-qp-hpd", @@ -589,18 +588,18 @@ static int dw_hdmi_qp_rockchip_bind(struct device *de= v, struct device *master, drm_encoder_helper_add(encoder, &dw_hdmi_qp_rockchip_encoder_helper_funcs= ); ret =3D drmm_encoder_init(drm, encoder, NULL, DRM_MODE_ENCODER_TMDS, NULL= ); if (ret) - return dev_err_probe(hdmi->dev, ret, "Failed to init encoder\n"); + return dev_err_probe(dev, ret, "Failed to init encoder\n"); =20 platform_set_drvdata(pdev, hdmi); =20 hdmi->hdmi =3D dw_hdmi_qp_bind(pdev, encoder, &plat_data); if (IS_ERR(hdmi->hdmi)) - return dev_err_probe(hdmi->dev, PTR_ERR(hdmi->hdmi), + return dev_err_probe(dev, PTR_ERR(hdmi->hdmi), "Failed to bind dw-hdmi-qp\n"); =20 connector =3D drm_bridge_connector_init(drm, encoder); if (IS_ERR(connector)) - return dev_err_probe(hdmi->dev, PTR_ERR(connector), + return dev_err_probe(dev, PTR_ERR(connector), "Failed to init bridge connector\n"); =20 return drm_connector_attach_encoder(connector, encoder); --=20 2.53.0 From nobody Fri Jun 19 07:53:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 16E5A1FBC8C for ; Sun, 26 Apr 2026 00:20:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162839; cv=none; b=TCo9H4b+mS3tytmlpu8GFa43jVgjj69OgK7tu0xHDdRZrqGC6DV1oFOs+vabJkI7m+VyT07NJuvulTJqTCKlUFFypjLHZJCG9epo+gxT1JCHZQcTH04e1xh14+nNK3Dr1W06k3lDK5i68iZM5z6FbGPYXZTD1SUAKWtKihq2rfc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162839; c=relaxed/simple; bh=5kASBU3GsBMjHatuU+YV504wwp/sbOi2o2abJZ2QQFg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=V5tpKUbLDwZ5iOuC5idom0jh5XClAQ/DK00Av/hvjwCijcDeApRioo6i8GoqKmIlzilt+HeiMHzN83OxIefw3tgJUhI6JdCw4hUVqR8JlVbeEEit/njZIBtaAT1kU8hW/GseWl9TvZ7Pmjkz/ctw2ak7jXRNY4aiV5x1s6sMmXk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=jKlv9Stq; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="jKlv9Stq" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1777162834; bh=5kASBU3GsBMjHatuU+YV504wwp/sbOi2o2abJZ2QQFg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=jKlv9Stqk0OdTwliz5rWrHZoLU3pxCb3Go4sOlAgQ+wJtp6WfuztMJ/surqtjU1t8 RDwRF+hXGjv7P4bTjWV1tM0fGiwpz+oB7k7vDaRNVyzIr2Q+NcIGus/9iUX1KJCTah 8dKY+0jl8jyRPXiQEaAASjhiZ2P3ofzVp3AI0JGYWysY+k6vtsIVgxhuiviJLVxCOv gxKXt6wwXjVe8r6WheKyZ883Hzni71KuGRuO2f8hTUWpW9TGm8agXxNQ6iQFgqUgkX W3w6JzL68GBp3mkuJcwjpw4PLJ4l7VUyCV3kjSi9APoPGre3tPJG94uo2KR7jNUSpu E76Gc0YQKdT2w== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 1CEDB17E1582; Sun, 26 Apr 2026 02:20:34 +0200 (CEST) From: Cristian Ciocaltea Date: Sun, 26 Apr 2026 03:20:21 +0300 Subject: [PATCH v5 09/10] drm/rockchip: dw_hdmi_qp: Register HPD IRQ after connector setup Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260426-dw-hdmi-qp-scramb-v5-9-d778e70c317b@collabora.com> References: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> In-Reply-To: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Diederik de Haas , Maud Spierings X-Mailer: b4 0.15.1 Move devm_request_threaded_irq() to the end of bind(), after drm_bridge_connector_init() and drm_connector_attach_encoder(), to ensure all DRM resources are ready before HPD interrupts can fire. While at it, add error handling for drm_connector_attach_encoder(). Tested-by: Diederik de Haas Tested-by: Maud Spierings Reviewed-by: Heiko Stuebner Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c b/drivers/gpu/d= rm/rockchip/dw_hdmi_qp-rockchip.c index 618d2aaa5c7d..fbbe26f8730c 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c @@ -577,14 +577,6 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev= , struct device *master, if (irq < 0) return irq; =20 - ret =3D devm_request_threaded_irq(dev, irq, - cfg->ctrl_ops->hardirq_callback, - cfg->ctrl_ops->irq_callback, - IRQF_SHARED, "dw-hdmi-qp-hpd", - hdmi); - if (ret) - return ret; - drm_encoder_helper_add(encoder, &dw_hdmi_qp_rockchip_encoder_helper_funcs= ); ret =3D drmm_encoder_init(drm, encoder, NULL, DRM_MODE_ENCODER_TMDS, NULL= ); if (ret) @@ -602,7 +594,15 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev= , struct device *master, return dev_err_probe(dev, PTR_ERR(connector), "Failed to init bridge connector\n"); =20 - return drm_connector_attach_encoder(connector, encoder); + ret =3D drm_connector_attach_encoder(connector, encoder); + if (ret) + return dev_err_probe(dev, ret, "Failed to attach connector\n"); + + return devm_request_threaded_irq(dev, irq, + cfg->ctrl_ops->hardirq_callback, + cfg->ctrl_ops->irq_callback, + IRQF_SHARED, "dw-hdmi-qp-hpd", + hdmi); } =20 static void dw_hdmi_qp_rockchip_unbind(struct device *dev, --=20 2.53.0 From nobody Fri Jun 19 07:53:04 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 071A51F4631 for ; Sun, 26 Apr 2026 00:20:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162842; cv=none; b=PGdvlen7XvLs9OtJgtKlnesp3nOGz/wj59Nndf7gqNAUYzLB9+dXmBaWgNjI4MVsF3vUnxUxsH+QruodvNMwCCfCoqORui6JUANG4f5T5nhKjf/Nk5IVtCUPdgjOwz4xwN+LTKtNyoYtIP0KU6i4jPM5FSxDi+vClVkNGuINFG0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777162842; c=relaxed/simple; bh=jgysKGQ2uKrEiDbiSpIyt4MLZj/8UeOF2e7BOMrKLbA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lCK+NjmTFiUSd/TRsKT6wfqDPY6udZca9fV6H20gx+zEkLIS6BhOYD6+nQ4r16NtwZuq29p8q5wHSi5sqZXjgXGNLab1Jx5et+d2leCfCwrrMRbLeN3P6hHrv+nsIlaDmfsnOkJl5/vFPGMeOy0ENQG2A+rBWq+6PPj8Xb7HLek= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=Mfb60Ypr; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="Mfb60Ypr" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1777162835; bh=jgysKGQ2uKrEiDbiSpIyt4MLZj/8UeOF2e7BOMrKLbA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Mfb60Yprpj/NPTxhsvkSQjfqWSBHgqZO7R2HTsn1Xaa8vaiH7xnfTnvlAKcLaNg65 WkTZ/WQByzwl4aK8TY92PNosZvYthig1rzPiOJxRJ82vW00CVHuww/JLVDGF4cMqZ4 0vGKGb2/EVKVfGWdDwhQegWV4wH70xQLZ6vqZvCS+jd3Kj2+WnBXV7Sgpi0IiyDpTz sAkYeNYrjPLmfhs2HIcKhtIeoDla8h0d1JeMuNBthV2wbrg8cz+OMRg34Dy4dhFpfS hU1f6gI2Y1P7mRNbR6+IixNZFdF1/Vr2pp7XZR5oAQyWhVfRVPGub/qUar8Pxsnlo8 MYaGC6pXR6V4Q== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id D29FB17E15A3; Sun, 26 Apr 2026 02:20:34 +0200 (CEST) From: Cristian Ciocaltea Date: Sun, 26 Apr 2026 03:20:22 +0300 Subject: [PATCH v5 10/10] drm/rockchip: dw_hdmi_qp: Restrict HPD event to the affected connector Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260426-dw-hdmi-qp-scramb-v5-10-d778e70c317b@collabora.com> References: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> In-Reply-To: <20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Diederik de Haas , Maud Spierings X-Mailer: b4 0.15.1 Switch from drm_helper_hpd_irq_event(), which polls all connectors, to drm_connector_helper_hpd_irq_event(), which runs the detect cycle only on the affected connector. This avoids unnecessary work and redundant detect calls on unrelated connectors. Tested-by: Diederik de Haas Tested-by: Maud Spierings Reviewed-by: Heiko Stuebner Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c b/drivers/gpu/d= rm/rockchip/dw_hdmi_qp-rockchip.c index fbbe26f8730c..d6338195a5b7 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c @@ -93,6 +93,7 @@ struct rockchip_hdmi_qp { struct regmap *regmap; struct regmap *vo_regmap; struct rockchip_encoder encoder; + struct drm_connector *connector; struct dw_hdmi_qp *hdmi; struct phy *phy; struct gpio_desc *frl_enable_gpio; @@ -252,11 +253,10 @@ static void dw_hdmi_qp_rk3588_hpd_work(struct work_st= ruct *work) struct rockchip_hdmi_qp *hdmi =3D container_of(work, struct rockchip_hdmi_qp, hpd_work.work); - struct drm_device *drm =3D hdmi->encoder.encoder.dev; bool changed; =20 - if (drm) { - changed =3D drm_helper_hpd_irq_event(drm); + if (hdmi->connector) { + changed =3D drm_connector_helper_hpd_irq_event(hdmi->connector); if (changed) dev_dbg(hdmi->dev, "connector status changed\n"); } @@ -467,7 +467,6 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev,= struct device *master, struct dw_hdmi_qp_plat_data plat_data =3D {}; const struct rockchip_hdmi_qp_cfg *cfg; struct drm_device *drm =3D data; - struct drm_connector *connector; struct drm_encoder *encoder; struct rockchip_hdmi_qp *hdmi; struct resource *res; @@ -589,12 +588,12 @@ static int dw_hdmi_qp_rockchip_bind(struct device *de= v, struct device *master, return dev_err_probe(dev, PTR_ERR(hdmi->hdmi), "Failed to bind dw-hdmi-qp\n"); =20 - connector =3D drm_bridge_connector_init(drm, encoder); - if (IS_ERR(connector)) - return dev_err_probe(dev, PTR_ERR(connector), + hdmi->connector =3D drm_bridge_connector_init(drm, encoder); + if (IS_ERR(hdmi->connector)) + return dev_err_probe(dev, PTR_ERR(hdmi->connector), "Failed to init bridge connector\n"); =20 - ret =3D drm_connector_attach_encoder(connector, encoder); + ret =3D drm_connector_attach_encoder(hdmi->connector, encoder); if (ret) return dev_err_probe(dev, ret, "Failed to attach connector\n"); =20 @@ -612,6 +611,8 @@ static void dw_hdmi_qp_rockchip_unbind(struct device *d= ev, struct rockchip_hdmi_qp *hdmi =3D dev_get_drvdata(dev); =20 cancel_delayed_work_sync(&hdmi->hpd_work); + + hdmi->connector =3D NULL; } =20 static const struct component_ops dw_hdmi_qp_rockchip_ops =3D { @@ -646,8 +647,8 @@ static int __maybe_unused dw_hdmi_qp_rockchip_resume(st= ruct device *dev) =20 dw_hdmi_qp_resume(dev, hdmi->hdmi); =20 - if (hdmi->encoder.encoder.dev) - drm_helper_hpd_irq_event(hdmi->encoder.encoder.dev); + if (hdmi->connector) + drm_connector_helper_hpd_irq_event(hdmi->connector); =20 return 0; } --=20 2.53.0