From nobody Fri Dec 19 17:20:03 2025 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4D72C13C82E for ; Sat, 17 May 2025 01:59:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447188; cv=none; b=qKQK5u3yWKTjfEBc+mIivCiqCzb9Ixawm7+o/qIpocNZomPrPEzViRd149ITlM20rqgnSJ8OUA9305/JpSclHq1iJ9tExnDWgOa+L2+nD9bYO9qhAgpCL3A29CIRj551Ze+K1Y3fU0e8Y4if4+Xd5tLF6aNKMc3S9JMYM02qFZQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447188; c=relaxed/simple; bh=oaS6Po7R+cg+gJ6q7cqgSpb16Fo8ijum1OmXH8rf4TE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PS1z98KbmX7yXNs88Ls3dCc9gNKM1VXAcTRmQwRH8AGvIif7H0U06NEHnjNixxTimSoGVxKINk0TPnzIl15ufeGYWt01Zt5Ge1Mw8yF4ygVSMsDQMLILA6SVEDdD0H/FDaVA7Zwh4H/Tq/ugBqXqDUqqn1RcTz4j4P3fFfJ7+DM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=l/tXbJAK; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="l/tXbJAK" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54H1mJsH018755 for ; Sat, 17 May 2025 01:59:44 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= 2dg8MLoyMdO4bnciC488h9CAEdYdwBoAJfBSIFF1DXs=; b=l/tXbJAKmMwBGBae UZiTp/xxTak/vhq9m/TLxsvgo7LAuIddfdunQ7qtuTEXU0KzSPXTVtzLwDnRlRxd VJ0hddy6O35SathHmq8oaJAYsVSw3CXs2MB4SbPw8a6CbLbbtfMe5KFGjPEWc6yY tWLbm9vlKg0w4od0wFP43zfusnaaqK+knQDlCWY+vGZhRnykVTsCjVMP0UrP1uXU bdfnQ7mU5ijAmtQNkH4NcqVivhA9MrG+1YSdB1XvM3M4mWpI1ZfQAkjL6KxOr/OE P3ShUPDAa9HYhLOcla8vvdg2Kj3P6d43R5ujhVsS2DyfonMsmszo1tXkrS8f386u 6OCusA== Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46mbcnugud-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Sat, 17 May 2025 01:59:44 +0000 (GMT) Received: by mail-qv1-f69.google.com with SMTP id 6a1803df08f44-6f89b75a8c6so53862966d6.0 for ; Fri, 16 May 2025 18:59:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747447183; x=1748051983; 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=2dg8MLoyMdO4bnciC488h9CAEdYdwBoAJfBSIFF1DXs=; b=Knm+uQBphTcuc13apWhY3rE0WHVE2L4IRbpcqvyOxCd/zCjPfrUOB9b1Ui8cqo5TRP WUzb252GPeHaTw405TDv6WoGxnffImq1YtSxvAXtd1B02m9wShKgvS3+aPFDkvZhWhAI J0FzhisC70Xyr5uTVuYHMNz9hfyiZDUPCFqR4qPZWXFH+ezlc36idHEIj5VFSKw2jCuj 8ongEEnJnEM12toYinpBDGo4kPwT/WNBs9jdb2FhtlCkOA3hHZ/b/NQwQYbbGGZ27vV9 MrM2kWT0o9QpeHLqNF0FxlZdhvQsHKGqJ+aaWqIt4Dv+jfAbl437pJAaXyxzQNRmOHHt qv0A== X-Forwarded-Encrypted: i=1; AJvYcCVj5NwpEbahN7DxEa6wRFRFUGEt3VMYc8wjRq7yAjExp+BZmxv3+nSuc6LJmWA/A4mU6VM2oy085VfujLU=@vger.kernel.org X-Gm-Message-State: AOJu0Yw9Bu+25D2EPVlAq/y3UPDKScdFTk1CrlcyVN4KKPC0hfxHsz4F am0qm8eiYSliC0CXGNQuJ/UOF2Ev1DxnekKkOiofeY0IhJNNpYjolUjvCgdjPpilELqs8eU9OfQ jbFgTIjdTjQ7eW14dYuUKMP41uW/b0jNpAkBNpgSG5jChzasdlC7Cx8XkothK85G5xIp2RUEC/4 Y= X-Gm-Gg: ASbGncslhaoOTkM6X7xrzw2ZtFOVMPJf+uO3FcSNOgopwplPIMJQapXs5a1jrP4z5UG QBUADZRYiYAyMvIevFqZmScNtKZHPSsLKIsFUty6tpf2lLr9syIhSPszgdfcgS+CYh3shxDIlX0 P1jxX34g/g12SwenIpg1wJVaqvaGD3hDLh48nClBpAdPNlK7mGv73NAX7Zg5v7DIY3nqV2MUYm3 7agIqkucuQrXL8WXf3aq4dxB4ueGGvytANWMWihef5gnf1nBZPKG8VuWnFr1GUqSa9yRUwFFCzu km1/WuWt5sfzkTx7XoPOA9tF2xOiRzR967oSqR6i5T0TvppgrfkcRpD7NpJjx5HeC9iX/0uKPnf HBnQt6J+cm/orma8w0ZbfT4u8 X-Received: by 2002:a05:6214:1c09:b0:6e1:6c94:b5c5 with SMTP id 6a1803df08f44-6f8b080f75amr84862456d6.4.1747447183531; Fri, 16 May 2025 18:59:43 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHQAgG5vba5Anxq4hWji3CXaFpanfuubON7sPnyca7B85R5YmyE4rhzwFfcM5Hv5DG7BZ1EHQ== X-Received: by 2002:a05:6214:1c09:b0:6e1:6c94:b5c5 with SMTP id 6a1803df08f44-6f8b080f75amr84862286d6.4.1747447183223; Fri, 16 May 2025 18:59:43 -0700 (PDT) Received: from umbar.lan (2001-14ba-a0c3-3a00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a0c3:3a00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-550e70180f7sm672167e87.128.2025.05.16.18.59.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 May 2025 18:59:42 -0700 (PDT) From: Dmitry Baryshkov Date: Sat, 17 May 2025 04:59:37 +0300 Subject: [PATCH v6 01/10] drm/bridge: move private data to the end of the struct 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: <20250517-drm-hdmi-connector-cec-v6-1-35651db6f19b@oss.qualcomm.com> References: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> In-Reply-To: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Dmitry Baryshkov X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1928; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=oaS6Po7R+cg+gJ6q7cqgSpb16Fo8ijum1OmXH8rf4TE=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBoJ+2KdDng4r3R+df/gbbZzgYEtUrjoAj55RAe6 Tju1cwQ9eSJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaCftigAKCRCLPIo+Aiko 1b5jCACfbxzHh2FRczRcQ73bgtlKc0W6bfz2WeyoN0q6yDnFsoOBqU4OvOSACPa3Benc6vbrbDr X4YpvPcs/1qEJMFVAdLygr1kVjdET/0IkaLHLyJFCBZSi0yqi3qHNJeosCfqQ7B5KsOr8O/B4mc AwRnCBPBaz3E8Zwc0lkIB7VNFG5O9atLHlIPt9nyBMe2yjEKNbTJuMwnTHEmscXNzyEYmOJwc9p Z4fp3Sk4J7U2u3axp9Q3ehcz1F4UniVBm3Upbu+oxc3ik5Ni7lsNolPRidrI4NeaKaePLWIKOqU eiAOvS9xsypZIGp/eGEZiahVK03ZvzU/5HYCRLXjBzY4oSD1 X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-ORIG-GUID: NW0uoyvSvP8JK7dqjazUkszsBmt3MU6T X-Authority-Analysis: v=2.4 cv=aIbwqa9m c=1 sm=1 tr=0 ts=6827ed90 cx=c_pps a=wEM5vcRIz55oU/E2lInRtA==:117 a=Am12PNO99IVxJwGJ:21 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=VwQbUJbxAAAA:8 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=V95sz_wBBgzcx4ufKaUA:9 a=QEXdDO2ut3YA:10 a=OIgjcC2v60KrkQgK7BGD:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-GUID: NW0uoyvSvP8JK7dqjazUkszsBmt3MU6T X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTE3MDAxNyBTYWx0ZWRfX0AdVw52f6kn0 a58IiiCfndBad7e0V07tYRZ8lzSKhLepT5/y4sK25VEn36PK88Y2eqaKBEyADMrAopq2e27XfX4 Q1GHtFaeqxdsH/LY1JHoCpE8KBRy7qyHEusfyHuxXfC3IJA1dVhTe7ksrPPSgsdvScVe1OU0Bom lXik0evVYVXHPKKB7TdbmTZ5tezjQ5v3GVOnwX1Ry1pvoK0EdZ8vFmIV+ouKCfRhioOnhcPacaN L0V4lKeinnOUkP9tp0p27pd79RRmUy+Ir0QkEki2tFOESaSEJY2hzfKbRPBdjzNKT3uxBqx4JJO fQBPIc5uOlhkn7bFqQ0JEH6ZOLInTRdugeXRt6Cex+bx+uXYasYBpe8bVhlMXNrkaD/w4CQK1dF BqrvTZtPzRKqyMYmUign8n9n6kSlMA1CDasySaQH9HWAba52XezazDRsETzRag8hMtYiKTE6 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-17_01,2025-05-16_03,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 mlxlogscore=999 malwarescore=0 bulkscore=0 impostorscore=0 clxscore=1015 phishscore=0 suspectscore=0 mlxscore=0 spamscore=0 lowpriorityscore=0 priorityscore=1501 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505070000 definitions=main-2505170017 WHen adding HDMI fields I didn't notice the private: declaration for HPD fields. Move private fields to the end of the struct drm_bride to have clear distinction between private and public fields. Reviewed-by: Maxime Ripard Signed-off-by: Dmitry Baryshkov Signed-off-by: Dmitry Baryshkov --- include/drm/drm_bridge.h | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index 4e418a29a9ff9d014d6ac0910a5d9bcf7118195e..286f6fb3fe2b80f237db85dc845= 9430dc82337e2 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -977,21 +977,6 @@ struct drm_bridge { * @ddc: Associated I2C adapter for DDC access, if any. */ struct i2c_adapter *ddc; - /** private: */ - /** - * @hpd_mutex: Protects the @hpd_cb and @hpd_data fields. - */ - struct mutex hpd_mutex; - /** - * @hpd_cb: Hot plug detection callback, registered with - * drm_bridge_hpd_enable(). - */ - void (*hpd_cb)(void *data, enum drm_connector_status status); - /** - * @hpd_data: Private data passed to the Hot plug detection callback - * @hpd_cb. - */ - void *hpd_data; =20 /** * @vendor: Vendor of the product to be used for the SPD InfoFrame @@ -1043,6 +1028,22 @@ struct drm_bridge { * not used. */ int hdmi_audio_dai_port; + + /** private: */ + /** + * @hpd_mutex: Protects the @hpd_cb and @hpd_data fields. + */ + struct mutex hpd_mutex; + /** + * @hpd_cb: Hot plug detection callback, registered with + * drm_bridge_hpd_enable(). + */ + void (*hpd_cb)(void *data, enum drm_connector_status status); + /** + * @hpd_data: Private data passed to the Hot plug detection callback + * @hpd_cb. + */ + void *hpd_data; }; =20 static inline struct drm_bridge * --=20 2.39.5 From nobody Fri Dec 19 17:20:03 2025 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BCDD6142E77 for ; Sat, 17 May 2025 01:59:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447189; cv=none; b=ksxbyIRI3Wp0BiiUi11RETOGWrvjnY50xeQxiPNJy2bVb5EZZztL2wylY1p0+xTv6uuV7B9qa0TKYqkq6k6tzXdmXL4SyTVGVYPXFv4qPn13pL32OWoDSXVCguvLLqZ8hr6Q2xozSYBvLQIEsj2Z8+MXXoK2tq2wOnwt/EeU9C4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447189; c=relaxed/simple; bh=jWdmXnk5KQZ7QqiqS4ntkIepKln6k4Qq9yyz2/39Hbs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Sap55/XieVdJ1oEbe7LyBDhQt8oJONqLSHJ+FU5Ks2Rw+qnYm+5rLu7M37krcdj5IMB1ME4933AEPLyjBAfMHjPNZeYD9lSwbgaNHfKvrCkrsxfSNlsvT2pxZari9BYNZySksZ3TKguA7DAYGuZJU/HEtRXMoho/e9N5MW4gzeY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=TuFIqPjc; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="TuFIqPjc" Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54H1BnrI026181 for ; Sat, 17 May 2025 01:59:47 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= lCTTLYELgEB4afW0sXqvdFWgp95Hv4OasYO1O5ZEWH8=; b=TuFIqPjcX4Q2PPBl Nt7HeKo9SbMS05n6J094icrkr9OIdKylJkGweZWgjbMnkVdIQG8BGSXj7arkSUVa 3LUfQDBpey7IVSzxcNwwCUD1QE2XYtPbdn6lNotoJxGePLIYMDCkpDwl+ZCxPxPa S+PmQPVVvJIbP75tNtlpfhHN0KZFWxNsVc4cZA6yTClZsNt9n+D2K3aPD2oUKMN2 jdy/jMZVrDQtriNbmPCZBJJuYh+uqoch68pEV/OCpIEka7Z34yFhqJAG6PRBsJrZ m4YTlngrSdaga34DnDM0lP8t2aJ8kV51dKsyUBcM2y1393vrelooUVIIkST25fuA I7QcDg== Received: from mail-qv1-f72.google.com (mail-qv1-f72.google.com [209.85.219.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46mbcyutcv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Sat, 17 May 2025 01:59:46 +0000 (GMT) Received: by mail-qv1-f72.google.com with SMTP id 6a1803df08f44-6f6ea9b56c4so46991716d6.1 for ; Fri, 16 May 2025 18:59:46 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747447185; x=1748051985; 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=lCTTLYELgEB4afW0sXqvdFWgp95Hv4OasYO1O5ZEWH8=; b=e56vYe+MND/FzggomiRnF/PHsXJHZCbE3w1pSTXSBFCR64YdSNpUM56GoryS5dJ0a+ K7yK1L3Vueuvwhvszjs+pcGp8K/SDFOyAckfyO9bd4OLVCBsTSk3ItxtJfg+LO71TY7U 18wCTWjrEdf815DK6RLLpJCXa9wUMxoxDZf145JlprZzpxVrZ5KIfX44VdvjJCygjFUL sr7gCo5njiOXWpIkjIPWiRh7LGPFZywC+UexsP9bejak/LWIjhBmMxgqNhsz6Xo6NanG EykyB0MfjpSka7RrLIA3a7hfK0bgg53inU3e6KgPFo7UyqsiI68uy+agajJrikrmX6fS Dk8w== X-Forwarded-Encrypted: i=1; AJvYcCWKyyv95vgJ/J+qLVuQFS1dV5EVevW4vNa4JSrv448xnwrFyYi1rmdqH73s1xaYGjtlbrqwLoOQWyMtNNk=@vger.kernel.org X-Gm-Message-State: AOJu0Yxl30sxVKUVDZZdHqTF2kowwR0sZXhQgnirkE9aOtc5LiC3JmOz rDrEoHvWCaQDP3i5pqpyrC1uDGkldSCTvg4eskPQuzqnjRKU1fKEkL4VAUaYuV0mMAEy4myOF2w 3V6EJbmWuboBMtkhzQLNhLtzC05gmuv68FXiJmplIdNRFq8c2pZWy1rfdcdFIuamdWGFpglObIA M= X-Gm-Gg: ASbGnctYE+uXrvE9UUKXB/FztbTWNoL0WWgdnfZFZqqgdf+hmeCjtIsdtFAmXp2zEHN fFmgnY5oYW+ZzHFohNgGCJnkw8qRAiZEsNpXRsnPwyqmodllX0B9vZKp9zwYayKmiF50eQcS+Ml J1wZu44DeNhIZxpRbrWu1Ja72A3wIHX2m05kJJR0FTJw3mgzw4mdd8g0Qd9Iu5KeaAuh16Z76RN ctf3FvH8FI07adVDNaIWmzPQBFW8x83oyA3gzkZmTVwCKUvXV3J7kIFjCwZ7SKidQ1zBmcDVZF3 MABtIw/JkRf13qplxMjUssWpPZJjxw82cAN1OaC83IOFYqLrecyS0BQpvhVsVGhr9Jb57iSOwgj qldGyyDSw+PCvSewZLqaUZ7W1 X-Received: by 2002:a0c:f201:0:b0:6f8:997d:fc84 with SMTP id 6a1803df08f44-6f8b2d25cb4mr82308766d6.19.1747447185023; Fri, 16 May 2025 18:59:45 -0700 (PDT) X-Google-Smtp-Source: AGHT+IER24l9ssX5tG+gzt1zYw9jxyNNdfOV+z02DDPB4ediOmkiKiWW6N5WRy4tgk5BqCl2M9Tsxg== X-Received: by 2002:a0c:f201:0:b0:6f8:997d:fc84 with SMTP id 6a1803df08f44-6f8b2d25cb4mr82308506d6.19.1747447184675; Fri, 16 May 2025 18:59:44 -0700 (PDT) Received: from umbar.lan (2001-14ba-a0c3-3a00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a0c3:3a00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-550e70180f7sm672167e87.128.2025.05.16.18.59.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 May 2025 18:59:43 -0700 (PDT) From: Dmitry Baryshkov Date: Sat, 17 May 2025 04:59:38 +0300 Subject: [PATCH v6 02/10] drm/bridge: allow limiting I2S formats 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: <20250517-drm-hdmi-connector-cec-v6-2-35651db6f19b@oss.qualcomm.com> References: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> In-Reply-To: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Dmitry Baryshkov X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4874; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=jWdmXnk5KQZ7QqiqS4ntkIepKln6k4Qq9yyz2/39Hbs=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBoJ+2KTLrlUyK6fPsI+fq3sq1JV3VTt+CHqQl9A YE0O/RhDReJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaCftigAKCRCLPIo+Aiko 1aL/CACD+SUjErGb1xcct84taQhDl6pWcON3nZ0HNbODXAKAXmpsr4tW0dvyFzlXjjA4LzkAqs7 DfOaHGYEM3CJI9XKk01A6GKJL3ZyzF/uX/tUxeVCOkTvKuOfATi7kSUlrIhgOi5p5pK9gGh8oHu C2hBt7/2FVW75rchiSsQH0I689t+j1UEo8Jyy5lYZVrfW0j2YgfezdKMrkGJ6izpLpbrxEUA2vp s3y8OLWyT0XEP6fEdU3gbsEJrtqu9aJlFl7NQyxziPMaB13BocC9Q99d4sk11gVxxn5LvvFE1We x4uEw8KtjOQKfSxty1MEo5TXCyOFVqWiPNm1Ng1W3mL3OCur X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-GUID: NkgCiwyVsqnV-haC59_V-a4kTeFYY0QT X-Proofpoint-ORIG-GUID: NkgCiwyVsqnV-haC59_V-a4kTeFYY0QT X-Authority-Analysis: v=2.4 cv=JszxrN4C c=1 sm=1 tr=0 ts=6827ed93 cx=c_pps a=7E5Bxpl4vBhpaufnMqZlrw==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=VwQbUJbxAAAA:8 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=JbrL1DnuwQtsaYKQthAA:9 a=QEXdDO2ut3YA:10 a=pJ04lnu7RYOZP9TFuWaZ:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTE3MDAxNyBTYWx0ZWRfXyjsx4cdM61Kb IbY/CL0XKoBHvkAPktdARtQlkvQYI8tTgm47Kp9VSmRSnHRdvY7l0rIJLQclzQ+ZvfojTBfiS9q Z/30iyyOp18pVIl5Gee0rXb7WlT2EnZRz5Dtd+og6b91UWI+LBPcTk/GmPqDLB3yirYQhBZJdTE PsOwea34lfB3N215R022gfWp6wCz5YlJIOgCnUfwIUnvUBhz8FDK+Kgxhbm6E0mzk0Yktor8BNA HWyHPpJY+SAfwVgq3oILZEAjTvlaPXOm9ACvPfyk1vFHQfRyyCIIplTsNJb3tbwKt+YnkY0eQ3g CNunZztQZQ5SoN4tp0CusbeNrsSEMD1jpYmrEcvckTbhe9whh3UEa1n2p1OAPGqiv0f0tGvOEec MPvuXNJxMISW41vzhS4KzYqRbCYMt1d9zeSVoQZRtOLogyXLjop9T+6nwuCtSpqnVwrzkWL9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-17_01,2025-05-16_03,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 priorityscore=1501 suspectscore=0 mlxlogscore=999 bulkscore=0 malwarescore=0 mlxscore=0 adultscore=0 phishscore=0 spamscore=0 lowpriorityscore=0 clxscore=1015 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505070000 definitions=main-2505170017 By default HDMI codec registers all formats supported on the I2S bus. Allow bridges (and connectors) to limit the list of the PCM formats supported by the HDMI codec. Reviewed-by: Maxime Ripard Signed-off-by: Dmitry Baryshkov Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/display/drm_bridge_connector.c | 1 + drivers/gpu/drm/display/drm_hdmi_audio_helper.c | 3 +++ drivers/gpu/drm/vc4/vc4_hdmi.c | 2 +- include/drm/display/drm_hdmi_audio_helper.h | 1 + include/drm/drm_bridge.h | 8 ++++++++ 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index 7d2e499ea5dec2f710c1c67323bf9e6b177d3c9e..381a0f9d4259bf9f72d3a292b7d= cc82e45c61bae 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -717,6 +717,7 @@ struct drm_connector *drm_bridge_connector_init(struct = drm_device *drm, ret =3D drm_connector_hdmi_audio_init(connector, dev, &drm_bridge_connector_hdmi_audio_funcs, bridge->hdmi_audio_max_i2s_playback_channels, + bridge->hdmi_audio_i2s_formats, bridge->hdmi_audio_spdif_playback, bridge->hdmi_audio_dai_port); if (ret) diff --git a/drivers/gpu/drm/display/drm_hdmi_audio_helper.c b/drivers/gpu/= drm/display/drm_hdmi_audio_helper.c index 05afc9f0bdd6b6f00d74223a9d8875e6d16aea5f..21c93bdd8648cf70e691dbf0c92= fae5823fd1828 100644 --- a/drivers/gpu/drm/display/drm_hdmi_audio_helper.c +++ b/drivers/gpu/drm/display/drm_hdmi_audio_helper.c @@ -142,6 +142,7 @@ static const struct hdmi_codec_ops drm_connector_hdmi_a= udio_ops =3D { * @hdmi_codec_dev: device to be used as a parent for the HDMI Codec * @funcs: callbacks for this HDMI Codec * @max_i2s_playback_channels: maximum number of playback I2S channels + * @i2s_formats: set of I2S formats (use 0 for a bus-specific set) * @spdif_playback: set if HDMI codec has S/PDIF playback port * @dai_port: sound DAI port, -1 if it is not enabled * @@ -154,6 +155,7 @@ int drm_connector_hdmi_audio_init(struct drm_connector = *connector, struct device *hdmi_codec_dev, const struct drm_connector_hdmi_audio_funcs *funcs, unsigned int max_i2s_playback_channels, + u64 i2s_formats, bool spdif_playback, int dai_port) { @@ -161,6 +163,7 @@ int drm_connector_hdmi_audio_init(struct drm_connector = *connector, .ops =3D &drm_connector_hdmi_audio_ops, .max_i2s_channels =3D max_i2s_playback_channels, .i2s =3D !!max_i2s_playback_channels, + .i2s_formats =3D i2s_formats, .spdif =3D spdif_playback, .no_i2s_capture =3D true, .no_spdif_capture =3D true, diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index a29a6ef266f9a5952af53030a9a2d313e2ecdfce..4797ed1c21f47992fe4d497d904= ee31c824cd449 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -562,7 +562,7 @@ static int vc4_hdmi_connector_init(struct drm_device *d= ev, =20 ret =3D drm_connector_hdmi_audio_init(connector, dev->dev, &vc4_hdmi_audio_funcs, - 8, false, -1); + 8, 0, false, -1); if (ret) return ret; =20 diff --git a/include/drm/display/drm_hdmi_audio_helper.h b/include/drm/disp= lay/drm_hdmi_audio_helper.h index c9a6faef4109f20ba79b610a9d5e8d5980efe2d1..44d910bdc72dd2fdbbe7ada65b6= 7080d4a41e88b 100644 --- a/include/drm/display/drm_hdmi_audio_helper.h +++ b/include/drm/display/drm_hdmi_audio_helper.h @@ -14,6 +14,7 @@ int drm_connector_hdmi_audio_init(struct drm_connector *c= onnector, struct device *hdmi_codec_dev, const struct drm_connector_hdmi_audio_funcs *funcs, unsigned int max_i2s_playback_channels, + u64 i2s_formats, bool spdif_playback, int sound_dai_port); void drm_connector_hdmi_audio_plugged_notify(struct drm_connector *connect= or, diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index 286f6fb3fe2b80f237db85dc8459430dc82337e2..db0d374d863b0b1f774d395743f= 1e29bb84e8937 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -1016,6 +1016,14 @@ struct drm_bridge { */ int hdmi_audio_max_i2s_playback_channels; =20 + /** + * @hdmi_audio_i2s_formats: supported I2S formats, optional. The + * default is to allow all formats supported by the corresponding I2S + * bus driver. This is only used for bridges setting + * @DRM_BRIDGE_OP_HDMI_AUDIO or @DRM_BRIDGE_OP_DP_AUDIO. + */ + u64 hdmi_audio_i2s_formats; + /** * @hdmi_audio_spdif_playback: set if this bridge has S/PDIF playback * port for @DRM_BRIDGE_OP_HDMI_AUDIO or @DRM_BRIDGE_OP_DP_AUDIO. --=20 2.39.5 From nobody Fri Dec 19 17:20:03 2025 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3B9FD1494DB for ; Sat, 17 May 2025 01:59:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447190; cv=none; b=u+cVDFaT00lK9LCs2OPQ/feyfN00ZACnW9xkyzdoNsE6ZGUV0z5v3GnjHcTL/UUvXvyspIIPd5bqRY0Pe7IuZUKKzyv5ecrI9jj8k0nkAPcf8+hNUQVVlMXUfbpHMyZ7u0WGmReayEbV1MSfLNPEzcynBGIy6BgHPR7raecICFo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447190; c=relaxed/simple; bh=ajaCqNSgbIA1IDZCd+vEJPLBT31lOSpLJmY8tw8WOjs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cU8RDqWfzQzIbk1U6gqLczCVNW8OnC9qV+BahKx1Zz4GXHxs/CC+nPicef0A7RtudCXWCwAbyMlG9Eei+PZ4doOWkE4tMcWG6uqAlUW45pjEAI9zMjaYFSPEu350keZq3+TLLl4D2d0m7BXMxDpQa7y5KPpIMIdLvI3UFni4uXU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=fsxSOMse; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="fsxSOMse" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54H1m2S9018727 for ; Sat, 17 May 2025 01:59:48 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= lOtrynwNsxLQ/5vzpGhNJsN3NBvcPSFOhu9989Fyvnw=; b=fsxSOMseQL+R7TGC 2yOlAY+bUVEHWcqotupdShY21/o70zqBj9qOAAQELoPyMOD5IaFjBU8v3ZdAO76+ bnQH2tZ6qdK8PyH3zpZWLyUg0LLZMbUKSJQ+ayH+O4qzWSgQyTdiuE8fLT5xGXuL MZb1aKJ+imZpbZRVT6AIPA0nNVLt+P7KjciElbEzI0809su0RTnb0aN9HGdPn2Z2 SkviealcrSSj2slUVB1At2nW1Cm9qA8MXnHD6NpCrUmzrucmsKtNvphqPkobHL7H T7XFm19ub1NyALaB6H/9Le22sz9D95ZSMVvkuPOW0tcF/sknNS/Osmp6zwtLjkJv 60FTmQ== Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46mbcnuguj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Sat, 17 May 2025 01:59:47 +0000 (GMT) Received: by mail-qv1-f69.google.com with SMTP id 6a1803df08f44-6f8c2ad9cf2so9296016d6.3 for ; Fri, 16 May 2025 18:59:47 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747447186; x=1748051986; 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=lOtrynwNsxLQ/5vzpGhNJsN3NBvcPSFOhu9989Fyvnw=; b=w/njUdCOJx22mloOafRdLn6t7wz2DBlhP06VuTCuQ+SdmY182ujsKwuymmrdstSSsq BmKTFCEaCqZEoOo8vmA4ODygK+LG8pWQ3WQwmyh//weaWzfqqP4JpMbaFaal5WEO7xci 249QaHD8xm4z8i66ZO+v6j6dS8jnfiTpW9deb91komLcIs7EhUqlMrfGGfs5In4mcCia qJLynM+M3F5GVuFGsGyqnFNwmSI2AcWeefAPn2dW5NPUHNKGPr9FhbHmZpLw8625lyKT 10vPbqeGXoEmxKHkF7Ns9qOYP8JEifZE8HMjME+By/QF5/6SztWs0txz3v7af+Pvtdy2 CGSg== X-Forwarded-Encrypted: i=1; AJvYcCVHktSsmgpMJOMe6+wfAcn5Clh2SjuBdFdp5AYAhG5vNkPNWvCUL9QP4aDcJi3Oux58KyCp84K6QLPlOnI=@vger.kernel.org X-Gm-Message-State: AOJu0Yy9ex/l6HCq/qkC4YR6AwgwEsI/r1298AYK3LakchUotfA7LUgg ftC2fd13stwUgq3WLRt7MPEci/9IS63ufavDiB2RWEk3KWyQPtt79kZyu+QbCs8Pqlh9HVPlTRP vQbjkPih7IXPazO9hVhYLvTa9MZ4nTqiBJ+rGARrXHD/6Mcm0uACoDesINdSyqp2VYm+ZC8ZtIe o= X-Gm-Gg: ASbGncsA3bWUCN8XcyO4L9UL/culZZZi3XvG6Gzh1HKaK4/yVIEfmMhorB3qDpMBzHT Zi6R7q6XYRgu6Gvn7HBK/CLo4i3T5CN2QjsB6GvEY8u6OdRzHGl0v6Sf/bMA96KZ6lJdlflEnFM seh/u3QDq3VLpz87t0pnBYE5dwVxLfm33yB6pSrdBwFD7wHmRU/W/FZFFxYOupnpyV7naKS27cC Ni5bsl87BbkmpyTz9fTg2MgAOvG/EjPIsvSzqqCK7kPV1oqNhciZKYbfcM1C1ZxbHQutU4pBEfi pEC3QLW50syhQfnwpD/VksA+3XqU++3SCLTxUPqXUakPoVyLZucTqvaS+HWYCOPNfkDE07bDW1q WdpdFAXCUfxh/Vo+MJUukkUrm X-Received: by 2002:a05:6214:2346:b0:6f8:997d:fc81 with SMTP id 6a1803df08f44-6f8b2d27bf1mr79878866d6.20.1747447186633; Fri, 16 May 2025 18:59:46 -0700 (PDT) X-Google-Smtp-Source: AGHT+IF4xL9Easp4CTrvgavbYymdPdT+TCn8QDprrv+JKEbRlucHxgq6Y2vCLa0EOoapFr31HSsmAg== X-Received: by 2002:a05:6214:2346:b0:6f8:997d:fc81 with SMTP id 6a1803df08f44-6f8b2d27bf1mr79878606d6.20.1747447186248; Fri, 16 May 2025 18:59:46 -0700 (PDT) Received: from umbar.lan (2001-14ba-a0c3-3a00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a0c3:3a00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-550e70180f7sm672167e87.128.2025.05.16.18.59.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 May 2025 18:59:45 -0700 (PDT) From: Dmitry Baryshkov Date: Sat, 17 May 2025 04:59:39 +0300 Subject: [PATCH v6 03/10] drm/connector: add CEC-related fields 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: <20250517-drm-hdmi-connector-cec-v6-3-35651db6f19b@oss.qualcomm.com> References: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> In-Reply-To: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Dmitry Baryshkov X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4994; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=ajaCqNSgbIA1IDZCd+vEJPLBT31lOSpLJmY8tw8WOjs=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBoJ+2LjBQ9BlT78Q2KEMSM1T202uQB2O9I2lxqf FthWNAgFlWJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaCftiwAKCRCLPIo+Aiko 1aKKCACvak+7ezHPoV1R3z1HvU5a3my63VsT+ZeMakTHpFb/6Y8jqUrjDYefqAC+IH3oGpaeCyg ghc7OkyegC5JX47w5m6eb7a6teYdhAay76FKiddP93j4/eRANctu+GHrZvjpGt52yrUJvfEgktC lLprCBcl0fNOydTURXjgpMpCKfhhQROK/AgHJXFSTAZQIUI9RFLrAg33AY3/+K6T1dtIQeX/hdL 702kDOBWOtqhbyFko4FfCamuaYOkWsJwp8dpihrDye/43/ZsCw9JmN/mOj8kjtwvcTLTJw2J1rg WXACVN7W4cujaU5xQvX0JoqyDlYu1L3s0F5/zp7eWL4IphUn X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-ORIG-GUID: Kq2eAQQlusy_RHQSgKs9R3TFMYV-vBDc X-Authority-Analysis: v=2.4 cv=aIbwqa9m c=1 sm=1 tr=0 ts=6827ed93 cx=c_pps a=wEM5vcRIz55oU/E2lInRtA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=gz6TB5zNMfFrGp8g0GgA:9 a=+jEqtf1s3R9VXZ0wqowq2kgwd+I=:19 a=QEXdDO2ut3YA:10 a=OIgjcC2v60KrkQgK7BGD:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-GUID: Kq2eAQQlusy_RHQSgKs9R3TFMYV-vBDc X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTE3MDAxNyBTYWx0ZWRfXz08AdsDbh1iZ 1O9jHSKLU5zHJvlGyyUSjf35WF3ga9Nfp+KYHNgVWSHvWi5/tELS8Gkhwzs7+f08Sa1dObCziJ2 oxaUTEO3QxXkcXgQ1hRcHtVn2ZOOk6/3VKA9Cp2BUgyjR0k6ayoX+3AbzhQggc5FyiBy2TVsBYC h35TA+BUDLJ6uKxAfgYYIcQNpQVfGyYrSdrfH9n1u3Mo4bgB4hg5oQ8thQfNuyaCld5OrKs2zS5 QNAiOhw88fdYR0CTPNJyyxXotUQKL/kEAm4ZpHi27BM5cf9e6u11XjHVp4JMQwI68vXltYE7Dm+ qjR6Md8O3EVsUAkn56XzoUda9fdtp/WZW/gkfdqEA72/PtEbP+pbVOCbsnCTj0WYgojSI64J2fS gsJWGfG2oyBMKS6gZ8qhxDY7J85t+zmb4d2k9y2fjqwLRRTghm3TI9EaaC271t8kX47Ifjak X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-17_01,2025-05-16_03,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 mlxlogscore=999 malwarescore=0 bulkscore=0 impostorscore=0 clxscore=1015 phishscore=0 suspectscore=0 mlxscore=0 spamscore=0 lowpriorityscore=0 priorityscore=1501 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505070000 definitions=main-2505170017 As a preparation to adding HDMI CEC helper code, add CEC-related fields to the struct drm_connector. The callbacks abstract CEC infrastructure in order to support CEC adapters and CEC notifiers in a universal way. CEC data is a void pointer as it allows us to make CEC data helper-specific. For example, currently it will be either cec_notifier or cec_adapter + drm_connector_hdmi_cec_funcs. Later cec-pin might store platform callbacks here. DP CEC might need to store AUX pointer, etc. Signed-off-by: Dmitry Baryshkov Signed-off-by: Dmitry Baryshkov Reviewed-by: Maxime Ripard --- drivers/gpu/drm/drm_connector.c | 42 ++++++++++++++++++++++++++++++++++++ include/drm/drm_connector.h | 48 +++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 90 insertions(+) diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connecto= r.c index 48b08c9611a7bc70e4d849ff33ecf1c9de3cf0ae..ba08fbd973829e49ea977251c4f= 0fb6d96ade631 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -279,6 +279,7 @@ static int drm_connector_init_only(struct drm_device *d= ev, INIT_LIST_HEAD(&connector->probed_modes); INIT_LIST_HEAD(&connector->modes); mutex_init(&connector->mutex); + mutex_init(&connector->cec.mutex); mutex_init(&connector->eld_mutex); mutex_init(&connector->edid_override_mutex); mutex_init(&connector->hdmi.infoframes.lock); @@ -701,6 +702,47 @@ static void drm_mode_remove(struct drm_connector *conn= ector, drm_mode_destroy(connector->dev, mode); } =20 +/** + * drm_connector_cec_phys_addr_invalidate - invalidate CEC physical address + * @connector: connector undergoing CEC operation + * + * Invalidated CEC physical address set for this DRM connector. + */ +void drm_connector_cec_phys_addr_invalidate(struct drm_connector *connecto= r) +{ + mutex_lock(&connector->cec.mutex); + + if (connector->cec.funcs && + connector->cec.funcs->phys_addr_invalidate) + connector->cec.funcs->phys_addr_invalidate(connector); + + mutex_unlock(&connector->cec.mutex); +} +EXPORT_SYMBOL(drm_connector_cec_phys_addr_invalidate); + + +/** + * drm_connector_cec_phys_addr_set - propagate CEC physical address + * @connector: connector undergoing CEC operation + * + * Propagate CEC physical address from the display_info to this DRM connec= tor. + */ +void drm_connector_cec_phys_addr_set(struct drm_connector *connector) +{ + u16 addr; + + mutex_lock(&connector->cec.mutex); + + addr =3D connector->display_info.source_physical_address; + + if (connector->cec.funcs && + connector->cec.funcs->phys_addr_set) + connector->cec.funcs->phys_addr_set(connector, addr); + + mutex_unlock(&connector->cec.mutex); +} +EXPORT_SYMBOL(drm_connector_cec_phys_addr_set); + /** * drm_connector_cleanup - cleans up an initialised connector * @connector: connector to cleanup diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index f13d597370a30dc1b14c630ee00145256052ba56..73903c3c842f3803e26c34abe7b= 5f0416f013d4e 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -1191,6 +1191,29 @@ struct drm_connector_hdmi_audio_funcs { bool enable, int direction); }; =20 +void drm_connector_cec_phys_addr_invalidate(struct drm_connector *connecto= r); +void drm_connector_cec_phys_addr_set(struct drm_connector *connector); + +/** + * struct drm_connector_cec_funcs - drm_hdmi_connector control functions + */ +struct drm_connector_cec_funcs { + /** + * @phys_addr_invalidate: mark CEC physical address as invalid + * + * The callback to mark CEC physical address as invalid, abstracting + * the operation. + */ + void (*phys_addr_invalidate)(struct drm_connector *connector); + + /** + * @phys_addr_set: set CEC physical address + * + * The callback to set CEC physical address, abstracting the operation. + */ + void (*phys_addr_set)(struct drm_connector *connector, u16 addr); +}; + /** * struct drm_connector_hdmi_funcs - drm_hdmi_connector control functions */ @@ -1832,6 +1855,26 @@ struct drm_connector_hdmi { } infoframes; }; =20 +/** + * struct drm_connector_cec - DRM Connector CEC-related structure + */ +struct drm_connector_cec { + /** + * @mutex: protects all fields in this structure. + */ + struct mutex mutex; + + /** + * @funcs: CEC Control Functions + */ + const struct drm_connector_cec_funcs *funcs; + + /** + * @data: CEC implementation-specific data + */ + void *data; +}; + /** * struct drm_connector - central DRM connector control structure * @@ -2253,6 +2296,11 @@ struct drm_connector { * @hdmi_audio: HDMI codec properties and non-DRM state. */ struct drm_connector_hdmi_audio hdmi_audio; + + /** + * @cec: CEC-related data. + */ + struct drm_connector_cec cec; }; =20 #define obj_to_connector(x) container_of(x, struct drm_connector, base) --=20 2.39.5 From nobody Fri Dec 19 17:20:03 2025 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 96CC5170826 for ; Sat, 17 May 2025 01:59:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447193; cv=none; b=Cl5Gds5Fk6OJYL3XyXuLtsMTqh4YTkX9oD96qSt8kACJQG1k40flDFPxYylIk4CmR18wpFpP8euSAKAuuoZoTfPWcOziqfsFAXYYPnQoUxgY5jXOVAyQW0viW9khMYG/PUr2aEBZTZJtyrBo+/1sknIEoglAjytxJ8TFRFb9KBw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447193; c=relaxed/simple; bh=xsPFZuAoy5Xx+HAHSFTO3CpJ9ZWa79t8iv7KrGNnsVQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MxzNVZnIdb9/7uaUGhLLmtd/lY5Hhxd1n+EmJy5F8a4cI7ceu8z6azud0pkHR+oNf5Q9F0vZASPWnTtUYpEknTFKVFt275e6tV4cYho7qKhsa9U9whyl8Q31bJprTy8bIdxArVA8kTlN/ZWhg4MHjwxgJ0jrpKWdIO5b5N1HTiA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=FzlF3ON8; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="FzlF3ON8" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54H0imH1027487 for ; Sat, 17 May 2025 01:59:50 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= KyyWakxU/Z7DnyDzppFomci4qtOg/Wp/7gLP5SesAjI=; b=FzlF3ON8IURSYoRR 5gPeKKOsUxVtsVNEHeaWuYJib4avDnhR2l3fQChF9Cpu0iF4jcVdDKtO0cM/LdTg BON8iVlwydjWFP+ULHEO/vY57t2NLRi0vgKBcGsGtPYV0ShvjWXFrt+oYmQ/+/55 3ZCyJ4OWA891aECmw29d+fUT3ZOt5UgNFzTJUFotUdcW3cfMko0PSM1rDFwl6BlL 9Q3jiHkt7eTAXGsVOKQ22IJs9wNbPH8WWUjjQeMmq7z/i20aGtfIRGHD2RChwDTt kpM+sL/aVCYBvVfvEEVQM0PM6dsy6tbKtiF+VJV6ntZq98yxKbGXQSdzc7214kY9 IEvyjQ== Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46pg5hr30r-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Sat, 17 May 2025 01:59:50 +0000 (GMT) Received: by mail-qv1-f69.google.com with SMTP id 6a1803df08f44-6f6ef385d1bso30983566d6.3 for ; Fri, 16 May 2025 18:59:50 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747447188; x=1748051988; 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=KyyWakxU/Z7DnyDzppFomci4qtOg/Wp/7gLP5SesAjI=; b=LGqLAwtPuUWRcTswx08nNWIjG8py1C6hqeI5pKm1Aj2nmMhQoCkmoGPIF8NctO6+s7 2Zj6yCVIpPBqepLKCeTpGdYGZr742jFGEMSEPpMzrHb/QLdF1KSX/+0R0v3Z3FRacmVU W0F0OZ4GyJSSLWLGkoyFkJ9rIdLys6EIplNR3FF8ontaFx6BIsTLViAaMHwSnoZkdkc/ scn6FR6/wMkVPuvTRVx3TkfUG+ieWl+7hDYPD5nXW8JKriZPg+F7Lyhvi/Y33YbpUbqO O+3ZCS3pPZ3uRFon/dltEHAKh2ZdEANelAW9wBtawemnWqS4y88CF7wUpC7iY3rE7R6k EWBw== X-Forwarded-Encrypted: i=1; AJvYcCU70zq0qA/wOl+2tb9qDK1jrtdWyaymp6YvYMtl4rwVKMgJ1TsFAz4T5Ta+XyiqZCNm4XxNM5gyg8+zlJY=@vger.kernel.org X-Gm-Message-State: AOJu0Yzztfv20d5P6wbPVdMh9Owl+JO7MXxIU5sh2/L/LVpwCDURI6qW /qIEQ1tkspBzlUjg0xS5c2Xm2c9e/DzoqnY59NcaMNB394rRn+yfJERUT6nuSoteStObSUFTEXd f2CBdNL+ZSsAKmF8XC9ODgn1rxsD07yXsWW6Vy6Fpi4pNrWRSP+oPjvydlYbHnRKpjjUWA1m7TS o= X-Gm-Gg: ASbGncvusZRHGDYeKCVW0yJDwgaHQKNWRrPTFzQ7PbjQd5jgnI7C597l++QqLG7xFaT mfyDh620GDLKW2sKVnI+MhUXXaTfaUd7ZG5/gE348WImVJHeqBSowqjDCFVC9jzIqzqQqQKCoDR ZQ/cm9Xhfszn7mp1BiIWV4Ogyk5Sgausq29krFDwLx09KNgHl8s0O1wd3bwnQSBqZ/Xct+E3K9i IN5+xdQwRgHc3Yoq7zzJrTx8+oeu1jf11rUlvgl2rkm3QFS/Oo5R8IYuIUoFz1We0K67km+OOcv gm9SbCasXk5fMQttLXRhzOIsaQ+F9tG0kMRc9uptIFj5jVzg7yG/d0CxOpNrmZkguRR1rWTj1Rg cFu+rjK8/eNd6GF3cycqAw5lg X-Received: by 2002:a05:6214:493:b0:6e8:eabf:fd44 with SMTP id 6a1803df08f44-6f8b08ce997mr93637676d6.27.1747447188356; Fri, 16 May 2025 18:59:48 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGti7Q9QQCKk/7l7rAp+Eam0O6WFZak94cTVGNCFbJLA0IfRgtRHLyKBrW0oWYy40vY4RQRZw== X-Received: by 2002:a05:6214:493:b0:6e8:eabf:fd44 with SMTP id 6a1803df08f44-6f8b08ce997mr93637566d6.27.1747447188002; Fri, 16 May 2025 18:59:48 -0700 (PDT) Received: from umbar.lan (2001-14ba-a0c3-3a00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a0c3:3a00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-550e70180f7sm672167e87.128.2025.05.16.18.59.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 May 2025 18:59:46 -0700 (PDT) From: Dmitry Baryshkov Date: Sat, 17 May 2025 04:59:40 +0300 Subject: [PATCH v6 04/10] drm/display: move CEC_CORE selection to DRM_DISPLAY_HELPER 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: <20250517-drm-hdmi-connector-cec-v6-4-35651db6f19b@oss.qualcomm.com> References: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> In-Reply-To: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Dmitry Baryshkov X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1524; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=xsPFZuAoy5Xx+HAHSFTO3CpJ9ZWa79t8iv7KrGNnsVQ=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBoJ+2LzlRiBFzeGKtLvzI9YxXgxpllhINoupjHY G0qcJIH93CJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaCftiwAKCRCLPIo+Aiko 1ZsdCACJtMwWiDYiD732KactqUyG3QUjLbp5nnLNbYMMCsbW3offpf3dDM0La1046N+G7iVXcka Bx8JBhEy3wMP+Q9QyQn1cNHEzH/Z+ErD2Xe6pKShIsKcu+49zsFGdKObUUGgRcO2HnxgtVUFEIe Qg4VMtxkhcO6QhnNb1xtGHa00UQonJjuHS3GegPFbQ4WR18eB0cUxAvY6NDW/vCj5XsvZhYL8Ac RjvPVUCAuGK3JjuQLAOnQ1J+w/yfq763HC+hElG2bG+2tdHciWjBLHjR/a1fVfEHujgtGIFmm5P 3Eq2L6c6GzFTYjgQce4FTZ0AGpzD676EQkExyIsJfjds4Spt X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-GUID: AqgqdlG5nLpebRJep6vAIPan28XETzCL X-Proofpoint-ORIG-GUID: AqgqdlG5nLpebRJep6vAIPan28XETzCL X-Authority-Analysis: v=2.4 cv=fbaty1QF c=1 sm=1 tr=0 ts=6827ed96 cx=c_pps a=wEM5vcRIz55oU/E2lInRtA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=KKAkSRfTAAAA:8 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=7OZCfA99JoLngDASymAA:9 a=QEXdDO2ut3YA:10 a=OIgjcC2v60KrkQgK7BGD:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTE3MDAxNyBTYWx0ZWRfX0zYrRZwaUw7P AX1wWQYMwYoBFm/6KSdIvsHc1pBQGKx97nc/BtFbFgmqKKsi4qKbRFpAJuxWIZMI1sJaWdvit90 7ZG66Sm/Z6OdU164sWjZ5kzBc1Nb6FJO5quxgx+VqyHOuXR2oub5CNLKMahnMKDCWnUBGcDo/VZ kNBL7xcqOmYFTBc8Ks2ExLRLIYq2C3z4WFRpKAx8ECcV3sajJKjSMLmP3/D+U6LeAqFQimOWYO6 8viQ+NEvRHTAoZ7Syg2hSQP7ssxoGYmgMa0i/w5wmP08LyfvGk2WvuYygxEYZ3q3qPxwZAO+mJO UMqIBBuEeRqyaWTHqRPeVhYSCbOVzIM5j661bUTeSvPdAAHX4gyH/uDzJ8xTkCEegKNW0ABAwU6 OvI4Ef9Bs4rTXlPklSE9VhFqCeMzxTifKsW/NDUuWjLagUOvR2vJI0Xh/FK7ms48LBx2Dyh2 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-17_01,2025-05-16_03,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxscore=0 malwarescore=0 spamscore=0 impostorscore=0 suspectscore=0 phishscore=0 lowpriorityscore=0 adultscore=0 bulkscore=0 clxscore=1015 mlxlogscore=999 priorityscore=1501 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505070000 definitions=main-2505170017 THe Kconfig symbol DRM_DISPLAY_DP_AUX_CEC is a boolean which simply toggles whether DP_AUX_CEC support should be built into the drm_display_helper (which can be eithera module or built-in into the kernel). If DRM_DISPLAY_DP_AUX_CEC is selected, then CEC_CORE is selected to be built-in into the kernel even if DRM_DISPLAY_HELPER is selected to be built as a module. Move CEC_CORE selection to the latter symbol in order to allow it to be built as a module. Signed-off-by: Dmitry Baryshkov Reviewed-by: Maxime Ripard Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/display/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/display/Kconfig b/drivers/gpu/drm/display/Kcon= fig index 8d22b7627d41f7bc015decf24ae02a05bc00f055..3666e791d6d6eba58f095d7fb69= 1de1fd0b95ed3 100644 --- a/drivers/gpu/drm/display/Kconfig +++ b/drivers/gpu/drm/display/Kconfig @@ -8,6 +8,7 @@ config DRM_DISPLAY_DP_AUX_BUS config DRM_DISPLAY_HELPER tristate depends on DRM + select CEC_CORE if DRM_DISPLAY_DP_AUX_CEC help DRM helpers for display adapters. =20 @@ -23,7 +24,6 @@ config DRM_BRIDGE_CONNECTOR config DRM_DISPLAY_DP_AUX_CEC bool "Enable DisplayPort CEC-Tunneling-over-AUX HDMI support" select DRM_DISPLAY_DP_HELPER - select CEC_CORE help Choose this option if you want to enable HDMI CEC support for DisplayPort/USB-C to HDMI adapters. --=20 2.39.5 From nobody Fri Dec 19 17:20:03 2025 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3DCC9142E77 for ; Sat, 17 May 2025 01:59:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447196; cv=none; b=L0UVj4c1rKHCeID63G/2x4+XH2ews9JgfjuY45tBCat7+9zlKwuPAzwy2pG7vEf26ZpbszvEIUMh8sc+6E22TmAI/wh0LTWtf1oCGpQcy8+ldWNbq23keUdHsGj4tRws56p8qcLSu9NqMdUhqvvsekLe0KkTpImWwnKfMtbVeAs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447196; c=relaxed/simple; bh=LL9Ai6hOxzinFf1Ck9VLp8BJQivJG1tCD01ZOKHzaG8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mgTiQsXJLuY98xRmBlR01isKiPV8EKrtx1eGb/ppMq6iOsX0yWwz/2sRu4KDIbnuqr7B55dCczfZam/zP7Dn/kUvIsNqbzYNb35anjpF+QhrPkCWIzghIYrLSgEeVlW/CNUU/QdVcQr5kxYkj7ignqpOpasmYTofLR0EWXFJxmU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=keXoxn3O; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="keXoxn3O" Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54H03MIv026631 for ; Sat, 17 May 2025 01:59:53 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= q3352WtWEAgrfNRNaWvhRPVcoQ33rQi+QuFS41/lD6E=; b=keXoxn3OMpxjCbWX jbLwcFhPbRQNDjHTfMDAUscz4yKs8DNYKlv8no1BNLFA2PDK4yl8VC6qmRSciaUA jJHu6iGvjq3f/pCNmZvYVBdNklyN26cHkArvdL5x+GKlZ+vrDiuxYdqwyhtx/uIm 2ivYf/CpGuc7L8PPMpNIebUJ3K+khCxGsyCbEunU46bp4paaNoY9o7EaDJK37wrL fW3JpdHsaSony2HTNpZyC+RLNRvc5cBXdGfnDikMNKQGcl7JuqahFox+EuTbJPj/ BYc3NjyhDlJh56C1ezWG7IccglETUcpPpFwxyCgdZRGK5vq8yck4FdQjwBcODp93 KiOdUA== Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46mbcyutd4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Sat, 17 May 2025 01:59:53 +0000 (GMT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-6f544cf3f6dso54617076d6.0 for ; Fri, 16 May 2025 18:59:53 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747447191; x=1748051991; 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=q3352WtWEAgrfNRNaWvhRPVcoQ33rQi+QuFS41/lD6E=; b=HVWEiznRG2sqiAi2pXiT9pdNiTheswuv/ZXnX154SnBHeznbioAg+lPdtDr/Hjqo/9 FFK8ftcd4Rdmw7RD/QgHzw1MtkMuIt9U7H4YJlVD8dkXp2LUm2jGbKreKHND85SuU8D2 1GAfeZnmKcgfTGTD2fVV44owYZOIfmt9O7k2e4viliHUMcAUIVBW1Ro1HvdAkvbPlngm ShsEhisP6Xi1Cwy+JSUrFOGx6sjBlA4mDNPghd2XyObI7hhA78gcEP0PTbclZvfBlhig 2GYZohJbvUTKUd5qnUA5xOPD6MalfPT6v9IXPpiT1dWGAFyo58KxIAYS1TP5PHOq0AEM najg== X-Forwarded-Encrypted: i=1; AJvYcCUn6heqHZ211xjqvd8K2BnEPQ5Sk1q58bpPyXSYDbFQO5pzXCR7gRs0xJbbEe8h4PQTo1mdkUIU8ckIUPA=@vger.kernel.org X-Gm-Message-State: AOJu0Yxuu8Dt0IXhvMoEaPclmh+fQcRQI0VJUTNPm2gZ9X4uEA72XWPy HXGOFNLS4+inwmEsCtik9Zp4uGf0agsUPOWlN+NBoK9KRCeicYQ4qg7+ztvwR6r2e7V3GSKdp3u nloKirnp/Qe8lAOoYdVS7/twk9XXbe/Z8ZS53lD8PoTTIxwXOGoFjvqksVLlggwRui55EN3b9Bq A= X-Gm-Gg: ASbGncsLWkbzbTPWYAIelvkRYG4Fodo22hY+Wy3pzP6lIfe7zNmeHTR85/l/kng6HoW LHZUXNf6fFjL5q8lROlLKdDFKzovI+AcYEJCuAqwB7YC83FQ9sEe6G8ErbR+TKsdmzg2rvHPO8K jyzeKS3gzVXl25l7rxKj6d4imKg5H259os4YGJ9YJeto4yrSQaG74aF22h3FbaKgFL6GJaArDc1 +VJDI2jq/aDj8os8y3NFoT3J39oCALB7oLuDXqZn1FtqAwRQ0uZOjWQcnUisIWG+BgrTw8uVm6h KxxRjcDrfOL8rtnRt8XKXVV9yxxlJ0crUvi7UmXV2PW4SNf4lf5FhLyvndMqZvT0/2l8A4Ksqxv LO+wI+9CZbqTAKGFzNZBSWBPM X-Received: by 2002:a05:6214:1c8a:b0:6f8:997d:fc70 with SMTP id 6a1803df08f44-6f8b088f5efmr95044076d6.27.1747447190900; Fri, 16 May 2025 18:59:50 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGtxqKQU3hZ5IAOU5hMOyEqRGKacJD+b2JSNgjUotcLGZq2anuLnHuSA7StNh9TSna2zp0eMA== X-Received: by 2002:a05:6214:1c8a:b0:6f8:997d:fc70 with SMTP id 6a1803df08f44-6f8b088f5efmr95043726d6.27.1747447190486; Fri, 16 May 2025 18:59:50 -0700 (PDT) Received: from umbar.lan (2001-14ba-a0c3-3a00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a0c3:3a00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-550e70180f7sm672167e87.128.2025.05.16.18.59.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 May 2025 18:59:49 -0700 (PDT) From: Dmitry Baryshkov Date: Sat, 17 May 2025 04:59:41 +0300 Subject: [PATCH v6 05/10] drm/display: add CEC helpers code 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: <20250517-drm-hdmi-connector-cec-v6-5-35651db6f19b@oss.qualcomm.com> References: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> In-Reply-To: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Dmitry Baryshkov X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=13797; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=LL9Ai6hOxzinFf1Ck9VLp8BJQivJG1tCD01ZOKHzaG8=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBoJ+2LJt8v8A8B7zVWyCqXAbLAgvgnWS7lWZ5il ybhmZUg4YGJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaCftiwAKCRCLPIo+Aiko 1aYdB/9J0SzwzTyatjVG/G51uZUjMbtARI70B0iifMBlEUOFy0ymO2uKnF4u3m1FIKLdDKHXbsl H0gPL61iw+9WWosDWkdJV9bwdVwW7VsWhTIsTGtQMsorwSrUwXO2I+ILyp/yxhwsCf5wZabxoD8 lsMXz+XAoRwHWBJeLYqEPTZpr+r3uVZjeqIlBpEEaV3xHsoOFbx+UHvRaB9HB9eS1M3n2Bhh1Pw 0Lz6hctX7AMThmi8Q3k4CumSdCcTy12X/lpj3DTyUbuNUwy0mdLocfLyoXCJpmRT+4LteTTm3+Y fTkSkfr60yLXbHmehLYa7YbId6lnKivv3DBNeAAkMZqGXR7z X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-GUID: nPVSFy4cytkm0NVri0-rYXBlYGWDNuMr X-Proofpoint-ORIG-GUID: nPVSFy4cytkm0NVri0-rYXBlYGWDNuMr X-Authority-Analysis: v=2.4 cv=JszxrN4C c=1 sm=1 tr=0 ts=6827ed99 cx=c_pps a=UgVkIMxJMSkC9lv97toC5g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=Iec3o4o9FL51ny9dwhwA:9 a=QEXdDO2ut3YA:10 a=1HOtulTD9v-eNWfpl4qZ:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTE3MDAxNyBTYWx0ZWRfX4q1oJEltVgPU xMZnFF1GlPPjAd4F/PAR8cKwaGtjQwQhIWMbeFgCYcQAtXMTvQAmxF79yQngLGwIpa7i45oYC7v KsaxoN5T13R2oHKOe2QzRQdWKu7CbdOejrNUEzQEeqtT1kQ87IFK2fJUeBJ+E8XM1naB8YExdco LfRUQyFuZWN3Ql7Apdnl/n57Q9RrZJ8KA3WKoaou4VONDfzu4q7EZajNMZB7WbExvbdWzfUwguA G0k/vu3Pk0+0VFD8wgXxUTd5CcdIdlroOY891MT37YHVNg21oKEd004a2sYbxmWuGl5jC7ouuZf DCDfREhe3PKOqO7pej54QeVnAjACoxOGtphFOv/HjFMCVLx+jl8IiQEH4aebfrfURruRSzt8F9r RewMMXzqbD9nYg8xVQVFX9lOKRRrBBBb+UEvmHsM+kQxpdEu87UcPDbystdoCpMxhH8H6d4y X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-17_01,2025-05-16_03,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 priorityscore=1501 suspectscore=0 mlxlogscore=999 bulkscore=0 malwarescore=0 mlxscore=0 adultscore=0 phishscore=0 spamscore=0 lowpriorityscore=0 clxscore=1015 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505070000 definitions=main-2505170017 Add generic CEC helpers to be used by HDMI drivers. Both notifier and and adapter are supported for registration. Once registered, the driver can call common set of functions to update physical address, to invalidate it or to unregister CEC data. Unlike drm_connector_cec_funcs (which provides interface common to all implementations, including, but not limited to the CEC adapter, CEC notifier, CEC pin-based adapter, etc) the struct drm_connector_hdmi_cec_adapter_ops provides callbacks specific to the CEC adapter implementations. Signed-off-by: Dmitry Baryshkov Signed-off-by: Dmitry Baryshkov Reviewed-by: Maxime Ripard --- drivers/gpu/drm/display/Kconfig | 12 +- drivers/gpu/drm/display/Makefile | 4 + drivers/gpu/drm/display/drm_hdmi_cec_helper.c | 192 +++++++++++++++++= ++++ .../gpu/drm/display/drm_hdmi_cec_notifier_helper.c | 64 +++++++ include/drm/display/drm_hdmi_cec_helper.h | 72 ++++++++ 5 files changed, 343 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/display/Kconfig b/drivers/gpu/drm/display/Kcon= fig index 3666e791d6d6eba58f095d7fb691de1fd0b95ed3..6376ea01ec3093a72de25064e31= 223d2c9868ed7 100644 --- a/drivers/gpu/drm/display/Kconfig +++ b/drivers/gpu/drm/display/Kconfig @@ -8,7 +8,7 @@ config DRM_DISPLAY_DP_AUX_BUS config DRM_DISPLAY_HELPER tristate depends on DRM - select CEC_CORE if DRM_DISPLAY_DP_AUX_CEC + select CEC_CORE if DRM_DISPLAY_DP_AUX_CEC || DRM_DISPLAY_HDMI_CEC_HELPER = || CEC_NOTIFIER help DRM helpers for display adapters. =20 @@ -82,6 +82,16 @@ config DRM_DISPLAY_HDMI_AUDIO_HELPER DRM display helpers for HDMI Audio functionality (generic HDMI Codec implementation). =20 +config DRM_DISPLAY_HDMI_CEC_HELPER + bool + help + DRM display helpers for HDMI CEC implementation. + +config DRM_DISPLAY_HDMI_CEC_NOTIFIER_HELPER + def_bool CEC_NOTIFIER + help + DRM display helpers for HDMI CEC notifiers implementation. + config DRM_DISPLAY_HDMI_HELPER bool help diff --git a/drivers/gpu/drm/display/Makefile b/drivers/gpu/drm/display/Mak= efile index b17879b957d5401721396e247fa346387cf6c48a..0ff4a1ad0222078bf4951759150= 07f1b1f903296 100644 --- a/drivers/gpu/drm/display/Makefile +++ b/drivers/gpu/drm/display/Makefile @@ -16,6 +16,10 @@ drm_display_helper-$(CONFIG_DRM_DISPLAY_DSC_HELPER) +=3D= \ drm_display_helper-$(CONFIG_DRM_DISPLAY_HDCP_HELPER) +=3D drm_hdcp_helper.o drm_display_helper-$(CONFIG_DRM_DISPLAY_HDMI_AUDIO_HELPER) +=3D \ drm_hdmi_audio_helper.o +drm_display_helper-$(CONFIG_DRM_DISPLAY_HDMI_CEC_HELPER) +=3D \ + drm_hdmi_cec_helper.o +drm_display_helper-$(CONFIG_DRM_DISPLAY_HDMI_CEC_NOTIFIER_HELPER) +=3D \ + drm_hdmi_cec_notifier_helper.o drm_display_helper-$(CONFIG_DRM_DISPLAY_HDMI_HELPER) +=3D \ drm_hdmi_helper.o \ drm_scdc_helper.o diff --git a/drivers/gpu/drm/display/drm_hdmi_cec_helper.c b/drivers/gpu/dr= m/display/drm_hdmi_cec_helper.c new file mode 100644 index 0000000000000000000000000000000000000000..a25f60509043136630c1ab25e4f= 3e80f85a639b9 --- /dev/null +++ b/drivers/gpu/drm/display/drm_hdmi_cec_helper.c @@ -0,0 +1,192 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright (c) 2024 Linaro Ltd + */ + +#include +#include +#include +#include + +#include + +#include + +struct drm_connector_hdmi_cec_data { + struct cec_adapter *adapter; + const struct drm_connector_hdmi_cec_funcs *funcs; +}; + +static int drm_connector_hdmi_cec_adap_enable(struct cec_adapter *adap, bo= ol enable) +{ + struct drm_connector *connector =3D cec_get_drvdata(adap); + struct drm_connector_hdmi_cec_data *data =3D connector->cec.data; + + return data->funcs->enable(connector, enable); +} + +static int drm_connector_hdmi_cec_adap_log_addr(struct cec_adapter *adap, = u8 logical_addr) +{ + struct drm_connector *connector =3D cec_get_drvdata(adap); + struct drm_connector_hdmi_cec_data *data =3D connector->cec.data; + + return data->funcs->log_addr(connector, logical_addr); +} + +static int drm_connector_hdmi_cec_adap_transmit(struct cec_adapter *adap, = u8 attempts, + u32 signal_free_time, struct cec_msg *msg) +{ + struct drm_connector *connector =3D cec_get_drvdata(adap); + struct drm_connector_hdmi_cec_data *data =3D connector->cec.data; + + return data->funcs->transmit(connector, attempts, signal_free_time, msg); +} + +static const struct cec_adap_ops drm_connector_hdmi_cec_adap_ops =3D { + .adap_enable =3D drm_connector_hdmi_cec_adap_enable, + .adap_log_addr =3D drm_connector_hdmi_cec_adap_log_addr, + .adap_transmit =3D drm_connector_hdmi_cec_adap_transmit, +}; + +static void drm_connector_hdmi_cec_adapter_phys_addr_invalidate(struct drm= _connector *connector) +{ + struct drm_connector_hdmi_cec_data *data =3D connector->cec.data; + + cec_phys_addr_invalidate(data->adapter); +} + +static void drm_connector_hdmi_cec_adapter_phys_addr_set(struct drm_connec= tor *connector, + u16 addr) +{ + struct drm_connector_hdmi_cec_data *data =3D connector->cec.data; + + cec_s_phys_addr(data->adapter, addr, false); +} + +static void drm_connector_hdmi_cec_adapter_unregister(struct drm_device *d= ev, void *res) +{ + struct drm_connector *connector =3D res; + struct drm_connector_hdmi_cec_data *data =3D connector->cec.data; + + cec_delete_adapter(data->adapter); + + if (data->funcs->uninit) + data->funcs->uninit(connector); + + kfree(data); + connector->cec.data =3D NULL; +} + +static struct drm_connector_cec_funcs drm_connector_hdmi_cec_adapter_funcs= =3D { + .phys_addr_invalidate =3D drm_connector_hdmi_cec_adapter_phys_addr_invali= date, + .phys_addr_set =3D drm_connector_hdmi_cec_adapter_phys_addr_set, +}; + +int drmm_connector_hdmi_cec_register(struct drm_connector *connector, + const struct drm_connector_hdmi_cec_funcs *funcs, + const char *name, + u8 available_las, + struct device *dev) +{ + struct drm_connector_hdmi_cec_data *data; + struct cec_connector_info conn_info; + struct cec_adapter *cec_adap; + int ret; + + if (!funcs->init || !funcs->enable || !funcs->log_addr || !funcs->transmi= t) + return -EINVAL; + + data =3D kzalloc(sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + data->funcs =3D funcs; + + cec_adap =3D cec_allocate_adapter(&drm_connector_hdmi_cec_adap_ops, conne= ctor, name, + CEC_CAP_DEFAULTS | CEC_CAP_CONNECTOR_INFO, + available_las ? : CEC_MAX_LOG_ADDRS); + ret =3D PTR_ERR_OR_ZERO(cec_adap); + if (ret < 0) + goto err_free; + + cec_fill_conn_info_from_drm(&conn_info, connector); + cec_s_conn_info(cec_adap, &conn_info); + + data->adapter =3D cec_adap; + + mutex_lock(&connector->cec.mutex); + + connector->cec.data =3D data; + connector->cec.funcs =3D &drm_connector_hdmi_cec_adapter_funcs; + + ret =3D funcs->init(connector); + if (ret < 0) + goto err_delete_adapter; + + /* + * NOTE: the CEC adapter will be unregistered by drmm cleanup from + * drm_managed_release(), which is called from drm_dev_release() + * during device unbind. + * + * However, the CEC framework cleans up the CEC adapter only when the + * last user has closed its file descriptor, so we don't need to handle + * it in DRM. + * + * Before that CEC framework makes sure that even if the userspace + * still holds CEC device open, all calls will be shortcut via + * cec_is_registered(), making sure that there is no access to the + * freed memory. + */ + ret =3D cec_register_adapter(cec_adap, dev); + if (ret < 0) + goto err_delete_adapter; + + mutex_unlock(&connector->cec.mutex); + + return drmm_add_action_or_reset(connector->dev, + drm_connector_hdmi_cec_adapter_unregister, + connector); + +err_delete_adapter: + cec_delete_adapter(cec_adap); + + connector->cec.data =3D NULL; + + mutex_unlock(&connector->cec.mutex); + +err_free: + kfree(data); + + return ret; +} +EXPORT_SYMBOL(drmm_connector_hdmi_cec_register); + +void drm_connector_hdmi_cec_received_msg(struct drm_connector *connector, + struct cec_msg *msg) +{ + struct drm_connector_hdmi_cec_data *data =3D connector->cec.data; + + cec_received_msg(data->adapter, msg); +} +EXPORT_SYMBOL(drm_connector_hdmi_cec_received_msg); + +void drm_connector_hdmi_cec_transmit_attempt_done(struct drm_connector *co= nnector, + u8 status) +{ + struct drm_connector_hdmi_cec_data *data =3D connector->cec.data; + + cec_transmit_attempt_done(data->adapter, status); +} +EXPORT_SYMBOL(drm_connector_hdmi_cec_transmit_attempt_done); + +void drm_connector_hdmi_cec_transmit_done(struct drm_connector *connector, + u8 status, + u8 arb_lost_cnt, u8 nack_cnt, + u8 low_drive_cnt, u8 error_cnt) +{ + struct drm_connector_hdmi_cec_data *data =3D connector->cec.data; + + cec_transmit_done(data->adapter, status, + arb_lost_cnt, nack_cnt, low_drive_cnt, error_cnt); +} +EXPORT_SYMBOL(drm_connector_hdmi_cec_transmit_done); diff --git a/drivers/gpu/drm/display/drm_hdmi_cec_notifier_helper.c b/drive= rs/gpu/drm/display/drm_hdmi_cec_notifier_helper.c new file mode 100644 index 0000000000000000000000000000000000000000..28f8e008cc59fabd7d540f8e90e= 48ac386447cd8 --- /dev/null +++ b/drivers/gpu/drm/display/drm_hdmi_cec_notifier_helper.c @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright (c) 2024 Linaro Ltd + */ + +#include +#include +#include +#include + +#include + +#include +#include + +static void drm_connector_hdmi_cec_notifier_phys_addr_invalidate(struct dr= m_connector *connector) +{ + cec_notifier_phys_addr_invalidate(connector->cec.data); +} + +static void drm_connector_hdmi_cec_notifier_phys_addr_set(struct drm_conne= ctor *connector, + u16 addr) +{ + cec_notifier_set_phys_addr(connector->cec.data, addr); +} + +static void drm_connector_hdmi_cec_notifier_unregister(struct drm_device *= dev, void *res) +{ + struct drm_connector *connector =3D res; + + cec_notifier_conn_unregister(connector->cec.data); + connector->cec.data =3D NULL; +} + +static const struct drm_connector_cec_funcs drm_connector_cec_notifier_fun= cs =3D { + .phys_addr_invalidate =3D drm_connector_hdmi_cec_notifier_phys_addr_inval= idate, + .phys_addr_set =3D drm_connector_hdmi_cec_notifier_phys_addr_set, +}; + +int drmm_connector_hdmi_cec_notifier_register(struct drm_connector *connec= tor, + const char *port_name, + struct device *dev) +{ + struct cec_connector_info conn_info; + struct cec_notifier *notifier; + + cec_fill_conn_info_from_drm(&conn_info, connector); + + notifier =3D cec_notifier_conn_register(dev, port_name, &conn_info); + if (!notifier) + return -ENOMEM; + + mutex_lock(&connector->cec.mutex); + + connector->cec.data =3D notifier; + connector->cec.funcs =3D &drm_connector_cec_notifier_funcs; + + mutex_unlock(&connector->cec.mutex); + + return drmm_add_action_or_reset(connector->dev, + drm_connector_hdmi_cec_notifier_unregister, + connector); +} +EXPORT_SYMBOL(drmm_connector_hdmi_cec_notifier_register); diff --git a/include/drm/display/drm_hdmi_cec_helper.h b/include/drm/displa= y/drm_hdmi_cec_helper.h new file mode 100644 index 0000000000000000000000000000000000000000..fd8f4d2f02c1ea952a203fadedf= 9d55278ec275f --- /dev/null +++ b/include/drm/display/drm_hdmi_cec_helper.h @@ -0,0 +1,72 @@ +/* SPDX-License-Identifier: MIT */ + +#ifndef DRM_DISPLAY_HDMI_CEC_HELPER +#define DRM_DISPLAY_HDMI_CEC_HELPER + +#include + +struct drm_connector; + +struct cec_msg; +struct device; + +struct drm_connector_hdmi_cec_funcs { + /** + * @init: perform hardware-specific initialization before registering the= CEC adapter + */ + int (*init)(struct drm_connector *connector); + + /** + * @uninit: perform hardware-specific teardown for the CEC adapter + */ + void (*uninit)(struct drm_connector *connector); + + /** + * @enable: enable or disable CEC adapter + */ + int (*enable)(struct drm_connector *connector, bool enable); + + /** + * @log_addr: set adapter's logical address, can be called multiple + * times if adapter supports several LAs + */ + int (*log_addr)(struct drm_connector *connector, u8 logical_addr); + + /** + * @transmit: start transmission of the specified CEC message + */ + int (*transmit)(struct drm_connector *connector, u8 attempts, + u32 signal_free_time, struct cec_msg *msg); +}; + +int drmm_connector_hdmi_cec_register(struct drm_connector *connector, + const struct drm_connector_hdmi_cec_funcs *funcs, + const char *name, + u8 available_las, + struct device *dev); + +void drm_connector_hdmi_cec_received_msg(struct drm_connector *connector, + struct cec_msg *msg); + +void drm_connector_hdmi_cec_transmit_done(struct drm_connector *connector, + u8 status, + u8 arb_lost_cnt, u8 nack_cnt, + u8 low_drive_cnt, u8 error_cnt); + +void drm_connector_hdmi_cec_transmit_attempt_done(struct drm_connector *co= nnector, + u8 status); + +#if IS_ENABLED(CONFIG_DRM_DISPLAY_HDMI_CEC_NOTIFIER_HELPER) +int drmm_connector_hdmi_cec_notifier_register(struct drm_connector *connec= tor, + const char *port_name, + struct device *dev); +#else +static inline int drmm_connector_hdmi_cec_notifier_register(struct drm_con= nector *connector, + const char *port_name, + struct device *dev) +{ + return 0; +} +#endif + +#endif --=20 2.39.5 From nobody Fri Dec 19 17:20:03 2025 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 81B881957FF for ; Sat, 17 May 2025 01:59:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447197; cv=none; b=WMwMWDW5JUuPy4IBZD+u637yCd+73nniUhJSAYhCQ/qt82jMO9BJaeDmRiQ4eiGcB3aRVX/XGj/lf8RaFY/lOB499jg0AqA5qkhVUno0OlbyFzy30FZLuGp2bY+fdfWSwpD7i6+vsPDm/byQIfeGDsqJ0rGiEjgssf5y9lpdUK4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447197; c=relaxed/simple; bh=rpC4/Fp1Jm1yKyuARzvQoHZlvtt/ApP11arkSl2v3Xg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=smJ8qObMXy0gE6IQqU9P7Nh2fEk+8bM7XQ/LmsZ5v1l4KkHMQgiWYNkd6SzC+EW+ZW32eNds0k0lPXEQQf8cg4ZSKGIMtFh3LvQgnfQWGmLfbi6qtAhxXVYJJ8QMSsB8+NnGQ+93lqWidRdYDza24y0cJXFSPS5XsND5tH4AGGM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=bxfy041P; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="bxfy041P" Received: from pps.filterd (m0279870.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54H1UirN007940 for ; Sat, 17 May 2025 01:59:54 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= SD5Xx7vOEUM/GyGeh/4SwnrwP+CNzq7Qjzti6nJGdWg=; b=bxfy041P5CpxGH9X Bv4LastnoPZGJTjFgJ+g3LyEp0mZApbuWOqfkIHrfsEYcxL9wtWbM8za5NxoNZg4 tLYfxjz3MURGrHBcfKnpkrTLZF9ZobLD0oVyCN4mAr6xjabkVgH0FkdmwpjvNazl W6OlsVTtmmOJCeEh1e2BNce4g0Wd/NF2yNb57ISWj6XlZI3Ls94NIHeNMYRnY4gv vQl5UmNdfrrbzsmJSVcIzKTge16CfzGzImxPFAIhxOD6IVTdvWHtxY6KcJ/aQB5M eNdyDtGnbSwTqXPfPAw6QQGRldPa9HQJAOpiQLmfinVYQfog8QAXGegIkPa8i5ll vMjh5w== Received: from mail-qk1-f199.google.com (mail-qk1-f199.google.com [209.85.222.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46mbcq3j8t-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Sat, 17 May 2025 01:59:54 +0000 (GMT) Received: by mail-qk1-f199.google.com with SMTP id af79cd13be357-7c5bb68b386so779574185a.3 for ; Fri, 16 May 2025 18:59:54 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747447193; x=1748051993; 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=SD5Xx7vOEUM/GyGeh/4SwnrwP+CNzq7Qjzti6nJGdWg=; b=mKU3l1KEFE6YM1zFOiIZ1bbE5EahlQZtYy/6PKU1nQUEyLUgNx9ls3HjIN2CZbNpkA qwLxp9DEGPB7oqzReBBDcE585GO0U+Lz9NzS6ZL65awJbsgrkLcVvypINandflXoEwYs HPwawmUyceVFlagS4YuN2+QQfL0sL8S15x8umB2jTLFGi8mSpRbJmXklQQNLvS8Ps4fa wLDhkcmwLX+B/02b+f0yIg6gR2qR6mGk8E/flPMEP9PpVExaXoSkQNVn29JVTxQQQGxt J6NMeKwoZsdzrNdakvOTjzKTN15Wropdd/eoUDj1FNdiCZFWK/WcIL3nhYaeRszbQ/Jf wQUg== X-Forwarded-Encrypted: i=1; AJvYcCXe2XK/gXQ6IRfdTlZobWzGgvr+cA840qV0mBbJaMi6pXsQ59sMdPmYP9lAyi1310YOY/Bj1BwMT/EUYNA=@vger.kernel.org X-Gm-Message-State: AOJu0YztrVXo+Q+/GPXAc77v1p8dvofACG3iBS6WuyKMfo5kgelynKZB m2r06CNzIvBIvaCojyofKf/2VhhdsJGLJipsbL1ADzdcDeM3TRxDt1f0G5CrqQMxncGOv6kYNEx lVWS78E6NU+y5jOxZTCsb+kYg7X1y7TXQxfa92qczGJokjXcnee0QVdK439/BcS1KiLVcqcxy+r 0= X-Gm-Gg: ASbGnctmrQ47FOP5BJS0nh6WCrb1vNEUb4l4ao7pu1pVeT68mT0rDgZ1Qy4i98vDM/N YhnZq7m0GQ+YpLYUwntvrcvBVOvUAuwHwwt3jIUgpW7tyYY6Zw6hKodiyDnYZ39tGSc47DKlcfj wtvymCce8ADiCtYvpKU/ttimxIJvrCrEbgR5u7hcq+MJ4U+sEkHJc+aaGA7SiXoPxM7luRwJQZR Yj9F1Yf6uuZpfE5ym35FNXvCGX1SWBN12xoGWv00JjqLUMkR1EvuAteqb/MK55VJkLg4mI6Duys mLjR1MyH+sZiXHlPbhhN75v277cLLdq5utj/pKUwvUuRNa8rX/vpTElv25RTnuoy/gVMjhProPf 4Usha6hub2dTPpaQ03djhtGm4 X-Received: by 2002:a05:620a:2989:b0:7c5:ad99:9e38 with SMTP id af79cd13be357-7cd47fb1ef8mr613004985a.43.1747447193275; Fri, 16 May 2025 18:59:53 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHVRxbvmsaezHoPorAioz8tk37MPhQLozBhorB8+3KjD71P7UkiRrOmavX9pc6TUp2GZjXSrQ== X-Received: by 2002:a05:620a:2989:b0:7c5:ad99:9e38 with SMTP id af79cd13be357-7cd47fb1ef8mr613001985a.43.1747447192929; Fri, 16 May 2025 18:59:52 -0700 (PDT) Received: from umbar.lan (2001-14ba-a0c3-3a00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a0c3:3a00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-550e70180f7sm672167e87.128.2025.05.16.18.59.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 May 2025 18:59:50 -0700 (PDT) From: Dmitry Baryshkov Date: Sat, 17 May 2025 04:59:42 +0300 Subject: [PATCH v6 06/10] drm/display: hdmi-state-helper: handle CEC physical address 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: <20250517-drm-hdmi-connector-cec-v6-6-35651db6f19b@oss.qualcomm.com> References: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> In-Reply-To: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Dmitry Baryshkov X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1880; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=rpC4/Fp1Jm1yKyuARzvQoHZlvtt/ApP11arkSl2v3Xg=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBoJ+2LcN5UYS0GlUCtFMbbK+13kvgJBdUYbxpPt moiU+EvNBSJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaCftiwAKCRCLPIo+Aiko 1eP9B/9yrrAqJmrcCxNQRqpNPsrz7qJpKM0CLmPCcvrDhUdEMgf1owKQ23/2bM2xOdQlTKWgCu0 DGotpO5h9SLvA2Jvbcx5PxKZrEYR2owiXVu/DxmUbJdCFqF7fXpYpd8btVv0EEihZ8wJfn5vX/+ OQFBEf/Sz5/u80ap/fS0XG4Zzr5CWqwd20zrVVlJaIvXqTZlmmn1gwZctElF2NsGZvA7Ht9zWF0 G862X9APgAaCZO70M+uMK5lqF5BwvHQbLQkeWCSMWW7qU1l23H+bGBS5+sINWslB6FRBC7tYYM4 Lgdm3e0tI3bBR4wis4j20M5LIv+oxtYggmhRCklX/Nwk8tag X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-GUID: e-zy8aA0pfNMUeIpRDVPDnCoHXE83Rzg X-Proofpoint-ORIG-GUID: e-zy8aA0pfNMUeIpRDVPDnCoHXE83Rzg X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTE3MDAxNyBTYWx0ZWRfX42qByemhBc2s 55pELNKYonY5ZXZmTaUs+D5b3oGQnAdBtHQEykujEkWdYLJ1NCpkbLV++8pXR6RDqKNpaT0bm8K cCDlBTd8l9mZMJnUK0BTTrfwJ7eNu20z4Vzv8YIZU/DAPVqCPwSgVXo+jt/RTQea6Z6kY/Ie/4a nHVsBXMdU0vbPVLf63ahlOx20ZxutuCJY4YFDRmMu8MGzw1IJZD0OTFFGI4uvQCjKurD/NZJwC5 q4k3jVLCzgO+if1ONoZvtJS/UGV+pq0pMX+U/AK7ke5gbukyRjc/iNSH1fn0sYgH0pWPQvoiAwZ fIM3DMOXuE10GwcX8sQSty/pLqAANV2DOPExV9Vw+FHXK6JLqY90HIRRPHmoOfubyIxmecjPUz9 MUpsinppqkd53xBsjfNhe+aEivCyD/9d5CuQ4TPBTgrdy0cy0HWh5UrVT/tH61wsQ+SqJupi X-Authority-Analysis: v=2.4 cv=KcvSsRYD c=1 sm=1 tr=0 ts=6827ed9a cx=c_pps a=HLyN3IcIa5EE8TELMZ618Q==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=VwQbUJbxAAAA:8 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=xYQKfNBhK_rbaXl_Bc8A:9 a=QEXdDO2ut3YA:10 a=bTQJ7kPSJx9SKPbeHEYW:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-17_01,2025-05-16_03,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 bulkscore=0 clxscore=1015 adultscore=0 phishscore=0 lowpriorityscore=0 mlxlogscore=999 spamscore=0 malwarescore=0 impostorscore=0 mlxscore=0 suspectscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505070000 definitions=main-2505170017 Call HDMI CEC helpers in order to update physical address of the adapter. Reviewed-by: Maxime Ripard Signed-off-by: Dmitry Baryshkov Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/display/drm_hdmi_state_helper.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/display/drm_hdmi_state_helper.c b/drivers/gpu/= drm/display/drm_hdmi_state_helper.c index d9d9948b29e9d5ef9bc9cc9108b3ace4aca2e3ae..bae7aa624f7db61cc7d5ff7a86a= 413938963543f 100644 --- a/drivers/gpu/drm/display/drm_hdmi_state_helper.c +++ b/drivers/gpu/drm/display/drm_hdmi_state_helper.c @@ -6,6 +6,7 @@ #include =20 #include +#include #include #include =20 @@ -1081,9 +1082,10 @@ drm_atomic_helper_connector_hdmi_update(struct drm_c= onnector *connector, const struct drm_edid *drm_edid; =20 if (status =3D=3D connector_status_disconnected) { - // TODO: also handle CEC and scramber, HDMI sink disconnected. + // TODO: also handle scramber, HDMI sink disconnected. drm_connector_hdmi_audio_plugged_notify(connector, false); drm_edid_connector_update(connector, NULL); + drm_connector_cec_phys_addr_invalidate(connector); return; } =20 @@ -1097,8 +1099,9 @@ drm_atomic_helper_connector_hdmi_update(struct drm_co= nnector *connector, drm_edid_free(drm_edid); =20 if (status =3D=3D connector_status_connected) { - // TODO: also handle CEC and scramber, HDMI sink is now connected. + // TODO: also handle scramber, HDMI sink is now connected. drm_connector_hdmi_audio_plugged_notify(connector, true); + drm_connector_cec_phys_addr_set(connector); } } =20 --=20 2.39.5 From nobody Fri Dec 19 17:20:03 2025 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 67CA019E826 for ; Sat, 17 May 2025 01:59:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447200; cv=none; b=B1YKcCy/TOTdwF6jFsyhaj+YrfK4L71zhAqAtKQO0YINmHkMnp1depwDlnGJPBWE5EZG0EVtxLs55s7obphTZubb8gq6R6j+6VNOFQgldZCmafdOenE9I/jteVcg8V9Jjd70iTMQY+6auAjiu4rA4OoA5ARAq8eaFMibXhT7w3s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447200; c=relaxed/simple; bh=ZzlersvTLL0IktdHslk0q+4YuV1RN4dfEFDTbtz5HF0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RCqg+VuSESi2vyD6/5InTXQzAKBASJMs8UMFx2pPwCHTqIoaCtVahcLM7jmQ7tJiUUbo/xTCNEomCegKi8esIQocYYJFtSf/STLN58F9EEIp50gHs6Ebh3/qJTxzS5G4x0ls3RNSTSoeN3j1imtI6Xe+xSYNk5gWriFZjWFRP5g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=JbMnBILF; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="JbMnBILF" Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54GG5fis027678 for ; Sat, 17 May 2025 01:59:57 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= 3XSqrZKktfGYlTzMTKcLEHsjU48SVzia5cP1WdcYB1I=; b=JbMnBILFq0l5EEVo ii0mFGnx82xzEBN1Zt2/199lPsQipWukZo9AIWhuwbzgDEQE2P6cYo8P0FuAxZ27 +miV/D6GeYlOwpflarmF+CX4GxoN023ypMu9RnQTT+xjuiNhdZg1ZfGxUZuaUsw6 pC+qH2cBwaImnvC6/AQwdMbXD/2c6t3GBXAYHEvvKAFv4voh//cXXEZYydQdnjXo xvsEMm8AH2vdbMmkIMzHFASdvUbgY5uB4MVV/xuNh3PsjXEeDbjK2H+BIlK32Biz ILoy9KvMpe50xZP7XhypiSWdCDK109SlecJObl3CrEnt7XzB45noEScpPxlvG9Hj PwEU1Q== Received: from mail-qv1-f72.google.com (mail-qv1-f72.google.com [209.85.219.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46p01n2m86-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Sat, 17 May 2025 01:59:56 +0000 (GMT) Received: by mail-qv1-f72.google.com with SMTP id 6a1803df08f44-6f8ae3c3d80so38468376d6.2 for ; Fri, 16 May 2025 18:59:56 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747447196; x=1748051996; 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=3XSqrZKktfGYlTzMTKcLEHsjU48SVzia5cP1WdcYB1I=; b=kMtPgJCynp5ynqVt9ZhBn+tuxj4h2pavc7Q9kvysmHKgoWH2hQmeckGHicUMqe6JmQ JaVJ74orzKWABR6Y1ZyGVVOKltbbHYsyxcOtNTp+Vf1gq6BA9R+s6Bw6ClsGjIKYqJ1j M4B4eY+3jbuJV3RuUlH3jbPZ/dpnm/B6imx4NDYZ0X2RlRoSx0hgpWO/18SL8YmnBSfQ gYiFAsqKUjEH+TynUBksYjf8SW+7LCekRfu3HIyDTktMoBFlzcdeLAowvdho4FFimFIL 58B2FzU2g6jlb1n+2/sL0zcq/qUNqCIV/5tX2Ny7g9TGZglXg5Hr4ZXhvwWOtn5Ozrx1 t0xg== X-Forwarded-Encrypted: i=1; AJvYcCWAAItY3JfxmRRJYypgqwaseotqNHhzLlKiHXATcf3SUTMkmW2vlWUnhryX8KLK9XY4mrjUF8XeRsurdNE=@vger.kernel.org X-Gm-Message-State: AOJu0YwsPa0uMrzKp/1olLycOKzkYbvYwfoQAJ3EMtU6s/VXHclqf5bx LUrtBWmx2ggVBfB4zwKuFwV9ZjioWnb8wgs5i2xAL87aAn74kmpsV0ncbK2s1sP6CAfVbMQD6Qh LGkiJadhc1j98zn7AJptn60afGlvF8uPOL303SvL5y7mOwoXohu+z2aQHgxDsp7A2lGnIvUAb+1 E= X-Gm-Gg: ASbGnctDObGnPF6KyjyPbRQaSLX5dvQXRMjP1BtVTw5Nky3tzqv0KZjpVztgBaoLlJx a+49GLeoZmvWDCu6qBNx66uUZ0tx++b8s5Qxr6o23RsI4B9obB+nWXFc9dGbWlirdG7Da31pPtU dFsU2GV+1dTjIP0YtJl7cn4l/BcVotkrDk2WnxjenCcxA6fRvnwJIS5mA0ecydTpvv0OeorKsJo UQhoguauHczl6jF+Gpq2rdTA/Mw/W5Li87IqnFoi1RMYTZGs2zxyBKSYFjZeT2J5jBXQ97tigOt biY5tsOxP4SigF3uJdQUSd2ehugHXWCvlhIi0k98UKJWyeokWVdWexsxmdoRBWXKg5hgBDX73uN 098v0YBD8ynrOvbZLzBY23ygf X-Received: by 2002:a05:6214:2305:b0:6e4:2dd7:5c88 with SMTP id 6a1803df08f44-6f8b0874269mr92587596d6.38.1747447195892; Fri, 16 May 2025 18:59:55 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEQ3Od+DNBvMmQ2uQcf4ei7YmmJ8S8iHuw8ZnPu1Q95oM9nKpIu74cA+QdiKV4h8E3Y6m8JzQ== X-Received: by 2002:a05:6214:2305:b0:6e4:2dd7:5c88 with SMTP id 6a1803df08f44-6f8b0874269mr92587376d6.38.1747447195452; Fri, 16 May 2025 18:59:55 -0700 (PDT) Received: from umbar.lan (2001-14ba-a0c3-3a00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a0c3:3a00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-550e70180f7sm672167e87.128.2025.05.16.18.59.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 May 2025 18:59:54 -0700 (PDT) From: Dmitry Baryshkov Date: Sat, 17 May 2025 04:59:43 +0300 Subject: [PATCH v6 07/10] drm/vc4: hdmi: switch to generic CEC helpers 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: <20250517-drm-hdmi-connector-cec-v6-7-35651db6f19b@oss.qualcomm.com> References: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> In-Reply-To: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Dmitry Baryshkov X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=10627; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=ZzlersvTLL0IktdHslk0q+4YuV1RN4dfEFDTbtz5HF0=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBoJ+2LKuk5lmQupJIkLBk7bJldGXyHjs78yNkP1 w3Vs/Y3F6aJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaCftiwAKCRCLPIo+Aiko 1TCHB/0bN5Gcan0M1UWVMlTk4lVkU3QefdnJc0FB7/KnhWC9fDfunBk5UIVZjVgQvkIo9q8alO8 Sp6dDIcYYpSJ1y1bJ+iQxhw5Wcbohrs1Nqa1PGxeWo1yqNfNxR0qT4DSAmLH1/0drb54ov+WVgf oVVDlaPrupK4/sdk1w3Li3UBOSA/cU/9rLx3qYVt//2qhzIah23uxAtxL+ae9nFSu57gm27vr/5 ++EJCzScvCNIoBZXOxoqOQYQqT0AiOd5nPP6BUSw72qUKK/WXBNlBTFZ/5HPn7IOy3OGKf+oxK7 3uCT8DV25K2dkVQ7uNZzj/ej43ChWk3MIFBYFQvT3VF40BEy X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Authority-Analysis: v=2.4 cv=M4lNKzws c=1 sm=1 tr=0 ts=6827ed9d cx=c_pps a=7E5Bxpl4vBhpaufnMqZlrw==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=a9hgYIhf75voWPlnlJQA:9 a=QEXdDO2ut3YA:10 a=pJ04lnu7RYOZP9TFuWaZ:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTE3MDAxNyBTYWx0ZWRfX55gshMDYDYHH 7yv6zQS8H7DcwYOoN4R2NbA3wh9KENvrJ69MSQQj3go1VA0PxGXfmVZu7ljsLHpp7mFRzwOuk64 N4U5ZgOiH0HlafMpwvNumSJt6iDXRA/64i/Qq1cS2WWYfRpI9J4xP7pr+DBDQ7yQaP29h0mCkr6 lnmcoPC+AHbGhcN9ekmXTzoaMNhkE8cPpg0+B8IepkkrSwYe+0f8/Usd40bUy+dB+mDWUttfDEn GINt+MtQcL9GrRIUxeLy7oLdwTuf1N1KXyWO4pxUIjeTQ/dw5a8mPVdHJVKHO69ZKR4FoaGLvJe neW2fQm2nHlGGnlb0FKslEFivz+3Dkcsg7lRUoOw0rvSCxXCfYbkQwrozVuuSBaAhbVH2da5Vck slrZK904KeSmelu+BHORZ7b+R9KqsPuhemVwKHPbSiGi4fSTg1M/hCYVmcPiTYZ9tPbAlxBB X-Proofpoint-ORIG-GUID: dk43HmgTwZt-wXHzJ7jB7jnH5VKHAuLE X-Proofpoint-GUID: dk43HmgTwZt-wXHzJ7jB7jnH5VKHAuLE X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-17_01,2025-05-16_03,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1015 impostorscore=0 malwarescore=0 mlxlogscore=999 mlxscore=0 lowpriorityscore=0 phishscore=0 bulkscore=0 adultscore=0 priorityscore=1501 suspectscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505070000 definitions=main-2505170017 Switch VC4 driver to using CEC helpers code, simplifying hotplug and registration / cleanup. The existing vc4_hdmi_cec_release() is kept for now. Signed-off-by: Dmitry Baryshkov Signed-off-by: Dmitry Baryshkov Reviewed-by: Maxime Ripard --- drivers/gpu/drm/vc4/Kconfig | 1 + drivers/gpu/drm/vc4/vc4_hdmi.c | 137 ++++++++++++++++---------------------= ---- drivers/gpu/drm/vc4/vc4_hdmi.h | 1 - 3 files changed, 55 insertions(+), 84 deletions(-) diff --git a/drivers/gpu/drm/vc4/Kconfig b/drivers/gpu/drm/vc4/Kconfig index 123ab0ce178157c3b39466f87c7ac39c8470f329..bb8c40be325033632d3e94db87a= 16b03554ad3af 100644 --- a/drivers/gpu/drm/vc4/Kconfig +++ b/drivers/gpu/drm/vc4/Kconfig @@ -35,6 +35,7 @@ config DRM_VC4_HDMI_CEC bool "Broadcom VC4 HDMI CEC Support" depends on DRM_VC4 select CEC_CORE + select DRM_DISPLAY_HDMI_CEC_HELPER help Choose this option if you have a Broadcom VC4 GPU and want to use CEC. diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 4797ed1c21f47992fe4d497d904ee31c824cd449..194a73fb821ae5082f308c81293= c22fed0dbda80 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -32,6 +32,7 @@ */ =20 #include +#include #include #include #include @@ -375,14 +376,6 @@ static void vc4_hdmi_handle_hotplug(struct vc4_hdmi *v= c4_hdmi, =20 drm_atomic_helper_connector_hdmi_hotplug(connector, status); =20 - if (status =3D=3D connector_status_disconnected) { - cec_phys_addr_invalidate(vc4_hdmi->cec_adap); - return; - } - - cec_s_phys_addr(vc4_hdmi->cec_adap, - connector->display_info.source_physical_address, false); - if (status !=3D connector_status_connected) return; =20 @@ -2378,8 +2371,8 @@ static irqreturn_t vc4_cec_irq_handler_rx_thread(int = irq, void *priv) struct vc4_hdmi *vc4_hdmi =3D priv; =20 if (vc4_hdmi->cec_rx_msg.len) - cec_received_msg(vc4_hdmi->cec_adap, - &vc4_hdmi->cec_rx_msg); + drm_connector_hdmi_cec_received_msg(&vc4_hdmi->connector, + &vc4_hdmi->cec_rx_msg); =20 return IRQ_HANDLED; } @@ -2389,15 +2382,17 @@ static irqreturn_t vc4_cec_irq_handler_tx_thread(in= t irq, void *priv) struct vc4_hdmi *vc4_hdmi =3D priv; =20 if (vc4_hdmi->cec_tx_ok) { - cec_transmit_done(vc4_hdmi->cec_adap, CEC_TX_STATUS_OK, - 0, 0, 0, 0); + drm_connector_hdmi_cec_transmit_done(&vc4_hdmi->connector, + CEC_TX_STATUS_OK, + 0, 0, 0, 0); } else { /* * This CEC implementation makes 1 retry, so if we * get a NACK, then that means it made 2 attempts. */ - cec_transmit_done(vc4_hdmi->cec_adap, CEC_TX_STATUS_NACK, - 0, 2, 0, 0); + drm_connector_hdmi_cec_transmit_done(&vc4_hdmi->connector, + CEC_TX_STATUS_NACK, + 0, 2, 0, 0); } return IRQ_HANDLED; } @@ -2554,9 +2549,9 @@ static irqreturn_t vc4_cec_irq_handler(int irq, void = *priv) return ret; } =20 -static int vc4_hdmi_cec_enable(struct cec_adapter *adap) +static int vc4_hdmi_cec_enable(struct drm_connector *connector) { - struct vc4_hdmi *vc4_hdmi =3D cec_get_drvdata(adap); + struct vc4_hdmi *vc4_hdmi =3D connector_to_vc4_hdmi(connector); struct drm_device *drm =3D vc4_hdmi->connector.dev; /* clock period in microseconds */ const u32 usecs =3D 1000000 / CEC_CLOCK_FREQ; @@ -2621,9 +2616,9 @@ static int vc4_hdmi_cec_enable(struct cec_adapter *ad= ap) return 0; } =20 -static int vc4_hdmi_cec_disable(struct cec_adapter *adap) +static int vc4_hdmi_cec_disable(struct drm_connector *connector) { - struct vc4_hdmi *vc4_hdmi =3D cec_get_drvdata(adap); + struct vc4_hdmi *vc4_hdmi =3D connector_to_vc4_hdmi(connector); struct drm_device *drm =3D vc4_hdmi->connector.dev; unsigned long flags; int idx; @@ -2657,17 +2652,17 @@ static int vc4_hdmi_cec_disable(struct cec_adapter = *adap) return 0; } =20 -static int vc4_hdmi_cec_adap_enable(struct cec_adapter *adap, bool enable) +static int vc4_hdmi_cec_adap_enable(struct drm_connector *connector, bool = enable) { if (enable) - return vc4_hdmi_cec_enable(adap); + return vc4_hdmi_cec_enable(connector); else - return vc4_hdmi_cec_disable(adap); + return vc4_hdmi_cec_disable(connector); } =20 -static int vc4_hdmi_cec_adap_log_addr(struct cec_adapter *adap, u8 log_add= r) +static int vc4_hdmi_cec_adap_log_addr(struct drm_connector *connector, u8 = log_addr) { - struct vc4_hdmi *vc4_hdmi =3D cec_get_drvdata(adap); + struct vc4_hdmi *vc4_hdmi =3D connector_to_vc4_hdmi(connector); struct drm_device *drm =3D vc4_hdmi->connector.dev; unsigned long flags; int idx; @@ -2693,10 +2688,10 @@ static int vc4_hdmi_cec_adap_log_addr(struct cec_ad= apter *adap, u8 log_addr) return 0; } =20 -static int vc4_hdmi_cec_adap_transmit(struct cec_adapter *adap, u8 attempt= s, +static int vc4_hdmi_cec_adap_transmit(struct drm_connector *connector, u8 = attempts, u32 signal_free_time, struct cec_msg *msg) { - struct vc4_hdmi *vc4_hdmi =3D cec_get_drvdata(adap); + struct vc4_hdmi *vc4_hdmi =3D connector_to_vc4_hdmi(connector); struct drm_device *dev =3D vc4_hdmi->connector.dev; unsigned long flags; u32 val; @@ -2739,84 +2734,65 @@ static int vc4_hdmi_cec_adap_transmit(struct cec_ad= apter *adap, u8 attempts, return 0; } =20 -static const struct cec_adap_ops vc4_hdmi_cec_adap_ops =3D { - .adap_enable =3D vc4_hdmi_cec_adap_enable, - .adap_log_addr =3D vc4_hdmi_cec_adap_log_addr, - .adap_transmit =3D vc4_hdmi_cec_adap_transmit, -}; - -static void vc4_hdmi_cec_release(void *ptr) -{ - struct vc4_hdmi *vc4_hdmi =3D ptr; - - cec_unregister_adapter(vc4_hdmi->cec_adap); - vc4_hdmi->cec_adap =3D NULL; -} - -static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) +static int vc4_hdmi_cec_init(struct drm_connector *connector) { - struct cec_connector_info conn_info; + struct vc4_hdmi *vc4_hdmi =3D connector_to_vc4_hdmi(connector); struct platform_device *pdev =3D vc4_hdmi->pdev; struct device *dev =3D &pdev->dev; int ret; =20 - if (!of_property_present(dev->of_node, "interrupts")) { - dev_warn(dev, "'interrupts' DT property is missing, no CEC\n"); - return 0; - } - - vc4_hdmi->cec_adap =3D cec_allocate_adapter(&vc4_hdmi_cec_adap_ops, - vc4_hdmi, - vc4_hdmi->variant->card_name, - CEC_CAP_DEFAULTS | - CEC_CAP_CONNECTOR_INFO, 1); - ret =3D PTR_ERR_OR_ZERO(vc4_hdmi->cec_adap); - if (ret < 0) - return ret; - - cec_fill_conn_info_from_drm(&conn_info, &vc4_hdmi->connector); - cec_s_conn_info(vc4_hdmi->cec_adap, &conn_info); - if (vc4_hdmi->variant->external_irq_controller) { ret =3D devm_request_threaded_irq(dev, platform_get_irq_byname(pdev, "ce= c-rx"), vc4_cec_irq_handler_rx_bare, vc4_cec_irq_handler_rx_thread, 0, "vc4 hdmi cec rx", vc4_hdmi); if (ret) - goto err_delete_cec_adap; + return ret; =20 ret =3D devm_request_threaded_irq(dev, platform_get_irq_byname(pdev, "ce= c-tx"), vc4_cec_irq_handler_tx_bare, vc4_cec_irq_handler_tx_thread, 0, "vc4 hdmi cec tx", vc4_hdmi); if (ret) - goto err_delete_cec_adap; + return ret; } else { ret =3D devm_request_threaded_irq(dev, platform_get_irq(pdev, 0), vc4_cec_irq_handler, vc4_cec_irq_handler_thread, 0, "vc4 hdmi cec", vc4_hdmi); if (ret) - goto err_delete_cec_adap; + return ret; } =20 - ret =3D cec_register_adapter(vc4_hdmi->cec_adap, &pdev->dev); - if (ret < 0) - goto err_delete_cec_adap; + return 0; +} + +static const struct drm_connector_hdmi_cec_funcs vc4_hdmi_cec_funcs =3D { + .init =3D vc4_hdmi_cec_init, + .enable =3D vc4_hdmi_cec_adap_enable, + .log_addr =3D vc4_hdmi_cec_adap_log_addr, + .transmit =3D vc4_hdmi_cec_adap_transmit, +}; + +static int vc4_hdmi_cec_register(struct vc4_hdmi *vc4_hdmi) +{ + struct platform_device *pdev =3D vc4_hdmi->pdev; + struct device *dev =3D &pdev->dev; + + if (!of_property_present(dev->of_node, "interrupts")) { + dev_warn(dev, "'interrupts' DT property is missing, no CEC\n"); + return 0; + } =20 /* - * NOTE: Strictly speaking, we should probably use a DRM-managed - * registration there to avoid removing the CEC adapter by the - * time the DRM driver doesn't have any user anymore. + * NOTE: the CEC adapter will be unregistered by drmm cleanup from + * drm_managed_release(), which is called from drm_dev_release() + * during device unbind. * * However, the CEC framework already cleans up the CEC adapter * only when the last user has closed its file descriptor, so we * don't need to handle it in DRM. * - * By the time the device-managed hook is executed, we will give - * up our reference to the CEC adapter and therefore don't - * really care when it's actually freed. - * * There's still a problematic sequence: if we unregister our * CEC adapter, but the userspace keeps a handle on the CEC * adapter but not the DRM device for some reason. In such a @@ -2827,19 +2803,14 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_h= dmi) * the CEC framework already handles this too, by calling * cec_is_registered() in cec_ioctl() and cec_poll(). */ - ret =3D devm_add_action_or_reset(dev, vc4_hdmi_cec_release, vc4_hdmi); - if (ret) - return ret; - - return 0; - -err_delete_cec_adap: - cec_delete_adapter(vc4_hdmi->cec_adap); - - return ret; + return drmm_connector_hdmi_cec_register(&vc4_hdmi->connector, + &vc4_hdmi_cec_funcs, + vc4_hdmi->variant->card_name, + 1, + &pdev->dev); } #else -static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) +static int vc4_hdmi_cec_register(struct vc4_hdmi *vc4_hdmi) { return 0; } @@ -3244,7 +3215,7 @@ static int vc4_hdmi_bind(struct device *dev, struct d= evice *master, void *data) if (ret) goto err_put_runtime_pm; =20 - ret =3D vc4_hdmi_cec_init(vc4_hdmi); + ret =3D vc4_hdmi_cec_register(vc4_hdmi); if (ret) goto err_put_runtime_pm; =20 diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.h b/drivers/gpu/drm/vc4/vc4_hdmi.h index a31157c99bee6b33527c4b558fc72fff65d2a278..8d069718df00d9afc13aadbb126= 48e2bb75a1721 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.h +++ b/drivers/gpu/drm/vc4/vc4_hdmi.h @@ -147,7 +147,6 @@ struct vc4_hdmi { */ bool disable_wifi_frequencies; =20 - struct cec_adapter *cec_adap; struct cec_msg cec_rx_msg; bool cec_tx_ok; bool cec_irq_was_rx; --=20 2.39.5 From nobody Fri Dec 19 17:20:03 2025 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2CBAD1A314B for ; Sat, 17 May 2025 01:59:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447201; cv=none; b=kEtazCANs2y/HJAiwKHlZkVu5ffjHJODG9pEwwx6DMYtrJx93mP9wgAOFu3rlyO7CIkUuOBj/uAEHMlM+lfVzc/dMAxf+XEnoweg4ydYRybnQ8/bdfi9gAcQiL+QomVbc11n06fzzd+ZLdVGhe48ruDBYqK326aggCpvmjz5sxI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447201; c=relaxed/simple; bh=LMfOqZbcmDFI+UGpgbtzZXyktFHpBBqyKOs2nIEEJWo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=APtsPQ5IkdWFGI9QzxIq/J39aE330vxgUXJ/r6yeWBF7AF+8k40M0XNG7UNqUCI+ShkZ9xIuWAoQ6RlngkL5NtkhzDhBn01K+PtFMySlGHtlikYmu0qVFdJOpNCpVsVRAbAWernTutLYf7TBwDZwAioqbNK7HtySp1CKeSHJq+E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=bbKCV9ZY; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="bbKCV9ZY" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54GC1sjb019533 for ; Sat, 17 May 2025 01:59:59 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= pzoCVGuuCG8OuzWqLizoElhfY931yJkLZD9sIcqllt0=; b=bbKCV9ZY1DqEjhMV zBbB2ZDNjeKDDGH26bF2uHBPFK0XixAd78ElXqCNsfikzibdfJaD7dEqFPK/BNkz r8ujn5DrY54ulanf2jEYQxoyPMSRoW6quVA/C03kdpWf/hPrXvbb88HfZPBsuku9 A/zAImEXeyBLjIrYRdKXqjTRngoOoxb0X1FF6h0/JwAcYQpvOGyqYO2ulW9IVzSA XMSzVsJmGwCAB3QpOFfX5dhHZ7Z48HQxcy6XOvTwVww/B9qzHxyTpz0invcwyQ1b Ti9taHVBDxlbyMeMEp/UXip8dTPtybSDh3x0Lwh/v9Zz3BpZwOkms/+IGixX/8FZ 3hSD6A== Received: from mail-qv1-f70.google.com (mail-qv1-f70.google.com [209.85.219.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46mbcnuguv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Sat, 17 May 2025 01:59:58 +0000 (GMT) Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-6f6f2c41eddso58200516d6.2 for ; Fri, 16 May 2025 18:59:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747447197; x=1748051997; 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=pzoCVGuuCG8OuzWqLizoElhfY931yJkLZD9sIcqllt0=; b=Hl8pNf2fTS9wtbqzEXtm8JDDS1w5MhkzCOJFbUjA+o5q8n29jZBU2Gj1UE3vKl5rBw FaGUjPYbKsyiOs2DUn84Al5Red4+uNCPkRfMu63o1ghx+0IKiW5lKpXbuSSC5lMkBWNL IxvSFVLUKNblojfaYXDlxAd6mxVWNiPX5AJU6mFFnhSwaaPPqS/Lel/xNzbVs7c+nb2E Sb8Nogah5BSJcHOsRcss2SfrKPQlJT98/ugzozbjvygi6wO6ZRwGQZx9hm/AkCdLXpCO zfUsSDNjVUmw7icwdSjsxl737LztXFr2uVybq7NJyUhw3qLQ3hsz0KYrTDVCn8gBX9Cc y2Zw== X-Forwarded-Encrypted: i=1; AJvYcCWPOecMvI2ssZ4UgPmHikYSt8NmNfeFQC1ysNnUlOHTHqurZpdLpTqBQcE94xUYwPuIRRV/TP83i9Grx5g=@vger.kernel.org X-Gm-Message-State: AOJu0Yw01u1543P5zE9ADijX9f4tjK4tKLQbKP0xfQZ3WGCMh36R/sUX HPDwQem0teU7/BzOmkVVRyuonY7KsN5ITdJmnqpU2t72+rtep6biiwLxuBSu7x2Y65p4tjqlhQ9 vc5rZApAdHLHeCZd/oaK5pi24NSEbGXyppBLvtLNICB6Uh72Tp0UC6G8mdtUuKh3HKwtzzWrUg/ I= X-Gm-Gg: ASbGncvRAP8g2UFotAI58EcWIT+a16BG916sKG9xDjXs9CfKQ4sv+16tX3ZDGR95WPf L7QyNffvBqb0Ut+FPIVU9ymqdoQv1VC0RmwgRRQvYE9p13FYZ8XeLPU5jqOKoDn3E3M0MLpY3zl QjusxuadUHCV8vueCKG+3wd2DksGTQvYPQU2GnWfMNYhbHcDJC7gKwra7y8CDW/zvRqldbvuTiA 4ZbeVEOyHIT3JuDYWz18kE3BgN1I4R3SAy5PUraQUBlSQdikATUgrLdMEzwUUslTO6qaWeGKrpf JAUlFGOYPUcy8+X3I1IJgB2N9a3KdGee00H55s/QffoJifDhYkTJdxaz7cB3oZWF1xzrgu0jJyD 7ffqLd44CQ8vnDcyzVCcSG60Y X-Received: by 2002:a05:6214:cc2:b0:6f8:a6fe:24ed with SMTP id 6a1803df08f44-6f8b082861fmr89882726d6.10.1747447197302; Fri, 16 May 2025 18:59:57 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGa6ZwlC44UP8jsEQ22lvWdm6wcoZvnONq7h1t9qxDd3KoV8uXhs6K7zmRDjNk8uSamqIJjsg== X-Received: by 2002:a05:6214:cc2:b0:6f8:a6fe:24ed with SMTP id 6a1803df08f44-6f8b082861fmr89882496d6.10.1747447196940; Fri, 16 May 2025 18:59:56 -0700 (PDT) Received: from umbar.lan (2001-14ba-a0c3-3a00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a0c3:3a00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-550e70180f7sm672167e87.128.2025.05.16.18.59.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 May 2025 18:59:55 -0700 (PDT) From: Dmitry Baryshkov Date: Sat, 17 May 2025 04:59:44 +0300 Subject: [PATCH v6 08/10] drm/display: bridge-connector: hook in CEC notifier support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250517-drm-hdmi-connector-cec-v6-8-35651db6f19b@oss.qualcomm.com> References: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> In-Reply-To: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Dmitry Baryshkov X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3344; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=LMfOqZbcmDFI+UGpgbtzZXyktFHpBBqyKOs2nIEEJWo=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBoJ+2LwoerEyNYi7ihJJAMmqPFArPVA3VlmHCN3 IiEZ71MP8eJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaCftiwAKCRCLPIo+Aiko 1RYxB/4j1PzOGgcvMIrL6Y/yAmjXrjoiaIyQtPY7SBGeyzLFYpBbOWFsy9l2v/ad2VZdYpJb90S Z3+NqKQa290lV+bJjeOOyY65rfHMKGoe/lMsGzpBVqltcf+R048HtdasvXYhPckf6FqgYxKnTVg zhE7IDPNx/t1WgX/3D5c+KdaWubqyWyAIkUxZCgIMrTC6kN7ZlRaiKatLdAzNeMsAgSFpFBD4V+ upFmVqaL1dINpqiMr0z041KN9TeizUX0Fnslv6ksZIyizbkidwVMpgoL+RODcRQXSUTup4vaGJh ZezI+qMf/8pRN5Mzoz5ELiSmEv+KUFETUaVmspYQKr/cdP8F X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-ORIG-GUID: BHNmPzlR69Molo6CKwdyELSUkxfhaDaF X-Authority-Analysis: v=2.4 cv=aIbwqa9m c=1 sm=1 tr=0 ts=6827ed9e cx=c_pps a=oc9J++0uMp73DTRD5QyR2A==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=KKAkSRfTAAAA:8 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=wPpwn6IxAmBijdVEDHIA:9 a=QEXdDO2ut3YA:10 a=iYH6xdkBrDN1Jqds4HTS:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-GUID: BHNmPzlR69Molo6CKwdyELSUkxfhaDaF X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTE3MDAxNyBTYWx0ZWRfXxLicyHXGViQX n7MnOE1oGgNTjFUEAi34LsKTy7HMuS3cervzw4yX3xn+M+r5L07bqG0Ocezxw8EgR5ra2qnoqc6 ukQMgQefkKjMViC5SkXcfdFlAJ70+Rj0xXXzBl2UIjslS48AJaeDuWVAWNv26D2nVszv0DX0r1c MfFBNT9AscF18sY9QaJdLgB8XfEOeu13IEQdxiQcHGhOzT53W+CfpjW0MVJme7XS/XOSWKTt1RY XyPC97BJND3yqDJHMm8ZXjJWbRDvRYVglk2CwxDjyP74MGq2gR4FfEt+WuCJD4jLdYZ3h9hzZJE 070sbdVcZOHbGEcQE4HgPlHhYyigntpYER2nUJRCx3ZhNSBxk/aIlWbpucpkX20xs1X37Oxs4Iz tHxepSGoYLxfnwDYWFEGKJl+pipuJEemE3psrlbkmvLwln6zphmyRS8s4fB3npj/KtPYFuLM X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-17_01,2025-05-16_03,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 mlxlogscore=791 malwarescore=0 bulkscore=0 impostorscore=0 clxscore=1015 phishscore=0 suspectscore=0 mlxscore=0 spamscore=0 lowpriorityscore=0 priorityscore=1501 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505070000 definitions=main-2505170017 Allow HDMI DRM bridges to create CEC notifier. Physical address is handled automatically by drm_atomic_helper_connector_hdmi_hotplug() being called from .detect() path. Signed-off-by: Dmitry Baryshkov Reviewed-by: Maxime Ripard Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/display/drm_bridge_connector.c | 24 ++++++++++++++++++++++= ++ include/drm/drm_bridge.h | 11 +++++++++++ 2 files changed, 35 insertions(+) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index 381a0f9d4259bf9f72d3a292b7dcc82e45c61bae..0377dcd691a871643710d667248= b05f8eb9e84d6 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include =20 @@ -113,6 +114,13 @@ struct drm_bridge_connector { * &DRM_BRIDGE_OP_DP_AUDIO). */ struct drm_bridge *bridge_dp_audio; + /** + * @bridge_hdmi_cec: + * + * The bridge in the chain that implements CEC support, if any (see + * DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER). + */ + struct drm_bridge *bridge_hdmi_cec; }; =20 #define to_drm_bridge_connector(x) \ @@ -662,6 +670,13 @@ struct drm_connector *drm_bridge_connector_init(struct= drm_device *drm, bridge_connector->bridge_dp_audio =3D bridge; } =20 + if (bridge->ops & DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER) { + if (bridge_connector->bridge_hdmi_cec) + return ERR_PTR(-EBUSY); + + bridge_connector->bridge_hdmi_cec =3D bridge; + } + if (!drm_bridge_get_next_bridge(bridge)) connector_type =3D bridge->type; =20 @@ -724,6 +739,15 @@ struct drm_connector *drm_bridge_connector_init(struct= drm_device *drm, return ERR_PTR(ret); } =20 + if (bridge_connector->bridge_hdmi_cec && + bridge_connector->bridge_hdmi_cec->ops & DRM_BRIDGE_OP_HDMI_CEC_NOTIF= IER) { + ret =3D drmm_connector_hdmi_cec_notifier_register(connector, + NULL, + bridge->hdmi_cec_dev); + if (ret) + return ERR_PTR(ret); + } + drm_connector_helper_add(connector, &drm_bridge_connector_helper_funcs); =20 if (bridge_connector->bridge_hpd) diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index db0d374d863b0b1f774d395743f1e29bb84e8937..0e5f6a007d536215bd50e118464= 33290c2060b9c 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -907,6 +907,11 @@ enum drm_bridge_ops { * flag. */ DRM_BRIDGE_OP_DP_AUDIO =3D BIT(6), + /** + * @DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER: The bridge requires CEC notifier + * to be present. + */ + DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER =3D BIT(7), }; =20 /** @@ -1003,6 +1008,12 @@ struct drm_bridge { */ unsigned int max_bpc; =20 + /** + * @hdmi_cec_dev: device to be used as a containing device for CEC + * functions. + */ + struct device *hdmi_cec_dev; + /** * @hdmi_audio_dev: device to be used as a parent for the HDMI Codec if * either of @DRM_BRIDGE_OP_HDMI_AUDIO or @DRM_BRIDGE_OP_DP_AUDIO is set. --=20 2.39.5 From nobody Fri Dec 19 17:20:03 2025 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ABED71519BF for ; Sat, 17 May 2025 02:00:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447203; cv=none; b=PrWV/ZYVmWitZsDes8z2B5NXqoXdsTVGu6tkqWDXvnzjh6SCiY9HAYf0wO6JUctz//xLonsBg7MgbXOea0ZvEnxvnZAaJx8V8qYFaI18GvGRQYGPoqCjDzL90xaGXITXGzEN1HO54qtA/8SaiYsM0qlovH7Pe/P+Bgoy9tFUpOU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447203; c=relaxed/simple; bh=i2siyc5cNZp28Bm/+U+t6HAhNXnqz68ofKezvInamp4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=toyI6OsV3DXHkRJGmTZU9uM0Qm2KoZQfmNKKi8AN3w2X+9LzIzrD8ruC9VCP8PsjGt20G4/k36qo/GhdF7naXsZ3psU+npBFgvlQO57JBFyufEWvT9ca9J+2gMT0W/VPOyngPfD50jqQAbmE5VUb3ORyPLcM7KP2TuKIlRc38Eo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=HF9ErV4S; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="HF9ErV4S" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54H0sxcX014970 for ; Sat, 17 May 2025 02:00:00 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= FTue6qDwrYubFQMk1w1EWo6BYJAZv6w0wv+khPYE838=; b=HF9ErV4S/gjbPymd qvweci5y7r5Fcmm7KFalbEl68BOP5fDO9t2ZHV6nhVeSGJrPT5K7/lZPZFiLYrMG f7GLV6yulvOyChR2i+zAqsq6ad/NH2GIt+gBFtWFY+FfFjpnhnNDig7rP8lx46U/ IEFlvMsh3wt5byh0ehGl532e3KulWtPyed3V3J3nVW4w+ICEJM6xYHfhkiNN0+sc G96IDgig2VFAn+1/xw1yblU9F9Ak8VRu5CiAs+56i8amC+qmFrrP5mDWuKDZDTIy XetF4cWndvUAxKJL8nfYFgdF+BnGqRCeXSLBEOVc4ZAjzRH0Fv5OcSe/WMOJQfdh v0DPAA== Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46mbcpkr6y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Sat, 17 May 2025 02:00:00 +0000 (GMT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-6f8ae3c3d80so38468696d6.2 for ; Fri, 16 May 2025 19:00:00 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747447199; x=1748051999; 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=FTue6qDwrYubFQMk1w1EWo6BYJAZv6w0wv+khPYE838=; b=KHIIrJkXMBgBB4iGJ0BGyuUtMuOEnOMRE213Prse+aWaEIevs29QOA81hdeDiB9jZq 2ew/eoiITWvMOJ1g6ZYYA5CQ450nREEAMZMG2XzwTHQLEMxrvgrtz/xXJagKSTItbu8E LX9lLL/vPP7I9trvItJjd1UW2ltyCa/UFM0hgfwjUtoi/2A9CVrTMUwAM1ZJXWLJOg0F Y26h4ly23QllRPYmOvrWg4V4eRki3nyGLojHyIocTr8jBsrz1aKJnXn6TGRqITpDWgsL 9nns6hdkgMwT/Q4TNHmd/3iyt9G+N5EcJpkahjyh7U00eCH8VhbhSrAfyL3Lx+42ri9J +ikA== X-Forwarded-Encrypted: i=1; AJvYcCXXqwUYOd16sBQkpLb7Zy0+2tnjNuQktTPuLduLrQcR67clxtqrq2NuQmUJmEqI+Oc7+UXHbA71Xk1+IOo=@vger.kernel.org X-Gm-Message-State: AOJu0Ywo5TjYt7c2nBAgXus1gztzx+SsOXQzOHzYgL4wrjcWnsS9zbpa j949gsLBuqCJbiknVzSOXpmHF5nLw9chQMzvb0hHb8Ca8kHQcQjb4WXuZxCmwmbWzePmhQkZNgt 8YQc7PN6WQ/bjg/h5nWRGxWPJm22CFPS99+58hYCfuoX3FtB80N3QeC57lcUkgjsIQdhgoMJGsX Y= X-Gm-Gg: ASbGncvPteHBxgdG/N9KklDHer+OmTWc9RZlEKFB2sAyqWipznOv93DQbaHEnFJstqa Yp2V1Y6c4VgI1ijRt3t6e/4cS9et7VwgeJmvdrJJ8mBz0ljWuik/83ky11uHIjR4l98MJwVX2DE udNe0cUpYB5L+KT720z1ilQS2/uQn77xEQdhnPpv40sUpL/k9vyvNKah5BduReMRTBEy2d82n0W mrzPJXICgheycmb1DMIFBhsEpyLZmhQQHSuM/blQ8U/JNB5aQCulwtqFZLgSBSR1Jr6l4/q9AIK EWRTlKII2p7Cay1EeHddb4wNtjXR/YPPvX8yq6FZoKBikJcWwVCG3eVqWMnY5rryEr0DJ90Buz1 OHRND98Q7BQ6oercRDWHnj69U X-Received: by 2002:a05:6214:f05:b0:6ed:1545:65c3 with SMTP id 6a1803df08f44-6f8b07db221mr102928636d6.2.1747447198722; Fri, 16 May 2025 18:59:58 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEtswsxir2AkXnsumiHReYiQoFeVMytjn5PXkDMFwMyII2mkUh6azr4loh9BoL3Y1eUqvgagA== X-Received: by 2002:a05:6214:f05:b0:6ed:1545:65c3 with SMTP id 6a1803df08f44-6f8b07db221mr102928416d6.2.1747447198298; Fri, 16 May 2025 18:59:58 -0700 (PDT) Received: from umbar.lan (2001-14ba-a0c3-3a00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a0c3:3a00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-550e70180f7sm672167e87.128.2025.05.16.18.59.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 May 2025 18:59:57 -0700 (PDT) From: Dmitry Baryshkov Date: Sat, 17 May 2025 04:59:45 +0300 Subject: [PATCH v6 09/10] drm/display: bridge-connector: handle CEC adapters 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: <20250517-drm-hdmi-connector-cec-v6-9-35651db6f19b@oss.qualcomm.com> References: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> In-Reply-To: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Dmitry Baryshkov X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6377; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=i2siyc5cNZp28Bm/+U+t6HAhNXnqz68ofKezvInamp4=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBoJ+2M7qOLRG+W3LW+MxgS8jnsazA2dFRHMflnQ ZzCzXxJHtiJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaCftjAAKCRCLPIo+Aiko 1U1mB/4uhxDIOc4OBops3pK6MT/S5ECQTQQ+Jzn7GQV/sgWUjXkWZGG6m3aG0939SUscvi/0oiM Wnd9bOnKrGyB+7TzLckK+1nE2l7ezBOuKtnJ58mMqlTol8D0VbVVvWzOj0W0k8HaWuD9kzWdJzH Nb59u+N3GyCkqo+4sXOLBInzkEMGZCMaYxFlcV2+llVR+X63mw7RQHO4YOabWtfvxNCbZsLv9S+ zl8SpxgBYzEzKKs3IhJsO2XQF3z0TEhwwN5TndnuOlc+tczb9AUbaUfHnha4KfRG0QSq4UEIP4b fj9ozsbfLBtBckqTz/o+vw438NGXrDHkts+k7DpVAHdd24nZ X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-GUID: C8nGIL8RDwwtOM8BOUeW4PqDEimSsZ-L X-Proofpoint-ORIG-GUID: C8nGIL8RDwwtOM8BOUeW4PqDEimSsZ-L X-Authority-Analysis: v=2.4 cv=cO7gskeN c=1 sm=1 tr=0 ts=6827eda0 cx=c_pps a=UgVkIMxJMSkC9lv97toC5g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=KKAkSRfTAAAA:8 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=d0TFWrSkjAMFaLnAG04A:9 a=QEXdDO2ut3YA:10 a=1HOtulTD9v-eNWfpl4qZ:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTE3MDAxNyBTYWx0ZWRfX2ySuJz1ku1Fs WhjB6LKSJ+Yq7EyCGBoSEX0Bog2TjicKbIEcQTPMQSWpu2jkpzjHxts6lxVvY+Kb9/uzaSZK19h QqznkcLS6a/IRAnMcS4I1teTeixJGG/kbVDMFmlrT6f3Rl0CyjHC0/iAf35qcFhU2G48Dtoi/iR VNvpZJjIbop3JJE8F99/cQtt7HqUhayMZr+dCLTCirUFsAJwU7kROCr0NkzmIAX2f6MLKB05wPy Tm6eIGM5bGzFBwVtQfcp4NQf42Pxp0BXZrRH+E+YmykHe5pC36JcUmfPPrZ+DkgchXgPySzjIje MmavNka3zKg7FSUO+7ucXx3Ke5k7o5DRqCosadlc4aQMXwcJMRORL+f9ZtdZ2SknGLK4WsbU6De x9pdrzYnG0zJhnHBN+Gbi4jKUqVxgaxIbz1D150aCXNTweFoJbw5gPQpre3FFVI7tcYdzS5n X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-17_01,2025-05-16_03,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxlogscore=999 spamscore=0 suspectscore=0 phishscore=0 lowpriorityscore=0 adultscore=0 bulkscore=0 malwarescore=0 impostorscore=0 clxscore=1015 priorityscore=1501 mlxscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505070000 definitions=main-2505170017 Implement necessary glue code to let DRM bridge drivers to implement CEC adapters support. Signed-off-by: Dmitry Baryshkov Reviewed-by: Maxime Ripard Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/display/Kconfig | 1 + drivers/gpu/drm/display/drm_bridge_connector.c | 83 ++++++++++++++++++++++= ++++ include/drm/drm_bridge.h | 26 ++++++++ 3 files changed, 110 insertions(+) diff --git a/drivers/gpu/drm/display/Kconfig b/drivers/gpu/drm/display/Kcon= fig index 6376ea01ec3093a72de25064e31223d2c9868ed7..df09cf9a8ca19ea894d6f2fad68= c0b191e81e3d0 100644 --- a/drivers/gpu/drm/display/Kconfig +++ b/drivers/gpu/drm/display/Kconfig @@ -17,6 +17,7 @@ if DRM_DISPLAY_HELPER config DRM_BRIDGE_CONNECTOR bool select DRM_DISPLAY_HDMI_AUDIO_HELPER + select DRM_DISPLAY_HDMI_CEC_HELPER select DRM_DISPLAY_HDMI_STATE_HELPER help DRM connector implementation terminating DRM bridge chains. diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index 0377dcd691a871643710d667248b05f8eb9e84d6..3d3607a24189f433e11da98caa0= d327a3d3bc29c 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -554,6 +554,66 @@ static const struct drm_connector_hdmi_audio_funcs drm= _bridge_connector_hdmi_aud .mute_stream =3D drm_bridge_connector_audio_mute_stream, }; =20 +static int drm_bridge_connector_hdmi_cec_enable(struct drm_connector *conn= ector, bool enable) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi_cec; + + return bridge->funcs->hdmi_cec_enable(bridge, enable); +} + +static int drm_bridge_connector_hdmi_cec_log_addr(struct drm_connector *co= nnector, u8 logical_addr) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi_cec; + + return bridge->funcs->hdmi_cec_log_addr(bridge, logical_addr); +} + +static int drm_bridge_connector_hdmi_cec_transmit(struct drm_connector *co= nnector, + u8 attempts, + u32 signal_free_time, + struct cec_msg *msg) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi_cec; + + return bridge->funcs->hdmi_cec_transmit(bridge, attempts, + signal_free_time, + msg); +} + +static int drm_bridge_connector_hdmi_cec_init(struct drm_connector *connec= tor) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi_cec; + + if (!bridge->funcs->hdmi_cec_init) + return 0; + + return bridge->funcs->hdmi_cec_init(connector, bridge); +} + +static const struct drm_connector_hdmi_cec_funcs drm_bridge_connector_hdmi= _cec_funcs =3D { + .init =3D drm_bridge_connector_hdmi_cec_init, + .enable =3D drm_bridge_connector_hdmi_cec_enable, + .log_addr =3D drm_bridge_connector_hdmi_cec_log_addr, + .transmit =3D drm_bridge_connector_hdmi_cec_transmit, +}; + + /* -----------------------------------------------------------------------= ------ * Bridge Connector Initialisation */ @@ -677,6 +737,18 @@ struct drm_connector *drm_bridge_connector_init(struct= drm_device *drm, bridge_connector->bridge_hdmi_cec =3D bridge; } =20 + if (bridge->ops & DRM_BRIDGE_OP_HDMI_CEC_ADAPTER) { + if (bridge_connector->bridge_hdmi_cec) + return ERR_PTR(-EBUSY); + + bridge_connector->bridge_hdmi_cec =3D bridge; + + if (!bridge->funcs->hdmi_cec_enable || + !bridge->funcs->hdmi_cec_log_addr || + !bridge->funcs->hdmi_cec_transmit) + return ERR_PTR(-EINVAL); + } + if (!drm_bridge_get_next_bridge(bridge)) connector_type =3D bridge->type; =20 @@ -748,6 +820,17 @@ struct drm_connector *drm_bridge_connector_init(struct= drm_device *drm, return ERR_PTR(ret); } =20 + if (bridge_connector->bridge_hdmi_cec && + bridge_connector->bridge_hdmi_cec->ops & DRM_BRIDGE_OP_HDMI_CEC_ADAPT= ER) { + ret =3D drmm_connector_hdmi_cec_register(connector, + &drm_bridge_connector_hdmi_cec_funcs, + bridge->hdmi_cec_adapter_name, + bridge->hdmi_cec_available_las, + bridge->hdmi_cec_dev); + if (ret) + return ERR_PTR(ret); + } + drm_connector_helper_add(connector, &drm_bridge_connector_helper_funcs); =20 if (bridge_connector->bridge_hpd) diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index 0e5f6a007d536215bd50e11846433290c2060b9c..cc9f7df38102e3c43913b35312f= 0ed5c4d8a7bd0 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -32,6 +32,7 @@ #include #include =20 +struct cec_msg; struct device_node; =20 struct drm_bridge; @@ -737,6 +738,16 @@ struct drm_bridge_funcs { struct drm_bridge *bridge, bool enable, int direction); =20 + int (*hdmi_cec_init)(struct drm_connector *connector, + struct drm_bridge *bridge); + + int (*hdmi_cec_enable)(struct drm_bridge *bridge, bool enable); + + int (*hdmi_cec_log_addr)(struct drm_bridge *bridge, u8 logical_addr); + + int (*hdmi_cec_transmit)(struct drm_bridge *bridge, u8 attempts, + u32 signal_free_time, struct cec_msg *msg); + /** * @dp_audio_startup: * @@ -912,6 +923,11 @@ enum drm_bridge_ops { * to be present. */ DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER =3D BIT(7), + /** + * @DRM_BRIDGE_OP_HDMI_CEC_ADAPTER: The bridge requires CEC notifier + * to be present. + */ + DRM_BRIDGE_OP_HDMI_CEC_ADAPTER =3D BIT(8), }; =20 /** @@ -1048,6 +1064,16 @@ struct drm_bridge { */ int hdmi_audio_dai_port; =20 + /** + * @hdmi_cec_adapter_name: the name of the adapter to register + */ + const char *hdmi_cec_adapter_name; + + /** + * @hdmi_cec_available_las: number of logical addresses, CEC_MAX_LOG_ADDR= S if unset + */ + u8 hdmi_cec_available_las; + /** private: */ /** * @hpd_mutex: Protects the @hpd_cb and @hpd_data fields. --=20 2.39.5 From nobody Fri Dec 19 17:20:03 2025 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 010011E4A9 for ; Sat, 17 May 2025 02:00:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447209; cv=none; b=t6fIDeNuEYF4cVqT+AdZ7eqdfAWbeJTnNFmeAG1NigdH9qK7EW7QZeMLJPZEgJe4yUgE6RhbdqpFgArjSVpzD2MbzHHJY7X5p5Gq6tNGMxKg4zYSNO54Nmf4rT6K/2tyQv7FkvVUqwyZO2zIcicxMEY1nT60WbA8I7j/2OA4dzo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747447209; c=relaxed/simple; bh=BOyopBTpr+POzl7WvSYVI3Xm07zdAHUWrgMFn01FWoA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KQSajcog7n4qPvNCpsBUncxEKQs/7/iF88KeCD4dh6OVWMWIQLadyAXQACOr6ESc2xZuSw7vBBnhm3ZVxSmA6cpBnwXxLl2Gro869yb1FmCLBZVAJ0HkILzmRGFLCsaqqlIO2WQHnbJuiPeQSBoVpFLXR99sWk3Z+2ePaJMoQrs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=GNZLuUmk; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="GNZLuUmk" Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54H0K6Gc025698 for ; Sat, 17 May 2025 02:00:04 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= dy9LklN2fsMlgqudPGe5ryra0g5Z/dZpdk/cm/ehyI8=; b=GNZLuUmkeiUF3yuu WNmg+glfZHs4josfk0gYi5KAaXYo3GjsAyPOayuv4hz3xdpd8hr6uNbGck3ScCIf dSXXRozd/KWvbnB4mUfqKjN224uaio0zis4Vn8uefsAIuBc5hBBaiqvnnIcCgnh2 j37lMgBmDezjov2LoM5/YA1lWP42DQokYEUQiZTfP9Qzpk8XWH2tU/liTLDMBaf5 jsfS1eb3kNuOKTwpj6NVpGbJrmKnuYLcqdngEZAzgVKUOLriiXdQOs/0CxlhMIpc c5fgVesSBFotmfrxM2FCOJ/ru8iJ1nkw+n3IR97m50lkW6chEXCJF9BPgahv8PIQ vOxW3Q== Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46pftq0412-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Sat, 17 May 2025 02:00:04 +0000 (GMT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-6f8af2b8e5fso36395246d6.2 for ; Fri, 16 May 2025 19:00:04 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747447201; x=1748052001; 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=dy9LklN2fsMlgqudPGe5ryra0g5Z/dZpdk/cm/ehyI8=; b=qtb5TWCTJ4y33u3EGoILxYblgcjDDFXllJK6gsdlWpDk/FuZtTKtCjjDEOXBgRHud6 ZBVhHfle6smB19vZTFBGbqEqI1Kb8OAZy/4OFnVSeeV4yHyY+UoUMpyymZt+Ror2C2hI HF8yeFfBsPPq6+CdVl5fHMoSj6AC4HYS2/uI2jNMdo2AXgNWmdZejvLKuDmn/yQIK32F /LYfmV3GGc2e3ThJWE7asb9qnUNwaWG0R2f97SsImU5WpG0i6hNB2IFTrD85em//EStm gHFyrRfgiDLLagOUELlU9D3Vy7OMUB8WokqzoWlTG9H0iD/60PNufMRQULz0d+QZwURI zW9w== X-Forwarded-Encrypted: i=1; AJvYcCXF0jhZlfKmR4ItS56Ad1Lm+HCl3mBk6gmGZ11YkVRcTJf0r+SSQAJ9alA4AfaG4jXo/HgCS7Urop7Fnso=@vger.kernel.org X-Gm-Message-State: AOJu0YwtF9Fc/xfWptM2qiErwcskJo1EwW/ECZyiCNq6JsDFXwtKDfwz PYSbxTehBby2m3uxy1v1LYiPcQo4WUDDdTbsrApuwxm8S0/xIwP3ysxRMaXopqkzkmGJvB8eICr HBMuSsN37RReBLIfZUUaJce4sSkIm4C6peYWnytleySYlkJgWv6vj4pYBPbHKYLpMhTrIBBOvWC k= X-Gm-Gg: ASbGncu0WBOXhRGpHM4i9mgBL7Df4aj/I05bpCu1MasrVceeugi9KGFWkw7ull9ca0R bgfr0VuOp1EmhYkDIplsr8euVisD3HqhBMT9LPniApNDun/fP2rIQ1cOPyQthJQrhgLeKELDyeP Bt083LNSCjFwZ24RPu9lq1WZmVspRIGwGTRQUECSgxITMNZ4uto7cxjLNEsEvmqLq8Wr8K8uSSI Ax6shjGpQkbDQztzqen8IAqy7AuumCzVTsNfuIoVWRjiYbjZSHNwEWascqgGUzYRyiVoeiUtBhN +dNYy5dailYSKdPH6da+V9xH+n//3Nud9JjWglfMcD88Ut1JKH3+TsEZfdVMWtXD/f6rva6E3n9 jM8Cgvtp7Ag3MKX9uhStstWf2 X-Received: by 2002:ad4:5f8e:0:b0:6d8:e5f4:b977 with SMTP id 6a1803df08f44-6f8b084b11amr92755726d6.5.1747447200767; Fri, 16 May 2025 19:00:00 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGJGBignWfm9id7iBq6ttXxZrffttYAN/zfS+h7Joc/k0311WHYs1T7oRnD4E6128xUndOf6g== X-Received: by 2002:ad4:5f8e:0:b0:6d8:e5f4:b977 with SMTP id 6a1803df08f44-6f8b084b11amr92755206d6.5.1747447200124; Fri, 16 May 2025 19:00:00 -0700 (PDT) Received: from umbar.lan (2001-14ba-a0c3-3a00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a0c3:3a00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-550e70180f7sm672167e87.128.2025.05.16.18.59.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 May 2025 18:59:58 -0700 (PDT) From: Dmitry Baryshkov Date: Sat, 17 May 2025 04:59:46 +0300 Subject: [PATCH v6 10/10] drm/bridge: adv7511: switch to the HDMI connector helpers 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: <20250517-drm-hdmi-connector-cec-v6-10-35651db6f19b@oss.qualcomm.com> References: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> In-Reply-To: <20250517-drm-hdmi-connector-cec-v6-0-35651db6f19b@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Dmitry Baryshkov X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=34464; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=BOyopBTpr+POzl7WvSYVI3Xm07zdAHUWrgMFn01FWoA=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBoJ+2Mk1kTK6vuHU9ArEEGtr2NrKH2yv/qkwH++ Sd9plmwgr6JATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaCftjAAKCRCLPIo+Aiko 1TlvB/9HAa6KGThwD6/nGd6sl+yiK4AT8XdkJovK9c1bWuY0FAhxVx1FGjOmHBxD0thMODQ9IM8 FqL9d99Yflf9MCBcnLny0XztpnaLlmFVWcJSVUwj8paEn/ntfvNhB62GJRAdfg/kgkUkZF9FuBs eg0j3RlRfU9RB1t77JopbEfTZ2Qm/ila20QetPMyWyx7VIHogA0OF/9L/Js6jsDMl67Z57+nBgP VGQ2iIBgX3HZgp4XCwc/F0iI6N93vQtAD9BAo01HzYwQOHbt755PWtuhEmWvgs06q+SK1UwNiIH lo7o4lB0gbbG4t4iMToIvApeobvajaq8jWHCwGeyyIXv2hFd X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTE3MDAxNyBTYWx0ZWRfXz3mLJvD3kfWd ABvLs9pnwpFpDmJGmUavH76UhrSkeUCX4wtuIAj8uvPwV7Hh4Fu32TGih1A9Dm0gA14T6TwEzJO 1AKvZ7gRLSL5FgouJ6jEG7QqP/RWcWJXgOCxC9QYF4n5A5u2VZqLPH1LYa5Q6LrRsdYabBnm19b JPlyOvULJV71IjlQCIBj54vfLIL6bOh7GrYDV8NQRUyQ3ggHApOhT2C1OykFnM4OWJsshHvx/sx 9PUeRa0nVGQms2lCmPf/A0f++XCQ+u3jvcJYmEZnQh0gWLNOf/TBLLzrfqtQkPJB/EOJbed688V dqyQ9ntr9VmVU1tCZe69y/zBKy0GnvVs9ELJiUaZDJKTBV3dhdUr0TD5gzdOyKCO5iPFRGbD9Kw WAwG2uWcgIOlLHoxzmrKxOJuBIKPL0PiKr9VtHN3xWNJUeK7Cvck8uFeCcT6+to422tauxSF X-Proofpoint-GUID: R9qMijKDbrtirFwxYzNpQjxv8m6jAkhw X-Proofpoint-ORIG-GUID: R9qMijKDbrtirFwxYzNpQjxv8m6jAkhw X-Authority-Analysis: v=2.4 cv=Ft4F/3rq c=1 sm=1 tr=0 ts=6827eda4 cx=c_pps a=UgVkIMxJMSkC9lv97toC5g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=Cr31Tnr6-c0FpRDxqzMA:9 a=QEXdDO2ut3YA:10 a=1HOtulTD9v-eNWfpl4qZ:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-17_01,2025-05-16_03,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 mlxscore=0 clxscore=1015 suspectscore=0 bulkscore=0 adultscore=0 mlxlogscore=999 lowpriorityscore=0 priorityscore=1501 spamscore=0 phishscore=0 malwarescore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505070000 definitions=main-2505170017 Rewrite the ADV7511 driver to use implementation provided by the DRM HDMI connector framework, including the Audio and CEC bits. Drop the in-bridge connector support and use drm_bridge_connector if the host requires the connector to be provided by the bridge. Note: currently only AVI InfoFrames are supported. Existing driver doesn't support programming any other InfoFrames directly and Audio InfoFrame seems to be programmed using individual bits and pieces rather than programming it directly. Signed-off-by: Dmitry Baryshkov Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/bridge/adv7511/Kconfig | 5 +- drivers/gpu/drm/bridge/adv7511/adv7511.h | 52 ++-- drivers/gpu/drm/bridge/adv7511/adv7511_audio.c | 77 +----- drivers/gpu/drm/bridge/adv7511/adv7511_cec.c | 57 ++-- drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 345 +++++++++++----------= ---- drivers/gpu/drm/bridge/adv7511/adv7533.c | 4 - 6 files changed, 212 insertions(+), 328 deletions(-) diff --git a/drivers/gpu/drm/bridge/adv7511/Kconfig b/drivers/gpu/drm/bridg= e/adv7511/Kconfig index f46a5e26b5dd640670afa21802f9019d5c7439fb..59a5256ce8a6e16dfbf1848a7c8= 5ac7d709a68ed 100644 --- a/drivers/gpu/drm/bridge/adv7511/Kconfig +++ b/drivers/gpu/drm/bridge/adv7511/Kconfig @@ -5,6 +5,9 @@ config DRM_I2C_ADV7511 select DRM_KMS_HELPER select REGMAP_I2C select DRM_MIPI_DSI + select DRM_DISPLAY_HELPER + select DRM_BRIDGE_CONNECTOR + select DRM_DISPLAY_HDMI_STATE_HELPER help Support for the Analog Devices ADV7511(W)/13/33/35 HDMI encoders. =20 @@ -19,7 +22,7 @@ config DRM_I2C_ADV7511_AUDIO config DRM_I2C_ADV7511_CEC bool "ADV7511/33/35 HDMI CEC driver" depends on DRM_I2C_ADV7511 - select CEC_CORE + select DRM_DISPLAY_HDMI_CEC_HELPER default y help When selected the HDMI transmitter will support the CEC feature. diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511.h b/drivers/gpu/drm/bri= dge/adv7511/adv7511.h index ec0b7f3d889c4eedeb1d80369fd2a160cd0e2968..90c9a3da2406d16c8988548a870= 53c122a332f31 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511.h +++ b/drivers/gpu/drm/bridge/adv7511/adv7511.h @@ -313,16 +313,11 @@ enum adv7511_csc_scaling { * @csc_enable: Whether to enable color space conversion * @csc_scaling_factor: Color space conversion scaling factor * @csc_coefficents: Color space conversion coefficents - * @hdmi_mode: Whether to use HDMI or DVI output mode - * @avi_infoframe: HDMI infoframe */ struct adv7511_video_config { bool csc_enable; enum adv7511_csc_scaling csc_scaling_factor; const uint16_t *csc_coefficents; - - bool hdmi_mode; - struct hdmi_avi_infoframe avi_infoframe; }; =20 enum adv7511_type { @@ -337,6 +332,7 @@ struct adv7511_chip_info { enum adv7511_type type; unsigned int max_mode_clock_khz; unsigned int max_lane_freq_khz; + const char *name; const char * const *supply_names; unsigned int num_supplies; unsigned int reg_cec_offset; @@ -371,7 +367,7 @@ struct adv7511 { struct work_struct hpd_work; =20 struct drm_bridge bridge; - struct drm_connector connector; + struct drm_connector *cec_connector; =20 bool embedded_sync; enum adv7511_sync_polarity vsync_polarity; @@ -389,9 +385,7 @@ struct adv7511 { bool use_timing_gen; =20 const struct adv7511_chip_info *info; - struct platform_device *audio_pdev; =20 - struct cec_adapter *cec_adap; u8 cec_addr[ADV7511_MAX_ADDRS]; u8 cec_valid_addrs; bool cec_enabled_adap; @@ -399,16 +393,24 @@ struct adv7511 { u32 cec_clk_freq; }; =20 +static inline struct adv7511 *bridge_to_adv7511(struct drm_bridge *bridge) +{ + return container_of(bridge, struct adv7511, bridge); +} + #ifdef CONFIG_DRM_I2C_ADV7511_CEC -int adv7511_cec_init(struct device *dev, struct adv7511 *adv7511); +int adv7511_cec_init(struct drm_connector *connector, + struct drm_bridge *bridge); +int adv7511_cec_enable(struct drm_bridge *bridge, bool enable); +int adv7511_cec_log_addr(struct drm_bridge *bridge, u8 addr); +int adv7511_cec_transmit(struct drm_bridge *bridge, u8 attempts, + u32 signal_free_time, struct cec_msg *msg); int adv7511_cec_irq_process(struct adv7511 *adv7511, unsigned int irq1); #else -static inline int adv7511_cec_init(struct device *dev, struct adv7511 *adv= 7511) -{ - regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL, - ADV7511_CEC_CTRL_POWER_DOWN); - return 0; -} +#define adv7511_cec_init NULL +#define adv7511_cec_enable NULL +#define adv7511_cec_log_addr NULL +#define adv7511_cec_transmit NULL #endif =20 void adv7533_dsi_power_on(struct adv7511 *adv); @@ -421,16 +423,18 @@ int adv7533_attach_dsi(struct adv7511 *adv); int adv7533_parse_dt(struct device_node *np, struct adv7511 *adv); =20 #ifdef CONFIG_DRM_I2C_ADV7511_AUDIO -int adv7511_audio_init(struct device *dev, struct adv7511 *adv7511); -void adv7511_audio_exit(struct adv7511 *adv7511); +int adv7511_hdmi_audio_startup(struct drm_connector *connector, + struct drm_bridge *bridge); +void adv7511_hdmi_audio_shutdown(struct drm_connector *connector, + struct drm_bridge *bridge); +int adv7511_hdmi_audio_prepare(struct drm_connector *connector, + struct drm_bridge *bridge, + struct hdmi_codec_daifmt *fmt, + struct hdmi_codec_params *hparms); #else /*CONFIG_DRM_I2C_ADV7511_AUDIO */ -static inline int adv7511_audio_init(struct device *dev, struct adv7511 *a= dv7511) -{ - return 0; -} -static inline void adv7511_audio_exit(struct adv7511 *adv7511) -{ -} +#define adv7511_hdmi_audio_startup NULL +#define adv7511_hdmi_audio_shutdown NULL +#define adv7511_hdmi_audio_prepare NULL #endif /* CONFIG_DRM_I2C_ADV7511_AUDIO */ =20 #endif /* __DRM_I2C_ADV7511_H__ */ diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c b/drivers/gpu/d= rm/bridge/adv7511/adv7511_audio.c index 1ff8c815ec798445ec771f549eca8a06a99ff64d..915c3b96721626c6af5d454c0bf= 7f53e37ff25af 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c @@ -55,11 +55,12 @@ static int adv7511_update_cts_n(struct adv7511 *adv7511) return 0; } =20 -static int adv7511_hdmi_hw_params(struct device *dev, void *data, - struct hdmi_codec_daifmt *fmt, - struct hdmi_codec_params *hparms) +int adv7511_hdmi_audio_prepare(struct drm_connector *connector, + struct drm_bridge *bridge, + struct hdmi_codec_daifmt *fmt, + struct hdmi_codec_params *hparms) { - struct adv7511 *adv7511 =3D dev_get_drvdata(dev); + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); unsigned int audio_source, i2s_format =3D 0; unsigned int invert_clock; unsigned int rate; @@ -167,9 +168,10 @@ static int adv7511_hdmi_hw_params(struct device *dev, = void *data, return 0; } =20 -static int audio_startup(struct device *dev, void *data) +int adv7511_hdmi_audio_startup(struct drm_connector *connector, + struct drm_bridge *bridge) { - struct adv7511 *adv7511 =3D dev_get_drvdata(dev); + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); =20 regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_CONFIG, BIT(7), 0); @@ -204,69 +206,12 @@ static int audio_startup(struct device *dev, void *da= ta) return 0; } =20 -static void audio_shutdown(struct device *dev, void *data) +void adv7511_hdmi_audio_shutdown(struct drm_connector *connector, + struct drm_bridge *bridge) { - struct adv7511 *adv7511 =3D dev_get_drvdata(dev); + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); =20 if (adv7511->audio_source =3D=3D ADV7511_AUDIO_SOURCE_SPDIF) regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_CONFIG, BIT(7), 0); } - -static int adv7511_hdmi_i2s_get_dai_id(struct snd_soc_component *component, - struct device_node *endpoint, - void *data) -{ - struct of_endpoint of_ep; - int ret; - - ret =3D of_graph_parse_endpoint(endpoint, &of_ep); - if (ret < 0) - return ret; - - /* - * HDMI sound should be located as reg =3D <2> - * Then, it is sound port 0 - */ - if (of_ep.port =3D=3D 2) - return 0; - - return -EINVAL; -} - -static const struct hdmi_codec_ops adv7511_codec_ops =3D { - .hw_params =3D adv7511_hdmi_hw_params, - .audio_shutdown =3D audio_shutdown, - .audio_startup =3D audio_startup, - .get_dai_id =3D adv7511_hdmi_i2s_get_dai_id, -}; - -static const struct hdmi_codec_pdata codec_data =3D { - .ops =3D &adv7511_codec_ops, - .i2s_formats =3D (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | - SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE), - .max_i2s_channels =3D 2, - .i2s =3D 1, - .no_i2s_capture =3D 1, - .spdif =3D 1, - .no_spdif_capture =3D 1, -}; - -int adv7511_audio_init(struct device *dev, struct adv7511 *adv7511) -{ - adv7511->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(adv7511->audio_pdev); -} - -void adv7511_audio_exit(struct adv7511 *adv7511) -{ - if (adv7511->audio_pdev) { - platform_device_unregister(adv7511->audio_pdev); - adv7511->audio_pdev =3D NULL; - } -} diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_cec.c b/drivers/gpu/drm= /bridge/adv7511/adv7511_cec.c index 2e9c88a2b5ed44ef0cd417c553ea7873d00e4a14..822265426f58a6887941522e86c= ddac9d0151371 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511_cec.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_cec.c @@ -12,6 +12,8 @@ =20 #include =20 +#include + #include "adv7511.h" =20 static const u8 ADV7511_REG_CEC_RX_FRAME_HDR[] =3D { @@ -44,8 +46,8 @@ static void adv_cec_tx_raw_status(struct adv7511 *adv7511= , u8 tx_raw_status) return; =20 if (tx_raw_status & ADV7511_INT1_CEC_TX_ARBIT_LOST) { - cec_transmit_attempt_done(adv7511->cec_adap, - CEC_TX_STATUS_ARB_LOST); + drm_connector_hdmi_cec_transmit_attempt_done(adv7511->cec_connector, + CEC_TX_STATUS_ARB_LOST); return; } if (tx_raw_status & ADV7511_INT1_CEC_TX_RETRY_TIMEOUT) { @@ -72,12 +74,14 @@ static void adv_cec_tx_raw_status(struct adv7511 *adv75= 11, u8 tx_raw_status) if (low_drive_cnt) status |=3D CEC_TX_STATUS_LOW_DRIVE; } - cec_transmit_done(adv7511->cec_adap, status, - 0, nack_cnt, low_drive_cnt, err_cnt); + drm_connector_hdmi_cec_transmit_done(adv7511->cec_connector, status, + 0, nack_cnt, low_drive_cnt, + err_cnt); return; } if (tx_raw_status & ADV7511_INT1_CEC_TX_READY) { - cec_transmit_attempt_done(adv7511->cec_adap, CEC_TX_STATUS_OK); + drm_connector_hdmi_cec_transmit_attempt_done(adv7511->cec_connector, + CEC_TX_STATUS_OK); return; } } @@ -116,7 +120,7 @@ static void adv7511_cec_rx(struct adv7511 *adv7511, int= rx_buf) regmap_update_bits(adv7511->regmap_cec, ADV7511_REG_CEC_RX_BUFFERS + offset, BIT(rx_buf), 0); =20 - cec_received_msg(adv7511->cec_adap, &msg); + drm_connector_hdmi_cec_received_msg(adv7511->cec_connector, &msg); } =20 int adv7511_cec_irq_process(struct adv7511 *adv7511, unsigned int irq1) @@ -179,9 +183,9 @@ int adv7511_cec_irq_process(struct adv7511 *adv7511, un= signed int irq1) return IRQ_HANDLED; } =20 -static int adv7511_cec_adap_enable(struct cec_adapter *adap, bool enable) +int adv7511_cec_enable(struct drm_bridge *bridge, bool enable) { - struct adv7511 *adv7511 =3D cec_get_drvdata(adap); + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); unsigned int offset =3D adv7511->info->reg_cec_offset; =20 if (adv7511->i2c_cec =3D=3D NULL) @@ -225,9 +229,9 @@ static int adv7511_cec_adap_enable(struct cec_adapter *= adap, bool enable) return 0; } =20 -static int adv7511_cec_adap_log_addr(struct cec_adapter *adap, u8 addr) +int adv7511_cec_log_addr(struct drm_bridge *bridge, u8 addr) { - struct adv7511 *adv7511 =3D cec_get_drvdata(adap); + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); unsigned int offset =3D adv7511->info->reg_cec_offset; unsigned int i, free_idx =3D ADV7511_MAX_ADDRS; =20 @@ -293,10 +297,10 @@ static int adv7511_cec_adap_log_addr(struct cec_adapt= er *adap, u8 addr) return 0; } =20 -static int adv7511_cec_adap_transmit(struct cec_adapter *adap, u8 attempts, - u32 signal_free_time, struct cec_msg *msg) +int adv7511_cec_transmit(struct drm_bridge *bridge, u8 attempts, + u32 signal_free_time, struct cec_msg *msg) { - struct adv7511 *adv7511 =3D cec_get_drvdata(adap); + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); unsigned int offset =3D adv7511->info->reg_cec_offset; u8 len =3D msg->len; unsigned int i; @@ -328,12 +332,6 @@ static int adv7511_cec_adap_transmit(struct cec_adapte= r *adap, u8 attempts, return 0; } =20 -static const struct cec_adap_ops adv7511_cec_adap_ops =3D { - .adap_enable =3D adv7511_cec_adap_enable, - .adap_log_addr =3D adv7511_cec_adap_log_addr, - .adap_transmit =3D adv7511_cec_adap_transmit, -}; - static int adv7511_cec_parse_dt(struct device *dev, struct adv7511 *adv751= 1) { adv7511->cec_clk =3D devm_clk_get(dev, "cec"); @@ -348,20 +346,18 @@ static int adv7511_cec_parse_dt(struct device *dev, s= truct adv7511 *adv7511) return 0; } =20 -int adv7511_cec_init(struct device *dev, struct adv7511 *adv7511) +int adv7511_cec_init(struct drm_connector *connector, + struct drm_bridge *bridge) { + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); + struct device *dev =3D &adv7511->i2c_main->dev; unsigned int offset =3D adv7511->info->reg_cec_offset; int ret =3D adv7511_cec_parse_dt(dev, adv7511); =20 if (ret) goto err_cec_parse_dt; =20 - adv7511->cec_adap =3D cec_allocate_adapter(&adv7511_cec_adap_ops, - adv7511, dev_name(dev), CEC_CAP_DEFAULTS, ADV7511_MAX_ADDRS); - if (IS_ERR(adv7511->cec_adap)) { - ret =3D PTR_ERR(adv7511->cec_adap); - goto err_cec_alloc; - } + adv7511->cec_connector =3D connector; =20 regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL, 0); /* cec soft reset */ @@ -378,17 +374,8 @@ int adv7511_cec_init(struct device *dev, struct adv751= 1 *adv7511) ADV7511_REG_CEC_CLK_DIV + offset, ((adv7511->cec_clk_freq / 750000) - 1) << 2); =20 - ret =3D cec_register_adapter(adv7511->cec_adap, dev); - if (ret) - goto err_cec_register; return 0; =20 -err_cec_register: - cec_delete_adapter(adv7511->cec_adap); - adv7511->cec_adap =3D NULL; -err_cec_alloc: - dev_info(dev, "Initializing CEC failed with error %d, disabling CEC\n", - ret); err_cec_parse_dt: regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL, ADV7511_CEC_CTRL_POWER_DOWN); diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm= /bridge/adv7511/adv7511_drv.c index 1257009e850c1b20184cfaea5b6a4440e75e10d7..8b7548448615f84db796467ffd7= 0fe11554bb681 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c @@ -12,14 +12,17 @@ #include #include =20 -#include +#include =20 #include #include +#include #include #include #include #include +#include +#include =20 #include "adv7511.h" =20 @@ -203,62 +206,37 @@ static const uint16_t adv7511_csc_ycbcr_to_rgb[] =3D { =20 static void adv7511_set_config_csc(struct adv7511 *adv7511, struct drm_connector *connector, - bool rgb, bool hdmi_mode) + bool rgb) { struct adv7511_video_config config; bool output_format_422, output_format_ycbcr; unsigned int mode; - uint8_t infoframe[17]; - - config.hdmi_mode =3D hdmi_mode; - - hdmi_avi_infoframe_init(&config.avi_infoframe); - - config.avi_infoframe.scan_mode =3D HDMI_SCAN_MODE_UNDERSCAN; =20 if (rgb) { config.csc_enable =3D false; - config.avi_infoframe.colorspace =3D HDMI_COLORSPACE_RGB; + output_format_422 =3D false; + output_format_ycbcr =3D false; } else { config.csc_scaling_factor =3D ADV7511_CSC_SCALING_4; config.csc_coefficents =3D adv7511_csc_ycbcr_to_rgb; =20 if ((connector->display_info.color_formats & DRM_COLOR_FORMAT_YCBCR422) && - config.hdmi_mode) { + connector->display_info.is_hdmi) { config.csc_enable =3D false; - config.avi_infoframe.colorspace =3D - HDMI_COLORSPACE_YUV422; - } else { - config.csc_enable =3D true; - config.avi_infoframe.colorspace =3D HDMI_COLORSPACE_RGB; - } - } - - if (config.hdmi_mode) { - mode =3D ADV7511_HDMI_CFG_MODE_HDMI; - - switch (config.avi_infoframe.colorspace) { - case HDMI_COLORSPACE_YUV444: - output_format_422 =3D false; - output_format_ycbcr =3D true; - break; - case HDMI_COLORSPACE_YUV422: output_format_422 =3D true; output_format_ycbcr =3D true; - break; - default: + } else { + config.csc_enable =3D true; output_format_422 =3D false; output_format_ycbcr =3D false; - break; } - } else { - mode =3D ADV7511_HDMI_CFG_MODE_DVI; - output_format_422 =3D false; - output_format_ycbcr =3D false; } =20 - adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME); + if (connector->display_info.is_hdmi) + mode =3D ADV7511_HDMI_CFG_MODE_HDMI; + else + mode =3D ADV7511_HDMI_CFG_MODE_DVI; =20 adv7511_set_colormap(adv7511, config.csc_enable, config.csc_coefficents, @@ -269,15 +247,6 @@ static void adv7511_set_config_csc(struct adv7511 *adv= 7511, =20 regmap_update_bits(adv7511->regmap, ADV7511_REG_HDCP_HDMI_CFG, ADV7511_HDMI_CFG_MODE_MASK, mode); - - hdmi_avi_infoframe_pack(&config.avi_infoframe, infoframe, - sizeof(infoframe)); - - /* The AVI infoframe id is not configurable */ - regmap_bulk_write(adv7511->regmap, ADV7511_REG_AVI_INFOFRAME_VERSION, - infoframe + 1, sizeof(infoframe) - 1); - - adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME); } =20 static void adv7511_set_link_config(struct adv7511 *adv7511, @@ -446,22 +415,16 @@ static void adv7511_hpd_work(struct work_struct *work) * restore its state. */ if (status =3D=3D connector_status_connected && - adv7511->connector.status =3D=3D connector_status_disconnected && + adv7511->status =3D=3D connector_status_disconnected && adv7511->powered) { regcache_mark_dirty(adv7511->regmap); adv7511_power_on(adv7511); } =20 - if (adv7511->connector.status !=3D status) { - adv7511->connector.status =3D status; + if (adv7511->status !=3D status) { + adv7511->status =3D status; =20 - if (adv7511->connector.dev) { - if (status =3D=3D connector_status_disconnected) - cec_phys_addr_invalidate(adv7511->cec_adap); - drm_kms_helper_hotplug_event(adv7511->connector.dev); - } else { - drm_bridge_hpd_notify(&adv7511->bridge, status); - } + drm_bridge_hpd_notify(&adv7511->bridge, status); } } =20 @@ -636,45 +599,11 @@ static const struct drm_edid *adv7511_edid_read(struc= t adv7511 *adv7511, if (!adv7511->powered) __adv7511_power_off(adv7511); =20 - if (drm_edid) { - /* - * FIXME: The CEC physical address should be set using - * cec_s_phys_addr(adap, - * connector->display_info.source_physical_address, false) from - * a path that has read the EDID and called - * drm_edid_connector_update(). - */ - const struct edid *edid =3D drm_edid_raw(drm_edid); - - adv7511_set_config_csc(adv7511, connector, adv7511->rgb, - drm_detect_hdmi_monitor(edid)); - - cec_s_phys_addr_from_edid(adv7511->cec_adap, edid); - } else { - cec_s_phys_addr_from_edid(adv7511->cec_adap, NULL); - } - return drm_edid; } =20 -static int adv7511_get_modes(struct adv7511 *adv7511, - struct drm_connector *connector) -{ - const struct drm_edid *drm_edid; - unsigned int count; - - drm_edid =3D adv7511_edid_read(adv7511, connector); - - drm_edid_connector_update(connector, drm_edid); - count =3D drm_edid_connector_add_modes(connector); - - drm_edid_free(drm_edid); - - return count; -} - static enum drm_connector_status -adv7511_detect(struct adv7511 *adv7511, struct drm_connector *connector) +adv7511_detect(struct adv7511 *adv7511) { enum drm_connector_status status; unsigned int val; @@ -699,8 +628,6 @@ adv7511_detect(struct adv7511 *adv7511, struct drm_conn= ector *connector) if (status =3D=3D connector_status_connected && hpd && adv7511->powered) { regcache_mark_dirty(adv7511->regmap); adv7511_power_on(adv7511); - if (connector) - adv7511_get_modes(adv7511, connector); if (adv7511->status =3D=3D connector_status_connected) status =3D connector_status_disconnected; } else { @@ -719,17 +646,7 @@ adv7511_detect(struct adv7511 *adv7511, struct drm_con= nector *connector) return status; } =20 -static enum drm_mode_status adv7511_mode_valid(struct adv7511 *adv7511, - const struct drm_display_mode *mode) -{ - if (mode->clock > 165000) - return MODE_CLOCK_HIGH; - - return MODE_OK; -} - static void adv7511_mode_set(struct adv7511 *adv7511, - const struct drm_display_mode *mode, const struct drm_display_mode *adj_mode) { unsigned int low_refresh_rate; @@ -800,11 +717,11 @@ static void adv7511_mode_set(struct adv7511 *adv7511, vsync_polarity =3D 1; } =20 - if (drm_mode_vrefresh(mode) <=3D 24) + if (drm_mode_vrefresh(adj_mode) <=3D 24) low_refresh_rate =3D ADV7511_LOW_REFRESH_RATE_24HZ; - else if (drm_mode_vrefresh(mode) <=3D 25) + else if (drm_mode_vrefresh(adj_mode) <=3D 25) low_refresh_rate =3D ADV7511_LOW_REFRESH_RATE_25HZ; - else if (drm_mode_vrefresh(mode) <=3D 30) + else if (drm_mode_vrefresh(adj_mode) <=3D 30) low_refresh_rate =3D ADV7511_LOW_REFRESH_RATE_30HZ; else low_refresh_rate =3D ADV7511_LOW_REFRESH_RATE_NONE; @@ -826,77 +743,21 @@ static void adv7511_mode_set(struct adv7511 *adv7511, * supposed to give better results. */ =20 - adv7511->f_tmds =3D mode->clock; -} - -/* -----------------------------------------------------------------------= ------ - * DRM Connector Operations - */ - -static struct adv7511 *connector_to_adv7511(struct drm_connector *connecto= r) -{ - return container_of(connector, struct adv7511, connector); + adv7511->f_tmds =3D adj_mode->clock; } =20 -static int adv7511_connector_get_modes(struct drm_connector *connector) -{ - struct adv7511 *adv =3D connector_to_adv7511(connector); - - return adv7511_get_modes(adv, connector); -} - -static enum drm_mode_status -adv7511_connector_mode_valid(struct drm_connector *connector, - const struct drm_display_mode *mode) -{ - struct adv7511 *adv =3D connector_to_adv7511(connector); - - return adv7511_mode_valid(adv, mode); -} - -static struct drm_connector_helper_funcs adv7511_connector_helper_funcs = =3D { - .get_modes =3D adv7511_connector_get_modes, - .mode_valid =3D adv7511_connector_mode_valid, -}; - -static enum drm_connector_status -adv7511_connector_detect(struct drm_connector *connector, bool force) -{ - struct adv7511 *adv =3D connector_to_adv7511(connector); - - return adv7511_detect(adv, connector); -} - -static const struct drm_connector_funcs adv7511_connector_funcs =3D { - .fill_modes =3D drm_helper_probe_single_connector_modes, - .detect =3D adv7511_connector_detect, - .destroy =3D drm_connector_cleanup, - .reset =3D drm_atomic_helper_connector_reset, - .atomic_duplicate_state =3D drm_atomic_helper_connector_duplicate_state, - .atomic_destroy_state =3D drm_atomic_helper_connector_destroy_state, -}; - static int adv7511_connector_init(struct adv7511 *adv) { struct drm_bridge *bridge =3D &adv->bridge; - int ret; - - if (adv->i2c_main->irq) - adv->connector.polled =3D DRM_CONNECTOR_POLL_HPD; - else - adv->connector.polled =3D DRM_CONNECTOR_POLL_CONNECT | - DRM_CONNECTOR_POLL_DISCONNECT; + struct drm_connector *connector; =20 - ret =3D drm_connector_init(bridge->dev, &adv->connector, - &adv7511_connector_funcs, - DRM_MODE_CONNECTOR_HDMIA); - if (ret < 0) { + connector =3D drm_bridge_connector_init(bridge->dev, bridge->encoder); + if (IS_ERR(connector)) { DRM_ERROR("Failed to initialize connector with drm\n"); - return ret; + return PTR_ERR(connector); } - drm_connector_helper_add(&adv->connector, - &adv7511_connector_helper_funcs); - drm_connector_attach_encoder(&adv->connector, bridge->encoder); + + drm_connector_attach_encoder(connector, bridge->encoder); =20 return 0; } @@ -905,7 +766,7 @@ static int adv7511_connector_init(struct adv7511 *adv) * DRM Bridge Operations */ =20 -static struct adv7511 *bridge_to_adv7511(struct drm_bridge *bridge) +static const struct adv7511 *bridge_to_adv7511_const(const struct drm_brid= ge *bridge) { return container_of(bridge, struct adv7511, bridge); } @@ -914,8 +775,29 @@ static void adv7511_bridge_atomic_enable(struct drm_br= idge *bridge, struct drm_atomic_state *state) { struct adv7511 *adv =3D bridge_to_adv7511(bridge); + struct drm_connector *connector; + struct drm_connector_state *conn_state; + struct drm_crtc_state *crtc_state; =20 adv7511_power_on(adv); + + connector =3D drm_atomic_get_new_connector_for_encoder(state, bridge->enc= oder); + if (WARN_ON(!connector)) + return; + + conn_state =3D drm_atomic_get_new_connector_state(state, connector); + if (WARN_ON(!conn_state)) + return; + + crtc_state =3D drm_atomic_get_new_crtc_state(state, conn_state->crtc); + if (WARN_ON(!crtc_state)) + return; + + adv7511_set_config_csc(adv, connector, adv->rgb); + + adv7511_mode_set(adv, &crtc_state->adjusted_mode); + + drm_atomic_helper_connector_hdmi_update_infoframes(connector, state); } =20 static void adv7511_bridge_atomic_disable(struct drm_bridge *bridge, @@ -926,13 +808,17 @@ static void adv7511_bridge_atomic_disable(struct drm_= bridge *bridge, adv7511_power_off(adv); } =20 -static void adv7511_bridge_mode_set(struct drm_bridge *bridge, - const struct drm_display_mode *mode, - const struct drm_display_mode *adj_mode) +static enum drm_mode_status +adv7511_bridge_hdmi_tmds_char_rate_valid(const struct drm_bridge *bridge, + const struct drm_display_mode *mode, + unsigned long long tmds_rate) { - struct adv7511 *adv =3D bridge_to_adv7511(bridge); + const struct adv7511 *adv =3D bridge_to_adv7511_const(bridge); =20 - adv7511_mode_set(adv, mode, adj_mode); + if (tmds_rate > 1000ULL * adv->info->max_mode_clock_khz) + return MODE_CLOCK_HIGH; + + return MODE_OK; } =20 static enum drm_mode_status adv7511_bridge_mode_valid(struct drm_bridge *b= ridge, @@ -941,10 +827,10 @@ static enum drm_mode_status adv7511_bridge_mode_valid= (struct drm_bridge *bridge, { struct adv7511 *adv =3D bridge_to_adv7511(bridge); =20 - if (adv->info->has_dsi) - return adv7533_mode_valid(adv, mode); - else - return adv7511_mode_valid(adv, mode); + if (!adv->info->has_dsi) + return MODE_OK; + + return adv7533_mode_valid(adv, mode); } =20 static int adv7511_bridge_attach(struct drm_bridge *bridge, @@ -978,7 +864,7 @@ static enum drm_connector_status adv7511_bridge_detect(= struct drm_bridge *bridge { struct adv7511 *adv =3D bridge_to_adv7511(bridge); =20 - return adv7511_detect(adv, NULL); + return adv7511_detect(adv); } =20 static const struct drm_edid *adv7511_bridge_edid_read(struct drm_bridge *= bridge, @@ -989,28 +875,71 @@ static const struct drm_edid *adv7511_bridge_edid_rea= d(struct drm_bridge *bridge return adv7511_edid_read(adv, connector); } =20 -static void adv7511_bridge_hpd_notify(struct drm_bridge *bridge, - enum drm_connector_status status) +static int adv7511_bridge_hdmi_clear_infoframe(struct drm_bridge *bridge, + enum hdmi_infoframe_type type) { - struct adv7511 *adv =3D bridge_to_adv7511(bridge); + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); + + switch (type) { + case HDMI_INFOFRAME_TYPE_AVI: + adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME); + break; + default: + drm_dbg_driver(adv7511->bridge.dev, "Unsupported HDMI InfoFrame %x\n", t= ype); + break; + } + + return 0; +} + +static int adv7511_bridge_hdmi_write_infoframe(struct drm_bridge *bridge, + enum hdmi_infoframe_type type, + const u8 *buffer, size_t len) +{ + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); + + adv7511_bridge_hdmi_clear_infoframe(bridge, type); + + switch (type) { + case HDMI_INFOFRAME_TYPE_AVI: + /* The AVI infoframe id is not configurable */ + regmap_bulk_write(adv7511->regmap, ADV7511_REG_AVI_INFOFRAME_VERSION, + buffer + 1, len - 1); =20 - if (status =3D=3D connector_status_disconnected) - cec_phys_addr_invalidate(adv->cec_adap); + adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME); + break; + default: + drm_dbg_driver(adv7511->bridge.dev, "Unsupported HDMI InfoFrame %x\n", t= ype); + break; + } + + return 0; } =20 static const struct drm_bridge_funcs adv7511_bridge_funcs =3D { - .mode_set =3D adv7511_bridge_mode_set, .mode_valid =3D adv7511_bridge_mode_valid, .attach =3D adv7511_bridge_attach, .detect =3D adv7511_bridge_detect, .edid_read =3D adv7511_bridge_edid_read, - .hpd_notify =3D adv7511_bridge_hpd_notify, =20 .atomic_enable =3D adv7511_bridge_atomic_enable, .atomic_disable =3D adv7511_bridge_atomic_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, + + .hdmi_tmds_char_rate_valid =3D adv7511_bridge_hdmi_tmds_char_rate_valid, + .hdmi_clear_infoframe =3D adv7511_bridge_hdmi_clear_infoframe, + .hdmi_write_infoframe =3D adv7511_bridge_hdmi_write_infoframe, + + .hdmi_audio_startup =3D adv7511_hdmi_audio_startup, + .hdmi_audio_prepare =3D adv7511_hdmi_audio_prepare, + .hdmi_audio_shutdown =3D adv7511_hdmi_audio_shutdown, + + .hdmi_cec_init =3D adv7511_cec_init, + .hdmi_cec_enable =3D adv7511_cec_enable, + .hdmi_cec_log_addr =3D adv7511_cec_log_addr, + .hdmi_cec_transmit =3D adv7511_cec_transmit, }; =20 /* -----------------------------------------------------------------------= ------ @@ -1323,22 +1252,44 @@ static int adv7511_probe(struct i2c_client *i2c) if (adv7511->info->link_config) adv7511_set_link_config(adv7511, &link_config); =20 - ret =3D adv7511_cec_init(dev, adv7511); - if (ret) - goto err_unregister_cec; + regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL, + ADV7511_CEC_CTRL_POWER_DOWN); =20 adv7511->bridge.funcs =3D &adv7511_bridge_funcs; - adv7511->bridge.ops =3D DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID; + adv7511->bridge.ops =3D DRM_BRIDGE_OP_DETECT | + DRM_BRIDGE_OP_EDID | + DRM_BRIDGE_OP_HDMI | + DRM_BRIDGE_OP_HDMI_AUDIO | + DRM_BRIDGE_OP_HDMI_CEC_ADAPTER; if (adv7511->i2c_main->irq) adv7511->bridge.ops |=3D DRM_BRIDGE_OP_HPD; =20 + adv7511->bridge.vendor =3D "Analog"; + adv7511->bridge.product =3D adv7511->info->name; + +#ifdef CONFIG_DRM_I2C_ADV7511_AUDIO + adv7511->bridge.hdmi_audio_dev =3D dev; + adv7511->bridge.hdmi_audio_max_i2s_playback_channels =3D 2; + adv7511->bridge.hdmi_audio_i2s_formats =3D (SNDRV_PCM_FMTBIT_S16_LE | + SNDRV_PCM_FMTBIT_S20_3LE | + SNDRV_PCM_FMTBIT_S24_3LE | + SNDRV_PCM_FMTBIT_S24_LE | + SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE), + adv7511->bridge.hdmi_audio_spdif_playback =3D 1; + adv7511->bridge.hdmi_audio_dai_port =3D 2; +#endif + +#ifdef CONFIG_DRM_I2C_ADV7511_CEC + adv7511->bridge.hdmi_cec_dev =3D dev; + adv7511->bridge.hdmi_cec_adapter_name =3D dev_name(dev); + adv7511->bridge.hdmi_cec_available_las =3D ADV7511_MAX_ADDRS; +#endif + adv7511->bridge.of_node =3D dev->of_node; adv7511->bridge.type =3D DRM_MODE_CONNECTOR_HDMIA; =20 drm_bridge_add(&adv7511->bridge); =20 - adv7511_audio_init(dev, adv7511); - if (i2c->irq) { init_waitqueue_head(&adv7511->wq); =20 @@ -1360,10 +1311,7 @@ static int adv7511_probe(struct i2c_client *i2c) return 0; =20 err_unregister_audio: - adv7511_audio_exit(adv7511); drm_bridge_remove(&adv7511->bridge); -err_unregister_cec: - cec_unregister_adapter(adv7511->cec_adap); i2c_unregister_device(adv7511->i2c_cec); clk_disable_unprepare(adv7511->cec_clk); err_i2c_unregister_packet: @@ -1388,9 +1336,6 @@ static void adv7511_remove(struct i2c_client *i2c) =20 drm_bridge_remove(&adv7511->bridge); =20 - adv7511_audio_exit(adv7511); - - cec_unregister_adapter(adv7511->cec_adap); i2c_unregister_device(adv7511->i2c_cec); clk_disable_unprepare(adv7511->cec_clk); =20 @@ -1400,6 +1345,8 @@ static void adv7511_remove(struct i2c_client *i2c) =20 static const struct adv7511_chip_info adv7511_chip_info =3D { .type =3D ADV7511, + .name =3D "ADV7511", + .max_mode_clock_khz =3D 165000, .supply_names =3D adv7511_supply_names, .num_supplies =3D ARRAY_SIZE(adv7511_supply_names), .link_config =3D true, @@ -1407,6 +1354,7 @@ static const struct adv7511_chip_info adv7511_chip_in= fo =3D { =20 static const struct adv7511_chip_info adv7533_chip_info =3D { .type =3D ADV7533, + .name =3D "ADV7533", .max_mode_clock_khz =3D 80000, .max_lane_freq_khz =3D 800000, .supply_names =3D adv7533_supply_names, @@ -1417,6 +1365,7 @@ static const struct adv7511_chip_info adv7533_chip_in= fo =3D { =20 static const struct adv7511_chip_info adv7535_chip_info =3D { .type =3D ADV7535, + .name =3D "ADV7535", .max_mode_clock_khz =3D 148500, .max_lane_freq_khz =3D 891000, .supply_names =3D adv7533_supply_names, diff --git a/drivers/gpu/drm/bridge/adv7511/adv7533.c b/drivers/gpu/drm/bri= dge/adv7511/adv7533.c index 122ad91e8a3293de1839cad061cd858d8046b675..b12d422343fc139e8d9b59a2ded= 60ce08ce43dc8 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7533.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7533.c @@ -106,10 +106,6 @@ enum drm_mode_status adv7533_mode_valid(struct adv7511= *adv, struct mipi_dsi_device *dsi =3D adv->dsi; u8 bpp =3D mipi_dsi_pixel_format_to_bpp(dsi->format); =20 - /* Check max clock for either 7533 or 7535 */ - if (mode->clock > adv->info->max_mode_clock_khz) - return MODE_CLOCK_HIGH; - /* Check max clock for each lane */ if (mode->clock * bpp > adv->info->max_lane_freq_khz * adv->num_dsi_lanes) return MODE_CLOCK_HIGH; --=20 2.39.5