From nobody Sat Jun 13 04:51:15 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 9288D1E8826; Fri, 12 Jun 2026 18:00:54 +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=1781287255; cv=none; b=Loxnb5NSQJ5Pqj4mEiGY6oA48PGzOzA+v4PiqQ/Zz2KZDITocAGY02YRCfkL4rCYtsxpWo/9a+7c/knJaobwlI39y/aT8JSjRVU2UHkRMX9D3KHVZGEdmud357BLgb9LNB5x4IC9HxpYJQsgHYN1Ng/IC+ShCCt2WR6WT4v8eIg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781287255; c=relaxed/simple; bh=WsmeQvQGeyq2M87UoeoKm+GR3W7WQx6cpiY0EC6vOZA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DnTFuxYUL9KyhiFa4iOW6Q7OCJ8GKnVOQUNtjGv/J1ab/GxTAXQFYNax5BEpLWaEk5Z4TWTQ+QUnS3/5k+fJGvWURutQh3TKOVmYxI0r0TDgQ4/g3PgsSu60rE6ybJlkzX/AUKZhtIG0+OrDx+fhSAG6dlo3Ku4y119ZgkZ0l0w= 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=A9EH7Yv6; 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="A9EH7Yv6" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1781287252; bh=WsmeQvQGeyq2M87UoeoKm+GR3W7WQx6cpiY0EC6vOZA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=A9EH7Yv6Nl2PNMowcJr6lTBfy6JU/s51xkh2vXnO5P+wNTjNFA1iyGIV7dzIkGyV2 l+5a55vKE/ecjjoBlZRKdAHEVI6hKtfbwFXzdB+9gzNoPJBdP39/Jpp4hQI/AN6iEx Qsg7ePdR75pks0xQKHR+mpmzhoSuVpAatKu1NXslKCbZ/LJy3lwgh9+oW6qyDp/jGR IM38i7FJBR5hTkrqZum0V7dCNn7YLqSFv60DGy37X00CoWAYw7vEKN/3FXLTWR1dky IGq3XXg1nHrDs5UymY9Q2mNxOow8YFIa0FEelpU6V4grenBKrs/IdfZs1CJfiIDibl sTyJrYkil7VmQ== 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 B62CF17E03C6; Fri, 12 Jun 2026 20:00:52 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 78DC4480026; Fri, 12 Jun 2026 20:00:52 +0200 (CEST) From: Sebastian Reichel Date: Fri, 12 Jun 2026 20:00:47 +0200 Subject: [PATCH v3 01/10] drm/bridge: synopsys: dw-dp: Simplify driver data setting 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: <20260612-synopsys-dw-dp-improvements-v3-1-dc61e6352508@collabora.com> References: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@collabora.com> In-Reply-To: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@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=1218; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=WsmeQvQGeyq2M87UoeoKm+GR3W7WQx6cpiY0EC6vOZA=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGosSVStviUCLo5za77nTAKT2U13SAsC3EanA N5gu1xsmRuaFIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqLElUAAoJENju1/PI O/qar7AP/0p6E6UzqtGJPOsR5dk62A0zuNQL99x3zENNUW/nku7BjS+u38Y9Gq517FDFvLcKK2J dXn0p114bvNl8+Otw3z3cmhOgVz6iz05jmwi0fzskXRjp0Bz3rGPbAZMX+qIp+9Zqh+jdDJ0Gv7 dZ/CH4Nb13A9XGy/OUlow9T2fwDy3k5Ems6/p8DOIjtRinTebqoYkk4+RkA+mDRqeQdYV6f/gNC 26oaFRUB7ULrSyWxsMBbr8AeFpduRjlmsGab7wD2BsPw+nrcEC9p25bSY43jA9Exx7KB6WbSw/n Usnl9hHFWK5aCPPV1DXqkLh7B5A1+SvX4kO78fmmmHtR92UqRSL8HAQzJUxLp58oXA0Oo3MDFSn P1+wfwmL/DdZYO/qmnnV1uy7N46rbt1nY+zfiXMweh8XnATi5SE7yQuS7QuZufKdBOO4OR2MeAP QMXV352wILWNw856ThPKbi7wv4xo18cZxZx9In/xVU5dcufTCvusP6LVUUpN988TY6Nm5ftKNGs J17t5niqT9KHWLAMkv2cETQIvR5XlckJ6CoVgyZZmgba6bI7fJpoFG9szRmD/4ux73Q1YsHGAZj vhZAK8dejMz8G5gJi9JFfPwZwSKd3/utBbzySrejfyzeaCKBBHfUtjFbryv1W37Boqni/QwudGf SQSZtSZS6nX3tVI+vDCsxnQ== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A There is no need to get the platform device just for setting up the driver data. Simplify the logic. Reviewed-by: Andy Yan Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/rockchip/dw_dp-rockchip.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c b/drivers/gpu/drm/ro= ckchip/dw_dp-rockchip.c index 0de822360c8d..35598ab9fe84 100644 --- a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_dp-rockchip.c @@ -74,7 +74,6 @@ static const struct drm_encoder_helper_funcs dw_dp_encode= r_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 drm_device *drm_dev =3D data; struct rockchip_dw_dp *dp; @@ -87,7 +86,7 @@ static int dw_dp_rockchip_bind(struct device *dev, struct= device *master, void * return -ENOMEM; =20 dp->dev =3D dev; - platform_set_drvdata(pdev, dp); + dev_set_drvdata(dev, dp); =20 plat_data =3D of_device_get_match_data(dev); if (!plat_data) --=20 2.53.0 From nobody Sat Jun 13 04:51:15 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 928291D61B7; Fri, 12 Jun 2026 18:00:54 +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=1781287256; cv=none; b=lke1FKVQFKKDsCPQjIdfG45fA3fDThJUCquvKdI1qVu/8wlVokLWyhXv2tEp6jFvQY8XhU2Bre/oeSA85DRkjrpCJcV8kVZ67DBp1PhPFfrr8junQt29D16LgY8iBa/msSoCmdatTwKMquxVYzvuTHNBbS8FO76KQHFpi/292Fk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781287256; c=relaxed/simple; bh=omFKO4EP3ToAvJxa8cmB8JXZlOhJFnubM/2euZVUsQI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TNgUNImLHkvlXAHXzla29Km2Wc5maa8sqEKPqKCWDRpJNsx17OW5qg8vVRs+lOaIphSW9JZsOi08FjzY5avglNmKhaDMCV4Miq9KfvzpTF5A/E+NbV35tAwEiqoABbJYIArNvcWAiqtHlH+PWHsaoTtPg12HzsS+BjCMyZEj7hM= 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=jTnNPHmj; 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="jTnNPHmj" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1781287252; bh=omFKO4EP3ToAvJxa8cmB8JXZlOhJFnubM/2euZVUsQI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=jTnNPHmjgKurL8iYKgop38z+EuApKXzKYpVcMtEBFWm/imiWuD71Fis2GkByv8XCZ a9USebMYJ4BcD32a+s4KBKkWDo9cNeCdU8CaPq3Vpf14VVTcc7Q3q/BAq3rx4KsOOb 9nVFZ5RphSbV2wbQl3t/XynTBAqQDVt/rG6cXPWqFOCfswjQ+LmNO1rgYKNcizbPfs gprb3Ykt7O2lkL5f+gBHQa40NIW9cVUObYNfEeS5O2k6KXwE2zBcV7dA5/sObDFmQd qL9jDyzcYYptRfFPmBnMqwYg+UIPZofU1LGmiyeGuSz/7XG+rRQqjkdvrDbR3M8OAT J3KoG4pJCfchQ== 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 B795417E040C; Fri, 12 Jun 2026 20:00:52 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 7A048480029; Fri, 12 Jun 2026 20:00:52 +0200 (CEST) From: Sebastian Reichel Date: Fri, 12 Jun 2026 20:00:48 +0200 Subject: [PATCH v3 02/10] drm/bridge: synopsys: dw-dp: Support MEDIA_BUS_FMT_FIXED Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260612-synopsys-dw-dp-improvements-v3-2-dc61e6352508@collabora.com> References: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@collabora.com> In-Reply-To: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@collabora.com> To: Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Krzysztof Kozlowski , Conor Dooley , David Airlie , Simona Vetter , Dmitry Baryshkov , Luca Ceresoli Cc: Cristian Ciocaltea , Damon Ding , Dmitry Baryshkov , Alexey Charkov , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Sebastian Reichel X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1544; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=omFKO4EP3ToAvJxa8cmB8JXZlOhJFnubM/2euZVUsQI=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGosSVSDh4EWGtKE+GX79p0vuT1Lhykh22BUQ 1RPnFyDk/XPYokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqLElUAAoJENju1/PI O/qaBjkQAKlK6B99B5tae3/4Yf4pTYBrJyN5R92oNxB++rD7yEBXDogdrHCiMz4Ve5htpU2sIUt CMSSIx9pCHz13DHpekX/9sHCXei1M27AImROaJXlJRqAVRo7xX3NwfSk7Z9CB5p0Ou+xfG2XT+j 3ihnLQKWWEDt6S94jJtkmckT/MMgMizxMwoupzGUT+Qu2o7jDDoz9nQqH8HR/Z+WrnauvOCK3SW 699lg5sqkS5OvuvfNsJOTZmRXIYgbayqjVDgc5YBbtEVLwv3iOKlfjBLEc+DJ+yVC1Sm3kmvNG8 Yc9ycTZQp6eDvx3ETm5A+8U1bd0X41Dg8QMzoejg6/C1kJoHVz2ePUpPA4GcewC8Pqrrq0Ki9i/ pFFpzJwJbf6T+/R5zMuliWz0Wqjo6hbAMtpEMTkT5RUoVDqRHZnXN2O0PksdHTfOLGlAp3zeTuX HqnJhnuZEFt9ieZ8i+JPOpPoCfRItHD153TWYNapyLIu03Ljm3axPmgsXIVnC1JyqOw7izbhaNA fAlqB2toQahqwJP4B1PKW5CNiMRbimShuBzm2RV99sxXjVLXfeKC29jtkYF0aru4J1xh57fuxcU vhbl8RU9BW0LjCQg/qCYZy0U49qiiCh81fTu/yrkmstkPkv++UqATQbPB4landLYg9OIQZpEvZS vdSTV/LQXFm4sIkcAmvMguw== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Add support for MEDIA_BUS_FMT_FIXED, which is e.g. requested for USB-C DP chains as the last bridge in the chain (aux-hpd-bridge) does not implement atomic_get_output_bus_fmts(), which results in the generic drm_atomic_bridge_chain_select_bus_fmts() code using MEDIA_BUS_FMT_FIXED instead. Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 36ee6e027af5..ac7779e42bb2 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1528,6 +1528,7 @@ static int dw_dp_bridge_atomic_check(struct drm_bridg= e *bridge, struct drm_connector_state *conn_state) { struct drm_display_mode *adjusted_mode =3D &crtc_state->adjusted_mode; + unsigned int out_bus_format =3D bridge_state->output_bus_cfg.format; struct dw_dp *dp =3D bridge_to_dp(bridge); struct dw_dp_bridge_state *state; const struct dw_dp_output_format *fmt; @@ -1538,7 +1539,10 @@ static int dw_dp_bridge_atomic_check(struct drm_brid= ge *bridge, state =3D to_dw_dp_bridge_state(bridge_state); mode =3D &state->mode; =20 - fmt =3D dw_dp_get_output_format(bridge_state->output_bus_cfg.format); + if (out_bus_format =3D=3D MEDIA_BUS_FMT_FIXED) + out_bus_format =3D MEDIA_BUS_FMT_RGB888_1X24; + + fmt =3D dw_dp_get_output_format(out_bus_format); if (!fmt) return -EINVAL; =20 --=20 2.53.0 From nobody Sat Jun 13 04:51:15 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 DD2E5330652; Fri, 12 Jun 2026 18:00:54 +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=1781287256; cv=none; b=TxYgKh0D8Dd1y23l9vPwg1aO4/QAbcP8oV2sdp7HoxvPJMqP+pwqjINoHzyMIJ4S36QbzIHpBoxkDjIbM3+8URyvT1YFMTb79z0fYS6weYyzhsbH8BbIrnh4SAIKq81Eawh5knio4pfVN7W3yU2DXcbWNhltMbvnRgW8KT00T3o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781287256; c=relaxed/simple; bh=/D1KN3oWC9criX1aCdLuZegAStVy2nhqzSwDf7l/Nvk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kajOMPM2XJCfO8RUe1/rHEYoeuLwCduuLb8sCtIa242QAvXWrkJ/5oeQoGTFt7RktLNgwgX7OP2gVQCe8AYLzvRGrNlq90ePMHcew8mk/K+vvTCbvrPpqk5TxKii9K6kWKzjHb4PWiwXbB8QvONxJgqBZ0mAePEkLlSuz2QQvgE= 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=f8Swmx4o; 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="f8Swmx4o" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1781287253; bh=/D1KN3oWC9criX1aCdLuZegAStVy2nhqzSwDf7l/Nvk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=f8Swmx4o7g/FvFgcmAFsTlJgyEojmhI1U3HoA+i9XW1gm5p50F0OcMY/Ojr/HMrwQ 9VJeoKN25DBfM7eFcTtiZlIXfOg4kVJdEPJ26Jlw1KqfZlcqQ116dO3FsvRx5JYLqR i4DRCWYPtH4qxJhuE3655Txalb/yykf+hXtoFIJbZNLIYdAcG10Kr/pUVOYybOFAbQ udlbUtLeAN5XCoNm0/A3Oyaj2V3nD6pZzQyiE6WiD5PNP5kFr4C5W2su6jGd4VVouc szKFaYPRtxo/S+0FPETgUo/knpZxLrKi4zjz0bZmKfYZ5RDQdxs0vC+/jTYennt0wi 9haJa47ZWiOCw== 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 BAA6017E0CD4; Fri, 12 Jun 2026 20:00:52 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 7B96548002C; Fri, 12 Jun 2026 20:00:52 +0200 (CEST) From: Sebastian Reichel Date: Fri, 12 Jun 2026 20:00:49 +0200 Subject: [PATCH v3 03/10] drm/bridge: synopsys: dw-dp: Add follow-up bridge support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260612-synopsys-dw-dp-improvements-v3-3-dc61e6352508@collabora.com> References: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@collabora.com> In-Reply-To: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@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=2144; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=/D1KN3oWC9criX1aCdLuZegAStVy2nhqzSwDf7l/Nvk=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGosSVSAJAYKQHR/fLueDkRvq3aXI2zVmxPNu XDv2pcU/zzxcYkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqLElUAAoJENju1/PI O/qaz48QAILXZe4MPvVhYOnlnDi3Sj9Qje32AOoEA9X364HakRtMKit7ypzAh2I42XHo2hIVWg6 R5+DK10AA6nT6YwD06/ASuDSN7osh9tGSw+0ptUekjwf0VAsuD2n83PqiJl9YpCdzJ9tw3GMZMq 6TJifAMcqGpKoQqGR6LEnXKCciCyS0lwNtDfZ1QbvKqu//683fHf53y0KfDRnHdYJ7oEQFXx2or S0vy2zRL/CYoAeQ9eVeyOPrqvaHiKg0Z8bRRKyUlRYAxF4Qm5ORf4SQAr4zPi8W3YnbZYmDQTMt 8JF+iMVrM2cZEGIB0e2/IgRSIFnz7DzR3NC9zVvIEN1CK+trhjb4Lw1lsYjQJtOBh/8EYugmaFb Obm281xIBKsVAkuj1SmLLx1mEFkX99d0aTBl5RFTBr1ZpTpitj4R3RiRSJhmd5E7eq81eVHLLvn Q16EUDVDGzK86wSqHvusZvaK0hLcc9PPyEvUQQkmsyrXM1cwHBA1QWhClppMoT04eTdS/Z5fS8o TL3a+V1L/9KgcEk1ZU+5sqH0jKpOZEXLwoBqJ2sHnRI8YdXkMRXH1wKyiCAT8csSFkN8XcL7fzR 3n66hyBkCC049+pxu5E3Rj2GyD2tSTTYpFawShZ7dZ/O3cdOVmYSQSOuIgUFGOLUYeeArvkRteL i7FM6GeDtbGc4L3hGETAptQ== 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 Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 16 +++++++++++++++- 1 file changed, 15 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 ac7779e42bb2..98cff435dfb8 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1970,7 +1970,7 @@ struct dw_dp *dw_dp_bind(struct device *dev, struct d= rm_encoder *encoder, { struct platform_device *pdev =3D to_platform_device(dev); struct dw_dp *dp; - struct drm_bridge *bridge; + struct drm_bridge *bridge, *next_bridge; void __iomem *res; int ret; =20 @@ -2064,6 +2064,20 @@ struct dw_dp *dw_dp_bind(struct device *dev, struct = drm_encoder *encoder, goto unregister_aux; } =20 + next_bridge =3D of_drm_get_bridge_by_endpoint(dev->of_node, 1, 0); + if (IS_ERR(next_bridge)) { + ret =3D PTR_ERR(next_bridge); + dev_err_probe(dev, ret, "failed to get follow-up bridge.\n"); + goto unregister_aux; + } + + ret =3D drm_bridge_attach(encoder, next_bridge, bridge, + DRM_BRIDGE_ATTACH_NO_CONNECTOR); + if (ret) { + dev_err_probe(dev, ret, "Failed to attach next bridge\n"); + goto unregister_aux; + } + dw_dp_init_hw(dp); =20 ret =3D phy_init(dp->phy); --=20 2.53.0 From nobody Sat Jun 13 04:51:15 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 0EAF136AB4B; Fri, 12 Jun 2026 18:00:55 +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=1781287256; cv=none; b=HRcktAAL40LMb7OODwLEah9tDVYCQd5MdDh30DChwjwqMHe8tyeLRDLYVlVDr+C1ml9Ub7bzsrK1IGDV+yGWIXscMfuFl93B8xvmsCHSIy1GboXPGqmX1KsKpifMQu2b547ef9e0GNc8cNyDASivjIFwbd0Bo0QknJMJwhKRp6w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781287256; c=relaxed/simple; bh=5FzH6D5Iw4bwqKNNxbyE0JcWBKVjdha2iUi0EcsbYIg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=emuxm32GLJHQCwQcHy/2sruyMT+ZguCFTlvbnchU5rvWH6gpNq2MhRf9kHDrhHV6rQWd6dvEHuZhYr5NsjP0c47Lnsu/rPy4Fp7mqRQ3TvQYoxGxF765QMSCn4zeSk2c2zouzXkQggkku+Rlqph/twA3M2OGyJD7L+sWay8mN/4= 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=mn6NU/hT; 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="mn6NU/hT" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1781287253; bh=5FzH6D5Iw4bwqKNNxbyE0JcWBKVjdha2iUi0EcsbYIg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=mn6NU/hTtRNg6T4zR43ki/rvnjc6wDbUJlzZ4hAvpEAEeKyEpPLQX6myxrdf80azD wr25yq46MjKk2veZC+flr5do8MFVqn+mS84nKfhNHV8Y42H4++2IxJOBjG8BKox2Mx PkhG3NKtWFHYtEUyQ75okzQwHp5lIlRgBnl2VwcgklQtGJQo3l/8hqLRVG8DUijd37 Ja1ePeC7BxzT27oUy7IuME6rLOYw+7llVPXe9S6m5049yX9vW+zCV5uVDyse2i+ujD OYKkAyt3Jw3JaSrbutO1b/tMa43kScvl2Z0jwnviob700E7XnPDkPzZRun4SmLr5dd WqZQV51kWv0eg== 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 BC62717E0D68; Fri, 12 Jun 2026 20:00:52 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 7D45848002F; Fri, 12 Jun 2026 20:00:52 +0200 (CEST) From: Sebastian Reichel Date: Fri, 12 Jun 2026 20:00:50 +0200 Subject: [PATCH v3 04/10] drm/bridge: Add out-of-band HPD notify handler Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260612-synopsys-dw-dp-improvements-v3-4-dc61e6352508@collabora.com> References: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@collabora.com> In-Reply-To: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@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=2384; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=5FzH6D5Iw4bwqKNNxbyE0JcWBKVjdha2iUi0EcsbYIg=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGosSVTaZMcIYkPg0WvAY1uZHxTpvSJcLp/dT VIv07+Du0SvbokCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqLElUAAoJENju1/PI O/qaY4MP/2ti0fNHRbgVMfK2R+vOPcMwsOulVHNk+tfdSC1ZxEboAHes1tiJTM1cjQZ4gM349sB 8RK+nlXVJ+B9e0ip9ARqV+k5MvMQWEknIB7s8n8MBXW4dyohxS2yzVpMlzl3mFe8RY8XGf+1zYW 2j2EZYvL/TaWQfbCfwE3h4Nan/mn4k12R84Q6wvawkTNn0/dRwmTZ1MqHir0k196E859kildFaF AG+Mhb71K8QnCpuaaHPGIRnDl3YVnBLgQSNLNphPWjbrJZHvwH+FBaRMwhhtYnyZNAH9VfTIDax vgpkXqqhMZn6hX3BRItO/tISm0Gq9Qy1Jk1FysVu6ZWaZE4RiN5ebgmmj25VkUaI/aI+JXx73Io c/yQsy2CWfvDzns++vYJDNtn6m2qEpolKY1JdqUBxRMMbyi5QdYhDrPX3SUoRc9tmpnmci0ZaZZ IY3ew7T6/zVe0L4ZZzbQQ2XM6zgELM3+OULlXPfYx1s+nWlnxSlbCx/CBYxT6oIqLvuQBL9FrBd MqPYsxuQnVKOUTb7IqhobnMFE4jCII89nZLTR565tQEmi5rUQKCccrNYxeHCYpWW9OR/ZASM8KB WoWvdsGmJNzzTvQIWeKEb32Ry+Idbi0nVXWGkdl3op7lte9gPfuKBzbLT/DGr2SiryrdDluxVBp qOmODRlBHmWVObUNAVOgvjw== 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 92f8a2d7aab4..802b5677194b 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_scoped(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 00a95f927e34..11802e39d1f1 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -646,6 +646,20 @@ struct drm_bridge_funcs { */ void (*hpd_disable)(struct drm_bridge *bridge); =20 + /** + * @oob_notify: + * + * Notify the bridge of out of band hot plug detection. + * + * This callback is optional, it may be implemented by bridges that + * need to be notified of display connection or disconnection for + * internal reasons. One use case is to force the DP controllers HPD + * signal for USB-C DP AltMode. + */ + void (*oob_notify)(struct drm_bridge *bridge, + struct drm_connector *connector, + enum drm_connector_status status); + /** * @hdmi_tmds_char_rate_valid: * --=20 2.53.0 From nobody Sat Jun 13 04:51:15 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 678F7383C9D; Fri, 12 Jun 2026 18:00:57 +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=1781287259; cv=none; b=WtX9oD6d1zRlzHUU4sGF4EGTjsPqO5N/6QF+0p8Loc0HvkqLBhEZJu17JwW5cFySeX+ryydlXBjIL/RNdQn4fXyY710o7CEwl/ZX+DaBIK2v6pIM+hwPhd8pQwcbZ2lXyIexS/xV2McEkym/XK7rfbuVA7fgUGsE1arLOwF6Zfw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781287259; c=relaxed/simple; bh=dL3GvBpUWK60QI4BRVYXqTeextgd6JG8E3Id1W/JV98=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eLYZ3+uamgzidphSPwrzBr3Bg/HX6jUCaMCof/OvRHqn9ttn5CRtqIMOYy1NDfbm1NCq5gLq8t5QqXMZYCYIQSYoSmQRi4Ho1zAB4Wu29Jg3iu3E3DdC7wBp1/q9B3IeqBhnkZdw5nu+QKEEiUqaq+7/dhuiUYpKqjRBd/JlgKo= 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=qCZY8qjQ; 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="qCZY8qjQ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1781287253; bh=dL3GvBpUWK60QI4BRVYXqTeextgd6JG8E3Id1W/JV98=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=qCZY8qjQuDqp+h/kEMMGZnL/4b1hYab8tzWjNyW6N+GsTPBykrMigp/YQQsC4ZVop NZTPWpwIW5KJ1MSOUd0f8bo8RmThUyHQ3p2R9iHbcyknVP7jo/GgRrqu+HyfUmPmOb O87C/MNb1fDky+3QgSI3x7+BtbVICFBEvTSaG5kBx99U7CjJ1kaXJtdFx+5Ub4EbQc 9yU4mH5AVxSDSKAsrszlQfnaJyZZXTutpCybmjFlB+0anCiQ2nzCNyqQ+xwSzsOcTE ggdnL30es6KAQfmj+FaRU/Poa+6uqX36+pzL9YAZlRdo8sZiE5fiCdFyYqrI8MumYj 1Gof4xA8cinTQ== 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)) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 1DB9317E0D9D; Fri, 12 Jun 2026 20:00:53 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 7F00B480030; Fri, 12 Jun 2026 20:00:52 +0200 (CEST) From: Sebastian Reichel Date: Fri, 12 Jun 2026 20:00:51 +0200 Subject: [PATCH v3 05/10] drm/bridge: synopsys: dw-dp: Support software triggered OOB HPD Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260612-synopsys-dw-dp-improvements-v3-5-dc61e6352508@collabora.com> References: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@collabora.com> In-Reply-To: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@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=3782; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=dL3GvBpUWK60QI4BRVYXqTeextgd6JG8E3Id1W/JV98=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGosSVT5yJsFm/XmeGt4/9u012HhK7UGTwSIo /6bOogz3cLLUIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqLElUAAoJENju1/PI O/qauaUQAKTREDvPsMiDBcZFeiVnb7HHdePTjp4HUsgoCNjf05kXSIFKb4C6UwoTlSE4uu9U6h/ IzGNpTCVUitn5ZBTMi+3bgDrXoPoP/7GDMo0nx+OAnKdfDX6u6DJTGRTSfV5RW03xvQo18QrKnx h+5kcdU/K2wBqgTnYcdviDINJNVtfuDpeSh/NCiSvmwuOPmc0fgVSwcJMBQdJBzjpHJ78RS1v6D KpwGubOUr6YXJVokqrRuOi5YQNoc39+v2LYDo04koEdrA+TlX8JByV9UaPnBdhV/MsTtvQ/k/iM uFz29OygLZkh4cFQVmQEt3HFxi1+odkVS6WlMh3Lp40EpxG16eevjbRn+oQvJJ0tUmyAkhgwbOR l/LEVjqCOsJVCsuwi3izaimqsNYXTD8WIVhzfDiWbr33ZAV0/nkr/F2mSIL4G3XJ/IeQbJP0b4J 2n53uyAi+qzzuD5qLLWOb2kUokc8XwQwFw+9v7pMGySBPhKAAVT8kjXx9Gi7MFms8a7wKnADR2O lUZcgHisDfvyqHz9vu5aBe/me2HhHeqN7Nqh4XDeHKkHD4EWzg6So/wCMjvJyQ+27bOWnWY/fGs jp+U9C4kJfQxKnZpnWFLAAp9hqois+9yfjiztvTiItCeQ+2Jb8s+wE3vLH7jMKra6BDV1ma+NDf HrYxqdz0z5Qnsdu+gDeEyVA== 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, 40 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 98cff435dfb8..7fa38145e35c 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -1817,6 +1817,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, @@ -1829,6 +1842,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) @@ -1965,6 +1979,19 @@ static void dw_dp_phy_exit(void *data) phy_exit(dp->phy); } =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"); +} + struct dw_dp *dw_dp_bind(struct device *dev, struct drm_encoder *encoder, const struct dw_dp_plat_data *plat_data) { @@ -1980,7 +2007,9 @@ 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.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; bridge =3D &dp->bridge; mutex_init(&dp->irq_lock); @@ -2078,6 +2107,13 @@ struct dw_dp *dw_dp_bind(struct device *dev, struct = drm_encoder *encoder, goto unregister_aux; } =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); diff --git a/include/drm/bridge/dw_dp.h b/include/drm/bridge/dw_dp.h index 22105c3e8e4d..2127afa26b2c 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 struct dw_dp *dw_dp_bind(struct device *dev, struct drm_encoder *encoder, --=20 2.53.0 From nobody Sat Jun 13 04:51:15 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 67822383980; Fri, 12 Jun 2026 18:00:57 +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=1781287259; cv=none; b=FsJS/mBXrT9HrM8AhzWB2JPgBMe8kwz7E9oEdMxS4h9JmLc/D4ytBvJpZdH4IwkUZe6xmhb3cfeyOFIVInPs8HDnkDMgQihKTJXV8DRvVuGgUlODR9B+K1Jp/HuUQhx2vFRMm34B/P0jeqYWilkXvy5E9BXPWJ3PwF+Ic5GedIc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781287259; c=relaxed/simple; bh=XYS++GLSDDzX6NcxSFdwWEwzf/o23yGNuXirz7ObHUQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IB97AiZ/00qXLH5ALjW7KycWFRCsGVfuWS5vCVxICXisHLRHTjMVVPBFs/MGnsXudy4H4Mhzi3Tw1O/LRrG2pz4GSvuo79QNr6a73Htu30BTi96/ZjquYoRVkiwMX5Mt8xPvRGS2KbJArgDTzBc0UqrJzpw93Cr4+jHQdnQsn9U= 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=Md70h7d+; 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="Md70h7d+" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1781287253; bh=XYS++GLSDDzX6NcxSFdwWEwzf/o23yGNuXirz7ObHUQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Md70h7d+HCnA/sk/NSbIJV6SbXuq+GOnOiStWEDqme7xBuZZn6bBxkJBoE/KkcT3A IBTyJlltiJ2Ro5q5MuRbwUyw3q5stiz/MJqsNvpkutjQe993ZcSDtvA07hP5zjLBeZ qn0BeHC6nBUH+mRPhecMX3pKH9l5YrwsZVOUenlZ63HQn5yUqZsullZI/gjw2sRg++ LIzETSqKLCHrAIchG8/swa3TU4hQFyhTY7Fi4pFrRAm0DHwYyEKL5JFbNmMSHUOFDS G82qSE7B+xWxEV3hc+isI1jlsjkme+lfty/7+r/B6HnPqeVjgWKgkbx5zHIsPwWyET hB6/5rNJj96mw== 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)) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 21F0D17E0DE1; Fri, 12 Jun 2026 20:00:53 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 80A2F480031; Fri, 12 Jun 2026 20:00:52 +0200 (CEST) From: Sebastian Reichel Date: Fri, 12 Jun 2026 20:00:52 +0200 Subject: [PATCH v3 06/10] drm/rockchip: dw_dp: Implement out-of-band HPD handling Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260612-synopsys-dw-dp-improvements-v3-6-dc61e6352508@collabora.com> References: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@collabora.com> In-Reply-To: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@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=6508; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=XYS++GLSDDzX6NcxSFdwWEwzf/o23yGNuXirz7ObHUQ=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGosSVQVW0LKXKcqK+E3Buj+zbXJJKCV1W+02 zV+CAfahysbh4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqLElUAAoJENju1/PI O/qatn0QAJsgLlzEqmTV+rstJsgBLc+82ZvZ0mvkaQFBTMLmuJXF1fAHzNoi9kBv0TKq9ZI+QL9 B1E5J8X8Wdx2Rpd6gQiuk2e5E7O07dGSPebRYKHVz8KMi4PUqP/022te3ofODm4CBQ70w2iuTDs mRVCyUTozQXQo+Oc1bZMAur1APFh4Xdzp1IiR9+LAPah+2uAm/QwdpsAwLGsrgRYagJDVFOIj02 BV0ZMQVvd2jVRwNXpODeb2skZIjtBB2+rzIMv92kH68ChG1SjycjYYA9T19PZBTb6ztgfiT6J7j bKfjZxEhYnaI8K7BmGkr6nCz+fOatUdX+PgmZY9N06ASR4ro3c6hZ6PjM2SM5eohUcDgMX/MH99 QkXjnZQeOSdPyBNwXVSQcNyu67HbNVVf2WSgM8wVff6LXaEGCaZoFrGtDxASbck46VCDGWCKxbx 6I8ePZCJgZ0U3LiiWetAdpB7LxwC+P8Sxko+vuq9AppEreepwhSXnqYG2pqZKYDAFPY9vscLxiR KDQ50XXanIbED3/LHPau8nbY77QZaiCjLvnmWUxDAeS9gMooPhH99xFtSSe4PL4c3fPjhevZdZD 3CJcNxR0ZoLQv3JZ4RwC2MlNDT7FDIznC/Q0v2K/ysaOsd/ZfVJTJac5oaEPoclyAZGVOk4/FHU 3vfR6JCJY81emNIvGt5UuqA== X-Developer-Key: i=sebastian.reichel@collabora.com; a=openpgp; fpr=EF660D07463F8B726A795413D8EED7F3C83BFA9A Implement out-of-band hotplug handling, which will be used to receive external hotplug information from the USB-C state machine. This is currently handled by the USBDP PHY, which brings quite some trouble as the register being accessed requires the power-domain from the DP controller and also requires custom TypeC HPD info parsing in the USBDP PHY driver. In contrast to the USBDP PHY this does not just enable the hotplug signal when a DP AltMode capable adapter is plugged in, but instead properly detects if a cable is plugged in for things like USB-C to HDMI adapters. Signed-off-by: Sebastian Reichel --- drivers/gpu/drm/rockchip/dw_dp-rockchip.c | 126 ++++++++++++++++++++++++++= ++-- 1 file changed, 120 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c b/drivers/gpu/drm/ro= ckchip/dw_dp-rockchip.c index 35598ab9fe84..9c53f1d2c29a 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 @@ -24,12 +27,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) @@ -72,14 +117,49 @@ static const struct drm_encoder_helper_funcs dw_dp_enc= oder_helper_funcs =3D { .atomic_check =3D dw_dp_encoder_atomic_check, }; =20 +static struct regmap *dp_dp_rockchip_get_vo_grf(struct rockchip_dw_dp *dp) +{ + struct device_node *np =3D dev_of_node(dp->dev); + struct of_phandle_args args; + struct regmap *regmap; + int ret; + + ret =3D of_parse_phandle_with_args(np, "phys", "#phy-cells", 0, &args); + if (ret) + return ERR_PTR(-ENODEV); + + /* + * Limit this workaround to RK3576 and RK3588, new platforms should + * add a VO GRF phandle in the DisplayPort DT node. + */ + if (!of_device_is_compatible(args.np, "rockchip,rk3576-usbdp-phy") && + !of_device_is_compatible(args.np, "rockchip,rk3588-usbdp-phy")) { + regmap =3D ERR_PTR(-ENODEV); + goto out_put_node; + } + + regmap =3D syscon_regmap_lookup_by_phandle(args.np, "rockchip,vo-grf"); + +out_put_node: + of_node_put(args.np); + return regmap; +} + static int dw_dp_rockchip_bind(struct device *dev, struct device *master, = void *data) { - const struct dw_dp_plat_data *plat_data; + const struct rockchip_dw_dp_plat_data *plat_data_const; + struct platform_device *pdev =3D to_platform_device(dev); + struct dw_dp_plat_data *plat_data; struct drm_device *drm_dev =3D data; struct rockchip_dw_dp *dp; struct drm_encoder *encoder; struct drm_connector *connector; - int ret; + struct resource *res; + int ret, id; + + plat_data =3D drmm_kzalloc(drm_dev, sizeof(*plat_data), GFP_KERNEL); + if (!plat_data) + return -ENOMEM; =20 dp =3D drmm_kzalloc(drm_dev, sizeof(*dp), GFP_KERNEL); if (!dp) @@ -88,10 +168,38 @@ static int dw_dp_rockchip_bind(struct device *dev, str= uct device *master, void * dp->dev =3D dev; dev_set_drvdata(dev, dp); =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 + dp->pdata =3D plat_data_const; + + res =3D platform_get_mem_or_io(pdev, 0); + if (IS_ERR(res)) + return PTR_ERR(res); + + /* 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; + 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); @@ -138,14 +246,20 @@ static void dw_dp_remove(struct platform_device *pdev) component_del(&pdev->dev, &dw_dp_rockchip_component_ops); } =20 -static const struct dw_dp_plat_data rk3588_dp_plat_data =3D { +static const struct rockchip_dw_dp_plat_data rk3588_dp_plat_data =3D { + .num_ctrls =3D 2, + .ctrl_ids =3D {0xfde50000, 0xfde60000}, .max_link_rate =3D 810000, .pixel_mode =3D DW_DP_MP_QUAD_PIXEL, + .hpd_reg =3D {0x0000, 0x0008}, }; =20 -static const struct dw_dp_plat_data rk3576_dp_plat_data =3D { +static const struct rockchip_dw_dp_plat_data rk3576_dp_plat_data =3D { + .num_ctrls =3D 1, + .ctrl_ids =3D {0x27e40000}, .max_link_rate =3D 810000, .pixel_mode =3D DW_DP_MP_DUAL_PIXEL, + .hpd_reg =3D {0x0000}, }; =20 static const struct of_device_id dw_dp_of_match[] =3D { --=20 2.53.0 From nobody Sat Jun 13 04:51:15 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 95C64388862; Fri, 12 Jun 2026 18:00:57 +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=1781287260; cv=none; b=hCzXfIFughEw8789Fp0qdkvYbpG4MZk7NEmlNvh937jzKWitJ0okM2DHYL+7ALroJKd8fmKBzfK+g9nYnGZ1S5soBBHz59NC8UL0NNvDbcV9G0EEPyOqlssBRkg+gBKchCEekkx2UTe5Ww5Z/3vkwgVQG7MMF88r302ZFnKxB4U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781287260; c=relaxed/simple; bh=KpZ/GTLLPgVDKAOSipReW62jls7h/kg8HzcOThxf+bY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JJHbURXCyaaH8tBrA0UpqvWvnLFL28AgdfakZdAfxQrKvGFLYJ70QWtT9V94WnuHeHZyyIOCJhSOmyhZAVlD4PfKAWsevhfRpo/+TxlTQqg/PevcJBd6XO2jCQipNco4YyRuiBcKKlzFefxHvO4KBu0qbxOaC56b5pGqKgIUP68= 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=mDO51Hzs; 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="mDO51Hzs" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1781287253; bh=KpZ/GTLLPgVDKAOSipReW62jls7h/kg8HzcOThxf+bY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=mDO51HzsDiBGsO9QlE4qEQ7gfU88d3uubEJU9gj36ij15dRLw+7GSUdECIOtga14k zJ8gnxc4aRcz4KplzTCyEfhuZa4JC9/cjqPF/u95v94fDQ9qquthbmgPk5iV6aG5Qo cQ+4X/Cw+FkFrzFROkN5i4rXYi3/lqm/nyK8FKuxy28v76CW1QbGAzM6j/wGQNtiqS MU/xZX9cLPk9ziVd2pmQhM5su8RAI0fHhrSAAJDqWKSlGj1P5RFsZ7HOJLyzF5TbXn TlFKV4e/vHwLgNqyE40Rl/JBgorWKhrQYyZmA1uyMgyglHMNL/Zf5j0+QXdydkjixj pRb64JCS8285A== 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)) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 2E24417E0E6E; Fri, 12 Jun 2026 20:00:53 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 822DD480035; Fri, 12 Jun 2026 20:00:52 +0200 (CEST) From: Sebastian Reichel Date: Fri, 12 Jun 2026 20:00:53 +0200 Subject: [PATCH v3 07/10] drm/bridge: synopsys: dw-dp: Add Runtime PM support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260612-synopsys-dw-dp-improvements-v3-7-dc61e6352508@collabora.com> References: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@collabora.com> In-Reply-To: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@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=3017; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=KpZ/GTLLPgVDKAOSipReW62jls7h/kg8HzcOThxf+bY=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGosSVR4BiIQqHL+BfJfXPL7BIkISy7bH1dRq 7ZTxEvb9UpdRIkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqLElUAAoJENju1/PI O/qanSwP/1Kxg/dEXQeX6oToNqMfpeYNrrseyzEiKoR5WBb50EXZl3UQpMgXARjveRkI6/NV5SY vU2OTcs1Pr8INeYLPWt37c8ktmaOfFuNgRtyogC7MqshZKARH+BF3atyeS6WuPkcqq8gCi2AEIM 1X2wyVrq/DGf//DoRJhpXSnnqDfuhrHRAjzMaYlhrD2SU5iWtZehMteShj/CCNH7SaT+VbylaS2 zT4sNwmiXc6us4uMeED762gdCZn4Ti2rGmkoUvTyLALeAigmIKCMEeXsCsYwC5vig1V5EF0qeNT Y3YN/Tg/sk9jjQTU7rNXPG3O0IbSoKmh+UcJIXQhi7GpvOTiXIpZl/d7PhVGifM2nN9cekS3fDI P7sHl8jQOSQ6ty7cW4VXqpXa+uFv+nCeVZPqf7SeI6QlMwCYGUkJMSfaIzUjG+VsbnEkaLF91xU fnBLTryLukcHoVK7+HL67No8WhrZD8DB/j1tW9deFQF74pxZBpydSD3DVhpDLuSBcioTUd+r33r Zsf0ea3Bm8Sn8EBuvIotCNzMac1Xpyw1/bm36leXaUEIpnDAokjzMo/oePoVGFl5X7mzUfCjdCe owkbT75vJG5cmIHSCG6vb12CZ1OUcIcDnjjOksdcPOHagwsoAeGQN1iFKIVk8vW1mJyoM2wpvVQ iJvgD8mOy+0Nl/F5hnK0tiw== 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 | 27 +++++++++++++++++++++++++++ include/drm/bridge/dw_dp.h | 3 +++ 2 files changed, 30 insertions(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index 7fa38145e35c..7f4f36c61484 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 + ACQUIRE(pm_runtime_active_auto, pm)(dp->dev); + switch (msg->request & ~DP_AUX_I2C_MOT) { case DP_AUX_NATIVE_WRITE: case DP_AUX_I2C_WRITE: @@ -1655,6 +1657,8 @@ static void dw_dp_bridge_atomic_enable(struct drm_bri= dge *bridge, struct drm_connector_state *conn_state; int ret; =20 + pm_runtime_get_sync(dp->dev); + connector =3D drm_atomic_get_new_connector_for_encoder(state, bridge->enc= oder); if (!connector) { dev_err(dp->dev, "failed to get connector\n"); @@ -1709,6 +1713,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) @@ -1729,6 +1734,8 @@ static enum drm_connector_status dw_dp_bridge_detect(= struct drm_bridge *bridge, { struct dw_dp *dp =3D bridge_to_dp(bridge); =20 + ACQUIRE(pm_runtime_active_auto, pm)(dp->dev); + if (!dw_dp_hpd_detect(dp)) return connector_status_disconnected; =20 @@ -2153,6 +2160,26 @@ void dw_dp_unbind(struct dw_dp *dp) } EXPORT_SYMBOL_GPL(dw_dp_unbind); =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) +{ + clk_prepare_enable(dp->apb_clk); + clk_prepare_enable(dp->aux_clk); + + dw_dp_init_hw(dp); + + return 0; +} +EXPORT_SYMBOL_GPL(dw_dp_runtime_resume); + MODULE_AUTHOR("Andy Yan "); MODULE_DESCRIPTION("DW DP Core Library"); MODULE_LICENSE("GPL"); diff --git a/include/drm/bridge/dw_dp.h b/include/drm/bridge/dw_dp.h index 2127afa26b2c..3037e0290861 100644 --- a/include/drm/bridge/dw_dp.h +++ b/include/drm/bridge/dw_dp.h @@ -28,4 +28,7 @@ struct dw_dp_plat_data { struct dw_dp *dw_dp_bind(struct device *dev, struct drm_encoder *encoder, const struct dw_dp_plat_data *plat_data); void dw_dp_unbind(struct dw_dp *dp); + +int dw_dp_runtime_suspend(struct dw_dp *dp); +int dw_dp_runtime_resume(struct dw_dp *dp); #endif /* __DW_DP__ */ --=20 2.53.0 From nobody Sat Jun 13 04:51:15 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 958183876B2; Fri, 12 Jun 2026 18:00:57 +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=1781287259; cv=none; b=QWZdGZe/qbtf64G0h/KP7uinWwuK6BiIOFF9o7/x3anSVCb/0mgmX+qW2H9AiYFew6NwM9FXK44wm9WX22BArGXtN/RLBgQUu5HH4GM0H5La4rfpvY6UTQBlS6jwdJO2s3Z1K9Dx5x6IDQ9YOVhn1Dcg1MdtZ+Qnbo7Giq/EaDA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781287259; c=relaxed/simple; bh=uvgE/+PtR/8Y+EFTZ0voEnP7Ycu/PGAP66890VAIh0c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fHxLEIGHq7Xy1fQG8SGN108hHfeDiOouCHLEx764WA2+F2m26s0lNUoz5kWgqwqoD9X9TzXbAvCmbkDOyo6ePNzSX+nzREARSXi41VuhZcPiSLkT0cwOgDp6f74nSJItT6KoCpIXkDyw68lSiIIqIu+0UBgJOGsq12zby79kwTI= 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=hNW04xIH; 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="hNW04xIH" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1781287253; bh=uvgE/+PtR/8Y+EFTZ0voEnP7Ycu/PGAP66890VAIh0c=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=hNW04xIHs/EqeaoVawO9C3QLh9TFoLK8EIkqgOdPm2QfUHd67YonSjs7ZPtM8U+0p 6ha/s7fQKbMHrAv2X7SpiiE6xCTCahQ4by+EL6sdHp2F3C0ja1Xy6n//eOeAQkbSw+ tUNKiZ3Erdfkj7JMRpUBbqLidH0VIrhJdxNk3SP9Xtw6ISqoDa3Y3oEuSMrrvDLB6h dOTktmmh2EPSeFByCa5E4p4JifcutrhSf/6iWIptFotLfRJzTaKj/6wjIa//TjBKD2 turvMSu+x9Mkq8sfI2pYMAi6S5gx9BGdDoA9wa58HnGU4t+evkA3udR2DZZW1mbzCJ /GyuRRYzDCqWg== 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)) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 3546117E0FAC; Fri, 12 Jun 2026 20:00:53 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 83C69480038; Fri, 12 Jun 2026 20:00:52 +0200 (CEST) From: Sebastian Reichel Date: Fri, 12 Jun 2026 20:00:54 +0200 Subject: [PATCH v3 08/10] drm/rockchip: dw_dp: Add runtime PM support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260612-synopsys-dw-dp-improvements-v3-8-dc61e6352508@collabora.com> References: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@collabora.com> In-Reply-To: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@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=3045; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=uvgE/+PtR/8Y+EFTZ0voEnP7Ycu/PGAP66890VAIh0c=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGosSVSUi9PbPgMfTtpPeK51/WGuLXMiDSZ/g Si1Dt3zkeU36IkCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqLElUAAoJENju1/PI O/qaHukP/RmorsWS43Bw8xhZca2X0RGudrHH17R4H49SwpzG0bkwC87v3k4xd/FeDXIIxkB9Ujw QDNzp/fDR9aRTBZ4RGKI1UL1FN4YYAMHZq50a1VGNwkNG+GmJzhxfohxl63QkIeDAlyWqyl6x42 FEQ6kFYpKyz0j+RrekI3u6UGiohl/KwXWysrpggorn1EpxyV1x64IRSZPgtaxE5vaG88gOad7uA ogSmxSXlCuMsZgNxlBUq3pCVaw52ihOUPaPdCvmkhCTdGoj2bQz/3Z/PcDpG6NEV/GDKpY0nRs1 lDCl0TdELA9KuXxrXwfsCPM0I2e7Kkxx9Tz4aKHp+g1ikve5LrKFYubTYY6oZG5J2RJxGkuvRI8 uwVuwHlpF2+z2flMoV8fxr655Yw4EG/mEHdhgPvLHV29rbYh/MCSYymkpz58xlIv3UYbJ+WHPjb venw2BEf7ev4SGhJ8sWiYNLS9Zj35I9vW8FxFzgRhyn/iYNPj79u/TZ+qEN1ifvBxfRKiukgl2N vTd3BqzjRxU1lxhDqHtXCl8fnPNjbpcHirA/yKkEIcD90DUigHR9iW3hbVH+oh2wNmCs8297iku oovpjVP8/yxOfecwwZyavHpZ1eev+/cBn87wSJjOSAx04HOTnCiPoRUDUdYvx2p/p0ELen0d3HP gn/O+2vBb49k/XQMaFn80hA== 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 | 40 +++++++++++++++++++++++++++= ++++ 1 file changed, 40 insertions(+) diff --git a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c b/drivers/gpu/drm/ro= ckchip/dw_dp-rockchip.c index 9c53f1d2c29a..1f53228e56d9 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 @@ -58,6 +59,8 @@ static void dw_dp_rockchip_hpd_sw_sel(void *data, bool fo= rce_hpd_from_sw) =20 dp->hpd_sel =3D force_hpd_from_sw; =20 + ACQUIRE(pm_runtime_active_auto, pm)(dp->dev); + regmap_write(dp->vo_grf, hpd_reg, FIELD_PREP_WM16(ROCKCHIP_VO_GRF_DP_SINK_HPD_SEL, dp->hpd_sel)); } @@ -71,6 +74,8 @@ static void dw_dp_rockchip_hpd_sw_cfg(void *data, bool hp= d) =20 dp->hpd_cfg =3D hpd; =20 + ACQUIRE(pm_runtime_active_auto, pm)(dp->dev); + regmap_write(dp->vo_grf, hpd_reg, FIELD_PREP_WM16(ROCKCHIP_VO_GRF_DP_SINK_HPD_CFG, dp->hpd_cfg)); } @@ -213,6 +218,12 @@ static int dw_dp_rockchip_bind(struct device *dev, str= uct device *master, void * 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 dev_err_probe(dev, ret, "failed to enable runtime PM\n"); + connector =3D drm_bridge_connector_init(drm_dev, encoder); if (IS_ERR(connector)) { dw_dp_unbind(dp->base); @@ -246,6 +257,34 @@ static void dw_dp_remove(struct platform_device *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}, @@ -280,5 +319,6 @@ struct platform_driver dw_dp_driver =3D { .driver =3D { .name =3D "dw-dp", .of_match_table =3D dw_dp_of_match, + .pm =3D pm_ptr(&dw_dp_pm_ops), }, }; --=20 2.53.0 From nobody Sat Jun 13 04:51:16 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 A8588389473; Fri, 12 Jun 2026 18:00:57 +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=1781287259; cv=none; b=UNT0RkGlq+ezR6ybqN73lMrYHIO6cOJWvQotpzSwVIaH5X5occIQYuqpKuUcjaE1p1zOaF0FiK9gwKeusRCS93KyL3FcdafMvrusyPTe9WErYOqDx6nU0MJIAjYyFiul6gUdXFbGJkGCczmQDoYXPwIKVSdt+80Ik4CpIR/E2eY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781287259; c=relaxed/simple; bh=BXeARZ0ujZDNhdquS/qJc3J32JsHagxLqC8adFmTGE8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Yz7hNthyCujIZbvW2PL+Wnrk0Qdz9EaxCinGWqWUMUMcrncXS7mG5MQg8Zg6qqqmH0b2fQtoUy+VKKhG6UJTSHqaZOq/00HBbxwmsPKdfrNh0+xNnhZGdVWE9ufOOqETOzdD+RchwTL2dhXZj2jCfBSuCLis5Ob7JJFwOpLSUxQ= 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=HgIBIhPv; 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="HgIBIhPv" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1781287253; bh=BXeARZ0ujZDNhdquS/qJc3J32JsHagxLqC8adFmTGE8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=HgIBIhPvknd1Q2ddj2XeDUcvA1Oic44+kMbKstN6zOtQY1pPo94fisndk5qVE37iP 0JyrxmG1pRZLCLSdLUXTMeE6/jrKbL7mTy+Cq0CO0J6mZqq9ZSguDtc3MqZWFalvQh fRIO5LGjLj7PGZTpWRP+YgUowsh3puQ2VUMWZrv8zhkvfwtWlPLevXzoUF6aB/YZZh 9+/k1AjfbagPokcwk2i1KFQNqqHT7HonyMZFnhMwaobrd55S8FtxqQ+EChVXcJpSlI Cu56CRvFThelAw/15BsOVOxsEei2k/EtA2eBrEswq3bVNephE/H9r/AUgsXR+s5juX AgZHyQWnEBh9w== 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)) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 3F05817E0FD0; Fri, 12 Jun 2026 20:00:53 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 8530548003A; Fri, 12 Jun 2026 20:00:52 +0200 (CEST) From: Sebastian Reichel Date: Fri, 12 Jun 2026 20:00:55 +0200 Subject: [PATCH RFC v3 09/10] dt-bindings: display: rockchip: dw-dp: fix sound DAI cells Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260612-synopsys-dw-dp-improvements-v3-9-dc61e6352508@collabora.com> References: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@collabora.com> In-Reply-To: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@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=2725; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=BXeARZ0ujZDNhdquS/qJc3J32JsHagxLqC8adFmTGE8=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGosSVQEh5sbWtkeYdrxD50JXY18L37a17k8i beMkIXjL4spU4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqLElUAAoJENju1/PI O/qaE1oP/2MuS9HVQpUsHqvwtYb1JPn63Ve2KXPsy1UNEzcvcT6mX0O6uR5IJq2J1jFcHws8pMe gZxd8DxzxeDnwh0PdmtvM4Lh+E97IOikzqdMAC5CHvoHrtWqKVIqHnBLO62DZSveFvPCmPm3Sei bcwXx8Py7KHzMLVd8ABHDEudhXh2b5v93bskRJ0HEz5q4au5reAnJe8VXIs7Ff/oGYgtlN/NzuT n34m9PeCzwAeZ53MmKjlZcd65E9CzeMEkRLy9jWEcmgV8xwm5MvRoo0oHR9ZT/jkEXl3wz4VNlC Xo7cWuUaELX+NQ3az6V3kJRMJ8xCjm/w74v1mZjg+uTvhrEstyIgOFHlDdi9b33Kw6g70Cdww10 pCNQYtKrl3qMtRILX/L1r5PtXedhRs2UWh7uvtqbJgOA88HoYFfwaF45RkhPNN6VDVUJCueFYEB xEk179zQoWB57GrDPTOoVBppmhhTKiEBeT6vuiq4+z8yyziQQCZcZsGOQnJ3jPGP4emExR7aASo eBGeNJAxh8XoyTXc11zeHGvXAReYFFCXmdxus7811yGXUT/nUVY77XHvX09ur8W+oqDoN7THLqv /bW15G0oM7ULw5nmasvLj9CJI2Y0pJvJUkBNpRNujICox787KpfXjJXR6eZ7SJz3aKKczWyGstY mIy34KEA7E4F0f516JCE1IA== 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 it is needed to have an argument to select the right interface. In case of RK3576 this is not enough though. The RK3576 has the same IP as RK3588, but configured with Multi Stream Transport (MST) enabled for up to 3 displays and thus has a total of 6 DAI interfaces (I2S and S/PDIF for each possible stream. Meanwhile the RK3588 does not support MST and thus has only 2 DAI interfaces. The binding update right now only supports the simple single stream transport (SST) setup. To avoid further DT ABI breakage (or complicated bindings supporting different number of arguments), it's probably a good idea to take MST into account now even though the upstream Linux driver does not yet support it. I see two options: 1. Adding yet another cell, so that we have the following: <&dp_ctrl [display_stream] [i2s_or_spdif]>; potentially append extra input ports for MST video data to existing ports node (e.g. port@2). I would only handle the sound DAI part in my patch and basically use '0' for the display stream and just leave the option of using '1' or '2' once MST support is added. 2. The vendor kernel creates a sub-node for each supported display stream and puts the ports mapping as well as the DAI reference into that. This bundles all information for one display stream together, which creates a clean look but the subnode does not really describe any real thing in the hardware. As upstream MST support seems to be quite limited, I wish for some feedback about the preferred way to handle this. Signed-off-by: Sebastian Reichel --- .../devicetree/bindings/display/rockchip/rockchip,dw-dp.yaml | 5 += ++-- 1 file changed, 3 insertions(+), 2 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..1303d0e2145a 100644 --- a/Documentation/devicetree/bindings/display/rockchip/rockchip,dw-dp.yaml +++ b/Documentation/devicetree/bindings/display/rockchip/rockchip,dw-dp.yaml @@ -83,7 +83,8 @@ properties: maxItems: 1 =20 "#sound-dai-cells": - const: 0 + const: 1 + description: 0 for I2S, 1 for SPDIF =20 required: - compatible @@ -144,7 +145,7 @@ examples: resets =3D <&cru SRST_DP0>; phys =3D <&usbdp_phy0 PHY_TYPE_DP>; power-domains =3D <&power RK3588_PD_VO0>; - #sound-dai-cells =3D <0>; + #sound-dai-cells =3D <1>; =20 ports { #address-cells =3D <1>; --=20 2.53.0 From nobody Sat Jun 13 04:51:16 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 A6B4E389115; Fri, 12 Jun 2026 18:00:57 +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=1781287260; cv=none; b=Lq2soR/s+B42/Wrf5SShgkYIijKFPNW21hrP6pFGDyrwSKMSCrZDlhIH8LrUWWG31fMCPNxAPtObPvsg/uFIoh+5rfVYxwwnO0KM20UnE74SPKxZNvs/fVJxa1HcesP+kOLbxPGAOZb6gSUCOmSFW1rWI6kPV0cclXOdzcrQ4Co= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781287260; c=relaxed/simple; bh=i/sGFIb1AvWD7Tsqu7gFVrBgeVTBDXia0pK9L5Hf8Bw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FN0ScD/llDh2oBN7mm6Bov56aFnz3jcnPDDSHL3ntHlBVI+3Jw/pOmwEurv5cux6BgNU3u60Om9asWMAHu5h8ZBi+MvqWwmcSWLWDAmhvRFZqfD1TLgrL747Aa0VGlPXvCXt7C8tmTL14e4Xsjyntt2lu3Y+hwzJrcjXYRnJ+bM= 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=EA4Z/GSP; 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="EA4Z/GSP" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1781287253; bh=i/sGFIb1AvWD7Tsqu7gFVrBgeVTBDXia0pK9L5Hf8Bw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=EA4Z/GSPPK62C2mDzbWtkIUMjo2/D2LejObX4DfzHdhj16XbTZPvshIKGcnCTJ6lh BdByyyVzQNFnDr1h2pNWgU3GhDoZlW3tKJs+f90ZRrG16xJy2acLa1mTN8ZfRS2bHB DTO9dcP/xWqtars20vDt75VA7cJYSvYD2zMFY2MtfHwTyZvoJ6tdEH8+LGfhUYIviv Y1GZn6XTtVadYM8D7ycWpO70CU0TN3IyfLIPLDGgAmlRgv+Amzxwgv2jqE3Z8hZeS9 5C1JnaGsUW86Jf6v/I9ALY1azmgBS9ZT1/+ybTIhE6y+glEF9Ix2+Y3vMxfDhA+TeS BsNqrsJFYJ3Ww== 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)) (No client certificate requested) (Authenticated sender: sre) by bali.collaboradmins.com (Postfix) with ESMTPSA id 4380417E1031; Fri, 12 Jun 2026 20:00:53 +0200 (CEST) Received: by jupiter.universe (Postfix, from userid 1000) id 86EA648003D; Fri, 12 Jun 2026 20:00:52 +0200 (CEST) From: Sebastian Reichel Date: Fri, 12 Jun 2026 20:00:56 +0200 Subject: [PATCH v3 10/10] drm/bridge: synopsys: dw-dp: Add audio support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260612-synopsys-dw-dp-improvements-v3-10-dc61e6352508@collabora.com> References: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@collabora.com> In-Reply-To: <20260612-synopsys-dw-dp-improvements-v3-0-dc61e6352508@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=9488; i=sebastian.reichel@collabora.com; h=from:subject:message-id; bh=i/sGFIb1AvWD7Tsqu7gFVrBgeVTBDXia0pK9L5Hf8Bw=; b=owJ4nAFtApL9kA0DAAoB2O7X88g7+poByyZiAGosSVSM3yaK9xF2u1eGvsgu6AuPT882WMYow MikBJfFrClvE4kCMwQAAQoAHRYhBO9mDQdGP4tyanlUE9ju1/PIO/qaBQJqLElUAAoJENju1/PI O/qacO0P/2H+q1398FKP5zr1F51ZdxlkDeHMt3KtS+KXDsCboKA5xYFWjK5IBS7OjMi8+jcq0Ll rA8fHq8emtPukcoVreFqHFJdfXe3TWyXOdzZPICuQBHsL8PZX2vPBcQW1aEyw5f205zEijnR3Zj aDVtCXeXFMZBQIo3Q7sKIQExhEl1/XuHahsdS4lstIk3KWuVYXRFjJRCJULGCXa5QTKjdBTNNZi rfKyP9gEqOWN/mQOFaipo69mufdFObeyCAMIQOPKDpn/4kXf0ypXaoOqo4QvX+u+y0MgGFFGkdg szbSdFIkCZxjkC3NXMG6XLKDIRMlx1th1CxrkKM8YFbZGyZKpiEMvSn7FNZKqb4jFq79xruixZC pMO6x3ADPP3rgGEpOlsnqJuHZ/2ymq/UFI4cftU6EuE1bVtwyS8clDp4Oih5K/yFOakS1XXNCgf n4e7/Vh2Vq5KyO/5pFd/O7uV8f3QMf3QBx0iwlaLWgGCiylFQ1LK1imhnrdvP629grcjr5LxrKL MACSZEg1+TUToadLCd/R2B7wBnLQHVuD8YQy2gskkIum/u/9lfcsSENzr/N8YNY0pAkC413SjgW pdHAHgOOFI1DFoWELo8OOll7fJCbO6eLoQGHETpmn8FK1PFrg5C8SVMaVyTcfA4/3YcmAInybaT KG8CCebrSLUeIw5r6btQmpA== 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 | 221 ++++++++++++++++++++++++++++= +++- 1 file changed, 220 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 7f4f36c61484..f1946f2c945d 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -23,17 +23,21 @@ #include #include #include +#include #include #include #include #include #include =20 +#include + #define DW_DP_VERSION_NUMBER 0x0000 #define DW_DP_VERSION_TYPE 0x0004 #define DW_DP_ID 0x0008 =20 #define DW_DP_CONFIG_REG1 0x0100 +#define AUDIO_SELECT GENMASK(2, 1) #define DW_DP_CONFIG_REG2 0x0104 #define DW_DP_CONFIG_REG3 0x0108 =20 @@ -110,6 +114,10 @@ #define HBR_MODE_ENABLE BIT(10) #define AUDIO_DATA_WIDTH GENMASK(9, 5) #define AUDIO_DATA_IN_EN GENMASK(4, 1) +#define AUDIO_DATA_IN_EN_CHANNEL12 BIT(0) +#define AUDIO_DATA_IN_EN_CHANNEL34 BIT(1) +#define AUDIO_DATA_IN_EN_CHANNEL56 BIT(2) +#define AUDIO_DATA_IN_EN_CHANNEL78 BIT(3) #define AUDIO_INF_SELECT BIT(0) =20 #define DW_DP_SDP_VERTICAL_CTRL 0x0500 @@ -253,6 +261,8 @@ =20 #define SDP_REG_BANK_SIZE 16 =20 +#define DW_DP_SDP_VERSION 0x12 + struct dw_dp_link_caps { bool enhanced_framing; bool tps3_supported; @@ -305,6 +315,19 @@ struct dw_dp_hotplug { bool long_hpd; }; =20 +enum dw_dp_audio_interface_support { + DW_DP_AUDIO_I2S_ONLY =3D 0, + DW_DP_AUDIO_SPDIF_ONLY =3D 1, + DW_DP_AUDIO_I2S_AND_SPDIF =3D 2, + DW_DP_AUDIO_NONE =3D 3, +}; + +enum dw_dp_audio_interface { + DW_DP_AUDIO_I2S =3D 0, + DW_DP_AUDIO_SPDIF =3D 1, + DW_DP_AUDIO_UNUSED, +}; + struct dw_dp { struct drm_bridge bridge; struct device *dev; @@ -320,6 +343,8 @@ struct dw_dp { int irq; struct work_struct hpd_work; struct dw_dp_hotplug hotplug; + enum dw_dp_audio_interface audio_interface; + int audio_channels; /* Serialize hpd status access */ struct mutex irq_lock; =20 @@ -1837,6 +1862,186 @@ 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"); + pm_runtime_get_sync(dp->dev); + + return 0; +} + +static void dw_dp_audio_unprepare(struct drm_bridge *bridge, + struct drm_connector *connector) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + + /* Disable all audio streams */ + regmap_update_bits(dp->regmap, DW_DP_AUD_CONFIG1, AUDIO_DATA_IN_EN, + FIELD_PREP(AUDIO_DATA_IN_EN, 0)); + + if (dp->audio_interface =3D=3D DW_DP_AUDIO_SPDIF) + clk_disable_unprepare(dp->spdif_clk); + else if (dp->audio_interface =3D=3D DW_DP_AUDIO_I2S) + clk_disable_unprepare(dp->i2s_clk); + + dp->audio_interface =3D DW_DP_AUDIO_UNUSED; +} + +static int dw_dp_audio_prepare(struct drm_bridge *bridge, + struct drm_connector *connector, + struct hdmi_codec_daifmt *daifmt, + struct hdmi_codec_params *params) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + u8 audio_data_in_en, supported_audio_interfaces; + u32 cfg1; + int ret; + + /* + * prepare might be called multiple times, so release the clocks + * from previous calls to keep the calls in balance. + */ + if (dp->audio_interface !=3D DW_DP_AUDIO_UNUSED) + dw_dp_audio_unprepare(bridge, connector); + + dp->audio_channels =3D params->cea.channels; + switch (params->cea.channels) { + case 1: + case 2: + audio_data_in_en =3D AUDIO_DATA_IN_EN_CHANNEL12; + break; + case 8: + audio_data_in_en =3D AUDIO_DATA_IN_EN_CHANNEL12 | + AUDIO_DATA_IN_EN_CHANNEL34 | + AUDIO_DATA_IN_EN_CHANNEL56 | + AUDIO_DATA_IN_EN_CHANNEL78; + break; + default: + dev_err(dp->dev, "invalid audio channels %d\n", dp->audio_channels); + return -EINVAL; + } + + switch (daifmt->fmt) { + case HDMI_SPDIF: + dp->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. + */ + dp->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 dp->audio_interface) { + dev_err(dp->dev, "unsupported DAI %d\n", daifmt->fmt); + return -EINVAL; + } + + clk_prepare_enable(dp->spdif_clk); + clk_prepare_enable(dp->i2s_clk); + + 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, dp->audio_interface) | + FIELD_PREP(HBR_MODE_ENABLE, 0)); + + /* Wait for inf switch */ + usleep_range(20, 40); + + if (dp->audio_interface =3D=3D DW_DP_AUDIO_I2S) + clk_disable_unprepare(dp->spdif_clk); + else if (dp->audio_interface =3D=3D DW_DP_AUDIO_SPDIF) + clk_disable_unprepare(dp->i2s_clk); + + /* + * Send audio stream during vertical and horizontal blanking periods. + * Send out audio timestamp SDP once per video frame during the vertical + * blanking period + */ + regmap_update_bits(dp->regmap, DW_DP_SDP_VERTICAL_CTRL, + EN_AUDIO_STREAM_SDP | EN_AUDIO_TIMESTAMP_SDP, + FIELD_PREP(EN_AUDIO_STREAM_SDP, 1) | + FIELD_PREP(EN_AUDIO_TIMESTAMP_SDP, 1)); + regmap_update_bits(dp->regmap, DW_DP_SDP_HORIZONTAL_CTRL, + EN_AUDIO_STREAM_SDP, + FIELD_PREP(EN_AUDIO_STREAM_SDP, 1)); + + ret =3D dw_dp_audio_infoframe_send(dp); + if (ret < 0) + dev_err(dp->dev, "failed to send audio infoframe\n"); + + dev_dbg(dp->dev, "audio prepare with %d channels using DAI=3D%d\n", + dp->audio_channels, dp->audio_interface); + + return 0; +} + +static void dw_dp_audio_shutdown(struct drm_bridge *bridge, + struct drm_connector *connector) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + + dev_dbg(dp->dev, "audio shutdown\n"); + + dw_dp_audio_unprepare(bridge, connector); + pm_runtime_put_autosuspend(dp->dev); +} + +static int dw_dp_audio_mute_stream(struct drm_bridge *bridge, + struct drm_connector *connector, + bool enable, int direction) +{ + struct dw_dp *dp =3D bridge_to_dp(bridge); + + dev_dbg(dp->dev, "audio %smute\n", enable ? "" : "un"); + + regmap_update_bits(dp->regmap, DW_DP_AUD_CONFIG1, AUDIO_MUTE, + FIELD_PREP(AUDIO_MUTE, enable)); + + return 0; +} + static const struct drm_bridge_funcs dw_dp_bridge_funcs =3D { .atomic_duplicate_state =3D dw_dp_bridge_atomic_duplicate_state, .atomic_destroy_state =3D drm_atomic_helper_bridge_destroy_state, @@ -1850,6 +2055,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) @@ -2076,10 +2286,19 @@ struct dw_dp *dw_dp_bind(struct device *dev, struct= drm_encoder *encoder, } =20 bridge->of_node =3D dev->of_node; - bridge->ops =3D DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP= _HPD; + bridge->ops =3D DRM_BRIDGE_OP_DP_AUDIO | + DRM_BRIDGE_OP_DETECT | + DRM_BRIDGE_OP_EDID | + DRM_BRIDGE_OP_HPD; bridge->type =3D DRM_MODE_CONNECTOR_DisplayPort; bridge->ycbcr_420_allowed =3D true; =20 + dp->audio_interface =3D DW_DP_AUDIO_UNUSED; + bridge->hdmi_audio_dev =3D dev; + bridge->hdmi_audio_max_i2s_playback_channels =3D 8; + bridge->hdmi_audio_dai_port =3D 1; + bridge->hdmi_audio_spdif_playback =3D true; + ret =3D devm_drm_bridge_add(dev, bridge); if (ret) return ERR_PTR(ret); --=20 2.53.0