From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-m3279.qiye.163.com (mail-m3279.qiye.163.com [220.197.32.79]) (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 6601D154458; Fri, 7 Aug 2026 02:55:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=220.197.32.79 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786071364; cv=none; b=hvA5cKCvJUZqo4HHVcjNGzFQuSSfSSo6KkAGUnXD3AixASvPMzH9M5YGhycMeqd9FFGGxOaKDydw+SHRuZuP3zYFj33XVYStpagZhEsjlRvSkPAuvNkgjXJbZ9gyZSS3Bq0RC4PT1vHDthbUijm+X3N/emlMe0UGn3qAuWjAVp8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786071364; c=relaxed/simple; bh=JST10iFSt1WHZDJONWchqm8dmTGfuJZCPYy/Gd23Y0Y=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=O0jEAP6wK0bDLH9LWaT8iCe+0RCYhXAPbwRY+Oymt0DyQK7fualXAZNmSfLeH8EIi4SBRraRfKkXsYWLLl6ZyVTT4x71dU+ad1vK3YVcRLBzLyXPUeQN3uCxXdfTX79CFgYzN9zy2QcJ97sAoHEV/elCtGDUIVl81IP5UK+CgFY= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com; spf=pass smtp.mailfrom=rock-chips.com; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b=IL8agv80; arc=none smtp.client-ip=220.197.32.79 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b="IL8agv80" Received: from [172.16.12.90] (unknown [61.154.14.86]) by smtp.qiye.163.com (Hmail) with ESMTP id 491b644d0; Fri, 7 Aug 2026 10:50:40 +0800 (GMT+08:00) Message-ID: Date: Fri, 7 Aug 2026 10:50:25 +0800 Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v11 10/21] drm/bridge: synopsys: dw-dp: Add follow-up bridge support To: Sebastian Reichel Cc: 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 , Philipp Zabel , 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 References: <20260806-synopsys-dw-dp-improvements-v11-0-0d508505f383@collabora.com> <20260806-synopsys-dw-dp-improvements-v11-10-0d508505f383@collabora.com> Content-Language: en-US From: Chaoyi Chen In-Reply-To: <20260806-synopsys-dw-dp-improvements-v11-10-0d508505f383@collabora.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-HM-Tid: 0a9fda21428903a7kunm17d9edf98123b X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFITzdXWRgWCB1ZQUpXWS1ZQUlXWQ8JGhUIEh9ZQVlCS04dVhpOSkhJS0IeSk9JGlYVFA kWGhdVEwETFhoSFyQUDg9ZV1kYEgtZQVlNSlVKTk9VSk9VQ01ZV1kWGg8SFR0UWUFZT0tIVUpLSE pKQk1VSktLVUpCWQY+ DKIM-Signature: a=rsa-sha256; b=IL8agv80TbgEJ/ektDWcbhjL7ehF9V68i2rOBuIUN5Z4FrUVZREaVYpGYHYTbM5jlfBZjC0Syh4ZgffUKg1ajhGjZJfXsxtthQ/aClyW6MWb9maeUbGyZPcRZjwJp5WOwGdULyJo+d7kkV9bqArSwfnYMdnYzkM/LKZaBu7lsOc=; c=relaxed/relaxed; s=default; d=rock-chips.com; v=1; bh=slu4UXv1MBP6pJpI4M9su9mc+PRdIjhnDUo1lMf+9Cc=; h=date:mime-version:subject:message-id:from; On 8/7/2026 1:02 AM, Sebastian Reichel wrote: > 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 | 34 +++++++++++++++++++++++++++++++++ > 1 file changed, 34 insertions(+) > > diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/bridge/synopsys/dw-dp.c > index b9864a17c01d..a6099f7ddc87 100644 > --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c > +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c > @@ -330,6 +330,8 @@ struct dw_dp { > struct dw_dp_plat_data plat_data; > u8 pixel_mode; > > + struct drm_bridge *next_bridge; > + To be nitpicky, this field would be better placed before the u8. Reviewed-by: Chaoyi Chen > DECLARE_BITMAP(sdp_reg_bank, SDP_REG_BANK_SIZE); > }; > > @@ -1894,7 +1896,22 @@ static int dw_dp_bridge_attach(struct drm_bridge *bridge, > > enable_irq(dp->irq); > > + ret = drm_bridge_attach(encoder, dp->next_bridge, bridge, > + DRM_BRIDGE_ATTACH_NO_CONNECTOR); > + if (ret) { > + dev_err(dev, "Failed to attach next bridge: %d\n", ret); > + goto err_disable_irq; > + } > + > return 0; > + > +err_disable_irq: > + disable_irq(dp->irq); > + cancel_work_sync(&dp->hpd_work); > + > + drm_dp_aux_unregister(&dp->aux); > + > + return ret; > } > > static void dw_dp_bridge_detach(struct drm_bridge *bridge) > @@ -2060,6 +2077,13 @@ void dw_dp_unbind(struct dw_dp *dp) > } > EXPORT_SYMBOL_GPL(dw_dp_unbind); > > +static void dw_dp_put_next_bridge(void *data) > +{ > + struct dw_dp *dp = data; > + > + drm_bridge_put(dp->next_bridge); > +} > + > static void dw_dp_phy_exit(void *data) > { > struct dw_dp *dp = data; > @@ -2157,6 +2181,16 @@ struct dw_dp *dw_dp_probe(struct platform_device *pdev, const struct dw_dp_plat_ > return ERR_PTR(ret); > } > > + dp->next_bridge = of_drm_get_bridge_by_endpoint(dev->of_node, 1, 0); > + if (IS_ERR(dp->next_bridge)) { > + dev_err_probe(dev, PTR_ERR(dp->next_bridge), "failed to get follow-up bridge\n"); > + return ERR_CAST(dp->next_bridge); > + } > + > + ret = devm_add_action_or_reset(dev, dw_dp_put_next_bridge, dp); > + if (ret) > + return ERR_PTR(ret); > + > dw_dp_init_hw(dp); > > ret = phy_init(dp->phy); > -- Best, Chaoyi