From nobody Sat May 9 09:10:15 2026 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 112761CAA8C for ; Fri, 24 Jan 2025 21:47:50 +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=1737755272; cv=none; b=RS9auc5CKmfAbij79Y/C4D8wGlyOS7cBC4umKdJ8KRaccuV1J5YZiBK9QXlXYn6CiKMmUvITi6Xf/JZw/GcfwEBIxLQGemSSZ3xABxWEmIto0hx1LjMLJHZrN2jCTdCLcSXxR2qjKp2dUVKZkIgA5u+ltzBVKZ3r7Bn90c3ooD4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737755272; c=relaxed/simple; bh=f0rJpJCum+b7lqaI4sn4V9SXHt/v6K6WBKvJft3vbro=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SQU6wQ6u9BXLrb+/0SAIHD0vOzHfLjqW1S+EyHs6BQ2n3wC+hhzyg1CxOLfClOxPFr1z5kEB4sk/7CCgI1/IWdrNF9wNgxrgCcHVy73eEW8K9C6P3PHTtzWv7GfmTBJxdQTli/g11RM+TBdFSbtbMrpQdwzV1xW26qcHlkr5IzI= 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=RD+shECl; 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="RD+shECl" Received: by mail-lf1-f50.google.com with SMTP id 2adb3069b0e04-53ff1f7caaeso2632853e87.0 for ; Fri, 24 Jan 2025 13:47:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1737755269; x=1738360069; 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=RD+shEClw80FvadE5kOB0iOOMpLknKg/gk+JUIWQjgjN8NvVrrPfDZNSZbfftZQzhk tlf1NOGG2TX1sS+QSYCGSBWxdmUqBehoKD8JFWe1DVsxDc7uAK0yO6JQOfpsr7808Wmn bPlmsoonSwe3EJd9zmIhCZVY2nBEC5MFale6yQsJFGsIqdXDJjKYv4mrsSFenMnO3LCg ZILJUOTEb5ihRRzcTNB/V3xe6+0VqBJZrj6hvcJvyVKcYaeDTYaZ73zEEE9riUTdZ4Ky 31F3CWAulPrh3EQBn5AgV1xZtpIGzrF5Uc81w5h7ISIZOwO5/e+SYezR7hEArI7WLpXy RtVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737755269; x=1738360069; 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=fH2CHOYJvoRzXy9X2O/BCMz3oV8BkOKh2W+JpUhaFx/o7g6GIvQOGsSM8A9yiwceEC vt97YcQhqPDm63W9hISeWks4hUkfKtkqN5kQcp1gL/mNgt/ZPlvHLPhfDmfwlUrmJsUQ dgvnhSMXO6Nvc/L0pyrF8/qsPY9vgVlIwMadIPj72XGWNn1AuJ8W6pB3SsHvFjM0vjHo mQSRRXruuuujibCoOR5c9jNjjORjf08AC1KdPC6sSAz+8W9/+bBTKqe6T1qAT+7HqT9S VZF/EfS6TY6nb/1ciTI21bkDTnKTxNpicG4akVXvsdOpqEdkoYM6SmpsUDbRq2b7Ijf+ r44A== X-Forwarded-Encrypted: i=1; AJvYcCWUoHTlzfulBcnrWalqQl53OebDM84jQapSKu3ckUw5a+sy9oJ5zhEy4MfCU2clh7+qVWivxf1y5heaDug=@vger.kernel.org X-Gm-Message-State: AOJu0YykdoAwQQ/IAN8jlaNqr0z+lLJIglJHOMS5e0t2k38Q8H7wltU0 4A7cKBYFwgYnx7Opo+POQZVivKgGH1uPR8PBzNdUbgUlV2N3RHKwI9h6rFvMlPY= X-Gm-Gg: ASbGncuPWOFQrCjZAHNlBgsQ5WdFgrPFO6P7INM9j8A54hYF1WRomnZKEKjUqS8fKgD fEZpqMe/pySn5NHQw2tDsRwklHVmeVM902mRhsMPTQBszB4uw9hyZ9xIFXKzdDmjHW2rDfpFlDo 7fSmXdb9RWtSBrP+7nH0ywuTOpx7uydEaeA3hfy12CJ8jvvpYQ0zICBUeTAFJ0AujvDOVPf7Ybc AjvnCVWYuLitgKUwmJcJg2T9rcLlVoNSfDle/Ikc83t5xlu9FY7wZQplCTSQ0hcjwAi7sPS+Go7 E2kWFVMioSxP X-Google-Smtp-Source: AGHT+IGJDQ9mSugKQZZ3KeFdwIuuaaqj2SllE9hV97+PVfAvcbglZCBMGD3C20lS0dPX4nkJyJimsQ== X-Received: by 2002:a05:6512:3e28:b0:540:1f7d:8b9c with SMTP id 2adb3069b0e04-5439c286bbdmr12191243e87.45.1737755269106; Fri, 24 Jan 2025 13:47:49 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-543c8237491sm425014e87.104.2025.01.24.13.47.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jan 2025 13:47:47 -0800 (PST) From: Dmitry Baryshkov Date: Fri, 24 Jan 2025 23:47:41 +0200 Subject: [PATCH v6 1/7] drm/msm/hdmi: switch to atomic bridge callbacks Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250124-bridge-hdmi-connector-v6-1-1592632327f7@linaro.org> References: <20250124-bridge-hdmi-connector-v6-0-1592632327f7@linaro.org> In-Reply-To: <20250124-bridge-hdmi-connector-v6-0-1592632327f7@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/pANAwAKAYs8ij4CKSjVAcsmYgBnlAp/CPIUj4LeEmIPRORlPDyZcs3XDPvrjZ11L /nuK2A19+eJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ5QKfwAKCRCLPIo+Aiko 1TDNB/9NOcxhekHC4IsoI7M3QERK0DG9Vnm0SR5ncGHN/OUyl5B0J9eIJPes/ZrryYDnvsOHr8t NxyEH+6stBInVmV1huGI/REL1IWnJvm8mO9xhgCiXr7PZDlmt2r4FIkJ1xM0p0kc4TKph7+G+S/ PTpxS3hRcz9TQezjn0McN9oGURK71gvevdY7KeJTTJfrx+/KtGp62sEcLxjDNS44gxyJDyQory7 VsZ0eXltI5K49TZs9waOwWinp9cYCxzlodypi8UJq2MBSvKDLdKym8UESfZ+bIL5s0rcoPgEIuR mivCOoVb8H0WbavKHR+362v/B8EDAA1tDpeFM8OGYFFkkGwL 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/h= dmi/hdmi_bridge.c index 4a5b5112227f516dfc4279d0f319ec1e5b17f240..d839c71091dcdc3b020fcbba8d6= 98d58ee7fc749 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); } =20 -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 =3D to_hdmi_bridge(bridge); struct hdmi *hdmi =3D hdmi_bridge->hdmi; @@ -152,7 +153,8 @@ static void msm_hdmi_bridge_pre_enable(struct drm_bridg= e *bridge) msm_hdmi_hdcp_on(hdmi->hdcp_ctrl); } =20 -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 =3D to_hdmi_bridge(bridge); struct hdmi *hdmi =3D hdmi_bridge->hdmi; @@ -299,8 +301,11 @@ static enum drm_mode_status msm_hdmi_bridge_mode_valid= (struct drm_bridge *bridge } =20 static const struct drm_bridge_funcs msm_hdmi_bridge_funcs =3D { - .pre_enable =3D msm_hdmi_bridge_pre_enable, - .post_disable =3D msm_hdmi_bridge_post_disable, + .atomic_duplicate_state =3D drm_atomic_helper_bridge_duplicate_state, + .atomic_destroy_state =3D drm_atomic_helper_bridge_destroy_state, + .atomic_reset =3D drm_atomic_helper_bridge_reset, + .atomic_pre_enable =3D msm_hdmi_bridge_atomic_pre_enable, + .atomic_post_disable =3D msm_hdmi_bridge_atomic_post_disable, .mode_set =3D msm_hdmi_bridge_mode_set, .mode_valid =3D msm_hdmi_bridge_mode_valid, .edid_read =3D msm_hdmi_bridge_edid_read, --=20 2.39.5 From nobody Sat May 9 09:10:15 2026 Received: from mail-lf1-f53.google.com (mail-lf1-f53.google.com [209.85.167.53]) (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 B01091E7C0F for ; Fri, 24 Jan 2025 21:47:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737755274; cv=none; b=nb9RLu3orrcOk7g2C9fgcJpjxNfLl6m4m+ATbNWQ35UdHaY/arFPtrdYrp9iNmg+7Z69CCqvzfVyyX21bPLX2ZBoRgBKTkazFYV7YFHQx7Csofec2PS7ylvlD0QJDwoAl8seLMm/4R5Erxe4UDlen+G7I59KkLncgR7lPFQK3Dk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737755274; c=relaxed/simple; bh=kSze1JGUTOGCYF8m3i4MYZAmp4xJmoIk6UQOajOdpeU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tOC1XqMZbPSn9clCktvwQY5oG2Un7KoV520yrvJDAOPoxqYny9rpt42BMGTutHAhsDNuImibqeu4342bqHaFArBjvvZGfq3fzBboR3AgsbNqO1+ASUIOOMOi0V3DsriF77Qp/bSyf8Hh4wOJHW7shW0V5DKZeqncVX/egzVhFEU= 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=KXx/QFd4; arc=none smtp.client-ip=209.85.167.53 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="KXx/QFd4" Received: by mail-lf1-f53.google.com with SMTP id 2adb3069b0e04-54021daa6cbso2837521e87.0 for ; Fri, 24 Jan 2025 13:47:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1737755271; x=1738360071; 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=JhgOYJOSO/9HW8pwqjPKCM7ncfLkuDOo3BKPxNB2SGk=; b=KXx/QFd4kbH76u+zJQMLGYyhxjjlabTw1rSIwJgkj+9qUbVlTPGMGVv7ERuC1ww+js dvHAhXQCqvjls5qd15/R6fp/xq15IOtqNl47M6drUa3qYJDPnWU6L/TfmRu8eVBUSc21 Y6+ujIpxzYNY+Vh18LolkLCeMzgLiTpRSuQXEdhz99YGVzmiN7d7ylahQWk9gantRQjC F6IoyTChmCHQNAK969Akz3/Np5bWNs8wbmfxBPbx3xW8qMcnUNVcvEcDhpoD/6eGldaL VUKWUF3ByfAesU2k+tG9/NeFaxKT5t/JXuRWDN8SA5aJDyC3pHDxgjvUoSCjQdAq0cKg ugfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737755271; x=1738360071; 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=JhgOYJOSO/9HW8pwqjPKCM7ncfLkuDOo3BKPxNB2SGk=; b=FyvYaw7NAT6vaD62aqlt1qmlw+XusnNPcCqZPRJuF4Rzl22w9KozCC7103kBUAkQti 2Ob6CtEJOawhZUzQuN+terqcOGwUHNhgB2CgCqPpQRGcYIfZ9cTVb5XuG8D7gUpth2G0 xdBq3UVvotyEeVhpQdhtLIQswjcAqH5ry9/suqWwMnzfjwDgtEH/9KFqs4DKO+TVCvja 1mzZdrIkc11RCNl5oXzJd7qmiEdMFh4dwOFbfugv8vNpP6m9gM6zW/2B869HL1JWixoD ZOzWLqdKSo0p1ycubckPaGKqAMqaxwkN+LkFOkABPqOFKs3uwqoLsHHk5yZ2ejywo9T1 pukg== X-Forwarded-Encrypted: i=1; AJvYcCVuXteH+wsyfNkvwW/Kxe8zQWH1GRu+XxwWSTfk70WWMwkuTdAnqp1MmWObvvOITmdCFZKVNH1GzVJufbQ=@vger.kernel.org X-Gm-Message-State: AOJu0YydhBf+3/pO5bpbN4ZGXClC4nsRmblhO8UlTYjYtQI3UmKzjhWL nPtKaXmyTs1QDENeRXi7Djl1GyYlyVWAtVmwqgiQxd+uXR4aaIwR5D+Sj+JuP9Q= X-Gm-Gg: ASbGncsjJzViXaziZZIb/ig/uaYdpeNxsaRGqw9GRfvvYc62ohnY8HCXzdTVCw5IkYP Pi5Cf+3VJjKMCpminmwk3vpYmAtxdbJnQngEVpdyhFlBrHKm7vklOsDNVxWjwn6sbFpSc5JTvW2 y/EYxE8MZje/YTJPe5V4l4Xf2sKsTJIQ7QYXidlPEShjEwfiLKuRtt4brvCsKBPX6JGJI9jYSP/ UitXJkwNY6o0vFLoZ9+fEIPwtotm4nrlh2apbTdxcK/PlFk5i+OKIWLQmjSnu5n+vrpBXeNnUyy XickZnSpLeEo X-Google-Smtp-Source: AGHT+IG3aO38brRrPH4wfS/ESF1jDMyHBbkUhw38gLmmUNsh6Y0+nVc1isQgg/XzuGkki5VpcQLIEA== X-Received: by 2002:a05:6512:33cf:b0:540:202f:4955 with SMTP id 2adb3069b0e04-5439c287371mr10458923e87.46.1737755270703; Fri, 24 Jan 2025 13:47:50 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-543c8237491sm425014e87.104.2025.01.24.13.47.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jan 2025 13:47:49 -0800 (PST) From: Dmitry Baryshkov Date: Fri, 24 Jan 2025 23:47:42 +0200 Subject: [PATCH v6 2/7] drm/msm/hdmi: program HDMI timings during atomic_pre_enable Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250124-bridge-hdmi-connector-v6-2-1592632327f7@linaro.org> References: <20250124-bridge-hdmi-connector-v6-0-1592632327f7@linaro.org> In-Reply-To: <20250124-bridge-hdmi-connector-v6-0-1592632327f7@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=3301; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=kSze1JGUTOGCYF8m3i4MYZAmp4xJmoIk6UQOajOdpeU=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnlAp/oXLWfpEl1f2La3MXrLoICQDHEdQlVqJGS Hgv35KeEmuJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ5QKfwAKCRCLPIo+Aiko 1ZuSB/9DaAKzIUw5clYrcanQGnGX9s9BZCzORMBcPpZTGFMZKIJKxqmI9pCa2ex2sDnjak/OPfg NCfGVtGE5BYeOSgfgwCO82Pk09Ied3no7INTtYIVVnLooa7Z2DTUhOJc26H1V3qwhHz1/4K3LVM WoHbtgpGyBUseefhJoX8mJy1nHHAdH1mfyzRT1DoPwuwDHDg5y+rAbpS1zegi9slnm0kO5yCjaJ gaYi6y0C5K6UQY8SFawJRHAJz6d9GDSHvAoycThmdjKhV7v1BPW3gqGiZoYet6InKQmngG3cT2C vKaFFC87Be6XJgM71aJisvBbNbz4hdqIANRYkHj8bnceCFIz 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 after setting up HDMI PHY and PLL. Rework the code to program HDMI timings at the end of atomic_pre_enable(). Signed-off-by: Dmitry Baryshkov Reviewed-by: Maxime Ripard --- drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/h= dmi/hdmi_bridge.c index d839c71091dcdc3b020fcbba8d698d58ee7fc749..d5ab1f74c0e6f47dc59872c0161= 04e9a84d85e9e 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c @@ -126,15 +126,26 @@ static void msm_hdmi_config_avi_infoframe(struct hdmi= *hdmi) hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL1, val); } =20 +static void msm_hdmi_bridge_atomic_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 =3D old_bridge_state->base.state; struct hdmi_bridge *hdmi_bridge =3D to_hdmi_bridge(bridge); struct hdmi *hdmi =3D hdmi_bridge->hdmi; struct hdmi_phy *phy =3D hdmi->phy; + struct drm_encoder *encoder =3D bridge->encoder; + struct drm_connector *connector; + struct drm_connector_state *conn_state; + struct drm_crtc_state *crtc_state; =20 DBG("power up"); =20 + connector =3D drm_atomic_get_new_connector_for_encoder(state, encoder); + conn_state =3D drm_atomic_get_new_connector_state(state, connector); + crtc_state =3D drm_atomic_get_new_crtc_state(state, conn_state->crtc); + if (!hdmi->power_on) { msm_hdmi_phy_resource_enable(phy); msm_hdmi_power_on(bridge); @@ -151,6 +162,8 @@ static void msm_hdmi_bridge_atomic_pre_enable(struct dr= m_bridge *bridge, =20 if (hdmi->hdcp_ctrl) msm_hdmi_hdcp_on(hdmi->hdcp_ctrl); + + msm_hdmi_bridge_atomic_set_timings(hdmi, &crtc_state->adjusted_mode); } =20 static void msm_hdmi_bridge_atomic_post_disable(struct drm_bridge *bridge, @@ -177,17 +190,12 @@ static void msm_hdmi_bridge_atomic_post_disable(struc= t drm_bridge *bridge, } } =20 -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_bridge_atomic_set_timings(struct hdmi *hdmi, + const struct drm_display_mode *mode) { - struct hdmi_bridge *hdmi_bridge =3D to_hdmi_bridge(bridge); - struct hdmi *hdmi =3D hdmi_bridge->hdmi; int hstart, hend, vstart, vend; uint32_t frame_ctrl; =20 - mode =3D adjusted_mode; - hdmi->pixclock =3D mode->clock * 1000; =20 hstart =3D mode->htotal - mode->hsync_start; @@ -306,7 +314,6 @@ static const struct drm_bridge_funcs msm_hdmi_bridge_fu= ncs =3D { .atomic_reset =3D drm_atomic_helper_bridge_reset, .atomic_pre_enable =3D msm_hdmi_bridge_atomic_pre_enable, .atomic_post_disable =3D msm_hdmi_bridge_atomic_post_disable, - .mode_set =3D msm_hdmi_bridge_mode_set, .mode_valid =3D msm_hdmi_bridge_mode_valid, .edid_read =3D msm_hdmi_bridge_edid_read, .detect =3D msm_hdmi_bridge_detect, --=20 2.39.5 From nobody Sat May 9 09:10:15 2026 Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) (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 7DFF01E98EC for ; Fri, 24 Jan 2025 21:47:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737755277; cv=none; b=aTzWIS1XOpYuL+A+L3+B2lxQcqvbHC1xYC27Pdq5a7bbCLKRjP68//k9Skl7tPlFXUgk4xGufnQg9TfbyaQ3U/c+F1PbMN3QIa4sqN6/RcKzX5Qv1YzJaV3GOqOsVj4RDkp1R8IMkWAkMYEZ1jdeR4ksmoYBCrBbjJqtjm+AONE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737755277; c=relaxed/simple; bh=aUFnzCOLwI3rcPXFc0KGTqsfg1fNX73fbcUmk4iVIWw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=C+/OVC8zK93YKjkNBe7BSRVnwel1L0hS/3J6EXH564r8Sw6bpyuNIj3Xcreg/OqR6rFH0vFSt2HnqDMJzB2rB1voL6XUqdQa+LF8AF+7ugxiHCRql58D+dgICtVdVUaZ+t7t23JiaeUumHAbTtLtlqucvXRfm+G+SgIE5XyeR0o= 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=EWnh5BXA; arc=none smtp.client-ip=209.85.167.48 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="EWnh5BXA" Received: by mail-lf1-f48.google.com with SMTP id 2adb3069b0e04-53e3a227b82so2299642e87.0 for ; Fri, 24 Jan 2025 13:47:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1737755272; x=1738360072; 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=218UCCirz0adWycPKYaSzNsLxEvuZWNW6UJ0wiWvVao=; b=EWnh5BXARFAbikLnwg82JT+Cqb14HsJqBPDpWkZz76HWumCzgLLgkmVdXk1JCCHxn3 EdJcDbv0uZitUdiPZB/JpSuwAIajiaesSNnI58/7wN54QE2e7Japm1xUr21C/xGq27x5 ISFzxkB7YtNoBhFg9IhCt5fUDgFaqJcFdhfPNofJyG3iwHxiC66/V7w606A+ODsC51Ji HSLyExT19AHMVnnNVlEUG5xvyGk0wu/wZfOxMbHsj58nBQxEGH/1mAKQC4APnlAbXpZT cEn1ewcq/Ly3FmHSw213hZGSqP3zHASCDzGjsNNZhjTERM6MAOegdxgiEcEvwewI/g1u WAvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737755272; x=1738360072; 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=218UCCirz0adWycPKYaSzNsLxEvuZWNW6UJ0wiWvVao=; b=GviM+0QZzdcrPFbQUGRn76/0+C5ilXHkIaQ5hdWn5Zb8vmZ536Cwtb/gxNpkexM3Qb zcgVcz+YTHsTFz+OPz0lrfw4PrwFG8lVh6UGvGGpKW0YoYL+yhi2aFEnTaTCKEMx9KwM 9HsZPFqk14a0XsLI4DyUxq6bHePF56GqXYa6NJdJsWYIsmEmZcS9kXHcAPUh0b3czCbF OAIr8QZq45wQdLvuVrc5z4XxkS/maRJYgiPFo4LDINurfq+aJQexkb1yA6nWlxjjXwvt KRjiA64OoeedhOkpAvoYlRC1WD+qR7k2b7XIvkQPgTV00klufjw0Y02h4I1a3Oz4VLO5 YV4w== X-Forwarded-Encrypted: i=1; AJvYcCXdaWnFrt28B/LA8m1kdBt7eHCR9upj7JCS90A6ojtFGql/2AtDpb+jIA2y2e9TlI2ClEsEw2iBKkqxS3c=@vger.kernel.org X-Gm-Message-State: AOJu0YwjLRY8jZ9EXZkbFPQvCY8rz5CJLYYoHR5R1/ywT+lRCSvcMloR BVl5Ow28vdChE9RisbLwpY65anqu+IZcKlWASGfSLlFh7NZhila/ExfY7+R9gVA= X-Gm-Gg: ASbGncu5ZVVZovzsNCzqrU1Uy0BqPA3KE75U/0w5/E1rpnGM1xHJqpBaEMsp+e0mVP4 q9hkUGwPFPS2H3OPOTK+ispmGz5SBE/bMiNJIpKzP9Uz4nthBwl4IgfBIyb4RjFUYKvd2L1eFyP R0IvlTtQxVrkdvpSuAUeHUrIZYulM0PsSUJibzRZgnmQNGGwauSiUPxfRCU+7OKIcqdBtrncaPo ZMsT1kQOAnGVLTeuvQVZqMXPx8znGBb/4co72c8QmDAEga50Uvs1arS6KV5YbckXzNxJJ0JKFwV LEr/0uXt4csz X-Google-Smtp-Source: AGHT+IElm/Asqb946d6xfMLis2dYG51U1RwpV5Sj+GUiw/PxhvdBh4k319aX8D8tg9lEDQjFrOnHMg== X-Received: by 2002:a05:6512:1104:b0:53e:df2b:df25 with SMTP id 2adb3069b0e04-5439c228ceemr12330422e87.16.1737755272340; Fri, 24 Jan 2025 13:47:52 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-543c8237491sm425014e87.104.2025.01.24.13.47.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jan 2025 13:47:51 -0800 (PST) From: Dmitry Baryshkov Date: Fri, 24 Jan 2025 23:47:43 +0200 Subject: [PATCH v6 3/7] drm/msm/hdmi: make use of the drm_connector_hdmi framework Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250124-bridge-hdmi-connector-v6-3-1592632327f7@linaro.org> References: <20250124-bridge-hdmi-connector-v6-0-1592632327f7@linaro.org> In-Reply-To: <20250124-bridge-hdmi-connector-v6-0-1592632327f7@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=21579; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=aUFnzCOLwI3rcPXFc0KGTqsfg1fNX73fbcUmk4iVIWw=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnlAqAiK4haZBE3v7FWCPHryoNjLDbgaTaj1Z7m bPjuR8IxJOJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ5QKgAAKCRCLPIo+Aiko 1RpNB/0Wu0eu6UMmXd7eKGqlxEJKkNkSAGqyj/UY0BTXdXSE7i2la3cSi+TQ6IzG8Spl+ntamaM 3TFQ1WUyh85R5kl7BY1gFt2Icio+wdQ5bIm9uusvKPNRsmRpcuUlbTeXbcXifhmzEbicTQnxSkR 6mA3reHLJt+yLgj1Kezh7P5el4NszXLk0M2u0/i68fjSxHZLiwo9e1ulBY80eQfbKpup4aTjMxx fPWUyoT0z4mW9dVGR69Sx4s49xZim5JZc33LXOeIT8PhGFajZQS88f2KdHdTeKR8EcUdYRlQVsG 9I2eaivvse5LQGn8fmqSYf88V0vasuQDbKvDVSofPu/cA603 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 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 | 16 +-- drivers/gpu/drm/msm/hdmi/hdmi_audio.c | 74 ++++---------- drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 180 +++++++++++++++++++++++------= ---- 5 files changed, 162 insertions(+), 155 deletions(-) diff --git a/drivers/gpu/drm/msm/Kconfig b/drivers/gpu/drm/msm/Kconfig index 7ec833b6d8292f8cb26cfe5582812f2754cd4d35..974bc7c0ea761147d3326bdce90= 39d6f26f290d0 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/hdm= i.c index 37b3809c6bdd7c35aca6b475cb1f41c0ab4d3e6d..b14205cb9e977edd0d849e0eafe= 9b69c0da594bd 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi.c @@ -12,6 +12,7 @@ =20 #include #include +#include =20 #include #include "hdmi.h" @@ -165,8 +166,6 @@ int msm_hdmi_modeset_init(struct hdmi *hdmi, hdmi->dev =3D dev; hdmi->encoder =3D encoder; =20 - hdmi_audio_infoframe_init(&hdmi->audio.infoframe); - ret =3D 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 *de= v, void *data, struct hdmi_codec_params *params) { struct hdmi *hdmi =3D dev_get_drvdata(dev); - unsigned int chan; - unsigned int channel_allocation =3D 0; unsigned int rate; - unsigned int level_shift =3D 0; /* 0dB */ - bool down_mix =3D false; + int ret; =20 DRM_DEV_DEBUG(dev, "%u Hz, %d bit, %d channels\n", params->sample_rate, params->sample_width, params->cea.channels); =20 - switch (params->cea.channels) { - case 2: - /* FR and FL speakers */ - channel_allocation =3D 0; - chan =3D MSM_HDMI_AUDIO_CHANNEL_2; - break; - case 4: - /* FC, LFE, FR and FL speakers */ - channel_allocation =3D 0x3; - chan =3D MSM_HDMI_AUDIO_CHANNEL_4; - break; - case 6: - /* RR, RL, FC, LFE, FR and FL speakers */ - channel_allocation =3D 0x0B; - chan =3D MSM_HDMI_AUDIO_CHANNEL_6; - break; - case 8: - /* FRC, FLC, RR, RL, FC, LFE, FR and FL speakers */ - channel_allocation =3D 0x1F; - chan =3D MSM_HDMI_AUDIO_CHANNEL_8; - break; - default: - return -EINVAL; - } - switch (params->sample_rate) { case 32000: rate =3D HDMI_SAMPLE_RATE_32KHZ; @@ -316,9 +287,12 @@ static int msm_hdmi_audio_hw_params(struct device *dev= , void *data, return -EINVAL; } =20 - msm_hdmi_audio_set_sample_rate(hdmi, rate); - msm_hdmi_audio_info_setup(hdmi, 1, chan, channel_allocation, - level_shift, down_mix); + ret =3D drm_atomic_helper_connector_hdmi_update_audio_infoframe(hdmi->con= nector, + ¶ms->cea); + if (ret) + return ret; + + msm_hdmi_audio_info_setup(hdmi, rate, params->cea.channels); =20 return 0; } @@ -327,7 +301,8 @@ static void msm_hdmi_audio_shutdown(struct device *dev,= void *data) { struct hdmi *hdmi =3D dev_get_drvdata(dev); =20 - 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); } =20 static const struct hdmi_codec_ops msm_hdmi_audio_codec_ops =3D { diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.h b/drivers/gpu/drm/msm/hdmi/hdm= i.h index a62d2aedfbb7239d37c826c4f96762f100a2be4a..53b52351d0eddf4a5c87a529001= 6bb53ed4d29f7 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; =20 struct hdmi_audio { bool enabled; - struct hdmi_audio_infoframe infoframe; int rate; + int channels; }; =20 struct hdmi_hdcp_ctrl; @@ -207,12 +207,6 @@ static inline int msm_hdmi_pll_8998_init(struct platfo= rm_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 @@ -221,12 +215,8 @@ static inline int msm_hdmi_pll_8998_init(struct platfo= rm_device *pdev) #define HDMI_SAMPLE_RATE_176_4KHZ 5 #define HDMI_SAMPLE_RATE_192KHZ 6 =20 -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); =20 /* * hdmi bridge: diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_audio.c b/drivers/gpu/drm/msm/hd= mi/hdmi_audio.c index 4c2058c4adc1001a12e10f35e88a6d58f3bd2fdc..924654bfb48cf17feadea1c0661= ee6ee4e1b4589 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" =20 -/* maps MSM_HDMI_AUDIO_CHANNEL_n consts used by audio driver to # of chann= els: */ -static int nchannels[] =3D { 2, 4, 6, 8 }; - /* Supported HDMI Audio sample rates */ #define MSM_HDMI_SAMPLE_RATE_32KHZ 0 #define MSM_HDMI_SAMPLE_RATE_44_1KHZ 1 @@ -71,19 +68,20 @@ static const struct hdmi_msm_audio_arcs *get_arcs(unsig= ned long int pixclock) return NULL; } =20 -int msm_hdmi_audio_update(struct hdmi *hdmi) +static int msm_hdmi_audio_update(struct hdmi *hdmi) { struct hdmi_audio *audio =3D &hdmi->audio; - struct hdmi_audio_infoframe *info =3D &audio->infoframe; const struct hdmi_msm_audio_arcs *arcs =3D NULL; bool enabled =3D 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=3D%d, channels=3D%d, rate=3D%d", + audio->enabled, audio->channels, audio->rate); =20 - DBG("audio: enabled=3D%d, channels=3D%d, channel_allocation=3D0x%x, " - "level_shift_value=3D%d, downmix_inhibit=3D%d, rate=3D%d", - audio->enabled, info->channels, info->channel_allocation, - info->level_shift_value, info->downmix_inhibit, audio->rate); DBG("video: power_on=3D%d, pixclock=3D%lu", hdmi->power_on, hdmi->pixcloc= k); =20 if (enabled && !(hdmi->power_on && hdmi->pixclock)) { @@ -104,7 +102,6 @@ int msm_hdmi_audio_update(struct hdmi *hdmi) acr_pkt_ctrl =3D hdmi_read(hdmi, REG_HDMI_ACR_PKT_CTRL); vbi_pkt_ctrl =3D hdmi_read(hdmi, REG_HDMI_VBI_PKT_CTRL); aud_pkt_ctrl =3D hdmi_read(hdmi, REG_HDMI_AUDIO_PKT_CTRL1); - infofrm_ctrl =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL0); audio_config =3D hdmi_read(hdmi, REG_HDMI_AUDIO_CFG); =20 /* 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]; =20 n =3D arcs->lut[audio->rate].n; cts =3D arcs->lut[audio->rate].cts; @@ -155,20 +151,12 @@ int msm_hdmi_audio_update(struct hdmi *hdmi) HDMI_ACR_1_N(n)); =20 hdmi_write(hdmi, REG_HDMI_AUDIO_PKT_CTRL2, - COND(info->channels !=3D 2, HDMI_AUDIO_PKT_CTRL2_LAYOUT) | + COND(audio->channels !=3D 2, HDMI_AUDIO_PKT_CTRL2_LAYOUT) | HDMI_AUDIO_PKT_CTRL2_OVERRIDE); =20 acr_pkt_ctrl |=3D HDMI_ACR_PKT_CTRL_CONT; acr_pkt_ctrl |=3D HDMI_ACR_PKT_CTRL_SEND; =20 - /* 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); =20 vbi_pkt_ctrl |=3D HDMI_VBI_PKT_CTRL_GC_ENABLE; @@ -176,11 +164,6 @@ int msm_hdmi_audio_update(struct hdmi *hdmi) =20 aud_pkt_ctrl |=3D HDMI_AUDIO_PKT_CTRL1_AUDIO_SAMPLE_SEND; =20 - infofrm_ctrl |=3D HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SEND; - infofrm_ctrl |=3D HDMI_INFOFRAME_CTRL0_AUDIO_INFO_CONT; - infofrm_ctrl |=3D HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SOURCE; - infofrm_ctrl |=3D HDMI_INFOFRAME_CTRL0_AUDIO_INFO_UPDATE; - audio_config &=3D ~HDMI_AUDIO_CFG_FIFO_WATERMARK__MASK; audio_config |=3D HDMI_AUDIO_CFG_FIFO_WATERMARK(4); audio_config |=3D HDMI_AUDIO_CFG_ENGINE_ENABLE; @@ -190,17 +173,12 @@ int msm_hdmi_audio_update(struct hdmi *hdmi) vbi_pkt_ctrl &=3D ~HDMI_VBI_PKT_CTRL_GC_ENABLE; vbi_pkt_ctrl &=3D ~HDMI_VBI_PKT_CTRL_GC_EVERY_FRAME; aud_pkt_ctrl &=3D ~HDMI_AUDIO_PKT_CTRL1_AUDIO_SAMPLE_SEND; - infofrm_ctrl &=3D ~HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SEND; - infofrm_ctrl &=3D ~HDMI_INFOFRAME_CTRL0_AUDIO_INFO_CONT; - infofrm_ctrl &=3D ~HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SOURCE; - infofrm_ctrl &=3D ~HDMI_INFOFRAME_CTRL0_AUDIO_INFO_UPDATE; audio_config &=3D ~HDMI_AUDIO_CFG_ENGINE_ENABLE; } =20 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); =20 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; } =20 -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; =20 - audio =3D &hdmi->audio; - - if (num_of_channels >=3D ARRAY_SIZE(nchannels)) + if ((rate < 0) || (rate >=3D MSM_HDMI_SAMPLE_RATE_MAX)) return -EINVAL; =20 - audio->enabled =3D enabled; - audio->infoframe.channels =3D nchannels[num_of_channels]; - audio->infoframe.channel_allocation =3D channel_allocation; - audio->infoframe.level_shift_value =3D level_shift; - audio->infoframe.downmix_inhibit =3D down_mix; + hdmi->audio.rate =3D rate; + hdmi->audio.channels =3D channels; + hdmi->audio.enabled =3D true; =20 return msm_hdmi_audio_update(hdmi); } =20 -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 =3D &hdmi->audio; + return -ENXIO; =20 - if ((rate < 0) || (rate >=3D MSM_HDMI_SAMPLE_RATE_MAX)) - return; + hdmi->audio.rate =3D 0; + hdmi->audio.channels =3D 2; + hdmi->audio.enabled =3D false; =20 - audio->rate =3D 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/h= dmi/hdmi_bridge.c index d5ab1f74c0e6f47dc59872c016104e9a84d85e9e..168b4104e705e8217f5d7ca5f90= 2d7557c55ae24 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 =20 #include "msm_kms.h" #include "hdmi.h" @@ -68,23 +70,17 @@ static void power_off(struct drm_bridge *bridge) =20 #define AVI_IFRAME_LINE_NUMBER 1 =20 -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 =3D hdmi->encoder->crtc; - const struct drm_display_mode *mode =3D &crtc->state->adjusted_mode; - union hdmi_infoframe frame; - u8 buffer[HDMI_INFOFRAME_SIZE(AVI)]; + u32 buf[4] =3D {}; u32 val; - int len; + int i; =20 - drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, - hdmi->connector, mode); - - len =3D hdmi_infoframe_pack(&frame, buffer, sizeof(buffer)); - if (len < 0) { + if (len !=3D HDMI_INFOFRAME_SIZE(AVI) || len - 3 > sizeof(buf)) { DRM_DEV_ERROR(&hdmi->pdev->dev, "failed to configure avi infoframe\n"); - return; + return -EINVAL; } =20 /* @@ -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] |=3D buffer[1] << 24; + + for (i =3D 0; i < ARRAY_SIZE(buf); i++) + hdmi_write(hdmi, REG_HDMI_AVI_INFO(i), buf[i]); + + val =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL1); + val |=3D HDMI_INFOFRAME_CTRL0_AVI_SEND | + HDMI_INFOFRAME_CTRL0_AVI_CONT; + hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL0, val); + + val =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL1); + val &=3D ~HDMI_INFOFRAME_CTRL1_AVI_INFO_LINE__MASK; + val |=3D 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 !=3D 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); =20 - 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); =20 - hdmi_write(hdmi, REG_HDMI_AVI_INFO(2), - buffer[11] | - buffer[12] << 8 | - buffer[13] << 16 | - buffer[14] << 24); + val =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL1); + val |=3D 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 =3D to_hdmi_bridge(bridge); + struct hdmi *hdmi =3D hdmi_bridge->hdmi; + u32 val; + + switch (type) { + case HDMI_INFOFRAME_TYPE_AVI: + val =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL0); + val &=3D ~(HDMI_INFOFRAME_CTRL0_AVI_SEND | + HDMI_INFOFRAME_CTRL0_AVI_CONT); + hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL0, val); =20 - hdmi_write(hdmi, REG_HDMI_AVI_INFO(3), - buffer[15] | - buffer[16] << 8 | - buffer[1] << 24); + val =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL1); + val &=3D ~HDMI_INFOFRAME_CTRL1_AVI_INFO_LINE__MASK; + hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL1, val); =20 - hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL0, - HDMI_INFOFRAME_CTRL0_AVI_SEND | - HDMI_INFOFRAME_CTRL0_AVI_CONT); + break; =20 - val =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL1); - val &=3D ~HDMI_INFOFRAME_CTRL1_AVI_INFO_LINE__MASK; - val |=3D HDMI_INFOFRAME_CTRL1_AVI_INFO_LINE(AVI_IFRAME_LINE_NUMBER); - hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL1, val); + case HDMI_INFOFRAME_TYPE_AUDIO: + val =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL0); + val &=3D ~(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 =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL1); + val &=3D ~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 =3D to_hdmi_bridge(bridge); + struct hdmi *hdmi =3D 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; + } } =20 static void msm_hdmi_bridge_atomic_set_timings(struct hdmi *hdmi, @@ -146,16 +223,16 @@ static void msm_hdmi_bridge_atomic_pre_enable(struct = drm_bridge *bridge, conn_state =3D drm_atomic_get_new_connector_state(state, connector); crtc_state =3D drm_atomic_get_new_crtc_state(state, conn_state->crtc); =20 + hdmi->pixclock =3D conn_state->hdmi.tmds_char_rate; + if (!hdmi->power_on) { msm_hdmi_phy_resource_enable(phy); msm_hdmi_power_on(bridge); hdmi->power_on =3D true; - if (hdmi->hdmi_mode) { - msm_hdmi_config_avi_infoframe(hdmi); - msm_hdmi_audio_update(hdmi); - } } =20 + drm_atomic_helper_connector_hdmi_update_infoframes(connector, state); + msm_hdmi_phy_powerup(phy, hdmi->pixclock); =20 msm_hdmi_set_mode(hdmi, true); @@ -184,8 +261,6 @@ static void msm_hdmi_bridge_atomic_post_disable(struct = drm_bridge *bridge, if (hdmi->power_on) { power_off(bridge); hdmi->power_on =3D false; - if (hdmi->hdmi_mode) - msm_hdmi_audio_update(hdmi); msm_hdmi_phy_resource_disable(phy); } } @@ -196,8 +271,6 @@ static void msm_hdmi_bridge_atomic_set_timings(struct h= dmi *hdmi, int hstart, hend, vstart, vend; uint32_t frame_ctrl; =20 - hdmi->pixclock =3D mode->clock * 1000; - hstart =3D mode->htotal - mode->hsync_start; hend =3D mode->htotal - mode->hsync_start + mode->hdisplay; =20 @@ -241,9 +314,6 @@ static void msm_hdmi_bridge_atomic_set_timings(struct h= dmi *hdmi, frame_ctrl |=3D HDMI_FRAME_CTRL_INTERLACED_EN; DBG("frame_ctrl=3D%08x", frame_ctrl); hdmi_write(hdmi, REG_HDMI_FRAME_CTRL, frame_ctrl); - - if (hdmi->hdmi_mode) - msm_hdmi_audio_update(hdmi); } =20 static const struct drm_edid *msm_hdmi_bridge_edid_read(struct drm_bridge = *bridge, @@ -275,18 +345,16 @@ static const struct drm_edid *msm_hdmi_bridge_edid_re= ad(struct drm_bridge *bridg return drm_edid; } =20 -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 str= uct drm_bridge *bridge, + const struct drm_display_mode *mode, + unsigned long long tmds_rate) { struct hdmi_bridge *hdmi_bridge =3D to_hdmi_bridge(bridge); struct hdmi *hdmi =3D hdmi_bridge->hdmi; const struct hdmi_platform_config *config =3D hdmi->config; struct msm_drm_private *priv =3D bridge->dev->dev_private; struct msm_kms *kms =3D priv->kms; - long actual, requested; - - requested =3D 1000 * mode->clock; + long actual; =20 /* for mdp5/apq8074, we manage our own pixel clk (as opposed to * mdp4/dtv stuff where pixel clk is assigned to mdp/encoder @@ -294,15 +362,16 @@ static enum drm_mode_status msm_hdmi_bridge_mode_vali= d(struct drm_bridge *bridge */ if (kms->funcs->round_pixclk) actual =3D kms->funcs->round_pixclk(kms, - requested, hdmi_bridge->hdmi->encoder); + tmds_rate, + hdmi_bridge->hdmi->encoder); else if (config->pwr_clk_cnt > 0) - actual =3D clk_round_rate(hdmi->pwr_clks[0], requested); + actual =3D clk_round_rate(hdmi->pwr_clks[0], tmds_rate); else - actual =3D requested; + actual =3D tmds_rate; =20 - DBG("requested=3D%ld, actual=3D%ld", requested, actual); + DBG("requested=3D%lld, actual=3D%ld", tmds_rate, actual); =20 - if (actual !=3D requested) + if (actual !=3D tmds_rate) return MODE_CLOCK_RANGE; =20 return 0; @@ -314,9 +383,11 @@ static const struct drm_bridge_funcs msm_hdmi_bridge_f= uncs =3D { .atomic_reset =3D drm_atomic_helper_bridge_reset, .atomic_pre_enable =3D msm_hdmi_bridge_atomic_pre_enable, .atomic_post_disable =3D msm_hdmi_bridge_atomic_post_disable, - .mode_valid =3D msm_hdmi_bridge_mode_valid, .edid_read =3D msm_hdmi_bridge_edid_read, .detect =3D msm_hdmi_bridge_detect, + .hdmi_tmds_char_rate_valid =3D msm_hdmi_bridge_tmds_char_rate_valid, + .hdmi_clear_infoframe =3D msm_hdmi_bridge_clear_infoframe, + .hdmi_write_infoframe =3D msm_hdmi_bridge_write_infoframe, }; =20 static void @@ -348,8 +419,11 @@ int msm_hdmi_bridge_init(struct hdmi *hdmi) bridge->funcs =3D &msm_hdmi_bridge_funcs; bridge->ddc =3D hdmi->i2c; bridge->type =3D DRM_MODE_CONNECTOR_HDMIA; + bridge->vendor =3D "Qualcomm"; + bridge->product =3D "Snapdragon"; bridge->ops =3D DRM_BRIDGE_OP_HPD | DRM_BRIDGE_OP_DETECT | + DRM_BRIDGE_OP_HDMI | DRM_BRIDGE_OP_EDID; =20 ret =3D devm_drm_bridge_add(hdmi->dev->dev, bridge); --=20 2.39.5 From nobody Sat May 9 09:10:15 2026 Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) (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 D60761EE7AC for ; Fri, 24 Jan 2025 21:47:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737755277; cv=none; b=TmoZZuRkegVy409KdkIiTAd6c0qaj5e/hphUiQi/HuYHEFf9iMLERw7fe1TEKX8RRXLtgyk/k7yBTtrKOqpv7XpbUrDwg3WzyuktFi15vJXXsTKRUvh2/AZZAzYdm4RZv9azaIJCELNzmRyW89dHKsd3r9vkZqCa/ljxfvg4JVQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737755277; c=relaxed/simple; bh=aou3NZ2IsnAD5iGdPhnxU9pcbpVRM8SciayIVBJPtQw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=K9xdp7aM9ZJSHhlIlpOmMOzL2B5h9o19NU7zFtPrvqa3NN3hlQXU9Pt+gt4+DHqGoFG6Bgfy0pnmAD4Z496F43wQbPcqd2GpyVZtNtXdKw4Dvt88Y5/frDsCGEBV9Vef2ayAcyOQBa1kP2+1QojvbLc3JEpDjvsdtEzV4CQKIps= 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=oYrz/4wQ; arc=none smtp.client-ip=209.85.167.46 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="oYrz/4wQ" Received: by mail-lf1-f46.google.com with SMTP id 2adb3069b0e04-5401b7f7141so2296283e87.1 for ; Fri, 24 Jan 2025 13:47:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1737755274; x=1738360074; 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=IlR9NecrQCHXfPm/fpyP+/Z9eRiAzSSG5PW1LZdxCBM=; b=oYrz/4wQLHpQND0oJ1bXklDueEnvj/brcA87U89Jyuf8Ttifp8zVe2N9zvUaa9oL/q TIz66Nx8LyTIleeIiNvpJOT0n0VuqofyFn/4Pmc6eodtVN2CM4tx7ZMC+jUygGpPKFAZ XkFKNzqgPQZkN77P2ATrPw/yjmfmPpxngfOzAMsbcG2EAIB1rhUwqewfKBFl20j99RnM iYY/VIkfOnazFCFYPA4V7Wpl98TPM8iB/pgepZXtYZll+Tv3f+8A77hPQmsCw7eo5ETV /5aD5Os/MZFOmZ9s6ElOarw713L646img970lF9UeDTDQeePW0IURM8ABxO7oe1C3jOA 2Sfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737755274; x=1738360074; 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=IlR9NecrQCHXfPm/fpyP+/Z9eRiAzSSG5PW1LZdxCBM=; b=EH7+Nj+GX/S8Y4PL3egcWEvmJaFR3Rz07cC/hEyYKjQBqP4e1ydR2EHlXL3CV17jf4 GWYpSpkJMwERj5vu+t2tYgY6ldfsvZv2y6xScTWtI3mM/BvV1d0MG8yEQwcc7YeRyJmQ OrT2hsD2NAzFtdKHgCWI6OA8bs9NiBf/+tOfRA8zneSfAnGgdFPn/B7KUtZP7D+/H1D2 Kb2fiYiglcIkRH0d2FkLG98SJg0POofimr3C0/tMvh4uz2H6JQXHePV105VIgWsjc9qz nXRWkLdywCXFOh0Lc/rB5t3bFdkv+JUDyJmN4sOnQPCoqrVWOCDlLd1MdWMr6QKrUqBI ycng== X-Forwarded-Encrypted: i=1; AJvYcCX634oc42HP3KtmKP4WEIzGsnEfr3E64zZoJYqaw70y+eVgEYgQWvN+BnT3RoUwMLUtKSuDSnLTB6rbAMc=@vger.kernel.org X-Gm-Message-State: AOJu0YwQ8MFbqBBeRFaQsn1hfngnDGLi3Qi3+DX638GKtXXBi7jtPEII Xsbj6vrT+R/7D7ZCjExHtwfjAYBjCYBelCkoPVSgrpNPfeEcSaXuarGvQ2Plw2o= X-Gm-Gg: ASbGncswnKKBAxiYh4NGawrRieWHo1XNCY8Xqr1TIkajYlQZnfZexupsBqbBc7jISYH dI+Sl6p1fSlc0CNkzbXGKmNNwnOUg3lVv82Om5Gern8qUYYvm8KLGmNAZpnJLAaZ9ZGoROXBiHe HtrRpxong3SG8ce/Ljs0CnLH0IvjSoLeUMzyVAh7GG6ImC0rS0fNXHCYObgR0Ut9knIJpjcS5HL Wr8b9B10V8moPKoZmdf9qTChWNDlGdeBv5POQfpEC99baq9XV1M5OS2m71HrSHYjJ1S16qhhXH6 wbwMDmJuoqja X-Google-Smtp-Source: AGHT+IGXL+mj9oYDRst1LN9GviPtKEUadsXKdC3ORUDf96ArRikq4g85LQu+uRln0PDevFa/gzjLMA== X-Received: by 2002:a05:6512:281c:b0:542:2ef4:4884 with SMTP id 2adb3069b0e04-5439c224ab8mr11127686e87.19.1737755273958; Fri, 24 Jan 2025 13:47:53 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-543c8237491sm425014e87.104.2025.01.24.13.47.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jan 2025 13:47:53 -0800 (PST) From: Dmitry Baryshkov Date: Fri, 24 Jan 2025 23:47:44 +0200 Subject: [PATCH v6 4/7] drm/msm/hdmi: get rid of hdmi_mode Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250124-bridge-hdmi-connector-v6-4-1592632327f7@linaro.org> References: <20250124-bridge-hdmi-connector-v6-0-1592632327f7@linaro.org> In-Reply-To: <20250124-bridge-hdmi-connector-v6-0-1592632327f7@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=2361; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=aou3NZ2IsnAD5iGdPhnxU9pcbpVRM8SciayIVBJPtQw=; b=owGbwMvMwMXYbdNlx6SpcZXxtFoSQ/oUrgbxWJ55MZdkS9mnekqdLJHVbzTZveFtmTCLsqCqW aRXgGsnozELAyMXg6yYIotPQcvUmE3JYR92TK2HGcTKBDKFgYtTACbSd5SDYYH05YleLerx68uc rGSavuRH8H3hNTjz6f+BcO5bOnt8FMs2CC9nvvJo9V+PN6UXEy+y+vx45cMiJHdXw231FinJQ// Pvf28Mvana49Sv8YZzxWF29S8tqktdbo48f7W1wcOi/vVfo3c9nVR1/bMfS3OEV/y6oLerNfRj+ DKO9wz5cfcOQ8iCg57267yWlYmUV6nLTbj05bFm2eabNnWr5tervRhZnvcEw4+O46Dj5PO5rw42 7HvX4awX3iUSHR/lHLY0awM5g1GZtHTkw+uldlzqeeB2PLW5Q66H65wtRfLfPi4ecbO4hKxcqMZ jx1z+yV/PcjVD41rYe3z1JWOF1j1uzcoOf4q8yTlb6rsAA== 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 | 11 ----------- 3 files changed, 1 insertion(+), 14 deletions(-) diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.c b/drivers/gpu/drm/msm/hdmi/hdm= i.c index b14205cb9e977edd0d849e0eafe9b69c0da594bd..6b77e0fb8d5ec218dfbf58215e2= e12ad1dfb1b85 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 |=3D HDMI_CTRL_ENABLE; - if (!hdmi->hdmi_mode) { + if (!hdmi->connector->display_info.is_hdmi) { ctrl |=3D HDMI_CTRL_HDMI; hdmi_write(hdmi, REG_HDMI_CTRL, ctrl); ctrl &=3D ~HDMI_CTRL_HDMI; diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.h b/drivers/gpu/drm/msm/hdmi/hdm= i.h index 53b52351d0eddf4a5c87a5290016bb53ed4d29f7..ab169b77377097dc22c0c718f65= 024cb8ad1d317 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; =20 - bool hdmi_mode; /* are we in hdmi mode? */ - int irq; struct workqueue_struct *workq; =20 diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/h= dmi/hdmi_bridge.c index 168b4104e705e8217f5d7ca5f902d7557c55ae24..d2b25bcd8eb8f5cf4623e11c87a= c5eea6e4b363d 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c @@ -331,17 +331,6 @@ static const struct drm_edid *msm_hdmi_bridge_edid_rea= d(struct drm_bridge *bridg =20 hdmi_write(hdmi, REG_HDMI_CTRL, hdmi_ctrl); =20 - 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 =3D drm_edid_raw(drm_edid); - - hdmi->hdmi_mode =3D drm_detect_hdmi_monitor(edid); - } - return drm_edid; } =20 --=20 2.39.5 From nobody Sat May 9 09:10:15 2026 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 A35B11EEA33 for ; Fri, 24 Jan 2025 21:47:57 +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=1737755279; cv=none; b=iKAkhwdyyaLP/zRbKCH960MC3M6HR5aNaonw2g9HYRiuT97xNha2oa3nGuTi2zTUUBvKjaX3trvHEv1aIUHwIqeOlF1OrZE0CPoa3AIFWOcR0QijYCIj1sg2GeAy/NLCQSXwIsmPW5kuHop9eb7U818ZjY0h+9Vrpn8LUHSH47w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737755279; c=relaxed/simple; bh=KlCjBmWN3HQI30P1/iEnVtV7zXNb45CFcF9NRTzfcWY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KufkqKP2ThkwjQSO9skScc+hf+q29Ga8Zgc7m9h5hZYIlqufrHXCiGU5aFgsyf5CkToCHo6xGfpmZ/N8HmLaQRFD5tz31ivxYon0VSiEBv/Dw5drcxzrddi4j90/YkO3vg6pMznve8RO8jV26D62/9YIv2BVpQzpI4S3nd1y8VY= 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=RzwKftkM; 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="RzwKftkM" Received: by mail-lf1-f50.google.com with SMTP id 2adb3069b0e04-5401d3ea5a1so2435338e87.3 for ; Fri, 24 Jan 2025 13:47:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1737755276; x=1738360076; 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=RzwKftkMECaCFtRCv8VZ/Msx7thz4McxxHsX+zPeF3Y2pdlNVW9GruELNjJtgSL6bP q6IMPOnKAgaif8//SBGBNy//uViOLIVDRn0Sma6FIRt/97eTOcNGQzvwmSvPCFTZ3rCR ROgrGIS4OCy7ACkIKz+A7xBwtzPtJGSV2Y+zfmgR8Kq54snjrervtmsp+m9WzjdK9Tdz T3TZwtuX2FBP0GkB18eFNY7MegHBsxl2HWx+CwZnwnahig82Suy5Jxb7bhw5prHsFSv8 PAZh9YwzPagPf0bXCmAR02+shldp6e/QoYDnv4oumzqIsQepKvRGNtSXlfARL8nzzoI5 M8VQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737755276; x=1738360076; 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=P5ONu/4ZhbHO1YGCGXc+rw1ot5M08lEShXh0+up+FTDGz/fs/ZzgWXqX+rjJ7uXTFv CrLiuckBEWIKhFEFeAmuv4jKkxfkXFEFboyrixgkxucMFQrs7URJTj+SMzPGHWi/Gmom lcSbAzUkpHY81o3KR+5dnVjTMs0rTSabthlvnEz06OZ8l/Ryv6dliCo+PZFVMf+rNIGp zRl6WHHb2yMd3JHTcH3b1Azo8Vl3mXqM/WIssFfd6/Y8W9wqGWIrXl2g6eHfUxm0uhkN myJ7rAycw/6r+4oKw4lK1YcBsGlR6zfsq1mqsoYMCiQccK19v5FVmTn78E1dd09OUv5W Wocw== X-Forwarded-Encrypted: i=1; AJvYcCW+r1qipvu/BAKzK+LfKu1RNhVScX8/RNoAMf0ge9ljcBh0JIL3kKst+znSegNTj1hsB/h8roGZNj3YGB8=@vger.kernel.org X-Gm-Message-State: AOJu0Yz3qxsoFiTP6uUSI6LTPei2O/I+z3k3srm/nTNsO3z98g/rD/Nd UbjagolsJ4vs+p8RvixgxjZyBwuzioaX5loFyEw8RQJKUO/IJkW1cfy7jDLHIFI= X-Gm-Gg: ASbGncs2zUlzXOKkfCLEympZeQjpSIfC00o15IwrSG29LwFE6YyUNQS4PcFLrgVoWSY vJl3229XtSY6D6JzFNE8fmXc+rBpOA2tdL/0/W1D5NO1zzg2w6ttwF8/muDu60HkUSxe3aMvUmO E1Xnl4uovAhS2wp6cwyuYnZ4jn/+MiTRxr7dvkh8dSEo1OcLy3CyuZwj7dO3BWDNId++TxSdpqg HNegNS4h04FUIQk32Jf4HNHxXR+byjQbGJsa/zu/VR0eDbl5rjBifAizZKursbHfj7vHmwTS3Im HgJ6ygdVwdPg X-Google-Smtp-Source: AGHT+IFpny/zo/QvD2GXtlBH9/Wtg+ovbNpfKxp+xQf1OkquKUpDU3+qItxFEm0+BjAibqtxEpoQgQ== X-Received: by 2002:ac2:442e:0:b0:540:1d37:e79 with SMTP id 2adb3069b0e04-5439c249e27mr10731792e87.27.1737755275629; Fri, 24 Jan 2025 13:47:55 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-543c8237491sm425014e87.104.2025.01.24.13.47.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jan 2025 13:47:55 -0800 (PST) From: Dmitry Baryshkov Date: Fri, 24 Jan 2025 23:47:45 +0200 Subject: [PATCH v6 5/7] drm/msm/hdmi: update HDMI_GEN_PKT_CTRL_GENERIC0_UPDATE definition Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250124-bridge-hdmi-connector-v6-5-1592632327f7@linaro.org> References: <20250124-bridge-hdmi-connector-v6-0-1592632327f7@linaro.org> In-Reply-To: <20250124-bridge-hdmi-connector-v6-0-1592632327f7@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/pANAwAKAYs8ij4CKSjVAcsmYgBnlAqAj2Ty2fi86x5S8vz38vRE9W/qq6R3Kx+j8 s6w/jwMhVyJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ5QKgAAKCRCLPIo+Aiko 1XyOB/sH/E/XcX6vWytKMOGonps4x1gxBkl4bp3Jc6yHxcVJse0xCsVLRWkTZmGH8H4pTNGlvjw 0lh0iM1h749lSc96XOQQ8YIZhoKyEy5VXPbZNbO+bXx4U+VLRjN2N7ISWrn49lk7ewlg+DaJ9i7 fWcbAteWQMWfcNlIE1llxXe66A2T1RZ/P8hohJIwgl8w7Xqw9BPp5oLgqW2XZazB94IRjNxz/w5 FrMw4/ngqacRX786m4IcsJUIc2+v7SYRgg5QzK/DbiHMa30YHHAIjD1mEp4blSC514ctkr43TWB nre1TR8wD6n6w+1y+Z5YqHm+00nzHwYB/eRWUjKRZGsMKH3b 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/d= rm/msm/registers/display/hdmi.xml index 1cf1b14fbd919e041fd7ac8a0731d554d4468f4f..0ebb96297dae80940dc8a918d26= cd58ff2e6f81a 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=3D"https://gitlab.freedesktop.org/fr= eedreno/ rules-fd.xsd"> --> - = + --=20 2.39.5 From nobody Sat May 9 09:10:15 2026 Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) (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 290581EEA4D for ; Fri, 24 Jan 2025 21:47:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737755281; cv=none; b=TQQ/Jj0DPHfuuHj7H2bhxfkfVULyxQ6giGa/DgrKXVCYnxxqfMLeAoDHTFwH+dVvP72pgMk/dvUFZomJ9HvDC9Epb3tIEP/ZzphLl3DuWqfZMxuBMjLsXLS0deNM/lsWhAhEcx9jSbNt0FfxFtykFgfJ0d9FicfURBn5BZbxDSw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737755281; c=relaxed/simple; bh=ypMfUVcMuV2bxzV5D0UKlQ7W+VdrRVJ3N05XywV7S44=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WzuEUvmYKG810dmckiIIUcI6eZeZ3/Oc7MqQmzY4Vaguv4xb9nEAvbc0TAkEl7LSKfMbjsMkPgTfoRJlA+cq/Fe8RSKfgoS02+GtwLcPFyaCKNEjvDXi0bTFe++jnTmazTOzMfq+ToWnamH3EpmDjHi7FdJjZSgrEF+B6TEHqOo= 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=JxSgnn0+; arc=none smtp.client-ip=209.85.167.41 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="JxSgnn0+" Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-53df80eeeedso2798768e87.2 for ; Fri, 24 Jan 2025 13:47:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1737755277; x=1738360077; 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=iuIjI45U/dcDaX1yFgwDNBXncmV9p95867dXyO4Ck/I=; b=JxSgnn0+fqgWrlQ1nRIE6qhBySkdOwWrdrxUi81gNPBEwmsHQF+gfDkVxYZFmwP7iw /aoeO2+LW+pkYPUalVy25Sfpq4emFEmIfySKaJHfOv34x6X6gu1N458/gCgmj2gB/L/n B1eDLzll800IYHgDItsMG8QzQ7D4gyTVDtgpu9UNBdpHTcY9Fe5QNUM10Mpxq4eavhdG MIx1XfjatRiKGw7FiXOTYSaHuPb/zxUphCYZCdxLKb/wTLwBGvgVxPPWInnJZdq790dh E5xGa42TjZdSm+fE9EH+ihGnB9OqTgxJ/gRkFnAEepdjkX7/gU1fwHMZ2BaQFZMpV569 LCWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737755277; x=1738360077; 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=iuIjI45U/dcDaX1yFgwDNBXncmV9p95867dXyO4Ck/I=; b=oTcHBCk2eeTNIQE9YaKstPRkyE4cvQuwFWXZOXxu8MPfWLQIpdFK0B4Z2WwFw36xkz nTJ/T0yG7RkgTo4bbpyPWYgeFaaexaGLlK5N3TyuWBSPjuDk+HWwcuFPMP9lcZ+2ua8r LIhJJR36hORvnUAqR3l56eSYlHujaErDPvwY2opM+oW++fN3MMAjfcLaq5SQMO5dKmUq hN2TgsW2KBk8NyzUuvpPn7MIkTKAqv15stG9IY2gQO62bY39RX/uCDgsKwW1HPsEz9qF hUFuMRJfxJtKDAo2QddPCOBcrrcFWvdBEPB3fR9lQAiTPLoU4wDhJ3e48khi1q9uAvlf gKmw== X-Forwarded-Encrypted: i=1; AJvYcCXwEG1baAFBA33hYQqSSlZaWYCIGt+/tOlbyVoS+wtfrBZ6qKu82pkgumm1wii7Il9d9XBX1+ZtVu7Xq7U=@vger.kernel.org X-Gm-Message-State: AOJu0YzRJ6K1OEpORhU0S0hnquL+SmUIlTCL8Of2VzlrJLn8Agy4sZ8H lMFv2Va3kt5q6wR0J2HsbmTE+tD0wPbhyBVabokAmznibkUMK0GC5eJ88xhgQ0k= X-Gm-Gg: ASbGncvQLguFZEyley3cFlbGgZQzpfpsKRueuiHitTukRg3aUs13Jyvz1RCMO/r3c+8 EA//ziyGc8ijR1JJZmmbMQ/j2m1V9LhxCLl37gMShIGIRUf/UIcWNBa+QAVMA9CpLtzANjBqn/u aWy9fG/gZ7grRkyQcrzOkOxaH/cMOWkZJhyijEKG6vtqDL2dXIqz0DZRG+c9iQfhAEm3ULbC8Vz F72ZpBZ0EJWqe4gA17f4dsa5NGHx0RDoVC+8OoVUKyVKJ1P+5ZJ9nnqxbKLbUkfhhM+fyU2bj0s BZEiGCy+yL0otwJkroMvt4A= X-Google-Smtp-Source: AGHT+IH2PCxvWSi1I49WChIFLkDY5kjEE00ne3Y+IYzLaQPymzEuXvp0HTsrYDjW9kcThlu1z9dCDg== X-Received: by 2002:a05:6512:2346:b0:53e:23ec:b2e7 with SMTP id 2adb3069b0e04-5439c2805f9mr12813973e87.34.1737755277237; Fri, 24 Jan 2025 13:47:57 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-543c8237491sm425014e87.104.2025.01.24.13.47.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jan 2025 13:47:56 -0800 (PST) From: Dmitry Baryshkov Date: Fri, 24 Jan 2025 23:47:46 +0200 Subject: [PATCH v6 6/7] drm/msm/hdmi: also send the SPD and HDMI Vendor Specific InfoFrames Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250124-bridge-hdmi-connector-v6-6-1592632327f7@linaro.org> References: <20250124-bridge-hdmi-connector-v6-0-1592632327f7@linaro.org> In-Reply-To: <20250124-bridge-hdmi-connector-v6-0-1592632327f7@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=4721; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=ypMfUVcMuV2bxzV5D0UKlQ7W+VdrRVJ3N05XywV7S44=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnlAqA0lig50t0scgDkH3CmByQC7DMPRWpV5iNn czXL6JL372JATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ5QKgAAKCRCLPIo+Aiko 1Um7CACk7HhG0jg5KrovBcPX1eeON3Y3nXPBU5xQ8yf/WfdB/qcyiFqj/9VGY7Y+kT7MZDRCyds xsBCgvI1q888B61e/8U9C0S2fwFHGqTnnVxqP9Kl4XCtzxOCiXpe8x1SfQd+olVZK5Yrn6FtbUN JEhIWS03k1LGKpZ8gI/hgTXyMvyfBKJbg3kFCYqdAAMaQ8pQDe3PxOdtztSo5H0giL3IuFpKhj5 +EL5qnxutchW8fFGTbhgvbEWWowZJWKPWE2IITtOyH+mopsza0+xecr9N82q6A6z8azHT9fjiuw VnyYuRdr0dnmsYtwaWVKnyztEP1Azo3McbYuYYvSEEE0hCNb 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 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/h= dmi/hdmi_bridge.c index d2b25bcd8eb8f5cf4623e11c87ac5eea6e4b363d..c31e1d33593de6480c0c2b7cb32= 2a85e645ff332 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) } =20 #define AVI_IFRAME_LINE_NUMBER 1 +#define SPD_IFRAME_LINE_NUMBER 1 +#define VENSPEC_IFRAME_LINE_NUMBER 3 =20 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; } =20 +static int msm_hdmi_config_spd_infoframe(struct hdmi *hdmi, + const u8 *buffer, size_t len) +{ + u32 buf[7] =3D {}; + u32 val; + int i; + + if (len !=3D 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 =3D 0; i < ARRAY_SIZE(buf); i++) + hdmi_write(hdmi, REG_HDMI_GENERIC1(i), buf[i]); + + val =3D hdmi_read(hdmi, REG_HDMI_GEN_PKT_CTRL); + val |=3D 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] =3D {}; + 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 =3D 0; i < ARRAY_SIZE(buf); i++) + hdmi_write(hdmi, REG_HDMI_GENERIC0(i), buf[i]); + + val =3D hdmi_read(hdmi, REG_HDMI_GEN_PKT_CTRL); + val |=3D 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, =20 break; =20 + case HDMI_INFOFRAME_TYPE_SPD: + val =3D hdmi_read(hdmi, REG_HDMI_GEN_PKT_CTRL); + val &=3D ~(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 =3D hdmi_read(hdmi, REG_HDMI_GEN_PKT_CTRL); + val &=3D ~(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; --=20 2.39.5 From nobody Sat May 9 09:10:15 2026 Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) (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 A92541F37D1 for ; Fri, 24 Jan 2025 21:48:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737755283; cv=none; b=dVwOdr2VZ5lNLoN+xM2GKZQ4GPKS9KnBj32majOrUFxXdjRmv7wbRVjRBy1dttMf9+tCRujqlKJgVp0cb/JJtepm3XTDDQEWLc2JvfYnMwv2ZkTn/uNleeqlIaBwZ1lnU+m0gDRMqgDtFzkZOqbM36mqh/Dp/TALiaFYHyft6+g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737755283; c=relaxed/simple; bh=6A5aCLP00sWata8KRfqPQ5CnVO9JUTbJd1uu3Qp6jAs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=a4p87oPEM96tww49yCa9NbJfjfrHMc5mxH7SAbGeZgZL0bXLII5/VAAWL2t2bVVLPVXx8yXIouAawkXy4GKrpovB86tzC1DtLBTtf2HHA+t/8M5cktyQVYCGvC1MJhUyivzuupJX31MGDfsf87ih/TKvjDBuaIK+w0m+BAH/Cls= 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=E5NC60qj; arc=none smtp.client-ip=209.85.167.46 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="E5NC60qj" Received: by mail-lf1-f46.google.com with SMTP id 2adb3069b0e04-5439a6179a7so2656530e87.1 for ; Fri, 24 Jan 2025 13:48:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1737755280; x=1738360080; 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=jaIXZ620c8SPNqR/EOcjeZxHQVhRhL3PSxW+/q8xH8Y=; b=E5NC60qjHhmV6DiD+R0lu6LSVoHCHE3WSU+v/MC4V2C5iqiV9yG82iRodgzEwdaKif SCOAoQfjenBiO0w/zhShRSHs5EyhtTrKwwOm3cmwd1ZC5gAsxifnlkRghezjPH3xhfp+ I2KzOWLmqApRfJmKVcaOFR4NKjDCHn+5n6AmCjq1lCeen9V3XuWL2n34nQonLhKvF7gE pBB/h3yA/PYFtdQwbQNUA8KAwxOuCZzWRNTqsSTKcwdEYZdz3bct2xcGPkEi+t6t7nuC 8j67Zbq9FYZTn3fJWpWvsoL0TTZFNCjatLWMWmIuoI/OHBctpBkTsiujhB85amxfbHCs 30KQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737755280; x=1738360080; 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=jaIXZ620c8SPNqR/EOcjeZxHQVhRhL3PSxW+/q8xH8Y=; b=FaKtEVW4273gqrEgq+AeflzCQ/Nja0/70o7f5aAFB9/X4FY8XG+3rDdf0dFiH/0fC8 ddG24NzAl0dTIIZWfwMesUDwgZR/IJIDZ3J1F60S0TtOQkDAhgpZNUHAgAlM4ewLcyiT jg0ZDwNrdHfYC6dVnb7fxBoISiA2uiD1vwEH5hqtBWefTpi2fGgbrZWwG/7lmdne3hvs zgxepjhalb7TzytRVYuulMuzBb0vA5LIgz/FEpmG9x1zbV3anaX68A/QzXcTmK+Bmkw2 ZoKUzJBnRN2yG3FxydRkABZqqpiLthsxKLe8NrSClj9XPSb7rBD2GpanVr8oSAct5h2t O6uQ== X-Forwarded-Encrypted: i=1; AJvYcCUzqiudEs1EXpsMZYsHqbeHXUSqCn+ZVr1TamZIVsSvRYiBxpqjKYE37smLfSxtkXKOXon3cIqjj1AI0M0=@vger.kernel.org X-Gm-Message-State: AOJu0Yzaf8b1UazjuDGipCnYfSKa/h6DHl2F7KbOyvMAbxg4EgKRf/6C sSFXQP/jTGZHzeFaKI6A5NYyZz62uIufHL46ZAvPQecY7MBot/3sTJWbBeo6s4w= X-Gm-Gg: ASbGncsqL+MzD72+is5qJRWqVO7MihrxVn7LuZAB2+3xXu07KM+pYvfxFRS5ltZuvbj f4gCFpHYa6Ux+dD8QtPdQxKUkWZsqKeqWwe0dMq7uDqDbNVDa2wGhAUnVY2j4MEL8/uu4JYCDx1 B9R8RHt/ya0KU57+K/1mr/ijDhQMFGrgDmeqv50u6D5BzHaWRPqgde4/v6aBUZAYSQwBGN6k45I 3YfE0CMBp0ZkxnqoMc34uekY3me1BKNZ3hBn14IoahqHd5946wECCkbA/qNU8tNzBvL87hpGTGa R6yGIcUaOJNM X-Google-Smtp-Source: AGHT+IEmwBFQTTopeGcaCwwyWTXN2DhizvSViHjXm/kfxIMxd8HWEBRaoukAypMxXebY6h/olO6r+g== X-Received: by 2002:a05:6512:3d0b:b0:542:21f8:d6bd with SMTP id 2adb3069b0e04-543c7dab41fmr1968649e87.22.1737755279688; Fri, 24 Jan 2025 13:47:59 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-543c8237491sm425014e87.104.2025.01.24.13.47.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jan 2025 13:47:58 -0800 (PST) From: Dmitry Baryshkov Date: Fri, 24 Jan 2025 23:47:47 +0200 Subject: [PATCH v6 7/7] drm/msm/hdmi: use DRM HDMI Audio framework Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250124-bridge-hdmi-connector-v6-7-1592632327f7@linaro.org> References: <20250124-bridge-hdmi-connector-v6-0-1592632327f7@linaro.org> In-Reply-To: <20250124-bridge-hdmi-connector-v6-0-1592632327f7@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=9947; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=6A5aCLP00sWata8KRfqPQ5CnVO9JUTbJd1uu3Qp6jAs=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnlAqAxeZ6YSaN8+dfdt7IoI//rQ2ZAxV9zfeRs UpqIcCteOyJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ5QKgAAKCRCLPIo+Aiko 1QwVB/9dMKxRddY8I5MDYek73fiBn9x3ZEFQd0JfxtaRF/VgkVHFrFKbjIrBV+z1Rg2KAwJNxy4 7QYFARie061bIx6cVjcWiIamSx3+K8lUJxIz4ceJO8tmTEx2Lj+HtskYjna5a3REaCPH7xAhKiY t3thqpF2kD1adjT8v1Cxl5Tn6ld9iX0f7P5Wk2WitB+G6z56ydKEGGddvPcyNMLK+/mKEppRwQ7 otiWSqZYHnN8FUB1ojTJ0Knm71zxHNShGEmpawiJX5sOuz8SBN56hYcDE2lA6l48Ly23yP3Qemv RuQ062QkO9/3LHRtlXxXyCjt4gvBBtbLOAVO/dPK2ozlU2oC 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. Signed-off-by: Dmitry Baryshkov Reviewed-by: Maxime Ripard --- drivers/gpu/drm/msm/hdmi/hdmi.c | 91 ------------------------------= ---- drivers/gpu/drm/msm/hdmi/hdmi.h | 20 ++++---- drivers/gpu/drm/msm/hdmi/hdmi_audio.c | 75 +++++++++++++++++++++++----- drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 5 ++ 4 files changed, 76 insertions(+), 115 deletions(-) diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.c b/drivers/gpu/drm/msm/hdmi/hdm= i.c index 6b77e0fb8d5ec218dfbf58215e2e12ad1dfb1b85..248541ff449204c72cd444458da= db9ae4a0a53d1 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi.c @@ -14,7 +14,6 @@ #include #include =20 -#include #include "hdmi.h" =20 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 =3D { .hpd_freq =3D hpd_clk_freq_8x74, }; =20 -/* - * 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 =3D 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 =3D HDMI_SAMPLE_RATE_32KHZ; - break; - case 44100: - rate =3D HDMI_SAMPLE_RATE_44_1KHZ; - break; - case 48000: - rate =3D HDMI_SAMPLE_RATE_48KHZ; - break; - case 88200: - rate =3D HDMI_SAMPLE_RATE_88_2KHZ; - break; - case 96000: - rate =3D HDMI_SAMPLE_RATE_96KHZ; - break; - case 176400: - rate =3D HDMI_SAMPLE_RATE_176_4KHZ; - break; - case 192000: - rate =3D HDMI_SAMPLE_RATE_192KHZ; - break; - default: - DRM_DEV_ERROR(dev, "rate[%d] not supported!\n", - params->sample_rate); - return -EINVAL; - } - - ret =3D drm_atomic_helper_connector_hdmi_update_audio_infoframe(hdmi->con= nector, - ¶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 =3D 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 =3D { - .hw_params =3D msm_hdmi_audio_hw_params, - .audio_shutdown =3D msm_hdmi_audio_shutdown, -}; - -static struct hdmi_codec_pdata codec_data =3D { - .ops =3D &msm_hdmi_audio_codec_ops, - .max_i2s_channels =3D 8, - .i2s =3D 1, -}; - -static int msm_hdmi_register_audio_driver(struct hdmi *hdmi, struct device= *dev) -{ - hdmi->audio_pdev =3D platform_device_register_data(dev, - HDMI_CODEC_DRV_NAME, - PLATFORM_DEVID_AUTO, - &codec_data, - sizeof(codec_data)); - return PTR_ERR_OR_ZERO(hdmi->audio_pdev); -} - static int msm_hdmi_bind(struct device *dev, struct device *master, void *= data) { struct msm_drm_private *priv =3D dev_get_drvdata(master); @@ -337,12 +255,6 @@ static int msm_hdmi_bind(struct device *dev, struct de= vice *master, void *data) return err; priv->hdmi =3D hdmi; =20 - err =3D msm_hdmi_register_audio_driver(hdmi, dev); - if (err) { - DRM_ERROR("Failed to attach an audio codec %d\n", err); - hdmi->audio_pdev =3D NULL; - } - return 0; } =20 @@ -352,9 +264,6 @@ static void msm_hdmi_unbind(struct device *dev, struct = device *master, struct msm_drm_private *priv =3D dev_get_drvdata(master); =20 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); =20 diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.h b/drivers/gpu/drm/msm/hdmi/hdm= i.h index ab169b77377097dc22c0c718f65024cb8ad1d317..88a41be7c6fc2f878a1c372a0c7= 5b3277f24f893 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; =20 const struct hdmi_platform_config *config; =20 @@ -205,16 +204,15 @@ static inline int msm_hdmi_pll_8998_init(struct platf= orm_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 - -int msm_hdmi_audio_info_setup(struct hdmi *hdmi, int rate, int channels); -int msm_hdmi_audio_disable(struct hdmi *hdmi); +struct hdmi_codec_daifmt; +struct hdmi_codec_params; + +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); =20 /* * hdmi bridge: diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_audio.c b/drivers/gpu/drm/msm/hd= mi/hdmi_audio.c index 924654bfb48cf17feadea1c0661ee6ee4e1b4589..9c5b5310bfeb54902d7d0687909= afc79e320f560 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 */ =20 +#include + #include + +#include + #include "hdmi.h" =20 /* Supported HDMI Audio sample rates */ @@ -68,7 +73,8 @@ static const struct hdmi_msm_audio_arcs *get_arcs(unsigne= d long int pixclock) return NULL; } =20 -static int msm_hdmi_audio_update(struct hdmi *hdmi) +static int msm_hdmi_audio_update(struct hdmi *hdmi, + struct drm_connector *connector) { struct hdmi_audio *audio =3D &hdmi->audio; const struct hdmi_msm_audio_arcs *arcs =3D NULL; @@ -76,7 +82,7 @@ static int msm_hdmi_audio_update(struct hdmi *hdmi) uint32_t acr_pkt_ctrl, vbi_pkt_ctrl, aud_pkt_ctrl; uint32_t audio_config; =20 - if (!hdmi->connector->display_info.is_hdmi) + if (!connector->display_info.is_hdmi) return -EINVAL; =20 DBG("audio: enabled=3D%d, channels=3D%d, rate=3D%d", @@ -192,29 +198,72 @@ static int msm_hdmi_audio_update(struct hdmi *hdmi) return 0; } =20 -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 >=3D MSM_HDMI_SAMPLE_RATE_MAX)) + struct hdmi_bridge *hdmi_bridge =3D to_hdmi_bridge(bridge); + struct hdmi *hdmi =3D 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 =3D MSM_HDMI_SAMPLE_RATE_32KHZ; + break; + case 44100: + rate =3D MSM_HDMI_SAMPLE_RATE_44_1KHZ; + break; + case 48000: + rate =3D MSM_HDMI_SAMPLE_RATE_48KHZ; + break; + case 88200: + rate =3D MSM_HDMI_SAMPLE_RATE_88_2KHZ; + break; + case 96000: + rate =3D MSM_HDMI_SAMPLE_RATE_96KHZ; + break; + case 176400: + rate =3D MSM_HDMI_SAMPLE_RATE_176_4KHZ; + break; + case 192000: + rate =3D MSM_HDMI_SAMPLE_RATE_192KHZ; + break; + default: + drm_err(bridge->dev, "rate[%d] not supported!\n", + params->sample_rate); return -EINVAL; + } + + ret =3D drm_atomic_helper_connector_hdmi_update_audio_infoframe(connector, + ¶ms->cea); + if (ret) + return ret; =20 hdmi->audio.rate =3D rate; - hdmi->audio.channels =3D channels; + hdmi->audio.channels =3D params->cea.channels; hdmi->audio.enabled =3D true; =20 - return msm_hdmi_audio_update(hdmi); + return msm_hdmi_audio_update(hdmi, connector); } =20 -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 =3D to_hdmi_bridge(bridge); + struct hdmi *hdmi =3D hdmi_bridge->hdmi; + + drm_atomic_helper_connector_hdmi_clear_audio_infoframe(connector); =20 hdmi->audio.rate =3D 0; hdmi->audio.channels =3D 2; hdmi->audio.enabled =3D false; =20 - return msm_hdmi_audio_update(hdmi); + msm_hdmi_audio_update(hdmi, connector); } diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/h= dmi/hdmi_bridge.c index c31e1d33593de6480c0c2b7cb322a85e645ff332..8a1bbcf578b0749480799d9e5b2= baf3778322edc 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c @@ -470,6 +470,8 @@ static const struct drm_bridge_funcs msm_hdmi_bridge_fu= ncs =3D { .hdmi_tmds_char_rate_valid =3D msm_hdmi_bridge_tmds_char_rate_valid, .hdmi_clear_infoframe =3D msm_hdmi_bridge_clear_infoframe, .hdmi_write_infoframe =3D msm_hdmi_bridge_write_infoframe, + .hdmi_audio_prepare =3D msm_hdmi_bridge_audio_prepare, + .hdmi_audio_shutdown =3D msm_hdmi_bridge_audio_shutdown, }; =20 static void @@ -507,6 +509,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 =3D 8; + bridge->hdmi_audio_dev =3D &hdmi->pdev->dev; + bridge->hdmi_audio_dai_port =3D -1; =20 ret =3D devm_drm_bridge_add(hdmi->dev->dev, bridge); if (ret) --=20 2.39.5