From patchwork Sun Mar 9 08:13:56 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Baryshkov X-Patchwork-Id: 871916 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 5224828DD0; Sun, 9 Mar 2025 08:14:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741508048; cv=none; b=BR/xm9DqXcJ/OUVPSaLQp6oa1wNOs1ILElDjbigySY8dtUFpwqGl8fwW6EuHc7zTj0n81Ixit51VUKsN04b3BI9gCfsqOdy8g9UbKNNU0KgTJBK54jh5VYwZS5/GZQ17Jem5zveJ9bOp3dTxsoBdFSK8r5rp0vjhavl6QoVX64g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741508048; c=relaxed/simple; bh=53oqEdMve9KUjRbc06p98HomGfbvDNqcOd4avDOE3+4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=B5u+OOgqXD1N877adqnKGDguwOiYXFzf9n/X+58GyeaC+fZrWDuJd98b0teKihq/k2Sp5CAcrE81eoXjslA7+lNh3BIlXkEEUqY191y551uIPLHo7TF8nRfLVUwkTnJaxrNPwbOpCZWDdmtVs/Z2xU2hH2hFyWK/cXnTRe+jnB0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=VJOIn9if; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="VJOIn9if" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BB33EC4CEEF; Sun, 9 Mar 2025 08:14:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741508047; bh=53oqEdMve9KUjRbc06p98HomGfbvDNqcOd4avDOE3+4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=VJOIn9ifCz+q6EmxTO1sobATldLALRSF0vY4ohDsPI94kVyijI7UFzJWhFLAIXZhv AXk4aVgfoqjGSprsQT3V6E9v74AXFgyLXnUuDdG5lwWiUDXc2n6aIzwbBX+zFxxVml BMiztwE3m83mRdtKAMSKPZumysd5FV9R7T5NaxyemyPmd4KvRvw+UfWQPXs8A9JgT0 r8cqvsXdSEa6Mif64N50BQk53tqkxI7nU9d6IATRzeFeIEEpVTkvhWmjsldQm6AXVW 8X97yeFLV4PMF6WuUUDvjMZOAVB2rD14PjvkciKTuH+OZ0uR2zIvQV3zPmdfZoZTLo dn89qSGtiNXaw== From: Dmitry Baryshkov Date: Sun, 09 Mar 2025 10:13:56 +0200 Subject: [PATCH 1/4] drm/display: hdmi: provide central data authority for ACR params Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250309-drm-hdmi-acr-v1-1-bb9c242f4d4b@linaro.org> References: <20250309-drm-hdmi-acr-v1-0-bb9c242f4d4b@linaro.org> In-Reply-To: <20250309-drm-hdmi-acr-v1-0-bb9c242f4d4b@linaro.org> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Cana?= =?utf-8?q?l?= , Raspberry Pi Kernel Maintenance , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec 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=7197; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=e5rKHAIrRhvOrVwwZ/dNoJcMiCgbRsKK/fDPerK9GDc=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnzU3GKii0BMlGAcXjmIjpmJ9WmEUQN5FsjibnN RIwgY4AgtKJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ81NxgAKCRCLPIo+Aiko 1QYeCACqHh/JLFPH1L+YS43WPNexSdsseKzSQ8+XiO1EEtqdwDZ0UUJslMxDRPAKNpppdxGIxAF UKWs33gKiV2qxGRrNx6nDO3m96KrADw5/jfQNUSjWjCvL455fVyYvaP1ysfQdyZTxOWWTk8YVPQ rLrItcF9gQnb6txpQmeV4GbKpmSUUx5ORsEyDXoAEZ4CKH5IjpCw9pjs56G3cPK6pn/PYddTrf/ knIs3CGSVcbl5O3GUeo/p2Vsm2XC3Wc/Du0X/tDtBZ1LyDUTkMsrLH2yKTYTI4FODXoXiYAsCcQ jWlBbsD2MpLSR7+neB7aIDnd6kYuJLhM7MQSo7pA09REv7+t X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A From: Dmitry Baryshkov HDMI standard defines recommended N and CTS values for Audio Clock Regeneration. Currently each driver implements those, frequently in somewhat unique way. Provide a generic helper for getting those values to be used by the HDMI drivers. The helper is added to drm_hdmi_helper.c rather than drm_hdmi_audio.c since HDMI drivers can be using this helper function even without switching to DRM HDMI Audio helpers. Note: currently this only handles the values per HDMI 1.4b Section 7.2 and HDMI 2.0 Section 9.2.1. Later the table can be expanded to accommodate for Deep Color TMDS char rates per HDMI 1.4 Appendix D and/or HDMI 2.0 / 2.1 Appendix C). Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/display/drm_hdmi_helper.c | 164 ++++++++++++++++++++++++++++++ include/drm/display/drm_hdmi_helper.h | 6 ++ 2 files changed, 170 insertions(+) diff --git a/drivers/gpu/drm/display/drm_hdmi_helper.c b/drivers/gpu/drm/display/drm_hdmi_helper.c index 74dd4d01dd9bb2c9e69ec1c60b0056bd69417e8a..89d25571bfd21c56c6835821d2272a12c816a76e 100644 --- a/drivers/gpu/drm/display/drm_hdmi_helper.c +++ b/drivers/gpu/drm/display/drm_hdmi_helper.c @@ -256,3 +256,167 @@ drm_hdmi_compute_mode_clock(const struct drm_display_mode *mode, return DIV_ROUND_CLOSEST_ULL(clock * bpc, 8); } EXPORT_SYMBOL(drm_hdmi_compute_mode_clock); + +struct drm_hdmi_acr_n_cts_entry { + unsigned int n; + unsigned int cts; +}; + +struct drm_hdmi_acr_data { + unsigned long tmds_clock_khz; + struct drm_hdmi_acr_n_cts_entry n_cts_32k, + n_cts_44k1, + n_cts_48k; +}; + +static const struct drm_hdmi_acr_data hdmi_acr_n_cts[] = { + { + /* "Other" entry */ + .n_cts_32k = { .n = 4096, }, + .n_cts_44k1 = { .n = 6272, }, + .n_cts_48k = { .n = 6144, }, + }, { + .tmds_clock_khz = 25175, + .n_cts_32k = { .n = 4576, .cts = 28125, }, + .n_cts_44k1 = { .n = 7007, .cts = 31250, }, + .n_cts_48k = { .n = 6864, .cts = 28125, }, + }, { + .tmds_clock_khz = 25200, + .n_cts_32k = { .n = 4096, .cts = 25200, }, + .n_cts_44k1 = { .n = 6272, .cts = 28000, }, + .n_cts_48k = { .n = 6144, .cts = 25200, }, + }, { + .tmds_clock_khz = 27000, + .n_cts_32k = { .n = 4096, .cts = 27000, }, + .n_cts_44k1 = { .n = 6272, .cts = 30000, }, + .n_cts_48k = { .n = 6144, .cts = 27000, }, + }, { + .tmds_clock_khz = 27027, + .n_cts_32k = { .n = 4096, .cts = 27027, }, + .n_cts_44k1 = { .n = 6272, .cts = 30030, }, + .n_cts_48k = { .n = 6144, .cts = 27027, }, + }, { + .tmds_clock_khz = 54000, + .n_cts_32k = { .n = 4096, .cts = 54000, }, + .n_cts_44k1 = { .n = 6272, .cts = 60000, }, + .n_cts_48k = { .n = 6144, .cts = 54000, }, + }, { + .tmds_clock_khz = 54054, + .n_cts_32k = { .n = 4096, .cts = 54054, }, + .n_cts_44k1 = { .n = 6272, .cts = 60060, }, + .n_cts_48k = { .n = 6144, .cts = 54054, }, + }, { + .tmds_clock_khz = 74176, + .n_cts_32k = { .n = 11648, .cts = 210937, }, /* and 210938 */ + .n_cts_44k1 = { .n = 17836, .cts = 234375, }, + .n_cts_48k = { .n = 11648, .cts = 140625, }, + }, { + .tmds_clock_khz = 74250, + .n_cts_32k = { .n = 4096, .cts = 74250, }, + .n_cts_44k1 = { .n = 6272, .cts = 82500, }, + .n_cts_48k = { .n = 6144, .cts = 74250, }, + }, { + .tmds_clock_khz = 148352, + .n_cts_32k = { .n = 11648, .cts = 421875, }, + .n_cts_44k1 = { .n = 8918, .cts = 234375, }, + .n_cts_48k = { .n = 5824, .cts = 140625, }, + }, { + .tmds_clock_khz = 148500, + .n_cts_32k = { .n = 4096, .cts = 148500, }, + .n_cts_44k1 = { .n = 6272, .cts = 165000, }, + .n_cts_48k = { .n = 6144, .cts = 148500, }, + }, { + .tmds_clock_khz = 296703, + .n_cts_32k = { .n = 5824, .cts = 421875, }, + .n_cts_44k1 = { .n = 4459, .cts = 234375, }, + .n_cts_48k = { .n = 5824, .cts = 281250, }, + }, { + .tmds_clock_khz = 297000, + .n_cts_32k = { .n = 3072, .cts = 222750, }, + .n_cts_44k1 = { .n = 4704, .cts = 247500, }, + .n_cts_48k = { .n = 5120, .cts = 247500, }, + }, { + .tmds_clock_khz = 593407, + .n_cts_32k = { .n = 5824, .cts = 843750, }, + .n_cts_44k1 = { .n = 8918, .cts = 937500, }, + .n_cts_48k = { .n = 5824, .cts = 562500, }, + }, { + .tmds_clock_khz = 594000, + .n_cts_32k = { .n = 3072, .cts = 445500, }, + .n_cts_44k1 = { .n = 9408, .cts = 990000, }, + .n_cts_48k = { .n = 6144, .cts = 594000, }, + }, +}; + +static int drm_hdmi_acr_find_tmds_entry(unsigned long tmds_clock_khz) +{ + int i; + + /* skip the "other" entry */ + for (i = 1; i < ARRAY_SIZE(hdmi_acr_n_cts); i++) { + if (hdmi_acr_n_cts[i].tmds_clock_khz == tmds_clock_khz) + return i; + } + + return 0; +} + +/** + * drm_hdmi_acr_get_n_cts() - get N and CTS values for Audio Clock Regeneration + * + * @tmds_char_rate: TMDS clock (char rate) as used by the HDMI connector + * @sample_rate: audio sample rate + * @out_n: a pointer to write the N value + * @out_cts: a pointer to write the CTS value + * + * Get the N and CTS values (either by calculating them or by returning data + * from the tables. This follows the HDMI 1.4b Section 7.2 "Audio Sample Clock + * Capture and Regeneration". + */ +void +drm_hdmi_acr_get_n_cts(unsigned long long tmds_char_rate, + unsigned int sample_rate, + unsigned int *out_n, + unsigned int *out_cts) +{ + /* be a bit more tolerant, especially for the 1.001 entries */ + unsigned long tmds_clock_khz = DIV_ROUND_CLOSEST_ULL(tmds_char_rate, 1000); + const struct drm_hdmi_acr_n_cts_entry *entry; + unsigned int n, cts, mult; + int tmds_idx; + + tmds_idx = drm_hdmi_acr_find_tmds_entry(tmds_clock_khz); + + /* + * Don't change the order, 192 kHz is divisible by 48k and 32k, but it + * should use 48k entry. + */ + if (sample_rate % 48000 == 0) { + entry = &hdmi_acr_n_cts[tmds_idx].n_cts_48k; + mult = sample_rate / 48000; + } else if (sample_rate % 44100 == 0) { + entry = &hdmi_acr_n_cts[tmds_idx].n_cts_44k1; + mult = sample_rate / 44100; + } else if (sample_rate % 32000 == 0) { + entry = &hdmi_acr_n_cts[tmds_idx].n_cts_32k; + mult = sample_rate / 32000; + } else { + entry = NULL; + } + + if (entry) { + n = entry->n * mult; + cts = entry->cts; + } else { + /* Recommended optimal value, HDMI 1.4b, Section 7.2.1 */ + n = 128 * sample_rate / 1000; + cts = 0; + } + + if (!cts) + cts = DIV_ROUND_CLOSEST_ULL(tmds_char_rate * n, + 128 * sample_rate); + + *out_n = n; + *out_cts = cts; +} diff --git a/include/drm/display/drm_hdmi_helper.h b/include/drm/display/drm_hdmi_helper.h index 57e3b18c15ec79636d89267aba0e88f434c5d4db..09145c9ee9fc0cd839242f2373b305940e06e157 100644 --- a/include/drm/display/drm_hdmi_helper.h +++ b/include/drm/display/drm_hdmi_helper.h @@ -28,4 +28,10 @@ unsigned long long drm_hdmi_compute_mode_clock(const struct drm_display_mode *mode, unsigned int bpc, enum hdmi_colorspace fmt); +void +drm_hdmi_acr_get_n_cts(unsigned long long tmds_char_rate, + unsigned int sample_rate, + unsigned int *out_n, + unsigned int *out_cts); + #endif From patchwork Sun Mar 9 08:13:58 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Baryshkov X-Patchwork-Id: 871915 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 50CCF19CC33; Sun, 9 Mar 2025 08:14:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741508057; cv=none; b=WarIDxCWradBJJcc87mzO2MgG3anMGmb5GJL5bPtSqR6wE73IYxYiN9IXGGDtbTHhC8fREK1zzrOuBG/Fj/WVKRLDmJQnrZi93yDclfWQLT2HXnmXmzFI8tj+uokU8J5U/V88Q6lV+NMNnEP/lSL1rc03H/vdCV+ZVOnExByjpY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741508057; c=relaxed/simple; bh=iKB2YBTN12itUfX2G/gBJMos1y7mn3/DCF/Ulyo0X7I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eagLB4B/1h2SsrT0egfw7aV/gEJr5SKPPQ21UCffdNIx5hsgoNj4oew+oJEsJP5Fdn6d1/PfH6QMna+g3+8gSfsb1yZukL+FvI4r18hRfKVzaKE+2i/2lAcxgIqO2j9DsM1qonX2507titD6gcdtFbzeeztv8cZ4Ae0Hp8W/OQ0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Qkv1Uhwp; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Qkv1Uhwp" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B4E72C4CEEC; Sun, 9 Mar 2025 08:14:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741508056; bh=iKB2YBTN12itUfX2G/gBJMos1y7mn3/DCF/Ulyo0X7I=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Qkv1UhwpVdIF/mpWjUCndDtzuaBw32F3c4molVWdZBfu/5pq6VrY5D7oO2XpWZDus AymRUdLjPF08GGjit0GU9imow6SKUk7hw4nATiOLi5r8fyRV30rW5aEA9RPkngIppv KLRKqqus1LbM7aKgw8MF29H7TClXXPeqOY0TSSZ4miHhbt7n2gQCF6QlKjAe7wIHEp a/3jvoql9kiknW0HAyF+k2hD6ni/pW4x6R8JGCGEw9d/4lWlZ2uefdZmRC1CHTL8dj TJO1itTPIIGn1pvtaOQRlcREXlwiCuiePJ0Owh8KNnyfz4+ILagipD4BvbyYP/eq9V azkpCbDxCE4Rw== From: Dmitry Baryshkov Date: Sun, 09 Mar 2025 10:13:58 +0200 Subject: [PATCH 3/4] drm/vc4: use new helper to get ACR values Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250309-drm-hdmi-acr-v1-3-bb9c242f4d4b@linaro.org> References: <20250309-drm-hdmi-acr-v1-0-bb9c242f4d4b@linaro.org> In-Reply-To: <20250309-drm-hdmi-acr-v1-0-bb9c242f4d4b@linaro.org> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Cana?= =?utf-8?q?l?= , Raspberry Pi Kernel Maintenance , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec 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=2230; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=W6pWxFzbC0mPSPnJqUk170LFBYndwgytPiGUkUHjC54=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnzU3GrYcDRMq3W4ONCVGhBpUXl6k8lj2QsL7nl gdbA5U9/TyJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ81NxgAKCRCLPIo+Aiko 1dFKB/9JZWpbJ6y3a1WbkyYvqPJsufPOri+tur/kkqtnfjY8NYZEJBH/HZT9JHz9RRHAM6EFJtm gUL7PIDiHT1k4GT46QcRwQHgDipgj/auPslmS87JoUNdXfDX14abRUMRUb1W2sfaPSCar3YF4F5 Vw8tOp+M82WiScIY5lGVlVo4Nrvl9aM30omD3AvMlt5V9zsgQgAkgEqHgoBWdICf8DU4Ih9Jadz +ccaUCMJML4c/gvDTcMTmObieduMt0iVZV+PeayvUgGCIr3h9XgaC/kajSpMqSrXyYczNH7G0XM cJXIJVPY8WeKbSfzv2bycJUTkfXz2NNZtK3OCWUYW9NTkkgh X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A From: Dmitry Baryshkov Use drm_hdmi_acr_get_n_cts() helper instead of calculating N and CTS values in the VC4 driver. Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/vc4/vc4_hdmi.c | 10 +++------- drivers/gpu/drm/vc4/vc4_hdmi.h | 7 +++++++ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 37238a12baa58a06a5d6f40d1ab64abc7fac60d7..f24bcc2f3a2ac39aaea061b809940978341472f4 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -1637,6 +1637,7 @@ static void vc4_hdmi_encoder_atomic_mode_set(struct drm_encoder *encoder, &crtc_state->adjusted_mode); vc4_hdmi->output_bpc = conn_state->hdmi.output_bpc; vc4_hdmi->output_format = conn_state->hdmi.output_format; + vc4_hdmi->tmds_char_rate = conn_state->hdmi.tmds_char_rate; mutex_unlock(&vc4_hdmi->mutex); } @@ -1829,17 +1830,12 @@ static void vc4_hdmi_audio_set_mai_clock(struct vc4_hdmi *vc4_hdmi, static void vc4_hdmi_set_n_cts(struct vc4_hdmi *vc4_hdmi, unsigned int samplerate) { - const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode; - u32 n, cts; - u64 tmp; + unsigned int n, cts; lockdep_assert_held(&vc4_hdmi->mutex); lockdep_assert_held(&vc4_hdmi->hw_lock); - n = 128 * samplerate / 1000; - tmp = (u64)(mode->clock * 1000) * n; - do_div(tmp, 128 * samplerate); - cts = tmp; + drm_hdmi_acr_get_n_cts(vc4_hdmi->tmds_char_rate, samplerate, &n, &cts); HDMI_WRITE(HDMI_CRP_CFG, VC4_HDMI_CRP_CFG_EXTERNAL_CTS_EN | diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.h b/drivers/gpu/drm/vc4/vc4_hdmi.h index e3d989ca302b72533c374dfa3fd0d5bd7fe64a82..0a775dbfe99d45521f3d0a2016555aefa81d7934 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.h +++ b/drivers/gpu/drm/vc4/vc4_hdmi.h @@ -211,6 +211,13 @@ struct vc4_hdmi { * KMS hooks. Protected by @mutex. */ enum hdmi_colorspace output_format; + + /** + * @tmds_char_rate: Copy of + * @drm_connector_state.hdmi.tmds_char_rate for use outside of + * KMS hooks. Protected by @mutex. + */ + unsigned long long tmds_char_rate; }; #define connector_to_vc4_hdmi(_connector) \