From nobody Fri Jul 24 20:48:46 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 3CF7C360EDC; Fri, 24 Jul 2026 18:03:31 +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=1784916213; cv=none; b=nV4hfb0X0ZJsMa4uA8sf5WV9RnHlTgF/8V4CO3y2xeLGxMF5Wjl84c7ddaigm4qlQCZNCRDlV/w5iN0sg8Y2QaOD1QvCp0gsBxoZEEg7WP7uUeCuF3K04xpfsQQzYDkpAcoiWIY0i3owXJxS4OD31PIw8jkk0VZtUAyCiRWq90U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916213; c=relaxed/simple; bh=PB8Tqf1O8v17mcbdbRA29Xc31/9NEqmOM81aKdJaZhw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Wr9OSQChCG5W5LBSUMYfKuvj4QJjD3rcu/xpqbG8MAwRP9DZmE+EUTn7JrdXuqx6DtGXNuPi3vGpibwimTeSjig6Ad0Am4w63ToH9u0Ys4n8322RIMBn7nibbGD2+OIHg9/xiNiB+6h0+ME4zEIUafaxBq+NIevBCx9M4z9v2mU= 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=cTgpe2gn; 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="cTgpe2gn" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784916209; bh=PB8Tqf1O8v17mcbdbRA29Xc31/9NEqmOM81aKdJaZhw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=cTgpe2gnO7KG+TOdw5YTNPMo4qiVFohcmVSS6VLZ39I3R81wnGhm4BaFSk94JFy2R MnG7HxJIooOPsJYymaXjqdHbDK7EKairbMaa3zwLKfZv/PXduSby1fYb4TpaZ9jQxA 0FF6drVWriigScErYUpWFBRwbWj/2+zG8cjW4R5xSr2fjiNW0iqTdVZpD+OpSaNlyZ fMeYqRFi+739v/atb7SPoKfbwvYygeb57hm6O3hZtitNU71MQcye9rYk4ettDMQbC9 1+9Ic5Gw8OpivvRcm+tcI2hl4EN/8ptP+qu0b9SxmZem7+Ru3MrDbNOl2IV1EOw4fo OU9kULaZ+ZVdQ== 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 2FD3F17E0128; Fri, 24 Jul 2026 20:03:29 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id DC3C3480028; Fri, 24 Jul 2026 20:03:28 +0200 (CEST) From: Sebastian Reichel Date: Fri, 24 Jul 2026 20:03:23 +0200 Subject: [PATCH v6 01/16] 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: <20260724-synopsys-dw-dp-improvements-v6-1-041d99a19c4e@collabora.com> References: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@collabora.com> In-Reply-To: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@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 , Sashiko X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=9493; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=PB8Tqf1O8v17mcbdbRA29Xc31/9NEqmOM81aKdJaZhw=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpjqPDlM5j/w7v/eJFDrvV3JHCX4b+eY6uP5 kbnj2pc4FIgeYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqY6jwAAoJENju1/PI O/qauloP/26KawJwW1ZRRvpj7jLhKssYX6ZD2E1frMluG9y9keSXlxbPUghXaaDqjLisrNSy+/k e4AHyOBIBwPcYxDjQRJgUaDHuX9mpOa2CUbOLA7cG+Df3YMUmFrIrVrSCudlxrBwek34WWF63MC 3xdxv5XZd+gUN6/sswVQPKgUAhg4NBbDs3R3emf0CL2CmD8EfsyShkDCL/Su6cOBYueNF3GPPGV enhxg7vf+Abm6iX0p3j3iO1vbeW0w9avHdH7ktxfsPWevlaRvWBapQaoVGrUpVHyAVnZ79XLPIu iXGlsiC62l/iz96FyShhFazMSBSiLZ3qAW4gMLOI7/M10RVc3rJJPfMWz0Ot3/8DwiTB3OCIs2C aoOdaFsXhLfwqHhOtfDvkrO5+GK4vGv6gQ2iviEDmiYApPpUFOPBr2+74sQg/kqMvXcnZ1+2QvN J6/E+AEvZqdYXajbl9uWLjZEtMhWWTlQtH1f6xFu9/B3Dm6t8/W+WeoxrZAXuAnK4CHQ7bS5x8Z pRYvYNj+F7ksLCaMU60YZqO39gDeL9NVxXz2+6DDDabI6BHx353UavNJy3pYXdxlSJKL5JghU+4 J0PTe/LJvKoRvxqKbCteAgUyENMtoBRYqOm9aTeKuwxPYJ5PNblczV7HrcSpCwp8a0F/r0aN2v3 BVVoLFQEh7cB0YJiSdzA1Mw== 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. Fixes: 86eecc3a9c2e ("drm/bridge: synopsys: Add DW DPTX Controller support = library") Reported-by: Sashiko 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 Fri Jul 24 20:48:46 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 3CEEE345EB6; Fri, 24 Jul 2026 18:03:31 +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=1784916212; cv=none; b=qsoxYLcl3LJAIBeu0cUI8ehQwJAgI81w0XZdLbowkPCMbWST08dUNyY2ci9iXkJcqftq6TKiwVBbhmzjEodfhB/f9x720YJtSKROMAQ+EGn9/uftd69dGTYyG1K29JHInHN2NosTHvDboaKGmea3m4iTznoqd07iJOpIiJk0n6A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916212; c=relaxed/simple; bh=MgTdUT23fOeo4lJpFf5pU2z6Cd/OH2vC6NoaMbjXKuM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=glpB4szYu+18UnZ/3RDEoihPmbUzkDWcmMAGIxP/ljS8YGDMpHMrwFs8aqhm8a7mBMW1P8aql71+R1EkSkLJX3hxVvHkMI8/BbvypD5YRGuQ33biKtaToTFbQQ3fUwpbiq40XLiFfzAXUXIqmXrX7v0GFwrSsu2wZkHwtx6wFzA= 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=k8E+4P9g; 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="k8E+4P9g" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784916209; bh=MgTdUT23fOeo4lJpFf5pU2z6Cd/OH2vC6NoaMbjXKuM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=k8E+4P9gWtCyBsGC+fNRJpAXy+NmeEwgUwwtJgiL6nlITKMBDUIiw5vKM0HjOkuoi 8qT/mv0IcFebqm85MM5FNoJVzf2C2Adx8SchRdtMj61iZnL1pX5ZZkZX4fXZty/DmR +UTgBjYFztj2aTAz2V6/WvOr/2MOU11+7QSjHWVXXTISJf25fceekzx00GwgHeXvFP uK5+n16UbBZgOW7VvVOdZodkWf/lQvErHPvDB3eiZ2Qm4Vxcy8Ega61Ifj+RdM+sp9 nPcOamuz0SM9rjrtPNj+TnjeoHWA0HVhWiXozXjLlfwJk0ud/glmxTZUQ3WuyBiRkB VqHxEsesTDzpg== 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 310E817E01FF; Fri, 24 Jul 2026 20:03:29 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id DD2BB48002C; Fri, 24 Jul 2026 20:03:28 +0200 (CEST) From: Sebastian Reichel Date: Fri, 24 Jul 2026 20:03:24 +0200 Subject: [PATCH v6 02/16] drm/bridge: synopsys: dw-dp: Cancel pending HPD work on unbind 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: <20260724-synopsys-dw-dp-improvements-v6-2-041d99a19c4e@collabora.com> References: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@collabora.com> In-Reply-To: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@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 , Sashiko X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1048; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=MgTdUT23fOeo4lJpFf5pU2z6Cd/OH2vC6NoaMbjXKuM=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpjqPCsRTRL+xEFbExnTin0ycKqtU7zs8hX4 M/+R+uQZi72nIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqY6jwAAoJENju1/PI O/qaMioP/RnwbfK4SHGm0lJrJjaw6Ld0ZL0QwP6M9ywqYvju/3p4uxJ4plofkcdBIetNZqlZemu 4q2u5pyCz+K/TqGf//cRYt6mzSfyDR5Xf68fIQgmS2XWMkuSZoPcZLd1ifAFWEuKlh3KI2UoEc8 nacBfLReXeWGs6cOgmQuYRuSK/e7+XIL8V9sSOMniZi42JO47gM68rtR792Iut+8JeO+jqulJPc 2YOYYAakvCywWqd+szBQlAP7YVq48IyqaJsx2X1OWf2RqoTNC+ZlTA1/WFVE3L9zltqjWf2AAlu NzIx2l7fXdtXKGac8OZT1cd/VJBNrJexVD7Eq4cKRAE/Z/nMkXKU0waOGWsO/D6gKEM1Wehk3ik 6x5c/PbCJ/3mEO21dHXIfztJdY5px0kCD8FXowdLZPewthLaSKnWM5Oz0Cs8mZmI39DGpCodRXe 08GYybFAUiNZILYozTYUa3J1uf/XBn/0yd84aMQ9Evwn114vq1nG+Hy4st42AycklhCKN/3HBDy ODpdR48ISroBj6Um197i4EhNe+6cJmqXfmMY0SlWjXU7VWdZZ2ofYEtDJZ9j+UFb+bhP6BNyKGT HOLdFNFA3dpSycfJVo1jX/XzXPpch2295BjmkYn31rOeWKH3+na6zCfFu3SzGp2BI6SQBJ7UQ0G 2t8Fh7kzURUsVe4blvZ495Q== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A There is a race condition during device unbind: If the HPD interrupt started an HPD worker exactly when the unbind happens, the worker thread might access invalid resources. Avoid this by stopping any pending work immediately after disabling the interrupt. Fixes: 86eecc3a9c2e ("drm/bridge: synopsys: Add DW DPTX Controller support = library") Reported-by: Sashiko Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 368e1f85e625..21bd08571dcf 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -2009,6 +2009,7 @@ EXPORT_SYMBOL_GPL(dw_dp_bind); void dw_dp_unbind(struct dw_dp *dp) { disable_irq(dp->irq); + cancel_work_sync(&dp->hpd_work); phy_exit(dp->phy); drm_dp_aux_unregister(&dp->aux); drm_bridge_remove(&dp->bridge); --=20 2.53.0 From nobody Fri Jul 24 20:48:46 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 833BA3672AF; Fri, 24 Jul 2026 18:03:31 +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=1784916213; cv=none; b=PI/IofusMruh+11FHgB1sWuXnJN7p9aRcSks+ae2d9RsVhqbE+DoFCLOSy9gplKyjGip0UeAuKRVqabpKwMT2nO0ZiFZRkwQHC25obSbdPOeMGJkWru8bMR39HuIm7SyHL7lsNOMng92tNuCDC7xAwu5bZuKu+OM83IjDBKiOls= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916213; c=relaxed/simple; bh=K1Za5bWNUcnyTglAfKgP5KR/CLG+7GCG0v3x3t2iK7c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tgKdaaIZPgnvNC9/yDhCxFubNdLo7h55z3mRQuPd88WucUaiuZDzRbAOPbtqpbAdz8b5qCab12vF3Dy6SOZdN73aJLOAHuSPunAPT6w3Dkln74rLpiiYECA1Q4RoazshRGTtZ6b7XQII0ah5T/SbOMvuhfT0I+3Vea43aLz6GoA= 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=hX15Hf/9; 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="hX15Hf/9" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784916209; bh=K1Za5bWNUcnyTglAfKgP5KR/CLG+7GCG0v3x3t2iK7c=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=hX15Hf/9X+CVUa51M+H4hMh87dr+fBVbdDaU47SwjNZgs3Z+btzcSB9nPn0eIkHtw h8YuOeiyGtHfxoMH3YGTPYUyXeIM8+8ppLxxsQzgM3k14tuj0qSgZ8YVbptAKcPFxV HRdLxLD80ItpSMWTzAqKR3O8urZnoA0YbUmL5XAw0CW9NUzvoF6gVmiid+nDqFM7sG RFIDDHArANCMIw+0fp0MIkEt0C6tIZ+5cH0weX8fcC1KwYwWYmHWCOZhV3/aySp5rO O/1TQXxumtIuXGJGQSp3yqev+NcDzUJ+1e67Ykix1N6526n/sNpaUGlzXocPBiRPDL j8eXMKxm6dwcg== 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 3240517E0203; Fri, 24 Jul 2026 20:03:29 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id DEBCE48002F; Fri, 24 Jul 2026 20:03:28 +0200 (CEST) From: Sebastian Reichel Date: Fri, 24 Jul 2026 20:03:25 +0200 Subject: [PATCH v6 03/16] drm/bridge: synopsys: dw-dp: Add missing mutex cleanups on module removal 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: <20260724-synopsys-dw-dp-improvements-v6-3-041d99a19c4e@collabora.com> References: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@collabora.com> In-Reply-To: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@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 , Sashiko X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1166; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=K1Za5bWNUcnyTglAfKgP5KR/CLG+7GCG0v3x3t2iK7c=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpjqPDGJdnZhc59GK1KDLRjF9Jl7LYQ91BvS bRWTpG6CuDCD4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqY6jwAAoJENju1/PI O/qa+9cP/ix24EjhRs9MFdFHjZ82uXi6N6SVX5BFk9ZCHGqhbdwr/XovPynmESWgj4k/gkzOCXv W/8kMdEQRAnqpJIj5noQRpCq6akOcdQ6Twl5k67poAjtH7BMMYlvoJAMkYr5nx/dxOIrIp3rcLy gV1Hoig4MJE/IFQr9RFb2iR/pqTo4XntvkqNM/cq27jo+hy4mNlCCkXbyzHRntJIIIcwCQGKUPA wc1vsJbx/g5aEJ3MF/YmPvMciDkOP5g7MvYtNAntuwIm1NuH7hdOKEkQlFIWRzLmHy0DFKRQV/F 6e0ZjmjIo2nOawjb2I5Vkcq+k4IVc1nSDPzEg0psT5D0dxaZJb7HpjmO7FeJGulTGgXD7AnImRZ Yd2mN15thHUTyVRG9J8WFzHnUPsy7/iFV9JIf0xGUs46XGNi78TTRrmo0chkuk+aETXZMKMMXgk zef9bByN+xjIJApPKmCawS0M5r0GsNXyk1bzoGEunR9IRuuzltmLfbebVHO8Rfrf4adtF/QHMfd 2j0jyIdw0POkFYrBBzS8NsyTbLgVg9RGLw25OdwFd+Jd1feaHCsNQNhUxfo3xISwJVJjOEPWdzS SjTeeI9c7zLY456ydEUCZZJRMjZHnPtRTopwhp3q6A8hXYTfheMYFfYaNXNDVmtVn6r0dCR7Byt rJMNa5DSX4g8ZayQrltknZQ== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A The driver is currently missing to fully clean up after itself. Ensure that the mutex is cleaned up. Fixes: 86eecc3a9c2e ("drm/bridge: synopsys: Add DW DPTX Controller support = library") Reported-by: Sashiko Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 5 ++++- 1 file changed, 4 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 21bd08571dcf..b28040d69fab 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -2031,10 +2031,13 @@ struct dw_dp *dw_dp_probe(struct platform_device *p= dev, const struct dw_dp_plat_ dp->pixel_mode =3D plat_data->pixel_mode; dp->plat_data.max_link_rate =3D plat_data->max_link_rate; =20 - mutex_init(&dp->irq_lock); INIT_WORK(&dp->hpd_work, dw_dp_hpd_work); init_completion(&dp->complete); =20 + ret =3D devm_mutex_init(dev, &dp->irq_lock); + if (ret) + return ERR_PTR(ret); + res =3D devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(res)) return ERR_CAST(res); --=20 2.53.0 From nobody Fri Jul 24 20:48:46 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 D81CE37757A; Fri, 24 Jul 2026 18:03:31 +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=1784916213; cv=none; b=TrR7k2JPPt8cxX8GPtp5MbbDRITH9kDKHrM3BgZ4wAgDBFwLbhyJkneTZW4D6HLHEtFUOSXoS/4pZYi26sgdkZ2viJSRP2cfnBJi9q1EDTpAtDIVNwHZK3RTZn4GpbgSpfnP4E8Lbg6NjMKgoSoiNUKJXpjsSBrtS3Kc1QmzIEI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916213; c=relaxed/simple; bh=GBB+Lg8R2SnT+UdP5XDerp6qRWg/p9sK7PZSNKuO9xQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=n5urqwusH/wh1CxfY7c2lKARm3zB4B/Cjq1zrMryv0rs2Ij2iy0w1EFVQ4J6uOeJSwQ6n1ZOUjiMJ8Uw2DJLGb9ORn5D544KGr5a6NvdnyJ+KCcyqnKvPe+PfGYZVEL0zyR2KMYB1GiQ2XTTlKOEK/Ybb6xf5lU0YLE3T8FzHCU= 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=kIeu7AxL; 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="kIeu7AxL" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784916209; bh=GBB+Lg8R2SnT+UdP5XDerp6qRWg/p9sK7PZSNKuO9xQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=kIeu7AxLBHHoztESwR0GOhVOqtMqigvPVR//wws4csDnXk2KAO2spKmF0AU7QLzU/ vYtqIb4lHqHRfXUZMCCJhutp1pNQIn8CQRXl0dnZV0nbGao0dmgUC+tQNIBWv4lVjQ ZlPQ02fVjb2GMskc7oT5meDFenkCbH74lIhnUqBXLL6rZjieBecYET5aQ6az2vp9fC NR0z3ugmpLKnbF0FxEOpnnbKS3+LpTKjf935rkQRcM93mq4TwGwE+EoQrf38hleS// jD3N4p1OmC05EwgzqqfhRAZwEUi4kC6ddzw5XjcX3zKVLhwRf5lt8IKxqSEZFyjV0N cSD031f6CFpfw== 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 34DBF17E023C; Fri, 24 Jul 2026 20:03:29 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id E09C0480030; Fri, 24 Jul 2026 20:03:28 +0200 (CEST) From: Sebastian Reichel Date: Fri, 24 Jul 2026 20:03:26 +0200 Subject: [PATCH v6 04/16] drm/bridge: synopsys: dw-dp: Add missing reinit_completion 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: <20260724-synopsys-dw-dp-improvements-v6-4-041d99a19c4e@collabora.com> References: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@collabora.com> In-Reply-To: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@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 , Sashiko X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1245; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=GBB+Lg8R2SnT+UdP5XDerp6qRWg/p9sK7PZSNKuO9xQ=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpjqPCVx7dzGMvZV6H76jbyaGQIx26k+zHTi APYYT4iPdlkOYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqY6jwAAoJENju1/PI O/qaxl4QAKQdLUWsfAwNqjJiyESFy/nTlsH4BGWR3z1BU0EKwkSQu9XF1lvEzSySoSsiKdznyVk D1buzhAti9vbSEOI3YNzbrSrwvo3B5wbIjeAdVdo19r/Cdu/K607o2kBKcVbHVJ84EdO1ivxm8M +barG0gNo14jQCxeAcngFZcq7PegI7cCVFy1De/3jZOm/B5SvhGMwRtXigxpjd7bDpGgKHPJM7L /sK4fIGSDThz/mZ9A923xzjPYLEVc8SC/Xz3QFm2IbwlCaGxqFxD0dzEKEHqgorBvVLyivmhnOG ejQ4OFbTxQXRiIhWGE3un8WuRmGL+tg7J+TWQGXXn/3xY/wUXUi7TmEOlxnnmLccWe36ydq9KVH AS1slcvk9pa6a5JliQosIhEuVXlPvXkodEiKH3J2v9L9yMQFEQXpkgn6KhgUT7dT8V5vd9NgZQ3 pHNFZkdAuflcnmhy7QTMc4WNzUEpwRcNrkT0N9fh5NpkMstkVe1zJFV5gx67gcN5HFzylZNXL1f dql7VHEpGWesfUrqhIFyrZUzMUuuWWmh7rdEkL8QgJlXHRGeI2FQrrkmP1WmXp3kUaGk7wrl0qo j5GMKXJeA58mCDwybkZhQha2L35hjyZQozUiBdY1VNc1WQyYy7A45ct51LFZXTk/x5xtdMESNoT 46/BGhGPBRo4idDqgoogyGA== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A The DP AUX transfer method uses a completion triggered by an interrupt, which can timeout. If the function runs into the timeout and the interrupt fires afterwards, the following DP aux transfer completion would trigger immediately without waiting for the interrupt. This in turn means the next one would also be broken and so on. Fix this potential issue by re-initializing the completion before sending the AUX command. Reported-by: Sashiko Fixes: 86eecc3a9c2e ("drm/bridge: synopsys: Add DW DPTX Controller support = library") Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index b28040d69fab..2f0ee7ab7feb 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1465,6 +1465,8 @@ static ssize_t dw_dp_aux_transfer(struct drm_dp_aux *= aux, if (WARN_ON(msg->size > 16)) return -E2BIG; =20 + reinit_completion(&dp->complete); + switch (msg->request & ~DP_AUX_I2C_MOT) { case DP_AUX_NATIVE_WRITE: case DP_AUX_I2C_WRITE: --=20 2.53.0 From nobody Fri Jul 24 20:48:46 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 6EB6E37B011; Fri, 24 Jul 2026 18:03:34 +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=1784916217; cv=none; b=FOXITt/JWeyO7V79cFyEEo6mfWQeYEAH9FxuzdivhpfnW8FCQHiDOwIM+BjZq/q8jtdMeZlkMoRvXRAfGM9klYdOCrdliNuvx5hJdVXO0OqCjaLnaCJRvSPdzH3QQIy8zDIkW2yC+4dC7hnt5sfzClA0QAFC54zmQqck6gOZgFo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916217; c=relaxed/simple; bh=+BP3yAfmv0iJDhc03rsvm9pbQVWfq3cvB1j4UIg782o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tkMOAsIAVSHvc0htzb0AdwDV3SPms6lC2cqnM7AUf7m0J0o/it7C6gjgz2C4blVS7n8yX+ZxzHE9QXFVKJIQ3vTsZkqhNSdO7BO8WecXaDUdsYWCT5vHjxUZEB+cPG8tHQV5OZgT0+Oj7QT7AayvaNSbVBFYiQKRyV1JQq09VW8= 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=XG3slHku; 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="XG3slHku" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784916209; bh=+BP3yAfmv0iJDhc03rsvm9pbQVWfq3cvB1j4UIg782o=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=XG3slHkuYYUv9w+gzQWXlmuz4zl7FC/xS8R8E0/XRCYI4L0vOC4Mio/9cgzxtkoeP 5PmJ/M9XE+teJCqD0F5p6+VzPJADuAx8FnsMGAKIsfckZbyFykkDQweIIkiZp/UgYi 0X625OQzZVOPapBE6rJAV1MzeH07F2FWmWSafIk9RYoPR393feTjH8ZwJGPXMvCa/6 n6LvbRZY2IgrP8dwqu0wAeEDbSglpsgWzKFLIi+BujXzKZqjvtmR6RV4CIYNFHXnNc n+J8iMvx/9y5+9dPVMDbtbMomqxFrrHRzs9cuJP6aZRrhXXAG/aoIcVMjZcih06KYy WoTm+plwsx2kA== 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 8247A17E0254; Fri, 24 Jul 2026 20:03:29 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id E2388480031; Fri, 24 Jul 2026 20:03:28 +0200 (CEST) From: Sebastian Reichel Date: Fri, 24 Jul 2026 20:03:27 +0200 Subject: [PATCH v6 05/16] drm/bridge: synopsys: dw-dp: Free output_fmts when none are valid 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: <20260724-synopsys-dw-dp-improvements-v6-5-041d99a19c4e@collabora.com> References: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@collabora.com> In-Reply-To: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@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 , Sashiko X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1057; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=+BP3yAfmv0iJDhc03rsvm9pbQVWfq3cvB1j4UIg782o=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpjqPBjdywFTzDTaVXGdilCObTvMKWIYLtxk 2K7suQeIqIUyIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqY6jwAAoJENju1/PI O/qa4S8P/07bfGaDPegp+ACmrRP/MJhMDqIesDaqld6fnMYkczHA21y64CKkseZr2L3n7mOmcWT X4+zsKYgXdYx/Z6DQkwhPee/7j3rCYu1nImgE51FSF7/JMxsSPQzl1dX+48xxm3cyKIGlp24TvA ypdlWIJ7ZjWN7hUIc4MrJ4NCLBGHlzagTsh7nbIdzA5U475BXekto0Gyq/jE+58jxHXNraR71EO ZcALPNOG7GyjoHH1z3kKhsM/Vk4wnSE5QFqG3QTcVESwMgcYTWQ9igzZuVFAe2sIyrhIuDKbQAq M9Q5IZe7c5myotflUKflVeXcdJsCSv67Z/7gM9mdDhT3LiK7oaiFW8TBZzfLrE+xiv2fuplofjs NVMNRL6GMMA+44Fb5jP+HYj5KFZsP4U1DR9oeEVqX/fW4pSZrTHZejUe9kHRZh/jGpS8TaQzOLl fjQfczxMnUE6u8c1LfIyBVGWWTY3LtQeAs+nGJjbgwon33E+POS6uTAa5sqgZKWAb9rC6gmIIth /NMUI9/eF1gHDe9q29RPAw7oCHDAAwV6K//21CkaaZI9VPNODd7/DQfZjUTqE5FL/mKTzvBywhI /pQqPK+b6D+TzWPBacth74WOHra9xilW8AdXjdpiGk62Wl0oXtTQWUAoRtRPlVWUnOkP0WWvpSW R+kORJPKhCqWdIIluoO4sCw== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A If dw_dp_bandwidth_ok() returns false for all formats, *num_output_fmts might end up becoming 0. In this case functions calling it assume that nothing needs to be free'd, so free output_fmts within the function to avoid leaking memory. Fixes: 86eecc3a9c2e ("drm/bridge: synopsys: Add DW DPTX Controller support = library") Reported-by: Sashiko Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 2f0ee7ab7feb..7f6506f8d4bd 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1797,6 +1797,11 @@ static u32 *dw_dp_bridge_atomic_get_output_bus_fmts(= struct drm_bridge *bridge, output_fmts[j++] =3D fmt->bus_format; } =20 + if (j =3D=3D 0) { + kfree(output_fmts); + output_fmts =3D NULL; + } + *num_output_fmts =3D j; =20 return output_fmts; --=20 2.53.0 From nobody Fri Jul 24 20:48:46 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 6EC2037E5DE; Fri, 24 Jul 2026 18:03:34 +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=1784916216; cv=none; b=uFKHueeNmrF/hQNsgjg75KxodRNitqYeuqOG3Z1beLzPgXXGO5+4tXggZF2tV0OfRwrJH9y/Q6hbTSFp5HvFKSOvVvpVLlI23jlnN8Jr0h+KtVo4We6f3zse7pLeuyKSkPpx/VmVjBVYymMRMsjkkeHavVp+B+uJ0cDdB7WMWzo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916216; c=relaxed/simple; bh=bxRQaakt4rhVzofqO20wRU2ZeolYLlmRSmpPv+XhY2o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oc5aPWVLohzVsYr0j+AHxGRA9pvi/Dly6evlpBy6RjCQmqODsML9ngcVaDpGysNhIj0hLdkj94jfNlnqq/rG98ZOYiFjfPHmPugtvXeqWZMkgoKA/ayLuQp/gzjz7HRw9xiX9vTyukoriVv4nfrceHQRODqCO2NkcUVE8WX8cUs= 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=GkegGCFx; 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="GkegGCFx" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784916209; bh=bxRQaakt4rhVzofqO20wRU2ZeolYLlmRSmpPv+XhY2o=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=GkegGCFx0XmeMLWi/WBj3Tqae8n5c5I7+5cUeXld2PreudiM1oZ0pwk7F3/yJuQyD Mo7mMwqaGSqBKeWtFYy3TTShJi+g+OOU5di8snQ6YaaLW0cC+H0UgwcHM5sPczljn7 vQRasJ4VYyCL8CoZOsJC53LIVdiXsUa3/xbvb4AqGJGMDyC55r1bDUorTWKT1xJgqQ 1nrFl5hF2zzIH0WcqJL5x4syV2eP61katj6PXZ0fLZadpmPD+l27ANDFL778HhmVaI bJaq/rY4O7XZtBY1xoa/juzR6/cnXfXwCy+cdr1fTRHdzZnMal8CkAd63uQHO7RJaa fcozIy1JgnKeQ== 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 8459817E0257; Fri, 24 Jul 2026 20:03:29 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id E4582480035; Fri, 24 Jul 2026 20:03:28 +0200 (CEST) From: Sebastian Reichel Date: Fri, 24 Jul 2026 20:03:28 +0200 Subject: [PATCH v6 06/16] 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: <20260724-synopsys-dw-dp-improvements-v6-6-041d99a19c4e@collabora.com> References: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@collabora.com> In-Reply-To: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@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=3804; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=bxRQaakt4rhVzofqO20wRU2ZeolYLlmRSmpPv+XhY2o=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpjqPAwpHg+P1nyrPLA+ZUugsOjnTN3wkFHl 5MelR3i1mSSf4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqY6jwAAoJENju1/PI O/qaZJYP+QF6+d+ydXFzeDuIig0NKTCT/LOzdWPgsejIlgBIIr9SAhbx8zFj3caRWEI7offVYqe 8ezF3K+Gxge7l+8Hc7dPdzwGcUu9AyOzu8y5ubqWVVU8fOAQ8zQO8qLXGLsgCTgwBCMtvFod7Ua lW5LZAg9Z2ffUsYDaBA/Ok/cj7GSbpk4gTdi0yswyqUrG+RRzR9Y7TDQjWSZl5l7B9rCYSG6SoN zFGX2OocYVudas1aWkvVuFLsVqCIYBNeCfqk4YlxdcVr+kadMvFwGrefFbztjVNl/3MGvkKl25d Ti1sX4cv9vsu7C6Nwu9934d+xc8hbIEILPFOPRmbzxdTO88Ut0aR0WHD5xFNKY+NmWxGR6FJCVc FnUYaakQo4WxLqAg8kc3bxSrDN7S4SpM7QbWyMH1KseS6mFMeqCeRyr5iRYYv0WQGDyqym5AFnl ocBlI2o6HHo7X414by0l8HW0R9dXo5LOw+1iyJNrlQZlR74odyat0qsis8NhPD2nxqq/KYvW+Fj oVJ2lXeaKT2O6pNiuZuzcedwPCsxbBNIWmWlvI8/faol1tZHzLwq1blkXBP8FyGPxze9Si4KEMJ BPgSzw5ajhF+vBYwXdoo1ILehz4rHR6yqLCWBjpcEi+4kwTHH8CWFfEH32uyol/GyPL/P8PV4+Z M/VMa12BD+mPsv0P62rkwCw== 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. For decent support of this, two areas are changed: 1. In atomic_check, resolving MEDIA_BUS_FMT_FIXED output format by using the negotiated input format. 2. Implementing a custom .atomic_get_input_bus_fmts hook that, on MEDIA_BUS_FMT_FIXED, advertises all bandwidth-validated formats from dw_dp_bridge_atomic_get_output_bus_fmts(). This lets the upstream encoder negotiate the best mutually supported format. Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 34 +++++++++++++++++++++++++++++= ++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 7f6506f8d4bd..259efc25b56e 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1530,6 +1530,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; @@ -1540,7 +1541,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 bridge_state->input_bus_cfg.format; + + fmt =3D dw_dp_get_output_format(out_bus_format); if (!fmt) return -EINVAL; =20 @@ -1807,6 +1811,32 @@ static u32 *dw_dp_bridge_atomic_get_output_bus_fmts(= struct drm_bridge *bridge, return output_fmts; } =20 +static u32 * +dw_dp_bridge_atomic_get_input_bus_fmts(struct drm_bridge *bridge, + struct drm_bridge_state *bridge_state, + struct drm_crtc_state *crtc_state, + struct drm_connector_state *conn_state, + u32 output_fmt, + unsigned int *num_input_fmts) +{ + /* + * MEDIA_BUS_FMT_FIXED means the downstream bridge does not constrain + * the bus format. In that case, advertise all formats supported by the + * DP link so the upstream encoder can negotiate the best match. + */ + if (output_fmt =3D=3D MEDIA_BUS_FMT_FIXED) + return dw_dp_bridge_atomic_get_output_bus_fmts(bridge, + bridge_state, + crtc_state, + conn_state, + num_input_fmts); + + return drm_atomic_helper_bridge_propagate_bus_fmt(bridge, bridge_state, + crtc_state, conn_state, + output_fmt, + num_input_fmts); +} + static struct drm_bridge_state *dw_dp_bridge_atomic_duplicate_state(struct= drm_bridge *bridge) { struct dw_dp_bridge_state *state; @@ -1824,7 +1854,7 @@ static const struct drm_bridge_funcs dw_dp_bridge_fun= cs =3D { .atomic_duplicate_state =3D dw_dp_bridge_atomic_duplicate_state, .atomic_destroy_state =3D drm_atomic_helper_bridge_destroy_state, .atomic_create_state =3D drm_atomic_helper_bridge_create_state, - .atomic_get_input_bus_fmts =3D drm_atomic_helper_bridge_propagate_bus_fmt, + .atomic_get_input_bus_fmts =3D dw_dp_bridge_atomic_get_input_bus_fmts, .atomic_get_output_bus_fmts =3D dw_dp_bridge_atomic_get_output_bus_fmts, .atomic_check =3D dw_dp_bridge_atomic_check, .mode_valid =3D dw_dp_bridge_mode_valid, --=20 2.53.0 From nobody Fri Jul 24 20:48:46 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 B713137E5FA; Fri, 24 Jul 2026 18:03:34 +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=1784916217; cv=none; b=pXniqGJ+5VaoPbfTRpY9NVwS1j7s/aNYExzfEN9uOMhpg6KNsBwWbp3A/qnLtUls1H87uUFgiUnx2nP6rZdyAN9jgVo1P1d7MbqYKJPcLyK3IwMTOm5JE+xyLrjg7GvsUKJ3gN7md4uODzZHta3PllMT4g+I4o0qdyIQVKWza78= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916217; c=relaxed/simple; bh=ZVoO+TO8uWEwz9LdVqxFuCH+Ajmt6oSDwVT54yj0maE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PknRxvEPMTTOwqCzsrkgphzkKyESTjlhsmWSpI+gokSYZNfLdXwttwZUC/oIO/OcQFTGabPZPG+lfQ3kYkby+YmSjUP+eqMyhEJ/MrWlfdRYqh7tcxCYj+gnwYhJeUhHJ6ZR4ZXHMBLFp9wE1oNcrM1dKJV3WjlpJdAK9vs2cI4= 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=VLNzWbB/; 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="VLNzWbB/" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784916209; bh=ZVoO+TO8uWEwz9LdVqxFuCH+Ajmt6oSDwVT54yj0maE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=VLNzWbB/g4HqO8DnfBTdyUeydm4rmk6WHBa6jv5kwj9Whxa8jhC1yiaKz/dCcGyyW txRCwCxkTuy872zTMITc2DCBrEoiOY+hSkTIBv7+80mrCxDX9IZMsvFSLRuNICwWoO zjTf1Imh+hKXGYtBcfkWgU4Q8FBMYEUPPCfZk9/IhHa3IBW+BakuP7H8U5zq20s+sP kHFiWXOSCndaMmm18tf00vit9dyoz3qvHY+hX43Z42eHg4zIdUE9+BDzQpc6MV9dbU K597Zem3wSKtFsPPgTiy6RIx3eNTzo+GKuXYo4oDd3wO4LOcbegGWcioBmAG3Qt4Ao 2+SHHEBVPBFLA== 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 8A82E17E0269; Fri, 24 Jul 2026 20:03:29 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id E5DEC480038; Fri, 24 Jul 2026 20:03:28 +0200 (CEST) From: Sebastian Reichel Date: Fri, 24 Jul 2026 20:03:29 +0200 Subject: [PATCH v6 07/16] 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: <20260724-synopsys-dw-dp-improvements-v6-7-041d99a19c4e@collabora.com> References: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@collabora.com> In-Reply-To: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@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=2801; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=ZVoO+TO8uWEwz9LdVqxFuCH+Ajmt6oSDwVT54yj0maE=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpjqPBt+d+PL6B9eF1+QKpltTd/ZEWpxZF0o RUjyOZQHg03CYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqY6jwAAoJENju1/PI O/qa4bQP/iD1nY7GVxlDczJhQ4MM9ry4m0ubrm6201/KiAAJVW6neTdQUCpq/oK5vxkN88gJFDU auulRqBTi7qyXiZbEHYAUlKev1B+nmSemXwyU1o7SYXOMJojyncdmhQvrwRmTyxtjar/Rc8DTl0 ZHpPpU0jRlLmEf11ciHB8KLBm4kk0qo2hL6V2ps/GyYtAbXIQMBsqtO91dNOJB26koqZIYvdNuR tWbblM0Uw/iBpAfcsmlLmPeMGbCZevsZ4UnLhCwBnW4XRSsC4o1RmRP4g73Ld2mTVIRIMrubT3G UGFxTR7rMXUK5SwYuEhyxGL4g+D4U5veyUKKlTT+ok7ah88EiLcuXF5TTITKpFaAAIRpxcOVfSW PlpWo7qC+Uou8PwbCxXeebiIhTjFL44TGo4W6stbmkJL0aQwmZq1AA78pY/MmqtKuJlgKKVP31K N7gZlbIa3xnfE++7oW6uBBN325tXYs/n4qsqoz7QDTRK2GvQVKKEvYQnkhCwEHr7dUs+d+duRJq 0LqFsfjUrs+LOho21+34Mnvu6z/SvtsgmausVxVBahYOmZFQRYrqgVIfLCCIq8K+Q+rq/D3QsJA YqvJTSKPoEG3TH9xY3ub/mQMOT1kZGvk6CfxRADLdq+KQoc+f5Ijn5MBka7oiN6lL5fjIWbSbsH nqLiKCc7kje7vgsFCUkksog== 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 259efc25b56e..591b75c4cc36 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 @@ -2021,18 +2023,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 @@ -2048,6 +2067,7 @@ void dw_dp_unbind(struct dw_dp *dp) disable_irq(dp->irq); cancel_work_sync(&dp->hpd_work); 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 Fri Jul 24 20:48:46 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 B762937EFE8; Fri, 24 Jul 2026 18:03:34 +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=1784916217; cv=none; b=lclzT5Jp2M1n8asTv3BSASEqGSXCUVv99LqpMe8vdUUMtOAq5H3QoqbENZNgs6i/s8cTLkAMNoT9r2nmocrTgWM4zFKIpvrfPm746sSArLNydZoEX5l8ZgWOAsDFx3x9J70sBqAImlSv6HJs0efR/yQBFQAETwHJf3Erx8vUngY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916217; c=relaxed/simple; bh=9OEEVTGH6CtYBorsugsyey8Z+5Bz4/YUYRXLfK0S0LI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Geuvkh7gT0iy2QHAyIR6iiLU0tdBHZ4UIUy6RV+2d27qYXqmKvZ7aX54F/mq5rrOumHmmormU+DqnDaYGue4RjtFAE4TrypaVb0ISWOxq5jTFjl1ZCeeodWT1Iaho3UT66FnIAJ7DZ10olq4UcfnQqvsQ7pcDLJt7ndHtVIymmM= 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=qqQlg4s3; 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="qqQlg4s3" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784916209; bh=9OEEVTGH6CtYBorsugsyey8Z+5Bz4/YUYRXLfK0S0LI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=qqQlg4s3J0va/64Bui7TTIsrOZvhbLNOrY3hZVHTVZuKP2kF8rH2Ke+9oowTJI+Z9 6m/K4OSbDyVmoByfU47LcuTjkN2LWnEycrBUyoA5vbfXltZUQji8vStfBAFHXB4QLZ XJTlI7PNqOFntSDbf3RUchFyjVK9gVcQ2qkdFg5CfNXHKau4MRfXAhLKeJsE0arn1a 3NF6rK4BMNZVtcl5HQkeKry1M2M8TJAqO9c3fQVkSsJ12CKom4/YCWrdbBmf3bLNlZ Txj0eXHjtj0twrGm1aL+mcNk3PYbqew0BeT4WTMbfIAHqEjcRFR5fj4A4+9+WVP/gM h8AvZQkithQ8w== 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 8D10217E028D; Fri, 24 Jul 2026 20:03:29 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id E777D48003A; Fri, 24 Jul 2026 20:03:28 +0200 (CEST) From: Sebastian Reichel Date: Fri, 24 Jul 2026 20:03:30 +0200 Subject: [PATCH v6 08/16] 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: <20260724-synopsys-dw-dp-improvements-v6-8-041d99a19c4e@collabora.com> References: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@collabora.com> In-Reply-To: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@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+poByyZiAGpjqPCLO1hqgdLcvIm1J1/HjibHgWKUkisyL nCXYizti/yk/4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqY6jwAAoJENju1/PI O/qaTxUQAJaUNfAmI1AqFkIK8zpKkq1v+firS2sTHl1ebp8PblkEfrkjZQhPvH9WH6el3hi+zP/ Hz8YI7w2o8sG8wHfUppw0AhajM0v2ZV05OpQk+5PAQ+qQu3+YBp/ov52XbpZYJ3RDY+NCQIlcLL pnXCmXynQOEtNtrseiy58JCRlTAVN9ilSB1BTLF5BPe2c6K/yrk6nvBC6r6gV0wBXi5fInob67q d7xkRvvdTABTLWHqZJdeKr5MpMp5cbH4FItE2ebLMTxGXuoWsJYQeb2B2z+P/EcyxVIri39OkFL /Zj3dNUIet6DIIUpQYyP0ht+TxI+Z4VPAXYwVS8gSTlqCnToRCU1Po5fgVwws11n6MVxAjFhGYi ONQKNQBlQtVyNWg0l+SmVEcnwYFbNP2rIlUB4rbM8ImmWTNNLW4ae4vigZ1pKofd5B1TMI+3MC+ tf/4PnZBK36wkV16HJ2SpD8HBqG4HU7hwjOV6KpnwtOUE/BwxQlU2zGxri7MsgQwnkA06DOVmhD GtU69uluKutDNKzSkw6fzmE8QTnvGKuOoGP/2BAbybA55y8WAK3165w0vXnIHTAcuoMYO29zdE8 Ee+ftE6RYBkrS/oM+UVQud15BQiAj5wsPAaHlIudev52KgM/c3imSsxIucDIe0iOa3YInjdkhmn DTNPajLm2bbPLYGKvU1oj4A== 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 Fri Jul 24 20:48:46 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 2B01F37F308; Fri, 24 Jul 2026 18:03:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916217; cv=none; b=htoGKaxZW+4yNYEHCx5R7VJLM2tlvI8E5Lrd5gZhqWl1pi0dzSzzwKyCeeW9z/Te+XsZCL1Nagm3/NN1emb9NcYbnwBfO/0LK7xJJ3j8v3XeKbaM9vJpseDhi9iFvSu/Aw9Fd2a6fWfTH+RtN4OpcHxRrjJtnqc+fk+bX2gbng8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916217; c=relaxed/simple; bh=nogzzR9ac+VbBTxMQhGcK30fwo5nnt6PIgFs4AkbXPM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Jt4+HQVkILBJgXjD1bGsj3X/wVu7Xrb/ls4PLIP+u//pt5FZWlQ58dGl+3lJbRw8nNU2fLk3aWCYg/gb7+9YTmHLGErHRcBBT4ODU/Le6bwcuIQ7H20u4sibQVJcf9EvDD8skZoGh3wHbI1ftdtCwb0Gh6PobtRadaxyq4Awpc4= 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=Tbv65sBU; 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="Tbv65sBU" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784916209; bh=nogzzR9ac+VbBTxMQhGcK30fwo5nnt6PIgFs4AkbXPM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Tbv65sBUiBo74GFRzSouEaYE4InH7Rp2K8sW6umilrNjJz2xi+1mdcK7XFh6SAhib aLS6gCnORBfk5bGhGYNR3Fel6kS56RK+qR2LS7Id9rdH8bYnrqbRaokK9xh8+mVgRD 0ZJpUZmdqoVLh8/akWdBDuwun6FcQOaFla4N5N6eWdDfHDsMibBpzmDecFi06l4KDh q3gl9QSvsHeZY4rLmWs6WS2mJiuB2MFZ75EL/ywJxQ+V8UXMEHLxBwJJrGo1l4ZSVh MHkmvdumUHTKNb6SS+vOVjC2U4Jjose5Wb1XszJnxQisbrz7npkTmYGQ9etK0/ZlZ4 cpDXZJtkR86GQ== 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 9416D17E02A5; Fri, 24 Jul 2026 20:03:29 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id E924148003D; Fri, 24 Jul 2026 20:03:28 +0200 (CEST) From: Sebastian Reichel Date: Fri, 24 Jul 2026 20:03:31 +0200 Subject: [PATCH v6 09/16] 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: <20260724-synopsys-dw-dp-improvements-v6-9-041d99a19c4e@collabora.com> References: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@collabora.com> In-Reply-To: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@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=3756; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=nogzzR9ac+VbBTxMQhGcK30fwo5nnt6PIgFs4AkbXPM=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpjqPDqZ/f7V3zBft434SH9bJtIq9/RCUVbW EIvy0iKhu56NIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqY6jwAAoJENju1/PI O/qaolYQAKSGM6hajEeGls67DawyYjNw2/UuVCOWvCwUqO94Z1MnLB6tXz/RvEPxejuddvUnPTM TP9AGA89aSxHl1XsQb6PY6DdhSkt5xRnwb9doAfkfxC8KD2W83IB2nEwyYrImFMVvQMVwuwvE3Q ePb+TXBI4zH+0LWVwx8SemJvpL72LU39EoyRB9s/Qf8XpNnbmFPfcoDJE29CzXd5yYs13cnnMF8 nSaF1/4si//tTo15og1liqC4opBlSYcReIEdxl0ckOz19sucgG+nL12BxKpKFB77PpM6cC5k467 1UHQ46pErJmeT0jbBm6QxO2E7+MHB04/UoiUMc+Z436gBYIUIrA9JxK6z1tLa8IJNnQ6AnmgIu9 o/pY4mO25cizKJqNBBnqZoGCmJfWQi2ye7SYXVefex/B9vjoY9esYqao7lGPKqp1kMHkrFurcOK +Bab3uFbfrtx3OS4NC4uyjmsjfJVtSd1AP7PM/jrANtKON5KwdY4nXXmRDGm/doxs0V0gWImj1H auk5aTD28AjOrOvGoOBKOHK3V8MT7uLWZe61XuPlNPFu/QBrQE5dfu/jdAL9/9fRLl+oNxlvNby HWkyFTujscZJxfMI5Kv3I7I9zFi4EgB+dZCeqNZhSikqYzXl9hc5bpROysip9Ka9E3Wlzt0d7eG 1L8Lw9Qo78QeatyBpZu8xmw== 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 591b75c4cc36..2042bc00f906 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1852,6 +1852,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, @@ -1864,6 +1877,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) @@ -1993,6 +2007,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; @@ -2037,6 +2064,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); @@ -2086,6 +2120,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 INIT_WORK(&dp->hpd_work, dw_dp_hpd_work); 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 Fri Jul 24 20:48:46 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 F14BA37F012; Fri, 24 Jul 2026 18:03:34 +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=1784916217; cv=none; b=JUc11rtdBnwsGLrcMwfNVF4g3T44kOuAnWAMmUc7EaiRP6JAC93blH5aT6KyNAhOdFD2XY97aZH9N0fToR4QKS1qngRkR+OLbEg2WRKrycyaDxmZed7KZFXtam4ZqnPxmBdpiE2PBQ5MCOWrx0FLoqNuphmFZxAIQI+ppE0xS+Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916217; c=relaxed/simple; bh=dD8wMemlHuF99b5V8VTvaNJwIEsVl6jSjpD/ac+VXXg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cxp6vJVX7+8yTjf3mHlsZGvfyAavA/bOKEUyaKEun1n3kPaSertsqCfXkhT2fdyQ9KV+nApCa34Wne0oE65KpXo+OLGBv9RhxdvP52KyzjPDYa/mdILYnmyznoE+aGrzXlvCeHIP+NkeZGuyZVVNkoHlIeCYXC0zgmIdhB8Ob5g= 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=fea1z+t5; 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="fea1z+t5" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784916209; bh=dD8wMemlHuF99b5V8VTvaNJwIEsVl6jSjpD/ac+VXXg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=fea1z+t5+ZhpBkOI2wPHOM1IBxPRP5jrtAFpmfVFZQNuO8r3OsBmJ5e6+zqNlGN51 t7Ei0nT20I14w2vsLLV06kT61X2gpKq0+GJZqKRbquVT1vTGHe9Nj/e9MzFgQ3zcRs 4BmmnGuBfCSoYfCFlRMmWuIpfs/8PiSvB5ej+lqbSOIIfA4n4HWNkUWrkKBNifTwDz oVxcPKIPPBWsz6YXYGZdRQ2S3a+dzLaxzj7Cd4cNZk3jQsQBuSQqlb1tOgePDawrm8 AMempwCiBIG3d3c75O64Q/is7T+UHvVIT+lbJJLIeYJfq29INtCbwAaJNM5OGDFDcx oiMQnfFoBXiAw== 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 9704E17E02AD; Fri, 24 Jul 2026 20:03:29 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id EA96B480047; Fri, 24 Jul 2026 20:03:28 +0200 (CEST) From: Sebastian Reichel Date: Fri, 24 Jul 2026 20:03:32 +0200 Subject: [PATCH v6 10/16] 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: <20260724-synopsys-dw-dp-improvements-v6-10-041d99a19c4e@collabora.com> References: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@collabora.com> In-Reply-To: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@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=6500; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=dD8wMemlHuF99b5V8VTvaNJwIEsVl6jSjpD/ac+VXXg=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpjqPDp0lL9aFJMsPmCeJT8l3NQPY1hE82Gt MKMLEc8r1F7RYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqY6jwAAoJENju1/PI O/qa2BQP/imT9bDZ/z90BkrvrAvOOwx6q0BJHvCyJAoNGNjuDVh3C5QwZDswP/9VvrzUnxSOZ3v DpnN3I+0SCiUa+upE6yB2GlbXGJ9bqm7Gq1zfkm8NWm9kAiD+rIDyG32+zKoXhFWdADCkYAIKBC AwPpE5OsWUlnNYHQmYnJ47A6T2CniPFox2ks8/qejHpxBZ14pcsQNarr19jr66RA/B2SkeoGiQi NfTjVcIh5D9W/PGLhTOWAdoeer5qwXvJYijfvhS9gxvtIz4rf9Ix412ErfA/ZrtGCJGDf439A6l OLKlQr2N0W5ffbDGIe5y5Qk8cZmVGRIwodnAPNsQZBOmxNy6LrYKrIFcTpTO/PwQCGzmWwLFPxP 2F0nuqreSDcXQ1AYz8cN7JYTYb8hELuq01c/e8q6L3Ei89kXggZIAJM1tF2SoU5L3rmIjm+eIKa W1F+HmPD1x4RDUzQ/xjQp6tDCDqnrbz2JCHv+JxN87ZNYWngx5PGBS4ouho4vcizV9GQPEedKvT Uj3PkgPZSRydWDS1olqx/UndaMWPhkmn8H8wYgUntXL2TInhq5BoAIRvoh+oURjttKgcN9xPiiV FIHUf+5461ctJpY6x9W5rQkPKXWWYMfL27dUsqaDDhQN8z0oXbKM4QligAmC/gwOE7vACrRyVm8 iSuWspnGja7PLSrh+IxosVA== 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. Thus this patch prevents massive SError problems once runtime PM is enabled. Apart from that it avoids 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 | 124 ++++++++++++++++++++++++++= ++-- 1 file changed, 119 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..ee0bd696064e 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,35 @@ 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, potential future platforms + * reusing the driver should just add a VO GRF phandle in the DisplayPort + * controller 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 +195,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 +255,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 Fri Jul 24 20:48:46 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 442DB37F31B; Fri, 24 Jul 2026 18:03:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916217; cv=none; b=eNysfpud5fU7+5Pm/AtwoCEyscD5tBL3JIf8c8vWerwkVQGBWltjKG9zDyMqxFmiowlKhjMW8x3Qf7KiQQ1wB6EtM8VhJMZ5xokDglLFWzc013JDEMuE5zlN2E347EaW/EZ0dkbyPMC/GCff6YXZ6S4PgQVyyHrAaZ1BHPGE6D8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916217; c=relaxed/simple; bh=Sb21u3BNR0bBte5cLcHkxQTLZNLzTlV8x9Hr4lta62A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jmwq7KsPkJOslOe2Or9rp63K+FACeRXU3NeAB/wvkhEdfOWMRxZi7rvs1LOz+lrfYGqcscllTA8u5yN7VnlsLkCKzIZLpb6QheKKIy9OGj3qsFs0QwJjJD+hGgxPAFY1msXAd1ofKKe0a8DrwmyVdE5xWKd1HqzMwoiLSIsedA0= 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=ZmmsIIVn; 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="ZmmsIIVn" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784916209; bh=Sb21u3BNR0bBte5cLcHkxQTLZNLzTlV8x9Hr4lta62A=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=ZmmsIIVn9mr+DPlqwRbYu3fJ44dJSXYBDZ8e6D0GNPg4RqdUCDlI9e5rTEt01Tqad cCqgsvqDGYoswrBBeaGfljhpGzBJnThr1Aihtevya4CgKC0dyrvrbummnaILsZcGJ5 NT6TkuR0Jk6YoI/EB5b9W97KejsZDr2E6K64uPTlees6vhJnB33+w/185Y4kp0lJJW E6LVxAuiac/9E6WZhI2EjlcF0PDC8sIyEgpJca+sJUOa2yGSi0hxFxHuXhMDYNDD6w aJ6TGRrXQJEDh2l2/nP7NVVMF7eOBlGw7CVD0vVYXWAebpgtUcwUUFojeIYD2BnqbS 7B5F+ZS3emI/Q== 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 9E4EE17E02B6; Fri, 24 Jul 2026 20:03:29 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id EC285480048; Fri, 24 Jul 2026 20:03:28 +0200 (CEST) From: Sebastian Reichel Date: Fri, 24 Jul 2026 20:03:33 +0200 Subject: [PATCH v6 11/16] 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: <20260724-synopsys-dw-dp-improvements-v6-11-041d99a19c4e@collabora.com> References: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@collabora.com> In-Reply-To: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@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=6907; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=Sb21u3BNR0bBte5cLcHkxQTLZNLzTlV8x9Hr4lta62A=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpjqPA/sE7y0qSSAl0Zke+p0nmcK8ASN0Aeb UXvUipGAJjQtYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqY6jwAAoJENju1/PI O/qacvYP/08UR0/e3lPD6mtBcYgFo+IHAY8bI2BsYuSuuHoef2qc1f39Yba1LsslvGBk/hpRllm OCWvhz/yB2LbG8Hi+CYSTuLi+tfQc0rfSgjxbFVYy1GdztdYErnBUORC63bcDn4LrXCifLVHpy5 eVjJ551Wgk3mwVSXxGUYmo3q6XUjLfpiZaG6GcqRl2PEc/jN/nW/xqlTQlPdBP1fQKtmA3Baqe6 AEi0rki9x9GIQhPCHpaRqwpNi8e+ApJz9db6ib16zuElnnTQ0iSyGECpyR+Dmxg7mr3rQ2KVU3l yWgdbgSPQqaOVcdMzfCacQRWH0217bqrYX3y3q9OLiYFEjaUgMGMd6Nx/FACz9DAzcUJkh/9EKb a6hPxj3aEak7MqVgd+1RYcokJC98NK7oUksP1ts4xs0RT/hAsk1Nas0ePVVPR89vpaB5uLBoYhb yywF2aQ1cLcq5RRMg+Gg1zWAgz7dSnkgEFN+gYMLnAfrvYXyhFg6OHsaZ5s5ptkOceJHbMgpA/Q kaRYvLVpnJ7zKM4SCRvwIn346bJSoAG5mdDoWbXlI4tk+IB+15psOD8FB9vGqP5hug94KL7zm4w eP80l6gY+Mn6cAjO9ABPTguWT1F9j870FUihDURKjlvYoND7uXC4eD/EwCBZaIFPAeGssppLdK7 nqWtCitB8WmpdgOusk94uIQ== 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 | 107 ++++++++++++++++++++++++++++= +--- include/drm/bridge/dw_dp.h | 3 + 2 files changed, 102 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 2042bc00f906..1bbb39b8d0be 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,11 @@ static ssize_t dw_dp_aux_transfer(struct drm_dp_aux = *aux, if (WARN_ON(msg->size > 16)) return -E2BIG; =20 + PM_RUNTIME_ACQUIRE_AUTOSUSPEND(dp->dev, pm); + ret =3D PM_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return ret; + reinit_completion(&dp->complete); =20 switch (msg->request & ~DP_AUX_I2C_MOT) { @@ -1659,6 +1665,12 @@ static void dw_dp_bridge_atomic_enable(struct drm_br= idge *bridge, struct drm_connector_state *conn_state; int ret; =20 + ret =3D pm_runtime_get_active(dp->dev, RPM_TRANSPARENT); + if (ret) { + dev_err(dp->dev, "runtime PM failure\n"); + return; + } + connector =3D drm_atomic_get_new_connector_for_encoder(state, bridge->enc= oder); if (!connector) { dev_err(dp->dev, "failed to get connector\n"); @@ -1713,6 +1725,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) @@ -1733,6 +1746,10 @@ static enum drm_connector_status dw_dp_bridge_detect= (struct drm_bridge *bridge, { struct dw_dp *dp =3D bridge_to_dp(bridge); =20 + PM_RUNTIME_ACQUIRE_AUTOSUSPEND(dp->dev, pm); + if (PM_RUNTIME_ACQUIRE_ERR(&pm)) + return connector_status_disconnected; + if (!dw_dp_hpd_detect(dp)) return connector_status_disconnected; =20 @@ -1915,6 +1932,11 @@ static void dw_dp_hpd_work(struct work_struct *work) bool long_hpd; int ret; =20 + PM_RUNTIME_ACQUIRE_AUTOSUSPEND(dp->dev, pm); + ret =3D PM_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return; + mutex_lock(&dp->irq_lock); long_hpd =3D dp->hotplug.long_hpd; mutex_unlock(&dp->irq_lock); @@ -1966,6 +1988,9 @@ static irqreturn_t dw_dp_irq(int irq, void *data) struct dw_dp *dp =3D data; u32 value; =20 + /* interrupt can only trigger for running device */ + guard(pm_runtime_noresume)(dp->dev); + regmap_read(dp->regmap, DW_DP_GENERAL_INTERRUPT, &value); if (!value) return IRQ_NONE; @@ -2064,25 +2089,51 @@ 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"); + dp->usbc_mode =3D dw_dp_is_routed_to_usb_c(encoder); =20 - if (dp->plat_data.hpd_sw_sel) - dp->plat_data.hpd_sw_sel(dp->plat_data.data, 1); + ret =3D pm_runtime_get_active(dev, RPM_TRANSPARENT); + if (ret) { + dev_err_probe(dev, ret, "Failed to get runtime PM\n"); + goto put_next_bridge; } =20 - dw_dp_init_hw(dp); + /* resume once if runtime PM is disabled */ + if (!pm_runtime_enabled(dev)) { + ret =3D dw_dp_runtime_resume(dp); + if (ret) + goto put_runtime_pm; + } + + if (dp->plat_data.hpd_sw_sel) + dp->plat_data.hpd_sw_sel(dp->plat_data.data, dp->usbc_mode); =20 ret =3D phy_init(dp->phy); if (ret) { dev_err_probe(dev, ret, "phy init failed\n"); - goto put_next_bridge; + goto put_manual_pm; } =20 enable_irq(dp->irq); =20 + /* + * USB-C has out-of-band hotplug detection, so device may enter + * runtime suspend. Native mode needs to be resumed for working + * hotplug detection. + */ + if (dp->usbc_mode) { + dev_dbg(dev, "USB-C mode\n"); + pm_runtime_put_autosuspend(dp->dev); + } + return 0; =20 +put_manual_pm: + if (!pm_runtime_enabled(dev)) + dw_dp_runtime_suspend(dp); + +put_runtime_pm: + pm_runtime_put_sync(dp->dev); + put_next_bridge: drm_bridge_put(dp->next_bridge); =20 @@ -2101,6 +2152,11 @@ void dw_dp_unbind(struct dw_dp *dp) disable_irq(dp->irq); cancel_work_sync(&dp->hpd_work); phy_exit(dp->phy); + if (!dp->usbc_mode) + pm_runtime_put_sync(dp->dev); + /* suspend once if runtime PM is disabled */ + if (!pm_runtime_enabled(dp->dev)) + dw_dp_runtime_suspend(dp); drm_bridge_put(dp->next_bridge); drm_dp_aux_unregister(&dp->aux); drm_bridge_remove(&dp->bridge); @@ -2149,13 +2205,13 @@ struct dw_dp *dw_dp_probe(struct platform_device *p= dev, const struct dw_dp_plat_ return ERR_CAST(dp->phy); } =20 - dp->apb_clk =3D devm_clk_get_enabled(dev, "apb"); + dp->apb_clk =3D devm_clk_get(dev, "apb"); if (IS_ERR(dp->apb_clk)) { dev_err_probe(dev, PTR_ERR(dp->apb_clk), "failed to get apb clock\n"); return ERR_CAST(dp->apb_clk); } =20 - dp->aux_clk =3D devm_clk_get_enabled(dev, "aux"); + dp->aux_clk =3D devm_clk_get(dev, "aux"); if (IS_ERR(dp->aux_clk)) { dev_err_probe(dev, PTR_ERR(dp->aux_clk), "failed to get aux clock\n"); return ERR_CAST(dp->aux_clk); @@ -2200,6 +2256,41 @@ 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); + + /* + * HPD_HOT_PLUG bit is asserted only after the sink holds HPD + * high for at least 100ms. + */ + msleep(110); + + 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 Fri Jul 24 20:48:46 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 579003D8907; Fri, 24 Jul 2026 18:03:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916218; cv=none; b=HAuJ12jUvHPjpvkPNMQpq9s5YDD6Wbw4w1+nW6HenY+iXjYVwSMdTMv7rzcCivlqfOGsOtw+2U4+xjKSSt7frn9gJwQPPdNes3ohpmA+cXh96yCCbBftO955+kQqCDI8Tp6ruh3mtVcdwcmLY28DxGnC06OzDX/koMO+khMqKp4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916218; c=relaxed/simple; bh=BTkiiTT3H7A8IiisrlGjYUH27Xlfl//27fsie/co2/I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ChOVtgKgpQlZrDfWII30I90EHGF8OfAK8HAnsgTNYUJ+pHw7dquKza+JMHUTiwuo3vstiaRfJoBg5lfhqq/DZGa9tSvcybivSXvWEw7DAberf1mb27Nz0lrWi3+Qdsk+/o+fZJnZL4tuLF/2mSNr6Z4Goie25AuzRrggEgZ53PM= 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=oA9E8HOy; 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="oA9E8HOy" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784916210; bh=BTkiiTT3H7A8IiisrlGjYUH27Xlfl//27fsie/co2/I=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=oA9E8HOyFJ0u92XTuPBepCEqWSyroOa/sJN6H0v5AHnOqV513/KUMqRadmtXa2iOY /ag29TMF9DLuwS4JV19dST2v6QEf45a6cPyC4QpaN6qG9TQRQILCC2VOnMzLv1HUCl FDCOWkDGNRISvXvXJ+jPpZL6euXBxuCHT73o1RVonPWnNp1d8Vy0U8KyuSrfCEz4xA Z72YzGxl8GiizUf0r5bAWSR1YSh/ZYpe3OqUHNJhImr3q5jXM3AuLrFTcc2WD9xNpT c3ZedlVEVUXDYz+0Ig0OfOGjWqVwQYLULxsWXV0dQN1eeibKt0FSHza+1LysxOKMJU CT/h6mbLIQAmg== 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 A1C6817E02FC; Fri, 24 Jul 2026 20:03:29 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id EDAAF48004C; Fri, 24 Jul 2026 20:03:28 +0200 (CEST) From: Sebastian Reichel Date: Fri, 24 Jul 2026 20:03:34 +0200 Subject: [PATCH v6 12/16] 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: <20260724-synopsys-dw-dp-improvements-v6-12-041d99a19c4e@collabora.com> References: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@collabora.com> In-Reply-To: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@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=3624; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=BTkiiTT3H7A8IiisrlGjYUH27Xlfl//27fsie/co2/I=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpjqPCkvutij4clmUCVvOYu52BFVB7m3XR0w Q4rbxaOZnv6sIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqY6jwAAoJENju1/PI O/qa5+oQAJ1zlYrSGx5xMhAvoGR3Q4har84EgAc8N1fK7D91R7GYCVLP3eCiA9ZHPeD8dnhXdQz 4/uk4Z1y7QfInf7MOhMPXsR1F5PlMQkyNScVRhKIkMSG9/cUJf0uHZ8w8+KIXV8+R9lEfQxdHRe k6VIcTb3sILYIEgnWf9WcjyZNdt8KblmtDxEsz/LWXMlRjWNQOM2Ho1jfYb2YapcTdal2FUuHO2 kozUTe7bv/ol+34tI2Vtvsu9a/Ud3rF5PMynpfrgyJRIAiB7/1O2BX1bImUy6kEsfxbtldQ75E9 IPzvLMRnZAK37jPDHYYIXQc1Fe+aTaJE8tV5YAjWoSRDh4bD40WqJA1eqhxL73eeoROAKtvtUlW Ocoq7kOrUbLTqZF8FWBQ/EWdYnaIUHIfo4lHAkVx9kJGwQb7GGfnXJyTA4H9zVx2W2GP49v/kBd uS2Jf4kwOEvs5eQeWcd/sf70JM/e5yiptd8xP8WXGRR0uN0BHURO91Ur5jJvX68Us1OlW7Opg/0 Glhcf5QE+Qm5Io0Cko4qxkFUVIU00/GUL64U6G7hwABTqtEDJ12R99nyD2xxJZz53S6W/GjLJYA ELDXFv950Dsh/SBghTk7WWCQi6eVJNU6BFccBdSJipdnkrb6qr5qlUPREA62C/3n19FQ2nWpZ30 z2aCOfpKsqdXxqmRa8yAzpg== 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 | 50 +++++++++++++++++++++++++++= +++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c b/drivers/gpu/drm/ro= ckchip/dw_dp-rockchip.c index ee0bd696064e..b8138e796c4d 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 @@ -54,9 +55,15 @@ static void dw_dp_rockchip_hpd_sw_sel(void *data, bool f= orce_hpd_from_sw) { struct rockchip_dw_dp *dp =3D data; u32 hpd_reg =3D dp->pdata->hpd_reg[dp->id]; + int ret; =20 dp->hpd_sel =3D force_hpd_from_sw; =20 + PM_RUNTIME_ACQUIRE_AUTOSUSPEND(dp->dev, pm); + ret =3D PM_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return; + regmap_write(dp->vo_grf, hpd_reg, FIELD_PREP_WM16(ROCKCHIP_VO_GRF_DP_SINK_HPD_SEL, dp->hpd_sel)); } @@ -65,11 +72,17 @@ 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]; + int ret; =20 dev_dbg(dp->dev, "Force HPD connected=3D%s\n", str_yes_no(hpd)); =20 dp->hpd_cfg =3D hpd; =20 + PM_RUNTIME_ACQUIRE_AUTOSUSPEND(dp->dev, pm); + ret =3D PM_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return; + regmap_write(dp->vo_grf, hpd_reg, FIELD_PREP_WM16(ROCKCHIP_VO_GRF_DP_SINK_HPD_CFG, dp->hpd_cfg)); } @@ -200,7 +213,7 @@ static int dw_dp_rockchip_probe(struct platform_device = *pdev) struct device *dev =3D &pdev->dev; struct rockchip_dw_dp *dp; struct resource *res; - int id; + int id, ret; =20 plat_data_const =3D device_get_match_data(dev); if (!plat_data_const) @@ -247,6 +260,12 @@ static int dw_dp_rockchip_probe(struct platform_device= *pdev) if (IS_ERR(dp->base)) return PTR_ERR(dp->base); =20 + pm_runtime_use_autosuspend(dev); + pm_runtime_set_autosuspend_delay(dev, 500); + ret =3D devm_pm_runtime_enable(dev); + if (ret) + return ret; + return component_add(&pdev->dev, &dw_dp_rockchip_component_ops); } =20 @@ -255,6 +274,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}, @@ -289,5 +336,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 Fri Jul 24 20:48:46 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 2AF8537F306; Fri, 24 Jul 2026 18:03:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916219; cv=none; b=M+qWYxxF6JO0sNXmTFY1PVKQZObWDpzociRJ3/SbI4eveep9vMkZ/ZhnF+S0r5oL1R6JQ+ysa0ljePIijNQ/Peap45+bde0XqYmOJC1vQALv9sSyl0M04FDhE2B5QJVjL1qW+X7ZR2FHpZQ7Yti/qGbnDPcEpi0j1fG/8Hrt4Ks= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916219; c=relaxed/simple; bh=dLprRk9J+zndsqWeaTFRzrwihRtem60oKo0i5iDhVd0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nKY9xFmg7xbe1/xoxJT53T4j1e6RVj1R6ycYshljeYyFJry/ShjH4LgJJgQHdwST+Ic5UPYz4S05LMYwpfBK4MT/tYmgtPvU+XQpJe0geqWCqucokJPLeKc1Yn++lQsRG2gbhq4b7ol23aiptIw5F2A1zL6KiPv+qFzEIzqGtrk= 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=iXYkkLue; 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="iXYkkLue" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784916209; bh=dLprRk9J+zndsqWeaTFRzrwihRtem60oKo0i5iDhVd0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=iXYkkLueVoJXq6Rd2d/C11rDNonx15sT8NOQrtDQH6ElQOG2J+i3Fx1/9B2YqAYJ4 HdKSbgPZBkuFid4aD+scYweWZFyGWttR9D5Tt5dEV2FJoJMl6+okuIZLWH9fi/USwb zMv8LgJWl82moU51h5Eu0D0/D9pXK9POtPCWGEHDphquczhZTzOCGZo2h/XSSqsmQW F/VPQA8/HwrBgy0Z13yX4BB0/7JrMLp+ppYtavQWQYovl75NAa+IfZ/wggI57u6qxe y5BK2SfQC+L8dmFINKRT8oNIbdUs2A5HZ7Ol9BOQxDKPuBUT1CPpg7GTn+iAbINRmh OwGYrJHRK0noA== 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 AA8B717E031C; Fri, 24 Jul 2026 20:03:29 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id EF24448004E; Fri, 24 Jul 2026 20:03:28 +0200 (CEST) From: Sebastian Reichel Date: Fri, 24 Jul 2026 20:03:35 +0200 Subject: [PATCH v6 13/16] drm/bridge: synopsys: dw-dp: Protect sdp_reg_bank from concurrent access 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: <20260724-synopsys-dw-dp-improvements-v6-13-041d99a19c4e@collabora.com> References: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@collabora.com> In-Reply-To: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@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=2444; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=dLprRk9J+zndsqWeaTFRzrwihRtem60oKo0i5iDhVd0=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpjqPBVMhcy6iA7F5gRVzKZAYpQElrVafDQ7 TXjXZjF6zNBEIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqY6jwAAoJENju1/PI O/qavxoQAKL/6K2DSitLSKpLVeV9PvmBZFKZf31q98ns9qpHGryljkGMFQFrKOB3Zmx0T70rqs/ Dvl8jPVxzeWxs1Ces4XL8iICY6lYMe1c7uSun+0LEvDYPBo1DspgxZI6oI+VS8mRFbGPEJ4rUMj gAxDnn9+uGmYD6B9R5cDibWuM2Nix8AD+h0VLRyKair/GK6Mc7E/hJH6BheqxymRDG4i8N9XOzw 8l63Xl+3PNKYvu3Yl507OxmnOWshaCK8y+d9lRyLcf6D3ptyFLd5GhxTnjM9EjNOjrOiP3Ce88w QkudCN6WjpZHZ/3m44qymyvJOHbg+kGiOE+lgMUeL8mz5w/c8qLuE4PEgpKcUdplVjUsu+1a21O 60XHZsUKQIMuByAkalVfDklT6OYxjXRWF92AteninKc/AI7PVfAc/xCEvhuE8sgTp7g1EgK+BuU vP7kF5S7S8fyLdG1IvpCRzXpQg6QHYq0DRZr6ARqqnaUko07EwoMHTEpVZmRB+BXAvMxzTBJnjl zf/9oG6nW+h5vtTG7697n44n8jGdrPpHil5+KFrvPwyUDQ1uwMrVA6+nIg+AtIKDDnf5OlETznR 6tOwpkGV5GgIcWEAPGKBGEL7WLhhLMgTtspR39pqLcVVT61lcECLQjWKD+2N+c5ApOpZY0rY0LL Tt0VPi7n5yDsNIAT1q9I07A== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Right now sdp_reg_bank is only used during atomic enable/disable and thus there is no risk of two threads accidently claiming the same bit. This changes once more SDP users (like audio support) are added, so introduce a mutex to protect concurrent access to the bitmap. Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 1bbb39b8d0be..88b95938649a 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -322,6 +322,8 @@ struct dw_dp { struct dw_dp_hotplug hotplug; /* Serialize hpd status access */ struct mutex irq_lock; + /* Serialize sdp_reg_bank access */ + struct mutex sdp_lock; =20 struct drm_dp_aux aux; =20 @@ -1045,11 +1047,13 @@ static int dw_dp_send_sdp(struct dw_dp *dp, struct = dw_dp_sdp *sdp) u32 reg; int i, nr; =20 - nr =3D find_first_zero_bit(dp->sdp_reg_bank, SDP_REG_BANK_SIZE); - if (nr < SDP_REG_BANK_SIZE) - set_bit(nr, dp->sdp_reg_bank); - else - return -EBUSY; + scoped_guard(mutex, &dp->sdp_lock) { + nr =3D find_first_zero_bit(dp->sdp_reg_bank, SDP_REG_BANK_SIZE); + if (nr < SDP_REG_BANK_SIZE) + set_bit(nr, dp->sdp_reg_bank); + else + return -EBUSY; + } =20 reg =3D DW_DP_SDP_REGISTER_BANK + nr * 9 * 4; =20 @@ -1683,7 +1687,8 @@ static void dw_dp_bridge_atomic_enable(struct drm_bri= dge *bridge, return; } =20 - set_bit(0, dp->sdp_reg_bank); + scoped_guard(mutex, &dp->sdp_lock) + set_bit(0, dp->sdp_reg_bank); =20 ret =3D dw_dp_link_enable(dp); if (ret < 0) { @@ -1723,7 +1728,8 @@ static void dw_dp_bridge_atomic_disable(struct drm_br= idge *bridge, =20 dw_dp_video_disable(dp); dw_dp_link_disable(dp); - bitmap_zero(dp->sdp_reg_bank, SDP_REG_BANK_SIZE); + scoped_guard(mutex, &dp->sdp_lock) + bitmap_zero(dp->sdp_reg_bank, SDP_REG_BANK_SIZE); dw_dp_reset(dp); pm_runtime_put_autosuspend(dp->dev); } @@ -2189,6 +2195,10 @@ struct dw_dp *dw_dp_probe(struct platform_device *pd= ev, const struct dw_dp_plat_ if (ret) return ERR_PTR(ret); =20 + ret =3D devm_mutex_init(dev, &dp->sdp_lock); + if (ret) + return ERR_PTR(ret); + res =3D devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(res)) return ERR_CAST(res); --=20 2.53.0 From nobody Fri Jul 24 20:48:46 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 577D23D75B1; Fri, 24 Jul 2026 18:03:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916218; cv=none; b=BflUFq21/IG4wbmL5F0H0DgCbnlYbZNigBYs/XG9Pw8RHVrXG12H4nIYtdKjkcVJVAoERRio7g78Gd45WnRu4VMDGZPK22auyqpifnO0J/dn0w8AshDLIvtDWUuFeZNM8LpNbp7JL6mFSgRJzO3XbB9PcoV2VUzi7qNIAjLfj8k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916218; c=relaxed/simple; bh=Ah3xn25WaIO3oVjfcohCOIu5yCkZ78AUJGaFQKCziwM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=byOMxzr0gIIqBL57FBsl3wUjd0edVuak2n3GGoHSPnsawohA3UAFC6A3R3gHzVMXrFjGPczCasWPPsTU+sjRGmZYYtprHtWFwsKLdy0Pg4CLCRMPhklYjVYjiQg4AsUBHXVEOs7s5s3f8wJTpjx881q0eu8Z4oMOwoIl5x3Mzeo= 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=eTi6cT3h; 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="eTi6cT3h" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784916209; bh=Ah3xn25WaIO3oVjfcohCOIu5yCkZ78AUJGaFQKCziwM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=eTi6cT3h0U7lfzTcFbv6uZaGA6t/XqdnuKNJCCjiu+7EqRfhryk70dbk/D6CjpLJw p3dY/BIRNxXzkLhMC+3JxxMvvsabJgCeUH3/SK3GEjbmxh7Icf3IkCa2PvMTxelZaE xh7LsbtID+5YblObgT+n8ozMRa2xkz5rB8CjIYiCjDbq36DWN1Z+PTwxQFLmQFVtgt 6wupYPDWWrNuCGRjr8sC1C/ud620kJUuVY1YDse60Ccw0eyh9ojiOyWRNejiVMovBs ZNaDZwzdV8i7a0T2+1OIGySFeFCSOfnTIO9USKd/4yd54ENJVsxzJlP9JG/yJlOTfj LOon8b7Cj6HLA== 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 AF18D17E0331; Fri, 24 Jul 2026 20:03:29 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id F0BD1480052; Fri, 24 Jul 2026 20:03:28 +0200 (CEST) From: Sebastian Reichel Date: Fri, 24 Jul 2026 20:03:36 +0200 Subject: [PATCH v6 14/16] drm/bridge: synopsys: dw-dp: Use regmap_set_bits in dw_dp_send_sdp 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: <20260724-synopsys-dw-dp-improvements-v6-14-041d99a19c4e@collabora.com> References: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@collabora.com> In-Reply-To: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@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=1254; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=Ah3xn25WaIO3oVjfcohCOIu5yCkZ78AUJGaFQKCziwM=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpjqPDVz+r5hy4sKdT3rO9mzWq/Kl4vHqrzS GdnWG1f0ODBm4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqY6jwAAoJENju1/PI O/qaMuIP/0VBkA9aV2TS662kFCLMhWXoLPVngZzgcgOAamader0fo1GM9n4OP2yNAdzS+kJnP8X BssXPCZbMTmmZcBQAOrNIkJHrTUkd6kCrAsN4P7pc6MdZcwKgfKKGNEniDRt7wTqXSksZevdI1Y VJMklGZCw1iNYiA5hXHxcumd2fJwhZl3mUQT4pn66tySIh4AF7QTgpHTVVYA8/zOAQmOUvcaB4g Rljda4W+b89e3ZL0yDJpD5xXZytYQykvbyg7k3QV2izUmPCwpM7+w4Z22LVh1r18T29mcSEoC/G wVrA/QeuGy32Hu+ddY5q6pOAJAKlXygG3OeDOsLC2P4rWpltSk8iPfXSGHoPWcj6MP7iy8ZxFFn 9xjn8bKIMfYkp2nQzkdS0yy3S0T/bLhMUobDwJaE3g5yro/HRGTA64eTlWmQeiEVvp14gCH9ggK IlhGlGQuX5ZUK9P1GogjLqUeUk9wu/khYfALHPlUO+3+vXyZHnHxHuOWEs0UefwJ+TjNRdjMwc6 47KbLklMv91fyM0VTIhhhHw7Zg84FT6mVmOnl98MM++NpUYJ7QXm0bXwPhE0rqqMh5O6GFAWlSD FteDrjkgVnHGo8AWAacW0clgmmCXaMGraqSGl/6GOh8BiOBBn6UoxLq7AK+bqdNwaZJIgewsdcH 1D+g5KzpKs7jQJlz8VawtCw== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Simplify dw_dp_send_sdp() a little bit by making use of regmap_set_bits. No functional change intended. Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 88b95938649a..44a13b5d62d3 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1066,14 +1066,12 @@ static int dw_dp_send_sdp(struct dw_dp *dp, struct = dw_dp_sdp *sdp) FIELD_PREP(SDP_REGS, get_unaligned_le32(payload))); =20 if (sdp->flags & DW_DP_SDP_VERTICAL_INTERVAL) - regmap_update_bits(dp->regmap, DW_DP_SDP_VERTICAL_CTRL, - EN_VERTICAL_SDP << nr, - EN_VERTICAL_SDP << nr); + regmap_set_bits(dp->regmap, DW_DP_SDP_VERTICAL_CTRL, + EN_VERTICAL_SDP << nr); =20 if (sdp->flags & DW_DP_SDP_HORIZONTAL_INTERVAL) - regmap_update_bits(dp->regmap, DW_DP_SDP_HORIZONTAL_CTRL, - EN_HORIZONTAL_SDP << nr, - EN_HORIZONTAL_SDP << nr); + regmap_set_bits(dp->regmap, DW_DP_SDP_HORIZONTAL_CTRL, + EN_HORIZONTAL_SDP << nr); =20 return 0; } --=20 2.53.0 From nobody Fri Jul 24 20:48:46 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 0EB3B4302F8; Fri, 24 Jul 2026 18:03:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916220; cv=none; b=q5tPZdhuHblcdpQMjUbTodbp133LN3zroNAeWH9TQwWRh3MqNz5/7/WeLjyxzMkQ/GwM0ug9ukGTEOS6vhxUgEtsOnRHCKzkXRfCW/nIlbzohSAOLqjW972ZKOFqU6yeABDfueih8X8dAR3Je+zFnlS8We83c1M7LKL4KXLTaBk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916220; c=relaxed/simple; bh=k0eRRol0juQKDRwk26Fz36sBhpAIKfOBZOjBCwiTCgw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ENVNNTMrJa5jI5fclYIVs5fhgM6bOSD670gIwkPnznr87iExo1WgXoVUGtsAA3FHNZkoKp8InMur1Vt4x1mrq+a9eUwKEqrgxTE24BTusRc4VtNV1HMa7SIyAAc39IUpAf684udoUyT7KfitjX8ZmvujhPD4P1DUjU0uzAOdpFY= 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=Z4tYIXtL; 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="Z4tYIXtL" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784916210; bh=k0eRRol0juQKDRwk26Fz36sBhpAIKfOBZOjBCwiTCgw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Z4tYIXtLBgykTFgd1YNkYuDAu3rwogXwWDRSMxAZW1oOfMgN3OZElnqnAoDcGQFgf nccChafMcV7AG8vUpeykstApL3TevMb50kXKm28NwGY012W+IsTt/4kOJjq09+DxUh 6/D6I9HUjgJNvS7GZX5OJT15kRLgLpZPWhycY3dYxXGy0aIAcF8b0rP24bBjviL0kI velivcYDH3uYMIMLGeZ8ibTXe7qDoFCZ/UEDiI3jRY9sT6A6epfltlEBgI5FMSa3u1 PgBW4NC/kflUwM5fpEeY8P23AxhxN+1ZKVJDwrejykfX0eVESNSr5gmcYJo5eJPqEM ukqBP95U2dqeA== 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 CEB3717E0349; Fri, 24 Jul 2026 20:03:29 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id F23FD480055; Fri, 24 Jul 2026 20:03:28 +0200 (CEST) From: Sebastian Reichel Date: Fri, 24 Jul 2026 20:03:37 +0200 Subject: [PATCH v6 15/16] 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: <20260724-synopsys-dw-dp-improvements-v6-15-041d99a19c4e@collabora.com> References: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@collabora.com> In-Reply-To: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@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=3080; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=k0eRRol0juQKDRwk26Fz36sBhpAIKfOBZOjBCwiTCgw=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpjqPCSqLY2GABk9WoqK2OjQYGOwzMwTN0Ir 7aiihJYzbTpXIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqY6jwAAoJENju1/PI O/qaNNQQAI7p07oMo+PBu8Z/Z4EHWkQ7XyjtbSTff5wOmERUnmDsv/dEWrKIRaXMU6quCJH7TR6 cwWgBlPbDbv8WDH5IAv3O3tv3ZOY+aS/jx4HkBff5zgfB024qBuvct0Hm9sxdtg8CrRmQqXp89f jzyX4/KrawkjwI5N3RMauMfH9yNpCAb+UaXpzjcKCjVUqE5B7Mon8EKL+gq6C1x+4xyhzJCpyYZ yBTwdw1Epb3V2awm67P/lrlzoImjanTl0NS7q0VQLQBEgVqxPmQWsfdMSDtdLuskcqB+5QtuB0M gKhhoBp37kQb0HKpaW9fap20YagWUkj7hY3LcLG29+z1xf7JMZX6AA0rerDaK0YJ9U3VrFW/z71 gCpLXxA88hopTOD4fqT8Y3q2HLBgv37ePB1hYX2ZVWBCMV04U8viEi5EbU+sZI8ZTSgUzTZ7e3g 6dzrs9H6LZrDLyP+/NhcZKjkFme2MpjT8PF1NOyW3urIWE1LpJhA7psnXoUtY0Ri1truTWFyKsz wJnOanv0ATDqgUH7Kea8HxFNFrIKi9VJ7DsqhzkiQMvuptqzLY3Z1sDabWtnLtXMYk2QQkq2WnC 8ioLh/HAJuqUhbdzX3EPYUhywEtiT+2RtlRJsBlHj/QJvYaeu+tt6mxkYIuzwWVCtX0gwaY/Qd2 sY24Qb6eO9mkUQ2PeptQyQg== 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 DisplayPort controller is 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. Once MST support is added, the plan is to simply add more numbers to the argument, so that it looks like this for RK3576: 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 As the arguments are not part of the binding itself the audio side is also ready for MST after this change. Switching '#sound-dai-cells' from 0 to 1 without keeping compatibility is an ABI break. The rationale for going that way is, that there is not a single known driver implementation for the current binding. It's also unclear how the current binding would be used (only support I2S or S/PDIF for stream 0?). The mainline rk3588 DTS include sets it to 0, but does not have any soundcard using the DAI. This will be fixed up separately. The RK3576 does not set it at all. 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 Fri Jul 24 20:48:46 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 31F1237BE81; Fri, 24 Jul 2026 18:03:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916220; cv=none; b=SGckBBfXcAXpeFjpQdyv5rJ6Dhq7OKYqxzPfaVxAfi/IeQUvTvigVIRWeUBnpZ3OpdiGqj4xOZ1V24Pbm8xjbi9gNRLvr9z/GQbF7/aB+QSzbZIMEKlA2cbvFyoySk5rdx1NA/6Z0ySs5/TjuvJ/gYFu5zqo2RG+7YeHTZ7Fi3c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784916220; c=relaxed/simple; bh=5CzJeiuI6wo/L5OxHOxynGVIdB4Nvan/pG5/QCPCpeY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GJUQSC2zviP3lMrCwPIdGr8yDEUOTNFonyGfVOx3Ya+LspW8WTtmD+uDFUnhVfMu8z9l1741EV7tz7yASKgvB8GpOuRgLO/SxxlP8/CQ32jpo7VE0BltyjYcB10/M2Nv/aIOvU8THBjuSTtzfFjra+jB7xieGeeRUjZblgtqoWo= 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=kzc6rivK; 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="kzc6rivK" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784916210; bh=5CzJeiuI6wo/L5OxHOxynGVIdB4Nvan/pG5/QCPCpeY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=kzc6rivKRcJOre09ylKjq2AIGCnjGXpRBHi4LF1oWk+6Xku/5qh0lX3Pbf7N4W2cP 3AOMnyJk2dq2QLcqqZsdPCKZN3TxXt+Pa3Uxcq06yFb4D+8kFnDVWN3zHr6XU87SWD exsnBkoVHLbzobdA3go97j/eTIZbuREz4r4JF+Z8r8aXj+IFzsyzRjQPl5pZiv7Fyn JUyfkuxl7ohpx5szlpFOfcMJXNaV6NdEbXt+Gg8thHj5hkLENITleUt9MQh/JWA2v1 jFMyZMURt4neosUwfuw/qm7zWDpUd1DD2UAkRcGMv8eEjnx/CbudchvZwTeBQ7MNwJ oG8szxnHBBMvQ== 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 D376F17E037A; Fri, 24 Jul 2026 20:03:29 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id F3C02480061; Fri, 24 Jul 2026 20:03:28 +0200 (CEST) From: Sebastian Reichel Date: Fri, 24 Jul 2026 20:03:38 +0200 Subject: [PATCH v6 16/16] 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: <20260724-synopsys-dw-dp-improvements-v6-16-041d99a19c4e@collabora.com> References: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@collabora.com> In-Reply-To: <20260724-synopsys-dw-dp-improvements-v6-0-041d99a19c4e@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=10909; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=5CzJeiuI6wo/L5OxHOxynGVIdB4Nvan/pG5/QCPCpeY=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGpjqPD5VanXxrsiDazqxguJKDUeTqF7mC4eC QShh4/HG0QdgYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqY6jwAAoJENju1/PI O/qafbQP/jVLXAMR0FA4ht6+qHo+V0SkQjW/RH6Bl9qKnnnadc9+ynT4bg1o1Ld1yiaFQd7bSwF HF2Rku7YKVEp5BDEDb4hUmtDGspmSDoyD3ew9B74oDFdM/2BpDwOsGVIC52vyFPvne7KtIPv3re BoZWiH17+yA98lbYrgXI2/PGGKhSV6w+jto9OveDi7bt4CLeSDnz5dE9htfXpmBFZv6+0u5ziwN UavdqmWvufb92iHUJqQl66iKTkTgWycq/9Et7A6NZ53YJZuo1F9EoT2SU7nmeLBTnOW31hLZxDW 0IIKvHpw96pgSbNmbFOAn0wErztYqldyldPVOaNU9tgHl1hmzLtWZugq42IxiPg/1pc6pTdS3cp xpyq4QkPK/UPDefiwVY0JLFP+qh65MP3GRDwlGam0Y1+VQvwOuZU0ohfwFgbiMpMoIi2UUFbug0 yqmd9P9E46LXYK9MK9eHDISPZiKSFoE9k9B0l1RmU84U9MBgXuiO/2IP8bUTibOVd4xJEc9c0UT G0cnVH9IboUTijjCUwgJS12co51aWdkeAsFK+dbUTTU5uRwHNC0sLIrb3ChC2V8gLbpiCIFFr/x /+iuLeO0q86sel9bAfqUMqIAg18vG09l2QhJRJtBbJkyj8tI+OLi90tK6cwZzNiaBp8A2B3ITGo +I7I/H3rRZkvSEuEC9d8mwA== 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 | 263 ++++++++++++++++++++++++++++= +++- 1 file changed, 261 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 44a13b5d62d3..c7d6f63b5e9a 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,9 @@ 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; + int audio_sdp_nr; /* Serialize hpd status access */ struct mutex irq_lock; /* Serialize sdp_reg_bank access */ @@ -1073,7 +1099,19 @@ static int dw_dp_send_sdp(struct dw_dp *dp, struct d= w_dp_sdp *sdp) regmap_set_bits(dp->regmap, DW_DP_SDP_HORIZONTAL_CTRL, EN_HORIZONTAL_SDP << nr); =20 - return 0; + return nr; +} + +static void dw_dp_clear_sdp(struct dw_dp *dp, int nr) +{ + regmap_clear_bits(dp->regmap, DW_DP_SDP_VERTICAL_CTRL, + EN_VERTICAL_SDP << nr); + + regmap_clear_bits(dp->regmap, DW_DP_SDP_HORIZONTAL_CTRL, + EN_HORIZONTAL_SDP << nr); + + scoped_guard(mutex, &dp->sdp_lock) + clear_bit(nr, dp->sdp_reg_bank); } =20 static int dw_dp_send_vsc_sdp(struct dw_dp *dp) @@ -1886,6 +1924,212 @@ 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); + + if (dp->audio_sdp_nr >=3D 0) { + dw_dp_clear_sdp(dp, dp->audio_sdp_nr); + dp->audio_sdp_nr =3D -1; + } + + regmap_clear_bits(dp->regmap, DW_DP_SDP_VERTICAL_CTRL, + EN_AUDIO_STREAM_SDP | EN_AUDIO_TIMESTAMP_SDP); + regmap_clear_bits(dp->regmap, DW_DP_SDP_HORIZONTAL_CTRL, + EN_AUDIO_STREAM_SDP); + + regmap_clear_bits(dp->regmap, DW_DP_AUD_CONFIG1, AUDIO_DATA_IN_EN); + + 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); + + /* The hardware is limited to 1,2 or 8 channels */ + 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; + } + + if (params->sample_width < 16 || params->sample_width > 24) { + dev_err(dp->dev, "invalid data sample width %d\n", params->sample_width); + 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; + + ret =3D 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)); + + dp->audio_sdp_nr =3D dw_dp_audio_infoframe_send(dp); + if (dp->audio_sdp_nr < 0) { + dev_err(dp->dev, "failed to send audio infoframe\n"); + dw_dp_audio_unprepare(bridge, connector); + return dp->audio_sdp_nr; + } + + 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, @@ -1899,6 +2143,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) @@ -2057,10 +2306,20 @@ 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; + dp->audio_sdp_nr =3D -1; + 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