From nobody Tue Dec 16 10:30:26 2025 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 386AA1EF368 for ; Fri, 14 Mar 2025 09:36:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741945023; cv=none; b=aaved64ZpqH8nNRfC3Hu1ghqUi2D/c3Ld3XhUVrd3r8Lky9UHPI0kNrN10iEGoIzEIed5NKNCx7BoIBKcWA6/ltY5WzxmRoTyZSAmqIsNaxgveRpO0QztSJi/pricblL8CPt6WVs7SGdEc7f7WHQiXJMsKJZWY4jFVyupz7X7XA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741945023; c=relaxed/simple; bh=ec6nIsXxQrNgBPc/99nU3pCpdBGB+1zLuStr8IfxXPU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=V8mId9MrWYV/harteJrrjdjln/Y3DvOpcHG2R27Ifx/Q0yD1urDiwy971wQ1K4p2mFcW5ztTF7wXDaUYoKrbhoYcK1nuh/Beo8GVPbBmUDEl3vpMiOZpQSIpQu0H8octK+LuLue23x67PScBS1JDf/9GXbkiky5XviRvw6lkBR4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=aIpaRfn3; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="aIpaRfn3" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 52E80Dp6022209 for ; Fri, 14 Mar 2025 09:36:59 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= E3BE6ik3JEHMZ1NgKof9i60DVCCDulBUMrxm358Ld44=; b=aIpaRfn3YqtSlHpj BEiCfp54SaXdYgBa4UqQ/GFhhMYhQrfOHBIc4Xq0f+q+AOaXrnCjTrI31rSDatxa hxlFjkxGFtfXQGbkJICISYiNsbSPQG5MHz1caALwHe9LRNQ4eg7NEnguVxtN+Wdu KOnQq/FgAid9krKXv0K/258cwYs7vyYx3b5F1IdeOXu32JXiFcpyaOcWQuvu/Y3E LbFJwQsP3gWepxZ2p5iU/cmjnRSJZyiY/swcdEWP35VnIMEje7Hj6yo4cKZSGcxT jn/u9uPRDPCI1+AyYtI6bsmBl1we5TvjwsIQQU36Ec9LFV8UI0DVTfVXUzjplin0 63AA1A== Received: from mail-qv1-f72.google.com (mail-qv1-f72.google.com [209.85.219.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 45bu07ks4v-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Fri, 14 Mar 2025 09:36:58 +0000 (GMT) Received: by mail-qv1-f72.google.com with SMTP id 6a1803df08f44-6e8ed78717eso35705046d6.2 for ; Fri, 14 Mar 2025 02:36:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741945018; x=1742549818; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=E3BE6ik3JEHMZ1NgKof9i60DVCCDulBUMrxm358Ld44=; b=FRhmFRUz4aEZnGbj8eO8W328TEt2VMVSr/s94sTpRAEp3B87dLJ9ff0diLpb1xLlib ds56cjdF5k4Ifg7eg4Zrmr5NF4f80It1v43v0QjaJd/8AXSFFD9jtZ4JzES2aKlcWpey O9jQyiXxun+o8+npCnHA2dzZPYlRliRfO1iAGsF7KikZimfuXOA8eWXrGxVFR4LsF+WC OfzM72AGww5VhZ/RgGR2wHK+5fRKjZPUxeqiWGIi8oLauCSXcQ2FdWj/LNigkdggN8F+ W53w4gwkqZH5X/eQ6hpry51p3INKY8cQfM+X3eqBtr8Ioesar6W0AoZyhqbAqim8mhCI zIIA== X-Forwarded-Encrypted: i=1; AJvYcCX6d2fKRFS7CHH7L0iKAJgB6VfmyfcHLpKzPcnlbnYGASbsBR/urvKR/pCajvvOZ0wfQIXxV6mXtpjst0w=@vger.kernel.org X-Gm-Message-State: AOJu0YzQW0GzBKFowmdZ+WjmxQ2fLzEJW/6yAwV/Ep3oncjri5zd7yMM 4h9V3Svt519nyKxYxWUGbnaT3wo/XrKfZtGb4lEBadxm1Ag8O6nvZSw5mjuMc7pKknouxI0jQ// UC1JYXEDQT7TIy/aLpJ1xvvT1i/0rqCdBIu2yfBuQJu9HVVZY9T+TzNxho8Ae8JI= X-Gm-Gg: ASbGnctRKV7ZxG2/9ee0xn222jaPx91s7sQTust3ZXyYke1i51zOiNFuSBekEQixBbG 0LpomOiK9oIrOkM3JQVOgQzkNdERyWe8XBVT4uRKZPxICnqXDz/h/D4z4+k3qiuf8uoPNUg66dj /tNelsBMyLaK8hGFrUlKEPBob4QGskvOofIvc7aLycFhzmZVkDgo/DReGrJ8bXXI1JZ5BwZ1eWH tGGtkfomZF8mVr41xewQrXLYcLKGbrNYrnhYZFTDt+UuIBiIRcEsRu7Dvs+FmP3qQ8Cd/5hQMp7 C5OGtgt/JBuBDc+u0HeYfFVrRRRchUbBL1PXuVI5SJL0zHmZa0mC/HIlcqnoRWhSMmEpmbZrcWr jlljLGU0ffH1qPI9vL/OtDy5pZ9I0 X-Received: by 2002:a05:6214:da3:b0:6e8:9797:f94e with SMTP id 6a1803df08f44-6eaeaaf7178mr19513006d6.35.1741945017925; Fri, 14 Mar 2025 02:36:57 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGSNEaS2HhQ5e8HPlGtZT6eyjJim/p5gmh4hT0gHHUjVecBEl5EiQdprLPXcE1EJsy+ySRxgw== X-Received: by 2002:a05:6214:da3:b0:6e8:9797:f94e with SMTP id 6a1803df08f44-6eaeaaf7178mr19512646d6.35.1741945017527; Fri, 14 Mar 2025 02:36:57 -0700 (PDT) Received: from umbar.lan (2001-14ba-a0c3-3a00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a0c3:3a00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-549ba7a8368sm478585e87.32.2025.03.14.02.36.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 02:36:55 -0700 (PDT) From: Dmitry Baryshkov Date: Fri, 14 Mar 2025 11:36:48 +0200 Subject: [PATCH v6 1/4] drm/bridge: split HDMI Audio from DRM_BRIDGE_OP_HDMI 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: <20250314-dp-hdmi-audio-v6-1-dbd228fa73d7@oss.qualcomm.com> References: <20250314-dp-hdmi-audio-v6-0-dbd228fa73d7@oss.qualcomm.com> In-Reply-To: <20250314-dp-hdmi-audio-v6-0-dbd228fa73d7@oss.qualcomm.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten , Hermes Wu , Dmitry Baryshkov Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Dmitry Baryshkov X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=10520; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=ftPgm7yawXwdGOb7vf34ICo5af7jf0Sj9BanH4F+8/0=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBn0/ixq4SknkMu/WtIOJp3nymsxU+XB4omcfz+1 1NMSRw2xTCJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ9P4sQAKCRCLPIo+Aiko 1RmEB/43wfmVTdQOuXcMNe1f1o5xskST9a9GNFKibkBx2k1St0z3qVQcJ56f3Pz+vkEZq4L8e9d ZpadDpw7Kxt8R6+yqG7BIUp6bm/JyPswx+UtYEFaRwVHC3NrMdqdc7AF4ZHJS+DS0Amenb4nlCO x1/CqEUaHoesJ96N0EO9XahFxFVN0+AeS+wSlk0mxVjQh2EQ2JIggnoAdrmBExQxFYFcQ6OABoG klaaH2PilP0KdgtTPcHzHoakgjURM8I6ih/Pp8MCs5uJHZjn5Bsb3OdnMu9yO59P2DwmhlG57+D 4NLufjgpVAaJ/R48U09bGoSR5x2VmV3HN+/z5EAHXHE+8nH0 X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-GUID: blQR7mX0VDDvRUtFDafLNEaGKcm033vQ X-Authority-Analysis: v=2.4 cv=V+F90fni c=1 sm=1 tr=0 ts=67d3f8ba cx=c_pps a=7E5Bxpl4vBhpaufnMqZlrw==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=Vs1iUdzkB0EA:10 a=VwQbUJbxAAAA:8 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=h2q6pj4Fa84FeHWKbVkA:9 a=QEXdDO2ut3YA:10 a=pJ04lnu7RYOZP9TFuWaZ:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-ORIG-GUID: blQR7mX0VDDvRUtFDafLNEaGKcm033vQ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1093,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-03-14_04,2025-03-13_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 mlxlogscore=999 impostorscore=0 spamscore=0 priorityscore=1501 phishscore=0 mlxscore=0 lowpriorityscore=0 suspectscore=0 malwarescore=0 adultscore=0 bulkscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2502280000 definitions=main-2503140075 From: Dmitry Baryshkov As pointed out by Laurent, OP bits are supposed to describe operations. Split DRM_BRIDGE_OP_HDMI_AUDIO from DRM_BRIDGE_OP_HDMI instead of overloading DRM_BRIDGE_OP_HDMI. Signed-off-by: Dmitry Baryshkov Signed-off-by: Dmitry Baryshkov Reviewed-by: Maxime Ripard --- drivers/gpu/drm/bridge/lontium-lt9611.c | 2 +- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 1 + drivers/gpu/drm/display/drm_bridge_connector.c | 59 +++++++++++++++++-----= ---- drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 1 + include/drm/drm_bridge.h | 46 ++++++++++++++------ 5 files changed, 76 insertions(+), 33 deletions(-) diff --git a/drivers/gpu/drm/bridge/lontium-lt9611.c b/drivers/gpu/drm/brid= ge/lontium-lt9611.c index 026803034231f78c17f619dc04119bdd9b2b6679..3b93c17e25c18ae0d13e9bb7455= 3cf21dcc39f9d 100644 --- a/drivers/gpu/drm/bridge/lontium-lt9611.c +++ b/drivers/gpu/drm/bridge/lontium-lt9611.c @@ -1130,7 +1130,7 @@ static int lt9611_probe(struct i2c_client *client) lt9611->bridge.of_node =3D client->dev.of_node; lt9611->bridge.ops =3D DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP_HPD | DRM_BRIDGE_OP_MODES | - DRM_BRIDGE_OP_HDMI; + DRM_BRIDGE_OP_HDMI | DRM_BRIDGE_OP_HDMI_AUDIO; lt9611->bridge.type =3D DRM_MODE_CONNECTOR_HDMIA; lt9611->bridge.vendor =3D "Lontium"; lt9611->bridge.product =3D "LT9611"; diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/drivers/gpu/drm= /bridge/synopsys/dw-hdmi-qp.c index 6166f197e37b552cb8a52b7b0d23ffc632f54557..5e5f8c2f95be1f5c4633f1093b1= 7a00f9425bb37 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c @@ -1077,6 +1077,7 @@ struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_de= vice *pdev, hdmi->bridge.ops =3D DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP_HDMI | + DRM_BRIDGE_OP_HDMI_AUDIO | DRM_BRIDGE_OP_HPD; hdmi->bridge.of_node =3D pdev->dev.of_node; hdmi->bridge.type =3D DRM_MODE_CONNECTOR_HDMIA; diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index 30c736fc0067e31a97db242e5b16ea8a5b4cf359..030f98d454608a63154827c65d4= 822d378df3b4c 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -98,6 +98,13 @@ struct drm_bridge_connector { * HDMI connector infrastructure, if any (see &DRM_BRIDGE_OP_HDMI). */ struct drm_bridge *bridge_hdmi; + /** + * @bridge_hdmi_audio: + * + * The bridge in the chain that implements necessary support for the + * HDMI Audio infrastructure, if any (see &DRM_BRIDGE_OP_HDMI_AUDIO). + */ + struct drm_bridge *bridge_hdmi_audio; }; =20 #define to_drm_bridge_connector(x) \ @@ -433,7 +440,7 @@ static int drm_bridge_connector_audio_startup(struct dr= m_connector *connector) to_drm_bridge_connector(connector); struct drm_bridge *bridge; =20 - bridge =3D bridge_connector->bridge_hdmi; + bridge =3D bridge_connector->bridge_hdmi_audio; if (!bridge) return -EINVAL; =20 @@ -451,7 +458,7 @@ static int drm_bridge_connector_audio_prepare(struct dr= m_connector *connector, to_drm_bridge_connector(connector); struct drm_bridge *bridge; =20 - bridge =3D bridge_connector->bridge_hdmi; + bridge =3D bridge_connector->bridge_hdmi_audio; if (!bridge) return -EINVAL; =20 @@ -464,7 +471,7 @@ static void drm_bridge_connector_audio_shutdown(struct = drm_connector *connector) to_drm_bridge_connector(connector); struct drm_bridge *bridge; =20 - bridge =3D bridge_connector->bridge_hdmi; + bridge =3D bridge_connector->bridge_hdmi_audio; if (!bridge) return; =20 @@ -478,7 +485,7 @@ static int drm_bridge_connector_audio_mute_stream(struc= t drm_connector *connecto to_drm_bridge_connector(connector); struct drm_bridge *bridge; =20 - bridge =3D bridge_connector->bridge_hdmi; + bridge =3D bridge_connector->bridge_hdmi_audio; if (!bridge) return -EINVAL; =20 @@ -576,6 +583,21 @@ struct drm_connector *drm_bridge_connector_init(struct= drm_device *drm, max_bpc =3D bridge->max_bpc; } =20 + if (bridge->ops & DRM_BRIDGE_OP_HDMI_AUDIO) { + if (bridge_connector->bridge_hdmi_audio) + return ERR_PTR(-EBUSY); + + if (!bridge->hdmi_audio_max_i2s_playback_channels && + !bridge->hdmi_audio_spdif_playback) + return ERR_PTR(-EINVAL); + + if (!bridge->funcs->hdmi_audio_prepare || + !bridge->funcs->hdmi_audio_shutdown) + return ERR_PTR(-EINVAL); + + bridge_connector->bridge_hdmi_audio =3D bridge; + } + if (!drm_bridge_get_next_bridge(bridge)) connector_type =3D bridge->type; =20 @@ -611,22 +633,6 @@ struct drm_connector *drm_bridge_connector_init(struct= drm_device *drm, max_bpc); if (ret) return ERR_PTR(ret); - - if (bridge->hdmi_audio_max_i2s_playback_channels || - bridge->hdmi_audio_spdif_playback) { - if (!bridge->funcs->hdmi_audio_prepare || - !bridge->funcs->hdmi_audio_shutdown) - return ERR_PTR(-EINVAL); - - ret =3D drm_connector_hdmi_audio_init(connector, - bridge->hdmi_audio_dev, - &drm_bridge_connector_hdmi_audio_funcs, - bridge->hdmi_audio_max_i2s_playback_channels, - bridge->hdmi_audio_spdif_playback, - bridge->hdmi_audio_dai_port); - if (ret) - return ERR_PTR(ret); - } } else { ret =3D drmm_connector_init(drm, connector, &drm_bridge_connector_funcs, @@ -635,6 +641,19 @@ struct drm_connector *drm_bridge_connector_init(struct= drm_device *drm, return ERR_PTR(ret); } =20 + if (bridge_connector->bridge_hdmi_audio) { + bridge =3D bridge_connector->bridge_hdmi_audio; + + ret =3D drm_connector_hdmi_audio_init(connector, + bridge->hdmi_audio_dev, + &drm_bridge_connector_hdmi_audio_funcs, + bridge->hdmi_audio_max_i2s_playback_channels, + bridge->hdmi_audio_spdif_playback, + bridge->hdmi_audio_dai_port); + if (ret) + return ERR_PTR(ret); + } + drm_connector_helper_add(connector, &drm_bridge_connector_helper_funcs); =20 if (bridge_connector->bridge_hpd) diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/h= dmi/hdmi_bridge.c index 1456354c8af4bc7f655e8a47e958e9e0b99b7d29..ab6c8bc4a30b681f7de8ca7031f= 833795d1f7d94 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c @@ -515,6 +515,7 @@ int msm_hdmi_bridge_init(struct hdmi *hdmi) bridge->ops =3D DRM_BRIDGE_OP_HPD | DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_HDMI | + DRM_BRIDGE_OP_HDMI_AUDIO | DRM_BRIDGE_OP_EDID; bridge->hdmi_audio_max_i2s_playback_channels =3D 8; bridge->hdmi_audio_dev =3D &hdmi->pdev->dev; diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index d4c75d59fa12be1bd7375ce3ea56415235781b28..c6b66f733fffa77afc875e52f9d= 1500fcb66400f 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -681,8 +681,10 @@ struct drm_bridge_funcs { /** * @hdmi_audio_startup: * - * Called when ASoC starts an audio stream setup. The - * @hdmi_audio_startup() is optional. + * Called when ASoC starts an audio stream setup. + * + * This callback is optional, it can be implemented by bridges that + * set the @DRM_BRIDGE_OP_HDMI_AUDIO flag in their &drm_bridge->ops. * * Returns: * 0 on success, a negative error code otherwise @@ -693,8 +695,10 @@ struct drm_bridge_funcs { /** * @hdmi_audio_prepare: * Configures HDMI-encoder for audio stream. Can be called multiple - * times for each setup. Mandatory if HDMI audio is enabled in the - * bridge's configuration. + * times for each setup. + * + * This callback is optional but it must be implemented by bridges that + * set the @DRM_BRIDGE_OP_HDMI_AUDIO flag in their &drm_bridge->ops. * * Returns: * 0 on success, a negative error code otherwise @@ -707,8 +711,10 @@ struct drm_bridge_funcs { /** * @hdmi_audio_shutdown: * - * Shut down the audio stream. Mandatory if HDMI audio is enabled in - * the bridge's configuration. + * Shut down the audio stream. + * + * This callback is optional but it must be implemented by bridges that + * set the @DRM_BRIDGE_OP_HDMI_AUDIO flag in their &drm_bridge->ops. * * Returns: * 0 on success, a negative error code otherwise @@ -719,8 +725,10 @@ struct drm_bridge_funcs { /** * @hdmi_audio_mute_stream: * - * Mute/unmute HDMI audio stream. The @hdmi_audio_mute_stream callback - * is optional. + * Mute/unmute HDMI audio stream. + * + * This callback is optional, it can be implemented by bridges that + * set the @DRM_BRIDGE_OP_HDMI_AUDIO flag in their &drm_bridge->ops. * * Returns: * 0 on success, a negative error code otherwise @@ -814,6 +822,17 @@ enum drm_bridge_ops { * drivers. */ DRM_BRIDGE_OP_HDMI =3D BIT(4), + /** + * @DRM_BRIDGE_OP_HDMI_AUDIO: The bridge provides HDMI audio operations. + * Bridges that set this flag must implement the + * &drm_bridge_funcs->hdmi_audio_prepare and + * &drm_bridge_funcs->hdmi_audio_shutdown callbacks. + * + * Note: currently there can be at most one bridge in a chain that sets + * this bit. This is to simplify corresponding glue code in connector + * drivers. + */ + DRM_BRIDGE_OP_HDMI_AUDIO =3D BIT(5), }; =20 /** @@ -914,23 +933,26 @@ struct drm_bridge { unsigned int max_bpc; =20 /** - * @hdmi_audio_dev: device to be used as a parent for the HDMI Codec + * @hdmi_audio_dev: device to be used as a parent for the HDMI Codec if + * @DRM_BRIDGE_OP_HDMI_AUDIO is set. */ struct device *hdmi_audio_dev; =20 /** * @hdmi_audio_max_i2s_playback_channels: maximum number of playback - * I2S channels for the HDMI codec + * I2S channels for the bridge that sets @DRM_BRIDGE_OP_HDMI_AUDIO. */ int hdmi_audio_max_i2s_playback_channels; =20 /** - * @hdmi_audio_spdif_playback: set if HDMI codec has S/PDIF playback port + * @hdmi_audio_spdif_playback: set if this bridge has S/PDIF playback + * port for @DRM_BRIDGE_OP_HDMI_AUDIO */ unsigned int hdmi_audio_spdif_playback : 1; =20 /** - * @hdmi_audio_dai_port: sound DAI port, -1 if it is not enabled + * @hdmi_audio_dai_port: sound DAI port for @DRM_BRIDGE_OP_HDMI_AUDIO, + * -1 if it is not used. */ int hdmi_audio_dai_port; }; --=20 2.39.5 From nobody Tue Dec 16 10:30:26 2025 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 0A2911F12FF for ; Fri, 14 Mar 2025 09:37:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741945025; cv=none; b=IdrPeqgxAwyB9xzJBfHwcNbsmy3CfXy3HM1gRzbuDycuM0AuBFMvBxCfneEfltsL65h7iPfQsD0fjknZymnfe8HK9nmz8u2jzXPwL1kWiID1V6Ej9s8xnVpQ7uvStDIUy2ZfIZ1Vx3JBwmKQj7HQfMe60BMIRDVFHRTMIPRHht4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741945025; c=relaxed/simple; bh=sPGFPs8Z9BJzKH3T0QhgjGfhe3qB0nROPdLNLb450jk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AL7MCtPwAf7vVFcrpABrEG457wSLCA0I8q221d+tYcPqMkYV5OAl+FcXLnu8qDjj4Xd8smji3uoFXcHNDm77TZelEiKDPpC5Q58a2dup96h6j2sfwFGA/p84Xl/mxJ7DynRyB+6KUiVN6NyTkqvvwiBFvOuD9nQeVG6mz/iOYoU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=l6wt+O/6; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="l6wt+O/6" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 52DKDAEq027573 for ; Fri, 14 Mar 2025 09:37:03 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= MfnAPAp+R1qao5Wl5xlx5FtRla2ujtMfiADZ2nfdBAQ=; b=l6wt+O/6JjKNXJv6 qTfaNcP0eRbf10CjgKQAzzap1lDQ5nUqQBwNRIqKm0kVu/muT9H2+VhjcfXdCR3u Jh/IZtx91b5WbKwYAxvY9y7ctYXjsloC/wnqUd0+KtFyyI7uUp6YBKIhNE0BBIw3 JytDXWbOshqZ+n5bxAzMJUo7Xh2G5x7cXwIJr58bv8lUPQXkRffKCoCUzuHjZMWQ p/EOtWmL3nN2XkQLKNWdZHofZlUz9Ly0XNh3yhyv/o/D77/jDyObxeOGV4ledJ9r uN1JNwdqTcTtrLoMg7bFYK4iWCBL6FzY/eJcZffc5UjQjEEcd7pDvA0WPEtsmVXi iGAaJg== Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 45c6731py1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Fri, 14 Mar 2025 09:37:03 +0000 (GMT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-6e8f9450b19so42078706d6.1 for ; Fri, 14 Mar 2025 02:37:02 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741945022; x=1742549822; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MfnAPAp+R1qao5Wl5xlx5FtRla2ujtMfiADZ2nfdBAQ=; b=KBod7F15Waw+s/V8MSoYTmPOarnvM73v2b5z9pSf8wuZfhl/nhwrNfCpBr+bQ+twi3 xr5cU34RXcvdq/Se65/tuXOrlIoloziFwv5W026CfPG5UHoKkvwbflCrmYmawHfpIrds tNw+zU1EKEAIsVjN0T03hdd9KnhF4OAuMwACegTojX0kRyGfn2b/Y+AjqIRDNXwNrCSt bQeaX4HfEO0aNKI58UBbCHQASmSON8d15hBPM4PQkWYUNPMJOHXAjCx5g50baEZjVygg cCw0rzBWX2HRqPCsGq42tk0lKC3q0e9r9f/lu8CIMrdIqiUW5i94cKfcRSr3XsLFVcsE WcjQ== X-Forwarded-Encrypted: i=1; AJvYcCUNZ9azKmtDuuBJ80nrz9FN1yQmRvtB1jVuNb24CsQ5ZF3yNoBReglIo2NBHqajBlFGiACyQuW1XSKvrhY=@vger.kernel.org X-Gm-Message-State: AOJu0Yz66bXns0WlntSqduFle8erVF+lpn+nlm1R4qnEQdJUh2ifHH4E 0ZoRDzv3a0qC7+3cMK2DP4AhweHzJnNPpIwZsgZj8mJpuz+3/AwsEPJcsIdMllDMPMYeVJ8Rn/e GuiMLZG8V5emvEa2xUOLIirSfR4WwQpi9YtWOrrcgOCDUJlLO1w8gSG6HbGAG11I= X-Gm-Gg: ASbGncuzphJtdBUnlLGwUyKxc0Q9Vt6s6BeeQrtVPbIKQxPiCj4K2vhWQfSSfXCHvfP rny+rCIE9yaQ9GqcUnuKW3MQUPjyNVLxgx/M3z0TLshu3c3h8x7/PrJjo7L6AyPHUgLmBbdgwfY DzIWFpZRVkTl/IJCAZcqx3umWtnc9AmQisduX3zkwrZED2wJR+6BJkk3Kp3j0WqJJQ1/FooPNoh R3ugxbljbgSCy+ipntCtUe0J2fGfEFYVHOxoQVNtfV/QrzqJmOodlRZ+CixtmHlLG/MkKGikZhw ZMU2/CSFtzAvaJGFE+X32cMS+T7sdf/HteIey9SIMR/OiH1sgl/uG57Ny1NkAVMcwkQMYepr5+s 8+gpUpYDczlmvzcvd3yw7USNsG3cJ X-Received: by 2002:a05:6214:4606:b0:6e6:9b86:85d0 with SMTP id 6a1803df08f44-6eaddf047edmr86518846d6.8.1741945021762; Fri, 14 Mar 2025 02:37:01 -0700 (PDT) X-Google-Smtp-Source: AGHT+IF9R6JN0FXci6PacWxLW3IijDjh+4/mh8D4VFIDD4anPJXV7iyWYisApZ+3rhQVxcDkVem3Xg== X-Received: by 2002:a05:6214:4606:b0:6e6:9b86:85d0 with SMTP id 6a1803df08f44-6eaddf047edmr86518726d6.8.1741945021360; Fri, 14 Mar 2025 02:37:01 -0700 (PDT) Received: from umbar.lan (2001-14ba-a0c3-3a00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a0c3:3a00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-549ba7a8368sm478585e87.32.2025.03.14.02.36.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 02:36:59 -0700 (PDT) From: Dmitry Baryshkov Date: Fri, 14 Mar 2025 11:36:49 +0200 Subject: [PATCH v6 2/4] drm/bridge: add function interface for DisplayPort audio implementation 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: <20250314-dp-hdmi-audio-v6-2-dbd228fa73d7@oss.qualcomm.com> References: <20250314-dp-hdmi-audio-v6-0-dbd228fa73d7@oss.qualcomm.com> In-Reply-To: <20250314-dp-hdmi-audio-v6-0-dbd228fa73d7@oss.qualcomm.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten , Hermes Wu , Dmitry Baryshkov Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4882; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=sPGFPs8Z9BJzKH3T0QhgjGfhe3qB0nROPdLNLb450jk=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBn0/ixcF0KVuK5O3qMfR6zk8CJZvUE1rfBf7MgP pa+lkcaIDiJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ9P4sQAKCRCLPIo+Aiko 1VicCACT3fkLWM99BgjcdDqMoVZ2qL5iU7A4kGDlUS1EZSsdCxqcqblOHmzmqUNwzLd9RdUp/3h lo59QNm+mnNht9pNC4D67dPwm/pcRPGYQhoaiT4BuXb3LYm6GcJ+hF2Zu/IopztZUn0PIVq6bDL wwBV4yjwOsyWjXW2eeQYBuZSckBS9VxsI8WWvo4IVE987p+00C1Rzrb5mPG/WeuXtRd+axXAt7e 0itOGCNXFS96Q+xXEE+7KGP+zt1swUhg9f+oj8xDv+W9MoBrtjY1vXU4ecwMxWj+ln3mUrfwwNM 50DU1B51imC85WLt7ZfFfpHR/Wg01cv58amOmkvZGODGisPp X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Authority-Analysis: v=2.4 cv=a5Iw9VSF c=1 sm=1 tr=0 ts=67d3f8bf cx=c_pps a=UgVkIMxJMSkC9lv97toC5g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=Vs1iUdzkB0EA:10 a=EUspDBNiAAAA:8 a=4Yht-t6EeviOxvws5vEA:9 a=QEXdDO2ut3YA:10 a=1HOtulTD9v-eNWfpl4qZ:22 X-Proofpoint-GUID: 25a3OulJQxtgDCVr5G6609T_do5NrdeT X-Proofpoint-ORIG-GUID: 25a3OulJQxtgDCVr5G6609T_do5NrdeT X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1093,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-03-14_04,2025-03-13_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 mlxlogscore=999 suspectscore=0 bulkscore=0 lowpriorityscore=0 priorityscore=1501 impostorscore=0 clxscore=1015 spamscore=0 mlxscore=0 adultscore=0 malwarescore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2502280000 definitions=main-2503140075 It is common for the DisplayPort bridges to implement audio support. In preparation to providing a generic framework for DP audio, add corresponding interface to struct drm_bridge. As suggested by Maxime for now this is mostly c&p of the corresponding HDMI audio API. Signed-off-by: Dmitry Baryshkov Reviewed-by: Maxime Ripard --- include/drm/drm_bridge.h | 88 ++++++++++++++++++++++++++++++++++++++++++++= ---- 1 file changed, 82 insertions(+), 6 deletions(-) diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index c6b66f733fffa77afc875e52f9d1500fcb66400f..e8d0e56bcc91c1f4c689e4e6fbd= 2aceaf4fc5cf1 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -737,6 +737,65 @@ struct drm_bridge_funcs { struct drm_bridge *bridge, bool enable, int direction); =20 + /** + * @dp_audio_startup: + * + * Called when ASoC starts a DisplayPort audio stream setup. + * + * This callback is optional, it can be implemented by bridges that + * set the @DRM_BRIDGE_OP_DP_AUDIO flag in their &drm_bridge->ops. + * + * Returns: + * 0 on success, a negative error code otherwise + */ + int (*dp_audio_startup)(struct drm_connector *connector, + struct drm_bridge *bridge); + + /** + * @dp_audio_prepare: + * Configures DisplayPort audio stream. Can be called multiple + * times for each setup. + * + * This callback is optional but it must be implemented by bridges that + * set the @DRM_BRIDGE_OP_DP_AUDIO flag in their &drm_bridge->ops. + * + * Returns: + * 0 on success, a negative error code otherwise + */ + int (*dp_audio_prepare)(struct drm_connector *connector, + struct drm_bridge *bridge, + struct hdmi_codec_daifmt *fmt, + struct hdmi_codec_params *hparms); + + /** + * @dp_audio_shutdown: + * + * Shut down the DisplayPort audio stream. + * + * This callback is optional but it must be implemented by bridges that + * set the @DRM_BRIDGE_OP_DP_AUDIO flag in their &drm_bridge->ops. + * + * Returns: + * 0 on success, a negative error code otherwise + */ + void (*dp_audio_shutdown)(struct drm_connector *connector, + struct drm_bridge *bridge); + + /** + * @dp_audio_mute_stream: + * + * Mute/unmute DisplayPort audio stream. + * + * This callback is optional, it can be implemented by bridges that + * set the @DRM_BRIDGE_OP_DP_AUDIO flag in their &drm_bridge->ops. + * + * Returns: + * 0 on success, a negative error code otherwise + */ + int (*dp_audio_mute_stream)(struct drm_connector *connector, + struct drm_bridge *bridge, + bool enable, int direction); + /** * @debugfs_init: * @@ -830,9 +889,24 @@ enum drm_bridge_ops { * * Note: currently there can be at most one bridge in a chain that sets * this bit. This is to simplify corresponding glue code in connector - * drivers. + * drivers. Also it is not possible to have a bridge in the chain that + * sets @DRM_BRIDGE_OP_DP_AUDIO if there is a bridge that sets this + * flag. */ DRM_BRIDGE_OP_HDMI_AUDIO =3D BIT(5), + /** + * @DRM_BRIDGE_OP_DP_AUDIO: The bridge provides DisplayPort audio operati= ons. + * Bridges that set this flag must implement the + * &drm_bridge_funcs->dp_audio_prepare and + * &drm_bridge_funcs->dp_audio_shutdown callbacks. + * + * Note: currently there can be at most one bridge in a chain that sets + * this bit. This is to simplify corresponding glue code in connector + * drivers. Also it is not possible to have a bridge in the chain that + * sets @DRM_BRIDGE_OP_HDMI_AUDIO if there is a bridge that sets this + * flag. + */ + DRM_BRIDGE_OP_DP_AUDIO =3D BIT(6), }; =20 /** @@ -934,25 +1008,27 @@ struct drm_bridge { =20 /** * @hdmi_audio_dev: device to be used as a parent for the HDMI Codec if - * @DRM_BRIDGE_OP_HDMI_AUDIO is set. + * either of @DRM_BRIDGE_OP_HDMI_AUDIO or @DRM_BRIDGE_OP_DP_AUDIO is set. */ struct device *hdmi_audio_dev; =20 /** * @hdmi_audio_max_i2s_playback_channels: maximum number of playback - * I2S channels for the bridge that sets @DRM_BRIDGE_OP_HDMI_AUDIO. + * I2S channels for the @DRM_BRIDGE_OP_HDMI_AUDIO or + * @DRM_BRIDGE_OP_DP_AUDIO. */ int hdmi_audio_max_i2s_playback_channels; =20 /** * @hdmi_audio_spdif_playback: set if this bridge has S/PDIF playback - * port for @DRM_BRIDGE_OP_HDMI_AUDIO + * port for @DRM_BRIDGE_OP_HDMI_AUDIO or @DRM_BRIDGE_OP_DP_AUDIO. */ unsigned int hdmi_audio_spdif_playback : 1; =20 /** - * @hdmi_audio_dai_port: sound DAI port for @DRM_BRIDGE_OP_HDMI_AUDIO, - * -1 if it is not used. + * @hdmi_audio_dai_port: sound DAI port for either of + * @DRM_BRIDGE_OP_HDMI_AUDIO and @DRM_BRIDGE_OP_DP_AUDIO, -1 if it is + * not used. */ int hdmi_audio_dai_port; }; --=20 2.39.5 From nobody Tue Dec 16 10:30:26 2025 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 4BE711F181F for ; Fri, 14 Mar 2025 09:37:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741945027; cv=none; b=Aug/3/Ba8sq7x60PglPBYHPF5SdVNgbuAzf3kjWIkUhSEz6wjHpSA3bD4JRoIrbCW4AVPrkoX774Dz8NVLKYbHCkUfd3yLdAQE943fYDCQDM1+6r1wcHlLmO7uAjOOO2L/QROU5cebDrbofpqwo8AQPmNE165X9QuBnlnkBr0Qk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741945027; c=relaxed/simple; bh=YybX5qyC/YrcFA/7ajmvv9eeRrlrBxymwT3fPWppcb8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Mhmp23Ct7mAGwEW5ksR1QMpQXhxYefSZLwkbtqThUP8RhejJVdZoU7pUYv6TF9RQ24fMI/dMjYboFHs8otPNh6Q3Irb+LdVdwBGFCLT/VRbXq7Y/3tq2TAHXJNgdKycBhbeEGbNYZwFLyd1eMM7fSdyqL73k5mT7vaFthKaFvUY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=XtEtNHWu; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="XtEtNHWu" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 52DKDQSc027801 for ; Fri, 14 Mar 2025 09:37:05 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= Rxg6WTy5b8i3vo4PyN3jqKTFwuTSk7Yvh0ES6fNN2UI=; b=XtEtNHWugQ3AYEg3 wjWzZogbkkZmwVdE2KNA20IfuAsU36tXa/1dt3lM7njr4LoO9XFYpEMz6em2M+9y d5NMit+t9E+D5H4bcLE67uhsAT6fUr8QY8b/Egzo0H/sVsj152QVRbiO7OTmkYEz PPD0deuf+aRf7iK/StY+w4mZUYMJ5OEgDAVahytjKQc4Yj7isdmSOy4SQi+Btu2e TBrmXCmtw7hdRWEqmuQY5rNmr/we7z8RPykKeezOOI6iFxQm3pEh+6h1aOlJYlQo kcVx5ei40tS36AKl6PX4BgCxmDUA/XbpwVcsjMbmdzHyzZXAYSIfKwlnHfFQrz5f PFcmUQ== Received: from mail-qv1-f72.google.com (mail-qv1-f72.google.com [209.85.219.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 45c6731pyb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Fri, 14 Mar 2025 09:37:05 +0000 (GMT) Received: by mail-qv1-f72.google.com with SMTP id 6a1803df08f44-6e91ee078aaso39879666d6.3 for ; Fri, 14 Mar 2025 02:37:05 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741945024; x=1742549824; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Rxg6WTy5b8i3vo4PyN3jqKTFwuTSk7Yvh0ES6fNN2UI=; b=APQmivoUpOyWCGaW4uPlICn/mR+IoJvl9JVlPeYCzTIy1RVjskA2IzzM+zJ1P9zNe9 3paLkTCPbbJHCnwXd/LzCAC11lWgy7zs6Fzd5MTOwVTvIu6z2EXABuYuX8/KZeiRg6Vu ISX9UsXzqEtdF8lAW+V6Gvj/Ye5M+wybUCVlima4jWVGVCFACyHLmYoloEzDWTUcpaQx njVLxTE8cdBOB8jDiaxKOpkDNjkvdMmaNRxmpYbhVpa7FjEwsrw97fWb1LYie7KoEq7+ PSy+Q2+by7LKhSYKerh4PJlBl0kz22fTMVTr5R6fOwtCRjJrq44+EOvhhDR2IcSTNp1n 5UcA== X-Forwarded-Encrypted: i=1; AJvYcCUi6WYR0hk3o2H2rLbzHfZV8YRS0+CwfXPUGxm/8fyS2LjjyGsoV2q5mQyb16lQD9jbtL9kRLek1W6V8G4=@vger.kernel.org X-Gm-Message-State: AOJu0Yw8BaKi5xMlGkCXTSA3nCSuF+mMvJX4SJ20THampNTmLNuAyQE5 kRTjtGWXEsR53VvS3EwKACfdogx4iLg3GTs/0Aq2Uv40BRpZC+Z9hG/uk/OL/+I/P2leOkN/c09 GY0kZu6OZ6jWRckdJ8TSpFPji+65ldm6Zy3AXVPsnNdoQeQ1RcZGtnDumsPw/MHk= X-Gm-Gg: ASbGncs5Mr4t0kORqb4d+QZUMYp0DvmvXeSk2twTn9QMm0n9UN7BuSMnCFa9MmsNKm6 M4Uq6JA+HcgWJ/Tnc8h/g6zd/Mo1L/Xnx1IVeF8tB3wpjEa2fNAl0hghS0ljeXZa994JA6Nk6GJ be+q6tltA0iMW48U8o0K/il8ic+tbyqN8azajgiLUlDmy/FmWAYf4HfR3AUuJ3WNhN5xwKT2VMl yhbfxtJze7OFMeEGspOEgLqYGjPB1E53D+vOyjTIRPTnNuHNrC8fh6iu/AoRPLttW/QkxnmYirw vPXseICZG0S4WYCb/i4LO/MEvCreNySxJ9A1CkfDwUgsGxP8dYP1px6mo3Ph8mF1KKTDKERAAyM 6Ch7uu3YspIZObroLXB7Gb12ZJn9f X-Received: by 2002:ad4:51ca:0:b0:6e8:9a55:8259 with SMTP id 6a1803df08f44-6eaea9961efmr20179196d6.9.1741945024318; Fri, 14 Mar 2025 02:37:04 -0700 (PDT) X-Google-Smtp-Source: AGHT+IE7M0uXsq5VLmnMusm+b4PPWNokUY8N7huijszRLAgCWSqkBVnma70tsFEMI4SVLCklGwRong== X-Received: by 2002:ad4:51ca:0:b0:6e8:9a55:8259 with SMTP id 6a1803df08f44-6eaea9961efmr20178956d6.9.1741945023978; Fri, 14 Mar 2025 02:37:03 -0700 (PDT) Received: from umbar.lan (2001-14ba-a0c3-3a00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a0c3:3a00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-549ba7a8368sm478585e87.32.2025.03.14.02.37.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 02:37:03 -0700 (PDT) From: Dmitry Baryshkov Date: Fri, 14 Mar 2025 11:36:50 +0200 Subject: [PATCH v6 3/4] drm/bridge-connector: hook DisplayPort 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: <20250314-dp-hdmi-audio-v6-3-dbd228fa73d7@oss.qualcomm.com> References: <20250314-dp-hdmi-audio-v6-0-dbd228fa73d7@oss.qualcomm.com> In-Reply-To: <20250314-dp-hdmi-audio-v6-0-dbd228fa73d7@oss.qualcomm.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten , Hermes Wu , Dmitry Baryshkov Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6670; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=YybX5qyC/YrcFA/7ajmvv9eeRrlrBxymwT3fPWppcb8=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBn0/ixi7kVXfa/jwnTZ4fv8x50RB/nD4bUrHN8i hxuJjPE21eJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ9P4sQAKCRCLPIo+Aiko 1cclB/wKwPk152dsnu70W8RKywmVujiApcE8B5driQB8QQcmFe/+Bc1/oyfnrs1x1z6sHZxEsEl 4R2OznLQsTGfvWkudWsrQPP8crg3JP3YqLuGAd9ZXeHIxnOtqw2xwTxcZ4zLKIcRp88hEqMz/LP 5QupCCL5bGEeA0pilHSpsqRr0dZXitFPux1AHI0DHL3AB7szZxKjCPHO6NGYb2koURYkUXbG7fW e4qIzjIN0r/sc/iuzzPTJkflX3JD0Q3JJU8IWPI6E19/bkwryKnGC3tKdCMpahFWQq6NYlJg2Hj pMXI2vgKUFGbCfIAhQHNyOIkJJ3Nqn6aJdvf2k826YbEjiQk X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Authority-Analysis: v=2.4 cv=a5Iw9VSF c=1 sm=1 tr=0 ts=67d3f8c1 cx=c_pps a=7E5Bxpl4vBhpaufnMqZlrw==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=Vs1iUdzkB0EA:10 a=EUspDBNiAAAA:8 a=ZVFr_3E1Ng6cMAc5vHkA:9 a=QEXdDO2ut3YA:10 a=pJ04lnu7RYOZP9TFuWaZ:22 X-Proofpoint-GUID: 795ZOMKg2497etlIURZAMzvJ_eLfKstp X-Proofpoint-ORIG-GUID: 795ZOMKg2497etlIURZAMzvJ_eLfKstp X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1093,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-03-14_04,2025-03-13_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 mlxlogscore=999 suspectscore=0 bulkscore=0 lowpriorityscore=0 priorityscore=1501 impostorscore=0 clxscore=1015 spamscore=0 mlxscore=0 adultscore=0 malwarescore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2502280000 definitions=main-2503140075 Reuse existing code plumbing HDMI audio support and the existing HDMI audio helpers that register HDMI codec device and plumb in the DisplayPort audio interfaces to be handled by the drm_bridge_connector. Signed-off-by: Dmitry Baryshkov Reviewed-by: Maxime Ripard --- drivers/gpu/drm/display/drm_bridge_connector.c | 117 ++++++++++++++++++++-= ---- 1 file changed, 93 insertions(+), 24 deletions(-) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index 030f98d454608a63154827c65d4822d378df3b4c..7d2e499ea5dec2f710c1c67323b= f9e6b177d3c9e 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -105,6 +105,14 @@ struct drm_bridge_connector { * HDMI Audio infrastructure, if any (see &DRM_BRIDGE_OP_HDMI_AUDIO). */ struct drm_bridge *bridge_hdmi_audio; + /** + * @bridge_dp_audio: + * + * The bridge in the chain that implements necessary support for the + * DisplayPort Audio infrastructure, if any (see + * &DRM_BRIDGE_OP_DP_AUDIO). + */ + struct drm_bridge *bridge_dp_audio; }; =20 #define to_drm_bridge_connector(x) \ @@ -440,14 +448,25 @@ static int drm_bridge_connector_audio_startup(struct = drm_connector *connector) to_drm_bridge_connector(connector); struct drm_bridge *bridge; =20 - bridge =3D bridge_connector->bridge_hdmi_audio; - if (!bridge) - return -EINVAL; + if (bridge_connector->bridge_hdmi_audio) { + bridge =3D bridge_connector->bridge_hdmi_audio; =20 - if (!bridge->funcs->hdmi_audio_startup) - return 0; + if (!bridge->funcs->hdmi_audio_startup) + return 0; =20 - return bridge->funcs->hdmi_audio_startup(connector, bridge); + return bridge->funcs->hdmi_audio_startup(connector, bridge); + } + + if (bridge_connector->bridge_dp_audio) { + bridge =3D bridge_connector->bridge_dp_audio; + + if (!bridge->funcs->dp_audio_startup) + return 0; + + return bridge->funcs->dp_audio_startup(connector, bridge); + } + + return -EINVAL; } =20 static int drm_bridge_connector_audio_prepare(struct drm_connector *connec= tor, @@ -458,11 +477,19 @@ static int drm_bridge_connector_audio_prepare(struct = drm_connector *connector, to_drm_bridge_connector(connector); struct drm_bridge *bridge; =20 - bridge =3D bridge_connector->bridge_hdmi_audio; - if (!bridge) - return -EINVAL; + if (bridge_connector->bridge_hdmi_audio) { + bridge =3D bridge_connector->bridge_hdmi_audio; + + return bridge->funcs->hdmi_audio_prepare(connector, bridge, fmt, hparms); + } + + if (bridge_connector->bridge_dp_audio) { + bridge =3D bridge_connector->bridge_dp_audio; + + return bridge->funcs->dp_audio_prepare(connector, bridge, fmt, hparms); + } =20 - return bridge->funcs->hdmi_audio_prepare(connector, bridge, fmt, hparms); + return -EINVAL; } =20 static void drm_bridge_connector_audio_shutdown(struct drm_connector *conn= ector) @@ -471,11 +498,15 @@ static void drm_bridge_connector_audio_shutdown(struc= t drm_connector *connector) to_drm_bridge_connector(connector); struct drm_bridge *bridge; =20 - bridge =3D bridge_connector->bridge_hdmi_audio; - if (!bridge) - return; + if (bridge_connector->bridge_hdmi_audio) { + bridge =3D bridge_connector->bridge_hdmi_audio; + bridge->funcs->hdmi_audio_shutdown(connector, bridge); + } =20 - bridge->funcs->hdmi_audio_shutdown(connector, bridge); + if (bridge_connector->bridge_dp_audio) { + bridge =3D bridge_connector->bridge_dp_audio; + bridge->funcs->dp_audio_shutdown(connector, bridge); + } } =20 static int drm_bridge_connector_audio_mute_stream(struct drm_connector *co= nnector, @@ -485,15 +516,27 @@ static int drm_bridge_connector_audio_mute_stream(str= uct drm_connector *connecto to_drm_bridge_connector(connector); struct drm_bridge *bridge; =20 - bridge =3D bridge_connector->bridge_hdmi_audio; - if (!bridge) - return -EINVAL; + if (bridge_connector->bridge_hdmi_audio) { + bridge =3D bridge_connector->bridge_hdmi_audio; + + if (!bridge->funcs->hdmi_audio_mute_stream) + return -ENOTSUPP; =20 - if (bridge->funcs->hdmi_audio_mute_stream) return bridge->funcs->hdmi_audio_mute_stream(connector, bridge, enable, direction); - else - return -ENOTSUPP; + } + + if (bridge_connector->bridge_dp_audio) { + bridge =3D bridge_connector->bridge_dp_audio; + + if (!bridge->funcs->dp_audio_mute_stream) + return -ENOTSUPP; + + return bridge->funcs->dp_audio_mute_stream(connector, bridge, + enable, direction); + } + + return -EINVAL; } =20 static const struct drm_connector_hdmi_audio_funcs drm_bridge_connector_hd= mi_audio_funcs =3D { @@ -587,6 +630,9 @@ struct drm_connector *drm_bridge_connector_init(struct = drm_device *drm, if (bridge_connector->bridge_hdmi_audio) return ERR_PTR(-EBUSY); =20 + if (bridge_connector->bridge_dp_audio) + return ERR_PTR(-EBUSY); + if (!bridge->hdmi_audio_max_i2s_playback_channels && !bridge->hdmi_audio_spdif_playback) return ERR_PTR(-EINVAL); @@ -598,6 +644,24 @@ struct drm_connector *drm_bridge_connector_init(struct= drm_device *drm, bridge_connector->bridge_hdmi_audio =3D bridge; } =20 + if (bridge->ops & DRM_BRIDGE_OP_DP_AUDIO) { + if (bridge_connector->bridge_dp_audio) + return ERR_PTR(-EBUSY); + + if (bridge_connector->bridge_hdmi_audio) + return ERR_PTR(-EBUSY); + + if (!bridge->hdmi_audio_max_i2s_playback_channels && + !bridge->hdmi_audio_spdif_playback) + return ERR_PTR(-EINVAL); + + if (!bridge->funcs->dp_audio_prepare || + !bridge->funcs->dp_audio_shutdown) + return ERR_PTR(-EINVAL); + + bridge_connector->bridge_dp_audio =3D bridge; + } + if (!drm_bridge_get_next_bridge(bridge)) connector_type =3D bridge->type; =20 @@ -641,11 +705,16 @@ struct drm_connector *drm_bridge_connector_init(struc= t drm_device *drm, return ERR_PTR(ret); } =20 - if (bridge_connector->bridge_hdmi_audio) { - bridge =3D bridge_connector->bridge_hdmi_audio; + if (bridge_connector->bridge_hdmi_audio || + bridge_connector->bridge_dp_audio) { + struct device *dev; + + if (bridge_connector->bridge_hdmi_audio) + dev =3D bridge_connector->bridge_hdmi_audio->hdmi_audio_dev; + else + dev =3D bridge_connector->bridge_dp_audio->hdmi_audio_dev; =20 - ret =3D drm_connector_hdmi_audio_init(connector, - bridge->hdmi_audio_dev, + ret =3D drm_connector_hdmi_audio_init(connector, dev, &drm_bridge_connector_hdmi_audio_funcs, bridge->hdmi_audio_max_i2s_playback_channels, bridge->hdmi_audio_spdif_playback, --=20 2.39.5 From nobody Tue Dec 16 10:30:26 2025 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 6B1121F3B93 for ; Fri, 14 Mar 2025 09:37:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741945033; cv=none; b=nVgw5U0D3mpNCLgkRI7okpx7TJsSGPzbSjydLOTabZEr/vLOIIscnyyk7lpQtnyxPHA0juZbE31PVhL19L/HDxmcEI9DcP2WRMHDT39pqp1K7AByMse2/JPfDRvwoAk5IRTFBY726oQA7obF57jZ31jiUzUBhbQc4zJ6HtBG638= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741945033; c=relaxed/simple; bh=coBL0XiK7rWVMmUByyrf/32PINZ2KHuh8mKaUJv+Fvk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KOrAXJFuulv9dHqY5InIxTXtlMUyow3gsKSaaW3+Ck8p/vqFPT+8ioyICYY+bu2QfNPhaYAI/sBwqmWMUB6rTbDNsuQUz6b7pfRfFl4g/yOZao1c5iJ8Yvgy3gUap3h1keIJoiPuFh+SzVEYjp3vTM0K7K9Q20Pu71bHquiQW8Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=jCrD7s4u; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="jCrD7s4u" Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 52DLJJTx030595 for ; Fri, 14 Mar 2025 09:37:09 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= CBpK3t6rlGZcq0SZKc89sdkSddHeB+d6hiOpvUq4aM8=; b=jCrD7s4ukTI22pvP oK02UbmVV8ND9WYJiKuCNqAEauB1abfVc0RQ08+f9yvgWEXSfN3iFBsViCL9hQ5g b+4kbjEcgrbaggU28ZAjSRu0mopcsNSda1AyDTk6uW/v8UbD7+cexvmS4TQJaaPe 1iAF5B/eCKDbhPRsQYzyuCJCz3d9nQhYKp65lLVoUsJI0hXRuVOtgj79A3FOnyJS JjtcEShQyIrJCGZVVFU8Snq3dylskllAv1khwAv3AHW5cH+YuhoWzHf3ZZQ3a+jp SGWpSmiV+enxJPzIAzmhgBbsBpjGPaCY6Xi0IsKovaJhqWhqlkONQNMElIVUfbHy 0wY5pw== Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 45au2qrr9y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Fri, 14 Mar 2025 09:37:08 +0000 (GMT) Received: by mail-qv1-f69.google.com with SMTP id 6a1803df08f44-6e91ee078aaso39880996d6.3 for ; Fri, 14 Mar 2025 02:37:08 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741945028; x=1742549828; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CBpK3t6rlGZcq0SZKc89sdkSddHeB+d6hiOpvUq4aM8=; b=mIaqLV4xhyT5UlZoQuhl4IfCwOOMlOw0i9HQAF11lRdsPfuO/kWGvKyqvOpQN8PSru QOMa2EmGPkGlWnOfDoLx6R81jlmmjp/eQhmLihYXrrgjcl10fNpLeLYOToecVV7bIVnw 56BjnqdPwbClADiYnnoy6e3eRaB47XyPwpMTjkgker/Dk2/sTFDy0eK+GMN6mJXDzcOA kHizYwkb8vqLx9BETnKckskouEzPyv5mzMFwXuRUnbPGr/LxAC9KjMZ6XBNyIm4Y5VX6 veToluwzi/EEX2aNTQ7TYLfOus4jA70sSW5op2aygm51j+zAwookXM8ckrefgWB34rzV Uo3w== X-Forwarded-Encrypted: i=1; AJvYcCV/ZiVKTkQL+MI1cMKLfIdPE3Tb4lc+B2U7gDjPrNM7i2OXYOBwMJh59gVxJ2QTY97zLbJubXaxI5KcNyc=@vger.kernel.org X-Gm-Message-State: AOJu0Yz1iEO+HZtOJrnoxNy2vVmG9WK/9BxR6aa6PpsyYFmuAPggvHkI HNcnrD2Y0Ancs4vdFOCQV5SWtPRt+iF4ZZtUDH1NILnXKncG8bimzvmU5DrFOW7skF0Y12Zc8cb Tk9HrA8fSrirlkwmh4R1IOx055VwldL+HAg0XcRjpmePSPSEk1JMqAa4Q9Jok8sE= X-Gm-Gg: ASbGncswfsuVdsgcHbWaH8zt5IzchutB3MTGGS5wKZs6mzQ5T7vwzF4LvOR0aExpzQ5 0nE2LNmxZ2VFWvE9GLx4jmuGt5phZ+q++2bn+BWECQNSkK5H+hxsK81ctt/jZYFNsJMWHoORGYj bMChj4XQYqr1UFDYwQh0dU/RcUVCfUCIfLdULE7JsP4+0VPJE4Hs181TiB6ce7WTI9Rklk7Mfy4 qCgJUUYPu5WCVzuXDHxEP9vrvGtiufKkITH/FV0ha9Vhc8iTzusCR9Q3iKjcGlQ8UO6LYeqrfvc S7Je/uChjmsT0p6Vc7TS/fSpTNxzVnZ2KpZ3/LGPn2Saw+WidDyAnTK5oy5b33SQUVQj9YETBpi IBOv/gRsQTJz60qSOq1RNDSsFKuwJ X-Received: by 2002:ad4:5dc8:0:b0:6e8:fee2:aae6 with SMTP id 6a1803df08f44-6eaeaaf404cmr18754586d6.41.1741945028148; Fri, 14 Mar 2025 02:37:08 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHqe6//rANJI0oTLkkxcEbigu337gvRXL5ms7i67EIhYK/9gg+s7ZHXLkBrgkcmQ6aV1Hacrg== X-Received: by 2002:ad4:5dc8:0:b0:6e8:fee2:aae6 with SMTP id 6a1803df08f44-6eaeaaf404cmr18754286d6.41.1741945027739; Fri, 14 Mar 2025 02:37:07 -0700 (PDT) Received: from umbar.lan (2001-14ba-a0c3-3a00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a0c3:3a00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-549ba7a8368sm478585e87.32.2025.03.14.02.37.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 02:37:05 -0700 (PDT) From: Dmitry Baryshkov Date: Fri, 14 Mar 2025 11:36:51 +0200 Subject: [PATCH v6 4/4] drm/msm/dp: reuse generic HDMI codec implementation 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: <20250314-dp-hdmi-audio-v6-4-dbd228fa73d7@oss.qualcomm.com> References: <20250314-dp-hdmi-audio-v6-0-dbd228fa73d7@oss.qualcomm.com> In-Reply-To: <20250314-dp-hdmi-audio-v6-0-dbd228fa73d7@oss.qualcomm.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten , Hermes Wu , Dmitry Baryshkov Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Dmitry Baryshkov X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=13442; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=owywd2MhluQ5wnxzrezZCXfehvG7zcy7JkjEZ8baiIs=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBn0/ix47pah4PSeLlXGTCnDqKoDcYmUFpBphGxj ilb7i2UGe2JATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ9P4sQAKCRCLPIo+Aiko 1QtbB/sFiiJghIIso4uDNmAwDKJ9HTgPocY+wzAp4lDiBKxOpri1yxyDMN4YzqHq3BLy4sAaIOy DI0HY+tSeqL0qhlat4eO0tnr+U6GdEuEOTjN7jSTyb8eWdTjMnu3xCyK/qc+j5R+WHbHhNUN60u WUOrSKC6XyaR4DjyPV9sj4QSDayUhLGRIaRkiOYwhU3Fzt3wjXd1sWBEJ4EU5RBu3a1FdvRawC7 yT0IgIwkoOcqBAMCpeKTbtrxtG49baN8ZWbf7/+TYb7IbOczVwZ/SwJEn+xgLmpd5jp8miCuEQ1 sig3bVj7sUXgMHE37IQcV/ZoTz2Jjvy0SEKpAW57LBW3iNKW X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-ORIG-GUID: mPF_xC9G2VG1hFwKkRKCpG9Lxxl9g-7P X-Proofpoint-GUID: mPF_xC9G2VG1hFwKkRKCpG9Lxxl9g-7P X-Authority-Analysis: v=2.4 cv=TIhFS0la c=1 sm=1 tr=0 ts=67d3f8c5 cx=c_pps a=wEM5vcRIz55oU/E2lInRtA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=Vs1iUdzkB0EA:10 a=VwQbUJbxAAAA:8 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=rffrVGSa7g4bM9eyZP0A:9 a=QEXdDO2ut3YA:10 a=OIgjcC2v60KrkQgK7BGD:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1093,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-03-14_04,2025-03-13_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 adultscore=0 mlxlogscore=999 mlxscore=0 clxscore=1015 bulkscore=0 malwarescore=0 suspectscore=0 spamscore=0 phishscore=0 impostorscore=0 priorityscore=1501 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2502280000 definitions=main-2503140075 From: Dmitry Baryshkov The MSM DisplayPort driver implements several HDMI codec functions in the driver, e.g. it manually manages HDMI codec device registration, returning ELD and plugged_cb support. In order to reduce code duplication reuse drm_hdmi_audio_* helpers and drm_bridge_connector integration. Signed-off-by: Dmitry Baryshkov Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/msm/Kconfig | 1 + drivers/gpu/drm/msm/dp/dp_audio.c | 131 ++++----------------------------= ---- drivers/gpu/drm/msm/dp/dp_audio.h | 27 ++------ drivers/gpu/drm/msm/dp/dp_display.c | 28 ++------ drivers/gpu/drm/msm/dp/dp_display.h | 6 -- drivers/gpu/drm/msm/dp/dp_drm.c | 8 +++ 6 files changed, 31 insertions(+), 170 deletions(-) diff --git a/drivers/gpu/drm/msm/Kconfig b/drivers/gpu/drm/msm/Kconfig index 974bc7c0ea761147d3326bdce9039d6f26f290d0..7f127e2ae44292f8f5c7ff6a925= 1c3d7ec8c9f58 100644 --- a/drivers/gpu/drm/msm/Kconfig +++ b/drivers/gpu/drm/msm/Kconfig @@ -104,6 +104,7 @@ config DRM_MSM_DPU config DRM_MSM_DP bool "Enable DisplayPort support in MSM DRM driver" depends on DRM_MSM + select DRM_DISPLAY_HDMI_AUDIO_HELPER select RATIONAL default y help diff --git a/drivers/gpu/drm/msm/dp/dp_audio.c b/drivers/gpu/drm/msm/dp/dp_= audio.c index 70fdc9fe228a7149546accd8479a9e4397f3d5dd..f8bfb908f9b4bf93ad5480f0785= e3aed23dde160 100644 --- a/drivers/gpu/drm/msm/dp/dp_audio.c +++ b/drivers/gpu/drm/msm/dp/dp_audio.c @@ -13,13 +13,13 @@ =20 #include "dp_catalog.h" #include "dp_audio.h" +#include "dp_drm.h" #include "dp_panel.h" #include "dp_reg.h" #include "dp_display.h" #include "dp_utils.h" =20 struct msm_dp_audio_private { - struct platform_device *audio_pdev; struct platform_device *pdev; struct drm_device *drm_dev; struct msm_dp_catalog *catalog; @@ -160,24 +160,11 @@ static void msm_dp_audio_enable(struct msm_dp_audio_p= rivate *audio, bool enable) msm_dp_catalog_audio_enable(catalog, enable); } =20 -static struct msm_dp_audio_private *msm_dp_audio_get_data(struct platform_= device *pdev) +static struct msm_dp_audio_private *msm_dp_audio_get_data(struct msm_dp *m= sm_dp_display) { struct msm_dp_audio *msm_dp_audio; - struct msm_dp *msm_dp_display; - - if (!pdev) { - DRM_ERROR("invalid input\n"); - return ERR_PTR(-ENODEV); - } - - msm_dp_display =3D platform_get_drvdata(pdev); - if (!msm_dp_display) { - DRM_ERROR("invalid input\n"); - return ERR_PTR(-ENODEV); - } =20 msm_dp_audio =3D msm_dp_display->msm_dp_audio; - if (!msm_dp_audio) { DRM_ERROR("invalid msm_dp_audio data\n"); return ERR_PTR(-EINVAL); @@ -186,68 +173,16 @@ static struct msm_dp_audio_private *msm_dp_audio_get_= data(struct platform_device return container_of(msm_dp_audio, struct msm_dp_audio_private, msm_dp_aud= io); } =20 -static int msm_dp_audio_hook_plugged_cb(struct device *dev, void *data, - hdmi_codec_plugged_cb fn, - struct device *codec_dev) -{ - - struct platform_device *pdev; - struct msm_dp *msm_dp_display; - - pdev =3D to_platform_device(dev); - if (!pdev) { - pr_err("invalid input\n"); - return -ENODEV; - } - - msm_dp_display =3D platform_get_drvdata(pdev); - if (!msm_dp_display) { - pr_err("invalid input\n"); - return -ENODEV; - } - - return msm_dp_display_set_plugged_cb(msm_dp_display, fn, codec_dev); -} - -static int msm_dp_audio_get_eld(struct device *dev, - void *data, uint8_t *buf, size_t len) -{ - struct platform_device *pdev; - struct msm_dp *msm_dp_display; - - pdev =3D to_platform_device(dev); - - if (!pdev) { - DRM_ERROR("invalid input\n"); - return -ENODEV; - } - - msm_dp_display =3D platform_get_drvdata(pdev); - if (!msm_dp_display) { - DRM_ERROR("invalid input\n"); - return -ENODEV; - } - - mutex_lock(&msm_dp_display->connector->eld_mutex); - memcpy(buf, msm_dp_display->connector->eld, - min(sizeof(msm_dp_display->connector->eld), len)); - mutex_unlock(&msm_dp_display->connector->eld_mutex); - - return 0; -} - -int msm_dp_audio_hw_params(struct device *dev, - void *data, - struct hdmi_codec_daifmt *daifmt, - struct hdmi_codec_params *params) +int msm_dp_audio_prepare(struct drm_connector *connector, + struct drm_bridge *bridge, + struct hdmi_codec_daifmt *daifmt, + struct hdmi_codec_params *params) { int rc =3D 0; struct msm_dp_audio_private *audio; - struct platform_device *pdev; struct msm_dp *msm_dp_display; =20 - pdev =3D to_platform_device(dev); - msm_dp_display =3D platform_get_drvdata(pdev); + msm_dp_display =3D to_dp_bridge(bridge)->msm_dp_display; =20 /* * there could be cases where sound card can be opened even @@ -262,7 +197,7 @@ int msm_dp_audio_hw_params(struct device *dev, goto end; } =20 - audio =3D msm_dp_audio_get_data(pdev); + audio =3D msm_dp_audio_get_data(msm_dp_display); if (IS_ERR(audio)) { rc =3D PTR_ERR(audio); goto end; @@ -281,15 +216,14 @@ int msm_dp_audio_hw_params(struct device *dev, return rc; } =20 -static void msm_dp_audio_shutdown(struct device *dev, void *data) +void msm_dp_audio_shutdown(struct drm_connector *connector, + struct drm_bridge *bridge) { struct msm_dp_audio_private *audio; - struct platform_device *pdev; struct msm_dp *msm_dp_display; =20 - pdev =3D to_platform_device(dev); - msm_dp_display =3D platform_get_drvdata(pdev); - audio =3D msm_dp_audio_get_data(pdev); + msm_dp_display =3D to_dp_bridge(bridge)->msm_dp_display; + audio =3D msm_dp_audio_get_data(msm_dp_display); if (IS_ERR(audio)) { DRM_ERROR("failed to get audio data\n"); return; @@ -311,47 +245,6 @@ static void msm_dp_audio_shutdown(struct device *dev, = void *data) msm_dp_display_signal_audio_complete(msm_dp_display); } =20 -static const struct hdmi_codec_ops msm_dp_audio_codec_ops =3D { - .hw_params =3D msm_dp_audio_hw_params, - .audio_shutdown =3D msm_dp_audio_shutdown, - .get_eld =3D msm_dp_audio_get_eld, - .hook_plugged_cb =3D msm_dp_audio_hook_plugged_cb, -}; - -static struct hdmi_codec_pdata codec_data =3D { - .ops =3D &msm_dp_audio_codec_ops, - .max_i2s_channels =3D 8, - .i2s =3D 1, -}; - -void msm_dp_unregister_audio_driver(struct device *dev, struct msm_dp_audi= o *msm_dp_audio) -{ - struct msm_dp_audio_private *audio_priv; - - audio_priv =3D container_of(msm_dp_audio, struct msm_dp_audio_private, ms= m_dp_audio); - - if (audio_priv->audio_pdev) { - platform_device_unregister(audio_priv->audio_pdev); - audio_priv->audio_pdev =3D NULL; - } -} - -int msm_dp_register_audio_driver(struct device *dev, - struct msm_dp_audio *msm_dp_audio) -{ - struct msm_dp_audio_private *audio_priv; - - audio_priv =3D container_of(msm_dp_audio, - struct msm_dp_audio_private, msm_dp_audio); - - audio_priv->audio_pdev =3D platform_device_register_data(dev, - HDMI_CODEC_DRV_NAME, - PLATFORM_DEVID_AUTO, - &codec_data, - sizeof(codec_data)); - return PTR_ERR_OR_ZERO(audio_priv->audio_pdev); -} - struct msm_dp_audio *msm_dp_audio_get(struct platform_device *pdev, struct msm_dp_catalog *catalog) { diff --git a/drivers/gpu/drm/msm/dp/dp_audio.h b/drivers/gpu/drm/msm/dp/dp_= audio.h index beea34cbab77f31b33873297dc454a9cee446240..58fc14693e48bff2b57ef727898= 3e5f21ee80ac7 100644 --- a/drivers/gpu/drm/msm/dp/dp_audio.h +++ b/drivers/gpu/drm/msm/dp/dp_audio.h @@ -35,23 +35,6 @@ struct msm_dp_audio { struct msm_dp_audio *msm_dp_audio_get(struct platform_device *pdev, struct msm_dp_catalog *catalog); =20 -/** - * msm_dp_register_audio_driver() - * - * Registers DP device with hdmi_codec interface. - * - * @dev: DP device instance. - * @msm_dp_audio: an instance of msm_dp_audio module. - * - * - * Returns the error code in case of failure, otherwise - * zero on success. - */ -int msm_dp_register_audio_driver(struct device *dev, - struct msm_dp_audio *msm_dp_audio); - -void msm_dp_unregister_audio_driver(struct device *dev, struct msm_dp_audi= o *msm_dp_audio); - /** * msm_dp_audio_put() * @@ -61,10 +44,12 @@ void msm_dp_unregister_audio_driver(struct device *dev,= struct msm_dp_audio *msm */ void msm_dp_audio_put(struct msm_dp_audio *msm_dp_audio); =20 -int msm_dp_audio_hw_params(struct device *dev, - void *data, - struct hdmi_codec_daifmt *daifmt, - struct hdmi_codec_params *params); +int msm_dp_audio_prepare(struct drm_connector *connector, + struct drm_bridge *bridge, + struct hdmi_codec_daifmt *daifmt, + struct hdmi_codec_params *params); +void msm_dp_audio_shutdown(struct drm_connector *connector, + struct drm_bridge *bridge); =20 #endif /* _DP_AUDIO_H_ */ =20 diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/d= p_display.c index bbc47d86ae9e67245c87a8365df366cce0dc529e..ece184d20c0f8bffa3c2a482160= 15185d6cbc99e 100644 --- a/drivers/gpu/drm/msm/dp/dp_display.c +++ b/drivers/gpu/drm/msm/dp/dp_display.c @@ -13,6 +13,7 @@ #include #include #include +#include #include =20 #include "msm_drv.h" @@ -288,13 +289,6 @@ static int msm_dp_display_bind(struct device *dev, str= uct device *master, goto end; } =20 - - rc =3D msm_dp_register_audio_driver(dev, dp->audio); - if (rc) { - DRM_ERROR("Audio registration Dp failed\n"); - goto end; - } - rc =3D msm_dp_hpd_event_thread_start(dp); if (rc) { DRM_ERROR("Event thread create failed\n"); @@ -316,7 +310,6 @@ static void msm_dp_display_unbind(struct device *dev, s= truct device *master, =20 of_dp_aux_depopulate_bus(dp->aux); =20 - msm_dp_unregister_audio_driver(dev, dp->audio); msm_dp_aux_unregister(dp->aux); dp->drm_dev =3D NULL; dp->aux->drm_dev =3D NULL; @@ -626,9 +619,9 @@ static void msm_dp_display_handle_plugged_change(struct= msm_dp *msm_dp_display, struct msm_dp_display_private, msm_dp_display); =20 /* notify audio subsystem only if sink supports audio */ - if (msm_dp_display->plugged_cb && msm_dp_display->codec_dev && - dp->audio_supported) - msm_dp_display->plugged_cb(msm_dp_display->codec_dev, plugged); + if (dp->audio_supported) + drm_connector_hdmi_audio_plugged_notify(msm_dp_display->connector, + plugged); } =20 static int msm_dp_hpd_unplug_handle(struct msm_dp_display_private *dp, u32= data) @@ -907,19 +900,6 @@ static int msm_dp_display_disable(struct msm_dp_displa= y_private *dp) return 0; } =20 -int msm_dp_display_set_plugged_cb(struct msm_dp *msm_dp_display, - hdmi_codec_plugged_cb fn, struct device *codec_dev) -{ - bool plugged; - - msm_dp_display->plugged_cb =3D fn; - msm_dp_display->codec_dev =3D codec_dev; - plugged =3D msm_dp_display->link_ready; - msm_dp_display_handle_plugged_change(msm_dp_display, plugged); - - return 0; -} - /** * msm_dp_bridge_mode_valid - callback to determine if specified mode is v= alid * @bridge: Pointer to drm bridge structure diff --git a/drivers/gpu/drm/msm/dp/dp_display.h b/drivers/gpu/drm/msm/dp/d= p_display.h index ecbc2d92f546a346ee53adcf1b060933e4f54317..cc6e2cab36e9c0b1527ff292e54= 7cbb4d69fd95c 100644 --- a/drivers/gpu/drm/msm/dp/dp_display.h +++ b/drivers/gpu/drm/msm/dp/dp_display.h @@ -7,7 +7,6 @@ #define _DP_DISPLAY_H_ =20 #include "dp_panel.h" -#include #include "disp/msm_disp_snapshot.h" =20 #define DP_MAX_PIXEL_CLK_KHZ 675000 @@ -15,7 +14,6 @@ struct msm_dp { struct drm_device *drm_dev; struct platform_device *pdev; - struct device *codec_dev; struct drm_connector *connector; struct drm_bridge *next_bridge; bool link_ready; @@ -25,14 +23,10 @@ struct msm_dp { bool is_edp; bool internal_hpd; =20 - hdmi_codec_plugged_cb plugged_cb; - struct msm_dp_audio *msm_dp_audio; bool psr_supported; }; =20 -int msm_dp_display_set_plugged_cb(struct msm_dp *msm_dp_display, - hdmi_codec_plugged_cb fn, struct device *codec_dev); int msm_dp_display_get_modes(struct msm_dp *msm_dp_display); bool msm_dp_display_check_video_test(struct msm_dp *msm_dp_display); int msm_dp_display_get_test_bpp(struct msm_dp *msm_dp_display); diff --git a/drivers/gpu/drm/msm/dp/dp_drm.c b/drivers/gpu/drm/msm/dp/dp_dr= m.c index cca57e56c906255a315e759e85a5af5982c80e9c..838bc7d052c5cfa31572f7e23a6= b1d09c4c63b5f 100644 --- a/drivers/gpu/drm/msm/dp/dp_drm.c +++ b/drivers/gpu/drm/msm/dp/dp_drm.c @@ -12,6 +12,7 @@ =20 #include "msm_drv.h" #include "msm_kms.h" +#include "dp_audio.h" #include "dp_drm.h" =20 /** @@ -114,6 +115,9 @@ static const struct drm_bridge_funcs msm_dp_bridge_ops = =3D { .hpd_disable =3D msm_dp_bridge_hpd_disable, .hpd_notify =3D msm_dp_bridge_hpd_notify, .debugfs_init =3D msm_dp_bridge_debugfs_init, + + .dp_audio_prepare =3D msm_dp_audio_prepare, + .dp_audio_shutdown =3D msm_dp_audio_shutdown, }; =20 static int msm_edp_bridge_atomic_check(struct drm_bridge *drm_bridge, @@ -320,9 +324,13 @@ int msm_dp_bridge_init(struct msm_dp *msm_dp_display, = struct drm_device *dev, */ if (!msm_dp_display->is_edp) { bridge->ops =3D + DRM_BRIDGE_OP_DP_AUDIO | DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_HPD | DRM_BRIDGE_OP_MODES; + bridge->hdmi_audio_dev =3D &msm_dp_display->pdev->dev; + bridge->hdmi_audio_max_i2s_playback_channels =3D 8; + bridge->hdmi_audio_dai_port =3D -1; } =20 rc =3D devm_drm_bridge_add(dev->dev, bridge); --=20 2.39.5