From nobody Mon Feb 9 15:48:06 2026 Received: from mail-lf1-f49.google.com (mail-lf1-f49.google.com [209.85.167.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6D08B16D9C2 for ; Tue, 24 Dec 2024 23:10:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735081823; cv=none; b=igiDjaUOQDjhx4AombWyWZsCDCXAC+rP2Wm/rmYf2MgIK5kGvIgiSV8Ry+VD8gOxYa793VWbtoL5Lo7N/Js30wXuD9MYcCfzrSQ4IYRcosKJ3lb0jpZYH+vVFu/IDFLf4NmWfesi/vwVpm6GN9fdl6RBSZh416f2f9yCtZxLZjM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735081823; c=relaxed/simple; bh=zAP9ylKK8F/k8ADKJQaYiAs3G6twCNuwzluDDLOa0/w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hC2mSQFmuYxqq9S5ZHQtBGK5nSLJLSKY4HSbU5kDkYaX8RYDlQXKhOltZnGsdLgxb1qzWVLDMvn9EWeVNpGkJbS9EEwxECnQUIUo3//niOOTMYg3+RDhJ9Fgi79jyyYi+irnTOKufvd22xURzpd4l/8QEDBOqEO6yZ2BfOmbvtg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=x/Dct+2j; arc=none smtp.client-ip=209.85.167.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="x/Dct+2j" Received: by mail-lf1-f49.google.com with SMTP id 2adb3069b0e04-53f757134cdso6006912e87.2 for ; Tue, 24 Dec 2024 15:10:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1735081819; x=1735686619; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=gkEAYK8kPNECxsGkRJpsJ7xiXmTY2irxwmm/stUUQ/U=; b=x/Dct+2jS1ovln6Po6/i89SpASf6IFeDiH2RgSVC2924UC9pjcXZ0N/5920e9shfOs BNKG5xjSPiPk+9GeCq6BhgmRdFw1ueRGF62MAF5nyhqJZQR5BJ+KNZ7sze95V1yEjXem oJqNGDIV0XjwjHT7h1WfU80wBWIiHhxwiBcKw79nYlpV/zzN+xEdS8TERyIQh2SJJJQK jkuqwnavZgJgqmgiMAKP2KOnbrW9tSFoKDap6rHOK2kahcjdZHkRWpIhWv6TN0NqlqZv Rk7vp3bFKuD/J/SoeMy4Rve0uPzpzO2h7bSisQ5y3P0elBPs9ltc3JP1WokrG/rrgF7w g3Xg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735081819; x=1735686619; 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=gkEAYK8kPNECxsGkRJpsJ7xiXmTY2irxwmm/stUUQ/U=; b=HSTbpYt/Bwt9zCqaGme0MCDIanImdsk2r5PNO653/kggiV9yf80j5vxMv0klgtJguu g+ZVeyd/ERUeqBP0AwhyXGE7RH8z2JvUQGSBa8yereLeu51poah4Fo6hyXO/xU/v3MiR x83mOIZR8GV/mPe6BAMHcHxXcBNIAnBkeDmGXKg9+hCKpnMmfFa8DEILDMNqie2RD3gQ KQsJGBdMR5hEgjy2OSwi3CRmN9oVRux/kPwrKvesGIlLc+vua6TsF39PVl8USRTz0vCq ++UfKwpZ6uFz+xsSx2wsm3vk6Y74TD6Alz3qWqXCZ0CdqVuz5yBMMhqWbX8J4OtAVq9R v1Rg== X-Forwarded-Encrypted: i=1; AJvYcCULUH5B+rqaEhpaUHih+FKRu7i5QVT4nD6BVIAdACRrNPxfKT9R1lICzP3SUZ7HmQiFNpXdt+baAr2KcWY=@vger.kernel.org X-Gm-Message-State: AOJu0YwEYsBtD+fRTIRgJVnxUNgEE7F/cP9WcjI0bdh9hxQVdVA0yR4i 8R4JE6TYpxhxB2BjRh6k7GFCdVkUiuJjanLRxPQAA2OOXwSJDYHB8mGM7eSrCvQ= X-Gm-Gg: ASbGncvL7Qw899cv3RnAiheW8EorAE6R0zGjobidd/u9KoGrdOD3/sSHgNPE9Trocy/ YsE7uDnQA8Zjy/YK6RA/a7XXM2U2J68bIMsUEq3L+pLqmQRNaMXCnePoRoKtNKpW9znkriulCNl 8xAW5xkU1PjVuGraEMX5tHo9qNMA351g2u35ADsdQO2NYh22a+jW0NsLDqtMxRcnrzeiSupNKfS 0LoEO+tG0mkiQCl2+Sa+6B7YnJCrBk7AQso8k/iwOJ2OKtBa7pPMD9JlV99wRaA X-Google-Smtp-Source: AGHT+IEwyLXiTl6HwqZYINQzprUx9IZAjXK9evHUTV0H4dLVrHUyChVy+Pe58BeM4nIcvMJsFNUKTA== X-Received: by 2002:a05:6512:239b:b0:53e:44a4:34e0 with SMTP id 2adb3069b0e04-5422953306amr6782564e87.16.1735081819558; Tue, 24 Dec 2024 15:10:19 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-542235f5f74sm1721283e87.43.2024.12.24.15.10.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Dec 2024 15:10:18 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 25 Dec 2024 01:10:09 +0200 Subject: [PATCH RFC/RFT 1/9] 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: <20241225-drm-hdmi-connector-cec-v1-1-b80380c67221@linaro.org> References: <20241225-drm-hdmi-connector-cec-v1-0-b80380c67221@linaro.org> In-Reply-To: <20241225-drm-hdmi-connector-cec-v1-0-b80380c67221@linaro.org> 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 X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4628; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=zAP9ylKK8F/k8ADKJQaYiAs3G6twCNuwzluDDLOa0/w=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnaz9VkF4oX+7gjkZP8Y1yKMqgeZkKR90iM2yAs HhTV8Tw6NqJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ2s/VQAKCRCLPIo+Aiko 1XUoCACouGUa5oAtjD5GnC3gjruGwotvNm5gGr85SrA2/2pOOxq9l+xKlniMFWQJUctZSR4hwUw z0FsPogNoXzjPlpIbcOy8l0yL2OqeY67nIRTP+dn2BPL6hu7Z/p1WLqJ+hZ65DN/FCYC2Wd4TrW 5qY5PssSUpxywdZIow7P62xhJvUcMleK8wob+tB9b4ObCb6IjBJDEdT3+3+JBfXP5aV5CgwrEUP 3uN3u9K4Xu4JgIDHBR2y9E0wMjOkPr5X71LPX8QRkhXC+eSJdFyqEtx2tZzgUR34lPLW8ZGf8xL ygyhLgFERD3wYyQXapYukJPLcrwhdQLUDKmWmX83FUAxvjvc X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A As a preparation to adding HDMI CEC helper code, add CEC-related fields to the struct drm_connector. Include both cec_adapter and cec_notifier, allowing drivers to select which one to use. The unregister callback is provided to let drivers unregister CEC-related data in a generic way without polluting drm_connector.c with dependencies on the CEC functions. Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/drm_connector.c | 23 ++++++++++++++++++++++ include/drm/drm_connector.h | 43 +++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 66 insertions(+) diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connecto= r.c index 1383fa9fff9bcf31488453e209a36c6fe97be2f1..ef299733041e2c64bebd73c3fe2= 1d4492bc07d3a 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); @@ -698,6 +699,26 @@ static void drm_mode_remove(struct drm_connector *conn= ector, drm_mode_destroy(connector->dev, mode); } =20 +/** + * drm_connector_cec_unregister - clean up CEC registration + * @connector: connector to cleanup + * + * Reverse corresponding CEC registration. This function is supposed to be + * called only by bridge drivers which need to handle CEC manually. Normal= ly + * CEC adapter or notifier are automatically unregistered during drm_conne= ctor + * teardown. + */ +void drm_connector_cec_unregister(struct drm_connector *connector) +{ + mutex_lock(&connector->cec.mutex); + + if (connector->cec.unregister) + connector->cec.unregister(connector); + + mutex_unlock(&connector->cec.mutex); +} +EXPORT_SYMBOL(drm_connector_cec_unregister); + /** * drm_connector_cleanup - cleans up an initialised connector * @connector: connector to cleanup @@ -718,6 +739,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; diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index f13d597370a30dc1b14c630ee00145256052ba56..feecd02e7c698cc0c553b79048c= 9130f69121012 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -46,6 +46,7 @@ struct drm_property_blob; struct drm_printer; struct drm_privacy_screen; struct drm_edid; +struct cec_adapter; struct edid; struct hdmi_codec_daifmt; struct hdmi_codec_params; @@ -1832,6 +1833,41 @@ struct drm_connector_hdmi { } infoframes; }; =20 +/** + * struct drm_connector_cec - DRM Connector CEC-related structure + */ +struct drm_connector_cec { + /** + * @mutex: protects all CEC-related fields + */ + struct mutex mutex; + + /** + * @adap: CEC adapter corresponding to the DRM connector. + */ + struct cec_adapter *adapter; + + /** + * @notifier: CEC notifier corresponding to the DRM connector. + */ + struct cec_notifier *notifier; + + /** + * @adap_unregister: unregister CEC adapter / notifier. + * + * The callback to unregister CEC adapter or notifier, so that the core + * DRM layer doesn't depend on the CEC_CORE. + */ + void (*unregister)(struct drm_connector *connector); + + /** + * @uninit_cec_cb: teardown CEC adapter + * + * Perform additional tasks to teardown the CEC adapter. + */ + void (*uninit_cec)(struct drm_connector *connector); +}; + /** * struct drm_connector - central DRM connector control structure * @@ -2253,6 +2289,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) @@ -2294,6 +2335,8 @@ int drm_connector_attach_encoder(struct drm_connector= *connector, =20 void drm_connector_cleanup(struct drm_connector *connector); =20 +void drm_connector_cec_unregister(struct drm_connector *connector); + static inline unsigned int drm_connector_index(const struct drm_connector = *connector) { return connector->index; --=20 2.39.5 From nobody Mon Feb 9 15:48:06 2026 Received: from mail-lj1-f171.google.com (mail-lj1-f171.google.com [209.85.208.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EB1BF212D9D for ; Tue, 24 Dec 2024 23:10:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735081826; cv=none; b=GwZ/EMp9bYyx4pYdaPrkrXTTedCbL/IwazZSPHlU+C8Ln+wrE4h/8Qc8yxbCK1jMVhIX5jecYq4J4zt5hE5hIGeKBP4asfytPNTUpxCQsP80ArhHKDGpfQAH0GJ5PXIKow6n3iV+GMP0HkdjtQ+B60kQVQiYXYIhDUOgcMjdy1A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735081826; c=relaxed/simple; bh=TXbfNS4WNhmW98nls+Q/o0v6k1eUVeztIzkOAy5ZwIE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TE3fWnMEGAVx3CMo2YvbvEF3Ckrtrvr2Ibh1JMn6Yyy5UK7atJa2cfurXeVB3c6/i3c4Q7Xg3jsk5XW/rEKo2jsbWjuveCTp9ENPOQ/otEgsKRfFwCElyEBTV34MZgoFVIx2MvW0l8dI5BIUoCq8jHs/S16yw4tePFfPZ+JzF2o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=Bqp4mw2f; arc=none smtp.client-ip=209.85.208.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="Bqp4mw2f" Received: by mail-lj1-f171.google.com with SMTP id 38308e7fff4ca-3002c324e7eso59954491fa.3 for ; Tue, 24 Dec 2024 15:10:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1735081822; x=1735686622; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=KX9VHwXLWT0YXb/R/ow61sjiLOZURcf2NMX0NiYRIEM=; b=Bqp4mw2fPzJPtRaVxm8dkJo8SlGojGPrF19s+a+mymCyILu1R+tDvOWgHEfkvWFvuj PuBGfYov0m2JZCx5F7my7BJBX83pzRcOgyig89D339ZIqI5/6wLeGgSs1Th13FK5DJ1Y GCLAJ8PvxbuCxO+UjM+xh4FGebU316eT3AxocOmMRi5+R3sl7T1sLBWzByQ1YNuu4+RU cl8w2Srx/uK/++04gk0YEJyqhhTHR6pm4I31Bu5+ozLnQMUq4kV8JoAl0d6x7X8xSwlq F+0WmOK6jGTcG10XpeMMvbPh9Nz+tlI3JJUVrv+3oI+98wdpMtABnFj1p+mAB4zuQrbr Bt9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735081822; x=1735686622; 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=KX9VHwXLWT0YXb/R/ow61sjiLOZURcf2NMX0NiYRIEM=; b=nt2CYlAztNK6aKF+xH2GHdHlq5czckzXi3Oe7lshq7JA96Zv4VlO1pULQD8JzOp78h vTATQoMzIMQWtTxyQLZSHUfhz4f4hj1JJSnzUmMUAiUDNtDPzaVZE9clGs5JxfpptfCB mVHTY+gxY+3h9gSAzCq2WSUG3gtkeUNF9Y3f+GgG06dQhxFgJE+CYY3IBhkdiED78j8t 1y0XtoZJDUJIAXIJQtWpz/PMjT5rRXkQu/PY/WDwG0P0q38ioPSsjQfuj62j0yuhACpW iB0xRbMHKCeU18H32C20MbKhT+Tam5fvJLIYKgM7y7T/KT2f173h9QxOPBKvIRVYESvZ AGqQ== X-Forwarded-Encrypted: i=1; AJvYcCXWRfG7A2c6ZfExRxsIMZlbtJXCeg8wjW2oSuQyFghk7H4B+6yqXl6VqglJKwlbH+C0SgYdTPduxQ9kXcs=@vger.kernel.org X-Gm-Message-State: AOJu0Yweh/tvKOqX2/OztqXfgT8Oi0kJWfpn45eWF4B6kjEiNN1FA8sQ 4YetInbCBSpJ1metXbfwz/VTS9yVtUtT20G+XXVTxtAlDXiIB809ZKmavSytk/0= X-Gm-Gg: ASbGncst1vBSaO2Yjy/zksWO/kVZW9/ySSWK4M1h6JYocP8imJzZURj8MU6xu2+qw9J hkB9Fi2U6+xktEzl/2ViwgJhTCnWu7cL5d3G+TmTeuZstOBfCxUYkGM+rwuZQIqmWhONqkiHxYo 37SUzgtoImdsZd/nkOFQ8QrYFRIAZxz1laJ0dlNMGSc90fcFZ31XOi0G4Iy7w17CzQq41IkhUp/ bkzWyfzMfOQRYZDsGLD+AF7dylofevrbVYelC0beHkd3CtJQ3NOKezpaqOGbPEG X-Google-Smtp-Source: AGHT+IG972DXnJb1escms0CYD4KMALk35eIDWaRXFeinstt5fliin23jsUMKxcsnmxW5LlakxR0NMQ== X-Received: by 2002:a05:6512:3d16:b0:53e:ca48:776e with SMTP id 2adb3069b0e04-54229562a17mr6138588e87.36.1735081821954; Tue, 24 Dec 2024 15:10:21 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-542235f5f74sm1721283e87.43.2024.12.24.15.10.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Dec 2024 15:10:20 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 25 Dec 2024 01:10:10 +0200 Subject: [PATCH RFC/RFT 2/9] 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: <20241225-drm-hdmi-connector-cec-v1-2-b80380c67221@linaro.org> References: <20241225-drm-hdmi-connector-cec-v1-0-b80380c67221@linaro.org> In-Reply-To: <20241225-drm-hdmi-connector-cec-v1-0-b80380c67221@linaro.org> 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 X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=7698; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=TXbfNS4WNhmW98nls+Q/o0v6k1eUVeztIzkOAy5ZwIE=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnaz9VzbgIsXwGp4Xf8rPMw0gjWs+nKOS9ukA/L ma5Akr/5EWJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ2s/VQAKCRCLPIo+Aiko 1WpUB/9yAcMX4COUKb5mTuTykvEREiVKw8IKEoJLLJbNGnPsoXsO0WELpmQOU0ULFA5lP+J04wS 2YsT60IOP7OboojHe+pvH9LXKj2hSabm0efZJZBA2YyciRno0vfoUSwUF/2UPB2Hh+myDIHvA5H RWpkR6EeKCroYhXk+fT7CfghC2cg5qgM2+qBNXhtwEqH6K7n7recDcR63nxbly9MZp3ICdGJqvE 3kGu7WLrvmPRpKSCgHPh57zCkPy5rewL34dtl1dWRegtysd784AiP7eY/OA2iam1fWYwpl88s16 9Zn2VwYXyPnRRmFmJhfkmozesPCM3gcUSIuB5FbeeQgu9zTD X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A 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. Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/display/Kconfig | 5 + drivers/gpu/drm/display/Makefile | 2 + drivers/gpu/drm/display/drm_hdmi_cec_helper.c | 145 ++++++++++++++++++++++= ++++ include/drm/display/drm_hdmi_cec_helper.h | 38 +++++++ 4 files changed, 190 insertions(+) diff --git a/drivers/gpu/drm/display/Kconfig b/drivers/gpu/drm/display/Kcon= fig index 8d22b7627d41f7bc015decf24ae02a05bc00f055..49da9b768acf3e5f84f2cefae4b= b042cfd57a50c 100644 --- a/drivers/gpu/drm/display/Kconfig +++ b/drivers/gpu/drm/display/Kconfig @@ -82,6 +82,11 @@ 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_HELPER bool help diff --git a/drivers/gpu/drm/display/Makefile b/drivers/gpu/drm/display/Mak= efile index b17879b957d5401721396e247fa346387cf6c48a..2cd078e2b81c1a9e6b336c4187b= 444bcb8a50e51 100644 --- a/drivers/gpu/drm/display/Makefile +++ b/drivers/gpu/drm/display/Makefile @@ -16,6 +16,8 @@ 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_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..2a3832e68232fa3b839a3c7457b= 2013779cada86 --- /dev/null +++ b/drivers/gpu/drm/display/drm_hdmi_cec_helper.c @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright (c) 2024 Linaro Ltd + */ + +#include +#include +#include + +#include + +#include +#include + +static void drm_connector_hdmi_cec_adapter_unregister(struct drm_connector= *connector) +{ + cec_unregister_adapter(connector->cec.adapter); + connector->cec.adapter =3D NULL; + connector->cec.unregister =3D NULL; +} + +int drm_connector_hdmi_cec_adapter_register(struct drm_connector *connecto= r, + const struct cec_adap_ops *ops, + const char *name, + u8 available_las, + int (*init_cec)(struct drm_connector *connector), + void (*uninit_cec)(struct drm_connector *connector), + struct device *dev) +{ + struct cec_connector_info conn_info; + struct cec_adapter *cec_adap; + int ret; + + mutex_lock(&connector->cec.mutex); + + if (connector->cec.unregister) { + ret =3D -EBUSY; + goto err_unlock; + } + + cec_adap =3D cec_allocate_adapter(ops, connector, name, + CEC_CAP_DEFAULTS | CEC_CAP_CONNECTOR_INFO, + available_las); + ret =3D PTR_ERR_OR_ZERO(cec_adap); + if (ret < 0) + goto err_unlock; + + cec_fill_conn_info_from_drm(&conn_info, connector); + cec_s_conn_info(cec_adap, &conn_info); + + connector->cec.adapter =3D cec_adap; + + ret =3D init_cec(connector); + if (ret < 0) + goto err_delete_adapter; + + ret =3D cec_register_adapter(cec_adap, dev); + if (ret < 0) + goto err_delete_adapter; + + connector->cec.unregister =3D drm_connector_hdmi_cec_adapter_unregister; + connector->cec.uninit_cec =3D uninit_cec; + mutex_unlock(&connector->cec.mutex); + + return 0; + +err_delete_adapter: + cec_delete_adapter(cec_adap); + + connector->cec.adapter =3D NULL; + +err_unlock: + mutex_unlock(&connector->cec.mutex); + + return ret; +} +EXPORT_SYMBOL(drm_connector_hdmi_cec_adapter_register); + +static void drm_connector_hdmi_cec_notifier_unregister(struct drm_connecto= r *connector) +{ + cec_notifier_conn_unregister(connector->cec.notifier); + connector->cec.notifier =3D NULL; + connector->cec.unregister =3D NULL; +} + +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; + int ret; + + mutex_lock(&connector->cec.mutex); + + if (connector->cec.unregister) { + ret =3D -EBUSY; + goto err_unlock; + } + + cec_fill_conn_info_from_drm(&conn_info, connector); + + notifier =3D cec_notifier_conn_register(dev, port_name, &conn_info); + if (!notifier) { + ret =3D -ENOMEM; + goto err_unlock; + } + + connector->cec.notifier =3D notifier; + connector->cec.unregister =3D drm_connector_hdmi_cec_notifier_unregister; + + mutex_unlock(&connector->cec.mutex); + + return 0; + +err_unlock: + mutex_unlock(&connector->cec.mutex); + + return ret; +} +EXPORT_SYMBOL(drm_connector_hdmi_cec_notifier_register); + +void drm_connector_hdmi_cec_phys_addr_invalidate(struct drm_connector *con= nector) +{ + mutex_lock(&connector->cec.mutex); + + cec_phys_addr_invalidate(connector->cec.adapter); + cec_notifier_phys_addr_invalidate(connector->cec.notifier); + + mutex_unlock(&connector->cec.mutex); +} +EXPORT_SYMBOL(drm_connector_hdmi_cec_phys_addr_invalidate); + +void drm_connector_hdmi_cec_phys_addr_set(struct drm_connector *connector) +{ + mutex_lock(&connector->cec.mutex); + + cec_s_phys_addr(connector->cec.adapter, + connector->display_info.source_physical_address, false); + cec_notifier_set_phys_addr(connector->cec.notifier, + connector->display_info.source_physical_address); + + mutex_unlock(&connector->cec.mutex); +} +EXPORT_SYMBOL(drm_connector_hdmi_cec_phys_addr_set); 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..75e6476498a31a05af5a813f1df= 138e7786520be --- /dev/null +++ b/include/drm/display/drm_hdmi_cec_helper.h @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: MIT */ + +#ifndef DRM_DISPLAY_HDMI_CEC_HELPER +#define DRM_DISPLAY_HDMI_CEC_HELPER + +#include + +struct drm_connector; + +struct cec_adap_ops; +struct cec_adapter; +struct device; + +int drm_connector_hdmi_cec_adapter_register(struct drm_connector *connecto= r, + const struct cec_adap_ops *ops, + const char *name, + u8 available_las, + int (*init_cec)(struct drm_connector *connector), + void (*uninit_cec)(struct drm_connector *connector), + struct device *dev); + +int drm_connector_hdmi_cec_notifier_register(struct drm_connector *connect= or, + const char *port_name, + struct device *dev); + +/* + * These functions are used by the state helper, so we end up linking to t= he + * same module. Define stubs to simplify the code. + */ +#ifdef CONFIG_DRM_DISPLAY_HDMI_CEC_HELPER +void drm_connector_hdmi_cec_phys_addr_invalidate(struct drm_connector *con= nector); +void drm_connector_hdmi_cec_phys_addr_set(struct drm_connector *connector); +#else +static inline void drm_connector_hdmi_cec_phys_addr_invalidate(struct drm_= connector *connector) {} +static inline void drm_connector_hdmi_cec_phys_addr_set(struct drm_connect= or *connector) {} +#endif + +#endif --=20 2.39.5 From nobody Mon Feb 9 15:48:06 2026 Received: from mail-lf1-f54.google.com (mail-lf1-f54.google.com [209.85.167.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 87C3B21323D for ; Tue, 24 Dec 2024 23:10:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735081830; cv=none; b=eI579P5gOqQ1hQK+1i4mMA5JasBbsqzwQgNOwurE7cK9AvTE1ZTK6baK6kT0G7FruTDykyI1Th9b7c4Uagey3/F//6+1pZYpZBb+y8mJQuDC0x0emjJN3Frr2V3COTqVq12OwBGGv/kDhDbfBr8IYDRniC+F9eTO5zIG21AbTic= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735081830; c=relaxed/simple; bh=j8/VCHgmb1raNVFOKXZe7b5PFQfOvnrzhw7RbdPY+gs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VB9dzvJaYFQOu7FSQjQf1VVj6wTF0FidRQRuW7J5EdWW2czpxPKIHGFBn5l1mAQxE1KDZNwSIuxk/dZ1Tc5WI7s/frL7wR5+nb0STF9YlEi+9ZJccIktthXYvDTm8+u/RGlxCOyw3u0xozsqssHpR2mhXXLzsnm+Sk1joOcsHQc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=bud6IB/n; arc=none smtp.client-ip=209.85.167.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="bud6IB/n" Received: by mail-lf1-f54.google.com with SMTP id 2adb3069b0e04-53e399e3310so6478354e87.1 for ; Tue, 24 Dec 2024 15:10:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1735081824; x=1735686624; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=+lCA58zl22vmnlxhnNGgCm+vw5K42PZ70YAVZOIIBqQ=; b=bud6IB/npGQYxQmtzJO5+paXA3ZDZfsRRF9N/qaMITZsNMeyjeavedCfSEGd8+1YvJ e42bTZAxo91MsYrNNLXKPH4YOmjSKZVgG/qEEyRcFOwD9p27h7S/KSk5Tpy+AYrqMrLt wGcb8j18iVLlzSEoA9zTMPldMDdSzc/ZvIctppHm65ltQpropPckQ1Be95EW45qReC76 x8VrVZdq2ndm7oxofRkgkYYN+AZ6kmfjGlMasqkwu48HebxJQXWItoaGLI0gbRlRTFOo Y11peWgi1hAqDXHk4MeLHl6ek8pmhpklVJpFuNijTzVNVdZXAuQI4B7YMAaqJ0ngivOt t+gg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735081824; x=1735686624; 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=+lCA58zl22vmnlxhnNGgCm+vw5K42PZ70YAVZOIIBqQ=; b=UL7IsmBcLvkW/nrXj/9ejTG8WR03w6B/E7dTd7krJd3TaM1iu5l8ozltR3oxGcEz2Z UnDT8FO8GfMBLWtgAvpOjrSTJrBvf+wZkcuYZcob7tr4btY7NmioD+lrseu+aKOV5cek ViTtHe1eK27cRUcwyOkR1/uWWJ0ABwP/WmPYiyXLSXs3hHWQ3YGfdBOOw9VM3e91z7yz wvYTzbKpv9KK11S60D9U4j3h1yeupFJr9BDjWsqlo8OZSAk07V4fvSiYMsXlgYGozBpn XPNOqMXmYNy+V0rn9dBb3ltLp+PqkePkTp6A55hWetuSQP75OTxyFR5Z3e34dgC+ys0/ X6wA== X-Forwarded-Encrypted: i=1; AJvYcCU3siPmbRqEbKtcL+/zYkUsBEWewY7EdI00FFCYFw0xAz9eJfGPpkCQkkpWKD3XkxZVjQZu+llkbUh5vZY=@vger.kernel.org X-Gm-Message-State: AOJu0YxBAWp1TxIMZFweTGopF6ySlpz3LCsoKFodNsZktYwY5ZbAORcb yOpgPRqQZkLnT6lDvKa510DHK7NdYVqUCRHSaQJZRsngWgLnh+qFjwjBfIJOvCU= X-Gm-Gg: ASbGncs/zDj0NEAX+r9rl47knBSuO6cLYT4yvLY+gSt+CzmlRoMbZYmrvQnJ3cejovP 5FkS0jZJhFXjmIFVQii7QalkAFRrdgZUQGWFPVqIa2lwd+3Z3l+TwvxobD8uI8QEIbEiEBo5VA0 wSSqRgPqubgvI09wA/KA8VjwxrozeRXJ/WHEg7CNoKkpHrgyR69a5UE8JWBOwQRAezEsWQp19Co bhppZWDcezP7enUVasVZL4DCvv4Scg31rXhxa9qCCQoMdzQl6HL93EoYufhkP/h X-Google-Smtp-Source: AGHT+IEqVd0zSQub31oV2g65K9x/pjyEkinx0KbkdvnnKPyCFsvSxarjDL/hYDMYWbVAGaCyIhNstA== X-Received: by 2002:a05:6512:3a90:b0:53e:3a73:6ddc with SMTP id 2adb3069b0e04-5422953c384mr5965630e87.33.1735081824409; Tue, 24 Dec 2024 15:10:24 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-542235f5f74sm1721283e87.43.2024.12.24.15.10.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Dec 2024 15:10:23 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 25 Dec 2024 01:10:11 +0200 Subject: [PATCH RFC/RFT 3/9] drm/display: hdmi-state-helper: handle CEC physicall 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: <20241225-drm-hdmi-connector-cec-v1-3-b80380c67221@linaro.org> References: <20241225-drm-hdmi-connector-cec-v1-0-b80380c67221@linaro.org> In-Reply-To: <20241225-drm-hdmi-connector-cec-v1-0-b80380c67221@linaro.org> 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 X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1748; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=j8/VCHgmb1raNVFOKXZe7b5PFQfOvnrzhw7RbdPY+gs=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnaz9V7pF8AmPHdoSaF6VBQtkkwzHsayf+rKMgP P+HfcDklDCJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ2s/VQAKCRCLPIo+Aiko 1S0pCACOQ4XE7VYVMUKjPFSrgvVqFk9iSmwZpK8Dtwv1Vy08pv5j1GB1fJC9MZhVRUd9KMjlJF1 wGd0R4RLFh6kJ0I0o1dWtmUwyh02bpZISXzErwCRlnJsW+i+cCO9WpN6aTvGd0Ry4gq/A+EK9n5 kP6n9tGPGZVNTx4akZwBFj8elQ3k+/DXRmtNfKevHmvfpETzPh3dvIyqV43jebnQnAvVhiifQB7 ttYx2pyDX6Jyc+/8h9dOyBTjONVQA2DR9ZlnYN34Lx+MN8LDk03d1kcXBA3h0qNv1Xnhe15k9Tg ks5YVeFi//+jfUz+he55nKsHSgYld+YXwYQ7AhvCYu5/yOv9 X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A Call HDMI CEC helpers in order to update physical address of the adapter. 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 cfc2aaee1da08a103cbf933c891d5cc31b0886a8..b060cc265221049f5509e852903= bd0a4ca651e80 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 @@ -786,8 +787,9 @@ drm_atomic_helper_connector_hdmi_update(struct drm_conn= ector *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_connector_hdmi_cec_phys_addr_invalidate(connector); } =20 if (connector->hdmi.funcs->read_edid) @@ -800,8 +802,9 @@ drm_atomic_helper_connector_hdmi_update(struct drm_conn= ector *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_hdmi_cec_phys_addr_set(connector); } } =20 --=20 2.39.5 From nobody Mon Feb 9 15:48:06 2026 Received: from mail-lj1-f172.google.com (mail-lj1-f172.google.com [209.85.208.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EF304213240 for ; Tue, 24 Dec 2024 23:10:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735081831; cv=none; b=oU5Tk5MbGoQDV/CZJ60s1iTovoAJKKmEK0kTpq9eNEsRzk77lhfLBoXkZk31ASNyr6kljZdA4pgPetBh+EDqNatS2WhGCem5JVkKSrG42QRFrMAcu+UdRMH4gy7el09JqFKeKl7kYsGFWn1pVw3VWzZXhBzk669tWRZtG6PSphk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735081831; c=relaxed/simple; bh=5qzeIIyAF5KQwVBCVNabcKuWk55QXl7IXd/PJzxgS7A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OHW6Eh9L2+8B3B9mnfaF+r1g2M+e/IpNFPF4ZpGlLg/NJXVVF7nJ8GCypFWjQQuc9yfPJtp9VQhOkYT0cUaR8Wf3Vt0hQiZrKKBTYnePJQVt3+tpG9zKGqLW5tKuVmhCVKRZIKXLsFV5jPqaBG7iF/6otpVXk2rq7cJG8ATPFzw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=sQwW0Y3A; arc=none smtp.client-ip=209.85.208.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="sQwW0Y3A" Received: by mail-lj1-f172.google.com with SMTP id 38308e7fff4ca-30227ccf803so64509681fa.2 for ; Tue, 24 Dec 2024 15:10:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1735081827; x=1735686627; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=S7U9m2UAtvR0vrRqhfic+TwuHs1eVqtQ6Xbp0YLelcE=; b=sQwW0Y3Av7+wrsdaMjbCWMHVFJz6h1dbrsgrUr5+MFUv0iU5wUqJwgw+hYQoTP1P2e 1bxatqj6OJ6ndkG6Po/RUsZcR9I/3xT2ffM0Uiz5Xkua0uB/ieCYrDcNOvxsqip53DSr tMIlO2W9CtUPQB+mEfcPDuX3e2h7l1IUNytq7bYE/1a6iBiidZn18NuKwjEEePouw8u9 o7WxWYtqy8GWve3RPT/44KsmXgHuo2REDPwSGI7I57uGa4KauUO1bTYLPiGqGRwTzZsU l9i/wLUJvmjYYXQB4IxkOn8CCtGGCvlg2nEilZ9+Nv8feW49K6jYj3MdmX/+yj9Mbdjk bxBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735081827; x=1735686627; 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=S7U9m2UAtvR0vrRqhfic+TwuHs1eVqtQ6Xbp0YLelcE=; b=cwSTQGy2F0GfmWcwDXIJ2FeX4iGhDhDhzLfn4W8efZMrrf7z1t2/hh6WeRKF+qSDWD +xqVtTqJcT6C3fFAyJosSZYA86WXyCaYVYRlWxF1JyT2euv2tZQPF10NCqgf+O5VVPK2 RugOaUeQDrLZsZXY9M3S+SL0cqGJdfVJr9g6h+BKeb7tEx5ItlPd+WNy0mayyLLJKSPB PjXX7NeEbrJZ8Y+gj/jYdtmPiGqbGxfEOPxZfYh/L2xS4oYwruVRc4O2hdOVI/fWjn2r 03ltT1A6FrVo2RmbLAIkBDNOrfZdkWNN5eQ3IMTkjlvGoTxtmL3Uew5Ht5Jaq4ucaCQd NFvA== X-Forwarded-Encrypted: i=1; AJvYcCVGsFVSlgaVeJIWqd1DB1HHmluVhqS/+jBBdTPCwmNWS+H3pTnprmDJUHQTHDQTc/ius33cOSt5weGG0rw=@vger.kernel.org X-Gm-Message-State: AOJu0Yw9ZUlUiK3MOlKhqfDYXEgrR+v4Cyc0xwGObetzpkj8uS2Vql5C Uy+SIFrYHk67FgUQZ+Jvk2Ui/IXLCpePzbNuLLPsXHSyhseybYUUr3XxQi5X+uE= X-Gm-Gg: ASbGncvF6Lz5P01smh0wscyUlVctb9gWZnC3K/SxltGTya+IDHtpNYuQC4ObyW/Wqfj XV7b4rZE1MkcUv0xoVz+b9Ipm+MrzAekbB/OQRrTbGPwZzwCkt4l2imjLmPQJarrvXrfl8W1BHj tV0HhakCcrGDulUvwWDaEpcJg7tj2MwYU0zmgH6hI/VDU7NZyCPQPhidQAQfg01G91Paha4DAYN sRvHAKC7FZbW5WMNKHS1kYEc/Xak46dEiD0HqfpiIvkUUu74AR6tX91s61DdL2O X-Google-Smtp-Source: AGHT+IHen8WkbHetDjZQUHCGpSfWfZ2iTSRPneMJChbm/PXpW+1mtg547OwR/8sNyzK9Lh4FmC+TOA== X-Received: by 2002:a05:6512:3f20:b0:540:1c8e:b3eb with SMTP id 2adb3069b0e04-54229561a02mr5987873e87.44.1735081826847; Tue, 24 Dec 2024 15:10:26 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-542235f5f74sm1721283e87.43.2024.12.24.15.10.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Dec 2024 15:10:25 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 25 Dec 2024 01:10:12 +0200 Subject: [PATCH RFC/RFT 4/9] 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: <20241225-drm-hdmi-connector-cec-v1-4-b80380c67221@linaro.org> References: <20241225-drm-hdmi-connector-cec-v1-0-b80380c67221@linaro.org> In-Reply-To: <20241225-drm-hdmi-connector-cec-v1-0-b80380c67221@linaro.org> 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 X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=8623; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=5qzeIIyAF5KQwVBCVNabcKuWk55QXl7IXd/PJzxgS7A=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnaz9V94IWHdtqnQ/XR0V2LAXDTDF6YL/gnHeH7 2vDr06yQQqJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ2s/VQAKCRCLPIo+Aiko 1Qd/B/4pOMGvhxbD5fGVxfcAFDZ86b5wCbg1KYCV7feH72+tNDtUUaE6GvGJiAfKdsgADhc7zr+ QfcErHhSE6hwtTtSFXpIF1gRZ8ZHAbzKJpjB5bJd4/94ZcH0kA5kGkHgYF21HLU7egiEg+NwprW WyeS36N6fkdBtW3+7Lz21pufyh8Yjw/jTTrWxwkEnGdfioRVkGi/FS3hbfPFDGaPSkDfYERe67m cE5hHfQ/9YlPFsl7WhHJU8ab8WEvCejUeLxXNCMuK7WEksnmuJPtTglBXu11Pv67CHtlMu+p5R4 WWuLmZDlAHQCEIB4iz4sU14sGJKF1PIHEl7LIH3JDOtNBamz X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A 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 --- drivers/gpu/drm/vc4/Kconfig | 1 + drivers/gpu/drm/vc4/vc4_hdmi.c | 92 ++++++++++++++++++++------------------= ---- drivers/gpu/drm/vc4/vc4_hdmi.h | 1 - 3 files changed, 44 insertions(+), 50 deletions(-) diff --git a/drivers/gpu/drm/vc4/Kconfig b/drivers/gpu/drm/vc4/Kconfig index 6cc7b7e6294a1bfa54137ca65296cd47e46b1e1e..360fbe755951cc40fecb4f9d643= a096a6cf92b8e 100644 --- a/drivers/gpu/drm/vc4/Kconfig +++ b/drivers/gpu/drm/vc4/Kconfig @@ -34,6 +34,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 47d9ada98430634cfd8c1e21c2a4d00d501bab7e..3086c2ad3bb2e8fafdc1f37ba98= 5aa5785d49f9a 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 @@ -400,16 +401,8 @@ static void vc4_hdmi_handle_hotplug(struct vc4_hdmi *v= c4_hdmi, * the lock for now. */ =20 - if (status =3D=3D connector_status_disconnected) { - cec_phys_addr_invalidate(vc4_hdmi->cec_adap); - return; - } - drm_atomic_helper_connector_hdmi_hotplug(connector, status); =20 - cec_s_phys_addr(vc4_hdmi->cec_adap, - connector->display_info.source_physical_address, false); - if (status !=3D connector_status_connected) return; =20 @@ -2388,7 +2381,7 @@ 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, + cec_received_msg(vc4_hdmi->connector.cec.adapter, &vc4_hdmi->cec_rx_msg); =20 return IRQ_HANDLED; @@ -2399,14 +2392,14 @@ 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, + cec_transmit_done(vc4_hdmi->connector.cec.adapter, 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, + cec_transmit_done(vc4_hdmi->connector.cec.adapter, CEC_TX_STATUS_NACK, 0, 2, 0, 0); } return IRQ_HANDLED; @@ -2566,7 +2559,8 @@ static irqreturn_t vc4_cec_irq_handler(int irq, void = *priv) =20 static int vc4_hdmi_cec_enable(struct cec_adapter *adap) { - struct vc4_hdmi *vc4_hdmi =3D cec_get_drvdata(adap); + struct drm_connector *connector =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; @@ -2633,7 +2627,8 @@ static int vc4_hdmi_cec_enable(struct cec_adapter *ad= ap) =20 static int vc4_hdmi_cec_disable(struct cec_adapter *adap) { - struct vc4_hdmi *vc4_hdmi =3D cec_get_drvdata(adap); + struct drm_connector *connector =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; @@ -2677,7 +2672,8 @@ static int vc4_hdmi_cec_adap_enable(struct cec_adapte= r *adap, bool enable) =20 static int vc4_hdmi_cec_adap_log_addr(struct cec_adapter *adap, u8 log_add= r) { - struct vc4_hdmi *vc4_hdmi =3D cec_get_drvdata(adap); + struct drm_connector *connector =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; @@ -2706,7 +2702,8 @@ static int vc4_hdmi_cec_adap_log_addr(struct cec_adap= ter *adap, u8 log_addr) static int vc4_hdmi_cec_adap_transmit(struct cec_adapter *adap, u8 attempt= s, u32 signal_free_time, struct cec_msg *msg) { - struct vc4_hdmi *vc4_hdmi =3D cec_get_drvdata(adap); + struct drm_connector *connector =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; @@ -2757,62 +2754,64 @@ static const struct cec_adap_ops vc4_hdmi_cec_adap_= ops =3D { =20 static void vc4_hdmi_cec_release(void *ptr) { - struct vc4_hdmi *vc4_hdmi =3D ptr; + struct drm_connector *connector =3D ptr; =20 - cec_unregister_adapter(vc4_hdmi->cec_adap); - vc4_hdmi->cec_adap =3D NULL; + drm_connector_cec_unregister(connector); } =20 -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); + return 0; +} + +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; + int ret; + + if (!of_property_present(dev->of_node, "interrupts")) { + dev_warn(dev, "'interrupts' DT property is missing, no CEC\n"); + return 0; + } + + ret =3D drm_connector_hdmi_cec_adapter_register(&vc4_hdmi->connector, + &vc4_hdmi_cec_adap_ops, + vc4_hdmi->variant->card_name, + 1, + vc4_hdmi_cec_init, + NULL, + &pdev->dev); if (ret < 0) - goto err_delete_cec_adap; + return ret; =20 /* * NOTE: Strictly speaking, we should probably use a DRM-managed @@ -2842,14 +2841,9 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hd= mi) return ret; =20 return 0; - -err_delete_cec_adap: - cec_delete_adapter(vc4_hdmi->cec_adap); - - return ret; } #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; } @@ -3271,7 +3265,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 e3d989ca302b72533c374dfa3fd0d5bd7fe64a82..5acbe27fb57659d02f32ca571dd= 3ded4a1a0d9dc 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.h +++ b/drivers/gpu/drm/vc4/vc4_hdmi.h @@ -146,7 +146,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 15:48:06 2026 Received: from mail-lf1-f51.google.com (mail-lf1-f51.google.com [209.85.167.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 48E3C21324F for ; Tue, 24 Dec 2024 23:10:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735081833; cv=none; b=lxzmE6CTLj5HTfmf/ZFF5GCoMof66wtJ3+YWSUhiNKZn1h1m4PRfyRVQsZrNFpF3G4rL11DlHNs3Q7/FYs91QZHM2Zk0P17xBjzphDHHIOts/R80E5z7IUlruWjTxT3YtjOPKYcSDWheYVt8ULf0HF8vOQ+ARFQDFwtbBcnAcUM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735081833; c=relaxed/simple; bh=bpU/QTzs/6e35Bs6BI4kFzNjxwYaRMD/cnt3/GPJ2Gc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CxNuD/x4ZABtIYMWRjfXdhFjxnEPAfd01Zw/vBCeDL4l0roy+1R9wqEwZvxvwuignSqEFfTnTaysxLUiQRBdaXSKWthvQam+ELMnxcrt+64Vq7XaSD8eiLa91anBNhvaSlaAm2f2EFUius7PKEh7tFTQCSjM5Ixk5CGK1K3Bdp4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=u4mLqKKC; arc=none smtp.client-ip=209.85.167.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="u4mLqKKC" Received: by mail-lf1-f51.google.com with SMTP id 2adb3069b0e04-53e3a90336eso5955911e87.3 for ; Tue, 24 Dec 2024 15:10:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1735081829; x=1735686629; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=r1EY0TAniKnLpFn4xNvyIctQ/nFp584TbFvXHwDHEIc=; b=u4mLqKKCIMPJ9OZWvdcSdyXxXT6lR9dyCaJLSnxsXxUj26EGBB0rqQLhBkPievf9Rm c7gNS0PMdUOZeNchcfLNB+0qJ/ea1W0BgNYpJA1Gx8rIz9yZdrX0NtfkNCD1mqIZ35Oe Vx6WF9hFtYfrOjK/WNEznfgZ/gMkdD3HQL/pZx7rk0IdRd1RzIl5C95Tu08QZeaiyoPU QSz0QnNV0NzXrM7VXay4U1tPGzBDTNTgTaXLXjD2C6jMBzdAf7VSE0rWN5MxPfWbl05K nitkSsVxtBVwEN43a76hg2FjfwcFQSpKNDjzRBFlvhodv8ljdetg9hn6bhkhqVQtIOhP Ga2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735081829; x=1735686629; 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=r1EY0TAniKnLpFn4xNvyIctQ/nFp584TbFvXHwDHEIc=; b=Yy9MuQGLIsmxcfEpiZGSok0/2Z1dDiHoyvsPylCuQKc95tBCnPoAuNkWm2N1arrV6v HxZBWIU/eqHmhRUluREhuPD5OB6Dpmxws0q/gs9F0i4HL0HMmVnCUq+Fq2oQ9bW8eRnH Sn8YoaB/4gekfYOmtprcr6kpSvc6eEINN9gL6nSFv7Og+ZlM5vkDuzTgY+KT5mYq099b B9lADNWVfoIpvN3oNmpngC4eh22qadFSCFeMrOsezpdKvdOnEKxj//kUn0MZsSInurS0 /setto9GJk50jY/vMq+qfZcOSCyMYklcpsaCU8x43lDt52qXm0gD2RaOHb+0mUXYEYYW J8VA== X-Forwarded-Encrypted: i=1; AJvYcCV+TL4hnEpeAfZdq96765ChLNlpTX4wqNYFxltbP5GQe5yMezfyKI75B54sYApeOt53k+mw2abcZkRRDIQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yz3/qiVX5PEUAXKkA1Zr1kfBhxElsgavxwbFB27PzfpAuc7rW3i M575fDC+2OtPiLFFbsmx/jSr+MOe5LhOz293twaysvHGPKnHG9eAVt5BKDgewMY= X-Gm-Gg: ASbGncvMmH2jwY6kf6r4ltMB5p+A/BiNOEztXZQKWV7WUjbtoPz0wPUxkpPPFeagzar HgBBOtxzeTFYfYir1zee/OGXprPLAWNOPIt0gZ0vT25X19G0O7gB2zQnq5wCmJJSuuRPIbJHB4B 3Yz89+13twEw94ekZ1PeVDjM/G0T1AfD2gtXBHa2MnoGKB3AexHRy1V1rkVBic/WMOxM5lncnLG 6G3e8w5HcNifA7s4fJrQVAPKM+oB7eRVfr0JMzCBoTvD2rkl3rc5YyGW6Cx69Gn X-Google-Smtp-Source: AGHT+IEhSnvY1Lvr+9QANPt7qjpETgM45/cQFbDwGgyPmxoRhRX07yjNQMX95QCriBppU0wUr6ahEA== X-Received: by 2002:a05:6512:6411:b0:542:29a8:e8c7 with SMTP id 2adb3069b0e04-54229a8edcemr6282315e87.3.1735081829327; Tue, 24 Dec 2024 15:10:29 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-542235f5f74sm1721283e87.43.2024.12.24.15.10.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Dec 2024 15:10:27 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 25 Dec 2024 01:10:13 +0200 Subject: [PATCH RFC/RFT 5/9] drm/vc4: hdmi: drop separate CEC unregistration 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: <20241225-drm-hdmi-connector-cec-v1-5-b80380c67221@linaro.org> References: <20241225-drm-hdmi-connector-cec-v1-0-b80380c67221@linaro.org> In-Reply-To: <20241225-drm-hdmi-connector-cec-v1-0-b80380c67221@linaro.org> 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 X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3327; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=bpU/QTzs/6e35Bs6BI4kFzNjxwYaRMD/cnt3/GPJ2Gc=; b=owGbwMvMwMXYbdNlx6SpcZXxtFoSQ3q2fWhpzI+yzW89hZV2uz5qz/xw+5u+yrIJn75LxgcF3 U4/6LCuk9GYhYGRi0FWTJHFp6Blasym5LAPO6bWwwxiZQKZwsDFKQAT+XyN/Z+VcF/BYY0t5Rre a57rHwxZsEp5yYupEcHHj4nent/NHdIaqsT9fl3bqYjbB4r4nGIeWjBEW9zQdorKOptrw7XVYFv ltry/6Y7B9zvuL+142RlQWeb/4vX/IDfzq+FXFbQbj3QuecP/5FiH57ON+ftvGy7p0+3l6hZYa/ zz+CO2902zmFeaT1vkt25hyIM2zjupQVNtts8RPCZToGtZ7lRZw/qEv0XeVjrUtMOfTeq3XklT7 LbnL9Vyeduj9bSunwi0tg/QOLH64jW5Jba9h1pnCOq5ep9fb2zXG39XNWzaLG8Ls+55y3OVZFwn T2PfeZypwMhGzSxJndVdNjde6VHDMwfHr3nzQlKTIrYBAA== X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A CEC adapter functions are protected by drm_dev_enter() / _exit(), so it is safe to keep CEC registered until DRM device is being torn down. Drop custom CEC unsregistration code and rely on the DRM core to unregister CEC adapter. Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/vc4/vc4_hdmi.c | 53 ++++++--------------------------------= ---- 1 file changed, 7 insertions(+), 46 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 3086c2ad3bb2e8fafdc1f37ba985aa5785d49f9a..7b39000369e50f5368384575aa8= 1919df5a7133c 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -2752,13 +2752,6 @@ static const struct cec_adap_ops vc4_hdmi_cec_adap_o= ps =3D { .adap_transmit =3D vc4_hdmi_cec_adap_transmit, }; =20 -static void vc4_hdmi_cec_release(void *ptr) -{ - struct drm_connector *connector =3D ptr; - - drm_connector_cec_unregister(connector); -} - static int vc4_hdmi_cec_init(struct drm_connector *connector) { struct vc4_hdmi *vc4_hdmi =3D connector_to_vc4_hdmi(connector); @@ -2796,51 +2789,19 @@ static int vc4_hdmi_cec_register(struct vc4_hdmi *v= c4_hdmi) { 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; } =20 - ret =3D drm_connector_hdmi_cec_adapter_register(&vc4_hdmi->connector, - &vc4_hdmi_cec_adap_ops, - vc4_hdmi->variant->card_name, - 1, - vc4_hdmi_cec_init, - NULL, - &pdev->dev); - if (ret < 0) - return ret; - - /* - * 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. - * - * 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 - * case, our vc4_hdmi structure will be freed, but the - * cec_adapter structure will have a dangling pointer to what - * used to be our HDMI controller. If we get a CEC call at that - * moment, we could end up with a use-after-free. Fortunately, - * 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; + return drm_connector_hdmi_cec_adapter_register(&vc4_hdmi->connector, + &vc4_hdmi_cec_adap_ops, + vc4_hdmi->variant->card_name, + 1, + vc4_hdmi_cec_init, + NULL, + &pdev->dev); } #else static int vc4_hdmi_cec_register(struct vc4_hdmi *vc4_hdmi) --=20 2.39.5 From nobody Mon Feb 9 15:48:06 2026 Received: from mail-lj1-f174.google.com (mail-lj1-f174.google.com [209.85.208.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B838C2135AF for ; Tue, 24 Dec 2024 23:10:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735081835; cv=none; b=SgbutzLi4frkDkG8IBc9xYcbI/wqT54XrTXuE9ymDMlAaFcMWLfTGe7T8pgv4N3Yt43Bia7gS7cwOu1qqERs9o/uDf3efLQFARdCFyoK9i0nIXIL7HawyCMU5iAVt3lbfnJufpAxmAhFC+PDMxWEp/1NJmbc794nM7MRhZG6umg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735081835; c=relaxed/simple; bh=90ejgcy/tGTeJU3XG+cQM6w/AiRHbpg85t5Qz6ihKHQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EAn8aVZcqiwzitPN6kPnPcWURgrlz2vB0qUM93iJ5ZYZAbjbjiJERYQBMrkpDaITxBZX6S2xP2nd70SbQuqvj0EhQ8ZooLf28ks573/eZJBKjG5S2A4XQ92afmdxORI+W7cqBRtznmUd2Ja5DCnpyZeXfdpKQ0eQnHBN4W2Tfgk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=ds39bzwP; arc=none smtp.client-ip=209.85.208.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="ds39bzwP" Received: by mail-lj1-f174.google.com with SMTP id 38308e7fff4ca-303548a933aso44976501fa.3 for ; Tue, 24 Dec 2024 15:10:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1735081832; x=1735686632; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=/r+u0sZE5D8VurlC5VRIQEwPG+dElpWFh3HNgGqIo1o=; b=ds39bzwPsqrBkC+SOPWAzymZhl+fElkK2XhmaDeyIf/p46QIsLylRvP1kIQcHHkXa1 V6DmM6Ddclx+RjxYVtDfQcoWsYfbLKxRhdsTleyhI5kMemSwpZgux+oQL5G+mW8EbWmb nwdEvdlb4Tiw+VSe/x8MfISlDAjL7xOvhts8jqiEO9WrO+RavkFDR2rbFcEeLqHGn/AO Cen8VkBpAtf3BzIdibGhEcOMvviv7nH81DZqYgVdAUFo1vkRg6TfD/vhaK2qr6xMAJ3m m/+1Kw8SWYNnz1OR9eDRtUshv/fTW2CnQADAf6b2W1RNVwPdFTGxJA+4rYtra5FCkLSi +B5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735081832; x=1735686632; 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=/r+u0sZE5D8VurlC5VRIQEwPG+dElpWFh3HNgGqIo1o=; b=C2WAzgtUPx9UUIsnn7k+ewZZcp+Jd5bYF+VqkcD9Z3DmF/DGeQc/WALlieVZg3L/4X Tud6wy8Z1UqjzDgmDrP9G+yPXEB0nQuVHxh3epxdr+fmIxGtAUhqcDAmj6FFmRdSBYQc x++8uXRb+Vzfa6D9ZJYPs4EbItuZ3HasTcxsHmH9Rwx59xiwP2205+373lJHIVnSMMqo 8hNwHLy5mQ5myC9/dfd03peBoAfbAbGc6zJJAmX97aGswkioeff5/6LDrkdWp5xbuNxH 88DXwDGT2NQh8OBIw3HCoqHYWZu/1q6NZ0Fe9i2fOts+iwkv3JkdA6KaoP89M0lFtrkX jaYA== X-Forwarded-Encrypted: i=1; AJvYcCUZkQPVP82ToVzRk4U68PR0C+hyTzZpagynQoO6rjPT6++RgXMP7lowd9DszB2i7y7JxN4pKwkPU8U1U30=@vger.kernel.org X-Gm-Message-State: AOJu0Yx6E/kPOmHvvi1xkyQKY7tafnuf9kd+oQnpfDMMDeM9avmL18hN fxUj1f2OzqvHXl1tShGS5Tm9xyV9zagS84Kxk7UjhRjRf3tcYMPzqqzdRrl6ySc= X-Gm-Gg: ASbGncuw9yuX4hUlvdn2RexIVvnbbynojXRClK5gtqd+sfF2hutWv9e0bVKfgOWDoOD O4845zKBgUtmWnzF23jaVgNsBnWe8fafG4lKJmzQoOpdHRABANTGXLHZ4c0C30WPjDhb6YlEbP5 G/+pbpT7AzWJLQQ+bCA2BqxkerFZZdliv5TM8Exxa0o2Ws2FjNFDSCS4TraQbvN9WLkDVxFm//e SvKWjO8IxXmXXBq5p1PeSgkt0bEBKL+j1w9bovd81d5trZ83TWw5FGpRhla9AvV X-Google-Smtp-Source: AGHT+IGjrUB2TLrzUQREEAc+sh0JQA205RIs49HjA/2I8kEtZbGCHfFtOhnbPSuud5zG5HU9ctH4Wg== X-Received: by 2002:a05:6512:3f0d:b0:540:358d:d9b5 with SMTP id 2adb3069b0e04-542294ae2e9mr5758211e87.0.1735081831786; Tue, 24 Dec 2024 15:10:31 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-542235f5f74sm1721283e87.43.2024.12.24.15.10.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Dec 2024 15:10:30 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 25 Dec 2024 01:10:14 +0200 Subject: [PATCH RFC/RFT 6/9] 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: <20241225-drm-hdmi-connector-cec-v1-6-b80380c67221@linaro.org> References: <20241225-drm-hdmi-connector-cec-v1-0-b80380c67221@linaro.org> In-Reply-To: <20241225-drm-hdmi-connector-cec-v1-0-b80380c67221@linaro.org> 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 X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4084; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=90ejgcy/tGTeJU3XG+cQM6w/AiRHbpg85t5Qz6ihKHQ=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnaz9W9t2brPmk3nz0O8zZEEUvpaYxz558zo7IB EI4VTfwLoqJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ2s/VgAKCRCLPIo+Aiko 1XR3B/93XfwazjnkzjUluIQWuNP9h20/xSLWiT2KkQvFMkqFAKZl7sZlhjifLwUl2MZmr5AEEL3 L8tbeBq8BCfg4VBQpUQAAuRudKXxW1tR+i1CMUTLwXsBOa7//5ROpwTD/mCRf08JdN41ldhQ3O7 m1WEVTps/Hq4l/NCD3dScYOHgWk9+yL0RJ7EaWWeO3wJhAmuDehNEcHjiP0Iy5DpyxNeSRrNzFd +P09EG4eTy9xsaQyPJrylcXpYrTrebv+3xReXzQBvNUv+KA0lZkLbh/PSjUYzXncj3UR5mXuN70 dU3h/5S0IE0oGZcH8i2ZzjLG8kOlyzsk1rZM8/lugPxohmXz X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A 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 --- drivers/gpu/drm/bridge/lontium-lt9611.c | 2 +- drivers/gpu/drm/display/Kconfig | 1 + drivers/gpu/drm/display/drm_bridge_connector.c | 11 ++++++++++- include/drm/drm_bridge.h | 9 +++++++-- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/bridge/lontium-lt9611.c b/drivers/gpu/drm/brid= ge/lontium-lt9611.c index e650cd83fc8d880012edb8a85c69b2f1d378f64c..41156aee5d9f1ecd7bd3f0aeb86= 6487325063c11 100644 --- a/drivers/gpu/drm/bridge/lontium-lt9611.c +++ b/drivers/gpu/drm/bridge/lontium-lt9611.c @@ -1138,7 +1138,7 @@ static int lt9611_probe(struct i2c_client *client) lt9611->bridge.type =3D DRM_MODE_CONNECTOR_HDMIA; lt9611->bridge.vendor =3D "Lontium"; lt9611->bridge.product =3D "LT9611"; - lt9611->bridge.hdmi_audio_dev =3D dev; + lt9611->bridge.hdmi_dev =3D dev; lt9611->bridge.hdmi_audio_max_i2s_playback_channels =3D 8; lt9611->bridge.hdmi_audio_dai_port =3D 2; =20 diff --git a/drivers/gpu/drm/display/Kconfig b/drivers/gpu/drm/display/Kcon= fig index 49da9b768acf3e5f84f2cefae4bb042cfd57a50c..d35d945a3811c30247a9f3e282a= 16c9eedd0d4e9 100644 --- a/drivers/gpu/drm/display/Kconfig +++ b/drivers/gpu/drm/display/Kconfig @@ -16,6 +16,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 e53f01681b795c41879167d066d382952bf50bce..291abb4bcfefd12e1a57a22ba5c= cce21c15196a4 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 @@ -616,7 +617,7 @@ struct drm_connector *drm_bridge_connector_init(struct = drm_device *drm, return ERR_PTR(-EINVAL); =20 ret =3D drm_connector_hdmi_audio_init(connector, - bridge->hdmi_audio_dev, + bridge->hdmi_dev, &drm_bridge_connector_hdmi_audio_funcs, bridge->hdmi_audio_max_i2s_playback_channels, bridge->hdmi_audio_spdif_playback, @@ -624,6 +625,14 @@ struct drm_connector *drm_bridge_connector_init(struct= drm_device *drm, if (ret) return ERR_PTR(ret); } + + if (bridge->hdmi_cec_notifier) { + ret =3D drm_connector_hdmi_cec_notifier_register(connector, + NULL, + bridge->hdmi_dev); + if (ret) + return ERR_PTR(ret); + } } else { ret =3D drmm_connector_init(drm, connector, &drm_bridge_connector_funcs, diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index 4b84faf14e368310dd20aa964e8178ec80aa6fa7..1f1670e3c6aac39b8b891b0d5e7= e91254eb0d3a1 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -914,9 +914,9 @@ struct drm_bridge { unsigned int max_bpc; =20 /** - * @hdmi_audio_dev: device to be used as a parent for the HDMI Codec + * @hdmi_dev: device to be used as a parent for the HDMI Codec */ - struct device *hdmi_audio_dev; + struct device *hdmi_dev; =20 /** * @hdmi_audio_max_i2s_playback_channels: maximum number of playback @@ -933,6 +933,11 @@ struct drm_bridge { * @hdmi_audio_dai_port: sound DAI port, -1 if it is not enabled */ int hdmi_audio_dai_port; + + /** + * @hdmi_cec_notifier: use this bridge to register a CEC notifier + */ + bool hdmi_cec_notifier; }; =20 static inline struct drm_bridge * --=20 2.39.5 From nobody Mon Feb 9 15:48:06 2026 Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2334A2135CD for ; Tue, 24 Dec 2024 23:10:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735081837; cv=none; b=h/1YC3sKXq4gh6j9wnF52uSO3FiPU9CAALNjAdlsKyokiyPIzA/LPHeLE67igUXVqyXCtTm+OTxy59cwKf9Cpr4vhNgliH0kJZS5th3MWiz9ynVrkkPqxG5qt283Fnvvq3aGTIy4w4+riFFH4sfXRrRDDAVTa9s3emrFwKOMQP4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735081837; c=relaxed/simple; bh=Bh587iD2fc71HoCxezk2yuAVtboO7fHMro855SCGYPU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gbylcQN92aGu6iRqdWH8ix8PWZNQd8xowdWBSyTFiBPoAQNlHrj8I28PJYfiJqwaECRDy/U+HKzhYPCiEoqPUkvgj5HNXCIq/kOtMl4yVEJZH/JH943FU/sL5aieQDlbAT0E+Pp3KuMvpq2mpGw4/WY770ygW2hwQQR7Au/k+78= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=xmONXGdL; arc=none smtp.client-ip=209.85.167.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="xmONXGdL" Received: by mail-lf1-f48.google.com with SMTP id 2adb3069b0e04-5401c52000fso5578659e87.2 for ; Tue, 24 Dec 2024 15:10:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1735081834; x=1735686634; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=efhfp+4qW1iSmQeuDMr+e/8ImYQLWTnZeSHC6Pg4yQI=; b=xmONXGdLC8OYLS7C/8ZDXO1mfP1SZNfJBz8O3rgOWyAa1ZGYC7vfhb/NRdRsHUD+a/ ZblABimEFA45WlRdp60xtlDw7bIBffLkBPaufmdrzj6ORJ5H7fCNqGQcgdfoDRz6RyEO vMOddhMEtTVI5gaTDb9GgOOFeNGXeIfsybexcuf0yhuu+S7HjkmoFyRBWkrhGgOAwuSJ KyEVNJsvTExtEi91VcfS48tE57GpsbRNyuegzFPyfRqpkdkd235Hz2tZN8a5WFsn7BBx xfRaFCcAQ0/g1hg9d/+SJ9xCpRwNJ+xKwuxR4WSxaXdQcUsjlmeE8u5F6gmkughjdZi5 pNLA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735081834; x=1735686634; 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=efhfp+4qW1iSmQeuDMr+e/8ImYQLWTnZeSHC6Pg4yQI=; b=H9LPHrAoKyjZal90/37VxlLYM5j4Ji3jlb46iyzpmXJKOeHgRKkMp66Oa10kS4ItvD vQU61vlSAzEB0FasqVmjUb/KkNOz0dffuOoB3BA/+QHQJiFdXbUWcd8MxcxVZWckwC9n uWcyAlxj73V/AykCYLL7tapCytF/xae04hk+BSdnifij55Kf+WXKy35OEtbu9i9PTo9Y kcqkm2BgaP7goyLCY66xyaGFrIFs7OHjJwFSsjtgX8R6Itx8rYxJI698inCpiIPHszKh 8Y1Da6VkByarxGJDm8GS+FfGVjuDAjTfTdalPW7eHY8WI4VuYFNWyI3az5v9+t/WkJVB fnGw== X-Forwarded-Encrypted: i=1; AJvYcCVXCblYMFM/lE8uTziyvCKtfU8iJoXRTlCmIFTHCFrSyG8LZ/GMXrVWQtfPl/NpV5zudVWK+yIHgbexcYU=@vger.kernel.org X-Gm-Message-State: AOJu0YzAG0rAQlqwQnFzgJnHYHqyW1iOjJYmNP5ADRmbUFQrdW+nlnle kt8Z7Jxez4aURB2kqD51k1RNnDA2xvT/dxE0QrBPdwjoNUSLHB+VrGaSFV7gMI0= X-Gm-Gg: ASbGncvGMgapty4dLHB+vn9Duys6prOFkOdnBY401q0bFNEOIEsZTtMx7FpY+jbVHBs x+gwlIJ5ukPkfWFkkGv8eS7SjDM/IrwSffOldOWbDFLhQb/f9ODnAyiWI82GvVeh3fTf5IrExxf BAsQ0WoMZW4m/7cJvRPR8VyCKRujRD8ulUOaFp82lx55wyXc92bHLrd1RxOKGuii+bRHAMLDYnQ PDO7G7s34S7Ni/6sMnI/+cgFWS76Evc20MRdJhV1vgHUFKZ8Gjnk43M42BujQPu X-Google-Smtp-Source: AGHT+IEhaltbYVeYVnWcTZEGij7INLhjOGoVthIuxjQxvZSLrBa/jDt55eu9hG868SnM0PHocdwMyg== X-Received: by 2002:a05:6512:438b:b0:542:2999:2e43 with SMTP id 2adb3069b0e04-54229992e47mr6635799e87.24.1735081834230; Tue, 24 Dec 2024 15:10:34 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-542235f5f74sm1721283e87.43.2024.12.24.15.10.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Dec 2024 15:10:32 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 25 Dec 2024 01:10:15 +0200 Subject: [PATCH RFC/RFT 7/9] 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: <20241225-drm-hdmi-connector-cec-v1-7-b80380c67221@linaro.org> References: <20241225-drm-hdmi-connector-cec-v1-0-b80380c67221@linaro.org> In-Reply-To: <20241225-drm-hdmi-connector-cec-v1-0-b80380c67221@linaro.org> 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 X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1860; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=Bh587iD2fc71HoCxezk2yuAVtboO7fHMro855SCGYPU=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnaz9WxA+sQ8KjJROIrN1f0Hf4EKmOFjAonnPpL YW1LIJq3eCJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ2s/VgAKCRCLPIo+Aiko 1YOtCACyMIuozXLT74TZyjuf318MVOI0LGrevexAAORnXjfKs4jVI5zj0NBxle/Q4OYEKgCL+ia 3sMwKNg495laf8mJGOrgC2iOJ4gjvwTLxApO2F12iPsOsjHBezwr/pYup2f37ktYIKXflBtnYRD K2Bz6u6XGiaVcQR31TH6W2vBjt2g0HRGslOg66IlgR1noYnKJNa16r2kMfAYNUHpDnTv19cZAnB 2oAyJZrMkcuEUA7YvjUkXm665gFMrRIY66sLOgvVpvcMFM6QxvTjyuhxAQuyGemdbjim3AhlQ+a 4FxPKxOKY0nfJwfrDz+sDqVs+/SL3UaeL3JVz8yGvinz41vj X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A 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. 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 1f1670e3c6aac39b8b891b0d5e7e91254eb0d3a1..348778f233b06265a6ae577762c= 6558e69cdb396 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -872,21 +872,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 @@ -938,6 +923,22 @@ struct drm_bridge { * @hdmi_cec_notifier: use this bridge to register a CEC notifier */ bool hdmi_cec_notifier; + + /** 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 15:48:06 2026 Received: from mail-lf1-f44.google.com (mail-lf1-f44.google.com [209.85.167.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6B41C2139A4 for ; Tue, 24 Dec 2024 23:10:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735081840; cv=none; b=k/g31/acQNTU015jVMtIupDevTeJOc/OaGHY3lmogbq17drsNkqmCq2kYk2787l+uAfwV/uj1AoNlDUMjCxJn0qIkVl9EJjot8z1LoLe2U7eu8fao75cArVCa0vHNU9tC3y/lSJ6iNS8PLfgv+y4b29kq28+75+ZB7aqJOPpxDo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735081840; c=relaxed/simple; bh=7t8N+meJkwqjJEAn7i1o2Y6T8jyDOQeiyIXpOu8i+xc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nfaubJHsAKJRjNwfpWzwNbKtFIsWoP6u0+mAYrhB6mTy/l2wyVSxwpbyYRw2DPD8BH9TiCEHmTEndtYz8uXAo1qSFQ98NMFeS8R4SSSBebLh+kSKreFnHScJijubh9mjMce0g0N2aJP/bNjy3FVZRoA8PXWMW4qsJh/KAa3xSv0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=HyRdNpTq; arc=none smtp.client-ip=209.85.167.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="HyRdNpTq" Received: by mail-lf1-f44.google.com with SMTP id 2adb3069b0e04-53e384e3481so5067322e87.2 for ; Tue, 24 Dec 2024 15:10:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1735081837; x=1735686637; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=BCaN0AnQNgYbXUjxYsj4Dfl7LjnUIb+yQn6Obl4zIV0=; b=HyRdNpTqarLNKHsqQc3BX3rsSR4dmd6quwpdU/+DDELISneJVEM+kAUbdUbZt9rxk+ B46bSmJA6EnqjUFN6vPmsFSpPNoGLI64ycrmGVmbzuwxlk/jPXFlFGqwgpnw+xNGxaie TtRbddosPqvdjgaGLU+9oXqjBMOvz9z7g08rshKJzMi+HbEpQ2viWzanSrIeoHPyZyMO A+1RJ8ktpKZOtWd04sEZpqaifYdFZ0psMec4xgVsRElW784DgMnRDI39kTiqDrYbDKDZ uq5M0GznmoCQq5ccT7JncK6jZEVUKsxL4YoFgxCCUleY2P1E3g6JY8R1mX1VLIqQmIw2 3MTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735081837; x=1735686637; 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=BCaN0AnQNgYbXUjxYsj4Dfl7LjnUIb+yQn6Obl4zIV0=; b=WuVU+JZVh853zK0z2SRtSSF/FYT5TUk2I/scmf4GDATt1ATAWvKgI09yJJkUbFpdwQ gp9HVub2njy6mOSq18IxKtniYcNV5M0IJjXRNczI08MP7SBAJTKNar/m7wBqUBop8BsY ZynFMuZyraFmpozTYHNP4LxqHEH2xH2VpasKFiEbZGMubDvvQmb5XGoz3a6efwKzm3y3 lg0hZgG5SqmM+wIEHAWZcPnPuyFPUUE58QSywHR8j4UikAfXQyR3jbghw1OI1GbPUhC8 eToe2FDJYaT3BAJD8C1D+Nd9G14kQ8glBx+ugR7CiO57h6DH6wWDgDR7Qv+242Va+emR U95g== X-Forwarded-Encrypted: i=1; AJvYcCWWNlkz7DuSh5tgwHuqAdGFD/U+uQ80c7KIqlFHzJ9nj2CbM4Hxi1OWmSOjN+cNAH9dTh4l0O561BCfcR0=@vger.kernel.org X-Gm-Message-State: AOJu0Yznr3y7kxH5VTN+tTdssFN4hDIYsjAUaWzSh4m1UXAgshNnAhrr Job1WxNmXNhx+m6DOoaE8oSN2IIUKMskTpZ9T7d6IqgNN9X4onLPU+i4u8xiVJQ= X-Gm-Gg: ASbGnctGeIrYqNdpdJP1ZavnOrKZsyJJfQJysugKOLNR6/QpxRGc2YFbEe6g6RreS/J Ahcm/rOgsnB4f3ybndy4NoXQrCLtq7uM2nUgBC2sxqupSuBdVLLdFaOIOtWQzFBwUkKEuV6OiQf P4ZHYrdcQ90zb/jxTTWv1eNbBpNqOvymEL+Bktv7j2REL1uNXq5V0G+Kp4jRmRAIMp4T3pcRdcU 9O9mDiYynOOVx20D5NaLG5QSmgOojO3Cy0Gf8OFVkhJWPE23fHcqr4pEaHLaty+ X-Google-Smtp-Source: AGHT+IFVrzVeCp6RMk6VBemfxzPgO1kh+EDDGjra7lj5L6m71WVsinWmKcRRmBsISaTMnTyHjGjfmg== X-Received: by 2002:a05:6512:114f:b0:540:1d37:e6e with SMTP id 2adb3069b0e04-542295434f9mr6247183e87.33.1735081836626; Tue, 24 Dec 2024 15:10:36 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-542235f5f74sm1721283e87.43.2024.12.24.15.10.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Dec 2024 15:10:35 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 25 Dec 2024 01:10:16 +0200 Subject: [PATCH RFC/RFT 8/9] drm/display: hdmi-cec-helper: add bridge-related functions 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: <20241225-drm-hdmi-connector-cec-v1-8-b80380c67221@linaro.org> References: <20241225-drm-hdmi-connector-cec-v1-0-b80380c67221@linaro.org> In-Reply-To: <20241225-drm-hdmi-connector-cec-v1-0-b80380c67221@linaro.org> 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 X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5683; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=7t8N+meJkwqjJEAn7i1o2Y6T8jyDOQeiyIXpOu8i+xc=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnaz9WGJm8rCdTIkETaImddvza2ifHFNozBK3UT klZZOM/+xyJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ2s/VgAKCRCLPIo+Aiko 1f6lB/0a1gIGKUgRbL2RzO61mKzyulTDa78dCT9iHzkTg/bYdyu3Pvk5DOWi76iM/XSrgAPZCZG 2JX4ueHs5bj8Gsh005sL5+fzjVFPBUTp8kpj0yxKiAzcGMW2dxFRyvXYRb7nkcv6Ur2nEQpmDQG 4hAlaCAFU3Vez1OhojmdYV2CZKk0nE8MNIni3GYkO28hW6/uAqdoJCyFhHEZ46Thkyu3XIKq5nG 1YDfkyJk6RVXJT+7LgIELQHvv6XcjJ3TG9PoyczfKTGdzdyH2S/35u7+Bbwior3oiDUYnKw8LSA Fqw6W3za7slpt5/OL00DyPgB+l/uuQ3vHGdmBOJWqWIg6AWF X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A Let drm_bridge drivers handle CEC adapters in a generic way. Add a set of helper functions to be called by DRM bridge drivers to report CEC message-related events. Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/display/drm_hdmi_cec_helper.c | 37 +++++++++++++++++++++++= ++++ drivers/gpu/drm/drm_bridge.c | 16 ++++++++++++ include/drm/display/drm_hdmi_cec_helper.h | 10 ++++++++ include/drm/drm_bridge.h | 13 ++++++++++ 4 files changed, 76 insertions(+) diff --git a/drivers/gpu/drm/display/drm_hdmi_cec_helper.c b/drivers/gpu/dr= m/display/drm_hdmi_cec_helper.c index 2a3832e68232fa3b839a3c7457b2013779cada86..f54142c6b656b0708e60b009c21= ee7584c79a130 100644 --- a/drivers/gpu/drm/display/drm_hdmi_cec_helper.c +++ b/drivers/gpu/drm/display/drm_hdmi_cec_helper.c @@ -143,3 +143,40 @@ void drm_connector_hdmi_cec_phys_addr_set(struct drm_c= onnector *connector) mutex_unlock(&connector->cec.mutex); } EXPORT_SYMBOL(drm_connector_hdmi_cec_phys_addr_set); + +void drm_bridge_cec_transmit_done(struct drm_bridge *bridge, u8 status, + u8 arb_lost_cnt, u8 nack_cnt, + u8 low_drive_cnt, u8 error_cnt) +{ + mutex_lock(&bridge->cec_mutex); + + if (bridge->cec_adapter) + cec_transmit_done(bridge->cec_adapter, status, arb_lost_cnt, + nack_cnt, low_drive_cnt, error_cnt); + + mutex_unlock(&bridge->cec_mutex); +} +EXPORT_SYMBOL_GPL(drm_bridge_cec_transmit_done); + +void drm_bridge_cec_transmit_attempt_done(struct drm_bridge *bridge, u8 st= atus) +{ + mutex_lock(&bridge->cec_mutex); + + if (bridge->cec_adapter) + cec_transmit_attempt_done(bridge->cec_adapter, status); + + mutex_unlock(&bridge->cec_mutex); +} +EXPORT_SYMBOL_GPL(drm_bridge_cec_transmit_attempt_done); + +void drm_bridge_cec_received_msg(struct drm_bridge *bridge, + struct cec_msg *msg) +{ + mutex_lock(&bridge->cec_mutex); + + if (bridge->cec_adapter) + cec_received_msg(bridge->cec_adapter, msg); + + mutex_unlock(&bridge->cec_mutex); +} +EXPORT_SYMBOL_GPL(drm_bridge_cec_received_msg); diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c index c6af46dd02bfa9e15b59e4c460debdd7fd84be44..c7522e20009977632d9fcd0327d= 856b9d60893d0 100644 --- a/drivers/gpu/drm/drm_bridge.c +++ b/drivers/gpu/drm/drm_bridge.c @@ -206,6 +206,7 @@ static LIST_HEAD(bridge_list); void drm_bridge_add(struct drm_bridge *bridge) { mutex_init(&bridge->hpd_mutex); + mutex_init(&bridge->cec_mutex); =20 mutex_lock(&bridge_lock); list_add_tail(&bridge->list, &bridge_list); @@ -248,6 +249,7 @@ void drm_bridge_remove(struct drm_bridge *bridge) mutex_unlock(&bridge_lock); =20 mutex_destroy(&bridge->hpd_mutex); + mutex_destroy(&bridge->cec_mutex); } EXPORT_SYMBOL(drm_bridge_remove); =20 @@ -1302,6 +1304,20 @@ void drm_bridge_hpd_notify(struct drm_bridge *bridge, } EXPORT_SYMBOL_GPL(drm_bridge_hpd_notify); =20 +void drm_bridge_cec_adapter_set(struct drm_bridge *bridge, + struct cec_adapter *cec_adapter) +{ + if (!(bridge->ops & DRM_BRIDGE_OP_HDMI)) + return; + + mutex_lock(&bridge->cec_mutex); + + bridge->cec_adapter =3D cec_adapter; + + mutex_unlock(&bridge->cec_mutex); +} +EXPORT_SYMBOL_GPL(drm_bridge_cec_adapter_set); + #ifdef CONFIG_OF /** * of_drm_find_bridge - find the bridge corresponding to the device node in diff --git a/include/drm/display/drm_hdmi_cec_helper.h b/include/drm/displa= y/drm_hdmi_cec_helper.h index 75e6476498a31a05af5a813f1df138e7786520be..8d31f9e2e4bd3a62a8b92ebcd1e= 4672daf8f585e 100644 --- a/include/drm/display/drm_hdmi_cec_helper.h +++ b/include/drm/display/drm_hdmi_cec_helper.h @@ -5,10 +5,12 @@ =20 #include =20 +struct drm_bridge; struct drm_connector; =20 struct cec_adap_ops; struct cec_adapter; +struct cec_msg; struct device; =20 int drm_connector_hdmi_cec_adapter_register(struct drm_connector *connecto= r, @@ -35,4 +37,12 @@ static inline void drm_connector_hdmi_cec_phys_addr_inva= lidate(struct drm_connec static inline void drm_connector_hdmi_cec_phys_addr_set(struct drm_connect= or *connector) {} #endif =20 +void drm_bridge_cec_transmit_done(struct drm_bridge *bridge, u8 status, + u8 arb_lost_cnt, u8 nack_cnt, + u8 low_drive_cnt, u8 error_cnt); +void drm_bridge_cec_transmit_attempt_done(struct drm_bridge *bridge, u8 st= atus); + +void drm_bridge_cec_received_msg(struct drm_bridge *bridge, + struct cec_msg *msg); + #endif diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index 348778f233b06265a6ae577762c6558e69cdb396..a848ab63cc8e9c917e7ca3fe4e2= 79bcf2a83cbb2 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -32,6 +32,7 @@ #include #include =20 +struct cec_adapter; struct device_node; =20 struct drm_bridge; @@ -939,6 +940,15 @@ struct drm_bridge { * @hpd_cb. */ void *hpd_data; + + /** + * @cec_mutex: Protects the @cec_adapter field. + */ + struct mutex cec_mutex; + /** + * @cec_adapter: Private data to be used by the CEC callbacks. + */ + struct cec_adapter *cec_adapter; }; =20 static inline struct drm_bridge * @@ -1062,6 +1072,9 @@ void drm_bridge_hpd_disable(struct drm_bridge *bridge= ); void drm_bridge_hpd_notify(struct drm_bridge *bridge, enum drm_connector_status status); =20 +void drm_bridge_cec_adapter_set(struct drm_bridge *bridge, + struct cec_adapter *cec_adapter); + #ifdef CONFIG_DRM_PANEL_BRIDGE bool drm_bridge_is_panel(const struct drm_bridge *bridge); struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel); --=20 2.39.5 From nobody Mon Feb 9 15:48:06 2026 Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E842A2139D7 for ; Tue, 24 Dec 2024 23:10:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735081842; cv=none; b=Fs+lulCNw/VVo7aHD0DUWn7vg+Vm2dCPY6lKvQY/+jD8mYqWMGQYBaXVschwn7ap2LX16bhKBAXhWNAZamhEr2qFJSweSouagl/Fnw9r1fUIbHqW6hs2aYhhzNe5TwBhaGay6bLFExJ32Cqo6wu009xW4wd0Avmx6aWpOomi92A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735081842; c=relaxed/simple; bh=X9IwqP014YM7Yqs7I1CTwyxkzFvnciX/pqhUwGCgKmI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TCHLXE0cZGBE+CfHR/rq898wthXPfRchn34+rckcaKJuQs6EAmqxpfOR7zIGGB7Td2bxSG2kC4KxchUIoyETJV2+rj8A3Hse278zBRS+E6fpD2hU8HQnOgqrKJPY0HZxkIzp0f/9e61MtkRs3hpjS6QeNAqjmBc4lfw1ZzUkR50= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=V/Hl6OUa; arc=none smtp.client-ip=209.85.167.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="V/Hl6OUa" Received: by mail-lf1-f46.google.com with SMTP id 2adb3069b0e04-53f22fd6887so5213974e87.2 for ; Tue, 24 Dec 2024 15:10:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1735081839; x=1735686639; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=CdewCk/PRTWQN0dylNFNsSEtCEp3tuP1E7w2vIr9TcQ=; b=V/Hl6OUax6WM9jy10FWTV5s7+9YMRSWf/ErdON1F87N3Ky4EKI58Zg4Q2SFeP619o/ FUTR22h7wCIKffmBuzsI2gJ+QMNL2rzTaWRE81414Hpy0oX2RJA1JIRXqwAfVI0754BL Znj3Uark3JjC2prOxyI2+rntOTTI1DRYzwa5pt2vrqlB2DituMpmYIne1f6FqiLTLrMh D5Pc+rIBjrsRr/+67Cm+1m3taDINc+jaUFbBBQuq1/mbfNEbDOsmZGs2og8chUi5uOO1 GrkGs5iQ05SbpwJPMIreA8XIKs0CS3nS9efDtV4QnVqMx4JmUUJ74xE6y+hmFuTpN6Sl Glxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735081839; x=1735686639; 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=CdewCk/PRTWQN0dylNFNsSEtCEp3tuP1E7w2vIr9TcQ=; b=Tjpt3xtnBDqtBbEr3pHZHimIlsvJV64E98AjIBEhses0av4z9TYLdpPJ+BViMaNZpq 4anK6M6250kvYPRPXJ/fmypUIbaMI+Jisa5xNtFs6GN1WGT6ERklgmhwwrL3tjVuU8xq 1EDUz1FVi6dcLHb4Gv831oLqMpqU50Ni3vn87EP5rEZyqQMZCgLJhGzqyuQoVjZYAb80 ReQ6Azqi8WXKEQPw9B2D7W5LZBzLY2/OQ3BHOVYexccbOKXXPXWj2OjBo1FZVyGzVRid Z/x+peMuW/R6pMI34cQBBBKeOrCdwwsTzRI6RKF/OenTAare9ktuQkTUbhqjpqE6f5Or qeew== X-Forwarded-Encrypted: i=1; AJvYcCUhfqQFHH75cp5YVV6JUn/4My0loG8otsFCz+ldnve15+wgMpvyfvCvNcOw+3JfWg7BaQ4UO0NWchP9PmE=@vger.kernel.org X-Gm-Message-State: AOJu0YwkXo6xToyc2xuUw9PmKfSiZz9wRKezUWoX1stkURVIUTbbD3Qg ftbijXQraI8asxR2LMttAI5tDd6JaILyh2az+jlaDAdBatnqjbPdy+AfnUvMYfw= X-Gm-Gg: ASbGncsGQIKJqUGn2TDtqUDjh92Fj4OI13mCo5T/1xlkWcqZYGwDkKCSIJXJR9oZKFV UqHYI38D5CBOqYNxb2l6p9VqQKjK22h79XxPOnwT/jlUNwZw4azblT4K+P85TN1eug4LucrI9SP 0vnwqlKoyY5sqSrbOfnbl2csF9Imfu4Zub4Upg8A9MYDpcEbCtmB7N4DJ1BmtgRoUbUO/QMSOaY qvto0ujUn3s3M4SMErwU5jcxCqmwv9VWtwHs2VzJgi+9kZmsqgI5HgI/pc3f5G/ X-Google-Smtp-Source: AGHT+IF7yX8NB3dL2I9oCyrwUW/216+uMBZnO7rofkTlzB1tv6R2FT8+EMKGiGeqgjQOzx4R1mgDeg== X-Received: by 2002:a05:6512:6512:b0:542:297f:4f69 with SMTP id 2adb3069b0e04-542297f4fe6mr4383196e87.41.1735081839049; Tue, 24 Dec 2024 15:10:39 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-542235f5f74sm1721283e87.43.2024.12.24.15.10.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Dec 2024 15:10:37 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 25 Dec 2024 01:10:17 +0200 Subject: [PATCH RFC/RFT 9/9] 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: <20241225-drm-hdmi-connector-cec-v1-9-b80380c67221@linaro.org> References: <20241225-drm-hdmi-connector-cec-v1-0-b80380c67221@linaro.org> In-Reply-To: <20241225-drm-hdmi-connector-cec-v1-0-b80380c67221@linaro.org> 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 X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5825; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=X9IwqP014YM7Yqs7I1CTwyxkzFvnciX/pqhUwGCgKmI=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnaz9WRj8gJm92HaOlOvdvAm82lKlETw5HUFrkp Djq2qO2o3yJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ2s/VgAKCRCLPIo+Aiko 1eEeB/0bxzxQhHj2XJ/dcUJ79F7c1hHbybD9qcBjuaYPrBxbGxm1/PdrpjTFEa7Rpthx3TJZw38 b90yxkRyc3iAJp1C/XKuCZSLj1k9AjEEd5tzCYth8QJ3M+caNnETQDHQw25twDNxJSR8jyjf8GF YVn8EOghnQgd1jU7Yl06fKZv1VApgGfDHy44wZ/ZHyCjaNI7LHG7uDoKAFIkYxnhwRE70TmykB5 Wm3/8mS7eWm7xFxlvHPOaBm2HOW/MDjX0+M1aF6Ly9z7HbVOHHLz5SIbvnAK8arikIZ1qVIC/js D8HV9NAmd4q02rYDJGxmq40Ikvrjgqm3SqpXZA5UUUn3derG X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A Implement necessary glue code to let DRM bridge drivers to implement CEC adapters support. Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/display/drm_bridge_connector.c | 95 ++++++++++++++++++++++= ++++ include/drm/drm_bridge.h | 25 +++++++ 2 files changed, 120 insertions(+) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index 291abb4bcfefd12e1a57a22ba5ccce21c15196a4..f6d04f5aa261b3d0cec4057d4c9= 595e494c34264 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -9,6 +9,8 @@ #include #include =20 +#include + #include #include #include @@ -497,6 +499,80 @@ 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_cec_adap_enable(struct cec_adapter *adap, = bool enable) +{ + struct drm_connector *connector =3D cec_get_drvdata(adap); + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi; + + return bridge->funcs->hdmi_cec_adap_enable(bridge, enable); +} + +static int drm_bridge_connector_cec_adap_log_addr(struct cec_adapter *adap= , u8 logical_addr) +{ + struct drm_connector *connector =3D cec_get_drvdata(adap); + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi; + + return bridge->funcs->hdmi_cec_adap_log_addr(bridge, logical_addr); +} + +static int drm_bridge_connector_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_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi; + + return bridge->funcs->hdmi_cec_adap_transmit(bridge, attempts, + signal_free_time, + msg); +} + +static const struct cec_adap_ops drm_bridge_connector_cec_adap_ops =3D { + .adap_enable =3D drm_bridge_connector_cec_adap_enable, + .adap_log_addr =3D drm_bridge_connector_cec_adap_log_addr, + .adap_transmit =3D drm_bridge_connector_cec_adap_transmit, +}; + +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; + + drm_bridge_cec_adapter_set(bridge, connector->cec.adapter); + + if (!bridge->funcs->hdmi_cec_adap_init) + return 0; + + return bridge->funcs->hdmi_cec_adap_init(connector, bridge); +} + +static void drm_bridge_connector_hdmi_cec_uninit(struct drm_connector *con= nector) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi; + + drm_bridge_cec_adapter_set(bridge, NULL); +} + /* -----------------------------------------------------------------------= ------ * Bridge Connector Initialisation */ @@ -633,6 +709,25 @@ struct drm_connector *drm_bridge_connector_init(struct= drm_device *drm, if (ret) return ERR_PTR(ret); } + + if (bridge->hdmi_cec_adapter_name) { + u8 num_las =3D bridge->hdmi_cec_available_las ? : CEC_MAX_LOG_ADDRS; + + if (!bridge->funcs->hdmi_cec_adap_enable || + !bridge->funcs->hdmi_cec_adap_log_addr || + !bridge->funcs->hdmi_cec_adap_transmit) + return ERR_PTR(-EINVAL); + + ret =3D drm_connector_hdmi_cec_adapter_register(connector, + &drm_bridge_connector_cec_adap_ops, + bridge->hdmi_cec_adapter_name, + num_las, + drm_bridge_connector_hdmi_cec_init, + drm_bridge_connector_hdmi_cec_uninit, + bridge->hdmi_dev); + if (ret) + return ERR_PTR(ret); + } } else { ret =3D drmm_connector_init(drm, connector, &drm_bridge_connector_funcs, diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index a848ab63cc8e9c917e7ca3fe4e279bcf2a83cbb2..65545f9b94cc942e21a2394197f= af8219f5d69b2 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -33,6 +33,7 @@ #include =20 struct cec_adapter; +struct cec_msg; struct device_node; =20 struct drm_bridge; @@ -730,6 +731,20 @@ struct drm_bridge_funcs { struct drm_bridge *bridge, bool enable, int direction); =20 + int (*hdmi_cec_adap_init)(struct drm_connector *connector, + struct drm_bridge *bridge); + + int (*hdmi_cec_adap_enable)(struct drm_bridge *bridge, + bool enable); + + int (*hdmi_cec_adap_log_addr)(struct drm_bridge *bridge, + u8 logical_addr); + + int (*hdmi_cec_adap_transmit)(struct drm_bridge *bridge, + u8 attempts, + u32 signal_free_time, + struct cec_msg *msg); + /** * @debugfs_init: * @@ -925,6 +940,16 @@ struct drm_bridge { */ bool hdmi_cec_notifier; =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