From patchwork Wed Feb 26 08:59:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Baryshkov X-Patchwork-Id: 13991802 Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EB240224246 for ; Wed, 26 Feb 2025 08:59:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740560374; cv=none; b=kZNx3ja9oj+dvi+zCJgrLM8C3f5BkLKaSIG1zJCKHjs6vHiwx54mqLWF24shtcWJHFjJFiApaUBNVwRWJWFbC3csTOIDe2XCcqiafT8EzrZriKxX8jLGfGeLA7rh+YFsxd5bs9V+NDwKaJ5+zVVN9Ndt+My++yjH1DK3VmmIg4E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740560374; c=relaxed/simple; bh=f0rJpJCum+b7lqaI4sn4V9SXHt/v6K6WBKvJft3vbro=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=h3MD3ENQYHiNrBkcMZ3k5LiLSeUVmzgpZK4AhhDhQtKMTnIpG4cW9Fg1ZNBX4Je4WHRBiyuQaGtszed/L4nDsgjMN5naqPma49Jaogvs1xXhDAZvlfItNEIZaYIfQgOpkXwgAyLpMUQHRzNvdWQNVnq1dSeq1+IggQnHmUmYYuM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=u8sqDx7d; arc=none smtp.client-ip=209.85.167.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="u8sqDx7d" Received: by mail-lf1-f42.google.com with SMTP id 2adb3069b0e04-548878c6a5aso1580462e87.3 for ; Wed, 26 Feb 2025 00:59:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1740560371; x=1741165171; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=lJeDvmYfwTrdzYlRuhgm/ygX8U3uOitNLlW6Q4NvxDE=; b=u8sqDx7dF8J76pNEhn24VRvrilFHR8ZcwskAS9DZ0NRChS0agCzAChJhucM/F8IV1I dvzVOjZqqNyu2t6m3/U7A6WKFwm08CohYrFGEkRHxElZ2hZ5DtgodEW+YEs27sn+2Qn1 vgeoHXzWXJx//yIXnUd93ZsHTt12Ev4aGu6f6T6D/aviIwTW+hclWrnqXMiQYUlzkGdn ZY1YUz4FaYXcCKGTlJM41Z9CLFoFs21p/Z9EYVfTPYvNq3xRQlgJP8f3j4ghPysLmA8i x5F5m25IifjoMoOBW7S6UuL8WSvSaAs4Zvt2YVeZ/yCiH3i4Rg26usLRKt/ZTHu1bR1x +6fw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740560371; x=1741165171; 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=lJeDvmYfwTrdzYlRuhgm/ygX8U3uOitNLlW6Q4NvxDE=; b=H5nKKlRglka38hmsBrm8DpOKRWK5KCOhKraeR9+DhBRsgcnt0J/vOtYPhSGxFFdTjz 8BTmDzRLMy+wwS5nyRi2Dxt6/9NHV8alhzwXleJINk0/dmDMuodQkUr3pDBMl/JQPZSS Jq+rsPzrFRQZ9g+evCccN4XjjwSSqyd2AnSK6RCXCLsHIC71oXT5+UCbBA+AHC1bAqw7 Pl912XFtwhNNdUWa2Jhlooyv21rLtwd3OaVzmZ/PxkliRMAerunqseXWVE8hogbX8nl1 vB9pc4rHuRS+nFDbye5a9UMyEXtZe2Ivcs2drbPafZXFlga1Q0lbUD0yHqZ892QH5EIa zBbA== X-Forwarded-Encrypted: i=1; AJvYcCURixQEpy77pgEtI1MpmmWz1dQMWjFL3AMhvQvbIC4acpPZUIEQr6X0JxTO6wbDuMa+eQpZxBrKBLHrURmN@vger.kernel.org X-Gm-Message-State: AOJu0Yxb0ZlzvjIPlb6HX5rVGLuyhVz2Qdvf+94etz75NYX22D0Q1QGS Wm3twRLNlTfryFGmi/M3ElD/7DbwQzP0DqJL4ngPcAt9YNXLOHjPbzrvGdIAlck= X-Gm-Gg: ASbGncv0NCxsWyZAGKQRK/hJv9TUcTh8SVZhLzomCcolkyJOrn8O9LgmKEySTUMhOkX /+WB5RiIJWE+DsJ/i/OlVTIMhmZRPOh236UG2L+jTx4DxXrCaBsbq+7pIV+p48WZoortkElaWlc /LXqk9xfrQAJVPtQ8J7+x35J9c29Ekeo9oCTbxKuR/rPZ+kEaAyzlHPpxFwv+ejE3Z1JCiXDQES 29RPBa3JN0LQ/fBDOA33NG5Br8HIn30herb9G7S6w7Xalp0bOPX1Vdg+kID7p99Utgpv6U3veQM dSoMBr/uGYeeTWUJ/FGyXn1FtCsqDBQKUQ== X-Google-Smtp-Source: AGHT+IHnyRZE9xXoxSH11WZO/mjHOb7FtOwcpzIW8SeHSDOj8wlDRd0QXQhax5YrxPLGfiQ8QHD+/g== X-Received: by 2002:a05:6512:b98:b0:545:2c86:17e6 with SMTP id 2adb3069b0e04-5483912fcc4mr10487208e87.5.1740560370919; Wed, 26 Feb 2025 00:59:30 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30a819e0c49sm4556641fa.10.2025.02.26.00.59.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2025 00:59:29 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 26 Feb 2025 10:59:24 +0200 Subject: [PATCH v8 1/7] drm/msm/hdmi: switch to atomic bridge callbacks Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250226-bridge-hdmi-connector-v8-1-340af24b35cc@linaro.org> References: <20250226-bridge-hdmi-connector-v8-0-340af24b35cc@linaro.org> In-Reply-To: <20250226-bridge-hdmi-connector-v8-0-340af24b35cc@linaro.org> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten , Simona Vetter , Simona Vetter Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2282; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=f0rJpJCum+b7lqaI4sn4V9SXHt/v6K6WBKvJft3vbro=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnvtfsfP5JOx4k9UNQsIABWXjlycLBo0B9VJPQr V2fMgIBoe2JATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ77X7AAKCRCLPIo+Aiko 1fTVB/4gVuuKglGSNvRERQTsX298FmX2Q10UUHn8rmqstQrQ8oMQIL4EaDQp8VNkz1PLE/1bw9p ksul49Hd3DEFRM5mq8/7INGZ1FEwRZ7ZQr20Z1edKNZ7PUsgea7eUlODfTUbYlONna9hVUzi0yT t0QE8MLblgVWHsQ+oN0Wb0s64tF3dFG0Pk2n13YcIEjMvw/u6d5VEaY+ZrxkV1CV/Xs99XI/IiB 2WhjKiDSBtHxwbDhn5hviSxdlcMDBOMhSIVKkizA6v3tscwuKGbmAAp7GIIS9skFTEo8icdswxq QciDiWte6IZK26X18olApN11vmF8XCRoM8ygHZC4jcZiIasf X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A Change MSM HDMI bridge to use atomic_* callbacks in preparation to enablign the HDMI connector support. Acked-by: Maxime Ripard Reviewed-by: Abhinav Kumar Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c index 4a5b5112227f516dfc4279d0f319ec1e5b17f240..d839c71091dcdc3b020fcbba8d698d58ee7fc749 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c @@ -126,7 +126,8 @@ static void msm_hdmi_config_avi_infoframe(struct hdmi *hdmi) hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL1, val); } -static void msm_hdmi_bridge_pre_enable(struct drm_bridge *bridge) +static void msm_hdmi_bridge_atomic_pre_enable(struct drm_bridge *bridge, + struct drm_bridge_state *old_bridge_state) { struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge); struct hdmi *hdmi = hdmi_bridge->hdmi; @@ -152,7 +153,8 @@ static void msm_hdmi_bridge_pre_enable(struct drm_bridge *bridge) msm_hdmi_hdcp_on(hdmi->hdcp_ctrl); } -static void msm_hdmi_bridge_post_disable(struct drm_bridge *bridge) +static void msm_hdmi_bridge_atomic_post_disable(struct drm_bridge *bridge, + struct drm_bridge_state *old_bridge_state) { struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge); struct hdmi *hdmi = hdmi_bridge->hdmi; @@ -299,8 +301,11 @@ static enum drm_mode_status msm_hdmi_bridge_mode_valid(struct drm_bridge *bridge } static const struct drm_bridge_funcs msm_hdmi_bridge_funcs = { - .pre_enable = msm_hdmi_bridge_pre_enable, - .post_disable = msm_hdmi_bridge_post_disable, + .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, + .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, + .atomic_reset = drm_atomic_helper_bridge_reset, + .atomic_pre_enable = msm_hdmi_bridge_atomic_pre_enable, + .atomic_post_disable = msm_hdmi_bridge_atomic_post_disable, .mode_set = msm_hdmi_bridge_mode_set, .mode_valid = msm_hdmi_bridge_mode_valid, .edid_read = msm_hdmi_bridge_edid_read, From patchwork Wed Feb 26 08:59:25 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Baryshkov X-Patchwork-Id: 13991803 Received: from mail-lj1-f176.google.com (mail-lj1-f176.google.com [209.85.208.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5E39D224246 for ; Wed, 26 Feb 2025 08:59:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740560377; cv=none; b=OWWkDZcJvpREGHc5F05XzdHuESzgm7ZlCl6Q/uARH2cV/htBVUx15alr4U7HmoWO+zkgFOe3Rwl1yln3keyQU4L9k25u1cwX/mrLVytSBwuzbumsIZTRPMiQUiDeKUcSBpklSwyK9qrKuk7d7X7iiQ7L+5cMWxxG77JxdSPusJc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740560377; c=relaxed/simple; bh=m2TAoFMN3euF4DkEUBd426Xr5dS2tnI3Q7ZEQxtygnM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PvG0KX2vDOtQ3ATBxcv5Xw5j1l6/1IhKocwKM51QztD+47YHrhHafKPbr3czwH89Gsww3QdmdLtt2AHI9FvWgveXb/aA5GGEp1xKkOFjBKEE61c3XUW9HO1oUqd4kOj53nm8/85pe+x03LGTr2WHrAd8pbTkSoDg0dlPqHvVnss= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=zO3hiiWq; arc=none smtp.client-ip=209.85.208.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="zO3hiiWq" Received: by mail-lj1-f176.google.com with SMTP id 38308e7fff4ca-30a303a656aso68558491fa.0 for ; Wed, 26 Feb 2025 00:59:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1740560373; x=1741165173; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=a0zF5icXRhGBS22oaTFCfeFkUWLVA/EPLQBHYWMqBLg=; b=zO3hiiWqUTD7uD0jiBOzzzS/J1dq1ujkwuylbWtmRa6CRFORDO36W2Q28p3ll17VnU gIwePAGgnA+EiA4UxQdv9MaDHWAmwC0BRKrNW423R8CBdlqPCDShZiTxTILzmwae2eVV KVsUexzCZv7RpVAZX2RtQKb5yh3bKpQA5SDC6lCdKMsTNJ9z9ZMkwzKbcBgzMZjwmwu1 LCgtuskGMZmfziiBVUO+Vx0o7i6Azh48jPfUiiiKbhilDtOjP51ZwjyntKfwdnfcEwWG ENVEHU1JwtIbNMYpQxfXpLCum5VscrPL9TPHt8sQYCWdM6YcARWH5HYrJufYdah14u7+ oDgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740560373; x=1741165173; 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=a0zF5icXRhGBS22oaTFCfeFkUWLVA/EPLQBHYWMqBLg=; b=CTDzmvarbxOSc5gvKQV0lJ6M6BDc/VUhvNRgJr0oLmAURRYRHPo/dAh4PXAPMeUxKU DK95q0KlXti8ttZn3W9XXcDipEGifX7Ba4zyGUZw8SAmIYA7icrNQXYLmXok8H7gGlLw TaLPdC27Jalg9CCHMXLDhpRJ/RC9Nsp1ggTgJFNBtSwqH19blxOEyy8z6NJYzs2PCrvt FbG+sn5ncKKZw3hPUIfrUIqrzo8pJh42d6V1uvVYbrPBSTxmBH0FXV5wsNCLb6/bd1Vr w58Qkv9Ee2WxkCHVkyWvtKxMTspbySUHdJwXZ5g1ERaduhnQSDASoxp9LXTu/7Timlku 1m8Q== X-Forwarded-Encrypted: i=1; AJvYcCWp7ZWmTfQGgUddCZDBAgiI5cXOrF2URItXMlceeOwPEPa/Xo/dlDEUoBvPVaNmI1odWYerikGbKUy4/6A0@vger.kernel.org X-Gm-Message-State: AOJu0YyGHioS1ue3AD+So6IfEnpEQSxcbtDfD0TDHERu1zbieuxdrqBy XUpBlGIrp/Vl/nFsGZpMT+dsE/ZBLiktaJcQP56EjH08hWsupDZjgjHCXNWs/9c= X-Gm-Gg: ASbGncsZiIcsRGJgIdZNwlUdrypoZ5comgMrVSX7zsZkPPT8AFAxWWG/q4o6uWIGdmo iDs5f1BBVjTpKt23BC/CFM56iUeK0WmZlbm/w5gy5tqQEm2w9/gCkoL/ILOgBd5GZCxPwMGjPBw 7p1RYAZOwOf6KcMXUoNBC36a5qi4zGnRcXG2ITLB5JCA6y1+f7QUC/6Dl/aTG2tKnJnylVUqMHn 4ErY6WyJ2/3RfM5d7TG5MfSv1aMylIG3R6WwkoSQJjEVl60Md8lrPYrpi6MDMCYSwsnohcmHh3t wggN0msoLKHiu0iBeoSJp+SlD38kP77GiA== X-Google-Smtp-Source: AGHT+IHD8l95g4vI1vyQEz00LSL+SoA+aEIpEPr9+UtIPsacpfC1JVUKJm5+nMQSBt4UshFzPla3jA== X-Received: by 2002:a2e:96d0:0:b0:309:22ae:a6b3 with SMTP id 38308e7fff4ca-30a5b1a091amr89275911fa.18.1740560373370; Wed, 26 Feb 2025 00:59:33 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30a819e0c49sm4556641fa.10.2025.02.26.00.59.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2025 00:59:32 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 26 Feb 2025 10:59:25 +0200 Subject: [PATCH v8 2/7] drm/msm/hdmi: program HDMI timings during atomic_pre_enable Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250226-bridge-hdmi-connector-v8-2-340af24b35cc@linaro.org> References: <20250226-bridge-hdmi-connector-v8-0-340af24b35cc@linaro.org> In-Reply-To: <20250226-bridge-hdmi-connector-v8-0-340af24b35cc@linaro.org> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten , Simona Vetter , Simona Vetter Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3113; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=m2TAoFMN3euF4DkEUBd426Xr5dS2tnI3Q7ZEQxtygnM=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnvtfsOMZUZw+aUfLC3KFwKH0V9adcdPsnFq/AF fHNBmGlMgKJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ77X7AAKCRCLPIo+Aiko 1QaeCACEYYfh387FH+3M3cQHalQXk1AtFjbNI6xiNZkRNKKopeEywYblNV5zpUeCbgo0mARh2Mf hI68MqC8xQYbyIbvHvDpdUG3IQUxTgsdFOsUuYTxyw//MR3HqEvHlAe3RrOaIWboglM1kI2xemN akRMDiF+u4GzVp8FuwJcrZxPREePgMkEBOUCF9vjzqlqoi1svME1LLCUOQkq2XSnYXskH/eAzSD K+1MBc65J+fYPhW8cRWvNOhsty9KRBCngYpXpaHwggnC0XRbtUV2Nlix/IKOrnp/m7ywA3gf4Rm Kg58VWf8Vl0rggm5UUNuQ2kAGLUWXUT5OAKtZ3NYlMO5pfsA X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A The mode_set callback is deprecated, it doesn't get the drm_bridge_state, just mode-related argumetns. Also Abhinav pointed out that HDMI timings should be programmed before setting up HDMI PHY and PLL. Rework the code to program HDMI timings at the start of atomic_pre_enable(). Reviewed-by: Maxime Ripard Reviewed-by: Abhinav Kumar Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c index d839c71091dcdc3b020fcbba8d698d58ee7fc749..bd94b3a70f0e5e457a88f089b491103a8c09567b 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c @@ -126,15 +126,29 @@ static void msm_hdmi_config_avi_infoframe(struct hdmi *hdmi) hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL1, val); } +static void msm_hdmi_set_timings(struct hdmi *hdmi, + const struct drm_display_mode *mode); + static void msm_hdmi_bridge_atomic_pre_enable(struct drm_bridge *bridge, struct drm_bridge_state *old_bridge_state) { + struct drm_atomic_state *state = old_bridge_state->base.state; struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge); struct hdmi *hdmi = hdmi_bridge->hdmi; struct hdmi_phy *phy = hdmi->phy; + struct drm_encoder *encoder = bridge->encoder; + struct drm_connector *connector; + struct drm_connector_state *conn_state; + struct drm_crtc_state *crtc_state; DBG("power up"); + connector = drm_atomic_get_new_connector_for_encoder(state, encoder); + conn_state = drm_atomic_get_new_connector_state(state, connector); + crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc); + + msm_hdmi_set_timings(hdmi, &crtc_state->adjusted_mode); + if (!hdmi->power_on) { msm_hdmi_phy_resource_enable(phy); msm_hdmi_power_on(bridge); @@ -177,17 +191,12 @@ static void msm_hdmi_bridge_atomic_post_disable(struct drm_bridge *bridge, } } -static void msm_hdmi_bridge_mode_set(struct drm_bridge *bridge, - const struct drm_display_mode *mode, - const struct drm_display_mode *adjusted_mode) +static void msm_hdmi_set_timings(struct hdmi *hdmi, + const struct drm_display_mode *mode) { - struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge); - struct hdmi *hdmi = hdmi_bridge->hdmi; int hstart, hend, vstart, vend; uint32_t frame_ctrl; - mode = adjusted_mode; - hdmi->pixclock = mode->clock * 1000; hstart = mode->htotal - mode->hsync_start; @@ -306,7 +315,6 @@ static const struct drm_bridge_funcs msm_hdmi_bridge_funcs = { .atomic_reset = drm_atomic_helper_bridge_reset, .atomic_pre_enable = msm_hdmi_bridge_atomic_pre_enable, .atomic_post_disable = msm_hdmi_bridge_atomic_post_disable, - .mode_set = msm_hdmi_bridge_mode_set, .mode_valid = msm_hdmi_bridge_mode_valid, .edid_read = msm_hdmi_bridge_edid_read, .detect = msm_hdmi_bridge_detect, From patchwork Wed Feb 26 08:59:26 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Baryshkov X-Patchwork-Id: 13991804 Received: from mail-lj1-f174.google.com (mail-lj1-f174.google.com [209.85.208.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C3460226D07 for ; Wed, 26 Feb 2025 08:59:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740560380; cv=none; b=FAzGld+CMCevhdp90vmeP8zPrFOfVP6Cc/BzigqzQiDpvrfDBY1dWasL9JhUF4D7+szHDkgpUpDva6O9XsazDW1eYjMW3jds1YKy9zLpuTQGZ+1PLFIzDVWjHyd3TEipGe+rYUed0xPUZol41ISykA7KzDdXSnyK5xLFZj/Uk5o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740560380; c=relaxed/simple; bh=JWfMAzHKBrvjx8XsFlKCouyCn4qTWY6JSGqPvUIjrF8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QFW39Hj4InXrdZvgpChvKUKvjCQRwJz3JHFRK1/24D7WGPqJhNsKKKwwH/l6J2PbGnqOJHQDLzrnaWxMhGos/qBVZR/xxTl/5R60pionQZOLwglREKRLypWq/SuNVhFgHj2BIseQUjvWWS5ZdfsizN4xdlmWnKFt70RboathWlI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=GOUYR81/; arc=none smtp.client-ip=209.85.208.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="GOUYR81/" Received: by mail-lj1-f174.google.com with SMTP id 38308e7fff4ca-30795988ebeso69062901fa.3 for ; Wed, 26 Feb 2025 00:59:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1740560376; x=1741165176; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=L5UWZ36HDOSoNzBOvtjypUt2y7Tsh/Ad4uCiZepCnWw=; b=GOUYR81/nfolGm9dbjsx2u1v1wmdSHcWOEvXyJskqht83sUYIqBhw5cGIzVuCbGFdr 6whYMDkOswNizYTV6S58kmoFpnRaJzscFTkcJ31hTpVTG9cINiz4pi5d38EppHHzeHVh IkWC8xaPkV3JXmd6kIzeCcUJF0+4v3qFzYF55NXe+LiW8B08jZojtqbwEascIJjmnR7z sgENpZ3zeX3a3uTnz8IkQyDMetHag+pli3jdwHLxuAsUFp6+79S+n9kASbhks9ShpBsX bW2tK/8yy1d0HEy20LGR6BdCji8k9xUiTZLd3JAq8RGsO3LH1hv8Q9nMD+qgT7q4fUSc nBBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740560376; x=1741165176; 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=L5UWZ36HDOSoNzBOvtjypUt2y7Tsh/Ad4uCiZepCnWw=; b=aD8HP5p2orgEz7Sto7wuQXEajT4aoorQZmeuaOeTmqmN5Mot0ZIDOhuj7V1tBXuEax AoFeRDecMH+AKZm+r9QMZmuUfjb5VnB13uBKF8AAtAhvTv1vKoYeQ36I1q6Mnw6CXqpo sF1xpzh1eSNMcUO8bngko7gAt1aqVDZRrKyqNU8yWQI8e7ovKsKZSEBzs5W15+QatkVk 43wiMLmj91NW2krVkl4C+BRyjGOOY9kgqRLlPQvgNn103Q+J699ZxP8UhejnsUhqlSBJ 1ChVByse/0Bj3rulYShsAxjmaPFJTCZ5BIf6MaL+jnPoaKeKLLEDPRL24+mbTLAI88H1 rRRw== X-Forwarded-Encrypted: i=1; AJvYcCUpboXhDhPk8oWv5iwO+neRYyp/F6yDf6kp3Q/lT0Ak2N5ctBbk4eJxE1XEJmFMMMtigKuF0IutJXtu50Ku@vger.kernel.org X-Gm-Message-State: AOJu0YwFlBla+UauGH3lm7+Fmeko10120lgPZiH3+IODaLeiR7LTIxCb KjkgSt0ZWxiEacKx05QXBk/s2hvCDrkuma75d8UeMnYVl0eD0jNrhDGS1dR6hmk= X-Gm-Gg: ASbGncu1BBWS3TAspoDHb23rFVobKvs+yB8E+9gwlCIfwvxon5gSNFzfvWZekPud+B5 hlSBZQMwosQVCsq2HBZOxcX5eb1tyxsKPG2kyOGKR+qfCHTWRg3PdPiHOnhgDhB7DY8hp4yI6KP UWxeifbJ0gMGkVTzfiLCtst9WaJsvBxlBSapRGZA3x1Z+KshrSm2C/90GtbG/4Vitp8n/Nv82MQ C3+PcsYCt1NiIWRmg13yaldkGyKOKECThTzmbARfbCjoyRsg3Buw1PpMRzLiylniWRDj9/cuJi8 pMkR2z5ydXkY69Xko93+MqXTWGpa6w2Yig== X-Google-Smtp-Source: AGHT+IHIIJC0Ly6wdNlabD1waCmNI0TuQag3fOGe30xLR7weWWc+i6Q/Ev/C5ClkADg3xiX/HTMYXw== X-Received: by 2002:a2e:8696:0:b0:307:ce2b:ed82 with SMTP id 38308e7fff4ca-30a80c41b6emr38928271fa.22.1740560375891; Wed, 26 Feb 2025 00:59:35 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30a819e0c49sm4556641fa.10.2025.02.26.00.59.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2025 00:59:34 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 26 Feb 2025 10:59:26 +0200 Subject: [PATCH v8 3/7] drm/msm/hdmi: make use of the drm_connector_hdmi framework Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250226-bridge-hdmi-connector-v8-3-340af24b35cc@linaro.org> References: <20250226-bridge-hdmi-connector-v8-0-340af24b35cc@linaro.org> In-Reply-To: <20250226-bridge-hdmi-connector-v8-0-340af24b35cc@linaro.org> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten , Simona Vetter , Simona Vetter Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=20918; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=JWfMAzHKBrvjx8XsFlKCouyCn4qTWY6JSGqPvUIjrF8=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnvtftFP/t/sBn8qsKcLuhAYXMni2WfJ6zfM2c3 stvQnlrvmeJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ77X7QAKCRCLPIo+Aiko 1ceZB/9IlPZpE7DD/4dOZjY2FeJmdc+jPDh0E9HDOZ624ne3cIlIZnWxx5l70HfkEEHuGVL8VUt M5RitMpkKGl/nyAg+kk9s3EXSffvRD43PM2bASowuLyd2nTxJkFCxAFvSmPE8LE7myVJd/begzL zWx5qVgZNe8s6T+yL8uHf8TweUVeo07+yebvAzD9rvcWCW62ZsPox2xh55NJntSo6bnj0bqlMlk blFpRiaGpnnth7qrvf8asSRheamq/SC9WZtw5w9AOaFVHVmu1CnQE+Pz6C86G/oYg8eHyFuNuCZ bnaqS5CZZ9FxRlCkEiMRGyPCQBYaqhhNqiTgZm2XnKGaNG8b X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A Setup the HDMI connector on the MSM HDMI outputs. Make use of atomic_check hook and of the provided Infoframe infrastructure. Acked-by: Maxime Ripard Reviewed-by: Abhinav Kumar Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/msm/Kconfig | 2 + drivers/gpu/drm/msm/hdmi/hdmi.c | 45 ++------- drivers/gpu/drm/msm/hdmi/hdmi.h | 15 +-- drivers/gpu/drm/msm/hdmi/hdmi_audio.c | 72 ++++---------- drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 175 ++++++++++++++++++++++++--------- 5 files changed, 162 insertions(+), 147 deletions(-) diff --git a/drivers/gpu/drm/msm/Kconfig b/drivers/gpu/drm/msm/Kconfig index 7ec833b6d8292f8cb26cfe5582812f2754cd4d35..974bc7c0ea761147d3326bdce9039d6f26f290d0 100644 --- a/drivers/gpu/drm/msm/Kconfig +++ b/drivers/gpu/drm/msm/Kconfig @@ -170,6 +170,8 @@ config DRM_MSM_HDMI bool "Enable HDMI support in MSM DRM driver" depends on DRM_MSM default y + select DRM_DISPLAY_HDMI_HELPER + select DRM_DISPLAY_HDMI_STATE_HELPER help Compile in support for the HDMI output MSM DRM driver. It can be a primary or a secondary display on device. Note that this is used diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.c b/drivers/gpu/drm/msm/hdmi/hdmi.c index 37b3809c6bdd7c35aca6b475cb1f41c0ab4d3e6d..b14205cb9e977edd0d849e0eafe9b69c0da594bd 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi.c @@ -12,6 +12,7 @@ #include #include +#include #include #include "hdmi.h" @@ -165,8 +166,6 @@ int msm_hdmi_modeset_init(struct hdmi *hdmi, hdmi->dev = dev; hdmi->encoder = encoder; - hdmi_audio_infoframe_init(&hdmi->audio.infoframe); - ret = msm_hdmi_bridge_init(hdmi); if (ret) { DRM_DEV_ERROR(dev->dev, "failed to create HDMI bridge: %d\n", ret); @@ -254,40 +253,12 @@ static int msm_hdmi_audio_hw_params(struct device *dev, void *data, struct hdmi_codec_params *params) { struct hdmi *hdmi = dev_get_drvdata(dev); - unsigned int chan; - unsigned int channel_allocation = 0; unsigned int rate; - unsigned int level_shift = 0; /* 0dB */ - bool down_mix = false; + int ret; DRM_DEV_DEBUG(dev, "%u Hz, %d bit, %d channels\n", params->sample_rate, params->sample_width, params->cea.channels); - switch (params->cea.channels) { - case 2: - /* FR and FL speakers */ - channel_allocation = 0; - chan = MSM_HDMI_AUDIO_CHANNEL_2; - break; - case 4: - /* FC, LFE, FR and FL speakers */ - channel_allocation = 0x3; - chan = MSM_HDMI_AUDIO_CHANNEL_4; - break; - case 6: - /* RR, RL, FC, LFE, FR and FL speakers */ - channel_allocation = 0x0B; - chan = MSM_HDMI_AUDIO_CHANNEL_6; - break; - case 8: - /* FRC, FLC, RR, RL, FC, LFE, FR and FL speakers */ - channel_allocation = 0x1F; - chan = MSM_HDMI_AUDIO_CHANNEL_8; - break; - default: - return -EINVAL; - } - switch (params->sample_rate) { case 32000: rate = HDMI_SAMPLE_RATE_32KHZ; @@ -316,9 +287,12 @@ static int msm_hdmi_audio_hw_params(struct device *dev, void *data, return -EINVAL; } - msm_hdmi_audio_set_sample_rate(hdmi, rate); - msm_hdmi_audio_info_setup(hdmi, 1, chan, channel_allocation, - level_shift, down_mix); + ret = drm_atomic_helper_connector_hdmi_update_audio_infoframe(hdmi->connector, + ¶ms->cea); + if (ret) + return ret; + + msm_hdmi_audio_info_setup(hdmi, rate, params->cea.channels); return 0; } @@ -327,7 +301,8 @@ static void msm_hdmi_audio_shutdown(struct device *dev, void *data) { struct hdmi *hdmi = dev_get_drvdata(dev); - msm_hdmi_audio_info_setup(hdmi, 0, 0, 0, 0, 0); + drm_atomic_helper_connector_hdmi_clear_audio_infoframe(hdmi->connector); + msm_hdmi_audio_disable(hdmi); } static const struct hdmi_codec_ops msm_hdmi_audio_codec_ops = { diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.h b/drivers/gpu/drm/msm/hdmi/hdmi.h index a62d2aedfbb7239d37c826c4f96762f100a2be4a..8faad8440cf70f792da353978b990861b0677ed8 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi.h +++ b/drivers/gpu/drm/msm/hdmi/hdmi.h @@ -24,8 +24,8 @@ struct hdmi_platform_config; struct hdmi_audio { bool enabled; - struct hdmi_audio_infoframe infoframe; int rate; + int channels; }; struct hdmi_hdcp_ctrl; @@ -207,12 +207,6 @@ static inline int msm_hdmi_pll_8998_init(struct platform_device *pdev) /* * audio: */ -/* Supported HDMI Audio channels and rates */ -#define MSM_HDMI_AUDIO_CHANNEL_2 0 -#define MSM_HDMI_AUDIO_CHANNEL_4 1 -#define MSM_HDMI_AUDIO_CHANNEL_6 2 -#define MSM_HDMI_AUDIO_CHANNEL_8 3 - #define HDMI_SAMPLE_RATE_32KHZ 0 #define HDMI_SAMPLE_RATE_44_1KHZ 1 #define HDMI_SAMPLE_RATE_48KHZ 2 @@ -222,11 +216,8 @@ static inline int msm_hdmi_pll_8998_init(struct platform_device *pdev) #define HDMI_SAMPLE_RATE_192KHZ 6 int msm_hdmi_audio_update(struct hdmi *hdmi); -int msm_hdmi_audio_info_setup(struct hdmi *hdmi, bool enabled, - uint32_t num_of_channels, uint32_t channel_allocation, - uint32_t level_shift, bool down_mix); -void msm_hdmi_audio_set_sample_rate(struct hdmi *hdmi, int rate); - +int msm_hdmi_audio_info_setup(struct hdmi *hdmi, int rate, int channels); +int msm_hdmi_audio_disable(struct hdmi *hdmi); /* * hdmi bridge: diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_audio.c b/drivers/gpu/drm/msm/hdmi/hdmi_audio.c index 4c2058c4adc1001a12e10f35e88a6d58f3bd2fdc..0b91ed5eabd234ff3bca0c2dfaa159dd2e6a9df5 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_audio.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_audio.c @@ -7,9 +7,6 @@ #include #include "hdmi.h" -/* maps MSM_HDMI_AUDIO_CHANNEL_n consts used by audio driver to # of channels: */ -static int nchannels[] = { 2, 4, 6, 8 }; - /* Supported HDMI Audio sample rates */ #define MSM_HDMI_SAMPLE_RATE_32KHZ 0 #define MSM_HDMI_SAMPLE_RATE_44_1KHZ 1 @@ -74,16 +71,17 @@ static const struct hdmi_msm_audio_arcs *get_arcs(unsigned long int pixclock) int msm_hdmi_audio_update(struct hdmi *hdmi) { struct hdmi_audio *audio = &hdmi->audio; - struct hdmi_audio_infoframe *info = &audio->infoframe; const struct hdmi_msm_audio_arcs *arcs = NULL; bool enabled = audio->enabled; uint32_t acr_pkt_ctrl, vbi_pkt_ctrl, aud_pkt_ctrl; - uint32_t infofrm_ctrl, audio_config; + uint32_t audio_config; + + if (!hdmi->connector->display_info.is_hdmi) + return -EINVAL; + + DBG("audio: enabled=%d, channels=%d, rate=%d", + audio->enabled, audio->channels, audio->rate); - DBG("audio: enabled=%d, channels=%d, channel_allocation=0x%x, " - "level_shift_value=%d, downmix_inhibit=%d, rate=%d", - audio->enabled, info->channels, info->channel_allocation, - info->level_shift_value, info->downmix_inhibit, audio->rate); DBG("video: power_on=%d, pixclock=%lu", hdmi->power_on, hdmi->pixclock); if (enabled && !(hdmi->power_on && hdmi->pixclock)) { @@ -104,7 +102,6 @@ int msm_hdmi_audio_update(struct hdmi *hdmi) acr_pkt_ctrl = hdmi_read(hdmi, REG_HDMI_ACR_PKT_CTRL); vbi_pkt_ctrl = hdmi_read(hdmi, REG_HDMI_VBI_PKT_CTRL); aud_pkt_ctrl = hdmi_read(hdmi, REG_HDMI_AUDIO_PKT_CTRL1); - infofrm_ctrl = hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL0); audio_config = hdmi_read(hdmi, REG_HDMI_AUDIO_CFG); /* Clear N/CTS selection bits */ @@ -113,7 +110,6 @@ int msm_hdmi_audio_update(struct hdmi *hdmi) if (enabled) { uint32_t n, cts, multiplier; enum hdmi_acr_cts select; - uint8_t buf[14]; n = arcs->lut[audio->rate].n; cts = arcs->lut[audio->rate].cts; @@ -155,20 +151,12 @@ int msm_hdmi_audio_update(struct hdmi *hdmi) HDMI_ACR_1_N(n)); hdmi_write(hdmi, REG_HDMI_AUDIO_PKT_CTRL2, - COND(info->channels != 2, HDMI_AUDIO_PKT_CTRL2_LAYOUT) | + COND(audio->channels != 2, HDMI_AUDIO_PKT_CTRL2_LAYOUT) | HDMI_AUDIO_PKT_CTRL2_OVERRIDE); acr_pkt_ctrl |= HDMI_ACR_PKT_CTRL_CONT; acr_pkt_ctrl |= HDMI_ACR_PKT_CTRL_SEND; - /* configure infoframe: */ - hdmi_audio_infoframe_pack(info, buf, sizeof(buf)); - hdmi_write(hdmi, REG_HDMI_AUDIO_INFO0, - (buf[3] << 0) | (buf[4] << 8) | - (buf[5] << 16) | (buf[6] << 24)); - hdmi_write(hdmi, REG_HDMI_AUDIO_INFO1, - (buf[7] << 0) | (buf[8] << 8)); - hdmi_write(hdmi, REG_HDMI_GC, 0); vbi_pkt_ctrl |= HDMI_VBI_PKT_CTRL_GC_ENABLE; @@ -176,11 +164,6 @@ int msm_hdmi_audio_update(struct hdmi *hdmi) aud_pkt_ctrl |= HDMI_AUDIO_PKT_CTRL1_AUDIO_SAMPLE_SEND; - infofrm_ctrl |= HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SEND; - infofrm_ctrl |= HDMI_INFOFRAME_CTRL0_AUDIO_INFO_CONT; - infofrm_ctrl |= HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SOURCE; - infofrm_ctrl |= HDMI_INFOFRAME_CTRL0_AUDIO_INFO_UPDATE; - audio_config &= ~HDMI_AUDIO_CFG_FIFO_WATERMARK__MASK; audio_config |= HDMI_AUDIO_CFG_FIFO_WATERMARK(4); audio_config |= HDMI_AUDIO_CFG_ENGINE_ENABLE; @@ -190,17 +173,12 @@ int msm_hdmi_audio_update(struct hdmi *hdmi) vbi_pkt_ctrl &= ~HDMI_VBI_PKT_CTRL_GC_ENABLE; vbi_pkt_ctrl &= ~HDMI_VBI_PKT_CTRL_GC_EVERY_FRAME; aud_pkt_ctrl &= ~HDMI_AUDIO_PKT_CTRL1_AUDIO_SAMPLE_SEND; - infofrm_ctrl &= ~HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SEND; - infofrm_ctrl &= ~HDMI_INFOFRAME_CTRL0_AUDIO_INFO_CONT; - infofrm_ctrl &= ~HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SOURCE; - infofrm_ctrl &= ~HDMI_INFOFRAME_CTRL0_AUDIO_INFO_UPDATE; audio_config &= ~HDMI_AUDIO_CFG_ENGINE_ENABLE; } hdmi_write(hdmi, REG_HDMI_ACR_PKT_CTRL, acr_pkt_ctrl); hdmi_write(hdmi, REG_HDMI_VBI_PKT_CTRL, vbi_pkt_ctrl); hdmi_write(hdmi, REG_HDMI_AUDIO_PKT_CTRL1, aud_pkt_ctrl); - hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL0, infofrm_ctrl); hdmi_write(hdmi, REG_HDMI_AUD_INT, COND(enabled, HDMI_AUD_INT_AUD_FIFO_URUN_INT) | @@ -214,41 +192,29 @@ int msm_hdmi_audio_update(struct hdmi *hdmi) return 0; } -int msm_hdmi_audio_info_setup(struct hdmi *hdmi, bool enabled, - uint32_t num_of_channels, uint32_t channel_allocation, - uint32_t level_shift, bool down_mix) +int msm_hdmi_audio_info_setup(struct hdmi *hdmi, int rate, int channels) { - struct hdmi_audio *audio; - if (!hdmi) return -ENXIO; - audio = &hdmi->audio; - - if (num_of_channels >= ARRAY_SIZE(nchannels)) + if ((rate < 0) || (rate >= MSM_HDMI_SAMPLE_RATE_MAX)) return -EINVAL; - audio->enabled = enabled; - audio->infoframe.channels = nchannels[num_of_channels]; - audio->infoframe.channel_allocation = channel_allocation; - audio->infoframe.level_shift_value = level_shift; - audio->infoframe.downmix_inhibit = down_mix; + hdmi->audio.rate = rate; + hdmi->audio.channels = channels; + hdmi->audio.enabled = true; return msm_hdmi_audio_update(hdmi); } -void msm_hdmi_audio_set_sample_rate(struct hdmi *hdmi, int rate) +int msm_hdmi_audio_disable(struct hdmi *hdmi) { - struct hdmi_audio *audio; - if (!hdmi) - return; - - audio = &hdmi->audio; + return -ENXIO; - if ((rate < 0) || (rate >= MSM_HDMI_SAMPLE_RATE_MAX)) - return; + hdmi->audio.rate = 0; + hdmi->audio.channels = 2; + hdmi->audio.enabled = false; - audio->rate = rate; - msm_hdmi_audio_update(hdmi); + return msm_hdmi_audio_update(hdmi); } diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c index bd94b3a70f0e5e457a88f089b491103a8c09567b..4f8e4ffdb2e058ecf243bb319c12c444cb2e5200 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include "msm_kms.h" #include "hdmi.h" @@ -68,23 +70,17 @@ static void power_off(struct drm_bridge *bridge) #define AVI_IFRAME_LINE_NUMBER 1 -static void msm_hdmi_config_avi_infoframe(struct hdmi *hdmi) +static int msm_hdmi_config_avi_infoframe(struct hdmi *hdmi, + const u8 *buffer, size_t len) { - struct drm_crtc *crtc = hdmi->encoder->crtc; - const struct drm_display_mode *mode = &crtc->state->adjusted_mode; - union hdmi_infoframe frame; - u8 buffer[HDMI_INFOFRAME_SIZE(AVI)]; + u32 buf[4] = {}; u32 val; - int len; + int i; - drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, - hdmi->connector, mode); - - len = hdmi_infoframe_pack(&frame, buffer, sizeof(buffer)); - if (len < 0) { + if (len != HDMI_INFOFRAME_SIZE(AVI) || len - 3 > sizeof(buf)) { DRM_DEV_ERROR(&hdmi->pdev->dev, "failed to configure avi infoframe\n"); - return; + return -EINVAL; } /* @@ -93,37 +89,118 @@ static void msm_hdmi_config_avi_infoframe(struct hdmi *hdmi) * written to the LSB byte of AVI_INFO0 and the version is written to * the third byte from the LSB of AVI_INFO3 */ - hdmi_write(hdmi, REG_HDMI_AVI_INFO(0), + memcpy(buf, &buffer[3], len - 3); + + buf[3] |= buffer[1] << 24; + + for (i = 0; i < ARRAY_SIZE(buf); i++) + hdmi_write(hdmi, REG_HDMI_AVI_INFO(i), buf[i]); + + val = hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL1); + val |= HDMI_INFOFRAME_CTRL0_AVI_SEND | + HDMI_INFOFRAME_CTRL0_AVI_CONT; + hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL0, val); + + val = hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL1); + val &= ~HDMI_INFOFRAME_CTRL1_AVI_INFO_LINE__MASK; + val |= HDMI_INFOFRAME_CTRL1_AVI_INFO_LINE(AVI_IFRAME_LINE_NUMBER); + hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL1, val); + + return 0; +} + +static int msm_hdmi_config_audio_infoframe(struct hdmi *hdmi, + const u8 *buffer, size_t len) +{ + u32 val; + + if (len != HDMI_INFOFRAME_SIZE(AUDIO)) { + DRM_DEV_ERROR(&hdmi->pdev->dev, + "failed to configure audio infoframe\n"); + return -EINVAL; + } + + hdmi_write(hdmi, REG_HDMI_AUDIO_INFO0, buffer[3] | buffer[4] << 8 | buffer[5] << 16 | buffer[6] << 24); - hdmi_write(hdmi, REG_HDMI_AVI_INFO(1), + hdmi_write(hdmi, REG_HDMI_AUDIO_INFO1, buffer[7] | buffer[8] << 8 | buffer[9] << 16 | buffer[10] << 24); - hdmi_write(hdmi, REG_HDMI_AVI_INFO(2), - buffer[11] | - buffer[12] << 8 | - buffer[13] << 16 | - buffer[14] << 24); + val = hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL1); + val |= HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SEND | + HDMI_INFOFRAME_CTRL0_AUDIO_INFO_CONT | + HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SOURCE | + HDMI_INFOFRAME_CTRL0_AUDIO_INFO_UPDATE; + hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL0, val); + + return 0; +} + +static int msm_hdmi_bridge_clear_infoframe(struct drm_bridge *bridge, + enum hdmi_infoframe_type type) +{ + struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge); + struct hdmi *hdmi = hdmi_bridge->hdmi; + u32 val; + + switch (type) { + case HDMI_INFOFRAME_TYPE_AVI: + val = hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL0); + val &= ~(HDMI_INFOFRAME_CTRL0_AVI_SEND | + HDMI_INFOFRAME_CTRL0_AVI_CONT); + hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL0, val); - hdmi_write(hdmi, REG_HDMI_AVI_INFO(3), - buffer[15] | - buffer[16] << 8 | - buffer[1] << 24); + val = hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL1); + val &= ~HDMI_INFOFRAME_CTRL1_AVI_INFO_LINE__MASK; + hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL1, val); - hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL0, - HDMI_INFOFRAME_CTRL0_AVI_SEND | - HDMI_INFOFRAME_CTRL0_AVI_CONT); + break; - val = hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL1); - val &= ~HDMI_INFOFRAME_CTRL1_AVI_INFO_LINE__MASK; - val |= HDMI_INFOFRAME_CTRL1_AVI_INFO_LINE(AVI_IFRAME_LINE_NUMBER); - hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL1, val); + case HDMI_INFOFRAME_TYPE_AUDIO: + val = hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL0); + val &= ~(HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SEND | + HDMI_INFOFRAME_CTRL0_AUDIO_INFO_CONT | + HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SOURCE | + HDMI_INFOFRAME_CTRL0_AUDIO_INFO_UPDATE); + hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL0, val); + + val = hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL1); + val &= ~HDMI_INFOFRAME_CTRL1_AUDIO_INFO_LINE__MASK; + hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL1, val); + + break; + + default: + drm_dbg_driver(hdmi_bridge->base.dev, "Unsupported infoframe type %x\n", type); + } + + return 0; +} + +static int msm_hdmi_bridge_write_infoframe(struct drm_bridge *bridge, + enum hdmi_infoframe_type type, + const u8 *buffer, size_t len) +{ + struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge); + struct hdmi *hdmi = hdmi_bridge->hdmi; + + msm_hdmi_bridge_clear_infoframe(bridge, type); + + switch (type) { + case HDMI_INFOFRAME_TYPE_AVI: + return msm_hdmi_config_avi_infoframe(hdmi, buffer, len); + case HDMI_INFOFRAME_TYPE_AUDIO: + return msm_hdmi_config_audio_infoframe(hdmi, buffer, len); + default: + drm_dbg_driver(hdmi_bridge->base.dev, "Unsupported infoframe type %x\n", type); + return 0; + } } static void msm_hdmi_set_timings(struct hdmi *hdmi, @@ -147,18 +224,20 @@ static void msm_hdmi_bridge_atomic_pre_enable(struct drm_bridge *bridge, conn_state = drm_atomic_get_new_connector_state(state, connector); crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc); + hdmi->pixclock = conn_state->hdmi.tmds_char_rate; + msm_hdmi_set_timings(hdmi, &crtc_state->adjusted_mode); if (!hdmi->power_on) { msm_hdmi_phy_resource_enable(phy); msm_hdmi_power_on(bridge); hdmi->power_on = true; - if (hdmi->hdmi_mode) { - msm_hdmi_config_avi_infoframe(hdmi); + if (hdmi->hdmi_mode) msm_hdmi_audio_update(hdmi); - } } + drm_atomic_helper_connector_hdmi_update_infoframes(connector, state); + msm_hdmi_phy_powerup(phy, hdmi->pixclock); msm_hdmi_set_mode(hdmi, true); @@ -197,8 +276,6 @@ static void msm_hdmi_set_timings(struct hdmi *hdmi, int hstart, hend, vstart, vend; uint32_t frame_ctrl; - hdmi->pixclock = mode->clock * 1000; - hstart = mode->htotal - mode->hsync_start; hend = mode->htotal - mode->hsync_start + mode->hdisplay; @@ -276,18 +353,16 @@ static const struct drm_edid *msm_hdmi_bridge_edid_read(struct drm_bridge *bridg return drm_edid; } -static enum drm_mode_status msm_hdmi_bridge_mode_valid(struct drm_bridge *bridge, - const struct drm_display_info *info, - const struct drm_display_mode *mode) +static enum drm_mode_status msm_hdmi_bridge_tmds_char_rate_valid(const struct drm_bridge *bridge, + const struct drm_display_mode *mode, + unsigned long long tmds_rate) { struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge); struct hdmi *hdmi = hdmi_bridge->hdmi; const struct hdmi_platform_config *config = hdmi->config; struct msm_drm_private *priv = bridge->dev->dev_private; struct msm_kms *kms = priv->kms; - long actual, requested; - - requested = 1000 * mode->clock; + long actual; /* for mdp5/apq8074, we manage our own pixel clk (as opposed to * mdp4/dtv stuff where pixel clk is assigned to mdp/encoder @@ -295,15 +370,16 @@ static enum drm_mode_status msm_hdmi_bridge_mode_valid(struct drm_bridge *bridge */ if (kms->funcs->round_pixclk) actual = kms->funcs->round_pixclk(kms, - requested, hdmi_bridge->hdmi->encoder); + tmds_rate, + hdmi_bridge->hdmi->encoder); else if (config->pwr_clk_cnt > 0) - actual = clk_round_rate(hdmi->pwr_clks[0], requested); + actual = clk_round_rate(hdmi->pwr_clks[0], tmds_rate); else - actual = requested; + actual = tmds_rate; - DBG("requested=%ld, actual=%ld", requested, actual); + DBG("requested=%lld, actual=%ld", tmds_rate, actual); - if (actual != requested) + if (actual != tmds_rate) return MODE_CLOCK_RANGE; return 0; @@ -315,9 +391,11 @@ static const struct drm_bridge_funcs msm_hdmi_bridge_funcs = { .atomic_reset = drm_atomic_helper_bridge_reset, .atomic_pre_enable = msm_hdmi_bridge_atomic_pre_enable, .atomic_post_disable = msm_hdmi_bridge_atomic_post_disable, - .mode_valid = msm_hdmi_bridge_mode_valid, .edid_read = msm_hdmi_bridge_edid_read, .detect = msm_hdmi_bridge_detect, + .hdmi_tmds_char_rate_valid = msm_hdmi_bridge_tmds_char_rate_valid, + .hdmi_clear_infoframe = msm_hdmi_bridge_clear_infoframe, + .hdmi_write_infoframe = msm_hdmi_bridge_write_infoframe, }; static void @@ -349,8 +427,11 @@ int msm_hdmi_bridge_init(struct hdmi *hdmi) bridge->funcs = &msm_hdmi_bridge_funcs; bridge->ddc = hdmi->i2c; bridge->type = DRM_MODE_CONNECTOR_HDMIA; + bridge->vendor = "Qualcomm"; + bridge->product = "Snapdragon"; bridge->ops = DRM_BRIDGE_OP_HPD | DRM_BRIDGE_OP_DETECT | + DRM_BRIDGE_OP_HDMI | DRM_BRIDGE_OP_EDID; ret = devm_drm_bridge_add(hdmi->dev->dev, bridge); From patchwork Wed Feb 26 08:59:27 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Baryshkov X-Patchwork-Id: 13991805 Received: from mail-lj1-f182.google.com (mail-lj1-f182.google.com [209.85.208.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C8944226D07 for ; Wed, 26 Feb 2025 08:59:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740560383; cv=none; b=S+aLJBdJ02enN0qjpU5P2Pu/rUspN/VoNZm4eY7llXbw9ePXdI7sVOpHlwQV+kJYzTxDbXKeBcJc2oMeg7GraWm0Witg4r0r46VVoihJBcj5LsNvkomvzAOrDa0GuBA/1H5btsio3M7/S6WmVKDs4cq/UKPm4+w/9zjjx6492W4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740560383; c=relaxed/simple; bh=kwW90yaGXjA8kr6gl2QdxUU01rGJmaVy/t2QVZCPXNM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Qu16eUlnkO9RUcOpDPspYvhrnqqvKdLKVGRdQnitlGfMpKTmwG5Rrz7UECgBDs6Cjr7fuz2snohwsDap8cdoDJ0Qvt7pcrEVAYJiVcOi5ZdnoFMmb4iZWEa3ImOqGn73mktcswNSALNg55/O1IN1g1Ceno/qp6BncknTilds/+E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=jo16MHpz; arc=none smtp.client-ip=209.85.208.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="jo16MHpz" Received: by mail-lj1-f182.google.com with SMTP id 38308e7fff4ca-30a317e4c27so57551321fa.2 for ; Wed, 26 Feb 2025 00:59:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1740560380; x=1741165180; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=cQ4eiEd6P4+c5hYs9d14pRxOxpaCXWHbXbrnXxZW1Kg=; b=jo16MHpzdUxL16cDdqRO3SGa44BhZi6dYfxKyin8rrKwyyL4DSd4nE2e/twZuaRjOo U890jQM1AieA9IVPc3aaxA63zxz8j7V3DBHxVUh491u2vd25Cf2g27GQZf4q+00kDGAQ fqZ/1fTQbChbQYzu86b3bwoFd2e73/9RIxmLFdSx1VyQ5yzBfV/hB2gXh1z0zAWATGkt EBzBFQ/iqpFuWHnMFogPzrsafZ38ekkP6UexZHYtMxT+EeBFpLs3kAyXiTxH2WiyoRcT mWcga+vUKnIkRqa3h11nB+8izkDDbRFLg24PS5BmXzW2NmHHx6DTaWfJTqc5t/OlqHVz kScA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740560380; x=1741165180; 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=cQ4eiEd6P4+c5hYs9d14pRxOxpaCXWHbXbrnXxZW1Kg=; b=JYWPkLKd+4sD3zVRfxanGdk+Qf9D+29WwPRROKBzQi5xzTOHjO7Lq7dtAwtjwnG65D 1YoTt7KvqJ2PHVNJeISheDnxy+uCHo0tPZSo49XdD7y7MeMD8WSJ9RBPrTvz5ReL5o1S y4JTYMsUbVN6uaSI3pwGWbUcVeJUzgspuSRhNYRg2bbogFgY5UELFkkP/zcUWTWgaasE IotpZhrVBxZJIa3pr6HsvXLAg1u7XgEv5z0Zy7a8D1B8TUcVMNExAEzJB5xnLYM7xDn0 91TrjXFQfWt9QV/DGkJBDliZnQUMj43uMvEPGgZ9CW3YtO0v041jFbD7zVcAFiDZzDB/ ruxg== X-Forwarded-Encrypted: i=1; AJvYcCWR1wfRDRqL9vaisbV7KXMwM2ZlX6gPZWyERu616ZcJYb5as//EhAbx9eH2xsL2RqMoJF7QuwnEjTl5kMEU@vger.kernel.org X-Gm-Message-State: AOJu0YwWvzvaJmVHYvGUymkxqsKNhZhWzTHpADtMVISqCly9ue71oqzU +ssjkmfxAG5movaglsKaRXHqoNa0b5baAqz7xuxMbGCd+cUI/Gr+uW17LKC/RIo= X-Gm-Gg: ASbGncs4qQYE9VFkY/x7EhGpAmrFg3n7qirJE3SjJe0TG/13fPDmL5SLc7xURt2y1cv mj2NLn14y+ZQtIje1UueRItv4Tv0E35HZyl7NirwfkMdzq0Crv4IvMINkkbIepqsanUK7SSniOQ 4llI5TEAzIBLY+tcF2NKEk92paigij2l9BlrVeciMnGtoyg2pHJ6tLlEzs/qPtU8RAp6CDyepA4 TKOVc+JzNunWd5pvABoS8FKkoLF7DXHAgFciDkl0lpNP2ZLpmE7+tQbHw1vEgpHoMhGOclJJ0Ro n/UM6grwCa8O8w+kF6LjvW3DKlG9pVT7pQ== X-Google-Smtp-Source: AGHT+IF1clTdEycrBFNuFTiPE56nj/Flz5qWSUV9kEcLMdvGdwFejTQjfioG3m2nixQNVEMX5BHNDQ== X-Received: by 2002:a05:6512:3c91:b0:545:c89:2bb4 with SMTP id 2adb3069b0e04-548510d80afmr4432612e87.23.1740560378375; Wed, 26 Feb 2025 00:59:38 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30a819e0c49sm4556641fa.10.2025.02.26.00.59.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2025 00:59:37 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 26 Feb 2025 10:59:27 +0200 Subject: [PATCH v8 4/7] drm/msm/hdmi: get rid of hdmi_mode Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250226-bridge-hdmi-connector-v8-4-340af24b35cc@linaro.org> References: <20250226-bridge-hdmi-connector-v8-0-340af24b35cc@linaro.org> In-Reply-To: <20250226-bridge-hdmi-connector-v8-0-340af24b35cc@linaro.org> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten , Simona Vetter , Simona Vetter Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3269; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=kwW90yaGXjA8kr6gl2QdxUU01rGJmaVy/t2QVZCPXNM=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnvtftQ4pILGje/9Xkj/n1/36y5GpKicMEHfYGN m5T58jStRmJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ77X7QAKCRCLPIo+Aiko 1Q/9B/4hmyjCKkhj91Fq7PAf6m4xde2HWvAaKLVL1QPupeGrEJlCgwudGfde1fyN0yMWcInl4nx QCGccsZGNhICjlioHG/U0aRsXgGL+bXQ1zS/Lcm7YNc6+s5j4VB6iS8dYBvhBY4E44TfoH/dZuF oBgI9M2FQEeWB3I20IclPg1Iuf/cSD+aJbsT8VUGCn/NLyKz0T/8LABxNiHrZM6Zh0V2aIvuvoK wF1oIrmq9g/j7dnX7QEmQy74om5sivcS6RmSw69+llJIu0jUl3zzQnUXGLywVzZ0SSJhJTS7Ih6 tfQbLwwBkVEMfkXLa1kXHm1z8mXnyzV5DgbdpFjyX5g9Fl+U X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A Use connector->display_info.is_hdmi instead of manually using drm_detect_hdmi_monitor(). Acked-by: Maxime Ripard Reviewed-by: Abhinav Kumar Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/msm/hdmi/hdmi.c | 2 +- drivers/gpu/drm/msm/hdmi/hdmi.h | 2 -- drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 17 +++-------------- 3 files changed, 4 insertions(+), 17 deletions(-) diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.c b/drivers/gpu/drm/msm/hdmi/hdmi.c index b14205cb9e977edd0d849e0eafe9b69c0da594bd..6b77e0fb8d5ec218dfbf58215e2e12ad1dfb1b85 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi.c @@ -25,7 +25,7 @@ void msm_hdmi_set_mode(struct hdmi *hdmi, bool power_on) spin_lock_irqsave(&hdmi->reg_lock, flags); if (power_on) { ctrl |= HDMI_CTRL_ENABLE; - if (!hdmi->hdmi_mode) { + if (!hdmi->connector->display_info.is_hdmi) { ctrl |= HDMI_CTRL_HDMI; hdmi_write(hdmi, REG_HDMI_CTRL, ctrl); ctrl &= ~HDMI_CTRL_HDMI; diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.h b/drivers/gpu/drm/msm/hdmi/hdmi.h index 8faad8440cf70f792da353978b990861b0677ed8..cdd3bd4f37831f9a606a4c3627a48364f5d4025f 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi.h +++ b/drivers/gpu/drm/msm/hdmi/hdmi.h @@ -67,8 +67,6 @@ struct hdmi { /* the encoder we are hooked to (outside of hdmi block) */ struct drm_encoder *encoder; - bool hdmi_mode; /* are we in hdmi mode? */ - int irq; struct workqueue_struct *workq; diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c index 4f8e4ffdb2e058ecf243bb319c12c444cb2e5200..15ab0858105328c2f774ec1f79423614bbbaeb41 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c @@ -232,7 +232,7 @@ static void msm_hdmi_bridge_atomic_pre_enable(struct drm_bridge *bridge, msm_hdmi_phy_resource_enable(phy); msm_hdmi_power_on(bridge); hdmi->power_on = true; - if (hdmi->hdmi_mode) + if (connector->display_info.is_hdmi) msm_hdmi_audio_update(hdmi); } @@ -264,7 +264,7 @@ static void msm_hdmi_bridge_atomic_post_disable(struct drm_bridge *bridge, if (hdmi->power_on) { power_off(bridge); hdmi->power_on = false; - if (hdmi->hdmi_mode) + if (hdmi->connector->display_info.is_hdmi) msm_hdmi_audio_update(hdmi); msm_hdmi_phy_resource_disable(phy); } @@ -320,7 +320,7 @@ static void msm_hdmi_set_timings(struct hdmi *hdmi, DBG("frame_ctrl=%08x", frame_ctrl); hdmi_write(hdmi, REG_HDMI_FRAME_CTRL, frame_ctrl); - if (hdmi->hdmi_mode) + if (hdmi->connector->display_info.is_hdmi) msm_hdmi_audio_update(hdmi); } @@ -339,17 +339,6 @@ static const struct drm_edid *msm_hdmi_bridge_edid_read(struct drm_bridge *bridg hdmi_write(hdmi, REG_HDMI_CTRL, hdmi_ctrl); - if (drm_edid) { - /* - * FIXME: This should use connector->display_info.is_hdmi from a - * path that has read the EDID and called - * drm_edid_connector_update(). - */ - const struct edid *edid = drm_edid_raw(drm_edid); - - hdmi->hdmi_mode = drm_detect_hdmi_monitor(edid); - } - return drm_edid; } From patchwork Wed Feb 26 08:59:28 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Baryshkov X-Patchwork-Id: 13991806 Received: from mail-lj1-f173.google.com (mail-lj1-f173.google.com [209.85.208.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D5A79238154 for ; Wed, 26 Feb 2025 08:59:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740560384; cv=none; b=JURz0Nv0DsS5xjIkZPs5uyRGsp3P6L67x+YRJWn8e0pUQMcuntxl/p6OBt7JTVnJso9S6TObGwhLCtW93QDL9Cjk+zvOgKaJkqTk1S5BYt33aYyfaM7d2imIvWwqk0ASHWdbbvc4dWu8qTbck/b4AUiodOF8i0VAuZZPEBmr5Vc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740560384; c=relaxed/simple; bh=KlCjBmWN3HQI30P1/iEnVtV7zXNb45CFcF9NRTzfcWY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CkesaxEA1Hs2IpN4p5AGuDbW7hCYsXtlIds8CY2uU6tQ3PvMZSWlf48YFLtAN/SXaAFG2OVLcvv6JCKnpo55U4afSpP+OFavigivCGENaig9Ni1m9xSWGdSzqJpa/XIaJ9YE83MCWr5eJdJqggROXkCx+7BGrpnbNp8PEnmavkI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=TabCXKOo; arc=none smtp.client-ip=209.85.208.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="TabCXKOo" Received: by mail-lj1-f173.google.com with SMTP id 38308e7fff4ca-30a2d4b61e4so48084311fa.1 for ; Wed, 26 Feb 2025 00:59:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1740560381; x=1741165181; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=CHcNOzm1hcrclCZti3P3V9XcVq0n02C20x1XRNCo8a4=; b=TabCXKOo6cTMFHArUU4PqFzzcG9vtPem5ac4jUtUSHQptsT9bt1t6dJaTEmPnfzPXT nejdbee+Ri8uGhciQFhbpENNr/k/b1v49sSe46GyEAnULJDyT/JpsK1MTAo2CLRKiaNm TcoZeBXGJy3ucp61rxdhJSHaRCDcIWeKWSF35wKLeo5rS2PWtBG2HqVaOWd7NdeTN98b hQObmtUz87AwhG0fqduqwFwpacmCTsHbKbQaN6xalGgj1skKcx+OBcTHyB11FFOTEHxU B/6NHGCzMn1NxBMUga3GOxtHregOJGzMzIwBXs9zGTS9UMuzxAWC15HPtmoo0Rs5I78i 9XYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740560381; x=1741165181; 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=CHcNOzm1hcrclCZti3P3V9XcVq0n02C20x1XRNCo8a4=; b=pOkzJK1/bcucWj7UgqbjfvY18k8faGivcf7IHprKYCbAY79t0rrLfePdTl4wEuE47G 5Gy/U/f/R/q4WFo7k+C0z7TWPaP4jGZFi41Uw9ENOaw4U86SeaYsSRD4c1PdZq3FdF9k 9VACZXMnvmSZdo30YSWmx6P6EN7F/z4Lg5vC5oaZZ64TqAFzQ6AIxS95P4mCvriGe0kv 1y9c4kSqCPlKkpFVa5STrL9D/VxXrHAQazAXjaAHYB8o+V1pUevYICm4hUvIsPsHmIjb o7STs7LoFUpaElAzuSb5XPuKfJX39cKBkIOpjTO7l3Y8oEjBaNxJGV7/qqDEQey+UYp2 nuwg== X-Forwarded-Encrypted: i=1; AJvYcCUUwEyyHvuqNARjmmbc1Vvk8IBkxmSCslj1fkTktELUHDNjpK17Xkfinf3TxMZoDcL7xyrOflFogXr1n4hf@vger.kernel.org X-Gm-Message-State: AOJu0YzR7jkGynDxbmqWQPa4rLqreG37RP6utDWloDQsscQn2a3E1wkz QfgTdOTS7eVMDbGyxAFFnfxwVfQEWKwJXg11xoDKVqbny9+Ye4xT/iKOlSA9QFc= X-Gm-Gg: ASbGncsqDf7xVWaHeh2Mk4k7MQfcJr6sq8IlCExPBG7LoZs01U3IsTvhQzaV850/Gea 10aP4qlSFvEPxX9cB5CBpP0lkqxlj3SwMAj3U3aFqCT5Xzh6+zJRJEY9TTtGhr7HBCom1YlLUuf mg9U4H+M5HyjcbTMTWS8cgI1vFwVeHVAU0E03HmPVCF7WWnz0WuuLAWw4cOdxxq81w4Up2Fxujq TIfy4Se5ZfDKyCvmttKyzhTcRWliZ7fklPYc1LZWPnXJOLStu6TmYMJ/OQ1RFxmbeq+j0v999IM zB8nfTnaKM9sQgnu1hKEDz09yrUwMixg5Q== X-Google-Smtp-Source: AGHT+IFIstiUWb828AgIqSu/ljVx7698UENLpRl0AsY21WG4mplxCihJ20chMJifNN+VTAFh8RwL3Q== X-Received: by 2002:a2e:b609:0:b0:308:ec6f:7022 with SMTP id 38308e7fff4ca-30b791832cbmr23531521fa.17.1740560380799; Wed, 26 Feb 2025 00:59:40 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30a819e0c49sm4556641fa.10.2025.02.26.00.59.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2025 00:59:39 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 26 Feb 2025 10:59:28 +0200 Subject: [PATCH v8 5/7] drm/msm/hdmi: update HDMI_GEN_PKT_CTRL_GENERIC0_UPDATE definition Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250226-bridge-hdmi-connector-v8-5-340af24b35cc@linaro.org> References: <20250226-bridge-hdmi-connector-v8-0-340af24b35cc@linaro.org> In-Reply-To: <20250226-bridge-hdmi-connector-v8-0-340af24b35cc@linaro.org> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten , Simona Vetter , Simona Vetter Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1225; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=KlCjBmWN3HQI30P1/iEnVtV7zXNb45CFcF9NRTzfcWY=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnvtftzKFbgYCMbYXDtuTbkps1sLO/1BiE+TJuB fQwesvAqTOJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ77X7QAKCRCLPIo+Aiko 1TsuB/4pVV9CMv49UiMTJIEgL+qiw5buub248rfTYgGygTN/itp4QgFwwr0+m/bI+EZhR80wdXe SeTxFF6CBjSL+yR+/JP22/h73WF7RhXo+92/5L+l57liwAENoxErqEu+5X19KIwKlbxnXRNh007 YEA9AUa3SFYTENk9t44L4glEILLtjW15xp5uR+ImONmslyIE3nB2sIKusOUr3VGXTY+AAMCTNt9 nfPZckgIIHRwEgyAFl55ZRscpnOgLWSI3mLS9pWbEPFqhOL9IPnVoJ9z5jcApJJiUhjuj7V1nX+ BApcipfWgqtuiNniAYB0g+s54XmYhvEVgrj/okw70eq6ru7s X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A The GENERIC0_UPDATE field is a single bit. Redefine it as boolean to simplify its usage in the driver. Reviewed-by: Abhinav Kumar Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/msm/registers/display/hdmi.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/msm/registers/display/hdmi.xml b/drivers/gpu/drm/msm/registers/display/hdmi.xml index 1cf1b14fbd919e041fd7ac8a0731d554d4468f4f..0ebb96297dae80940dc8a918d26cd58ff2e6f81a 100644 --- a/drivers/gpu/drm/msm/registers/display/hdmi.xml +++ b/drivers/gpu/drm/msm/registers/display/hdmi.xml @@ -131,7 +131,7 @@ xsi:schemaLocation="https://gitlab.freedesktop.org/freedreno/ rules-fd.xsd"> --> - + From patchwork Wed Feb 26 08:59:29 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Baryshkov X-Patchwork-Id: 13991807 Received: from mail-lf1-f50.google.com (mail-lf1-f50.google.com [209.85.167.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 86A56238162 for ; Wed, 26 Feb 2025 08:59:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740560386; cv=none; b=JyxJq5DJn+gm+g9KRmFE5o5WGQiEwlJKIpqYKEBU5Z8zOi0nBhCeD9nteFKqgqTGlRfXQuveZJBoWOfE2u3JuaFybuXVt+cyQjVf4RBOcJkdXnpIYX+9H2gq+RvVb1M5DhO0o5nnaDAKWVtHkAjOW5i1+FrwcNvhmtmIXtKRxcM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740560386; c=relaxed/simple; bh=spKKvIsUEXwYtFbU2ADRWxlKua9ZC3kOdX8BM/6IO2g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gxZBQbcF09SPkhPuLOwHbVqJwWBiN8MjXtKP63Bme4E1WlOqTEPRoc+xn1zgA6jLhj+a1LW9pAft8OiSa+uScA3nkclfOyz6/94GNJIZUk6VcqnhWkNwNseP1NDSoGAR2ProbFm5L/J/RddJUNwIgdvHCw66g2ykFnTlHkpRXlg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=bF6KmQEm; arc=none smtp.client-ip=209.85.167.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="bF6KmQEm" Received: by mail-lf1-f50.google.com with SMTP id 2adb3069b0e04-5461dab4bfdso7780072e87.3 for ; Wed, 26 Feb 2025 00:59:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1740560383; x=1741165183; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=HxAcg2Edh0LLCX/q03x2dqp484sdB8Gfc9kAJ/WMpN4=; b=bF6KmQEm6fC8ufMAkCad4UNvibDbEiQgHqcLsIo57g+EV97jpMn+yzyMngi4mao1Tn bFo4yioA5IuU8E5e5MR2tNYN7jy62lp4euZurHV5iv/yzB6ItM4JjvWr8oDjwIH0tQ/t RwVheWAQphyNPdHSy2usxT50Fo3pr+rH+pLkx2/LERAwsxuZdnPgkPN72qIq3aueQz3t ljtSm/wRk9EHPv6tQL7LULaSXKBlLr4o5Wijq0wSixHiX0HoHHMmxppuH4Q7iJjc6gr2 Eo39L+nwgxk6tE0WfOxIj+Cl7A74CwNs4oraSzc8exg5T9Ndmr/GEZb0YtZh3mihChou G9mw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740560383; x=1741165183; 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=HxAcg2Edh0LLCX/q03x2dqp484sdB8Gfc9kAJ/WMpN4=; b=QB3xLfUO3Qpi1RMQjOsCmNp4sY0RcKlCtN26pcgOA6mQkTjoy9KrPP/zXEgm2tAved 0hk5IvPj7ECmm4VHfhE4rqiK/GJWQ1YX7Q3g21e2wEFdHenyd52zV/75X05SeFNzPkrg PN88vZFH/VhVOP+SbknZIa6JR2KVd3xv/tafRZvqrL4Un5zN6N69QSpHVc+YgZ3jTXQj oD0+oju7uyemL/v4O3xDVyC0xBbENV45HZgAdjNZtOaLsWvjkX4WWDCGvN8MAOI9qI79 HcZ1Is+rKQyKjd0GcTfN3s1dF/JMeyJjg49eeFf+RQb12lRsaRrY9Cz/5IBtH/QZlqHK cFxQ== X-Forwarded-Encrypted: i=1; AJvYcCUDCH7qIB6jQZceZDFHhnjV3pKe0grMgGfeAW4litwzAkHWVjpscI1GmrVbpU/v4wIy339nI8OiOWheAxtu@vger.kernel.org X-Gm-Message-State: AOJu0Yw32v+36SIrSEpvQSuvjShAPUbqwiug4/1T2LO4HjzzLarOk3CH /tEUu2LlLmHlZyRVQ8zR8WcmgFrhItpeZfk52MPLfCM2IPSpyhfKr1wx46pd9yM= X-Gm-Gg: ASbGncsHcPVDHpum3rzAZK/17hW0pnOgy1kZmxtqRZdGinxrGXzpOuoHuMT/r2vQKIS f7y4ZtaNDqNhwxVzlov7UUQDb9fEEbiCDCjELkxFyKThCZvNupVrFT6ge9Ot6UV6qBFEdSuH4nR NTGTBKi4TkGR0Fes9kROYgV80EXzfeIKP87JapM1G9krUs2ZKssZv9wLGYC1BC9M7g5oGZ/ZJ8V lrjlJ4bZ8XSGpVjOQa6r85Gy3V++RWjl6ECtzv8F3t6X0Ma9rNIf+Dmj7KpxppSVxHJCFX5halT ky3qTD3rVAJu4fRM9lSwFRqcqIxGX3Wznw== X-Google-Smtp-Source: AGHT+IFo+WGQZv/2HHPDxvc16/ldl7ZK79qJBQmkGWyMeSV3pDc9yvGidvBoz4ORQ7EVM5XREMFT6g== X-Received: by 2002:a05:6512:3b06:b0:545:2e85:c152 with SMTP id 2adb3069b0e04-54838f4c9d8mr11853120e87.34.1740560382489; Wed, 26 Feb 2025 00:59:42 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30a819e0c49sm4556641fa.10.2025.02.26.00.59.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2025 00:59:41 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 26 Feb 2025 10:59:29 +0200 Subject: [PATCH v8 6/7] drm/msm/hdmi: also send the SPD and HDMI Vendor Specific InfoFrames Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250226-bridge-hdmi-connector-v8-6-340af24b35cc@linaro.org> References: <20250226-bridge-hdmi-connector-v8-0-340af24b35cc@linaro.org> In-Reply-To: <20250226-bridge-hdmi-connector-v8-0-340af24b35cc@linaro.org> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten , Simona Vetter , Simona Vetter Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4777; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=spKKvIsUEXwYtFbU2ADRWxlKua9ZC3kOdX8BM/6IO2g=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnvtftXifKCqVrCyjGdTISkAmAEKpl+UusHqw7J liRrBG3F8KJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ77X7QAKCRCLPIo+Aiko 1YE5CACuM/zNqvGkIJ71dxbuQhP4b4ogbNqVS6jh+xo6Is38O6E90kX3zS3FVweT5SqnmJXy//0 H0vvA5pf5YVLDM+M4m6bRTLA7XJs1eNrN9/Qw3kPoxKeR80jn8nPvECyVME3UvD47OgUjSI/3zQ O3RbWP6zs8/nLA6PoYyc9UvXBaDEl7qkO9Oxvmo/7paHsP2HBcdYaTUF22+x6UqC6njkPEk4oxB ngmCOCf16/J92GxV1qxo80XsECIruO037m+iIl6LdeL6vhKygL1AO+68VH4pgsD2hAvNqYQALTY uFPXleqUNTS28xjOs7Iu6tvODgjah7n6ZA5i7XX8F+ZNcqm5 X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A Extend the driver to send SPD and HDMI Vendor Specific InfoFrames. While the HDMI block has special block to send HVS InfoFrame, use GENERIC0 block instead. VENSPEC_INFO registers pack frame data in a way that requires manual repacking in the driver, while GENERIC0 doesn't have such format requirements. The msm-4.4 kernel uses GENERIC0 to send HDR InfoFrame which we do not at this point anyway. Acked-by: Maxime Ripard Reviewed-by: Abhinav Kumar Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 93 ++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c index 15ab0858105328c2f774ec1f79423614bbbaeb41..aee75eee3d4244cd95e44df46d65b8e3e53de735 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c @@ -69,6 +69,8 @@ static void power_off(struct drm_bridge *bridge) } #define AVI_IFRAME_LINE_NUMBER 1 +#define SPD_IFRAME_LINE_NUMBER 1 +#define VENSPEC_IFRAME_LINE_NUMBER 3 static int msm_hdmi_config_avi_infoframe(struct hdmi *hdmi, const u8 *buffer, size_t len) @@ -142,6 +144,74 @@ static int msm_hdmi_config_audio_infoframe(struct hdmi *hdmi, return 0; } +static int msm_hdmi_config_spd_infoframe(struct hdmi *hdmi, + const u8 *buffer, size_t len) +{ + u32 buf[7] = {}; + u32 val; + int i; + + if (len != HDMI_INFOFRAME_SIZE(SPD) || len - 3 > sizeof(buf)) { + DRM_DEV_ERROR(&hdmi->pdev->dev, + "failed to configure SPD infoframe\n"); + return -EINVAL; + } + + /* checksum gets written together with the body of the frame */ + hdmi_write(hdmi, REG_HDMI_GENERIC1_HDR, + buffer[0] | + buffer[1] << 8 | + buffer[2] << 16); + + memcpy(buf, &buffer[3], len - 3); + + for (i = 0; i < ARRAY_SIZE(buf); i++) + hdmi_write(hdmi, REG_HDMI_GENERIC1(i), buf[i]); + + val = hdmi_read(hdmi, REG_HDMI_GEN_PKT_CTRL); + val |= HDMI_GEN_PKT_CTRL_GENERIC1_SEND | + HDMI_GEN_PKT_CTRL_GENERIC1_CONT | + HDMI_GEN_PKT_CTRL_GENERIC1_LINE(SPD_IFRAME_LINE_NUMBER); + hdmi_write(hdmi, REG_HDMI_GEN_PKT_CTRL, val); + + return 0; +} + +static int msm_hdmi_config_hdmi_infoframe(struct hdmi *hdmi, + const u8 *buffer, size_t len) +{ + u32 buf[7] = {}; + u32 val; + int i; + + if (len < HDMI_INFOFRAME_HEADER_SIZE + HDMI_VENDOR_INFOFRAME_SIZE || + len - 3 > sizeof(buf)) { + DRM_DEV_ERROR(&hdmi->pdev->dev, + "failed to configure HDMI infoframe\n"); + return -EINVAL; + } + + /* checksum gets written together with the body of the frame */ + hdmi_write(hdmi, REG_HDMI_GENERIC0_HDR, + buffer[0] | + buffer[1] << 8 | + buffer[2] << 16); + + memcpy(buf, &buffer[3], len - 3); + + for (i = 0; i < ARRAY_SIZE(buf); i++) + hdmi_write(hdmi, REG_HDMI_GENERIC0(i), buf[i]); + + val = hdmi_read(hdmi, REG_HDMI_GEN_PKT_CTRL); + val |= HDMI_GEN_PKT_CTRL_GENERIC0_SEND | + HDMI_GEN_PKT_CTRL_GENERIC0_CONT | + HDMI_GEN_PKT_CTRL_GENERIC0_UPDATE | + HDMI_GEN_PKT_CTRL_GENERIC0_LINE(VENSPEC_IFRAME_LINE_NUMBER); + hdmi_write(hdmi, REG_HDMI_GEN_PKT_CTRL, val); + + return 0; +} + static int msm_hdmi_bridge_clear_infoframe(struct drm_bridge *bridge, enum hdmi_infoframe_type type) { @@ -176,6 +246,25 @@ static int msm_hdmi_bridge_clear_infoframe(struct drm_bridge *bridge, break; + case HDMI_INFOFRAME_TYPE_SPD: + val = hdmi_read(hdmi, REG_HDMI_GEN_PKT_CTRL); + val &= ~(HDMI_GEN_PKT_CTRL_GENERIC1_SEND | + HDMI_GEN_PKT_CTRL_GENERIC1_CONT | + HDMI_GEN_PKT_CTRL_GENERIC1_LINE__MASK); + hdmi_write(hdmi, REG_HDMI_GEN_PKT_CTRL, val); + + break; + + case HDMI_INFOFRAME_TYPE_VENDOR: + val = hdmi_read(hdmi, REG_HDMI_GEN_PKT_CTRL); + val &= ~(HDMI_GEN_PKT_CTRL_GENERIC0_SEND | + HDMI_GEN_PKT_CTRL_GENERIC0_CONT | + HDMI_GEN_PKT_CTRL_GENERIC0_UPDATE | + HDMI_GEN_PKT_CTRL_GENERIC0_LINE__MASK); + hdmi_write(hdmi, REG_HDMI_GEN_PKT_CTRL, val); + + break; + default: drm_dbg_driver(hdmi_bridge->base.dev, "Unsupported infoframe type %x\n", type); } @@ -197,6 +286,10 @@ static int msm_hdmi_bridge_write_infoframe(struct drm_bridge *bridge, return msm_hdmi_config_avi_infoframe(hdmi, buffer, len); case HDMI_INFOFRAME_TYPE_AUDIO: return msm_hdmi_config_audio_infoframe(hdmi, buffer, len); + case HDMI_INFOFRAME_TYPE_SPD: + return msm_hdmi_config_spd_infoframe(hdmi, buffer, len); + case HDMI_INFOFRAME_TYPE_VENDOR: + return msm_hdmi_config_hdmi_infoframe(hdmi, buffer, len); default: drm_dbg_driver(hdmi_bridge->base.dev, "Unsupported infoframe type %x\n", type); return 0; From patchwork Wed Feb 26 08:59:30 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Baryshkov X-Patchwork-Id: 13991808 Received: from mail-lj1-f182.google.com (mail-lj1-f182.google.com [209.85.208.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E38072459D7 for ; Wed, 26 Feb 2025 08:59:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740560389; cv=none; b=T/k+EBnjMWkcyhRpNgtuU+WTgeIZ4wN67hRn8trKXJh5ovW5IRosz733mwWg3u2hfpC1ReBc+sWL0T07IMMJ89XES2NvNV/1d0rL1H8c3iBs4siSTiHvGbXWyCzlV2iIjMVb//bSMJQcTMW8NKbaRPBRpLy5Q5aUVtQMcgKww6g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740560389; c=relaxed/simple; bh=jCnB9nRWDX2Sto2qyIJmSafVo3Vaxjg8eV0IBfZcuDw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XSlzgOpjQas1DYxajTuPeJq0mLK1X4hGJAUrle65cRn0UuUdCiPoifJgM62k4wDobpKSuqDEgHnRglmNSbECwWtoSs1a9NPeMqROJ9Hr20JGJd9UswEv4Dfe3L5F1HwzJ8geTUX/886SsxJGLYOORoODZihiUTvAQ6hBTQF33ls= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=URpMX+A0; arc=none smtp.client-ip=209.85.208.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="URpMX+A0" Received: by mail-lj1-f182.google.com with SMTP id 38308e7fff4ca-30a69c1a8d3so36837301fa.3 for ; Wed, 26 Feb 2025 00:59:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1740560385; x=1741165185; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=rL+D8qDRnHL8DVLPlIP7FF7uRot9P+Ldg7WswD3BRiU=; b=URpMX+A0nes2ZDL05C9h19z6CMmXm9eqb7yaP5oVBmucMCYZRf8lQP0rZhcO7KZlDj nVWidHz95AjFshiU/++ZYEj2vSDB13RQe/EWIr/eMsk+jLa7NUFF+Nlj3fgEcHQb0rFK HFJHdmuIDnY2/UFBoGCYMSL22ZWnfAhkrcr89c3L5A44DQHxxJXCzGE8PUv0yf53Mzgv 9LGGmcCy10OJ6SguF1wN5xulNaPPN/Hoj3HD/UVPOjB4J84U5SuEelAhAz9Y2+WlgJHS OdJup9P0MUBTI4PyiuT5g/OripnEHaYKG3XMO9MND3J7xk3YAp/mUpGUWgWnhlSNgaur M0Hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740560385; x=1741165185; 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=rL+D8qDRnHL8DVLPlIP7FF7uRot9P+Ldg7WswD3BRiU=; b=t+MsNd5IAxXCIbFewrIepIrzvq07jpqa0s8xJLt5lebcUcXJCEz+6Z50JIEt12A006 KCS3mQdsErS0zy5mX0Pu7aWIfBgX9aoM/OwlgTxSoRB8R1JUszLQg3EopLotHAa9Rd9f UJUVamQuPxFFitLBzzTK3vARch0ie9r75HzvrnRj5fuJMsMC7AP4S+YUtQ8PYZzofJTq pG4JC/26OH9UkGEmS+Xvm66C898TeARkZckIUjnBbkOQyeVMe3yZmklnoxfhZgIFyJhL cZ3iEF5QmRJkbTDHn291acPawMq2gYLSJ+qZB5E3bNF5xlq7gspOseUVqi9S2O8Rti6N Q5Tg== X-Forwarded-Encrypted: i=1; AJvYcCUNtFwtVhwQtpbCtK5UVBnAmG9aaByaoKsn32nMRuxposR1S1pK0kgfL2YvOVBo9/di2w67u3dESeNC+1XE@vger.kernel.org X-Gm-Message-State: AOJu0Yx8YiBGttNnifoYdXAWxzGOBqNsOOEzGoVRFJqF+0f2tPsAD2a5 07oVWoJwkZuMkAcqnHpcEBC118+Zyvc1U/mWgYWpk5nb59vHgqejU21cz39nY3Y= X-Gm-Gg: ASbGncstOjH8AIk/0nbkYn/6Rv8LCObIW2jgWtzC5eW1KMMuVO67JYONMOmTBvFDxZ8 iZuT5hvj9CNiRM7wv9RVaPAz3Ml3loQzyWHZxItYQetnftHfAFS2QSwzFQutme+dx7uH4tct7Qb BvpTMDlLH/sqA6Fe0bInlL/vEb5BvbWXxZIHHbH+Sc3+/zOo4R6nfNOCgxQA1+fmEz5/mE7UKKK 0dn4uyWT5f2KcNHh90Ti+twEq3TCJSzHjKENGit4CrJO45r6PqWuMa+uXGP+FdpRrdWcLwKH0Ip +uz+nxP+AE+145B7ScwP8UdDRS0XZFWWtg== X-Google-Smtp-Source: AGHT+IE4CZCG624luysY8QDGSj/e+AcLpGvZaiAptFBQEJEe8XJs4qoydl6YsrRoUijs3EUGi94bkA== X-Received: by 2002:a2e:8e8c:0:b0:309:2012:cc5d with SMTP id 38308e7fff4ca-30a59970308mr85221661fa.24.1740560384896; Wed, 26 Feb 2025 00:59:44 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30a819e0c49sm4556641fa.10.2025.02.26.00.59.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2025 00:59:43 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 26 Feb 2025 10:59:30 +0200 Subject: [PATCH v8 7/7] drm/msm/hdmi: use DRM HDMI Audio framework Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250226-bridge-hdmi-connector-v8-7-340af24b35cc@linaro.org> References: <20250226-bridge-hdmi-connector-v8-0-340af24b35cc@linaro.org> In-Reply-To: <20250226-bridge-hdmi-connector-v8-0-340af24b35cc@linaro.org> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten , Simona Vetter , Simona Vetter Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=9824; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=jCnB9nRWDX2Sto2qyIJmSafVo3Vaxjg8eV0IBfZcuDw=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnvtftdD3IqWq+CTQLWloYFRJ87Ia/M+sufsRp1 gBXQGO6Z8eJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ77X7QAKCRCLPIo+Aiko 1YZdB/9/2HWVKa/vpHUDYz2NdMq7UbWPPKoQW0INmMZlqTUWtSpl67gtnRqLfgXffBHZ5+o0RuL zhgNcpcMZ6W5cwXk0mSpikFAJUx6wt9hR2/4tn/llsYBT4RfEPqgXafWHBAXzEQQIzVhh5hB0uu L0KauDe702jDY0xaWhOchMCrzSxwzigND5bnxRrx+4pTI20Ixep++n3fyc8LpK1S9KE0MApHIO6 tLK7Rz5MyGtG5gcPTsQE+rlhAktBvXnjjNz1hlZYJqVf2RukceuvBPiF1/FuafX/7m6wWaSNNG+ uibSLLq9EAmfYTxnGNzl9oyJeYoF1GtGf04G7QfDomTYbCic X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A In order to simplify the driver even further and to remove the boilerplate code, rewrite the audio interface to use the DRM HDMI Audio framework. Audio InfoFames are controlled centrally via the DRM HDMI framework. Correct InfoFrame data is programmed at the atomic_pre_enable() time (if it was set before, drm_atomic_helper_connector_hdmi_update_infoframes() takes care of writing all InfoFrames, including the Audio one.) or during msm_hdmi_bridge_audio_prepare() when the new stream is started. All audio data frame management is deferred to msm_hdmi_bridge_audio_prepare() and msm_hdmi_bridge_audio_shutdown(). Reviewed-by: Maxime Ripard Reviewed-by: Abhinav Kumar Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/msm/hdmi/hdmi.c | 91 ---------------------------------- drivers/gpu/drm/msm/hdmi/hdmi.h | 18 +++---- drivers/gpu/drm/msm/hdmi/hdmi_audio.c | 68 +++++++++++++++++++++---- drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 5 ++ 4 files changed, 71 insertions(+), 111 deletions(-) diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.c b/drivers/gpu/drm/msm/hdmi/hdmi.c index 6b77e0fb8d5ec218dfbf58215e2e12ad1dfb1b85..248541ff449204c72cd444458dadb9ae4a0a53d1 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi.c @@ -14,7 +14,6 @@ #include #include -#include #include "hdmi.h" void msm_hdmi_set_mode(struct hdmi *hdmi, bool power_on) @@ -245,87 +244,6 @@ static const struct hdmi_platform_config hdmi_tx_8974_config = { .hpd_freq = hpd_clk_freq_8x74, }; -/* - * HDMI audio codec callbacks - */ -static int msm_hdmi_audio_hw_params(struct device *dev, void *data, - struct hdmi_codec_daifmt *daifmt, - struct hdmi_codec_params *params) -{ - struct hdmi *hdmi = dev_get_drvdata(dev); - unsigned int rate; - int ret; - - DRM_DEV_DEBUG(dev, "%u Hz, %d bit, %d channels\n", params->sample_rate, - params->sample_width, params->cea.channels); - - switch (params->sample_rate) { - case 32000: - rate = HDMI_SAMPLE_RATE_32KHZ; - break; - case 44100: - rate = HDMI_SAMPLE_RATE_44_1KHZ; - break; - case 48000: - rate = HDMI_SAMPLE_RATE_48KHZ; - break; - case 88200: - rate = HDMI_SAMPLE_RATE_88_2KHZ; - break; - case 96000: - rate = HDMI_SAMPLE_RATE_96KHZ; - break; - case 176400: - rate = HDMI_SAMPLE_RATE_176_4KHZ; - break; - case 192000: - rate = HDMI_SAMPLE_RATE_192KHZ; - break; - default: - DRM_DEV_ERROR(dev, "rate[%d] not supported!\n", - params->sample_rate); - return -EINVAL; - } - - ret = drm_atomic_helper_connector_hdmi_update_audio_infoframe(hdmi->connector, - ¶ms->cea); - if (ret) - return ret; - - msm_hdmi_audio_info_setup(hdmi, rate, params->cea.channels); - - return 0; -} - -static void msm_hdmi_audio_shutdown(struct device *dev, void *data) -{ - struct hdmi *hdmi = dev_get_drvdata(dev); - - drm_atomic_helper_connector_hdmi_clear_audio_infoframe(hdmi->connector); - msm_hdmi_audio_disable(hdmi); -} - -static const struct hdmi_codec_ops msm_hdmi_audio_codec_ops = { - .hw_params = msm_hdmi_audio_hw_params, - .audio_shutdown = msm_hdmi_audio_shutdown, -}; - -static struct hdmi_codec_pdata codec_data = { - .ops = &msm_hdmi_audio_codec_ops, - .max_i2s_channels = 8, - .i2s = 1, -}; - -static int msm_hdmi_register_audio_driver(struct hdmi *hdmi, struct device *dev) -{ - hdmi->audio_pdev = platform_device_register_data(dev, - HDMI_CODEC_DRV_NAME, - PLATFORM_DEVID_AUTO, - &codec_data, - sizeof(codec_data)); - return PTR_ERR_OR_ZERO(hdmi->audio_pdev); -} - static int msm_hdmi_bind(struct device *dev, struct device *master, void *data) { struct msm_drm_private *priv = dev_get_drvdata(master); @@ -337,12 +255,6 @@ static int msm_hdmi_bind(struct device *dev, struct device *master, void *data) return err; priv->hdmi = hdmi; - err = msm_hdmi_register_audio_driver(hdmi, dev); - if (err) { - DRM_ERROR("Failed to attach an audio codec %d\n", err); - hdmi->audio_pdev = NULL; - } - return 0; } @@ -352,9 +264,6 @@ static void msm_hdmi_unbind(struct device *dev, struct device *master, struct msm_drm_private *priv = dev_get_drvdata(master); if (priv->hdmi) { - if (priv->hdmi->audio_pdev) - platform_device_unregister(priv->hdmi->audio_pdev); - if (priv->hdmi->bridge) msm_hdmi_hpd_disable(priv->hdmi); diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.h b/drivers/gpu/drm/msm/hdmi/hdmi.h index cdd3bd4f37831f9a606a4c3627a48364f5d4025f..a5f481c39277631b7a19d294b086d6208be26511 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi.h +++ b/drivers/gpu/drm/msm/hdmi/hdmi.h @@ -33,7 +33,6 @@ struct hdmi_hdcp_ctrl; struct hdmi { struct drm_device *dev; struct platform_device *pdev; - struct platform_device *audio_pdev; const struct hdmi_platform_config *config; @@ -205,17 +204,16 @@ static inline int msm_hdmi_pll_8998_init(struct platform_device *pdev) /* * audio: */ -#define HDMI_SAMPLE_RATE_32KHZ 0 -#define HDMI_SAMPLE_RATE_44_1KHZ 1 -#define HDMI_SAMPLE_RATE_48KHZ 2 -#define HDMI_SAMPLE_RATE_88_2KHZ 3 -#define HDMI_SAMPLE_RATE_96KHZ 4 -#define HDMI_SAMPLE_RATE_176_4KHZ 5 -#define HDMI_SAMPLE_RATE_192KHZ 6 +struct hdmi_codec_daifmt; +struct hdmi_codec_params; int msm_hdmi_audio_update(struct hdmi *hdmi); -int msm_hdmi_audio_info_setup(struct hdmi *hdmi, int rate, int channels); -int msm_hdmi_audio_disable(struct hdmi *hdmi); +int msm_hdmi_bridge_audio_prepare(struct drm_connector *connector, + struct drm_bridge *bridge, + struct hdmi_codec_daifmt *daifmt, + struct hdmi_codec_params *params); +void msm_hdmi_bridge_audio_shutdown(struct drm_connector *connector, + struct drm_bridge *bridge); /* * hdmi bridge: diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_audio.c b/drivers/gpu/drm/msm/hdmi/hdmi_audio.c index 0b91ed5eabd234ff3bca0c2dfaa159dd2e6a9df5..8bb975e82c17c1d77217128e9ddbd6a0575bb33d 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_audio.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_audio.c @@ -4,7 +4,12 @@ * Author: Rob Clark */ +#include + #include + +#include + #include "hdmi.h" /* Supported HDMI Audio sample rates */ @@ -192,29 +197,72 @@ int msm_hdmi_audio_update(struct hdmi *hdmi) return 0; } -int msm_hdmi_audio_info_setup(struct hdmi *hdmi, int rate, int channels) +int msm_hdmi_bridge_audio_prepare(struct drm_connector *connector, + struct drm_bridge *bridge, + struct hdmi_codec_daifmt *daifmt, + struct hdmi_codec_params *params) { - if (!hdmi) - return -ENXIO; - - if ((rate < 0) || (rate >= MSM_HDMI_SAMPLE_RATE_MAX)) + struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge); + struct hdmi *hdmi = hdmi_bridge->hdmi; + unsigned int rate; + int ret; + + drm_dbg_driver(bridge->dev, "%u Hz, %d bit, %d channels\n", + params->sample_rate, + params->sample_width, + params->cea.channels); + + switch (params->sample_rate) { + case 32000: + rate = MSM_HDMI_SAMPLE_RATE_32KHZ; + break; + case 44100: + rate = MSM_HDMI_SAMPLE_RATE_44_1KHZ; + break; + case 48000: + rate = MSM_HDMI_SAMPLE_RATE_48KHZ; + break; + case 88200: + rate = MSM_HDMI_SAMPLE_RATE_88_2KHZ; + break; + case 96000: + rate = MSM_HDMI_SAMPLE_RATE_96KHZ; + break; + case 176400: + rate = MSM_HDMI_SAMPLE_RATE_176_4KHZ; + break; + case 192000: + rate = MSM_HDMI_SAMPLE_RATE_192KHZ; + break; + default: + drm_err(bridge->dev, "rate[%d] not supported!\n", + params->sample_rate); return -EINVAL; + } + + ret = drm_atomic_helper_connector_hdmi_update_audio_infoframe(connector, + ¶ms->cea); + if (ret) + return ret; hdmi->audio.rate = rate; - hdmi->audio.channels = channels; + hdmi->audio.channels = params->cea.channels; hdmi->audio.enabled = true; return msm_hdmi_audio_update(hdmi); } -int msm_hdmi_audio_disable(struct hdmi *hdmi) +void msm_hdmi_bridge_audio_shutdown(struct drm_connector *connector, + struct drm_bridge *bridge) { - if (!hdmi) - return -ENXIO; + struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge); + struct hdmi *hdmi = hdmi_bridge->hdmi; + + drm_atomic_helper_connector_hdmi_clear_audio_infoframe(connector); hdmi->audio.rate = 0; hdmi->audio.channels = 2; hdmi->audio.enabled = false; - return msm_hdmi_audio_update(hdmi); + msm_hdmi_audio_update(hdmi); } diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c index aee75eee3d4244cd95e44df46d65b8e3e53de735..c6659e62594558b3c0c25de36aa8c459aa253834 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c @@ -478,6 +478,8 @@ static const struct drm_bridge_funcs msm_hdmi_bridge_funcs = { .hdmi_tmds_char_rate_valid = msm_hdmi_bridge_tmds_char_rate_valid, .hdmi_clear_infoframe = msm_hdmi_bridge_clear_infoframe, .hdmi_write_infoframe = msm_hdmi_bridge_write_infoframe, + .hdmi_audio_prepare = msm_hdmi_bridge_audio_prepare, + .hdmi_audio_shutdown = msm_hdmi_bridge_audio_shutdown, }; static void @@ -515,6 +517,9 @@ int msm_hdmi_bridge_init(struct hdmi *hdmi) DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_HDMI | DRM_BRIDGE_OP_EDID; + bridge->hdmi_audio_max_i2s_playback_channels = 8; + bridge->hdmi_audio_dev = &hdmi->pdev->dev; + bridge->hdmi_audio_dai_port = -1; ret = devm_drm_bridge_add(hdmi->dev->dev, bridge); if (ret)