From nobody Sat Jul 25 00:16:24 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 EE7E646D083; Tue, 21 Jul 2026 17:52: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=1784656361; cv=none; b=KogYY32PGrmbfSt9MB8C0Xas2emhWZLBXz36hJMJnq0nRRe1cnSomKaVPl8t7RWdwjnZQ0s3MRrR+LOM8Hrd6xyxRjxXLkflp4Oh+opmjDRez3riHsK8M80HmaqCuz+/SROQ7tfCa91sZ8rbAT8pAzTwgZRjM9dkVq2rs6A6M+E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784656361; c=relaxed/simple; bh=yqpVLOEejS7yByY/WZUm/x4WfYEFQ2/hVy7t4pQcRKc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hj+JVW2PbSygF3tIqkKNInjDO3WkbVR8wPuXq/BhoOKlGSY4+J/J+TBC1DwBrfrcmQA4zc1fOiZpkSNllvBS4BySu8cxAM/OAp/oIs/pSMWtj/jOlHX63EWJ+HPxN6CD1uGK1JZW7Vd/Cc9nmdMDUhq8+ajyPfRoKrjyiX+L7bA= 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=Pt+YCKQD; 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="Pt+YCKQD" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784656358; bh=yqpVLOEejS7yByY/WZUm/x4WfYEFQ2/hVy7t4pQcRKc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Pt+YCKQDFuazV2YP/mISTPWvqodVtSR3syjtxb/5rmN7rRM1FUQ9M2SBYYP8meOgr bP5cT8PcAdwiHBpHBCT/eX1G9FAZm81qwKD1QKYMkxnwtFJHy6GcaXCidZ22BDMNGd RWb3byBDvmEq7Z0tedti66OZxEmScA630rtyCydLUJ7m6FH7wsv1joMFB94n4GURSM /ZtNDwTvmymMXOa6mxS0ZWJlCj5+3jK0YOhQWwN0Ohm0w1JxtsycgrUl0faRZi5awB dATMXfezosn8g6/KEotYjHs52PNn9/A/pv6hEKc9sFLOhYLu6OvYIf3ykGCANm3UXQ uPkNNfkCEX31g== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id E0BEC17E0909; Tue, 21 Jul 2026 19:52:37 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 95960480028; Tue, 21 Jul 2026 19:52:37 +0200 (CEST) From: Sebastian Reichel Date: Tue, 21 Jul 2026 19:52:31 +0200 Subject: [PATCH v4 01/10] drm/bridge: synopsys: dw-dp: Fix incorrect resource lifetimes in bind callback 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: <20260721-synopsys-dw-dp-improvements-v4-1-f0f4a4ede712@collabora.com> References: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> In-Reply-To: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=9360; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=yqpVLOEejS7yByY/WZUm/x4WfYEFQ2/hVy7t4pQcRKc=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpfseU9XxfDfQ/wHCKHTMPVKMxmMETcyld1v ljF5/WOYqa8Q4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqX7HlAAoJENju1/PI O/qaIcQQAJHNIo3E8159QSmospxKXv9RinRzXEipAwiGBFbT47n3jb/k38wLBV3h7lrkH55yMJV l2VeH7f/680/NXZiI9cmCeedvQeEShND8FxY9wY/q8uoimCLvYvENXw3BLyBrXhJKDrLmVmwPIb ZDHljT2l4Q00vz7diRzJGw6DBzK8Gm9rLw6ROkx/yQhB03Y1I5KBfW5Gm3EC8zc2QLfzp4BdETe zqZMSfUbTdtLnA06W54Y3WimHbjYKi5qDl4E0Mths/U8XQaThhG6hN4u/6mDFg3A8boRTKmhC7B Gc7ebmIcYHclEQlamMsGteqFUOUR3NZx+/Q0CAE8dfeLLdiV6AYMrWtle3EnsEluB3hHChv3F6y TQe1U3qNc4Hox0jYZ3Y09EKpVkmbMo6IW8r3TxQkTXGfyErpbQIYJuW4/o0xR1Vu0+urrdKMFeC BZObxSAGXITDDaqf/tVFIdQU2AIWkHteklc0bXRFU7J08XNG4fUtm1zIv+k4wmnUOEnZwdEydJR 3pkGlmuGD/TkmaJXOe8Vof50UkZpi7tIIwSy8ZlnX8CMAxCfRi1xXcKvuOxaNgPqjugtcSnI4pJ XiZePN5DrPWR5WkO08NreczSBsnrAK5U0cikw+TpVH/hjrIjCyzcByngsNkeOrDPzXOEJpuCtJk ULttGCfo1LPkLdBedP5AnAA== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Currently the Synopsys DesignWare DP controller driver's bind function requests lots of resources using device managed functions. These are free'd on driver removal instead of at unbind time. Fix this discrepancy by introducing a new probe helper function and moving over most of the early resource acquisitions. Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 128 +++++++++++++++-----------= ---- drivers/gpu/drm/rockchip/dw_dp-rockchip.c | 53 ++++++++----- include/drm/bridge/dw_dp.h | 5 +- 3 files changed, 99 insertions(+), 87 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 3445c82e6f50..368e1f85e625 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1954,20 +1954,72 @@ static const struct regmap_config dw_dp_regmap_conf= ig =3D { .rd_table =3D &dw_dp_readable_table, }; =20 -static void dw_dp_phy_exit(void *data) +int dw_dp_bind(struct dw_dp *dp, struct drm_encoder *encoder) { - struct dw_dp *dp =3D data; + struct device *dev =3D dp->dev; + struct drm_bridge *bridge; + int ret; + + bridge =3D &dp->bridge; + bridge->of_node =3D dev->of_node; + bridge->ops =3D DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP= _HPD; + bridge->type =3D DRM_MODE_CONNECTOR_DisplayPort; + bridge->ycbcr_420_allowed =3D true; + + drm_bridge_add(bridge); + + dp->aux.dev =3D dev; + dp->aux.drm_dev =3D encoder->dev; + dp->aux.name =3D dev_name(dev); + dp->aux.transfer =3D dw_dp_aux_transfer; + ret =3D drm_dp_aux_register(&dp->aux); + if (ret) { + dev_err_probe(dev, ret, "Aux register failed\n"); + goto unregister_bridge; + } + + ret =3D drm_bridge_attach(encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CON= NECTOR); + if (ret) { + dev_err_probe(dev, ret, "Failed to attach bridge\n"); + goto unregister_aux; + } + + dw_dp_init_hw(dp); =20 + ret =3D phy_init(dp->phy); + if (ret) { + dev_err_probe(dev, ret, "phy init failed\n"); + goto unregister_aux; + } + + enable_irq(dp->irq); + + return 0; + +unregister_aux: + drm_dp_aux_unregister(&dp->aux); + +unregister_bridge: + drm_bridge_remove(bridge); + + return ret; +} +EXPORT_SYMBOL_GPL(dw_dp_bind); + +void dw_dp_unbind(struct dw_dp *dp) +{ + disable_irq(dp->irq); phy_exit(dp->phy); + drm_dp_aux_unregister(&dp->aux); + drm_bridge_remove(&dp->bridge); } +EXPORT_SYMBOL_GPL(dw_dp_unbind); =20 -struct dw_dp *dw_dp_bind(struct device *dev, struct drm_encoder *encoder, - const struct dw_dp_plat_data *plat_data) +struct dw_dp *dw_dp_probe(struct platform_device *pdev, const struct dw_dp= _plat_data *plat_data) { - struct platform_device *pdev =3D to_platform_device(dev); - struct dw_dp *dp; - struct drm_bridge *bridge; + struct device *dev =3D &pdev->dev; void __iomem *res; + struct dw_dp *dp; int ret; =20 dp =3D devm_drm_bridge_alloc(dev, struct dw_dp, bridge, &dw_dp_bridge_fun= cs); @@ -1976,9 +2028,8 @@ struct dw_dp *dw_dp_bind(struct device *dev, struct d= rm_encoder *encoder, =20 dp->dev =3D dev; dp->pixel_mode =3D plat_data->pixel_mode; - dp->plat_data.max_link_rate =3D plat_data->max_link_rate; - bridge =3D &dp->bridge; + mutex_init(&dp->irq_lock); INIT_WORK(&dp->hpd_work, dw_dp_hpd_work); init_completion(&dp->complete); @@ -2035,69 +2086,20 @@ struct dw_dp *dw_dp_bind(struct device *dev, struct= drm_encoder *encoder, return ERR_CAST(dp->rstc); } =20 - bridge->of_node =3D dev->of_node; - bridge->ops =3D DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP= _HPD; - bridge->type =3D DRM_MODE_CONNECTOR_DisplayPort; - bridge->ycbcr_420_allowed =3D true; - - ret =3D devm_drm_bridge_add(dev, bridge); - if (ret) - return ERR_PTR(ret); - - dp->aux.dev =3D dev; - dp->aux.drm_dev =3D encoder->dev; - dp->aux.name =3D dev_name(dev); - dp->aux.transfer =3D dw_dp_aux_transfer; - ret =3D drm_dp_aux_register(&dp->aux); - if (ret) { - dev_err_probe(dev, ret, "Aux register failed\n"); - return ERR_PTR(ret); - } - - ret =3D drm_bridge_attach(encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CON= NECTOR); - if (ret) { - dev_err_probe(dev, ret, "Failed to attach bridge\n"); - goto unregister_aux; - } - - dw_dp_init_hw(dp); - - ret =3D phy_init(dp->phy); - if (ret) { - dev_err_probe(dev, ret, "phy init failed\n"); - goto unregister_aux; - } - - ret =3D devm_add_action_or_reset(dev, dw_dp_phy_exit, dp); - if (ret) - goto unregister_aux; - dp->irq =3D platform_get_irq(pdev, 0); - if (dp->irq < 0) { - ret =3D dp->irq; - goto unregister_aux; - } + if (dp->irq < 0) + return ERR_PTR(dp->irq); =20 ret =3D devm_request_threaded_irq(dev, dp->irq, NULL, dw_dp_irq, - IRQF_ONESHOT, dev_name(dev), dp); + IRQF_ONESHOT | IRQF_NO_AUTOEN, dev_name(dev), dp); if (ret) { dev_err_probe(dev, ret, "failed to request irq\n"); - goto unregister_aux; + return ERR_PTR(ret); } =20 return dp; - -unregister_aux: - drm_dp_aux_unregister(&dp->aux); - return ERR_PTR(ret); } -EXPORT_SYMBOL_GPL(dw_dp_bind); - -void dw_dp_unbind(struct dw_dp *dp) -{ - drm_dp_aux_unregister(&dp->aux); -} -EXPORT_SYMBOL_GPL(dw_dp_unbind); +EXPORT_SYMBOL_GPL(dw_dp_probe); =20 MODULE_AUTHOR("Andy Yan "); MODULE_DESCRIPTION("DW DP Core Library"); diff --git a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c b/drivers/gpu/drm/ro= ckchip/dw_dp-rockchip.c index b23efb153c9e..005938dc66c9 100644 --- a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_dp-rockchip.c @@ -26,7 +26,7 @@ struct rockchip_dw_dp { struct dw_dp *base; struct device *dev; - struct rockchip_encoder encoder; + struct rockchip_encoder *encoder; }; =20 static int dw_dp_encoder_atomic_check(struct drm_encoder *encoder, @@ -73,37 +73,28 @@ static const struct drm_encoder_helper_funcs dw_dp_enco= der_helper_funcs =3D { =20 static int dw_dp_rockchip_bind(struct device *dev, struct device *master, = void *data) { - struct platform_device *pdev =3D to_platform_device(dev); - const struct dw_dp_plat_data *plat_data; + struct rockchip_dw_dp *dp =3D dev_get_drvdata(dev); struct drm_device *drm_dev =3D data; - struct rockchip_dw_dp *dp; struct drm_encoder *encoder; struct drm_connector *connector; int ret; =20 - dp =3D drmm_kzalloc(drm_dev, sizeof(*dp), GFP_KERNEL); - if (!dp) + dp->encoder =3D drmm_kzalloc(drm_dev, sizeof(*dp->encoder), GFP_KERNEL); + if (!dp->encoder) return -ENOMEM; =20 - dp->dev =3D dev; - platform_set_drvdata(pdev, dp); - - plat_data =3D of_device_get_match_data(dev); - if (!plat_data) - return -ENODEV; - - encoder =3D &dp->encoder.encoder; + encoder =3D &dp->encoder->encoder; encoder->possible_crtcs =3D drm_of_find_possible_crtcs(drm_dev, dev->of_n= ode); - rockchip_drm_encoder_set_crtc_endpoint_id(&dp->encoder, dev->of_node, 0, = 0); + rockchip_drm_encoder_set_crtc_endpoint_id(dp->encoder, dev->of_node, 0, 0= ); =20 ret =3D drmm_encoder_init(drm_dev, encoder, NULL, DRM_MODE_ENCODER_TMDS, = NULL); if (ret) return ret; drm_encoder_helper_add(encoder, &dw_dp_encoder_helper_funcs); =20 - dp->base =3D dw_dp_bind(dev, encoder, plat_data); - if (IS_ERR(dp->base)) - return PTR_ERR(dp->base); + ret =3D dw_dp_bind(dp->base, encoder); + if (ret) + return ret; =20 connector =3D drm_bridge_connector_init(drm_dev, encoder); if (IS_ERR(connector)) { @@ -128,12 +119,30 @@ static const struct component_ops dw_dp_rockchip_comp= onent_ops =3D { .unbind =3D dw_dp_rockchip_unbind, }; =20 -static int dw_dp_probe(struct platform_device *pdev) +static int dw_dp_rockchip_probe(struct platform_device *pdev) { + const struct dw_dp_plat_data *plat_data; + struct device *dev =3D &pdev->dev; + struct rockchip_dw_dp *dp; + + plat_data =3D of_device_get_match_data(dev); + if (!plat_data) + return -ENODEV; + + dp =3D devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL); + if (!dp) + return -ENOMEM; + platform_set_drvdata(pdev, dp); + dp->dev =3D dev; + + dp->base =3D dw_dp_probe(pdev, plat_data); + if (IS_ERR(dp->base)) + return PTR_ERR(dp->base); + return component_add(&pdev->dev, &dw_dp_rockchip_component_ops); } =20 -static void dw_dp_remove(struct platform_device *pdev) +static void dw_dp_rockchip_remove(struct platform_device *pdev) { component_del(&pdev->dev, &dw_dp_rockchip_component_ops); } @@ -161,8 +170,8 @@ static const struct of_device_id dw_dp_of_match[] =3D { MODULE_DEVICE_TABLE(of, dw_dp_of_match); =20 struct platform_driver dw_dp_driver =3D { - .probe =3D dw_dp_probe, - .remove =3D dw_dp_remove, + .probe =3D dw_dp_rockchip_probe, + .remove =3D dw_dp_rockchip_remove, .driver =3D { .name =3D "dw-dp", .of_match_table =3D dw_dp_of_match, diff --git a/include/drm/bridge/dw_dp.h b/include/drm/bridge/dw_dp.h index 22105c3e8e4d..a82412a9e769 100644 --- a/include/drm/bridge/dw_dp.h +++ b/include/drm/bridge/dw_dp.h @@ -22,7 +22,8 @@ struct dw_dp_plat_data { u8 pixel_mode; }; =20 -struct dw_dp *dw_dp_bind(struct device *dev, struct drm_encoder *encoder, - const struct dw_dp_plat_data *plat_data); +int dw_dp_bind(struct dw_dp *dp, struct drm_encoder *encoder); void dw_dp_unbind(struct dw_dp *dp); + +struct dw_dp *dw_dp_probe(struct platform_device *pdev, const struct dw_dp= _plat_data *plat_data); #endif /* __DW_DP__ */ --=20 2.53.0 From nobody Sat Jul 25 00:16:24 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 1C59D46D084; Tue, 21 Jul 2026 17:52:40 +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=1784656361; cv=none; b=M/c6tuptlyQtJ1IaT+rHCF5I3bAH3KLRXU6EryMsviFP+YsVvebGleqVoQmHWM2Cw/b38viWggyqN9h1+5kstT0Mrjfy8A9507DKjFyRXkZG8YepNH80krjwN8MuHWjmz+EpmdjLbGUBOrbI1pZ/KsbQ87rbPxDj1LJmmYIQjXc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784656361; c=relaxed/simple; bh=oiWWXRm0/cQ/tnB5PbRJ+mS8OTFZDOErXBKz7hNNENs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=uAhuT/JJ5bDMSWGvIE5zJCq/0l+SghGPgu/s7O4svhai8aMMPrPIXztEU67wvLBh4Wa5YB2jkIV+0XqkQvBbIXKNbO7dRQaeYy8WJFGUXUyeGXNRTAKaAe3UV6jU0yLbSqp1GyszBPMv0eVwuhc8bK5uyAnU6gJTlFTp+KnvAz0= 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=H5bAbQve; 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="H5bAbQve" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784656358; bh=oiWWXRm0/cQ/tnB5PbRJ+mS8OTFZDOErXBKz7hNNENs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=H5bAbQvewlB4XdutPGbj6v8Dr3pN62frIKGpnVKcOpZXrre9fpvszlLZI2pF1I7GD vqgLlkVhQnBW0G1LOwbpkpP6nUpe+6gRJprAOe4L4eOkNcH8eEVfqKzWezAkODr+03 zev7ByXxzR53mS8MME++MWfjHfz1HQTNdtm6i9VoIHiXwQtDLEbWaAEMNV5LBFimOU feaJEE9cqIuP9WiUAJyqj+oXShHJK97PYlll424S4Q+jeRMSQZ7HlwenrvaI1WOcLZ vmOa43D1W8J0ugbt6vR/juA/z4+8lCkbr/9500y4fbum/a08L/zKZat9sgBN6L83Vv p0OTCSH8libYQ== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id E210917E0FD2; Tue, 21 Jul 2026 19:52:37 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 966E748002C; Tue, 21 Jul 2026 19:52:37 +0200 (CEST) From: Sebastian Reichel Date: Tue, 21 Jul 2026 19:52:32 +0200 Subject: [PATCH v4 02/10] drm/bridge: synopsys: dw-dp: Support MEDIA_BUS_FMT_FIXED 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: <20260721-synopsys-dw-dp-improvements-v4-2-f0f4a4ede712@collabora.com> References: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> In-Reply-To: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1544; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=oiWWXRm0/cQ/tnB5PbRJ+mS8OTFZDOErXBKz7hNNENs=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpfseWaZo8u4YM2fcGoridEgdNIEiwuvkpuW 7qpmL+Fr0D/aokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqX7HlAAoJENju1/PI O/qa6dYP/ifbvNSK+yxLY4zkGyIr/SbYIGC3zGQmLlpTPrmaxm1F/+iN6leUD9VYQumBG4zJt8i t6I/C9H3TvZgFbE3iEC6PxP2LwPw5wUJJlkSfmbR0HEmpeIZqcDpT+mB90BnuAtihlUuzo1ewzA +mPE8tsXvyWBE/Zob6hhimfZTRSsyaAotMb6DQNq3E4upaduciBUCEaO8+MdxrFeekhWezJQU4E SW7xXJAj8SCxogvIzgB4wlsAhZMV8/SSiWaNSfeuAW9W8E8cW8C27TgGDOUCU+PsphCsUIy7Unz USs4PhA2ggY+iabsEH+aR1+WP0x01G69wQg7snBr8QEbAkXFgpZhbuGh6RF6Ye1B7HN5sqtHp1o b9ogXebJiAAP4i5xDmW2dox+8FDEmdMGzfZ2Fzj4iUMJfcrTr9hLrgktGx6KXnt93bVly8VKp0z vNxZBrd/3ykGyA4WM/4cLDrqyaBrkLlRux1Qh8rCKeKG7O97rgd55owO06bdO8L0s4DBHD0+bC8 ITRzrzO1eM+ElpKnBMc3kSt9BIby9qJCEEPG7V5VZmS53+aGN1hxnAV3UySRPY4e0j8ms7zHaD2 J8HqPB5LMw4xmpKjcCoWN8Pn1bw6Py/W57Ar8ez3652NncpS+JNqAEALlPPLGvvRXrwuv/HI3za TASCKJSP3MWU0mrsD4UwxEw== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Add support for MEDIA_BUS_FMT_FIXED, which is e.g. requested for USB-C DP chains as the last bridge in the chain (aux-hpd-bridge) does not implement atomic_get_output_bus_fmts(), which results in the generic drm_atomic_bridge_chain_select_bus_fmts() code using MEDIA_BUS_FMT_FIXED instead. Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 368e1f85e625..aca6816febe6 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1528,6 +1528,7 @@ static int dw_dp_bridge_atomic_check(struct drm_bridg= e *bridge, struct drm_connector_state *conn_state) { struct drm_display_mode *adjusted_mode =3D &crtc_state->adjusted_mode; + unsigned int out_bus_format =3D bridge_state->output_bus_cfg.format; struct dw_dp *dp =3D bridge_to_dp(bridge); struct dw_dp_bridge_state *state; const struct dw_dp_output_format *fmt; @@ -1538,7 +1539,10 @@ static int dw_dp_bridge_atomic_check(struct drm_brid= ge *bridge, state =3D to_dw_dp_bridge_state(bridge_state); mode =3D &state->mode; =20 - fmt =3D dw_dp_get_output_format(bridge_state->output_bus_cfg.format); + if (out_bus_format =3D=3D MEDIA_BUS_FMT_FIXED) + out_bus_format =3D MEDIA_BUS_FMT_RGB888_1X24; + + fmt =3D dw_dp_get_output_format(out_bus_format); if (!fmt) return -EINVAL; =20 --=20 2.53.0 From nobody Sat Jul 25 00:16:24 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 5D96E46D0B2; Tue, 21 Jul 2026 17:52:40 +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=1784656361; cv=none; b=c3ApHG9KPK9ZuIcsuanR1lg9pN+/pnJUQmLIxkrtLuzVRa3iSgNeM6BNadWNYnsB2wS+3RjGy9GbrAHc+cQ2tfdsGfVcIrpmx6FVqY4Y+lSNEJkQ2ctlwy6L1gY6QsJksa88pnz6OhvmP64mFY9I2JCx2ZatbE7FO/0wFVdLy64= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784656361; c=relaxed/simple; bh=F4BrRjFviO71BqTa0/M+DJMgwptFTQA7fNEwqLzoieE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=T4iCWj8dF5+lqKY7auoGrjWgN7cWobuvR5kW89Z5Tvy+y+LM/ob9JLuTvO/4o6IfwKRg+zWjO2k26ZZov0M54jT8j3qPrLCJ19yjGoKqYEpsciHTjp27fakC/ApLNdCRYW1lhKgS/79CJE0iwLY9KI29AEiisFpU6CWqbj3kulA= 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=XMfaaq0D; 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="XMfaaq0D" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784656358; bh=F4BrRjFviO71BqTa0/M+DJMgwptFTQA7fNEwqLzoieE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=XMfaaq0DZkW0JTJElZ6n/tBjEjfcrYdDTEx38afJX/DvZrhqB8amk2d4Ry/11FVJS 4xdtrpDcfbiziG84bOh5xMcL9eF4wLHtYdhrNV3rBFO9/Pv7tbtPYdYfTPxeHdlrzI Gc1+874ps7gdLuye7AhA63n97WPtA6GfSLbDdXA+H1bVCyE62qZQ1DpeJ6qzin7sOS 2uvSLMNGKvIcRhb9cPq7sLWce8D+H/uAhtwoeyv7aVltj4gEP7L46+kyjJBV8FrMY0 L7C/c22PQ/3Z0I0daQ7Eqf3y70RMNstIEBNb5836/Gc5bp1HWK/60VMpN9zHCOpiye u/8DVElLgWo7Q== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id E499017E1078; Tue, 21 Jul 2026 19:52:37 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 9819048002F; Tue, 21 Jul 2026 19:52:37 +0200 (CEST) From: Sebastian Reichel Date: Tue, 21 Jul 2026 19:52:33 +0200 Subject: [PATCH v4 03/10] drm/bridge: synopsys: dw-dp: Add follow-up bridge 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: <20260721-synopsys-dw-dp-improvements-v4-3-f0f4a4ede712@collabora.com> References: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> In-Reply-To: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2769; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=F4BrRjFviO71BqTa0/M+DJMgwptFTQA7fNEwqLzoieE=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpfseXu2xeAkd/HPdm6crAbguEIl46uzZE6g +dqFbJRl5j/04kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqX7HlAAoJENju1/PI O/qaj8UP/3zFA7fAGLscxeldf6FxsgEdelxSp3mitYjuztqDM2nrIS1b8vowQZfijZQRqS/d7n5 I1FSjp6KJ78TdXd21w65YUewsjM5nXdMP8+kGC+cfVwZwRxrBHzZk0g7zlBEoj3cX317qLz0rsI CcVwI9Wd54NpH275UFvlm7yLyUarQbvlTR2zl4K+TiDK8gLwhKuyvDLGLJOfz4ePZhmB+SW5riw PU8viG/InMtGjrG5ucU7MDFG2jbGg5Z0gvPTSB8bFHs2sbjezjvHg9HoZBZ9z/QDN3g5PtimPKk Fgw2HnXPlqJn2/2Up7lgApcj2zhCP70Yx3h81Zd5xOSiTC6zIOWDoHiYfJmQzzT3BXOlc5HpGwl qdf8pGzHQcg6TDQGHKxLaBjjb+y4Fu7fwlzZLHhzPaIHIWmIA0PUlXGnQvyPBuSt+wGiEUehlfj CxTlrKwjsXCdChFcpKI8VLsFy4a12ZSJa0vSq+DnsamQ27iIA933rfzBDqYdBCjBv8pxuFRuidO miV//IbSLyp0KXNVhtfXriOHWCqE7ekMogZ07MbnRv3DOmIkMGLTuuyRxVFsin0Gn7DLV7Dz7LK 19M1+wNbXMQZXDUAPcUS4iny7vGr0zJh6JWasYrUDLj+BcsiebmVrIv1QUpEoWNkNNuqyzjpLv5 8TjC08JHri+hdrpsv2d816g== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Add support to use USB-C connectors with the DP altmode helper code on devicetree based platforms. To get this working there must be a DRM bridge chain from the DisplayPort controller to the USB-C connector. E.g. on Rockchip RK3576: root@rk3576 # cat /sys/kernel/debug/dri/0/encoder-0/bridges bridge[0]: dw_dp_bridge_funcs refcount: 7 type: [10] DP OF: /soc/dp@27e40000:rockchip,rk3576-dp ops: [0x47] detect edid hpd bridge[1]: drm_aux_bridge_funcs refcount: 4 type: [0] Unknown OF: /soc/phy@2b010000:rockchip,rk3576-usbdp-phy ops: [0x0] bridge[2]: drm_aux_hpd_bridge_funcs refcount: 5 type: [10] DP OF: /soc/i2c@2ac50000/typec-portc@22/connector:usb-c-connector ops: [0x4] hpd It's fine to fatally error out when there is no follow-up bridge as the Rockchip Designware Displayport controller is the only user of the bridge helper and has the port marked as required in its binding. Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index aca6816febe6..0e8ecd73a000 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -329,6 +329,8 @@ struct dw_dp { struct dw_dp_plat_data plat_data; u8 pixel_mode; =20 + struct drm_bridge *next_bridge; + DECLARE_BITMAP(sdp_reg_bank, SDP_REG_BANK_SIZE); }; =20 @@ -1988,18 +1990,35 @@ int dw_dp_bind(struct dw_dp *dp, struct drm_encoder= *encoder) goto unregister_aux; } =20 + dp->next_bridge =3D of_drm_get_bridge_by_endpoint(dev->of_node, 1, 0); + if (IS_ERR(dp->next_bridge)) { + ret =3D PTR_ERR(dp->next_bridge); + dev_err_probe(dev, ret, "failed to get follow-up bridge.\n"); + goto unregister_aux; + } + + ret =3D drm_bridge_attach(encoder, dp->next_bridge, bridge, + DRM_BRIDGE_ATTACH_NO_CONNECTOR); + if (ret) { + dev_err_probe(dev, ret, "Failed to attach next bridge\n"); + goto put_next_bridge; + } + dw_dp_init_hw(dp); =20 ret =3D phy_init(dp->phy); if (ret) { dev_err_probe(dev, ret, "phy init failed\n"); - goto unregister_aux; + goto put_next_bridge; } =20 enable_irq(dp->irq); =20 return 0; =20 +put_next_bridge: + drm_bridge_put(dp->next_bridge); + unregister_aux: drm_dp_aux_unregister(&dp->aux); =20 @@ -2014,6 +2033,7 @@ void dw_dp_unbind(struct dw_dp *dp) { disable_irq(dp->irq); phy_exit(dp->phy); + drm_bridge_put(dp->next_bridge); drm_dp_aux_unregister(&dp->aux); drm_bridge_remove(&dp->bridge); } --=20 2.53.0 From nobody Sat Jul 25 00:16:24 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 5261446D0B1; Tue, 21 Jul 2026 17:52:40 +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=1784656361; cv=none; b=arEUARSa7jiiSk3k7bMJFVgkic7ZLJwwPGHEnLJbZo9Sw9Y36/KcRjFfFvC94t4kFYTJB3r5qsgKMpoQBQBB6YeO/1i1R0gog4XRO/rVQChnF8E0MOyz8W2tMdSOgpXOAv7465ZIVmfDEr/5R7EMW2wMBnzDnnYnMyMrMpApSsQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784656361; c=relaxed/simple; bh=9OEEVTGH6CtYBorsugsyey8Z+5Bz4/YUYRXLfK0S0LI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ukPaNDbbeqxMKjbEuinD18nihSAPq6aSqvhZt7166cFBzDvqY7P86pLAJxrrREe1YQdoM6qTjb9aKYeULTAwwL4NXtugBjpCgZ/jv00RO25BSdp39B2dokDxv0e/Nqx256nDTqCIHpOms7jPychzCmlvjZhYP5uZcf1+cWceHCU= 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=VZivdVdP; 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="VZivdVdP" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784656358; bh=9OEEVTGH6CtYBorsugsyey8Z+5Bz4/YUYRXLfK0S0LI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=VZivdVdP33X3exby8TN0qv+TCDYL/lQl/TdISs605cXJL3ubhjEnYht3rvHHp6el/ Dc7QyyPmSgrz82rme9zJTxm+NwBJetDNwjiHU0VBh00pY0vxmBPnrmmFDspAxeSrOd y+/oiPwjAip1JIoRfsrLKptb2QrM5vwD2r6rM3kkhgsUAefs38EzHoIvuuhcaK0evv encYtz8WhAcoeTlyiujjTPjzjxfDEjuVCf8PVpvpAQAk0P/ZX7um6dpP3jzVfDsN+D ReAQIalPAjFamOTSJsuxnTWFynNDS6wHQLPWfQGKWcrHzzj81y3ifEEBBL96z/ZxW9 0WrP5DA8gEFCA== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id E35B817E1064; Tue, 21 Jul 2026 19:52:37 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 99DAD480030; Tue, 21 Jul 2026 19:52:37 +0200 (CEST) From: Sebastian Reichel Date: Tue, 21 Jul 2026 19:52:34 +0200 Subject: [PATCH v4 04/10] drm/bridge: Add out-of-band HPD notify handler 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: <20260721-synopsys-dw-dp-improvements-v4-4-f0f4a4ede712@collabora.com> References: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> In-Reply-To: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2377; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=9OEEVTGH6CtYBorsugsyey8Z+5Bz4/YUYRXLfK0S0LI=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpfseV3Iw/lPbZt2LprMMlfHmFycSj8HNlun 7XgzmGmt5Ku2YkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqX7HlAAoJENju1/PI O/qahgcP/0eop2idDCK50e5ARxK5ljSg3WSVEOfxbihD487+TdZamArvuOt8xWI4cHh4qAUbdyW +RpweD48urRKW1TL7hcwhOwqeWNdC9gsPdGlolg2HHRO41WEh7e5Vs96IdmPqw6G/CbNaqfNz4X zMxb+7oPrDCJJME66gYfue7/LvDAml7FnBoppX1yavtB09LPmA/14wJv6dE0QKvQvr/VQXyGITc oI0VR/L21FS2x1XdNu8YykO17Nx6Uub+36RPCUCYwmiVLyT79/asPwq6V3u+TpLQGCPnjpI0qaC qc8himXvBy/bjC73SytIfP9e3MkLa6ftXJTKBcrfg7imli298nz82rf7CzLOPrl3z5veSNbI3qf gpXiReU58AM81jnhOhaM+0z2FDhGWt1z16l/I6EEhec49v0ycvtoLbXglSpcUhY4GF0BKykJyOq mB6HHHHcNbP3V/nIB+1tY+hxxEe5/KQ+axbjWp5y0BPGVAiENHH2ExCtsDtHUXGsfJfVB7Nowe9 P0NKsjIFP8VZeM1oCvHfvbPzB1ZN9ed4lqwhIYXtXErxS1ia1dAwnkju+1fycuGA3azq9PMCxzl grOKaG26l/USE9lgmuT0mHFH5OCWo0WtzesdHP8c7o19OiJrmGZSX8J8Akj/IlDq8P68yzTWk7E AYey8eHwLBva7Jo5yWsA2Ag== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A For DP bridges, that can be used for DP AltMode, it might be necessary to enforce HPD status. There is an existing ->oob_hotplug_event() on the DRM connector, but it currently just calls into hpd_notify(). As DP bridge drivers usually also implement .detect and that also generates calls into hpd_notify, this is a bad place to force the HPD status as the follow-up detect call might force it off again resulting in all follow-up calls to the detection routine also failing. Avoid this by having a dedicated function for OOB events. Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/display/drm_bridge_connector.c | 6 ++++++ include/drm/drm_bridge.h | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index 8b54069fa53a..632cc3ae3b54 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -180,6 +180,12 @@ static void drm_bridge_connector_oob_hotplug_event(str= uct drm_connector *connect struct drm_bridge_connector *bridge_connector =3D to_drm_bridge_connector(connector); =20 + /* Notify all bridges in the pipeline of hotplug events. */ + drm_for_each_bridge_in_chain(bridge_connector->encoder, bridge) { + if (bridge->funcs->oob_notify) + bridge->funcs->oob_notify(bridge, connector, status); + } + drm_bridge_connector_handle_hpd(bridge_connector, status); } =20 diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index 3ac84ed57ab2..f38010d2edd1 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -540,6 +540,20 @@ struct drm_bridge_funcs { */ void (*hpd_disable)(struct drm_bridge *bridge); =20 + /** + * @oob_notify: + * + * Notify the bridge of out of band hot plug detection. + * + * This callback is optional, it may be implemented by bridges that + * need to be notified of display connection or disconnection for + * internal reasons. One use case is to force the DP controllers HPD + * signal for USB-C DP AltMode. + */ + void (*oob_notify)(struct drm_bridge *bridge, + struct drm_connector *connector, + enum drm_connector_status status); + /** * @hdmi_tmds_char_rate_valid: * --=20 2.53.0 From nobody Sat Jul 25 00:16:24 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 47324472F96; Tue, 21 Jul 2026 17:52:43 +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=1784656365; cv=none; b=RrQjLV3kYt2/tiDiaiuFNa5+ZDA8QFJOWpafJsjlUEXKavZPZHM0SkJBdG+x8Y8xMU+oHjXxcb4dA2bfNVa42MNas4fEgGpdTk3CT3dV/6X19GQbtYWazzzjQAxKzJVogONzxdOasTAEAvEGcvsUTJU42ICt9VGnWVKcOzOSdqg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784656365; c=relaxed/simple; bh=NX4+KWq/USnvfX2Z+8KC7w8NZPVfC1DqfIFgLgnsWAU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EUYVTo7dB96ZdXPye0WvD12SSj+qei5bTgF9D+gU0yGGQHmyaD3KnMac7ofCjx8EuvmErTqYk2ID0YO9MsMWeS6Nsqq7ABOpFF5uxMZ5YPQHYMNUI+we/pH72iUmsbCr7qwC/0m+fYjgip22hmO9p93naQwdKjEwKfQQjLtva7w= 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=F780WKda; 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="F780WKda" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784656358; bh=NX4+KWq/USnvfX2Z+8KC7w8NZPVfC1DqfIFgLgnsWAU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=F780WKdaVgS/clm9bLWexZ91c5oacFL+SwCFa5aPJHGmO28J9i6sv1pWiBDOD/XfR zIbW24ks+d65yUfJJv6/WQqsHmei79IbdlbM5kefNYgW3/tizOE1oTv+igL8yDoIWu EKjOzk2fKV06NVF84zAQXrC6zL0kSw4Lpmyyo7HBqQuDXDA+mxrr0R88xFyimBtKNJ TPukwuK+NVLu23vC/Su5QF/vnztbfJZg8KyF1yDMbk8bn26xoIJIBb/LRFZLNWxV4m xAiSkGn66UYzXnm+ZsySaJndJyBQzp+KT2vjNvYPVQV/K+/Y70i7y6JPwteMYqE58A bQI12m4v77ajg== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 3D28317E10F4; Tue, 21 Jul 2026 19:52:38 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 9B933480031; Tue, 21 Jul 2026 19:52:37 +0200 (CEST) From: Sebastian Reichel Date: Tue, 21 Jul 2026 19:52:35 +0200 Subject: [PATCH v4 05/10] drm/bridge: synopsys: dw-dp: Support software triggered OOB HPD 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: <20260721-synopsys-dw-dp-improvements-v4-5-f0f4a4ede712@collabora.com> References: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> In-Reply-To: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3741; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=NX4+KWq/USnvfX2Z+8KC7w8NZPVfC1DqfIFgLgnsWAU=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpfseVsqZrxg8hV5IpVVkA8sjIHj8/PO6Ob3 XRKUxHpRP+FEYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqX7HlAAoJENju1/PI O/qazq8P/juCssGTc22Ea2JnDCHk7N7/GzlOCIFfKkGf+T2dMg01JnpJb+XpZ38FBLo7t7RWVlH yymThavjEb0X7EohOcRtduFAVXg2HbCkz0QTg5DNxENvdJdLvhDakDk8FBFdMVBYVWxkEjFUxNC TCE7fkpduSObd7L0uaY2Ct/KzO3s4WnaiQUTnq6hmPQJfzxXTX7GGaUYWIEe+clMc1yjWNoeQgw 1ldnrQkQWCJb2cS4tCVm2BFpu2cqlj2eK+hV+67ah3bVXHB+1M27v2/ex9aO0bl2E1BJGOPr2O9 KCwb/uSDtP0Xca2Kxuex3I3Yw/vaORmQ303VqfrjpNrG1pB2Iq/ExxAlZIBYpPVDJAF4PjWqbUY k0JZjpTuXxWvGP4gv0f4sWK9YtUtHWdxBuQFWAwvvcBdvSMQMWbVJpsdK/379rz49xuWZIYaGfd Motx/n9IPeKaPpc8UdbG+xHlVAdiQXed+t+MQqIM0SBtWvObTDOMKabxFEnAJJAlytLRmqxIeXt Wlp1sCGl9O40JQwZXcoWubv2EDHp/BVNDyrrdS1+FWDlZ2GrVQscGSsjbQEVxZCyHZ/a8Y9AdNl RuM49j0Uu+LE8VScrK5gZBuW71RihOKpvCXWMDju4odVi938PdH8mFMr+6C34ncQsxPPzPrW1ft aaNFv/dCfRXNCMUguXew1nA== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Add support for USB-C DP AltMode out-of-band hotplug handling. The handling itself is implemented in the platform specific driver as the registers to force HPD state are not part of the Designware DisplayPort IP itself. Instead the platform integration might provide the necessary functionality to mux the HPD signal. Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 38 +++++++++++++++++++++++++++++= ++++ include/drm/bridge/dw_dp.h | 3 +++ 2 files changed, 41 insertions(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 0e8ecd73a000..8eb2699dc7ab 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1819,6 +1819,19 @@ static struct drm_bridge_state *dw_dp_bridge_atomic_= duplicate_state(struct drm_b return &state->base; } =20 +static void dw_dp_bridge_oob_notify(struct drm_bridge *bridge, + struct drm_connector *connector, + enum drm_connector_status status) +{ + bool hpd_high =3D status !=3D connector_status_disconnected; + struct dw_dp *dp =3D bridge_to_dp(bridge); + + if (dp->plat_data.hpd_sw_cfg) + dp->plat_data.hpd_sw_cfg(dp->plat_data.data, hpd_high); + else + dev_err_once(dp->dev, "Missing platform handler for OOB HPD handling\n"); +} + static const struct drm_bridge_funcs dw_dp_bridge_funcs =3D { .atomic_duplicate_state =3D dw_dp_bridge_atomic_duplicate_state, .atomic_destroy_state =3D drm_atomic_helper_bridge_destroy_state, @@ -1831,6 +1844,7 @@ static const struct drm_bridge_funcs dw_dp_bridge_fun= cs =3D { .atomic_disable =3D dw_dp_bridge_atomic_disable, .detect =3D dw_dp_bridge_detect, .edid_read =3D dw_dp_bridge_edid_read, + .oob_notify =3D dw_dp_bridge_oob_notify, }; =20 static int dw_dp_link_retrain(struct dw_dp *dp) @@ -1960,6 +1974,19 @@ static const struct regmap_config dw_dp_regmap_confi= g =3D { .rd_table =3D &dw_dp_readable_table, }; =20 +static bool dw_dp_is_routed_to_usb_c(struct drm_encoder *encoder) +{ + struct drm_bridge *last_bridge __free(drm_bridge_put) =3D NULL; + struct fwnode_handle *fwnode; + + last_bridge =3D drm_bridge_chain_get_last_bridge(encoder); + if (!last_bridge) + return false; + + fwnode =3D of_fwnode_handle(last_bridge->of_node); + return fwnode_device_is_compatible(fwnode, "usb-c-connector"); +} + int dw_dp_bind(struct dw_dp *dp, struct drm_encoder *encoder) { struct device *dev =3D dp->dev; @@ -2004,6 +2031,13 @@ int dw_dp_bind(struct dw_dp *dp, struct drm_encoder = *encoder) goto put_next_bridge; } =20 + if (dw_dp_is_routed_to_usb_c(encoder)) { + dev_dbg(dev, "USB-C mode\n"); + + if (dp->plat_data.hpd_sw_sel) + dp->plat_data.hpd_sw_sel(dp->plat_data.data, 1); + } + dw_dp_init_hw(dp); =20 ret =3D phy_init(dp->phy); @@ -2052,6 +2086,10 @@ struct dw_dp *dw_dp_probe(struct platform_device *pd= ev, const struct dw_dp_plat_ =20 dp->dev =3D dev; dp->pixel_mode =3D plat_data->pixel_mode; + + dp->plat_data.hpd_sw_sel =3D plat_data->hpd_sw_sel; + dp->plat_data.hpd_sw_cfg =3D plat_data->hpd_sw_cfg; + dp->plat_data.data =3D plat_data->data; dp->plat_data.max_link_rate =3D plat_data->max_link_rate; =20 mutex_init(&dp->irq_lock); diff --git a/include/drm/bridge/dw_dp.h b/include/drm/bridge/dw_dp.h index a82412a9e769..79b2cdf0df99 100644 --- a/include/drm/bridge/dw_dp.h +++ b/include/drm/bridge/dw_dp.h @@ -20,6 +20,9 @@ enum { struct dw_dp_plat_data { u32 max_link_rate; u8 pixel_mode; + void *data; + void (*hpd_sw_sel)(void *data, bool hpd); + void (*hpd_sw_cfg)(void *data, bool hpd); }; =20 int dw_dp_bind(struct dw_dp *dp, struct drm_encoder *encoder); --=20 2.53.0 From nobody Sat Jul 25 00:16:24 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 4763A472F99; Tue, 21 Jul 2026 17:52:43 +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=1784656365; cv=none; b=g7JJbAOI3sS4sNlAnNVOcg5EbDmtLc39fUHUb+8/HRusSAMaODRjOl9LdIPLvOLJ4XRBqf22mZ+/ZPbJkcDslkfa4al7WnedeETHwmA7SGewq7J4+/HdpmAMMRTcQrvVTe2WChQ9i8CHoCHvjyh8Wx/iiwglRTyUmXQdw1u2n68= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784656365; c=relaxed/simple; bh=qOTOYZ7XdbH9KXuuBMAIBJTfbae9QntHhvKhrTx/3vg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OEGTdaFA/SGWFmGeayg0g6gZGDjxQeZMMhygx8Vh/+VnajDUmKnPoZvYjj+ycHZ0LDOPGTTgP/xk0jmO3T4JTtxujvsVWfCBdoCGw9XgSsNqC1HK81kSDBxNUwwSFlQ7uKGpxk30oH9peiTiR4EuoLs2QUol3vQXKhwtW4KIuW0= 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=pWIYAqna; 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="pWIYAqna" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784656358; bh=qOTOYZ7XdbH9KXuuBMAIBJTfbae9QntHhvKhrTx/3vg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=pWIYAqnaU2PFn/P8fw8VY9uZ1Hq37gaFKt6VtkQZs6qTVc5mzE2XBTyxR2eQiTkMF cwKtQSwXZTG/aivV/TlzzG7OXEUlgCsU+aH5BDSImE5pzcaqLNtkhuJJBt+v+0Dz+I X6QUhKU8MJTVz9S8h0kIPPF3VKxJcRKRNUlNWcf8r+sg2e8X85w264rD8mKbhWWnN9 7mXk6yGDs7naDm1kVrNARPonJ1gs5LZbMEGawam6+ooyYwfgYcwbgjlptEdZnWq1eQ P3rM3dKduQFRWvAafQlgqD01aJqdtdly+6MAu6y/F1q7eeOhLbLrAkYTayHJj7ydKA S3B2gygQkJe7w== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 3ED6A17E1122; Tue, 21 Jul 2026 19:52:38 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 9D397480035; Tue, 21 Jul 2026 19:52:37 +0200 (CEST) From: Sebastian Reichel Date: Tue, 21 Jul 2026 19:52:36 +0200 Subject: [PATCH v4 06/10] drm/rockchip: dw_dp: Implement out-of-band HPD handling 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: <20260721-synopsys-dw-dp-improvements-v4-6-f0f4a4ede712@collabora.com> References: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> In-Reply-To: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6359; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=qOTOYZ7XdbH9KXuuBMAIBJTfbae9QntHhvKhrTx/3vg=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpfseVUstl3TidLkmix/O+zvti+pP8nHBLIy 829JQGMPsbUHokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqX7HlAAoJENju1/PI O/qaMLgP/2M5XvSw5XWE58yMNQHDUWu7PGIcPfvlUKZ+QflDEuLhFb1x+4GVfekKJzfWc+eICF/ GrbeDkFjWOoxAV4dm57DO7FRTlsccf7mMBEw4ZErsLS2hdWVN6ZkNWnww+4l+XpP88eQsHBBy6F aTXYhWyk3uzM9u6WGjZRhBPuFBIZTg5yUBLykCZHgmytzkmPmrfJEpVvNAiM/CFluPLUTG3gqG+ EL/4goua6k9dUnSu3N9kRunzrhWG4rjZ0lwKtae4fbDTXmDDZ5A+fyIr3zHtxaKOmxXscZV58uP lmPd50a944pI6cMVjSwxksiICuIRkpKWEKG6EQx65u3GyEH23VeyTwHhPOrO1QvTRyDbT6zIAD2 FMiV2u0EHT2vrkQ8pNDHVscjKnJOL8ju6xR9HYTCECuHe3bjCk39PSCGUgkPzZDRuSModR1u9mg Fck0Ft5eJ/xIrfud7VKPCZDp/okG5vgY8gPv+oxJJrO1l6/nk0yYtiV/5rP9BkN0xqBH1tWAnJ3 2HJJ0cjbztTVDPjusxxcwVEV6s9+fSWPy/8VzP/7ZUVfHL4LRs5KcCHy/Q993ocCo33q6QtL3h+ 7KnxxT0gf2gFQ8rhvjisAFjiew8aCpItLavUz6atrYF9CB6AwP/0BMPKIQlL6SUummItjubwifX A3A/s10YN9sbkwCjeq+I2Aw== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Implement out-of-band hotplug handling, which will be used to receive external hotplug information from the USB-C state machine. This is currently handled by the USBDP PHY, which brings quite some trouble as the register being accessed requires the power-domain from the DP controller and also requires custom TypeC HPD info parsing in the USBDP PHY driver. In contrast to the USBDP PHY this does not just enable the hotplug signal when a DP AltMode capable adapter is plugged in, but instead properly detects if a cable is plugged in for things like USB-C to HDMI adapters. Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/rockchip/dw_dp-rockchip.c | 123 ++++++++++++++++++++++++++= ++-- 1 file changed, 118 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c b/drivers/gpu/drm/ro= ckchip/dw_dp-rockchip.c index 005938dc66c9..0ecbad24dd4e 100644 --- a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_dp-rockchip.c @@ -7,9 +7,12 @@ */ =20 #include +#include #include +#include #include #include +#include #include =20 #include @@ -23,12 +26,54 @@ =20 #include "rockchip_drm_drv.h" =20 +#define ROCKCHIP_MAX_CTRLS 2 + +#define ROCKCHIP_VO_GRF_DP_SINK_HPD_SEL BIT(10) +#define ROCKCHIP_VO_GRF_DP_SINK_HPD_CFG BIT(11) + +struct rockchip_dw_dp_plat_data { + u8 num_ctrls; + u32 ctrl_ids[ROCKCHIP_MAX_CTRLS]; + u32 max_link_rate; + u8 pixel_mode; + u32 hpd_reg[ROCKCHIP_MAX_CTRLS]; +}; + struct rockchip_dw_dp { struct dw_dp *base; struct device *dev; + const struct rockchip_dw_dp_plat_data *pdata; + struct regmap *vo_grf; struct rockchip_encoder *encoder; + int id; + bool hpd_sel; + bool hpd_cfg; }; =20 +static void dw_dp_rockchip_hpd_sw_sel(void *data, bool force_hpd_from_sw) +{ + struct rockchip_dw_dp *dp =3D data; + u32 hpd_reg =3D dp->pdata->hpd_reg[dp->id]; + + dp->hpd_sel =3D force_hpd_from_sw; + + regmap_write(dp->vo_grf, hpd_reg, + FIELD_PREP_WM16(ROCKCHIP_VO_GRF_DP_SINK_HPD_SEL, dp->hpd_sel)); +} + +static void dw_dp_rockchip_hpd_sw_cfg(void *data, bool hpd) +{ + struct rockchip_dw_dp *dp =3D data; + u32 hpd_reg =3D dp->pdata->hpd_reg[dp->id]; + + dev_dbg(dp->dev, "Force HPD connected=3D%s\n", str_yes_no(hpd)); + + dp->hpd_cfg =3D hpd; + + regmap_write(dp->vo_grf, hpd_reg, + FIELD_PREP_WM16(ROCKCHIP_VO_GRF_DP_SINK_HPD_CFG, dp->hpd_cfg)); +} + static int dw_dp_encoder_atomic_check(struct drm_encoder *encoder, struct drm_crtc_state *crtc_state, struct drm_connector_state *conn_state) @@ -71,6 +116,34 @@ static const struct drm_encoder_helper_funcs dw_dp_enco= der_helper_funcs =3D { .atomic_check =3D dw_dp_encoder_atomic_check, }; =20 +static struct regmap *dp_dp_rockchip_get_vo_grf(struct rockchip_dw_dp *dp) +{ + struct device_node *np =3D dev_of_node(dp->dev); + struct of_phandle_args args; + struct regmap *regmap; + int ret; + + ret =3D of_parse_phandle_with_args(np, "phys", "#phy-cells", 0, &args); + if (ret) + return ERR_PTR(-ENODEV); + + /* + * Limit this workaround to RK3576 and RK3588, new platforms should + * add a VO GRF phandle in the DisplayPort DT node. + */ + if (!of_device_is_compatible(args.np, "rockchip,rk3576-usbdp-phy") && + !of_device_is_compatible(args.np, "rockchip,rk3588-usbdp-phy")) { + regmap =3D ERR_PTR(-ENODEV); + goto out_put_node; + } + + regmap =3D syscon_regmap_lookup_by_phandle(args.np, "rockchip,vo-grf"); + +out_put_node: + of_node_put(args.np); + return regmap; +} + static int dw_dp_rockchip_bind(struct device *dev, struct device *master, = void *data) { struct rockchip_dw_dp *dp =3D dev_get_drvdata(dev); @@ -121,19 +194,53 @@ static const struct component_ops dw_dp_rockchip_comp= onent_ops =3D { =20 static int dw_dp_rockchip_probe(struct platform_device *pdev) { - const struct dw_dp_plat_data *plat_data; + const struct rockchip_dw_dp_plat_data *plat_data_const; + struct dw_dp_plat_data *plat_data; struct device *dev =3D &pdev->dev; struct rockchip_dw_dp *dp; + struct resource *res; + int id; =20 - plat_data =3D of_device_get_match_data(dev); - if (!plat_data) + plat_data_const =3D device_get_match_data(dev); + if (!plat_data_const) return -ENODEV; =20 + plat_data =3D devm_kzalloc(dev, sizeof(*plat_data), GFP_KERNEL); + if (!plat_data) + return -ENOMEM; + dp =3D devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL); if (!dp) return -ENOMEM; platform_set_drvdata(pdev, dp); dp->dev =3D dev; + dp->pdata =3D plat_data_const; + + res =3D platform_get_mem_or_io(pdev, 0); + if (!res) + return -ENODEV; + + /* find the DisplayPort ID from the io address */ + dp->id =3D -ENODEV; + for (id =3D 0; id < plat_data_const->num_ctrls; id++) { + if (res->start =3D=3D plat_data_const->ctrl_ids[id]) { + dp->id =3D id; + break; + } + } + + if (dp->id < 0) + return dp->id; + + dp->vo_grf =3D dp_dp_rockchip_get_vo_grf(dp); + if (IS_ERR(dp->vo_grf)) + return PTR_ERR(dp->vo_grf); + + plat_data->max_link_rate =3D plat_data_const->max_link_rate; + plat_data->pixel_mode =3D plat_data_const->pixel_mode; + plat_data->hpd_sw_sel =3D dw_dp_rockchip_hpd_sw_sel; + plat_data->hpd_sw_cfg =3D dw_dp_rockchip_hpd_sw_cfg; + plat_data->data =3D dp; =20 dp->base =3D dw_dp_probe(pdev, plat_data); if (IS_ERR(dp->base)) @@ -147,14 +254,20 @@ static void dw_dp_rockchip_remove(struct platform_dev= ice *pdev) component_del(&pdev->dev, &dw_dp_rockchip_component_ops); } =20 -static const struct dw_dp_plat_data rk3588_dp_plat_data =3D { +static const struct rockchip_dw_dp_plat_data rk3588_dp_plat_data =3D { + .num_ctrls =3D 2, + .ctrl_ids =3D {0xfde50000, 0xfde60000}, .max_link_rate =3D 810000, .pixel_mode =3D DW_DP_MP_QUAD_PIXEL, + .hpd_reg =3D {0x0000, 0x0008}, }; =20 -static const struct dw_dp_plat_data rk3576_dp_plat_data =3D { +static const struct rockchip_dw_dp_plat_data rk3576_dp_plat_data =3D { + .num_ctrls =3D 1, + .ctrl_ids =3D {0x27e40000}, .max_link_rate =3D 810000, .pixel_mode =3D DW_DP_MP_DUAL_PIXEL, + .hpd_reg =3D {0x0000}, }; =20 static const struct of_device_id dw_dp_of_match[] =3D { --=20 2.53.0 From nobody Sat Jul 25 00:16:24 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 47410472F97; Tue, 21 Jul 2026 17:52:43 +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=1784656365; cv=none; b=buiLmCAyOXLQF8/zj2WXfJbP4Gi7GVUKlms1ZZCv4naiN38v361/14FQeB+vBrtq0pE+cphJV1D0xXxwH9TV06zBM12ZmS8T4SPm5IsSeHqHINerVSw6Cn0FCZmGf3hMvenC2FLtfWWE2GVQzy5J7yYFywyg7p6UTNlFLMupgRk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784656365; c=relaxed/simple; bh=F1aUwDw1oCdiQKc4Mr/s1A9oQOTsJxibKKDasYb4aSk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QYjHIoFY7I76Er5BF3tl6YOQT2SffhT0G4IgEYJacYpMX7V6h5yemS1TM14ArWiUUn/muhEXwk3nO7f9rE9aKCwLI00/u3vRFmrwCdn4Ymk0FdGhsJ2pP9ZXigVwwCoQZgJc/C1Gz7gINRMwsBVnNVLq5g386VgsG0OybAqJFoc= 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=NvTIfcpG; 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="NvTIfcpG" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784656358; bh=F1aUwDw1oCdiQKc4Mr/s1A9oQOTsJxibKKDasYb4aSk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=NvTIfcpGIqZItnMERhJzz+CX7sGlWe4jQ2a81A+J2aTIy2cRre17WJmP1ODad+a0/ k9XM5UDR5kVQ4mjT802M23FHdmng+Sb49aJW0o2MP9WWucZmeU8gcKIkcFPdBhcLwd uZ87V/OPM63O7/bEaFlmCCJSnRdtgxkXLjTBvfp2GIVV9QFOMDEl0PQG7WmBU0huJv VFHCaUGy7PuBmkumanavrpBhG4hCFZTp1rvLOxc1fDqTfFjUta5j6Tby2b71Oo3dKG djxspBiIq1n7d1oLPziiwNXgkEvjwQpIo+bA3pujgK4/6nUPxH+A69AOv/b+WZHIQ7 Ds3HUsl2KupTw== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 46E1F17E11F5; Tue, 21 Jul 2026 19:52:38 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 9ED71480038; Tue, 21 Jul 2026 19:52:37 +0200 (CEST) From: Sebastian Reichel Date: Tue, 21 Jul 2026 19:52:37 +0200 Subject: [PATCH v4 07/10] drm/bridge: synopsys: dw-dp: Add Runtime PM 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: <20260721-synopsys-dw-dp-improvements-v4-7-f0f4a4ede712@collabora.com> References: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> In-Reply-To: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4278; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=F1aUwDw1oCdiQKc4Mr/s1A9oQOTsJxibKKDasYb4aSk=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpfseXY5QIUTimL8C+WVfjzgs/9sWaQomIKU FoG4aHTFrd1f4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqX7HlAAoJENju1/PI O/qahWsP+wZW8cZN0zpUMyr7/8wzhYujBUQMZPR/k9tP51OC6yrkwldFIDYh94xx7Dlt4RTOcCF kxFAypHCm/iQ5FCMOybC6Sr03oV75twQ7IsDcKlXK96E1VdRfSrOtNrVYVxSIbZNrLwk51VgT0Y mtPrc2d6ry6fP6E9NANrwG2EVL/j39rBMRcWX2ar6Yl3mVfS4MT2LGt6uq0bbPh5C0shjyL+hMC EgRhkTMU3d/25tpFuzE/M05cBCm3ED7deJwXbgD4teIe/Bw5OaNDQbF8B7fXNP9FitL5uyzRxAv IrO0vh/lb7QDmnoZWvnRthoYlmwiUwvXpkeIDn88Rt2aGUtcZ4HFaWUm8sfTQRgpX8TKcK5T7SA CWh6gnUZZuoJzMyPQeeF+OpX2+FHlOuVlnjKCeWkRnrPWXpnLgNEfMcXTKHKx1ig0cQYtF1uDSC kD6yU7K3Drrn9FibL43wT0/YVGuGN8vQl9PvC2cEFdKbycb16bYLJSSZp0wH6MxSBtg6BCXMvBq 62G3enoe2N38kSk6mTdU4233xqxVmIJXS50e9r9uzsLrtXQ9ZsiDdGAg3Stti4m7eyud+EVPMyB +0FjDdEsvxeMpLq50k4EcKNphiiO6b37LOQOMwo4SxCKEPDjOKMHP0EN0T6ETVVnO0egQ0zf89Y S2G7ghW7JXwku0PV4lHUvlQ== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Add runtime PM stubs to the Synopsys DesignWare DisplayPort bridge driver. Support is not enabled automatically and must be hooked up in the vendor specific glue code. Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 50 +++++++++++++++++++++++++++++= ++++ include/drm/bridge/dw_dp.h | 3 ++ 2 files changed, 53 insertions(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 8eb2699dc7ab..636b9e105297 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -328,6 +328,7 @@ struct dw_dp { struct dw_dp_link link; struct dw_dp_plat_data plat_data; u8 pixel_mode; + bool usbc_mode; =20 struct drm_bridge *next_bridge; =20 @@ -1467,6 +1468,8 @@ static ssize_t dw_dp_aux_transfer(struct drm_dp_aux *= aux, if (WARN_ON(msg->size > 16)) return -E2BIG; =20 + ACQUIRE(pm_runtime_active_auto, pm)(dp->dev); + switch (msg->request & ~DP_AUX_I2C_MOT) { case DP_AUX_NATIVE_WRITE: case DP_AUX_I2C_WRITE: @@ -1657,6 +1660,8 @@ static void dw_dp_bridge_atomic_enable(struct drm_bri= dge *bridge, struct drm_connector_state *conn_state; int ret; =20 + pm_runtime_get_sync(dp->dev); + connector =3D drm_atomic_get_new_connector_for_encoder(state, bridge->enc= oder); if (!connector) { dev_err(dp->dev, "failed to get connector\n"); @@ -1711,6 +1716,7 @@ static void dw_dp_bridge_atomic_disable(struct drm_br= idge *bridge, dw_dp_link_disable(dp); bitmap_zero(dp->sdp_reg_bank, SDP_REG_BANK_SIZE); dw_dp_reset(dp); + pm_runtime_put_autosuspend(dp->dev); } =20 static bool dw_dp_hpd_detect_link(struct dw_dp *dp, struct drm_connector *= connector) @@ -1731,6 +1737,14 @@ static enum drm_connector_status dw_dp_bridge_detect= (struct drm_bridge *bridge, { struct dw_dp *dp =3D bridge_to_dp(bridge); =20 + ACQUIRE(pm_runtime_active_auto, pm)(dp->dev); + + /* + * HPD_HOT_PLUG bit is asserted only after the sink holds HPD high for + * at least 100ms. Thus we need to wait 100ms after runtime PM resume. + */ + msleep(110); + if (!dw_dp_hpd_detect(dp)) return connector_status_disconnected; =20 @@ -2032,10 +2046,15 @@ int dw_dp_bind(struct dw_dp *dp, struct drm_encoder= *encoder) } =20 if (dw_dp_is_routed_to_usb_c(encoder)) { + dp->usbc_mode =3D true; dev_dbg(dev, "USB-C mode\n"); =20 if (dp->plat_data.hpd_sw_sel) dp->plat_data.hpd_sw_sel(dp->plat_data.data, 1); + } else { + dp->usbc_mode =3D false; + /* Keep runtime PM enabled to have working native HPD IRQ */ + pm_runtime_get_sync(dp->dev); } =20 dw_dp_init_hw(dp); @@ -2065,6 +2084,8 @@ EXPORT_SYMBOL_GPL(dw_dp_bind); =20 void dw_dp_unbind(struct dw_dp *dp) { + if (dp->usbc_mode) + pm_runtime_put_autosuspend(dp->dev); disable_irq(dp->irq); phy_exit(dp->phy); drm_bridge_put(dp->next_bridge); @@ -2163,6 +2184,35 @@ struct dw_dp *dw_dp_probe(struct platform_device *pd= ev, const struct dw_dp_plat_ } EXPORT_SYMBOL_GPL(dw_dp_probe); =20 +int dw_dp_runtime_suspend(struct dw_dp *dp) +{ + clk_disable_unprepare(dp->aux_clk); + clk_disable_unprepare(dp->apb_clk); + + return 0; +} +EXPORT_SYMBOL_GPL(dw_dp_runtime_suspend); + +int dw_dp_runtime_resume(struct dw_dp *dp) +{ + int ret; + + ret =3D clk_prepare_enable(dp->apb_clk); + if (ret) + return ret; + + ret =3D clk_prepare_enable(dp->aux_clk); + if (ret) { + clk_disable_unprepare(dp->apb_clk); + return ret; + } + + dw_dp_init_hw(dp); + + return 0; +} +EXPORT_SYMBOL_GPL(dw_dp_runtime_resume); + MODULE_AUTHOR("Andy Yan "); MODULE_DESCRIPTION("DW DP Core Library"); MODULE_LICENSE("GPL"); diff --git a/include/drm/bridge/dw_dp.h b/include/drm/bridge/dw_dp.h index 79b2cdf0df99..f20d2c2c40ca 100644 --- a/include/drm/bridge/dw_dp.h +++ b/include/drm/bridge/dw_dp.h @@ -29,4 +29,7 @@ int dw_dp_bind(struct dw_dp *dp, struct drm_encoder *enco= der); void dw_dp_unbind(struct dw_dp *dp); =20 struct dw_dp *dw_dp_probe(struct platform_device *pdev, const struct dw_dp= _plat_data *plat_data); + +int dw_dp_runtime_suspend(struct dw_dp *dp); +int dw_dp_runtime_resume(struct dw_dp *dp); #endif /* __DW_DP__ */ --=20 2.53.0 From nobody Sat Jul 25 00:16:24 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 4753C472F98; Tue, 21 Jul 2026 17:52:43 +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=1784656365; cv=none; b=RV7P2y+Uy0s37gg1b9W8+kMWOZUImkgtQ7WiKsG2+LFEbsmK/C20c9l3BvVqeJTDg1feg5tH/SwR63l8uyhFyUetAZhjO4ost2/YJM4DroFl/4jggwBB/NayXQ9zlZc2X1u7Hm1ZkWHrzj8OzVThxe1ThPieCjq7F1wf3NZsZVg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784656365; c=relaxed/simple; bh=rRhowV7M1frOqvzyChhxOIGtQOr1JW2pNEr4gL+rRig=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IhbINOLFKh75B001+J0Qntm6SeMzkWmViPQwqoSOdZG+MyZkuC/qs6TA8pOJ8i3wsVngKmW1xKYY6q2iwouxAmbDHywsuimyABTK0RTr3Uhh3kf66owq3cBGWS/WPWVr9xTMTaq2oT2cCYq/xS8bl8pOGo/caug2GwLzs5BcJxc= 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=f/uV3XAN; 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="f/uV3XAN" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784656358; bh=rRhowV7M1frOqvzyChhxOIGtQOr1JW2pNEr4gL+rRig=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=f/uV3XANtU0RiyNDuGGZjBCC9D4CZd9b+waf41m6U8sWE2SwgrHJIBYgCGwsJtVV/ TSD99THTvk5CIDub/j6WAzfx+Kc4iUzviLXZdfZc6rS64PImnsO/jzkhW1frh+gOuy CJATLSue/l9VSdc9iPNr4jV/ckNLjcmirQqTZLy1v1L+g+97MPp1WXG7DVrKXPuMzx ov6VoSjLBznY57EW1CZzo/Si6i0PXL/rgRAlxNZahbwhqKHm5kjb64G0mKcbCvKG2x 5jhpDl2/GedRByk0pgN+Y6O9onoDHJep13g7Q6PMlm+umr9BzV6jkI/Oc8XJffJZhu bBUg/lHVgwo0Q== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 469BA17E1164; Tue, 21 Jul 2026 19:52:38 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id A063848003A; Tue, 21 Jul 2026 19:52:37 +0200 (CEST) From: Sebastian Reichel Date: Tue, 21 Jul 2026 19:52:38 +0200 Subject: [PATCH v4 08/10] drm/rockchip: dw_dp: Add runtime PM 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: <20260721-synopsys-dw-dp-improvements-v4-8-f0f4a4ede712@collabora.com> References: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> In-Reply-To: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3685; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=rRhowV7M1frOqvzyChhxOIGtQOr1JW2pNEr4gL+rRig=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpfseUrR0mW5zk0dgMOPDEASl2cFju8CGUvt 0Dqs52Nf/nWVokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqX7HlAAoJENju1/PI O/qaK7gP/AtdLuNAqOkwghJrGAU7vewDOudJHH2PvucjEhJ4UDvoxQxPQjiMPktY4xaCXmxiJ5P 3XONVe7+O5Xtuo/J6lNWkBBgt0WaodFPr4fPHHGuCpPY6liNhS3h3LUGA6/Xwj1qZuE8FHjXVdZ G3mRfKgSYmUmzS/6D9vkWiweDtZe8UIV98kKDscXmaL3gSEUsBkPUIalCLHkHcZw1R0/DZbewIp M4VuQ/AsXj+J2wRFVnvDkxiRpo5eRryNZ+M9CoEz+spjA5fMJlkSFCq8vD89sKtFUQwZguGceUV I88ABPCUVawVtKdjBqRRStgG+gitFKYkFRUuUg1V1OUeouzPt0CsJb24cAO6tPiPJAM6+gu6ipE 947VE+XIxgPO4gv7UFDrByub7cwZ0Vb2+uQMNHgxbkqD7KjAhQGyvP5Cie5TX60in4S6ipBG3sR iVaTtoIKMjb0E9f58/FStJfgJEqT9C52ozRyP1s1V0yMEX1ZDbxzy8m047EZFOQLNYlMj7+2fxx 0lNiENjQKBjLgzViJOMYlsAx54q8iiXtYgvkvuKRx104W0078FZYu13IUYC7xc4f7ttskfh/3iz Zh6rtDVYontSBJvqvuaoxU84OWqQuJj7esW6hbnKuqYI/nC50O+JD5zIwfLZ2Rfg3GJXia8xUSL I63yE4Z1dGO9Y4ImmfDwnqQ== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Add support for runtime PM to the Rockchip RK3576/3588 Synopsys DesignWare DisplayPort driver. Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/rockchip/dw_dp-rockchip.c | 53 +++++++++++++++++++++++++++= ++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c b/drivers/gpu/drm/ro= ckchip/dw_dp-rockchip.c index 0ecbad24dd4e..d7e1704fd980 100644 --- a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_dp-rockchip.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include =20 @@ -57,6 +58,8 @@ static void dw_dp_rockchip_hpd_sw_sel(void *data, bool fo= rce_hpd_from_sw) =20 dp->hpd_sel =3D force_hpd_from_sw; =20 + ACQUIRE(pm_runtime_active_auto, pm)(dp->dev); + regmap_write(dp->vo_grf, hpd_reg, FIELD_PREP_WM16(ROCKCHIP_VO_GRF_DP_SINK_HPD_SEL, dp->hpd_sel)); } @@ -70,6 +73,8 @@ static void dw_dp_rockchip_hpd_sw_cfg(void *data, bool hp= d) =20 dp->hpd_cfg =3D hpd; =20 + ACQUIRE(pm_runtime_active_auto, pm)(dp->dev); + regmap_write(dp->vo_grf, hpd_reg, FIELD_PREP_WM16(ROCKCHIP_VO_GRF_DP_SINK_HPD_CFG, dp->hpd_cfg)); } @@ -169,14 +174,25 @@ static int dw_dp_rockchip_bind(struct device *dev, st= ruct device *master, void * if (ret) return ret; =20 + pm_runtime_use_autosuspend(dev); + pm_runtime_set_autosuspend_delay(dev, 500); + pm_runtime_set_active(dev); + pm_runtime_enable(dev); + connector =3D drm_bridge_connector_init(drm_dev, encoder); if (IS_ERR(connector)) { - dw_dp_unbind(dp->base); - return dev_err_probe(dev, PTR_ERR(connector), - "Failed to init bridge connector\n"); + ret =3D PTR_ERR(connector); + dev_err_probe(dev, ret, "Failed to init bridge connector\n"); + goto error; } =20 return 0; + +error: + pm_runtime_dont_use_autosuspend(dev); + pm_runtime_disable(dev); + dw_dp_unbind(dp->base); + return ret; } =20 static void dw_dp_rockchip_unbind(struct device *dev, struct device *maste= r, @@ -184,6 +200,8 @@ static void dw_dp_rockchip_unbind(struct device *dev, s= truct device *master, { struct rockchip_dw_dp *dp =3D dev_get_drvdata(dev); =20 + pm_runtime_dont_use_autosuspend(dev); + pm_runtime_disable(dev); dw_dp_unbind(dp->base); } =20 @@ -254,6 +272,34 @@ static void dw_dp_rockchip_remove(struct platform_devi= ce *pdev) component_del(&pdev->dev, &dw_dp_rockchip_component_ops); } =20 +static int dw_dp_rockchip_runtime_suspend(struct device *dev) +{ + struct rockchip_dw_dp *dp =3D dev_get_drvdata(dev); + + return dw_dp_runtime_suspend(dp->base); +} + +static int dw_dp_rockchip_runtime_resume(struct device *dev) +{ + struct rockchip_dw_dp *dp =3D dev_get_drvdata(dev); + u32 hpd_reg =3D dp->pdata->hpd_reg[dp->id]; + int ret; + + ret =3D dw_dp_runtime_resume(dp->base); + if (ret) + return ret; + + regmap_write(dp->vo_grf, hpd_reg, + FIELD_PREP_WM16(ROCKCHIP_VO_GRF_DP_SINK_HPD_SEL, dp->hpd_sel) | + FIELD_PREP_WM16(ROCKCHIP_VO_GRF_DP_SINK_HPD_CFG, dp->hpd_cfg)); + + return 0; +} + +static const struct dev_pm_ops dw_dp_pm_ops =3D { + RUNTIME_PM_OPS(dw_dp_rockchip_runtime_suspend, dw_dp_rockchip_runtime_res= ume, NULL) +}; + static const struct rockchip_dw_dp_plat_data rk3588_dp_plat_data =3D { .num_ctrls =3D 2, .ctrl_ids =3D {0xfde50000, 0xfde60000}, @@ -288,5 +334,6 @@ struct platform_driver dw_dp_driver =3D { .driver =3D { .name =3D "dw-dp", .of_match_table =3D dw_dp_of_match, + .pm =3D pm_ptr(&dw_dp_pm_ops), }, }; --=20 2.53.0 From nobody Sat Jul 25 00:16:24 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 70728472F6A; Tue, 21 Jul 2026 17:52:43 +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=1784656366; cv=none; b=nr703KBrdIAORaVq68zte8P4Wa5F12FNCVLDO1i0rKJ8uHfiBKdVET3x22lAYqjy1551uNwisc/Evy+1dSUXkkgUYR3OIK/BdTTxV8X6xH7HIBYx60z35CKwsF9E/ChIr/L2IXPhn0yMrpy05hMdsDuz3iNmcK7S3ZXJjHl5ECQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784656366; c=relaxed/simple; bh=Szu0whIwry2XJLoGj7gD8cKhUNL8gnGbIBLAwSmIRe0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=g7WU/69E7QAKhF8IEuxPnGW/8DgWIpmFHf9h9DuwBszwOXZ5hxLvHakkhA3TTJKgOA8S6Omhb7VsQ7WOwC/j6D+Spk9wKF4Ah6vjJUsrS60J5eI0262ZqqULptHpgU0EOqgKXqSvKIPNkeS0W1TuFqNEN49wopHaBnPIe7+Ujf4= 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=NqJyIAgz; 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="NqJyIAgz" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784656358; bh=Szu0whIwry2XJLoGj7gD8cKhUNL8gnGbIBLAwSmIRe0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=NqJyIAgztefUst+y54jAgxbzu1I2uDgagI+DYb6hDOgnWQMUhvf1kG8mqAUZaZnZb LbQpO/RKAV3pvDz9Nh4M720kTadhiwe0lKFYS+NCkIub2kkTXaMrhPzh+zYhYqst7H h0WdkWNUDgGuQS4pWT0eIVLPkndBa/7c1Tp4hTxsAAcZyI7TUja82vLfk0KtTmSuzC mpNATiT/QHjI2eK7lXyKovwmExdA7vz3ApvreJfEDCtV6dcUrITF3H0cnJY5TpStKp +3UeWH4Jr+V8J9g3kvMCvzV3Ky89urPaeWYmjvkDxyZMAr09Mhy3LHIHAtBDmT6iyf Cz+gyol7HTuAQ== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 4E94217E121B; Tue, 21 Jul 2026 19:52:38 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id A20FB48003D; Tue, 21 Jul 2026 19:52:37 +0200 (CEST) From: Sebastian Reichel Date: Tue, 21 Jul 2026 19:52:39 +0200 Subject: [PATCH v4 09/10] dt-bindings: display: rockchip: dw-dp: Fix sound DAI cells 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: <20260721-synopsys-dw-dp-improvements-v4-9-f0f4a4ede712@collabora.com> References: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> In-Reply-To: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3195; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=Szu0whIwry2XJLoGj7gD8cKhUNL8gnGbIBLAwSmIRe0=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpfseVT8gMOJz3vR303GHeE0KZMP8YapXJc2 vxfs/1dCS6KcIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqX7HlAAoJENju1/PI O/qaLicQAJvSC78msD3XpfFR7f6XwjAhjFubR7DC7qMAn0Tqatma134CJr3XRnIe68yBm84JaXe M8julUdS5n5ro0kUu9sN+9IFa3+3jNSzgYq1v+dlkaLETNdmL+InLZf+WYkJ7FG1ds0uop+pzdI KP2iJxy2HlibpwSmu+NyJdqrxgUC6plMCgiqb9PK61uej3F76qSLkRRDH/Zg0yPUAKvPDkrMI3e 3t6Ygo7i5mKj4BMT1JuUgAsdno3WySJHXsfep86pDe8i4bxqqY0SjK2LPkQxYjXaA2gBOB/sRvS BNm6yT0+5fabFu2L6f7yl+dmfvIKr6VecknazQoFjzRAA7Xov8LLXj6rNGxqE7u7jnJs3wrPRsA /RLPQCJYB1ABbNjxZ0fv9SGX4GOFCW8dsQEJEvvecN680oR2UP3k0dsJm+zQ8edsojT3W2kE4vB RYnyvs0IbECDHgu+Hfa8P/nHdKVlRTBAWO619spDzfNQlvJxqt7t9zi18UmhwMyos86AS0rZ1Mf OE3tgSzzBfEIietWm0qNmwSe14BIfRW+BzkX+FZTsjDYnqsLES/ZTpPB9ATd+SG/2UTSaFTOl22 IJOp/CdGPSipI/JLbPb9h3EfQdjf+TCdevRjWqM7TlygjwbQUUefSNIu8HRx6uyOqV+/JigLSsh gVHzikkL64T9R1nhTCskuIQ== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A The RK3588 and RK3576 DesignWare DisplayPort controllers both have two possible DAI interfaces: I2S and S/PDIF. Thus an argument is needed to to select the right interface. In addition to that the RK3576 has the same IP as RK3588, but configured with Multi Stream Transport (MST) enabled for up to 3 displays and thus has a total of 6 DAI interfaces (I2S and S/PDIF for each possible stream). Meanwhile the RK3588 does not support MST and thus has only 2 DAI interfaces. The binding update from this patch has only been tested with the simple single stream transport (SST) setup as the Linux driver does not yet support MST. For MST it is unclear what a good binding should look like. Technically there are a couple of options: 1. Stay with the single cell, but add more numbers. I.e. 0 =3D I2S on stream 0, 1 =3D S/PDIF on stream 0 2 =3D I2S on stream 1, 3 =3D S/PDIF on stream 1 4 =3D I2S on stream 2, 5 =3D S/PDIF on stream 2 2. Add yet another cell, so that there is one argument for the stream ID and one argument to select between S/PDIF and I2S. I.e. 0 0 =3D I2S on stream 0 0 1 =3D S/PDIF on stream 0 1 0 =3D I2S on stream 1 1 1 =3D S/PDIF on stream 1 2 0 =3D I2S on stream 2 2 1 =3D S/PDIF on stream 2 3. Create one subnode for each stream in the DP controller with its own graph for the video streams. This would mean the MST binding is quite different from the SST one. As it is unclear which way is the most sensible at this point in time, just go with the most simple option for now and revisit this once MST is added. Signed-off-by: Sebastian Reichel --- .../devicetree/bindings/display/rockchip/rockchip,dw-dp.yaml | 9 +++++= ---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Documentation/devicetree/bindings/display/rockchip/rockchip,dw= -dp.yaml b/Documentation/devicetree/bindings/display/rockchip/rockchip,dw-d= p.yaml index 2b0d9e23e943..c4f8959dd65d 100644 --- a/Documentation/devicetree/bindings/display/rockchip/rockchip,dw-dp.yaml +++ b/Documentation/devicetree/bindings/display/rockchip/rockchip,dw-dp.yaml @@ -25,7 +25,7 @@ description: | * Supports up to 8/10 bits per color component * Supports RBG, YCbCr4:4:4, YCbCr4:2:2, YCbCr4:2:0 * Pixel clock up to 594MHz - * I2S, SPDIF audio interface + * I2S, S/PDIF audio interface =20 properties: compatible: @@ -46,7 +46,7 @@ properties: - description: DisplayPort AUX clock - description: HDCP clock - description: I2S interface clock - - description: SPDIF interfce clock + - description: S/PDIF interfce clock =20 clock-names: minItems: 3 @@ -83,7 +83,8 @@ properties: maxItems: 1 =20 "#sound-dai-cells": - const: 0 + const: 1 + description: 0 for I2S, 1 for S/PDIF =20 required: - compatible @@ -144,7 +145,7 @@ examples: resets =3D <&cru SRST_DP0>; phys =3D <&usbdp_phy0 PHY_TYPE_DP>; power-domains =3D <&power RK3588_PD_VO0>; - #sound-dai-cells =3D <0>; + #sound-dai-cells =3D <1>; =20 ports { #address-cells =3D <1>; --=20 2.53.0 From nobody Sat Jul 25 00:16:24 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 AE48F4D90C0; Tue, 21 Jul 2026 17:52:43 +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=1784656365; cv=none; b=GJ07doQwtdcBbJtGwI5pwFgSfGpDNELhc8rr06mnf/TevUQ8VRsz0UQ7ocGjdPKyr0tLbUSyanK2CcJmy4hNKwN6HNVDddKX5rvcFBnmTx8fEMjB1/YK0kLDJD+9bAv+68wKVCvXWnPOG1qxaKLt2CPeh8WpdJwjOgN3SavmdPI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784656365; c=relaxed/simple; bh=h/vP808z57itzBffi+4n3/LdT4xUEfCGic2h67w1n2U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Y6dQOljj09V0MG0GBh4uO7lHCAv19uVNNAGYy0tOX785Ix8vewWYv4Rck4CGwPlH+D5g4mvdHP0y7phTsPGTEQP4W4uIMv2ECMFcddw5YLGgwjtqYDVV08nQ1FUiJXb4AdQmv3Pjh/3b5ZNWLM7/VA92NaMpI2QBvisVeqa0yVw= 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=J1wEpj8b; 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="J1wEpj8b" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784656358; bh=h/vP808z57itzBffi+4n3/LdT4xUEfCGic2h67w1n2U=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=J1wEpj8bDiXezNHaQaCUgbd9CLNpee8W9pni7uPMbUuyjaEm3LJnJNHmegYTp+AY1 9mOCmVK7mI+LPIgTmg6ZEudI0alssJLp74UGpScz1DrG+jkUwzXkh97gc157cSBBCi ANBrzQe/ubojqdwhQC0fn5DkuPC0yfDGAXGzjlbpZ9/iuKoMPOLlAHNO9qiJx0vXUY 0LmXiFiV/+gOaJm3FTZ9iW0rpC827I5Zqta/3G5K5n6EHsBmYu7PNC+IUgHoU/45dM 9AL6FOvNBLDqY6ihcunQkBXdQ4OaOwaEYghSVgbtq+1+yVtppMQHe5oeDNtliNLqrg gm8D9lPKeQCyQ== Received: from jupiter.universe (unknown [100.64.1.62]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 52B3717E1274; Tue, 21 Jul 2026 19:52:38 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id A3A6248002B; Tue, 21 Jul 2026 19:52:37 +0200 (CEST) From: Sebastian Reichel Date: Tue, 21 Jul 2026 19:52:40 +0200 Subject: [PATCH v4 10/10] drm/bridge: synopsys: dw-dp: Add audio 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: <20260721-synopsys-dw-dp-improvements-v4-10-f0f4a4ede712@collabora.com> References: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> In-Reply-To: <20260721-synopsys-dw-dp-improvements-v4-0-f0f4a4ede712@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=9650; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=h/vP808z57itzBffi+4n3/LdT4xUEfCGic2h67w1n2U=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpfseXGQk5W9W62hm+ShpsQwwWj5+zYkCZei r7vX2dsFjFScYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqX7HlAAoJENju1/PI O/qaamgP/RlqYJ/ZjRn1LUc6VQJVCqCgFKD8JNkRR35jxN8ie5yyFf1nZzMlP5SApseijKXqXC3 Phi53qMpVN7KWc5qkfaT94rQrRj7HfA3P/CVC50Yq0JulyTkPiOjBugWGBZky9O42X9Mi7/DOkI zeKNzamPNWeuLZ0TucGzR2cXxFwe2hmTmgwkuZosoAELSmN928RM3qG32Tir5YzRFA66jIXhG9c 0m2i55lJ8knW+EKnVVJDS+2vEKheYMyt/HSvM1ND0ZgO+FjPsaKVtSHhQ76dgiUxdZRQh5wHecR 0BMh8BWaU+aFKXom5Z6b6CMgwR+58GerXXCBREvsy8Y3oA0tsU6PHf6mHSTf9+1WgmnnpyXmY9c t4yY/xy7O+HIZqbdKIZw588CfV1UM6AVFiCQKek0zFDjsMeB6526OsGjF7e60vc1f76FNVj/ROZ sPfrAgKmgmglSdVJeMFEbtorZpt2iP2B/LtN7lErHNYZPNFzpwhphXV0ZYCNvYlSSchZGIvIOf+ vxWB++QUUwpE/7jMdsS7MQZW6CTc/irEg/ICuQNpi/4oYQ9h2dBXneReI6DwV1YcUl6pUop3+6S PPNdaL87Sqz+L1rBaMZGZxcgabDu/bnYGE3XUAI10wa+bfzBeVIZEdl1g86CznF0j9cTEdMUw1W N+GBS67JQQ4T7L7+0EIYyDw== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Implement audio support for the Synopsys DesignWare DisplayPort controller. Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 230 ++++++++++++++++++++++++++++= +++- 1 file changed, 229 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 636b9e105297..8d6a52135e54 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -23,17 +23,21 @@ #include #include #include +#include #include #include #include #include #include =20 +#include + #define DW_DP_VERSION_NUMBER 0x0000 #define DW_DP_VERSION_TYPE 0x0004 #define DW_DP_ID 0x0008 =20 #define DW_DP_CONFIG_REG1 0x0100 +#define AUDIO_SELECT GENMASK(2, 1) #define DW_DP_CONFIG_REG2 0x0104 #define DW_DP_CONFIG_REG3 0x0108 =20 @@ -110,6 +114,10 @@ #define HBR_MODE_ENABLE BIT(10) #define AUDIO_DATA_WIDTH GENMASK(9, 5) #define AUDIO_DATA_IN_EN GENMASK(4, 1) +#define AUDIO_DATA_IN_EN_CHANNEL12 BIT(0) +#define AUDIO_DATA_IN_EN_CHANNEL34 BIT(1) +#define AUDIO_DATA_IN_EN_CHANNEL56 BIT(2) +#define AUDIO_DATA_IN_EN_CHANNEL78 BIT(3) #define AUDIO_INF_SELECT BIT(0) =20 #define DW_DP_SDP_VERTICAL_CTRL 0x0500 @@ -253,6 +261,8 @@ =20 #define SDP_REG_BANK_SIZE 16 =20 +#define DW_DP_SDP_VERSION 0x12 + struct dw_dp_link_caps { bool enhanced_framing; bool tps3_supported; @@ -305,6 +315,19 @@ struct dw_dp_hotplug { bool long_hpd; }; =20 +enum dw_dp_audio_interface_support { + DW_DP_AUDIO_I2S_ONLY =3D 0, + DW_DP_AUDIO_SPDIF_ONLY =3D 1, + DW_DP_AUDIO_I2S_AND_SPDIF =3D 2, + DW_DP_AUDIO_NONE =3D 3, +}; + +enum dw_dp_audio_interface { + DW_DP_AUDIO_I2S =3D 0, + DW_DP_AUDIO_SPDIF =3D 1, + DW_DP_AUDIO_UNUSED, +}; + struct dw_dp { struct drm_bridge bridge; struct device *dev; @@ -320,6 +343,8 @@ struct dw_dp { int irq; struct work_struct hpd_work; struct dw_dp_hotplug hotplug; + enum dw_dp_audio_interface audio_interface; + int audio_channels; /* Serialize hpd status access */ struct mutex irq_lock; =20 @@ -1846,6 +1871,195 @@ static void dw_dp_bridge_oob_notify(struct drm_brid= ge *bridge, dev_err_once(dp->dev, "Missing platform handler for OOB HPD handling\n"); } =20 +static int dw_dp_audio_infoframe_send(struct dw_dp *dp) +{ + struct hdmi_audio_infoframe frame; + struct dw_dp_sdp sdp; + int ret; + + ret =3D hdmi_audio_infoframe_init(&frame); + if (ret < 0) + return ret; + + frame.coding_type =3D HDMI_AUDIO_CODING_TYPE_STREAM; + frame.sample_frequency =3D HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM; + frame.sample_size =3D HDMI_AUDIO_SAMPLE_SIZE_STREAM; + frame.channels =3D dp->audio_channels; + + ret =3D hdmi_audio_infoframe_pack_for_dp(&frame, &sdp.base, DW_DP_SDP_VER= SION); + if (ret < 0) + return ret; + + sdp.flags =3D DW_DP_SDP_VERTICAL_INTERVAL; + + return dw_dp_send_sdp(dp, &sdp); +} + +static int dw_dp_audio_startup(struct drm_bridge *bridge, + struct drm_connector *connector) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + + dev_dbg(dp->dev, "audio startup\n"); + + return pm_runtime_resume_and_get(dp->dev); +} + +static void dw_dp_audio_unprepare(struct drm_bridge *bridge, + struct drm_connector *connector) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + + /* Disable all audio streams */ + regmap_update_bits(dp->regmap, DW_DP_AUD_CONFIG1, AUDIO_DATA_IN_EN, + FIELD_PREP(AUDIO_DATA_IN_EN, 0)); + + if (dp->audio_interface =3D=3D DW_DP_AUDIO_SPDIF) + clk_disable_unprepare(dp->spdif_clk); + else if (dp->audio_interface =3D=3D DW_DP_AUDIO_I2S) + clk_disable_unprepare(dp->i2s_clk); + + dp->audio_interface =3D DW_DP_AUDIO_UNUSED; +} + +static int dw_dp_audio_prepare(struct drm_bridge *bridge, + struct drm_connector *connector, + struct hdmi_codec_daifmt *daifmt, + struct hdmi_codec_params *params) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + u8 audio_data_in_en, supported_audio_interfaces; + enum dw_dp_audio_interface audio_interface; + u32 cfg1; + int ret; + + /* + * prepare might be called multiple times, so release the clocks + * from previous calls to keep the calls in balance. + */ + if (dp->audio_interface !=3D DW_DP_AUDIO_UNUSED) + dw_dp_audio_unprepare(bridge, connector); + + dp->audio_channels =3D params->cea.channels; + switch (params->cea.channels) { + case 1: + case 2: + audio_data_in_en =3D AUDIO_DATA_IN_EN_CHANNEL12; + break; + case 8: + audio_data_in_en =3D AUDIO_DATA_IN_EN_CHANNEL12 | + AUDIO_DATA_IN_EN_CHANNEL34 | + AUDIO_DATA_IN_EN_CHANNEL56 | + AUDIO_DATA_IN_EN_CHANNEL78; + break; + default: + dev_err(dp->dev, "invalid audio channels %d\n", dp->audio_channels); + return -EINVAL; + } + + switch (daifmt->fmt) { + case HDMI_SPDIF: + audio_interface =3D DW_DP_AUDIO_SPDIF; + break; + case HDMI_I2S: + /* + * It is recommended to use SPDIF instead of I2S, since I2S mode requires + * manually inserting PCUV control bits from userspace and this is done + * automatically in hardware for SPDIF mode. + */ + audio_interface =3D DW_DP_AUDIO_I2S; + break; + default: + dev_err(dp->dev, "invalid DAI format %d\n", daifmt->fmt); + return -EINVAL; + } + + regmap_read(dp->regmap, DW_DP_CONFIG_REG1, &cfg1); + supported_audio_interfaces =3D FIELD_GET(AUDIO_SELECT, cfg1); + + if (supported_audio_interfaces !=3D DW_DP_AUDIO_I2S_AND_SPDIF && + supported_audio_interfaces !=3D audio_interface) { + dev_err(dp->dev, "unsupported DAI %d\n", daifmt->fmt); + return -EINVAL; + } + + ret =3D clk_prepare_enable(dp->spdif_clk); + if (ret) + return ret; + + clk_prepare_enable(dp->i2s_clk); + if (ret) { + clk_disable_unprepare(dp->spdif_clk); + return ret; + } + + regmap_update_bits(dp->regmap, DW_DP_AUD_CONFIG1, + AUDIO_DATA_IN_EN | NUM_CHANNELS | AUDIO_DATA_WIDTH | + AUDIO_INF_SELECT | HBR_MODE_ENABLE, + FIELD_PREP(AUDIO_DATA_IN_EN, audio_data_in_en) | + FIELD_PREP(NUM_CHANNELS, dp->audio_channels - 1) | + FIELD_PREP(AUDIO_DATA_WIDTH, params->sample_width) | + FIELD_PREP(AUDIO_INF_SELECT, audio_interface) | + FIELD_PREP(HBR_MODE_ENABLE, 0)); + + /* Wait for inf switch */ + usleep_range(20, 40); + + if (audio_interface =3D=3D DW_DP_AUDIO_I2S) + clk_disable_unprepare(dp->spdif_clk); + else if (audio_interface =3D=3D DW_DP_AUDIO_SPDIF) + clk_disable_unprepare(dp->i2s_clk); + + dp->audio_interface =3D audio_interface; + + /* + * Send audio stream during vertical and horizontal blanking periods. + * Send out audio timestamp SDP once per video frame during the vertical + * blanking period + */ + regmap_update_bits(dp->regmap, DW_DP_SDP_VERTICAL_CTRL, + EN_AUDIO_STREAM_SDP | EN_AUDIO_TIMESTAMP_SDP, + FIELD_PREP(EN_AUDIO_STREAM_SDP, 1) | + FIELD_PREP(EN_AUDIO_TIMESTAMP_SDP, 1)); + regmap_update_bits(dp->regmap, DW_DP_SDP_HORIZONTAL_CTRL, + EN_AUDIO_STREAM_SDP, + FIELD_PREP(EN_AUDIO_STREAM_SDP, 1)); + + ret =3D dw_dp_audio_infoframe_send(dp); + if (ret < 0) + dev_err(dp->dev, "failed to send audio infoframe\n"); + + dev_dbg(dp->dev, "audio prepare with %d channels using DAI=3D%d\n", + dp->audio_channels, dp->audio_interface); + + return 0; +} + +static void dw_dp_audio_shutdown(struct drm_bridge *bridge, + struct drm_connector *connector) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + + dev_dbg(dp->dev, "audio shutdown\n"); + + dw_dp_audio_unprepare(bridge, connector); + pm_runtime_put_autosuspend(dp->dev); +} + +static int dw_dp_audio_mute_stream(struct drm_bridge *bridge, + struct drm_connector *connector, + bool enable, int direction) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + + dev_dbg(dp->dev, "audio %smute\n", enable ? "" : "un"); + + regmap_update_bits(dp->regmap, DW_DP_AUD_CONFIG1, AUDIO_MUTE, + FIELD_PREP(AUDIO_MUTE, enable)); + + return 0; +} + static const struct drm_bridge_funcs dw_dp_bridge_funcs =3D { .atomic_duplicate_state =3D dw_dp_bridge_atomic_duplicate_state, .atomic_destroy_state =3D drm_atomic_helper_bridge_destroy_state, @@ -1859,6 +2073,11 @@ static const struct drm_bridge_funcs dw_dp_bridge_fu= ncs =3D { .detect =3D dw_dp_bridge_detect, .edid_read =3D dw_dp_bridge_edid_read, .oob_notify =3D dw_dp_bridge_oob_notify, + + .dp_audio_startup =3D dw_dp_audio_startup, + .dp_audio_prepare =3D dw_dp_audio_prepare, + .dp_audio_shutdown =3D dw_dp_audio_shutdown, + .dp_audio_mute_stream =3D dw_dp_audio_mute_stream, }; =20 static int dw_dp_link_retrain(struct dw_dp *dp) @@ -2009,10 +2228,19 @@ int dw_dp_bind(struct dw_dp *dp, struct drm_encoder= *encoder) =20 bridge =3D &dp->bridge; bridge->of_node =3D dev->of_node; - bridge->ops =3D DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP= _HPD; + bridge->ops =3D DRM_BRIDGE_OP_DP_AUDIO | + DRM_BRIDGE_OP_DETECT | + DRM_BRIDGE_OP_EDID | + DRM_BRIDGE_OP_HPD; bridge->type =3D DRM_MODE_CONNECTOR_DisplayPort; bridge->ycbcr_420_allowed =3D true; =20 + dp->audio_interface =3D DW_DP_AUDIO_UNUSED; + bridge->hdmi_audio_dev =3D dev; + bridge->hdmi_audio_max_i2s_playback_channels =3D 8; + bridge->hdmi_audio_dai_port =3D 1; + bridge->hdmi_audio_spdif_playback =3D true; + drm_bridge_add(bridge); =20 dp->aux.dev =3D dev; --=20 2.53.0