From nobody Mon Feb 9 07:44:06 2026 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 ECF511F791A for ; Mon, 7 Apr 2025 15:11:12 +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=1744038674; cv=none; b=Shiq0sgwtDtzIx3ELMfVeiUqfX5s4dFe3w6xHzRWld49yjjN4XIRZpjsHgoJEW29jmBOYxRq+lHL6N6FfbWjvYDrEpYLSORiXOuEC/r5VbWb40BOu2fAP5NZYkYMDSnbqxZ8j79buk/WFgYaxA6QoVGGxIj9y2zCDC+7oijIL+w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744038674; c=relaxed/simple; bh=oaS6Po7R+cg+gJ6q7cqgSpb16Fo8ijum1OmXH8rf4TE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QJiVoqir6X1wSEOOPVnS/tVBGf6JiUqsAfMWGZ1RYnHU0uVpKL0ctpKXqr2KwxA4T3e5qMDDH1vNIeWayZ4xj89KzOzSNlK533DPkoeiKE584iJDi2MB3H6aXW52x3GGpruIbyHX+WekNenK+s6t1ae2iNwFzC3OzAQ6t0rBBvo= 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=EJBAfHd2; 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="EJBAfHd2" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5378dn6k001263 for ; Mon, 7 Apr 2025 15:11:06 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=EJBAfHd2tPpYvhW/ L5x9CMmR9sxSO104dBmdeVMBZNEmjod0Dzqb9vXTyqKGibfwIBwKnsAI6rpCJwhg Cb8yuZQ15D6lEwYO9cyFcjp5LSp3SmAUX4VK4tw5D9XgAwnD2yhM2q1tZmDEloAI 8WsyHYGBaMSpjtJyYLycipSlW9og0DfyyxsXInEftiOAP3OSYuY5sr3mtM20JyTf PmZmKrQWYRDdjZj7c2B4WYZ/lQfRCXYUjo4tRffB1Cw97dZXQYlcUs+Kx+IRTGzg pToY9WexAFxVh+7Ao84pQf0HggV+52oWYlMTIiU0oDgVTtrvVyNsm3kTv5pzSdNT qQWGbQ== Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 45twfkcjtu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Mon, 07 Apr 2025 15:11:06 +0000 (GMT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-7c53e316734so828172385a.2 for ; Mon, 07 Apr 2025 08:11:06 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744038665; x=1744643465; 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=NvuK34UNTkNDe6OFP/mWh62sj9cH0dF/2I0YmsQoONI1ueS0BvWYjDad0rEE9bDuuk RyKmCqBvlZZlVFeV7DvgceXYYZVhHfdfsVnVNkCIMPP2fIDK4TYzoigPa9INsPoN9tal /bHp/IpuOfSAqu3STSP2JlWcpnDXVjHFzpy8WxvUMa2e5W4Bg73F5k0v6Yd2YbrgFzE+ R8z9qHiWQ7vr9HEeayyVipuQB5F2iZeraWM7RVuhntndQ0OULkPURgDXUkwMZSIEvQiy jrdT8r6erXg8bRiBS88DnGYVmmHbhi2dcA+qm/Xp3uFxXrnvr+tL8JAsy7gAWppng98i +9fQ== X-Forwarded-Encrypted: i=1; AJvYcCWWPocpf+M6SqQEUEUg/3vH6Atlel+97CipPYpd9TRaAXy7RTBHlmZQfgHhz90zoI9/d8uJ+/mDHOnLcac=@vger.kernel.org X-Gm-Message-State: AOJu0YzkOqOfjaCt2s6TidqPGcpaUkxQHYN5vCjK40IzrpyrtkDsgdpr GeWw9m5Ru+Yvp901CwCkg8JsT0wnRpdJoEhSYUINll8jccoanW1x1xbt6W+SidveVflaeGfkrVl RngT03iHWNRgjlpJNBA0V37f3e1m0wQ9QXqR2h5q9AaLayu3LDcuARfGekdxDy1w= X-Gm-Gg: ASbGncuwSoygw5h7HgqWTIgqdWNfDACDzuKhFE+IRfNxCsMJdsvDU5OSlAwMxLZQLQF 0MeU7KN+VvR+aj/6YTdDGPPt0TYJ7Jb3IhpOmFqxUXf+LoQjkEJVPS+5UyHvJYKeLZtwu030Kqd anvgUQRJgSEundZn/2wK9BhBvYt+TAgVWN6Yo2RCzbh2oH6AWmo69eJbZ/lozmGGb3Y6hHQ1Ea1 OgPn6N01ZU7+Svj46jJraLZGIJnJtxUt/Sn5aI5m+A/8intPJls5LKu9KwTO+tGXEGFELfTBzqv oDUZ+V4NPTiVMtY1D7h4pZaRVcbRYCXptVJgRmXXZ3w/L/K7LF4cidFpdzJ8BuPeBoAWHIrXwuz EYAuGKlg1x7a9LgOmA++V3zv3cWss X-Received: by 2002:a05:620a:3908:b0:7c5:3c62:804c with SMTP id af79cd13be357-7c775a0fefcmr1906201485a.21.1744038665219; Mon, 07 Apr 2025 08:11:05 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEDlJRYmAoin8RKcPtomZTWpx/eM/BRNf+B6vRyttUb2e1lAlCh/h5v9AMfZuwT13z+HVbcFg== X-Received: by 2002:a05:620a:3908:b0:7c5:3c62:804c with SMTP id af79cd13be357-7c775a0fefcmr1906194285a.21.1744038664674; Mon, 07 Apr 2025 08:11:04 -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-54c1e635becsm1312572e87.127.2025.04.07.08.11.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Apr 2025 08:11:02 -0700 (PDT) From: Dmitry Baryshkov Date: Mon, 07 Apr 2025 18:10:58 +0300 Subject: [PATCH v5 01/11] 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: <20250407-drm-hdmi-connector-cec-v5-1-04809b10d206@oss.qualcomm.com> References: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@oss.qualcomm.com> In-Reply-To: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@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/pANAwAKAYs8ij4CKSjVAcsmYgBn8+sDBPrxcJmfZPhNdN842fpYMxj7J8nlN1ioL 70Hx3z+0/SJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ/PrAwAKCRCLPIo+Aiko 1RohCACfAxxhoIw9G7469v4BcpdAOjvEAiBG0ASIgfXb6OMbyhi4he+gtbgczPRs7gyvF0Ts4up cNwmrHfHkqpUQTABWTPK4eVPzOCPkFW+HawfYEpl32hpmDpxBLC2IlXBOHi5KIGcNypLrRQp3Kd FXOI4YI9pzTI9nF12WAu2G20oKSMI3sZu4DSbK0pWggbr0Jtq95gPNMvBnZGO/EG+i4qAdE20Wf QXt/B0mldnwC080GR/NxFCUnZ8mVfs5GDQn01yV6IzllPGK+jz5g1V3ctWLvnSaggKZh8zFuXDY I1aAgeHeWM29/4xl9VKR50VWwn/RsG9vn/Ill1Zq28MzV53k X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-GUID: VjrqqHDCuosLsnf4SfJ5IE6LZSYjBTUg X-Proofpoint-ORIG-GUID: VjrqqHDCuosLsnf4SfJ5IE6LZSYjBTUg X-Authority-Analysis: v=2.4 cv=b7Oy4sGx c=1 sm=1 tr=0 ts=67f3eb0a cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==:117 a=Am12PNO99IVxJwGJ:21 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=XR8D0OoHHMoA:10 a=VwQbUJbxAAAA:8 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=V95sz_wBBgzcx4ufKaUA:9 a=QEXdDO2ut3YA:10 a=IoWCM6iH3mJn3m4BftBB:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-07_04,2025-04-03_03,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 malwarescore=0 priorityscore=1501 suspectscore=0 mlxscore=0 impostorscore=0 phishscore=0 clxscore=1015 spamscore=0 mlxlogscore=999 bulkscore=0 lowpriorityscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2502280000 definitions=main-2504070106 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 Mon Feb 9 07:44:06 2026 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 0A0691CAA8D for ; Mon, 7 Apr 2025 15:11:08 +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=1744038670; cv=none; b=kBY88Lm5ZwnWCNv5FjoHxRgaktq85H/L+WBlY7mM/Gixto4wCWAxC5j0N+Ay5+mJQT5cJ+JjWvmwPgR4Y8p3pjcJMrWNkgrkeSVEB1e4Tr75FNSftWRG1HXQDxCJAY6juAUEElKu71aV7Y+giGrj7sl6Ol5wnpzC2NcMrUh+VfA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744038670; c=relaxed/simple; bh=jWdmXnk5KQZ7QqiqS4ntkIepKln6k4Qq9yyz2/39Hbs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gJgNrUC7Stzj+WGgZS4T/ep77CCTAZ2X69Y7WKEKulgyLS9gyLsoDLDUyRVzYnB2ss5WAQSEGjxQQVvHA5hScErLlVLK546aG7Nl43yajGxACIJ6pYXDnppMZs+kAAzczcPJH4YQUxRxt0bgFUO/2YLQgLS1YDrxaYlUkcTu4v8= 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=fkr8oBMW; 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="fkr8oBMW" Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5378dmbd001376 for ; Mon, 7 Apr 2025 15:11:08 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=fkr8oBMWhgPwN0nv 9krg5bNsDo+xMLfWxw4fahCSJ3BSifYd5w1XHRWTopISL4O2+owZ8jYTNHAVKcql FY8yDpxUZvCXspQV8MCU6f+jjEyDY1EgaIyKILaenJtFf3ELq/gczgJFss/SJQL7 FisHq+UrDmovcec9Po8m61b4RLGIRhj2QrmqsYDRZcxNKYcbHVyuBv2E7ItclHq9 fzMSCS2/HSD909/NspQFcezh/+O/KvaNK2ABRaLExRpcg9fjvDF/N16KFghzJpYw LVLng60pioW+q2eWpt4k8sbDw7aIJK3p/KQWAqsvNqadmZWVkBHIB8IbKN8z8s0V dnXYYg== 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 45twtavn9m-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Mon, 07 Apr 2025 15:11:08 +0000 (GMT) Received: by mail-qk1-f199.google.com with SMTP id af79cd13be357-7c09f73873fso732736685a.1 for ; Mon, 07 Apr 2025 08:11:07 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744038666; x=1744643466; 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=NQsZjc7Fx/4OxonO9NaUvZ22p3jLaUNMrAn0QLCE/NJIFBXIN++tNIsZ8QEkHVv2z/ wqxtll8KyUoT5vp99sVYaIJcLektJilw7LWg4CkoVqnKfqd7PGiMH/2m491eII5lb10M 8F8YHFGAkIson/nzbgYWW/2i9L5kO9QKjCjFsi9KrMrrc3+kz/5LKVG2rJK3fOpZ+xOA ZMPhCN2WqW64mCqusuUqWU+o2mWFgFceGCcz8/bfnzyXotJPpee+hvdB/oZN9c7CcF8H KfekweTfKEdNFgQs9uxJipokk9MdhtfYmeulPOXguJw0n4TCHRwlxc1MNWiztfviRXKO S/nw== X-Forwarded-Encrypted: i=1; AJvYcCXd/ewUYb8hgwK+iyr0u3tIQyN71aiupnyfVqarxdT+aSs0EWp+CqcPjOPtW1moY8CtEbVl3b/keGU7O14=@vger.kernel.org X-Gm-Message-State: AOJu0YxvHE30O0YZQuVoa71tnBt5hQoVQZCTiSgrb5EqMn4LHhAfqK9g uKTnA9B9okNk2mn9hY8j6gZM8+OH7e4U6pUq34iGHKlhezA49IDBztD6BVC6+M+aqWidmu+TeM5 bc3e4o+DsujGH06uKOXkEGPHv0E1Tj9QqfaIHqOSldnsHCU09jQ59uZhDTVaWzUI= X-Gm-Gg: ASbGnctrUdLlnQTMnEA3bj5VTj4WfJrClLXCmoMpqtOmsw5Eu4E8CzwMomcrUi9LhAg 1u6pHF5l9eJ8llvOAVMmvbHLkeaRYRcWvimyf4J8VwFjOYusFAbJkEjZcoTUd4o1mSD1QjKemS2 36qeGvS3GEOFxvb8g1G4VHO6IhT2GGZKkvbh4MWOz0T1y9jQIO52rQpRhE+MirZywki1zvWFmeS 1IDABHl7myBw1ZoYvxb6mRDIonptEUTuGr0mF7Tya5A1p+xC5dwLWIDX7Y3s3WK3qdL65siIoBa ExwjZGbx8t6CITS0vIltvZUDsWGynz2vTqeRy4N6ifZrEdyZpDwxEvTSwsxm65beTJddENI3M2e 9D3TeiSgGkqC40E97TyFbVZyBSDDR X-Received: by 2002:a05:620a:248e:b0:7c5:3cf6:7838 with SMTP id af79cd13be357-7c774e4a03amr2423587485a.49.1744038666393; Mon, 07 Apr 2025 08:11:06 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFaG9hk4ftjaorAgQ/sNiXD77uVKuHzcnv87RLk+fL00AZq4boIwdlRJCSjXKSXcbSck+lxeQ== X-Received: by 2002:a05:620a:248e:b0:7c5:3cf6:7838 with SMTP id af79cd13be357-7c774e4a03amr2423582085a.49.1744038665941; Mon, 07 Apr 2025 08:11:05 -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-54c1e635becsm1312572e87.127.2025.04.07.08.11.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Apr 2025 08:11:05 -0700 (PDT) From: Dmitry Baryshkov Date: Mon, 07 Apr 2025 18:10:59 +0300 Subject: [PATCH v5 02/11] 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: <20250407-drm-hdmi-connector-cec-v5-2-04809b10d206@oss.qualcomm.com> References: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@oss.qualcomm.com> In-Reply-To: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@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/pANAwAKAYs8ij4CKSjVAcsmYgBn8+sDgL9+FzBgNDstWAD0wnkAjUwbcRkIdXmG+ EE/lELJAaKJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ/PrAwAKCRCLPIo+Aiko 1Z4hB/wIreM6AGD73pyKCqLVHHRbeqyQ1cQj88+B0i2B3xOahvfEmcdGDuPWzoJdPfise95KJ5e MeVJbJ69pctJc1xnJTJRpJy61KfTX/7p33TgatNXObQkDijeHCh9KS46NBRi0QeLfT0E7bHgNN+ FPNikJGbUAV4kD4tAQECm/SRtBBQNWjSIuI5v9hgi5R/46mmm8Ju4zNr/i348OU7XoprQaVx4IV aHClzqlWZcjEC0VTBJt9kNxyPj1QnvC96s8ED+grqbq+x1rFM5zzlqGOKW617l6/CuLxQqJhLm8 bPgBesqADqv27Z6pGV32VJj+ktgxfwNxrlUZhrp/NKgnZJ3l X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-GUID: raPwO2qaFqAyKPT2OT8zHK1mzXLrZjgS X-Authority-Analysis: v=2.4 cv=LLlmQIW9 c=1 sm=1 tr=0 ts=67f3eb0c cx=c_pps a=HLyN3IcIa5EE8TELMZ618Q==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=XR8D0OoHHMoA:10 a=VwQbUJbxAAAA:8 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=JbrL1DnuwQtsaYKQthAA:9 a=QEXdDO2ut3YA:10 a=bTQJ7kPSJx9SKPbeHEYW:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-ORIG-GUID: raPwO2qaFqAyKPT2OT8zHK1mzXLrZjgS X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-07_04,2025-04-03_03,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 bulkscore=0 clxscore=1015 mlxlogscore=999 malwarescore=0 phishscore=0 lowpriorityscore=0 priorityscore=1501 mlxscore=0 spamscore=0 adultscore=0 suspectscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2502280000 definitions=main-2504070105 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 Mon Feb 9 07:44:06 2026 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 681B31F6694 for ; Mon, 7 Apr 2025 15:11:09 +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=1744038673; cv=none; b=e6wiPoAgkVlKZ4T0Cy7FgXrF1Lc03kfi1ui2gq0yhETrGvX1YoWtSqMA8odkkew6VKtr7dp59jVld2hY/D7+YdgOpLgpf3Z266UZcu/DXyjDU5gU3IyJ1/wpzJ0fDrK66fSXXISjffdk7cEEO6xFXkMGXS6qXsrqepsJaBxKkpo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744038673; c=relaxed/simple; bh=54WKoDcdJyjz62IAsiH81XQN48gV/uJbhVTZ/pWNAxU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BYAU7Z5FXjWyem0U17FEpcRQ4j0VdslnFJ42icQ7dWTJ/zYDK5R2T4zcMyvPiZqUy3aEARlud7PTxLbD8lajBLnB/n3RpM3boMzVd6RlDSf49CBNf0/p5Z4wQlqnQ19jHGuez0lT1BK0EoYUXm/96Da0oPbEB6SacEpUESpfYvo= 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=Xk+RUZDD; 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="Xk+RUZDD" Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5378dlvt001361 for ; Mon, 7 Apr 2025 15:11:09 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= fe10XrfBEqILF1io3zsejgtJLRr7hZwf/NEsVe8V/L8=; b=Xk+RUZDDrxAGHgbk isVgJoTAIhmARH9SLUcunsHiNwF4DHVYnc6JNnSVOBaGINjWUPtPz8aCJ4ElM/Na UxPIzclyTxbuzJjFHN2I0/9fRKjzLFBVU3QG42QjiIGawYvGFzSdl4an+cmxxxVV 2OBwBu8YbS+LVUiN54rvCNv7IlYwkKecAKT8q99O3woaz2XvCaG08bsE/9dAWgFk nDqIDguysiDYHNJf5Mj1AaQPeddGbMSMUoD7m1CXOOX66046Jt3d4ZnCVtf6wb7D r5ynwwtgU/VYBfOUz8WZmdgoPwpI7pzLGz2dGLqu5M7WfmkWoH8gSCQVA4GPfv2P 9Z0Tqg== 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 45twtavn9p-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Mon, 07 Apr 2025 15:11:08 +0000 (GMT) Received: by mail-qk1-f199.google.com with SMTP id af79cd13be357-7c5bb68b386so1359209385a.3 for ; Mon, 07 Apr 2025 08:11:08 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744038667; x=1744643467; 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=fe10XrfBEqILF1io3zsejgtJLRr7hZwf/NEsVe8V/L8=; b=YV7Elu+YRRT71nLQA9lU1pj09EVxA5QfrOXX6YrjG25i36fCOHBX9ANMOF+luMZ4fv a9RDtEBGOLo0kYPqdEUk3Bdbev852pE5sYCdSnP8q17CQUfZXjWzWbzBoGC2AOTXalSg 3OSkw8yAGaa7cfRhPbAOeNMRXokGOapSAbmDx/IGBu2rfptoFz5kdxx/KyL+Sa3UWCsD UIT6Hr67gcv5w33dEOUgFtscvgzbyxpaOFHGyq4zQYOuk7hZqKPeqJ5zpxy4C8zUj6H1 /SQOTi3AT/cmO6BdMPi+Egs+Y1pLdzKlf/O5dgBA6+I7fvTBwYmJH+548ap2gX5sMZT4 tpBA== X-Forwarded-Encrypted: i=1; AJvYcCUkZer7cW9JYPuyQ8mFPcMWHAxn43WuXYqHL+YA/cgIDW4s+WabhXNpgn6qA1X3fVOfDpMv2hD3fleTB3g=@vger.kernel.org X-Gm-Message-State: AOJu0YyMNbHwa5sDtcE2NEiN8QETIajuX8qX5aiRDi1mTcic1xdIIcYR A9xFkkoe+Luic6MX6WWnQS0Quehjd6jIwKVDVxadIYIHJtRRu6Ji75Tr82TlAvJdbZROe5X7P3C o5O2xUkaYXDMN3DlP063JEqHlrJXfYPbk7qEHC02vHBaft9pkr+aGNkzgaq0SYxs= X-Gm-Gg: ASbGncsSnEQmuurtNK1AeOlZymCp57E8y1gjIla8C2QHwlSyENAgDdjcXzvvkV/HhwO 4h2lGWpl9DbtlM/2RWvHtUukMEOEQcQvGo0WF6VcYVARS96TS50ZGn3XIQtSYwVHbIFXfHKD2+t f7V+PcyA/SvivCqyEtrc1XFsudt7VfUIlvLo27dJ9GIIeUq1+MHBv3wzixjnvig5C7+hAyfTh4M YTa3RrO+aEqc91/II1vXcK82YEkIzDBCBufUR+9BNORrfc0yEXpV6b1VdLWAK52wm+9uMA+Egnv eHYKE5DwbgK1OOh2F+eCN1xjB0vgeQDN9tYhah6bTmL5L3Aweles0x/AQhw6KP0LRJCPnQOLP87 iZyKAJimZf+xsdSxWMGawe/2ARVjd X-Received: by 2002:a05:620a:c4a:b0:7c5:9fd3:a90b with SMTP id af79cd13be357-7c774df4276mr1590638985a.47.1744038667683; Mon, 07 Apr 2025 08:11:07 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFo2fUe3/lYQ8LvRJBQqKBkkclZXyu5YwhanQNqO6xzwNCiJ9Xy9mecSFfO542e2pF6L41v5Q== X-Received: by 2002:a05:620a:c4a:b0:7c5:9fd3:a90b with SMTP id af79cd13be357-7c774df4276mr1590636385a.47.1744038667381; Mon, 07 Apr 2025 08:11:07 -0700 (PDT) Received: from umbar.lan (2001-14ba-a0c3-3a00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a0c3:3a00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54c1e635becsm1312572e87.127.2025.04.07.08.11.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Apr 2025 08:11:06 -0700 (PDT) From: Dmitry Baryshkov Date: Mon, 07 Apr 2025 18:11:00 +0300 Subject: [PATCH v5 03/11] 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: <20250407-drm-hdmi-connector-cec-v5-3-04809b10d206@oss.qualcomm.com> References: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@oss.qualcomm.com> In-Reply-To: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@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=4933; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=54WKoDcdJyjz62IAsiH81XQN48gV/uJbhVTZ/pWNAxU=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBn8+sD6cvwtteDotOSmKG7WC/u6//3vAxe6iMA6 VLaYEOY7XSJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ/PrAwAKCRCLPIo+Aiko 1ZICB/4orDENRUizoSYNKf5t3NAEOAtkOzoBiFDKADkJ/J0MozhssRAydqfPXkJwvHyILfY3xaK ErUEErKsHPJNTBEODsaYwEWYsQE27XyKzT1PJp+Ly+nYEgDg2htXz8mta88d3gjFQaHjuETzMAl Pm5SUHcuz/1b4YD0OVsAILZJjz6/eKfE/+GehiWI8+HgzSXhoPzwEoFnIa57vQMigz1/5xv7Go3 jiPnLH4lQA6T6i+IMRLngCjBobSPrXZTZ/AIz73Z7vPJ2F0S06NF93VnKMeH/sgfCxC0+gaZnNj 7X8gI+tod8Egj9rTHjTqQHv2EDnP1f6gun+3KvoYyUNy4NXG X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-GUID: -ohQZ1sbEV4Zs6no6avAVrkEYPMVy-uE X-Authority-Analysis: v=2.4 cv=LLlmQIW9 c=1 sm=1 tr=0 ts=67f3eb0c cx=c_pps a=HLyN3IcIa5EE8TELMZ618Q==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=XR8D0OoHHMoA:10 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=AOKA84pl558A9rEY638A:9 a=QEXdDO2ut3YA:10 a=bTQJ7kPSJx9SKPbeHEYW:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-ORIG-GUID: -ohQZ1sbEV4Zs6no6avAVrkEYPMVy-uE X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-07_04,2025-04-03_03,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 bulkscore=0 clxscore=1015 mlxlogscore=988 malwarescore=0 phishscore=0 lowpriorityscore=0 priorityscore=1501 mlxscore=0 spamscore=0 adultscore=0 suspectscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2502280000 definitions=main-2504070105 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. Signed-off-by: Dmitry Baryshkov Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/drm_connector.c | 42 +++++++++++++++++++++++++++++++ include/drm/drm_connector.h | 56 +++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 98 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..5f47df9a586a3e0acc26204b86e= e7242acad7403 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -1191,6 +1191,37 @@ 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); + + /** + * @unregister: unregister CEC adapter / notifier. + * + * The callback to unregister CEC adapter or notifier, abstracting the + * operation. + */ + void (*unregister)(struct drm_connector *connector); +}; + /** * struct drm_connector_hdmi_funcs - drm_hdmi_connector control functions */ @@ -1832,6 +1863,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 +2304,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 Mon Feb 9 07:44:06 2026 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 6820F1F7066 for ; Mon, 7 Apr 2025 15:11:11 +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=1744038672; cv=none; b=Ubqcb+YjkvsiU6bCK5WCUXUR1GPZhhhgurOj1yJTzECD5G2dO1lLo/AIzrDC+pThw2usHhuFyuVBT6rdTRBKEt1EwWwc51s8I0VTV0S652jafw7weVON3fDlz7cG7GmutcV2tV9pRzVWTOc/byCAdeSklx8PWMyPmkaWkCcVhTc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744038672; c=relaxed/simple; bh=FPJNyJEcg6oRDjhRbpRxEJohRpQcStLIpnuwdsY/Alc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=O8/dexdUgugXzUZMjFPqlg19zYB/wdSRQMHZuwoaMh+GM16CXTcZ3Xb14jEnE/XnnGNFcBwz6DQ1WYXWThx6rELVwOApzl/TRvCeP4nMTSTldXQ8mTLvS5xMGkESf+peLm9gvOeYbH+tVq3sd+7uEo5yLxpVSFyN+EQwYda/nSA= 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=LC5vNjPH; 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="LC5vNjPH" 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 5378dmHK009201 for ; Mon, 7 Apr 2025 15:11:10 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= TwfDwLI+svFypEWrSxDH80ndwEBhpNaPxUQkq5vFNog=; b=LC5vNjPH/zOsn0Q6 kq7asa8QZbDG1iQMHX49L0C3VpmOxOZH1XHBuukaGCXDjOtiQlZoWEP9awTETVOF vx4T1SbVYfXtte3yycPJ4Hn1uTOTrg9NJ1Cbif7ZI0JY6tCSIp5F3Ui48onB/xL2 Y6ELmyzmfxl69ud/OTUQR64Hy0YX6wXTMy4qBVF8MTvS20Yxb9AH28gHGNzreCvY yc1zj2cxpPVaCi4Dgcmd+ihaS6C+CCu0MdMkR9AFeN0wkHIhSPsSqD4NlRbMVSsL h9kI+oTMRXhK4gJ9qE5fs5Tbj5shi6dlThEdbzjJA7VmnX6uGE2A22dNLWvudmDi vByd3g== Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 45twbucmwd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Mon, 07 Apr 2025 15:11:10 +0000 (GMT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-7c5d608e703so803452385a.3 for ; Mon, 07 Apr 2025 08:11:10 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744038669; x=1744643469; 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=TwfDwLI+svFypEWrSxDH80ndwEBhpNaPxUQkq5vFNog=; b=HX81IbGJp/FfYJEqzLtucB6RnMC43qo/KZwpKYFaVKZVJCk5gDHFmVZlJsIClAjtcg 6fHDl2OG6npUlpixhxOA+YVfbxY5EGkUAKWFoRulIj1Q2DL3ncsee+S+ntCJeshnl18k IVRyBi+JJFZVBtjBUUYLiJmG2Nct1I6TVOIn4jpjOKSLwWDecmwE7GdP0I1mf5wNpuHP CPNZ7D8YxHFKB+lWSRnFF008hFuYHjiWcY+HuoUvcYV1zGKJIjl01RdPDl1ZZBYakIfZ ktDcvsd1nP139g6hkWtIzd5WxiLxwBGBGn1aJqRpFhHwMy9snaPOZnyJvvxnDT/Eqa70 SzKQ== X-Forwarded-Encrypted: i=1; AJvYcCUHaHkzB0aZUL0eSB2ahS7AzdmEFNCQJnCCRwvRmxO7PJG52g9E5SRDcAnK+yacmd8P/xcn8XYhj4nGTjY=@vger.kernel.org X-Gm-Message-State: AOJu0Yy2FJBXE7Pjkr+eqZrg0WK7VEgB3GEIcBmjVaDyLOUyhsuCAAEN vhhsIxmkOADmKpgI4hTttAYZFEXzoSvJvgBchxw5IV1R01h+y+aOr49rLwc5afjNr7fKoerPCk5 nqXT0FKKThldihNK6+birdYus62ttZ/Y5MHZieAIgGO0UEFeVb2ixe9mWq0dfZk0= X-Gm-Gg: ASbGncvMNBq7Bbce0eNcTBF8q8dGfMmGFUA8JYDVkFkPd1kxGojgg0lZarIiPI7U1n/ Nle5OPvcUbc/4D6YXtTi8OrAfkhK2MgKH1LP2pvRtxqf/f+3QTp7T0+rCvS4KFwa6X1uPsW0014 niBpaqsN4O2p03gevkhrcNX55cl7Ozq2uYDdAknF+KVaTTYZtnFpeR3yyFOkAuOmt757TI6nEqi yVyqdTOeD5oQm+xRq+H+VT6mxkGCkxRrkbMfDtNJjwp2AudFRpReb6ENoP1UxBOEiyvLGPlMOvE kxnP37wO1b/rTr3VyiJv7eaajkhsm82nSCBiW9btVunN/CKU2dUb7c5pUe+vo1aeOHPuiPjLzcA XWNoYXh51kni46tLPNbqXUvgKIWNi X-Received: by 2002:a05:620a:1914:b0:7c5:5791:122b with SMTP id af79cd13be357-7c774dd6adbmr1854619085a.37.1744038669142; Mon, 07 Apr 2025 08:11:09 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFiu97niVcq15mVwpMeNMHP/Y0XMJCLX5oROKiyuW4w/bSz9fqQKiZzIg6W08wCg4MpVDg7XA== X-Received: by 2002:a05:620a:1914:b0:7c5:5791:122b with SMTP id af79cd13be357-7c774dd6adbmr1854614485a.37.1744038668819; Mon, 07 Apr 2025 08:11:08 -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-54c1e635becsm1312572e87.127.2025.04.07.08.11.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Apr 2025 08:11:07 -0700 (PDT) From: Dmitry Baryshkov Date: Mon, 07 Apr 2025 18:11:01 +0300 Subject: [PATCH v5 04/11] drm/connector: unregister CEC data 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: <20250407-drm-hdmi-connector-cec-v5-4-04809b10d206@oss.qualcomm.com> References: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@oss.qualcomm.com> In-Reply-To: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@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=1465; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=FPJNyJEcg6oRDjhRbpRxEJohRpQcStLIpnuwdsY/Alc=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBn8+sD6XsiB+rcOj6R+a0LHk2m/SkS3mOKvizo4 LZ/OI4P8RGJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ/PrAwAKCRCLPIo+Aiko 1WqmCACdTeENjyF2Q85RXWlgTQ2sy2pIWrv7GonI2CeOvmsJFdtbANmMOa74xE3i7M4bFkNX0pT t3dtIPAtKavXJLXF+pMK/YD1UyI7PPnAmDe+0b3ebpP4ubkuMqRLfWFt/vrqbi3QWYMaHY5xHYI qTRkzH/Mk4dLP6MaxrxgBWjsLbBpOUc4To5Z5P3CWjvtyjQdwLWWvtNCExpmVH1Xevscf2+zWoj ezHKQAV4Dq/uu5s1CE2wnjTcpdC0UuxAliRlCxDraZqkKEUYZmUk3Ff//1l+ltkBDVeEr+qAVRU sBqk6+cjhViUAGmWu1SAjrwtvmtOPm1F6rEAa/KQTGHrmU0Y X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-GUID: yoKflwzykmCYDfQ0KtvpAspX4-AdzRgF X-Proofpoint-ORIG-GUID: yoKflwzykmCYDfQ0KtvpAspX4-AdzRgF X-Authority-Analysis: v=2.4 cv=dbeA3WXe c=1 sm=1 tr=0 ts=67f3eb0e cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=XR8D0OoHHMoA:10 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=y0Aual6Gy0Pt5gmibm4A:9 a=QEXdDO2ut3YA:10 a=IoWCM6iH3mJn3m4BftBB:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-07_04,2025-04-03_03,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 suspectscore=0 mlxlogscore=970 phishscore=0 mlxscore=0 spamscore=0 malwarescore=0 clxscore=1015 adultscore=0 priorityscore=1501 lowpriorityscore=0 bulkscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2502280000 definitions=main-2504070106 In order to make sure that CEC adapters or notifiers are unregistered and CEC-related data is properly destroyed make drm_connector_cleanup() call CEC's unregister() callback. Signed-off-by: Dmitry Baryshkov Signed-off-by: Dmitry Baryshkov Reviewed-by: Maxime Ripard --- drivers/gpu/drm/drm_connector.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connecto= r.c index ba08fbd973829e49ea977251c4f0fb6d96ade631..ae9c02ef9ab102db03c2824683e= ce37cfbcd3300 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -743,6 +743,13 @@ void drm_connector_cec_phys_addr_set(struct drm_connec= tor *connector) } EXPORT_SYMBOL(drm_connector_cec_phys_addr_set); =20 +static void drm_connector_cec_unregister(struct drm_connector *connector) +{ + if (connector->cec.funcs && + connector->cec.funcs->unregister) + connector->cec.funcs->unregister(connector); +} + /** * drm_connector_cleanup - cleans up an initialised connector * @connector: connector to cleanup @@ -763,6 +770,8 @@ void drm_connector_cleanup(struct drm_connector *connec= tor) =20 platform_device_unregister(connector->hdmi_audio.codec_pdev); =20 + drm_connector_cec_unregister(connector); + if (connector->privacy_screen) { drm_privacy_screen_put(connector->privacy_screen); connector->privacy_screen =3D NULL; --=20 2.39.5 From nobody Mon Feb 9 07:44:06 2026 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 E1F861F7911 for ; Mon, 7 Apr 2025 15:11:12 +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=1744038674; cv=none; b=cwY3tNqfAjsLGQJ3jjS3tI1bV124tUZHbCRAvVuaNpYk7qrtJqDqzkuMWgmSWeYqOe/S0wKLRoDU1WWvsWipVnUcV/J5DSsPoTFYAe4CkNPDBfjxaoKAP79aImsWJ3qU/kaR8LXhVQIUMlQ0Rri4Efr1LfO8yDjvv3UqnOvykrM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744038674; c=relaxed/simple; bh=ONC/5Y479NWKSaB1acKzuC/TwEyDJ/U0yuK43qNfKZQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kS+wt1gOrxzydM0BEQmPyt55zUQGMDalQTbjzr8VbutrFoGwpnnnBUwW6lq36zPyjQOs0/SSbhr7dLBHZeTE9vytpbXQxZ4LfhobHQD9/1h36dXbTrZfbRO9+kk79pUgUojz72PvKE4VuM5hu/IsIBFvF2hTi/yF5NjfilVsTNs= 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=JtYKFlaJ; 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="JtYKFlaJ" 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 5378dnRB010472 for ; Mon, 7 Apr 2025 15:11:12 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= xflavmtVh4q8rGYItZ9o3me1DVh4JFCOvPJG7ZB1LlE=; b=JtYKFlaJCYl92nms E2iKJnx7+leySBG6WUwB3yN2lvYn/uKlXmRag3byOgYkST73BVxZHRCaVYffiwwW /6BLqdbcT68LHAv8mVF5DSJ8eTtjSuDQcYGEu0+UKrcHyHdYxXfylcH4L1W4rIte cinW5jlLYIjsv/kqgDMKZP1xK+jaC++1hdHWZ4mKCnpKui+s/08vfm5vaeNLkGFs tiyGb5EEkogEZrc+f10D/Is/V6yS/2HqQiMSpAUzbHoKVlmE5TvTKKvjPmrgk6CM BpeAh12P1AQ0cQ4dS/6ADCSkjLGGUbTK5AB0zLcTpzucQWm2ggxIbW9pp3VjBrv4 XgGN7g== 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 45twd2mne3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Mon, 07 Apr 2025 15:11:11 +0000 (GMT) Received: by mail-qk1-f199.google.com with SMTP id af79cd13be357-7c790dc38b4so101826685a.0 for ; Mon, 07 Apr 2025 08:11:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744038670; x=1744643470; 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=xflavmtVh4q8rGYItZ9o3me1DVh4JFCOvPJG7ZB1LlE=; b=GK1Q5dsuiMl8jxdtuI+aF2cJr/Y1pJ9B9NSA/WdFmSfoVpqz8D0itfnvY0I1LEXLYe FKQqP6zKFNecCPJVKbayvM+5uu4ao9PgTTXEWyLRY2/1WrqIGhj309qtQnJ8gb+X9J7E bmXuTZHxj8eNocKYltZUB4f2LwTVmcFULaUo31sGPXqgupdCd3qJAgcO4RvFvck4icXD cJ+AuXaSEsMbx4V5+YcKquKrz82FjWOrm6lMLx8YlqxUzTPK0a8qdmB/KuYYWRvS/1KK rfMjtq1b9IviItm9+AAqGTApj4srwuho1uxxn+asyDiJDbeDTRXRRt7vNEYg11z2l4Xs dYYw== X-Forwarded-Encrypted: i=1; AJvYcCVz7g3De4/g7vYPQm1GXs+fFVGTO/TOGEWotKWqJZFjHptrNEETmwGMepP1ajyLzzVGvdTXwftnWEL79Kk=@vger.kernel.org X-Gm-Message-State: AOJu0YzOZp/Nf5ZHVlo4c65WxemV/sQFmLD6osM5PM2kX6IFXGzm7XSR Ylc8GThqTFscpKxQXDXfvHXUZKF/NTSUdgyWRdduCgHDTPfdYMAIHaMmywTC79BGNwCZ2sHG682 X7DDGXHmFsNHFl/ElRyT81CGznpAPyAkBb6WJGUGHioXT4s8lSqMVsxW1Y7L50Yc= X-Gm-Gg: ASbGnct9RZRCSL+s1iJvWKtCMMe6Q7yciJVtVJzOpkWqKyKNsmhP2VYGNfMA8huMlHM v67pW8MkhCsPp/+yZyU5nsKcejS9HJNgU6nidhSVYpwt1HreHrz6pZBAYAIcXYGgIkUjOphd86F WJlDio/mXqNDuQrCk2WIcamshjXYcHADgq/tWehHODgrkPTfIXispbTQNpD68ilm1t9iTVMuRgh rwC9SPPJj1oN66axKY9DfXyNCetHto3aCn43XqZaj5DiOQx4fgmat4XeFBQBxtEzEMBkt6iQrCm V+FS0U0uMjTutB6VSMEWA5NJ7RqNka4QUUwzt0cNJKiLbcAic9phzQ9kGJSVXHsDhiKqTZGbRUg PHL9cCuSoCGKpsFavi0A/duI/9Lwq X-Received: by 2002:a05:620a:4489:b0:7c0:b350:820 with SMTP id af79cd13be357-7c76c96d72emr2137863485a.5.1744038670470; Mon, 07 Apr 2025 08:11:10 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGWwUJ4yecmQ9EvwHXO3wW07fXUXE+gbgkrQ7ZnvxLVeLA7hqG9gL2UbfaTh9CyoYRsZpabsw== X-Received: by 2002:a05:620a:4489:b0:7c0:b350:820 with SMTP id af79cd13be357-7c76c96d72emr2137858685a.5.1744038670068; Mon, 07 Apr 2025 08:11:10 -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-54c1e635becsm1312572e87.127.2025.04.07.08.11.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Apr 2025 08:11:09 -0700 (PDT) From: Dmitry Baryshkov Date: Mon, 07 Apr 2025 18:11:02 +0300 Subject: [PATCH v5 05/11] 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: <20250407-drm-hdmi-connector-cec-v5-5-04809b10d206@oss.qualcomm.com> References: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@oss.qualcomm.com> In-Reply-To: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@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=1475; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=ONC/5Y479NWKSaB1acKzuC/TwEyDJ/U0yuK43qNfKZQ=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBn8+sEXuFsQN2Yuy1KNOOXDo3ZnP4YKJIznS5Zz +/jhPH8bjuJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ/PrBAAKCRCLPIo+Aiko 1TMICACkvHMmUsBQjhiKIRjsBOO//olRxyT3ErBNt+XzQN0Yu7ADZ0AdqWGNt+AqpDwlWF3kRJZ raQOHgIEuC6QLVaa0ebAFvN+diJd3bP047ElJMnEFBm5sUyDhwT0FMQvee3qH6BqI3w6/MTD5Vh nd58wz4nrYtE4jmC3P48NsFtfoPVtVPi147YqCUGaMVjsPpIsY3NrA0Fthpt/jLy7fGFYVWkOud +EGwLhDzr2enw9ZYOmR4tL0XtHn+G3sh4/hCWe+Myi2GEQfM3RVotp0L4ajecRWA+dDCZmjtDQE /w5EzydMxHtwDSb7tsDS4sLGJMLO3JihZrgxu36uhI+jXC93 X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-ORIG-GUID: 6oO2pvygprBiojmBSn9virJ8R53Y-LF6 X-Proofpoint-GUID: 6oO2pvygprBiojmBSn9virJ8R53Y-LF6 X-Authority-Analysis: v=2.4 cv=NaLm13D4 c=1 sm=1 tr=0 ts=67f3eb0f cx=c_pps a=HLyN3IcIa5EE8TELMZ618Q==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=XR8D0OoHHMoA:10 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=7OZCfA99JoLngDASymAA:9 a=QEXdDO2ut3YA:10 a=bTQJ7kPSJx9SKPbeHEYW:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-07_04,2025-04-03_03,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxscore=0 impostorscore=0 priorityscore=1501 adultscore=0 malwarescore=0 suspectscore=0 lowpriorityscore=0 bulkscore=0 mlxlogscore=999 clxscore=1015 phishscore=0 spamscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2502280000 definitions=main-2504070106 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 Signed-off-by: Dmitry Baryshkov Reviewed-by: Maxime Ripard --- 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 Mon Feb 9 07:44:06 2026 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 6BDAD1F9416 for ; Mon, 7 Apr 2025 15:11:15 +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=1744038677; cv=none; b=bhyGM/W8ZZkrEssXqfcLKgHVqVVI5pdESENOiUv/Aip2IB24UIMkyU0XbemeC62OemVL+cFwj315daOo1yEXw74GXBbk+Z6MkC+lPzi6sGQNu697RIJyJdiuFF/9X6MvUtLGXVhz8FS5BI4FJAgVr+irqgkFO8RLw9EWk4kFjyI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744038677; c=relaxed/simple; bh=tm6E5CHrh0UyzbZn5BXrCuvQKoq/VVqScuXPiEFZX8o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=uW77c3e6CHXmmpvubRiDJMUFI7dNHCEscgFeTgWibmokmnAmOQlBIPJ3dWjtulXEa9Ni3y7MBewVigZFT+0Lvx6oF5SY9KGiF6rtDVhLo1Qf4Df5cpF+EcfeCX4k/9L7DrRlbzdAlDEbvGA/zGocNusGOV311XzXBpQBE7UOeHQ= 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=TfIgt8U3; 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="TfIgt8U3" 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 5378dr3S016217 for ; Mon, 7 Apr 2025 15:11:14 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= nbfUPVMpc6tBMMQBxeazrtQKlq+1In9JkEZNZNxoxHQ=; b=TfIgt8U3ZlNjXvkP uO2j/JhPIy1a2P8whxsMLmakI4EGLg+jm46t7VGQkk7jNNjCX7Zp95TevuZmrMEz ESQ2YCRiqdiSeTdFvwaVZYZR4UTNoLYF0caLOtAs/CPgduPeJqsDoNfwz3nAWIlO s+5nuhpiWvgGEtY0RAUJLCKKeKOcGjaI/DcDWOHOC36Q1UK3mn7T3nVBvl45sk9E Lcq11XWqxoFuo1mCm3Pje7D7V+dIFcLXJYm3SA38NpjvzC7pLOSJQWnH8Fl+qjA5 j0IXOgHEYaEJBu2vNzVjklT+SgPxU8W02qVQF17xyHnxPAnjA0j45Nr0hnxcrjeT bhtFLA== Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 45twdgcnt6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Mon, 07 Apr 2025 15:11:13 +0000 (GMT) Received: by mail-qk1-f200.google.com with SMTP id af79cd13be357-7c5c77aff78so1338861085a.0 for ; Mon, 07 Apr 2025 08:11:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744038673; x=1744643473; 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=nbfUPVMpc6tBMMQBxeazrtQKlq+1In9JkEZNZNxoxHQ=; b=qqyVPaucr7kqNdSUbfQrZBFCxoCTgei+dpp3RKqU3BadUCImWFIgjl/SdlMUMj6FGV l/nQKSeD400c5TPFYDORsBYJQuuoNzZNCpG5M9LcpUkLm1YTtkSe1sAakrQpWNVd6YVF 2lX4TqrncV+cXHh8E/EbUzbKSRT8s2Bf0uYm24XusjmAhgLBOeX/nYYWNwlwIskgBkpv UVYGCavm598ETtNLP9jDYtXda4ErXrSLlR7X/TZd0fJ6hHPwR5y70OWnyCTB72CLqM6+ 7VeMrWjE2d7kV+1dcgx+8Mot8Ys93hj5hD1QbqF9k/acuk7T/HogZXkbVzo9Zk8LJH7j 0jsg== X-Forwarded-Encrypted: i=1; AJvYcCV3iACPbnzbeezeTcVzBbVl42xD9Ojy+YKtLntztwlRui3kMcuLG7YvqAIbFmZ2doV6Y6iX+C8QB8VG08s=@vger.kernel.org X-Gm-Message-State: AOJu0YwdnO1BVsztPrDwwnNVlET31yZX2yCpORc4FiFXJlgfhZ4NvNDR cBodxAyvjzVUmKPuB6EZTX0yeccyX8flB7p0IoK/CXHnrcmUKi/ZR0BCsU7h9qwlBUW9ItZWr4M L7JlBPIhZh/Eq7KtGUzZPBLJ3EEDMuZZv6t8tURHD2XYAXFLTZwLteHNluI72NLY= X-Gm-Gg: ASbGncvyaQTF14CUvTHEyegqrHhpmPjjLQbkjtS6sc6C8PusoW+V7/vXLHFwQCnbXlb L4gcppZR4ZKvBl/Up1w7cYFXM793VV1DW0sxHN6+hnr244vozUytkc2lbmjPcI1Cyf/TmSFkXnw Shb7JxyPQ3BzNR+a2qYI3L6BTz0TWo/bEI30TkwhQ/l0Ky5jpuzuZFgMTMJ/ZHLq7RcKwHgoGgC RY+szWIdyaHZqnH00SG/a7zosk58bNLyuu0gG6sVid9KO/1P25gzHzI9JUgDt8wixc6B7zIoFaf fe8w/g4puU7Ds36j8tfUSxqztQpvYVH3WXKbbahcLSHd99Ooo61nfcTEqvqpTVLcLU9jEB797g8 QXTJxGYObO+fFe2iyWvt2Pwo3gkya X-Received: by 2002:a05:620a:1a06:b0:7c5:5339:48cf with SMTP id af79cd13be357-7c774d60c84mr2034077785a.30.1744038673067; Mon, 07 Apr 2025 08:11:13 -0700 (PDT) X-Google-Smtp-Source: AGHT+IG11reqVLTJP78XmGuhv2NYMgO7EkFlI+haHAO+cGC11R12/arMAXs5CVYiK0YDtnrz0cQ5iA== X-Received: by 2002:a05:620a:1a06:b0:7c5:5339:48cf with SMTP id af79cd13be357-7c774d60c84mr2034071385a.30.1744038672567; Mon, 07 Apr 2025 08:11:12 -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-54c1e635becsm1312572e87.127.2025.04.07.08.11.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Apr 2025 08:11:11 -0700 (PDT) From: Dmitry Baryshkov Date: Mon, 07 Apr 2025 18:11:03 +0300 Subject: [PATCH v5 06/11] 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: <20250407-drm-hdmi-connector-cec-v5-6-04809b10d206@oss.qualcomm.com> References: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@oss.qualcomm.com> In-Reply-To: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@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=12984; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=tm6E5CHrh0UyzbZn5BXrCuvQKoq/VVqScuXPiEFZX8o=; b=owGbwMvMwMXYbdNlx6SpcZXxtFoSQ/rn1yz3uk++FmXe3qulvy3yjtmTNddqJ/GU1/hH+Sexi LEumnirk9GYhYGRi0FWTJHFp6Blasym5LAPO6bWwwxiZQKZwsDFKQATsZvBwTB5a+HJ1+38/jOm Pj5249rl+GmZ26vPKFp1z8i7cPge9/09TCI7sv+9iL//+8QLlszfDCZa3lEzVgqI7qtLvX1R3Sq Pq0nc8GBh7jGrRfqa/SFvT3JtEt7eL28rKy9znHFa9DXFSjajHYvDfi3oKhSvmTh1quStmsvLJj mzhCuKtzDL7lVI3s7AVuiUGqRV8vhvQOOki066f3rZMmbpt4ZM6fsbop/Q2b3R8m5UTuPMmOnWI hIM0lyOOW8ZE5KPbNibG+V2N8rw4ParawKdpzgVmyeu8stnFpibkhV+PDPxgtKy3csNUi0EnNs0 7PJOmzkfEXCM12qXv7bm0E2Bd1cuFU8UcJjvru+269NSAA== X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Authority-Analysis: v=2.4 cv=PJgP+eqC c=1 sm=1 tr=0 ts=67f3eb12 cx=c_pps a=hnmNkyzTK/kJ09Xio7VxxA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=XR8D0OoHHMoA:10 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=s8T53sbBIMaaZ8HinFgA:9 a=QEXdDO2ut3YA:10 a=PEH46H7Ffwr30OY-TuGO:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-ORIG-GUID: UXpLqujIoTAyOJBZ06dqHfejP73wsPSE X-Proofpoint-GUID: UXpLqujIoTAyOJBZ06dqHfejP73wsPSE X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-07_04,2025-04-03_03,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 lowpriorityscore=0 clxscore=1015 adultscore=0 malwarescore=0 spamscore=0 impostorscore=0 suspectscore=0 mlxlogscore=999 bulkscore=0 mlxscore=0 priorityscore=1501 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2502280000 definitions=main-2504070106 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 --- drivers/gpu/drm/display/Kconfig | 12 +- drivers/gpu/drm/display/Makefile | 4 + drivers/gpu/drm/display/drm_hdmi_cec_helper.c | 175 +++++++++++++++++= ++++ .../gpu/drm/display/drm_hdmi_cec_notifier_helper.c | 60 +++++++ include/drm/display/drm_hdmi_cec_helper.h | 74 +++++++++ 5 files changed, 324 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..85076ea92d95ad95fb7b2d6c9db= 69c290e09a8cf --- /dev/null +++ b/drivers/gpu/drm/display/drm_hdmi_cec_helper.c @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright (c) 2024 Linaro Ltd + */ + +#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_connector= *connector) +{ + 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, + .unregister =3D drm_connector_hdmi_cec_adapter_unregister, +}; + +int drm_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; + + ret =3D cec_register_adapter(cec_adap, dev); + if (ret < 0) + goto err_delete_adapter; + + mutex_unlock(&connector->cec.mutex); + + return 0; + +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(drm_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..d87d30ec3fbb09d25eeb8ea382a= 77564f1071734 --- /dev/null +++ b/drivers/gpu/drm/display/drm_hdmi_cec_notifier_helper.c @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright (c) 2024 Linaro Ltd + */ + +#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_connecto= r *connector) +{ + 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, + .unregister =3D drm_connector_hdmi_cec_notifier_unregister, +}; + +int drm_connector_hdmi_cec_notifier_register(struct drm_connector *connect= or, + 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 0; +} +EXPORT_SYMBOL(drm_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..39bb6d12acb35f539a4a6cd1b61= ce97bf4e063ab --- /dev/null +++ b/include/drm/display/drm_hdmi_cec_helper.h @@ -0,0 +1,74 @@ +/* SPDX-License-Identifier: MIT */ + +#ifndef DRM_DISPLAY_HDMI_CEC_HELPER +#define DRM_DISPLAY_HDMI_CEC_HELPER + +#include + +#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 drm_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 drm_connector_hdmi_cec_notifier_register(struct drm_connector *connect= or, + const char *port_name, + struct device *dev); +#else +static inline int drm_connector_hdmi_cec_notifier_register(struct drm_conn= ector *connector, + const char *port_name, + struct device *dev) +{ + return 0; +} +#endif + +#endif --=20 2.39.5 From nobody Mon Feb 9 07:44:06 2026 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 2FADE1FBCA9 for ; Mon, 7 Apr 2025 15:11:17 +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=1744038678; cv=none; b=l6nX70zJ7o9H+qHOG+7gD6w8lC8zpO3Mud9UqflvkkPHubFtvoQZgXpnXqR2Tydzgk+1UF46IvV0AFWhDLE2do7I32q8gzTR0Fx7V1KJ4Q5myxp1Pl22EDHGUz1II8Cq5WlSxZi4nY6lY/xeN6Ece6yZSCJIr6LXNRZKdnh8hCA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744038678; c=relaxed/simple; bh=rpC4/Fp1Jm1yKyuARzvQoHZlvtt/ApP11arkSl2v3Xg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=q3EfK+ZW4UCamqS7o3CzbbSClNu/mM4BsXiFvbuwUfnoCqLWN9xugEk79tHuB7KpppW6DNtQRmRml7CKw7XYhMEp8eTjmKjyh6xQbSnLCkG+DG/5gMs+ptHhYrBTwDSIL7ergNw5yhSvldxDHJSHUDT5fPIfxRmyXiHE8LX3lQc= 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=m/6QJy9q; 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="m/6QJy9q" 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 5378doBT017420 for ; Mon, 7 Apr 2025 15:11:16 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=m/6QJy9qiIX94tCy chZPqrUcLTSgIPyP9rj4v20xQKxxAFcP/8wfVjqhAJzXzusJIxHOeAXEvj8S4gQP G3y1dO/FigF3JkxJ+/YeOeP6izkD7L4KCcAnFcKkAwaTTxMKPBBwJnv7pjtH51xu RUps2wY1ut/UbHvugVl+nCQ0nZHM6LwqV2S0KxNtDT7dHqHNcnFoVjc6m3oBp63P B2JNtVS6QUHOaSjzYXzFDLgeoyiC8tUrcO9K1+ivgPQbOFCMfH51h2nB1wcCtz6C 8FFXndyau1Q+2GRCVibM4i1YsDiej4SGkXvlmeUsP2LxLSa6LC9IIMZcfIVGos+u q7IvnQ== Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 45twg3ckn0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Mon, 07 Apr 2025 15:11:16 +0000 (GMT) Received: by mail-qk1-f200.google.com with SMTP id af79cd13be357-7c579d37eeeso720777285a.0 for ; Mon, 07 Apr 2025 08:11:16 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744038675; x=1744643475; 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=qz9bJaQbP5YJaPZ3trzYasNFdcncnpW0RG5rlHAuw8GMWmMIHworEcAHRqdl1yzOAk 3Aq7756qXzXZf/+ITluM/C8QzmQ+Rve1/dS1GohTMAx5Elgl9pYNtmPMel0fB3bM0+yk RYwWRj894zl/DakpTitvy4VtZYRoXkRmpA/3wGgtRR3wO5Dd+biIRXA1UfmnB0/gKzd1 K0083l7As9DXc8HB6WCCdbhR65QHVyycKYGsw4hgWLUb7KrRIgwjEtXp9yCZdMrrBK1D 3ABIEdiy90HO56dQiGuupMLOUdvxO9Hj8wWzIPO4c1QCv52jHLJ2uKqDBdklJBPYRTvF ACnQ== X-Forwarded-Encrypted: i=1; AJvYcCXlTG9rmd19PsZwZzo/1FKSBke53Ldwpjm1PiEoo8IknjxxY3Zl1P3auto+DXT1vqlC9/QT4QPT85lIpMM=@vger.kernel.org X-Gm-Message-State: AOJu0YxdnYxoKgYfDSIvRKiiFQF9c51ROu/ISntkOH+JGO3z1uS5MK0z 4KCjE7ba9tJ7bD8qTNAL86DGiUOa6j3luJLsC0+8H03hxZpaGa781XCvv2K37GiKzDYfD+lI0FC B9BKTqNIyQBMnvzUHtKP2eM/mX/oDxB+jc0VpAshaeuonrb4P57UjP7JcaXh5U7M= X-Gm-Gg: ASbGncvcX6lgsg7+desPafZPJY+/TjkKmsrDyU8zxb3l6kJerBTNMMpMRY6Ga8qKqCy cU2SPAah0mOXOCYgwERtvmBC3blS1QhUufyd5bu6tDy8QxWjyjaql4S3/B5WCMTRaLzYvOQTbhx gmxfGanvDUQFZjk8EUpr3v9/3ni3lr1JYvpfr1s7DuxivzInBmyCwlerofvfLwLSmHe7cf8bRiN TB6/O6gP+1erZqncYXTlTYaP7fxFJaAoSjAVD1DFBA7ivnRLrw7e3KtbP4QC/HA4Q6iZI5TqL1/ /stYEY+GCdtfEk/44f0Kp/6g0ZiI8WcmXtzxOmMovyUcAXIj67L6c9ts4tMo23QuT/TiSWIp3LT FfSC/9TRLUbnc1lO5sI8iZ2D3SNIl X-Received: by 2002:a05:620a:46a1:b0:7c5:55be:7bf8 with SMTP id af79cd13be357-7c774dd6ae6mr1889859085a.38.1744038675358; Mon, 07 Apr 2025 08:11:15 -0700 (PDT) X-Google-Smtp-Source: AGHT+IH7VhmZeiPqWQSFERVB9I6M4nMOVsDerXUI75MhUVSnlkhzTCnVuqwhozj7Eenae1YuM6/Pgw== X-Received: by 2002:a05:620a:46a1:b0:7c5:55be:7bf8 with SMTP id af79cd13be357-7c774dd6ae6mr1889854785a.38.1744038675026; Mon, 07 Apr 2025 08:11:15 -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-54c1e635becsm1312572e87.127.2025.04.07.08.11.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Apr 2025 08:11:13 -0700 (PDT) From: Dmitry Baryshkov Date: Mon, 07 Apr 2025 18:11:04 +0300 Subject: [PATCH v5 07/11] 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: <20250407-drm-hdmi-connector-cec-v5-7-04809b10d206@oss.qualcomm.com> References: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@oss.qualcomm.com> In-Reply-To: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@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/pANAwAKAYs8ij4CKSjVAcsmYgBn8+sExhDhW6OQi6i/U6Ig8nmUGUTQb0EUoQJDh Znh+wSYs2CJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ/PrBAAKCRCLPIo+Aiko 1ZHkB/9qYGTNRAzZMq+scTKGh9veyvBnT8RzcuRdK3pnwONnhtgz68KF2uGcxdLTtixRjs/5eXn BR9LgdgdQqm+bxHAvbZ4RKuWF6BvyY2juw4hHXv8pMjbwMBLHUxp3NYXA4+sUwZxkh30KyzMcOr /AfKBESf4zMF5vu8rzQXXRDmOTt18cg3jjZisl/Wv0KV9C+gs3lJDjvE8q1C/+aolT8JBljpMlc v6DmPmNLljFvHLjdfJbj7KJddoQ8j/Ky3daADjrMea5LAJdzMn+/DuOrACp2qdAmZQIREQ/q/qe LBEw5q21x/fISaBYyLvKUpCsc54CxcAdWhO1hA4hVzjB+XA6 X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-GUID: KJ4VoK2xqW3TIaccqwHKZr8kI0wLAav9 X-Proofpoint-ORIG-GUID: KJ4VoK2xqW3TIaccqwHKZr8kI0wLAav9 X-Authority-Analysis: v=2.4 cv=I/9lRMgg c=1 sm=1 tr=0 ts=67f3eb14 cx=c_pps a=hnmNkyzTK/kJ09Xio7VxxA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=XR8D0OoHHMoA:10 a=VwQbUJbxAAAA:8 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=xYQKfNBhK_rbaXl_Bc8A:9 a=QEXdDO2ut3YA:10 a=PEH46H7Ffwr30OY-TuGO:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-07_04,2025-04-03_03,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 mlxscore=0 phishscore=0 suspectscore=0 mlxlogscore=999 lowpriorityscore=0 spamscore=0 clxscore=1015 malwarescore=0 adultscore=0 priorityscore=1501 impostorscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2502280000 definitions=main-2504070106 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 Mon Feb 9 07:44:06 2026 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 9F6691FCFDF for ; Mon, 7 Apr 2025 15:11:20 +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=1744038682; cv=none; b=ZwgQXRKRIrUEGugqECg97tjbvEJbwOIiot/YDqylS9zbmKERmB+PUD5ei7wZX70UoaZ3LFeb455aj0IqMqzSQQz8fBBIowi9/FTthYf9ynhwKLIgWI/TpUOY/792CjxNzAiIvduUmb32yLIa3gsBcrqazcf8Yatp2Grwcf9s7wE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744038682; c=relaxed/simple; bh=a9M2ccKyY4lBF+8BSsLul3wlaYMo7ScE7hsbV+oCgMQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Lw9lMVvxMoezzLNGU3jkEQZqmLvBo0IQ1Uoe9K6cPjE6l+mVBlRnrxZX0cURoNH4tWnTIGL5i7YEzJpl0J6X9bsH5OLegtwBZLr+3HnYZiA8mo+comKVAfO06XQZI6JYD6L6S9izjdvsF29g2K4Icz+8kIaLZ/DyamLO2raHSVY= 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=KpBbCveA; 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="KpBbCveA" 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 5378e44N028420 for ; Mon, 7 Apr 2025 15:11:19 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= aSVhAHFwCmKb4di7iY3AClytjvzIBCoWb8Y/fLrSCwk=; b=KpBbCveAIMYucmSn GUbrTB82KoS+GORDkDXSOyojMcBaU2q/O0VB6/JnTHXc3eUeXt3FZZ9aQb/ljmTF 5HH+lX3J4EKgxdGYFzg11rdO2JRQa3xDfcMSNkgzmh88moIOPmoFIXq02bpaCXwk OBK2rSocM8gc36EN+6hNPsYaCPFrJl+T03nhi8K/G7Tj1QDWg3sDsvRfPcsMfoHc Zb28fXxu5xk36unzu9uM7+JR1ot0pFW5CkiPgv+2WyghAaJksSQINtqqNOrSUcLl 9W9hGN/y8oMD3rR8FSm+oe3zxqV7CZjQ7LKIMq1XYIyBIKgaBDIsSf9Z3jjuU31o fj9ZnQ== Received: from mail-qk1-f198.google.com (mail-qk1-f198.google.com [209.85.222.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 45twcyvn73-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Mon, 07 Apr 2025 15:11:19 +0000 (GMT) Received: by mail-qk1-f198.google.com with SMTP id af79cd13be357-7c5e2872e57so854463285a.0 for ; Mon, 07 Apr 2025 08:11:19 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744038679; x=1744643479; 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=aSVhAHFwCmKb4di7iY3AClytjvzIBCoWb8Y/fLrSCwk=; b=fbwaePYSVIP6100Z0ZWtfMRRbM3bmRt+Tj6zw68TtkjOxmMkkTVQqQgiiZGgk/MjRb 2LmGSVeke2vpota8v0Vr36xnrQiII66Br8bpqUruZpSGQL+lQq0HNo4llXUOdlpOhSH4 ff6V2O5dImhsY03G46YNM4M5u+w6Ju2zykm2TprQl+TPmLeW9eTGc1c06IqlpY2K0r9u PaTX3Qi0NJ+rHiJME3P5oGyq33c+DTmad0YCpoG+u7N3rv1YV54zK7vI6IcfC6kdjoqH xvq9Jn1KcqlVcb9bsZjZmIVlls6HHvSVkahLEpE7q4OUvXbh4jtekdjIfEBEWmbgBeXh b2sw== X-Forwarded-Encrypted: i=1; AJvYcCUPpRAjogYr5QRwuMaHr73t93d9wmlo4Yaxobnq84x8Dlb9b+84Yf9r1L4PsYrjHFiT6v3o2C5a/Kn/3Dk=@vger.kernel.org X-Gm-Message-State: AOJu0YyudW3oB9+8fJLsXCGzm1KgjkfbgdANvTM+WrRPbzEsilEzRJzF sPRqmxL0ERxJLp8mfKmX+S44QT9BoS6j/53cnmgfhzRMN+JToSzlGKxYKNwFRS2oRqaRBlU3zRY aNKlY8Wj9zg627o8mE3r+xfATHUGx28hzL3Z/uw77rzt2xDbSpGTn5x869hV2h4c= X-Gm-Gg: ASbGnctSUp/B6a3Esw7ue9ExSvnysze8SIwgXOgv0h4XUlRv3paGNL04BOG8I1LzxNB r0Uu3doD9zvpiFqO6m/E6acnUajkYuey5KY+Mv3vDK5fGclO3fLhO7TlX2mkTHNm4q4nkC7PjwO 411WS57pcs09YJqZ2xqWVImB60KhEv6iv22mW+cbAATWJPkvANNPdMqwu/MlYNOemmRCNKd+CWc l9DDNNB9Ir8gwLE1RoMnjycw/R/b8S4B4v2hGToWsazO7XbOtX7vyS5+MCTKoQTJRZSeEZgSd1c PbXNQ7eHqJHuCziyLJi2AOwI4qVJ8tBd181+FjRZn8OGzNw2fAcZCSMKcX/u6ml4mSZQVGdSScF H5J/iT8mcaFNuQ7yE4rcZsErJl1aQ X-Received: by 2002:a05:620a:248e:b0:7c5:3cf6:782b with SMTP id af79cd13be357-7c775b11755mr2439018585a.54.1744038677880; Mon, 07 Apr 2025 08:11:17 -0700 (PDT) X-Google-Smtp-Source: AGHT+IG00325JjCeNUWzFnxGMoZ5wQxn+cqq9N345OXEerWwQFBqm3ArKxIvh5oGMlCyWXKAO7hfSg== X-Received: by 2002:a05:620a:248e:b0:7c5:3cf6:782b with SMTP id af79cd13be357-7c775b11755mr2439011385a.54.1744038677393; Mon, 07 Apr 2025 08:11:17 -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-54c1e635becsm1312572e87.127.2025.04.07.08.11.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Apr 2025 08:11:16 -0700 (PDT) From: Dmitry Baryshkov Date: Mon, 07 Apr 2025 18:11:05 +0300 Subject: [PATCH v5 08/11] 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: <20250407-drm-hdmi-connector-cec-v5-8-04809b10d206@oss.qualcomm.com> References: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@oss.qualcomm.com> In-Reply-To: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@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=10704; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=a9M2ccKyY4lBF+8BSsLul3wlaYMo7ScE7hsbV+oCgMQ=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBn8+sElSqvMbteBjr/5uBLp48ns+u6zUDJQY9/G 7EUDF0jFrKJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ/PrBAAKCRCLPIo+Aiko 1TgQB/4h6T/gmqw1lm/i7qnC5wFLztk7/+unzgQuoZHqwTsP4Ynj4oVaX1YbIpaopS/Kf1dZhrW KTpX6ymensCIUI4ZZBrTjZFn0+o8xH9itm65Yk8AIIiOpPzZ7kXrQz7XZII0ccYQIkJyR/8lrFi Ec9nHt7cq3QiglVa1gpMKoTICE6iwsgQUN51Md79rnlc9qL7L/eaecHaCtqat9FtQc+F/McAsfu UgRo0SL2mcr99XxQtSbE1kVI80s/QfxL9mc1tr/AyHLdyNIiABNgI7+DknkRYqDwBVhwwaxHoOr 23W65g9w2BgV6HBrCcOeJ8p45qxqHgLKMExIC/g0zI8CKqkA X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-ORIG-GUID: 8PhHs5e7raALMbHsRSAbJSgxeMj-8OVw X-Authority-Analysis: v=2.4 cv=Q4vS452a c=1 sm=1 tr=0 ts=67f3eb17 cx=c_pps a=qKBjSQ1v91RyAK45QCPf5w==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=XR8D0OoHHMoA:10 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=a9hgYIhf75voWPlnlJQA:9 a=QEXdDO2ut3YA:10 a=NFOGd7dJGGMPyQGDc5-O:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-GUID: 8PhHs5e7raALMbHsRSAbJSgxeMj-8OVw X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-07_04,2025-04-03_03,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 impostorscore=0 lowpriorityscore=0 spamscore=0 clxscore=1015 phishscore=0 bulkscore=0 adultscore=0 malwarescore=0 mlxscore=0 suspectscore=0 mlxlogscore=999 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2502280000 definitions=main-2504070106 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 --- drivers/gpu/drm/vc4/Kconfig | 1 + drivers/gpu/drm/vc4/vc4_hdmi.c | 138 ++++++++++++++++---------------------= ---- drivers/gpu/drm/vc4/vc4_hdmi.h | 1 - 3 files changed, 56 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..3bc7c4bd496b60ccb0c7dce8b41= e5cd9f01b18ab 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,66 @@ 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_adapter_ops vc4_hdmi_cec_adap_o= ps =3D { + .base.unregister =3D drm_connector_hdmi_cec_unregister, + .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 from + * drm_connector_cleanup(), which is called from drm_dev_unplug() + * 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 +2804,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 drm_connector_hdmi_cec_register(&vc4_hdmi->connector, + &vc4_hdmi_cec_adap_ops, + 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 +3216,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 Mon Feb 9 07:44:06 2026 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 01BD31FDE11 for ; Mon, 7 Apr 2025 15:11:22 +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=1744038684; cv=none; b=eF3IzE7kcQCwqMJU8rAKXESyLnK+WZR09HChHKaB48oP6hv4jn+NNNpp0RpQFTYtxBg6f0Qp3wBkWpnOzwdcyLKcHPVyg2+m1RBkeyK+1locysJhjsW2sJd+9rrz4zKKe0CeWhw+cz7QYlmNshhufVcfCy0guWSn61Gf/V7Vnak= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744038684; c=relaxed/simple; bh=uklYweWBlwLbC6gTQ6PCbwQsVuPXcE9aRj3J6MFYXSs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aZLMnGEcaJRjiqXDCUcRb1hJ+y8dy8hM0AGOstKJIHwYP4DzNpQw7saLiP8rvHOaPgbabmbV/qussgQDaBqiypb+TJ5qJELSs0AaKYape/5oMGL65asz3bWJ3bEEhkZmx3D0s7SYl9U9U0S8QJ+fZsP1NIyEk7fJNN5rh4mJwDM= 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=D85nAQ95; 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="D85nAQ95" 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 5378eHgI011554 for ; Mon, 7 Apr 2025 15:11:22 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= G1ae8VxXVqStJkqbSuwALnEc5YS2/T7OPX6wl6TCcAI=; b=D85nAQ95l3UHoNQV MQ+PrKqsPZ9lDJDJmzgH7fU+CZv/qNS1ErTP5Kk+tHnT0HSRWGb9Xd/F1SB7gzZm u5qkXhz9grtrCFz+luEs8lYelv23mX/GqfFQTQ3286nNU0LQ8uHHErNL2yEfJg+5 Av10UIahJrhi1g6q1OWCwiClEoREdOsGSBaueIP1Q8a4hVkOGfABY4PuAEYAF7Qi 86PH96RbPjsC+fbrj0Rsb3EKFDMtcID9r2mCW57pAu+OCvfTe/5ChVQU4NNxLjfi ptY+nGRS+eIRoTa7bHMynjqom8SxLmyAS52BamvXbqjnSyp9rbqMPHfiMVE6230T 9eUUew== Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 45twd2mnem-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Mon, 07 Apr 2025 15:11:21 +0000 (GMT) Received: by mail-qk1-f200.google.com with SMTP id af79cd13be357-7c5f3b94827so831269885a.0 for ; Mon, 07 Apr 2025 08:11:21 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744038680; x=1744643480; 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=G1ae8VxXVqStJkqbSuwALnEc5YS2/T7OPX6wl6TCcAI=; b=BpNs4SkFzn1FCeApHCJoDMvYJBPlNIVZ4nuKgyCu0fzRYB0I6Rg53WIvpxKrg6J0p4 WblTSIDqT7b7c6KtOkw3+78fLa8RUhp02LQYqcdayiAXf9w6eMXZJougKRQ1FPPpKMy9 V15UdTEzi8+4/sIeFzoLhmAFHMrAUqaZnAtd+r13f9zT2ppSMxlaEO8W51OH2i+J4SvD xeTZCqdNvlF6yNQR+AJd3wNXHgQQSQqYBVK9JdwvQKyi48ds4SvdHZSx9Czay7/fBNcR O1QMOVdQDjhxWSTnL6ou/+jp4jUF5tVKNPlFdcTF6Bzg1Vs7k9n2ImVG/Dg6lR5MhdUa BQsg== X-Forwarded-Encrypted: i=1; AJvYcCU3ChzpauolowS/MQ7fueNmsX3X7boRr3sS7o/2NY18NtQ5HnEN9AkjYed0TxwmrYcqnlNuZP3QtZTzxqA=@vger.kernel.org X-Gm-Message-State: AOJu0YythBP53/ykSEsotpAiOIMKZhdt8KqKNO2Xywti+GPe2FrntwoV qD8Er+kX97695LZj+b7RLjw6k4ahtFg5VU/TglvOit++S/FQ6Q6FnlsCufbnqMarC5oZhrkGTUl LYUcenl9VmZBDWs4oQk8FHz0pWIotLv/L8ep/xgH8kYgcIcntpOH/rYATa1HsG1s= X-Gm-Gg: ASbGncvJT7wfcVfPqld3iSTSgagHQr6xJ1xskisp1VXhG/0iK6a8YMyxSP0+vhbwwxk sXHbo5rscceAYl546Gr1A80UoMFZDcjN7YSE0k67Fn1JyxWB3frxWLf0n1qLbcWkUIwQehh2rVc 8kQuf7aWOFgdOpCODRF8rG3BPDLJ21dswv+pwCC1jP72wU93vEIa3+xLf+oQ4fwwQbFcI5ZYZO3 M+R+8LMZGnH/lY52OcIE3xIHMugz5X97hE7d7gu9Mb3rf39tq0XevU7gNPjhHwoYkcXcR76o1iJ St0Pthp+5HxnkejtSpLDJPlNEssCJNgydjH+OMNUIYuOtco0DzZ3B+rd0fjHC39ZV92YkOIT6yY 0Z11mfXPgM3j2P7KSorFHy+ynVp5T X-Received: by 2002:a05:620a:1985:b0:7c7:65fa:674e with SMTP id af79cd13be357-7c774d254f5mr2058155585a.1.1744038680435; Mon, 07 Apr 2025 08:11:20 -0700 (PDT) X-Google-Smtp-Source: AGHT+IF9FXJgKvDLCUZePpUDFSKDRydHaWSVNRxhoLmQaAx1/qkuqar4lsuiXVZFiVRaSsavpRwuAQ== X-Received: by 2002:a05:620a:1985:b0:7c7:65fa:674e with SMTP id af79cd13be357-7c774d254f5mr2058149785a.1.1744038680064; Mon, 07 Apr 2025 08:11:20 -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-54c1e635becsm1312572e87.127.2025.04.07.08.11.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Apr 2025 08:11:17 -0700 (PDT) From: Dmitry Baryshkov Date: Mon, 07 Apr 2025 18:11:06 +0300 Subject: [PATCH v5 09/11] 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: <20250407-drm-hdmi-connector-cec-v5-9-04809b10d206@oss.qualcomm.com> References: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@oss.qualcomm.com> In-Reply-To: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@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=3887; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=uklYweWBlwLbC6gTQ6PCbwQsVuPXcE9aRj3J6MFYXSs=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBn8+sEr/nW4cyUp9iMLeFQl1VURYW4LGyPfC++A MYRcNOfR5GJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ/PrBAAKCRCLPIo+Aiko 1TmxCACPf5vMjXdlaY4Kj2n0X93HdTHmJPPW+ZG1bU3vDa/otnWjg19X+oZJIW3rX7n7SexAGhe jg42xhJto/hQ/f3346I4G7qYbJ1aX9nJ/GzEgwlvBNhvUjnMMvzGJCKd6gl5b/hu+jIITEhbaG4 89Y8hpkH8205JXdWjalqCPyidHIuqeHDxfZF5k1npM0Ay/RLh3NAM2IiJF9YL349StGekracFV+ hj9i/16VPdPbBGUA4RvrsgjY5POuuvNHxtJOuzBnQY5zmMeZHAer1MM0YyWv2nsuy9BNMkOLL/1 vZf8WQOM54BgaRV2jo+38ycnEGWq0vLIOwYbN1s8ub3Z+gZ3 X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-ORIG-GUID: y-4AfJzcgQh2_z4gy5eY22b54LWHgl7I X-Proofpoint-GUID: y-4AfJzcgQh2_z4gy5eY22b54LWHgl7I X-Authority-Analysis: v=2.4 cv=NaLm13D4 c=1 sm=1 tr=0 ts=67f3eb1a cx=c_pps a=hnmNkyzTK/kJ09Xio7VxxA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=XR8D0OoHHMoA:10 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=ueZRYqln2k_rfa3UlOQA:9 a=QEXdDO2ut3YA:10 a=PEH46H7Ffwr30OY-TuGO:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-07_04,2025-04-03_03,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxscore=0 impostorscore=0 priorityscore=1501 adultscore=0 malwarescore=0 suspectscore=0 lowpriorityscore=0 bulkscore=0 mlxlogscore=893 clxscore=1015 phishscore=0 spamscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2502280000 definitions=main-2504070106 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 Signed-off-by: Dmitry Baryshkov Reviewed-by: Maxime Ripard --- drivers/gpu/drm/display/Kconfig | 1 + drivers/gpu/drm/display/drm_bridge_connector.c | 24 ++++++++++++++++++++++= ++ include/drm/drm_bridge.h | 11 +++++++++++ 3 files changed, 36 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 381a0f9d4259bf9f72d3a292b7dcc82e45c61bae..daf6117268d9d3bb0c0c12b5094= e79ad13cf72dd 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 drm_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 Mon Feb 9 07:44:06 2026 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 856DE1FE462 for ; Mon, 7 Apr 2025 15:11:25 +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=1744038687; cv=none; b=uzMZWOskhk1uMTToOxeLV8cARi3AXP/B7eq9ZktAbabud5hMam/8uWbQS9+6u2VTn0b6JAK87h4A07RHntN1vYyCSvzl4/L38PgXRNMe54TGp05oHB6L6jjN/y8jnnUHx4QRLpADFSMFmTG6V5eeoerPq/RGqrAv4T08B4kvqqc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744038687; c=relaxed/simple; bh=QRIGbScjEyySA/y+XPmHc6N8KQV7f9VPKEmp6IO+aIA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=P2uR8OaEcjt/G7g6PafgXRks56eQ8KDl5gN6GmkyyWVKwpMDM8hBYbAdLMt9Yahf2P28v+wgxMDSY4YUrOvLT78zDvWHaIIj8YUN1gIqgsMxlqxS719uumzi30iJVxkJcgsEt4m5g2Ix/euk40AlFV175jUgrsiSX7sVzCU4fYg= 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=pGJU3Eio; 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="pGJU3Eio" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5378dp9l003284 for ; Mon, 7 Apr 2025 15:11:24 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= JYUU1oL1b7n2VxMLpZgbKpTf+49UGtsm3W7xKJkRyNI=; b=pGJU3EioQY0/W+sp aVPfr7JdUaVEo30kPETKlOt41ahZ8eMOGRqVfEcD1jf6c6pbQZ6VMa9KU+YkLoLg aLXYzjAQvoBmzkXxr9TORs/ugUoyXvXC0a7OxmMsdsACSDaPT/x0+QMeYb/njb0i iNKfsJH5VUR4teqPvnitK8Bo1os6njx4iJA4/BZCla+7cz3LOVyvqeRcaANCB/pm +WZOpv11JF++IbPQU3kpSY6BFzffIjWn9wcR3GDBcddr+45suwGHsJPzKwYIAB1Q S6MMwCLPmk6zGDpeHcenzw+GvGtO+//AV4u/FX8dnoDsQ4xBneBtudOPVNpNgk8r Ci5pZA== Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 45twftck37-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Mon, 07 Apr 2025 15:11:24 +0000 (GMT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-7c548e16909so409489885a.2 for ; Mon, 07 Apr 2025 08:11:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744038683; x=1744643483; 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=JYUU1oL1b7n2VxMLpZgbKpTf+49UGtsm3W7xKJkRyNI=; b=o6aXbniJpUZgeb0iKXohB2HjtuW5F/B4sVCcCtuu5S9FNnt6EXpEV4JVIkKoS6qudz KX296MZwz8NtYXXstkMcBV2lTOgzOVILX/W4+Gx9Fu+wY4B2JOrKTpY5ZHtQWPDzgXEg voI1fmpoCgjF/B1VIKKlFPHth2eCQjowjGfx/EkdOm5bgTjAl42ob/chFgI78h0VvmSB QByZWNtpvdti0SsqsuVMipZovTDhqIZzbK/8RW3fOopegEutdHdMwZkblcqxubkMQW1+ 2/4Be9rWltJt+EFwbQ+tGMwTDhoEJnAZs+sX2dt8l6LV730Aol+h3VJVzYv78uy5fSmr 4acw== X-Forwarded-Encrypted: i=1; AJvYcCUyZ1moEnz2qpUiqpRaFrMHPXjfEKDc0Sdnq8dXfmXo4xSTPsrZPP5zohzkNTJpjL0xxEwAyz+5q8miS9k=@vger.kernel.org X-Gm-Message-State: AOJu0YzfJCfGL8bBnRBTD7AtXDWtTYrhh4Zk8e3FM8dP36iaZUb7k1g4 v7Siwm5TIyz51Sq+BgPTlorYrRjHirhPssg1tP3XgtJDlhLwfmy1PdSBLNYPulSQdesRbTGy4Ad pzVHfRMCPgtawgsj0CXdD7J+Xtx+37uRiMvXMpoNZEtvMQy7k864gWBPrvarcZZ4= X-Gm-Gg: ASbGncvXu1yH3JNNXQi82Wiw6KWKnLRJElF5cG8cgbtamwj+Klm8wCUq/vBN2YeMFo8 dJunHEnu1E2qNEOriTwu5x6zkwySf5k65OGeVMLxjIM47kDyuHSB2xmY8jTvAJvnsNubptd0+Y4 r+14UDiw2asLz74aISU4HsNus5fuECNKNX+rSt2TOJdWVn+9qAuvn0O4uRq1WtaNHZ2mvuL3dgq B2sU+y0rLk9ayZkcZQ+7LnGO+7eKtRmUotBO/H4YYMLYPqouRIbbRCEMsy0ugQaGkEp7yZe543o 2Up74c4EzE7mOVDgnMQ4cwJaopGSnaOJvJnWyuu1tx7TCJHnVG98nvBBUkXTsgpWClRGH3Ocqfb fo5cTcuXfH9lU27FYC4N5ABdlb+WV X-Received: by 2002:a05:620a:1aa6:b0:7c5:a441:f440 with SMTP id af79cd13be357-7c7759e9d30mr1725585185a.12.1744038683006; Mon, 07 Apr 2025 08:11:23 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHRS1FrXPz3AmbGE2tg5haOPLRSCdn0vGVwkzaeJ13cWsadNmoGINiNLetvdppkqJEdmfvUAg== X-Received: by 2002:a05:620a:1aa6:b0:7c5:a441:f440 with SMTP id af79cd13be357-7c7759e9d30mr1725579785a.12.1744038682596; Mon, 07 Apr 2025 08:11:22 -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-54c1e635becsm1312572e87.127.2025.04.07.08.11.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Apr 2025 08:11:21 -0700 (PDT) From: Dmitry Baryshkov Date: Mon, 07 Apr 2025 18:11:07 +0300 Subject: [PATCH v5 10/11] 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: <20250407-drm-hdmi-connector-cec-v5-10-04809b10d206@oss.qualcomm.com> References: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@oss.qualcomm.com> In-Reply-To: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@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=5742; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=QRIGbScjEyySA/y+XPmHc6N8KQV7f9VPKEmp6IO+aIA=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBn8+sE/8G0BItHha2H5mPB5R3piO8M5sc/iCJl2 HxpAngot/aJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ/PrBAAKCRCLPIo+Aiko 1SViCACs1J6fSUZmaxRVTP6iMOebd9Fb1uSx7axRVey78qD/25pmbtvGOkMancYhR+kFh9wufek ChxHuePP3D496KDJsAD4dDz7kzRsY5gOGAFv7X6PjN8kXt7E5JRkjJ6hkP19wrhEz4FJq2A4yoc rNgwDUX4wi4GHa5zKUqR9qirQHz0w3mnIHKtpc9drtS3VhXLTvoC9k3AZsU+yroqzqbmg6r4q0u 52o5KCJwScsXY+zsbseKHJwEs10HeqEnF9dYqtSR9NY8aOCmc0fyUF1aTLw01BFyDnEYueX+H7n LpLXGRA6Ar15N5nFmAfR0GDQlytfNQqAImi9/jHcnDHOIkCu X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Authority-Analysis: v=2.4 cv=B5+50PtM c=1 sm=1 tr=0 ts=67f3eb1c cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=XR8D0OoHHMoA:10 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=ctLpbLA6xJCkk-8Cp5MA:9 a=QEXdDO2ut3YA:10 a=IoWCM6iH3mJn3m4BftBB:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-GUID: SVlUm0WLYArNWWMo5tPzF8ro1vgT1i64 X-Proofpoint-ORIG-GUID: SVlUm0WLYArNWWMo5tPzF8ro1vgT1i64 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-07_04,2025-04-03_03,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxlogscore=999 suspectscore=0 malwarescore=0 bulkscore=0 phishscore=0 spamscore=0 priorityscore=1501 adultscore=0 impostorscore=0 lowpriorityscore=0 mlxscore=0 clxscore=1015 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2502280000 definitions=main-2504070106 Implement necessary glue code to let DRM bridge drivers to implement CEC adapters support. Signed-off-by: Dmitry Baryshkov Signed-off-by: Dmitry Baryshkov Reviewed-by: Maxime Ripard --- drivers/gpu/drm/display/drm_bridge_connector.c | 83 ++++++++++++++++++++++= ++++ include/drm/drm_bridge.h | 26 ++++++++ 2 files changed, 109 insertions(+) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index daf6117268d9d3bb0c0c12b5094e79ad13cf72dd..54b49be7837a174e0a25eec3395= fd10d9c487c9e 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 drm_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 Mon Feb 9 07:44:06 2026 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 A65CF1F8901 for ; Mon, 7 Apr 2025 15:11:31 +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=1744038695; cv=none; b=Ja4fRHRxml3uSuX5vsA9TKQI6vnF6ZYkgAdVpDvSFBlADFcZZeLKtiAVPp+/TtaYgXe/mPBDjIoZrxvgnllphBsPzQ6RqGaVaiqtdMhPbwg9jxznOvsjUMg/alo0w1BObcT0rcQZ0t+NTAbBuAwqAyzqkfDhWHFGTkrv4t0EzYo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744038695; c=relaxed/simple; bh=BOyopBTpr+POzl7WvSYVI3Xm07zdAHUWrgMFn01FWoA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kPjepCUUfl6jkO/TpZK6Jn9dRefc9hkw4hV4wnKfZzVpWxyeJNEwJwgXHrcwQJ3F1855dfjeugx3RfQUO3jiW7VY8RUBygMPLpRXguAScPt2tM6a1ai6XXlfX4L0E8BuET6bASpN6qeQIFCTL2pdRzyK6X4Bcgv2hqrUeVM1siI= 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=lInut+Dg; 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="lInut+Dg" 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 5378dldm015467 for ; Mon, 7 Apr 2025 15:11:31 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=lInut+DgHe8jsv3r swPfrD/o6nOHO+Ph6zWpTku5e8su0x+ta4Xladts7NWLCi60YSTrnq12qe4FjLnm sMixlk/cUTW1NLdWTxD0PrW7bKPoaLxBU0ryXi+k+O0ljcAGFFqBFAnKzJax4/TH kuRTcFNYbT1FJPB5PtlsNihBrMo9O4CW2PAmc6GjK7RflULnYnnRBxdIllItWLMN GlswHqMF3ylVVfREnGdQ58tb/YHijRbtBiSzKc4++akzfoQ3Of6jjuGU+7r6a0+e I0BkYI3tjFMYJluVQKCRWI76wttrIulAGeNXXu2nN0vMAUfmbMagwaiRrBy6sKhu /WCZmg== 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 45twbe4ngy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Mon, 07 Apr 2025 15:11:30 +0000 (GMT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-6eb1e240eddso82792186d6.0 for ; Mon, 07 Apr 2025 08:11:30 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744038687; x=1744643487; 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=bF6zmU7WW1fhHRygikVXCLZxgtapuhq67RoAUZcGFdwxXDhKYL9bvKTVRUFaAPPpZZ 5P7w8i+pv7oXFWPxkc1y3u9K5YF9MXuxkOeQDHnqu/lcD+fAkJl0xGeUF+roAHxwPyWn hetzJktqfUvLjetHciV/YkLe7WtZpTTE4itHda4rmnoM8EFigGJQKNRQBrsU5RGrFbKc JvZ20U6dml1FpPVQ+TN74ORI+ASsq2J+yzgc8VImnE3LrMHLSz1Xb7ASB8+OLTWqS7K9 isyKqaHgd1mx7FoGzAgoomIIt0P90EePEMMM9ssys/Tp+7/VjQ4hR8vTBLmV6MU+L2eH hT3g== X-Forwarded-Encrypted: i=1; AJvYcCX+t4tbQv8teVPkqGKGT0USdnXe6fNV8T8O0D7VYvaIMAYwjfSQPWjms7NoTTxA9tQr3bLFVmauLtfkxRE=@vger.kernel.org X-Gm-Message-State: AOJu0YwBSecgFnLKxGDnb9E3QLuFWazEVcOohwLuc76s1WTG6bkraZ54 J3e3LHd9gf5QAfIizp4JNve6vUQDMasSg0Rz0a69iK1dlNWCXaA0KSzNZDLUGeGkuNCZX38YwNe snymPet2NIzBEjmZM5aQfHZvhGxMg/mqDA/kMWtkmMAaLneoQEC9KJPZ4v/vWWD4= X-Gm-Gg: ASbGncuUve9rdTbg+1L4xkAvpNWHoGbC1JUvSc2/CGvWwrElpMCX8ePYE+wb9Xv+L1W RAwkpIAosxG8B8mkmuw8NyY3bNGEeKqlLLzQEfpaYGPA+F5oCr4NOY9qgXKxL9UVjGFBGzaUGs6 nGuQeSUZnJrPPSyEJYeVWWJH+ljcEAEq7613R0JDNyVR5E4CqGFpQgFUeMJy7l9hZtIgzTXTpgK Ve4WJWsy9meK/YpxSrJhYm2ebNR7wPjAcnhYwmnyhq2+7i8UKWrf8DbF9NctfbF3gj40pgKJbMO /GNefhjeCLWLSiGYClTvgqdB6Rk/Ta5Begh1naGoIVywXF9KQKgWjH++7Jx77i7FPP/dkG5659b 0LjGrj45E+CKRhLhofQnZoLF9sPJS X-Received: by 2002:a05:620a:bc2:b0:7c5:5670:bd6f with SMTP id af79cd13be357-7c774dfa5f5mr2043577085a.53.1744038687066; Mon, 07 Apr 2025 08:11:27 -0700 (PDT) X-Google-Smtp-Source: AGHT+IG00suHoSTMq0csysQPUiok63AqWI1ZZwlPeoO4IevtA/weq+ndvHXPSx0cfVEqdOpO0P9log== X-Received: by 2002:a05:620a:bc2:b0:7c5:5670:bd6f with SMTP id af79cd13be357-7c774dfa5f5mr2043568985a.53.1744038686438; Mon, 07 Apr 2025 08:11:26 -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-54c1e635becsm1312572e87.127.2025.04.07.08.11.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Apr 2025 08:11:24 -0700 (PDT) From: Dmitry Baryshkov Date: Mon, 07 Apr 2025 18:11:08 +0300 Subject: [PATCH v5 11/11] 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: <20250407-drm-hdmi-connector-cec-v5-11-04809b10d206@oss.qualcomm.com> References: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@oss.qualcomm.com> In-Reply-To: <20250407-drm-hdmi-connector-cec-v5-0-04809b10d206@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/pANAwAKAYs8ij4CKSjVAcsmYgBn8+sFf0PHlJ8MuCK13mzN5JbWYHZqTbo9Wyfan BHVE9ingCiJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ/PrBQAKCRCLPIo+Aiko 1VBAB/9jv3qTDrk0hvGGaJ8gq7sW4zdXJSVw+8RMK1tnUKPkTUaMW70JdnWkHUlMtgXU+/7NoBN vL3vpISwB9Zn3XGgLL8mdTnOanyEnsnI2A3aXl4JTizh+zQonv+2WhzIWzPlkEys2s4ttf2SGrd P5PhGpT91oTXRxbuh0MX8JbZCNNSQMRXmrzVM+jHu+zeQzvDDWZJ2HXm3VT3MXw7rbtBqHmRfuf krxcoTcOv+RSt1W01rMH/7+4gvMkmRujzpOvZNDdAXfagihkgiMXcVyI1s1p077jOgdUONxVnSY ZQDj6WaDjb54N59F7utSdWP55SS50aLvdeyjFap73yVnmbEJ X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-GUID: XI3E3d6Qk3mYvlsK0KEOcuvq7W-j_G01 X-Authority-Analysis: v=2.4 cv=T7OMT+KQ c=1 sm=1 tr=0 ts=67f3eb22 cx=c_pps a=UgVkIMxJMSkC9lv97toC5g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=XR8D0OoHHMoA:10 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=Cr31Tnr6-c0FpRDxqzMA:9 a=QEXdDO2ut3YA:10 a=1HOtulTD9v-eNWfpl4qZ:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-ORIG-GUID: XI3E3d6Qk3mYvlsK0KEOcuvq7W-j_G01 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-07_04,2025-04-03_03,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 mlxlogscore=999 lowpriorityscore=0 adultscore=0 phishscore=0 bulkscore=0 mlxscore=0 malwarescore=0 suspectscore=0 priorityscore=1501 spamscore=0 clxscore=1015 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2502280000 definitions=main-2504070105 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