From nobody Fri Dec 19 21:28:39 2025 Received: from mail-lf1-f47.google.com (mail-lf1-f47.google.com [209.85.167.47]) (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 51F2B1D5AB5 for ; Sun, 2 Feb 2025 12:07:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738498042; cv=none; b=U1HRJ9AJANxT0f9aZxAlOVlSpmU0K1wzNHklmsQQKfFzBPMpqf6V5WV/Y0om1ETOsYbJqrlHZPPWR1+tVbtRn5bfGa1mF84vzCr2pfPM+0A3krIURiYQLRxc7NItukr5O3AGPtOLAbiA+McPB8uRMGtucfBArj00RyaLKC3BCDo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738498042; c=relaxed/simple; bh=Ap0yDjP6kDXZa+LMpowMdXjr2vFMubs2IUYLPT/y4wI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=a6rAMHEmatenGm/FlR3TUXW0YacccTT8l5nJmF4L/+TDxTo6trbrFwLQBHA5VZJd4WKTDnNhFI6frxuBQDBfMKACICKpOoxZg1GVwaPRJaahjzIR/i+f5KjMie22pi/tuzKxbNqbCZAasVzFu4Gw+JcCrsMBmfCQeSUVOu/5eBo= 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=UVJiyskK; arc=none smtp.client-ip=209.85.167.47 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="UVJiyskK" Received: by mail-lf1-f47.google.com with SMTP id 2adb3069b0e04-5401e6efffcso3645016e87.3 for ; Sun, 02 Feb 2025 04:07:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1738498038; x=1739102838; 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=xhw5N6hu1mAiszBnZTb89OhX/h/jTmadLA2Ac168sA0=; b=UVJiyskKoh05hCo6TgrB4eqewB8oqEF2CFim1feVJ/x5BsiK47w/3ErGcyY/IUb/Xg ds0kyHsQtxllFI+FaAnY7uxvub/wECjz/aQUuJXOMgHCWXpB5T4qHffa86SEsqSynoyo R1nFr+goCOyfNukhqrxQU1gce8mgt6gnbnF6vCF2J5Af+orhxuVq06MdWhQt7n/DfjY1 v4Zk6oh98PzjKc7y2CYAz+SIsgB0ftH4Wa0Dy2qQWS472DjSD9Lt6qEWBHnycM8JV8sP 2cgYITQ0HMcgDRsE3CnUCniAAph6HFYtRlNjuvlKl4DXul6X5sUjqOjmzeMfHNPD0AtD rCpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738498038; x=1739102838; 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=xhw5N6hu1mAiszBnZTb89OhX/h/jTmadLA2Ac168sA0=; b=KTDRtqR+8LgkpBsexwLnlir0Qg+ys4xbavcg5ZqbEwxkO63kCUuuW48dF/kFvByWAz gwF2PsV9ytMosN+MGcjjeY/MactKc6oRMoTJns4jHe7Q7MEQju3C4+VVne5TiNX3+vtJ LCFfN1A7ekatvxVBCBPtYqiyklkqnuPAvmE5G3YR/keWrpLUfKgRr5WPwwp/gha1hND5 ld7kM1JWwzToydxierNJfg5s64hV8Ep301mlrFRZ+D9yrJifM/CUizssfFgGcIKTk/FP fMJWxZKX0WdFBeI+Bv+8LhrnNZJ4XFs1DbnpxBL45WQqVwSt9MXZ5/Yqv1Wnl16XBi8R ImRw== X-Forwarded-Encrypted: i=1; AJvYcCXsKjzLMoyf2rqHzJDEPBDJAWYDPQzO1rfH9Io285wWylFNZs54bqOXM9tOZWQCoiAwGaX4KMQXwHcIujk=@vger.kernel.org X-Gm-Message-State: AOJu0Yxw7uaopLhlJGkDFSbwpTJlsBR65hdHr288cP1Ug3MWBYzhbATH FFvabHHotkanYk+2wLqRUTL5gyVf5t3Te55VMxVBvfoMeW8kW9oN2I2/mE4uphU= X-Gm-Gg: ASbGnctaI+21xk6VKOxNgiQb2s6px3nF0PM5cGb7OFIdCC6cVFnqFir121XLY8R61wZ 5davT5n0OowoAiqmMV71l4fG0gVhV2okEqCecL9a+m5/bnZT5oLMaml6OZ1n3SZF9IddrpE2l/J RlVwFI4woLKP30B7q4k7XcrDpyLRpwC7Y8P7WLoQjX8R6ixiZs35Fm9ru++yvg5CWnLyZadP0By VmsO1RSeT3kkr+1EsycVNdUzk3ZyNNcX9jCwTal8QeGdY3Iq2Ek/yq/66UCTYYMS7LQgAbIUm38 FowDyny5FgDe/QATqgk3ZOQ= X-Google-Smtp-Source: AGHT+IFKxqh5RzRr7EynRmlZdOMQxYF98ueum1lpXp6uhGzXBycMfXIfxbOZE8sRaPbWGVtxWKLsLA== X-Received: by 2002:a05:6512:2311:b0:540:1d0a:581e with SMTP id 2adb3069b0e04-543e4c01840mr6466809e87.28.1738498038133; Sun, 02 Feb 2025 04:07:18 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-543ebe10678sm960695e87.101.2025.02.02.04.07.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 02 Feb 2025 04:07:16 -0800 (PST) From: Dmitry Baryshkov Date: Sun, 02 Feb 2025 14:07:08 +0200 Subject: [PATCH v4 01/12] 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: <20250202-drm-hdmi-connector-cec-v4-1-a71620a54d50@linaro.org> References: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@linaro.org> In-Reply-To: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@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=3396; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=Ap0yDjP6kDXZa+LMpowMdXjr2vFMubs2IUYLPT/y4wI=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnn1/uPICuG7Dl1z2vtRP2DAhfWXYDYzZ5xvAZi FLVShdhsCeJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ59f7gAKCRCLPIo+Aiko 1aZNB/9viZ7oSe7tqC3ymZ+zjbPI3JmDZgQBp4KG8RcUmjqA0ZvQ7YrVp+6dH7BFj0GA0akBZ2F xRF0L58sJQuRUPFlyhsOgjhhRkNg+doYDS4jHJwplm8p9JrHyEKbJAC16824VBrzYxiVnzRRhA2 kP4AO8fD2FCl/q/ip1E8AlbEalkvzgpe238+aIX8nt2BKTOzFdk/eB2dNT1DOP3fYtSF4CE+skb cNDeygAkt+DmFPfPAWhTohRjuL/uSAU2qqgcOI5wdwaD9D4K8yTGXPz/sqvOPTsIjaConmYo3Vp JQdB89sqJ501S8eBDQLpUMN0hV9U+P7+CWRjqm5nhqig9dPA 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 | 1 + include/drm/drm_connector.h | 46 +++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 47 insertions(+) diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connecto= r.c index 1383fa9fff9bcf31488453e209a36c6fe97be2f1..9890b00e8f9be856f67cc283573= 3a056ddb98efb 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); diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index f13d597370a30dc1b14c630ee00145256052ba56..790a4d6266436b1853ba4584565= 29403e5597a3b 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; @@ -1191,6 +1192,21 @@ struct drm_connector_hdmi_audio_funcs { bool enable, int direction); }; =20 +/** + * struct drm_connector_cec_funcs - drm_hdmi_connector control functions + */ +struct drm_connector_cec_funcs { + /** + * @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. The callback should also + * clean all data in the @drm_connector_cec struct, including the + * 'funcs' field. + */ + void (*unregister)(struct drm_connector *connector); +}; + /** * struct drm_connector_hdmi_funcs - drm_hdmi_connector control functions */ @@ -1832,6 +1848,31 @@ struct drm_connector_hdmi { } infoframes; }; =20 +/** + * struct drm_connector_cec - DRM Connector CEC-related structure + */ +struct drm_connector_cec { + /** + * @mutex: protects all fields in this structure. + */ + struct mutex mutex; + + /** + * @adap: CEC adapter corresponding to the DRM connector. + */ + struct cec_adapter *adapter; + + /** + * @notifier: CEC notifier corresponding to the DRM connector. + */ + struct cec_notifier *notifier; + + /** + * @funcs: CEC Control Functions + */ + const struct drm_connector_cec_funcs *funcs; +}; + /** * struct drm_connector - central DRM connector control structure * @@ -2253,6 +2294,11 @@ struct drm_connector { * @hdmi_audio: HDMI codec properties and non-DRM state. */ struct drm_connector_hdmi_audio hdmi_audio; + + /** + * @cec: CEC-related data. + */ + struct drm_connector_cec cec; }; =20 #define obj_to_connector(x) container_of(x, struct drm_connector, base) --=20 2.39.5 From nobody Fri Dec 19 21:28:39 2025 Received: from mail-lf1-f43.google.com (mail-lf1-f43.google.com [209.85.167.43]) (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 A14AA1D7994 for ; Sun, 2 Feb 2025 12:07:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738498044; cv=none; b=XRTnjsDtyE22pnUF0Ka3PWK3qfn72/CIPStpwP+61wxNLCeWOt2gIX6EmXlenBvW5QND9371jE0MOE+pKKSMSdY4SYCZQiZQa+9rlh9s8qYOnMTfukXYz4yI18ev9zx65n+0MXCUbJm170Nn0AJM6QiMGF+SsxCBYpYvZ+KyBmI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738498044; c=relaxed/simple; bh=RjjhvUseWPk0WJktiUGr9igyfvy7Lala3huHY3iwjag=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=o9BIi/1yKkAgN+jxQ1I3X6MxQk4FSioHwlwBVEPHJPF+o6LP8uSEtvCQgfEMagbglnlptXii1fuw4muTcfsiRlvcU+kFaSLoxhWU4BK+GtaStCXIhWFUDc9ZXzGrs6wcyz0ZTh5Wk4C3847KYYXuNjx9XLNdcmeOy13G/qbu0w8= 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=FkB7ENq1; arc=none smtp.client-ip=209.85.167.43 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="FkB7ENq1" Received: by mail-lf1-f43.google.com with SMTP id 2adb3069b0e04-54024ecc33dso3559768e87.0 for ; Sun, 02 Feb 2025 04:07:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1738498041; x=1739102841; 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=F59sj0XNKbiGtLNc0GKb2ggGZoaV7/aeIrEMGH1u/DA=; b=FkB7ENq1tBI/P559zHHgBYXVbLNyYc4pGhDVoW4uw63R+nt1DOyJRcN+S78dSNOpvQ kVOMpwL5JK1emQQ3hwtEyN4YMd/Vx44qzXcNlLvQmxjo72uMKdRToQHiZZrDnr9TQJSD fvC/ZPVj00PCL/nuv0b3cbpkVa8xDqlc99UqhbYmjvatrZaNVlYIhRz3ytmILgdAh8me rOU5lKmrkgLJHHD6Zb+CcgShBOxJUU8js3hrrX6WkbsSJ3XH5Z5l/kpuETqUFROiNSV3 gnbph6Ru4fwwWd+RrMuFTLBYVWWAsslOvDhaN+g6WW7XnK1fjxisyMtN7bg96DzM95oz F3Rw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738498041; x=1739102841; 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=F59sj0XNKbiGtLNc0GKb2ggGZoaV7/aeIrEMGH1u/DA=; b=WcYLbBxvdbkJWvKWqLZH4Ah/fGve/sNG/Y0Xk8Qfr/0ntkTv9MOsTushiVsRaRGj3r qwLePwgPeoymKN4QdRq2/uS61kxSWcal2qHtm3LD4PBvJ/cPg1ybdBMTVBQjX8cUk9Va 6TFEGu2kI5J0lcIvW2LHNze7SREQ9D379wqu/Cjyd3Rv2unJnSpanjEMZboUUCXdNyiM v+FX220SKKvm85Wnb51uVdE2QgczRQn+0zoArHmH1e5VnGE/wgqxEjnzYm+P2BT3ivQm Q6NfSigNtJsSgKTid9529+anD+1xHmV3ucvfz1mEyGjUttq6q6j7TsVWJ/aR1fg+AzTl PX8A== X-Forwarded-Encrypted: i=1; AJvYcCU5QgsKCllgexziKgVVRIANJMYepmyVcvnQUThbg2+YZ+dZCOhDHgYcuGwcexo+rBO2kkiLEYONtvZnQmU=@vger.kernel.org X-Gm-Message-State: AOJu0YynZM6YkaWEWMHQXfS09RvucC+cZpMdNm1V4cRmp+uiHOLtO1WR ONUqJcucQBt1Z/LX8uaWk6wwsDaqKgbf+yoVSJuGNkc+z7Qoz3cvFcvmUZMJHfo= X-Gm-Gg: ASbGnctv/MJtnd3ImDB7NrMXetGUJBQi9cIVockKXiYXSKgSFWiJHcsdhNo6ho8cqvX xyPST4xXitcI/iU+Cm0Vljld17DJiN862pTYNR/QBBFuAd1rLTuXDlkLVUsPinT5nwEdg5FYBpL danBmLUyDXbIuFFIz3sg1o4h96CiWs9cqdE3BSGphGXldg4haRZNIEgcoH2poqrdcZCQ7SrBgBO y2CCtnH+1cBbl2C1GzSQXBlsDSC1bhjlvzBqB8DJkrUM6DoIdl77reqOnJv3KgwMbexal6ME7bW 7+BMUkT+WI+WqDVe0HmdlBE= X-Google-Smtp-Source: AGHT+IHVYRDC4J4iYdmsbDvkkAZqI5KPrACpL/BZx5B/ZFeHipes2e1xGC3WGrn3XHqGwbLb5pLbxg== X-Received: by 2002:a05:6512:102f:b0:543:e4ac:1df6 with SMTP id 2adb3069b0e04-543e4bdff98mr5145760e87.5.1738498040651; Sun, 02 Feb 2025 04:07:20 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-543ebe10678sm960695e87.101.2025.02.02.04.07.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 02 Feb 2025 04:07:19 -0800 (PST) From: Dmitry Baryshkov Date: Sun, 02 Feb 2025 14:07:09 +0200 Subject: [PATCH v4 02/12] drm/connector: unregister CEC data Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250202-drm-hdmi-connector-cec-v4-2-a71620a54d50@linaro.org> References: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@linaro.org> In-Reply-To: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@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=1438; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=RjjhvUseWPk0WJktiUGr9igyfvy7Lala3huHY3iwjag=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnn1/uOkPHmx9sBYxzjPWzemPGMPzzOqhkgC7Xu e6Vd/xrdy2JATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ59f7gAKCRCLPIo+Aiko 1Ze9B/0UqNqVk6rEOBuY8R/S2llohsLFWnYF4vZbOMuOFKEHwS8TxSdZzXX5gMO1qJj5R60aZU2 X/yRTLBR48aitZUCoEjKS4x4X0VBgf5oU4vO3DMTrTLMnBxuQfjTOjVesDhenEpxfWWHPdXKo94 wHWhh33axXAdAlJ9fZf+GDoqOKdctRFm8GxcSUgVM/GiW8xQa3mJQd2ybhNmWCPnZFX4UqyW1oC kafGoUEYeM1SKrFuu+olg0yZBA7EoK+/ax747+Ahw0iZSWOjFnKKw+nJCTrUCR45Lekq8c1ib9T vgEFAjSbTEG2rmoxTq/zcMX71GOPIWYAHaIQIdz/apLvUHXX X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A In order to make sure that CEC adapters or notifiers are unregistered and CEC-related data is properly destroyed make drm_connector_cleanup() call CEC's unregister() callback. Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/drm_connector.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connecto= r.c index 9890b00e8f9be856f67cc2835733a056ddb98efb..fffb718b09eaaac200e6abc7524= bbfe98c4741f4 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -699,6 +699,16 @@ static void drm_mode_remove(struct drm_connector *conn= ector, drm_mode_destroy(connector->dev, mode); } =20 +static void drm_connector_cec_unregister(struct drm_connector *connector) +{ + mutex_lock(&connector->cec.mutex); + + if (connector->cec.funcs->unregister) + connector->cec.funcs->unregister(connector); + + mutex_unlock(&connector->cec.mutex); +} + /** * drm_connector_cleanup - cleans up an initialised connector * @connector: connector to cleanup @@ -719,6 +729,8 @@ void drm_connector_cleanup(struct drm_connector *connec= tor) =20 platform_device_unregister(connector->hdmi_audio.codec_pdev); =20 + drm_connector_cec_unregister(connector); + if (connector->privacy_screen) { drm_privacy_screen_put(connector->privacy_screen); connector->privacy_screen =3D NULL; --=20 2.39.5 From nobody Fri Dec 19 21:28:39 2025 Received: from mail-lf1-f53.google.com (mail-lf1-f53.google.com [209.85.167.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 09E8D1D86F2 for ; Sun, 2 Feb 2025 12:07:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738498046; cv=none; b=sElsapTxgksfV4Y6OgWhlRqYbwl/l3ukMLpGdltYAPwMHepRBeRQxOUqgZSo7FVAwn95cr5+JiJ2dlD4Obbd7eDHVSwicM6G+oc5iUD9O2Q6+yspd2ZjKwuYHCTigzBW7CNNXT4SDIv9/PSZ1xIOeNzq0Tn7KyREuPsSXd3MRiU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738498046; c=relaxed/simple; bh=N35nxpcqv/VwAiJBDWTPiOI+qtC0Bzqx1moc2EZyRGI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QOo7wvmXdR7jIA6rS8Zq4iCQfunCcfQv/8Lyt4LNNbqimX3jYCcxejn8OGWMbcw8aXnG5Lomm+h1iAjVX6HkKEpaIcULvaongPQK5hqkbgpRUEQJm+L6g5tT7X6fqoF2vDnSBm7rkeYBBE4h7o/FJcEZbRjRHZL04XnxOawizEs= 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=o6JJEW2i; arc=none smtp.client-ip=209.85.167.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="o6JJEW2i" Received: by mail-lf1-f53.google.com with SMTP id 2adb3069b0e04-540218726d5so3236501e87.2 for ; Sun, 02 Feb 2025 04:07:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1738498043; x=1739102843; 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=BuE5UZz+cJnN2iWNBz/RDp/GoaoZW4HCu4zDpH0F6WY=; b=o6JJEW2iToo3ZMEW/JvviU/nXzX5exzV1RckyCW5rolQJwydylw2y8m4iMIZAVTKUI +iT0SCEe2kU7IIeNW79iKmzuQ+t3tL6MIXIKR5F5C7F1NgxirIrH2oe6R7Gh03KegGoY O+sEfZTibp4N3cQyyvC9uzMGuW3t6IOgxKPb2PMkNtRimUisxzzcmDD+ryknMr/3A9+w Sm15aYfWu1Y4y/IamB6Dr5oWArVtXBugT1Z8OlEA+V9L2IwdXa5xExpvDQwrI5BlDRNP Tx1liZHN0uZSveukFZUBv+JOREwWUuXOo+7cS5/QB092d9nQSfEWVXO7Q/73sP6cugzf tSpw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738498043; x=1739102843; 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=BuE5UZz+cJnN2iWNBz/RDp/GoaoZW4HCu4zDpH0F6WY=; b=GVNYF+JJAgIP0uPW2zSvq8N68r3F4TQjBE9yTLu3db9+jwPCTrg57gLnyukFTyre+u +4IVgaPUsjSGmpglXYWHyMgkBdXdD2cF92B65qgRqXNdWXTRqH6K7lap1/LWmPCwUm1Q v3DY3nfNJlEl6jlDcOKZLoDXYv7us/+W+WdzIF0qI28rVeogxnYohqVNXCGqkm0FtRRZ gStVc5Z0iSmwagqLqftxE54tmHUixtGrbbg5pYNbPi3b7JW3TArqm8xiooz8YHYEcj/t BLwYd4/JdZDUYZXqplkJ/UxBSxSsau9gPIlkRYT0OVW6HZgZdL+ijbsJEA1Qcv3NCOeF kaaw== X-Forwarded-Encrypted: i=1; AJvYcCUVVlpGm7dp4Og8sL62l1whOQzGeYct2TqDukF6RB4JwRng6xcrjlEUIIPya5oKI9zbxCa7qbmKsK9SCb8=@vger.kernel.org X-Gm-Message-State: AOJu0Yw7/aAgK+KsPNIolLr3gL8u1Vrbp4I8TaaFC2S4DEQQBZKPAOd1 jpGkgWlZ9nvxEamYi+0KkAqmK5PONe8PEOV8QZaKL0QnGcTXVXdhXXE39OeDql4= X-Gm-Gg: ASbGncuwHf2H1/N6Kx+S22IzqttvO/Us31S+0mwHV+2Jn2audAWyiIn01TJ54ltAUJd duGv/twTCtyMJ3Ot1ZW3XJRdBguFdgZd3K3ivqFcOmvOjahFB+qNVoaRT7T8y+9aoDA5YjMovRi ZJWoMXTsDNkwfz4K5Ge8BYdPYb6lhP54HmtI5oFKNBuAHZIbnDWzWiHphte/vD4az/jgrBlH/Yb I56SqVovuxE+RsqLcF0qfQw7IsOWXQzUF2LGQdjTX6hgJRfOFGcIzgKgriipCyu/jPWe7wtKA4n HyRbEhvk5JEi5xEoud1FNHM= X-Google-Smtp-Source: AGHT+IHhKuZSfZysf15dskatOSlsO0er3UYdEBLmh1KotBNeQy4VZ9n0d7CGOLX8DBU+YghkRGkeJQ== X-Received: by 2002:a05:6512:1392:b0:543:9b35:5abf with SMTP id 2adb3069b0e04-543e4bdff84mr5103464e87.2.1738498043139; Sun, 02 Feb 2025 04:07:23 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-543ebe10678sm960695e87.101.2025.02.02.04.07.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 02 Feb 2025 04:07:21 -0800 (PST) From: Dmitry Baryshkov Date: Sun, 02 Feb 2025 14:07:10 +0200 Subject: [PATCH v4 03/12] drm/display: move CEC_CORE selection to DRM_DISPLAY_HELPER Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250202-drm-hdmi-connector-cec-v4-3-a71620a54d50@linaro.org> References: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@linaro.org> In-Reply-To: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@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=1406; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=N35nxpcqv/VwAiJBDWTPiOI+qtC0Bzqx1moc2EZyRGI=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnn1/vEceJ0AVRHfa8eoYTEwUn9OxWnesJPlP3A dW+x5VtskSJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ59f7wAKCRCLPIo+Aiko 1QadCACEVwx8jVOTvfRK+G6WUSxCQI7BvAIklNfD9fop2nd1n5eD0ytwhdOz2aR62RW70jfe9Lp fHHycymMltPQVHqDGjvIN9O3QTxqQPEc8PUhAwJiU3BOodDX9rvLq5uB178/OjHD4jhythQFRhB HbU2hvHPGVdJGv67vgTAXhPD1trergimgiXXOlM6fTQmPQco5AKzIoGWyjvuZN5L8+TV4Gh0Ro7 A1FZElbGd4hJk16UiMS0DZ33beE5HzxVtsqRsVZhczVpZmyyaCJRW6x1/nmsSuLDY7/xgsR32Gu 1sBJp6GT1m/7E3VKeUuXGncBtFKUGKIFINmfrPQF+MZYcppN X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A THe Kconfig symbol DRM_DISPLAY_DP_AUX_CEC is a boolean which simply toggles whether DP_AUX_CEC support should be built into the drm_display_helper (which can be eithera module or built-in into the kernel). If DRM_DISPLAY_DP_AUX_CEC is selected, then CEC_CORE is selected to be built-in into the kernel even if DRM_DISPLAY_HELPER is selected to be built as a module. Move CEC_CORE selection to the latter symbol in order to allow it to be built as a module. Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/display/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/display/Kconfig b/drivers/gpu/drm/display/Kcon= fig index 8d22b7627d41f7bc015decf24ae02a05bc00f055..3666e791d6d6eba58f095d7fb69= 1de1fd0b95ed3 100644 --- a/drivers/gpu/drm/display/Kconfig +++ b/drivers/gpu/drm/display/Kconfig @@ -8,6 +8,7 @@ config DRM_DISPLAY_DP_AUX_BUS config DRM_DISPLAY_HELPER tristate depends on DRM + select CEC_CORE if DRM_DISPLAY_DP_AUX_CEC help DRM helpers for display adapters. =20 @@ -23,7 +24,6 @@ config DRM_BRIDGE_CONNECTOR config DRM_DISPLAY_DP_AUX_CEC bool "Enable DisplayPort CEC-Tunneling-over-AUX HDMI support" select DRM_DISPLAY_DP_HELPER - select CEC_CORE help Choose this option if you want to enable HDMI CEC support for DisplayPort/USB-C to HDMI adapters. --=20 2.39.5 From nobody Fri Dec 19 21:28:39 2025 Received: from mail-lj1-f177.google.com (mail-lj1-f177.google.com [209.85.208.177]) (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 BD3DC1D8DFD for ; Sun, 2 Feb 2025 12:07:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738498050; cv=none; b=QTbdFPdgChsm6jQEdVMtkqJD95nGpNCm4Hz1l5S8HOPgSH8AjOGaVG6Zkx/AqT/LWvAXZ7jEbyxhNG0zF4QUG4J76oPtDpr25DGEOCHKU5g8kpvuBhSdjlba8kIdjM82+8cdPQIjHujNO8JlCCXVHfz7zAFYeBkUdLbvZS2vugs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738498050; c=relaxed/simple; bh=nldCClR8uvkSTfDxfd+h/QjnqO0ZS/iFq9gYjpUVHS4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=da/Tuig3hjk3RssO8AugP1rfeOI7eejs2HoZg3AdufkwMUbr7wGS5FhPWK/zFnMDEDIPLm71JLhe+RIAQCxOvsjWa0UODACOK4WwH1qWVceYXESGiVnlOeBQvrUrQjDEOA5P+rJmPVvb0vLVaw6tuNI34UKtGLFB5cqQ2db0Crw= 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=ZIsv4qlN; arc=none smtp.client-ip=209.85.208.177 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="ZIsv4qlN" Received: by mail-lj1-f177.google.com with SMTP id 38308e7fff4ca-30219437e63so46648001fa.1 for ; Sun, 02 Feb 2025 04:07:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1738498046; x=1739102846; 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=5UTqDywGwGqwaCDORrx7GXvq6f9LFKArl+vZrtSpSjA=; b=ZIsv4qlN84SZHYSYmUQf1TBZOUCg9azq8HpTooImXDQZH25DSr5LhA5Juj7IdZD90+ KJr3jUnf8KLeN1LgXaPj9SlwlwfDogMvIIHl7jNUJvwNhBckC6GvAHJXBLsQWS5rPQH4 3KT0tXqBNkOhZ+jDoxZQErIb9a1FbmnVJJUjYmoNtBLUkcai4QNvG65AptADugVhtill WGJV9HLJVlz/jVgBrhFVNI8zr9CLbJ9l8L9FvewATOkAkZlyyll2vdHY+Zu0VXCRt8Nm 0MdoGe4buCaJIthgVQ5z2iwT689fJ2pZR8PHNL4gYMTm+pLtQvXFEoCIrW12CzO3GaWI 71zg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738498046; x=1739102846; 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=5UTqDywGwGqwaCDORrx7GXvq6f9LFKArl+vZrtSpSjA=; b=Boaf2ZEO+lqVlVWBu2AGR4sUdcWrF5eklv51TBTjvbzsaAPPeJ1+evQkdVnhfPvEDk zIs4++AxXCacjpRTfyOZgFyyjNr8DQJfhaExPl/oZxcnA8b9bYv74HoS8T8jM5+kMvPU dIb+U/8U8vfCXGmNgUjAAff2obpJxf7f0y1d+rzBMVFsbk7Vd0sylBWqXuvQxr3JleH7 RQi0P9JdtAaBc0Di1FUnasZDGtNYqrIw1Jh0sNcIQhzYaVz/sUE3rhhcqeatc6+ufWVv hCOtDeD2qrf3CVU9bwivahB2m2DPxV7l96oBZk3cE5+cBQN5doLRdio1t1/JjulCc+RW W+dw== X-Forwarded-Encrypted: i=1; AJvYcCXpqTI8gdubZ7zI7HXficrAjlVqsh8jk76FDXIgsC2uOaQ5knxsejFfhLxI9ibFQ4qTNnBm/5kPhMLgUW0=@vger.kernel.org X-Gm-Message-State: AOJu0YzdASuYGFvPUfa7pT8PX0L0wngDdI7sg5wiLGi5X/7KOhWANGq7 psZMvqYRC7y4GXKKHdU4E/cqxaZhsFx6TP3if860kj1WKxLjjaGDGNrUxu9A8B4= X-Gm-Gg: ASbGnctrTJkMRPXG/HdKwL0WWKex07dBjLkMDKGKzPYTu1sd1c23TnPotQzlTmM1hjH uKWkaGpNSkSghnye56a9Q4eMh6MSqTNCvf6/Y0UlaD5vTxTncYgGVtZVzFq8ZXyFXEnrxIxe/F8 zbqFHwxSKSlwb2PNEsMYbCpoVgaVim4P3aPlY/FsKF6CLdgvs5BpNOpEH1gzHeim8zGOvISsxP0 dlzXFHfdutYo9cEpWuSsLZuBKmidlYrHGurF7PLv3Yn5+4JrDe8cbG+ADkJrbsc4mTH6qknZ/FB i8O7SzxlfkszbflgwQqTmuw= X-Google-Smtp-Source: AGHT+IEv10/REWPc98BQHgdtPQ1KyOKFNyfQw6Dwajs3E1u+MMHDY0oB96++rKgrDov5//LdbeuRmA== X-Received: by 2002:a05:6512:2809:b0:542:8ca5:8248 with SMTP id 2adb3069b0e04-543ea3c8993mr4316169e87.8.1738498045654; Sun, 02 Feb 2025 04:07:25 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-543ebe10678sm960695e87.101.2025.02.02.04.07.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 02 Feb 2025 04:07:24 -0800 (PST) From: Dmitry Baryshkov Date: Sun, 02 Feb 2025 14:07:11 +0200 Subject: [PATCH v4 04/12] 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: <20250202-drm-hdmi-connector-cec-v4-4-a71620a54d50@linaro.org> References: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@linaro.org> In-Reply-To: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@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=11954; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=nldCClR8uvkSTfDxfd+h/QjnqO0ZS/iFq9gYjpUVHS4=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnn1/vt8ffZJlcyg6wBTsoFYfvslYUUSsElayef a394aDm4+eJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ59f7wAKCRCLPIo+Aiko 1d7/CACc1JAdFGKKYXvWGXmjft+vUPHMgJwoFZ/KL7oyN43+RPiJEOf1p2icB5ipOROI2EXAmRX BRwQe6UPbz9UVZJ4/hvbMNibj31gHoPobOx+NXFcPvayIidHDidH18AzPrmexYPQwGnnJW1pcbW JnX3nMLV4NaJ2/x6I8bu4f9SKXnLqiNcVyWpWfIHh6lL5xePtpEXSNKt3bXaNdyskxAEYjQFISA 8lVp18W/PtuxL5fksBhcrJNMwwlr5XuORgUP89NLiraym0C8NH48HLY/OHAeonNsQIvMV8JLeaH g7CizrKW3TLet6qotgzX8NyYbbTIan4JO77F7jweYc55nWWZ 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. Unlike drm_connector_cec_funcs (which provides interface common to all implementations, including, but not limited to the CEC adapter, CEC notifier, CEC pin-based adapter, etc) the struct drm_connector_hdmi_cec_adapter_ops provides callbacks specific to the CEC adapter implementations. Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/display/Kconfig | 8 +- drivers/gpu/drm/display/Makefile | 2 + drivers/gpu/drm/display/drm_hdmi_cec_helper.c | 209 ++++++++++++++++++++++= ++++ include/drm/display/drm_hdmi_cec_helper.h | 86 +++++++++++ 4 files changed, 304 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/display/Kconfig b/drivers/gpu/drm/display/Kcon= fig index 3666e791d6d6eba58f095d7fb691de1fd0b95ed3..3b8fc8f99a3d89741d863749c52= 167beaf7be2e6 100644 --- a/drivers/gpu/drm/display/Kconfig +++ b/drivers/gpu/drm/display/Kconfig @@ -8,7 +8,7 @@ config DRM_DISPLAY_DP_AUX_BUS config DRM_DISPLAY_HELPER tristate depends on DRM - select CEC_CORE if DRM_DISPLAY_DP_AUX_CEC + select CEC_CORE if DRM_DISPLAY_DP_AUX_CEC || DRM_DISPLAY_HDMI_CEC_HELPER help DRM helpers for display adapters. =20 @@ -82,6 +82,12 @@ 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 + select CEC_NOTIFIER + 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..a6ed5f0fc3835b013a83308f528= 5ea0819c5702c --- /dev/null +++ b/drivers/gpu/drm/display/drm_hdmi_cec_helper.c @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright (c) 2024 Linaro Ltd + */ + +#include +#include +#include + +#include + +#include +#include + +void drm_connector_hdmi_cec_unregister(struct drm_connector *connector) +{ + cec_unregister_adapter(connector->cec.adapter); + connector->cec.adapter =3D NULL; + + cec_notifier_conn_unregister(connector->cec.notifier); + connector->cec.notifier =3D NULL; + + connector->cec.funcs =3D NULL; +} +EXPORT_SYMBOL(drm_connector_hdmi_cec_unregister); + +static const struct drm_connector_cec_funcs drm_connector_hdmi_cec_funcs = =3D { + .unregister =3D drm_connector_hdmi_cec_unregister, +}; + +int drm_connector_hdmi_cec_notifier_register(struct drm_connector *connect= or, + const char *port_name, + struct device *dev) +{ + struct cec_connector_info conn_info; + struct cec_notifier *notifier; + int ret; + + mutex_lock(&connector->cec.mutex); + + if (connector->cec.funcs) { + 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.funcs =3D &drm_connector_hdmi_cec_funcs; + + mutex_unlock(&connector->cec.mutex); + + return 0; + +err_unlock: + mutex_unlock(&connector->cec.mutex); + + return ret; +} +EXPORT_SYMBOL(drm_connector_hdmi_cec_notifier_register); + +#define to_hdmi_cec_adapter_ops(ops) \ + container_of(ops, struct drm_connector_hdmi_cec_adapter_ops, base) + +static int drm_connector_hdmi_cec_adap_enable(struct cec_adapter *adap, bo= ol enable) +{ + struct drm_connector *connector =3D cec_get_drvdata(adap); + struct drm_connector_hdmi_cec_adapter_ops *ops =3D + to_hdmi_cec_adapter_ops(connector->cec.funcs); + + return ops->enable(connector, enable); +} + +static int drm_connector_hdmi_cec_adap_log_addr(struct cec_adapter *adap, = u8 logical_addr) +{ + struct drm_connector *connector =3D cec_get_drvdata(adap); + struct drm_connector_hdmi_cec_adapter_ops *ops =3D + to_hdmi_cec_adapter_ops(connector->cec.funcs); + + return ops->log_addr(connector, logical_addr); +} + +static int drm_connector_hdmi_cec_adap_transmit(struct cec_adapter *adap, = u8 attempts, + u32 signal_free_time, struct cec_msg *msg) +{ + struct drm_connector *connector =3D cec_get_drvdata(adap); + struct drm_connector_hdmi_cec_adapter_ops *ops =3D + to_hdmi_cec_adapter_ops(connector->cec.funcs); + + return ops->transmit(connector, attempts, signal_free_time, msg); +} + +static const struct cec_adap_ops drm_connector_hdmi_cec_adap_ops =3D { + .adap_enable =3D drm_connector_hdmi_cec_adap_enable, + .adap_log_addr =3D drm_connector_hdmi_cec_adap_log_addr, + .adap_transmit =3D drm_connector_hdmi_cec_adap_transmit, +}; + +int drm_connector_hdmi_cec_register(struct drm_connector *connector, + const struct drm_connector_hdmi_cec_adapter_ops *ops, + const char *name, + u8 available_las, + struct device *dev) +{ + struct cec_connector_info conn_info; + struct cec_adapter *cec_adap; + int ret; + + if (!ops->base.unregister || + !ops->init || !ops->enable || !ops->log_addr || !ops->transmit) + return -EINVAL; + + mutex_lock(&connector->cec.mutex); + + if (connector->cec.funcs) { + ret =3D -EBUSY; + goto err_unlock; + } + + cec_adap =3D cec_allocate_adapter(&drm_connector_hdmi_cec_adap_ops, conne= ctor, name, + CEC_CAP_DEFAULTS | CEC_CAP_CONNECTOR_INFO, + available_las ? : CEC_MAX_LOG_ADDRS); + ret =3D PTR_ERR_OR_ZERO(cec_adap); + if (ret < 0) + goto err_unlock; + + cec_fill_conn_info_from_drm(&conn_info, connector); + cec_s_conn_info(cec_adap, &conn_info); + + connector->cec.adapter =3D cec_adap; + connector->cec.funcs =3D &ops->base; + + ret =3D ops->init(connector); + if (ret < 0) + goto err_delete_adapter; + + ret =3D cec_register_adapter(cec_adap, dev); + if (ret < 0) + goto err_delete_adapter; + + mutex_unlock(&connector->cec.mutex); + + return 0; + +err_delete_adapter: + cec_delete_adapter(cec_adap); + + connector->cec.adapter =3D NULL; + +err_unlock: + mutex_unlock(&connector->cec.mutex); + + return ret; +} +EXPORT_SYMBOL(drm_connector_hdmi_cec_register); + +void drm_connector_hdmi_cec_received_msg(struct drm_connector *connector, + struct cec_msg *msg) +{ + cec_received_msg(connector->cec.adapter, msg); +} +EXPORT_SYMBOL(drm_connector_hdmi_cec_received_msg); + +void drm_connector_hdmi_cec_transmit_attempt_done(struct drm_connector *co= nnector, + u8 status) +{ + cec_transmit_attempt_done(connector->cec.adapter, status); +} +EXPORT_SYMBOL(drm_connector_hdmi_cec_transmit_attempt_done); + +void drm_connector_hdmi_cec_transmit_done(struct drm_connector *connector, + u8 status, + u8 arb_lost_cnt, u8 nack_cnt, + u8 low_drive_cnt, u8 error_cnt) +{ + cec_transmit_done(connector->cec.adapter, status, + arb_lost_cnt, nack_cnt, low_drive_cnt, error_cnt); +} +EXPORT_SYMBOL(drm_connector_hdmi_cec_transmit_done); + +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..a9d38835c69a2939ca21a4fc921= 136a2a022248c --- /dev/null +++ b/include/drm/display/drm_hdmi_cec_helper.h @@ -0,0 +1,86 @@ +/* SPDX-License-Identifier: MIT */ + +#ifndef DRM_DISPLAY_HDMI_CEC_HELPER +#define DRM_DISPLAY_HDMI_CEC_HELPER + +#include + +#include + +struct drm_connector; + +struct cec_msg; +struct device; + +/** + * struct drm_connector_hdmi_cec_adapter_ops - DRM Connector CEC Adapter c= allbacks + */ +struct drm_connector_hdmi_cec_adapter_ops { + /** + * @base: base callbacks, providing generic DRM Connector CEC interface. + */ + struct drm_connector_cec_funcs base; + + /** + * @init: perform hardware-specific initialization before registering the= CEC adapter + */ + int (*init)(struct drm_connector *connector); + + /** + * @uninit: perform hardware-specific teardown for the CEC adapter + */ + void (*uninit)(struct drm_connector *connector); + + /** + * @enable: enable or disable CEC adapter + */ + int (*enable)(struct drm_connector *connector, bool enable); + + /** + * @log_addr: set adapter's logical address, can be called multiple + * times if adapter supports several LAs + */ + int (*log_addr)(struct drm_connector *connector, u8 logical_addr); + + /** + * @transmit: start transmission of the specified CEC message + */ + int (*transmit)(struct drm_connector *connector, u8 attempts, + u32 signal_free_time, struct cec_msg *msg); +}; + +int drm_connector_hdmi_cec_register(struct drm_connector *connector, + const struct drm_connector_hdmi_cec_adapter_ops *ops, + const char *name, + u8 available_las, + struct device *dev); + +int drm_connector_hdmi_cec_notifier_register(struct drm_connector *connect= or, + const char *port_name, + struct device *dev); + +void drm_connector_hdmi_cec_unregister(struct drm_connector *connector); + +void drm_connector_hdmi_cec_received_msg(struct drm_connector *connector, + struct cec_msg *msg); + +void drm_connector_hdmi_cec_transmit_done(struct drm_connector *connector, + u8 status, + u8 arb_lost_cnt, u8 nack_cnt, + u8 low_drive_cnt, u8 error_cnt); + +void drm_connector_hdmi_cec_transmit_attempt_done(struct drm_connector *co= nnector, + u8 status); +/* + * 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 Fri Dec 19 21:28:39 2025 Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 31C491D90C9 for ; Sun, 2 Feb 2025 12:07:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738498052; cv=none; b=P4NV4Ns5zgj865XAmW/twQCTcyPv52xoJpHcsjwlX5c5NYqoiPQdPFG5I3Ns8M1XYdmd973GhcqKgIyrYAuZVQFtwWAtwRqB71so7TZdUjG9gjV+ypWw/p6Rmy3LJtYGyeDcut78spE35z0B1GtlimaP9kL5T7K2CnQR/6VdVu4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738498052; c=relaxed/simple; bh=/bwxxqot5Orp4aaO3bhvKAHJmqfOaxqag+YV2Q0Zeak=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=n8vS3tpaggfKgdQzbT9+XtMdmwIpkgwPlQv1QCTme3VRgHM4LocLmaCuj+MKZuWe0uxfBY0HMgzrQEnfRn0400oD8+t7OPylc0yhcOHQvWplTmgLVbxyuYvU/DExbDP51scZauAjhUi6xEly2/wNnQPYYemNdjInBOQKbw8OlPk= 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=yla92dOB; arc=none smtp.client-ip=209.85.167.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="yla92dOB" Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-5401c52000dso3540558e87.3 for ; Sun, 02 Feb 2025 04:07:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1738498048; x=1739102848; 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=3jL3SY1S6z4Uid1XoM99vjSrcwjC3Oh5zHftbBQD0pk=; b=yla92dOBhmaZupvMxyXO2QiFyXL9e3oJquKrdK0FCO1GM26GxLlGg9miIpQreEoPjS va70OopGNRB4N33X/YbZBI8Yqef7LKlRlDYvtEWyoLf7FFSA/oTUiPxeN2gy8BQg7ebR 11jBxgBCoWl/seb9xu3/Zs/5sEbRW6X86OgktBidnaiwNsU7by8dMpJl0AdOD7WP/6Ey SZTdzOhPsv4RwwT+CM7bV93mHoOByByXc9g/i8NaE1vU7OJyIvJJ07WskZGWU7p/YpIX R/gh+flD2XiEBIVr325qFoGtzxGTib3LS6GbE1Sd7mcGEqeOFEBbrJ3tI5rKUOw/X1X4 Aa4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738498048; x=1739102848; 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=3jL3SY1S6z4Uid1XoM99vjSrcwjC3Oh5zHftbBQD0pk=; b=G3rT2j7Vhf3c/EtbIb8gSjSgmI7cvTtLzb5jfuU2U70K1HhBitrpcwHbROEinAHwQu 7kd7qGSz6jheJkX+7twevb+5wPN3W7bxqh5YVERKu2fBlNJpw9DbL8awMcvuLHIQVcmh tWH7bOvuKfzmYgBCxy7AEzwU4jYxOnSoY+sqsrEaZBKxzhmzoQ6QrTFYmh/MbhmRQL8c zrPnjwacZvsYpWiExtNyGXtpR5ad/rBnZtKIgfXvkTdVN/vOhenOy74r1CP1m+aafcFN MD0H7j4V/GxNKb/E4EICsdfdKjknvlRc8ZNzbT7k9qfdBIAyFQ5YOTTbruEqp476up2Z yv/w== X-Forwarded-Encrypted: i=1; AJvYcCU7k2nkSWDUrvc48OzMUHjoSO8amz+PAcSRTilOjIHdbG6Ikmvggo8ZytI1Mpt7kEMBclgKHLeji5dOFyU=@vger.kernel.org X-Gm-Message-State: AOJu0YyCBROUxJfl2ti1LreVVQecYbqGb4MHz71nt+PxBdeFWwID4hCS ZaCf6cIGtSJstqUir1zAmrVY/1ZLVcFccvG+jlYCGYngax5RFz56MSBQT4TmaN4= X-Gm-Gg: ASbGncsNo876Mkzj9ONA2DcvwkKYQmgLNm0F2X+HmyGrkX5IxFM+DA8K1AlOtilFIKq 3ZNWO77vaHrLbW97asALSq7vwMpG6ORwgPOe/5TIt7ZYEmRHmOMvwFcdyePONbR+BaHY973KGDz 5HfII42RYkGTETQsL7/AY0AVjMfgzYVyrJP/sboPPaikOr0d1nVEu48RdbxBRbUZWYPeNEfw6oa ZKT+v5GLtd0I6viG0OB3tW6GmOMFkIvhJemaUxat4JUiNX87uVS4PN++2WszGc69jREswhearhN eNob3s/XZKFrdhk1SzcQcCA= X-Google-Smtp-Source: AGHT+IFQ2qvN181ZDuhcMPZNSJiVwciarLswp3cHLOkosjzsrof5La2FVo7LVxq/uWfUgjgWG7L/7A== X-Received: by 2002:a05:6512:3d21:b0:540:1fae:b355 with SMTP id 2adb3069b0e04-543e4c37a94mr5458133e87.52.1738498048159; Sun, 02 Feb 2025 04:07:28 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-543ebe10678sm960695e87.101.2025.02.02.04.07.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 02 Feb 2025 04:07:26 -0800 (PST) From: Dmitry Baryshkov Date: Sun, 02 Feb 2025 14:07:12 +0200 Subject: [PATCH v4 05/12] drm/display: hdmi-state-helper: handle CEC physical address Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250202-drm-hdmi-connector-cec-v4-5-a71620a54d50@linaro.org> References: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@linaro.org> In-Reply-To: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@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=1817; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=/bwxxqot5Orp4aaO3bhvKAHJmqfOaxqag+YV2Q0Zeak=; b=owGbwMvMwMXYbdNlx6SpcZXxtFoSQ/r8+Pd/VIo6maxyb8aGPtbn4tUp4Ky8ccFgXr7SvcSdv 6WtDEM7GY1ZGBi5GGTFFFl8ClqmxmxKDvuwY2o9zCBWJpApDFycAjARzhYOhjls1duOsutql9vs K94rcSku8rn9TR5tI+49u6xmvFPw8gifKsD1PWL+zpsTdZ4Y8R3YnPXO+LpnaHvpDU3DmEQ+hec 3wowf72A11nIzStpdsqj485aXulZ/25wj625sC7KRPy5TeW1HZp+t7Ix+hlaOl+br30x7+olxWs OE6QotMe9v5882LzRpKFI7bfDITF5Hc8mr+bxOTBY5aQrvy7pS7mrGmcv/tV80h99+TUa/0L7Gl JqkK+XSV3cq/q7QzlSX6num0/nAsXvaB+F/8wUOLZgwMUHbpr3TsPmo7qbVBtvX8v3sauvKTeH8 WFmQaSLi0S9Qm+rYd/76FZ98EeW05wK7Xz/ZIdSmvwQA 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. Reviewed-by: Maxime Ripard 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 ca3c99b3805fbd78fb3162818b3877450d72b178..1e7ea9b387088d5f407b647a9a3= fead7a2929a30 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,9 +787,10 @@ drm_atomic_helper_connector_hdmi_update(struct drm_con= nector *connector, const struct drm_edid *drm_edid; =20 if (status =3D=3D connector_status_disconnected) { - // TODO: also handle CEC and scramber, HDMI sink disconnected. + // TODO: also handle scramber, HDMI sink disconnected. drm_connector_hdmi_audio_plugged_notify(connector, false); drm_edid_connector_update(connector, NULL); + drm_connector_hdmi_cec_phys_addr_invalidate(connector); return; } =20 @@ -802,8 +804,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 Fri Dec 19 21:28:39 2025 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 C7FA21D95AA for ; Sun, 2 Feb 2025 12:07:32 +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=1738498055; cv=none; b=u4kwW7ymR+Jsq8zY6DROFjpwl6uOzFv5wdc6BIO75RODYhL5yv0DlYRRVk8l+M4AA2bGtGE5XYWRf8onIHYnLSVdr0MN08sMSr9Paisl65pXtM2lQmHhix2qpv/OeVr9Bgf35zOy1e3HE/8wzhjyzxqme3XI6ERjjukAT3fLjr0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738498055; c=relaxed/simple; bh=gLQhAOItk1SGD5tjqJAAptsrV//vN4Xt/at5DjS5YR4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YJ/GizX5zn9VRo4aFGzB07W+aM4f1Fr3PaN3n5g3Ta+lG3IOthcQ/OA1Pl2MOkg5pJkOImwkbqfZJp8xs8/DkKbtB7oetSFjRl/3k8mTHr676t6f48Ud6g0lbfWMoELbVSxAAKz9jFURkocX3s7l3o3O55DQVXIE3RfHEEP5Fng= 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=hxPocEf7; 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="hxPocEf7" Received: by mail-lf1-f51.google.com with SMTP id 2adb3069b0e04-540201cfedbso3069945e87.3 for ; Sun, 02 Feb 2025 04:07:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1738498051; x=1739102851; 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=QQncvRRAuoLjn6XHpoivkjOodkjhTrikHPuhN7/HYX0=; b=hxPocEf7X5mcRfLwAT9+RtClcASYd8vzmaJA1uErXUDns718Z6j8NCmUV6vhH6m0is tGNPxcAFyAm3DbkbIjPcPvUWViil/O6BE5bm/imt5NwM4DJnQwg2jFxUFaa2uI/EuoRC mSCRtA9ixmKRpQ9X+Lki6/i1tctMmD2pq1nAPZq6lvQSF+W3X+LZnJ9MfWzKOCpuP67y wbVwVDvdJG90B1Ox02ZktuV6Vkr4CxMK8luM//PpmHKjscxRadNs6PJY97TE7637TZeu vx1E7M0+AJgNglRY6THtsQPqXjWjcEKrLcI9WmmFctgikfwG19iXlvaCwcxjxoQSUiNI pnRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738498051; x=1739102851; 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=QQncvRRAuoLjn6XHpoivkjOodkjhTrikHPuhN7/HYX0=; b=l4vSrn5hgcemQJ1PWQEpmpA6fBT3YfNAO4sV+GFY/HUANKXn5I0swue1nm64g1PWaC O+0Na2unaFFtAThHJmEMGJXAN/OoqIS3Fphh0fKyja03FPZ3kIi3fI6UBHqh6Po3x3ED eNHnFm0RbV+aHWvqox2aOkUsTIloy/WZN44nfJbaLfuIoctj/HjYjeL61Cd1+Sc49iuH dPMbguZ3GvnTGvnocw8ryIS4j+EdQ1z/dyrsGWM+B7cDUypeUrp1iXZ9UCLTgvvXJBJC XW1yakhLl/4T3V/eox4ioSz+G27TdrkrpBT8SND45kD/kzJgIkrHpsUYhmAjHYY355j2 CbFQ== X-Forwarded-Encrypted: i=1; AJvYcCUzq4fjX6NRgUXPW0AZlctjO0ie8/mNRScvEtgXIzqn9bKYGSOAgqb9d8qKvxjqp4EJAsBpy6MM+svFVh4=@vger.kernel.org X-Gm-Message-State: AOJu0YwGeJr53yvLw9MKMm5uNM4f7qfDbnOaeRoP0ivU0ljltJp0nsly L2nVVMjkRKc5Q+AGzs4Lr6/OGLTnzxuQIYdgacQSesOuSUZIt1jZ0w+Ztc32mkg= X-Gm-Gg: ASbGncuiAXbaoL9ksvdCMmUyUem9lGX60eZK+fA1AP45dgDaQiOqcYZAWs6m0PvYJ05 e4IBDbTMAilP9XeG9J1Q+myAIwVYQpoTiBMzDBs0KD/tf+rx6kJ9lGDp4IugkdP/Htqc4FI/Kgi hgw4Hot8JqAfM/0ZNrEoH3Aol55iND1FjNfNoKXmjIkrqTxQI4c4qpV2sMIqWlg4v8QFxKdF8DS hnHK+wK/Sv/JrTJqX2v782n/mXutMT+qfnI+ripWsxVl9YDd/nDwCu1/8+yGrecM3D3uKqdsIuY p1GGBqxE7Tn63hzn3kAbeuE= X-Google-Smtp-Source: AGHT+IFnGr8L+9iP3OQdkPVM5s571J/KyHyeV1CN/jrYqKSaEHG0644NFlegLXXwgJhE4erLTqfaFQ== X-Received: by 2002:a05:6512:2389:b0:542:8cf5:a384 with SMTP id 2adb3069b0e04-543e4be006fmr5936742e87.8.1738498050727; Sun, 02 Feb 2025 04:07:30 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-543ebe10678sm960695e87.101.2025.02.02.04.07.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 02 Feb 2025 04:07:29 -0800 (PST) From: Dmitry Baryshkov Date: Sun, 02 Feb 2025 14:07:13 +0200 Subject: [PATCH v4 06/12] 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: <20250202-drm-hdmi-connector-cec-v4-6-a71620a54d50@linaro.org> References: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@linaro.org> In-Reply-To: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@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=10666; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=gLQhAOItk1SGD5tjqJAAptsrV//vN4Xt/at5DjS5YR4=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnn1/vWvLDojKsF20g4/2KT80ycY54icfhIVjGo 0lIfb6t9JWJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ59f7wAKCRCLPIo+Aiko 1YFTCACDcgTgFBV6ofWn3W5jkEq3MDrqHCvhJuZXeqtTJQ7z6k9C5qd2Ki8/A75YFhnRz3+Vpci zZ0a7yWlVgZbhVZUqfNmnBuzll2ZlE3WLvuVi702mTb6gTxsYkjZqhh4P+25FgmLEll9ijSj7Bz HOIrhz/bpZKIhXWiH7VJLzeQWWXglpPuZgOplHbhW89Eh4cTzwM43OjFKFlIdifA2NJ57T+kEph y1mZLk0mq8DksYOz8bIlkDNLtYsRk648AzTf+IF3ybFuIEgceulxMF40we6tjh02RU6DHgwIFFj KJqj5Expl4p5CR7bOkz/leXX+2rnjG8isTWw2OCIob6pKYdU 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 | 138 ++++++++++++++++---------------------= ---- drivers/gpu/drm/vc4/vc4_hdmi.h | 1 - 3 files changed, 56 insertions(+), 84 deletions(-) diff --git a/drivers/gpu/drm/vc4/Kconfig b/drivers/gpu/drm/vc4/Kconfig index 123ab0ce178157c3b39466f87c7ac39c8470f329..bb8c40be325033632d3e94db87a= 16b03554ad3af 100644 --- a/drivers/gpu/drm/vc4/Kconfig +++ b/drivers/gpu/drm/vc4/Kconfig @@ -35,6 +35,7 @@ config DRM_VC4_HDMI_CEC bool "Broadcom VC4 HDMI CEC Support" depends on DRM_VC4 select CEC_CORE + select DRM_DISPLAY_HDMI_CEC_HELPER help Choose this option if you have a Broadcom VC4 GPU and want to use CEC. diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 47d9ada98430634cfd8c1e21c2a4d00d501bab7e..1108983c44858382cb9f09b6869= 56903645ebe0a 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,8 +2381,8 @@ static irqreturn_t vc4_cec_irq_handler_rx_thread(int = irq, void *priv) struct vc4_hdmi *vc4_hdmi =3D priv; =20 if (vc4_hdmi->cec_rx_msg.len) - cec_received_msg(vc4_hdmi->cec_adap, - &vc4_hdmi->cec_rx_msg); + drm_connector_hdmi_cec_received_msg(&vc4_hdmi->connector, + &vc4_hdmi->cec_rx_msg); =20 return IRQ_HANDLED; } @@ -2399,15 +2392,17 @@ static irqreturn_t vc4_cec_irq_handler_tx_thread(in= t irq, void *priv) struct vc4_hdmi *vc4_hdmi =3D priv; =20 if (vc4_hdmi->cec_tx_ok) { - cec_transmit_done(vc4_hdmi->cec_adap, CEC_TX_STATUS_OK, - 0, 0, 0, 0); + drm_connector_hdmi_cec_transmit_done(&vc4_hdmi->connector, + CEC_TX_STATUS_OK, + 0, 0, 0, 0); } else { /* * This CEC implementation makes 1 retry, so if we * get a NACK, then that means it made 2 attempts. */ - cec_transmit_done(vc4_hdmi->cec_adap, CEC_TX_STATUS_NACK, - 0, 2, 0, 0); + drm_connector_hdmi_cec_transmit_done(&vc4_hdmi->connector, + CEC_TX_STATUS_NACK, + 0, 2, 0, 0); } return IRQ_HANDLED; } @@ -2564,9 +2559,9 @@ static irqreturn_t vc4_cec_irq_handler(int irq, void = *priv) return ret; } =20 -static int vc4_hdmi_cec_enable(struct cec_adapter *adap) +static int vc4_hdmi_cec_enable(struct drm_connector *connector) { - struct vc4_hdmi *vc4_hdmi =3D cec_get_drvdata(adap); + struct vc4_hdmi *vc4_hdmi =3D connector_to_vc4_hdmi(connector); struct drm_device *drm =3D vc4_hdmi->connector.dev; /* clock period in microseconds */ const u32 usecs =3D 1000000 / CEC_CLOCK_FREQ; @@ -2631,9 +2626,9 @@ static int vc4_hdmi_cec_enable(struct cec_adapter *ad= ap) return 0; } =20 -static int vc4_hdmi_cec_disable(struct cec_adapter *adap) +static int vc4_hdmi_cec_disable(struct drm_connector *connector) { - struct vc4_hdmi *vc4_hdmi =3D cec_get_drvdata(adap); + struct vc4_hdmi *vc4_hdmi =3D connector_to_vc4_hdmi(connector); struct drm_device *drm =3D vc4_hdmi->connector.dev; unsigned long flags; int idx; @@ -2667,17 +2662,17 @@ static int vc4_hdmi_cec_disable(struct cec_adapter = *adap) return 0; } =20 -static int vc4_hdmi_cec_adap_enable(struct cec_adapter *adap, bool enable) +static int vc4_hdmi_cec_adap_enable(struct drm_connector *connector, bool = enable) { if (enable) - return vc4_hdmi_cec_enable(adap); + return vc4_hdmi_cec_enable(connector); else - return vc4_hdmi_cec_disable(adap); + return vc4_hdmi_cec_disable(connector); } =20 -static int vc4_hdmi_cec_adap_log_addr(struct cec_adapter *adap, u8 log_add= r) +static int vc4_hdmi_cec_adap_log_addr(struct drm_connector *connector, u8 = log_addr) { - struct vc4_hdmi *vc4_hdmi =3D cec_get_drvdata(adap); + struct vc4_hdmi *vc4_hdmi =3D connector_to_vc4_hdmi(connector); struct drm_device *drm =3D vc4_hdmi->connector.dev; unsigned long flags; int idx; @@ -2703,10 +2698,10 @@ static int vc4_hdmi_cec_adap_log_addr(struct cec_ad= apter *adap, u8 log_addr) return 0; } =20 -static int vc4_hdmi_cec_adap_transmit(struct cec_adapter *adap, u8 attempt= s, +static int vc4_hdmi_cec_adap_transmit(struct drm_connector *connector, u8 = attempts, u32 signal_free_time, struct cec_msg *msg) { - struct vc4_hdmi *vc4_hdmi =3D cec_get_drvdata(adap); + struct vc4_hdmi *vc4_hdmi =3D connector_to_vc4_hdmi(connector); struct drm_device *dev =3D vc4_hdmi->connector.dev; unsigned long flags; u32 val; @@ -2749,84 +2744,66 @@ static int vc4_hdmi_cec_adap_transmit(struct cec_ad= apter *adap, u8 attempts, return 0; } =20 -static const struct cec_adap_ops vc4_hdmi_cec_adap_ops =3D { - .adap_enable =3D vc4_hdmi_cec_adap_enable, - .adap_log_addr =3D vc4_hdmi_cec_adap_log_addr, - .adap_transmit =3D vc4_hdmi_cec_adap_transmit, -}; - -static void vc4_hdmi_cec_release(void *ptr) -{ - struct vc4_hdmi *vc4_hdmi =3D ptr; - - cec_unregister_adapter(vc4_hdmi->cec_adap); - vc4_hdmi->cec_adap =3D NULL; -} - -static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) +static int vc4_hdmi_cec_init(struct drm_connector *connector) { - struct cec_connector_info conn_info; + struct vc4_hdmi *vc4_hdmi =3D connector_to_vc4_hdmi(connector); struct platform_device *pdev =3D vc4_hdmi->pdev; struct device *dev =3D &pdev->dev; int ret; =20 - if (!of_property_present(dev->of_node, "interrupts")) { - dev_warn(dev, "'interrupts' DT property is missing, no CEC\n"); - return 0; - } - - vc4_hdmi->cec_adap =3D cec_allocate_adapter(&vc4_hdmi_cec_adap_ops, - vc4_hdmi, - vc4_hdmi->variant->card_name, - CEC_CAP_DEFAULTS | - CEC_CAP_CONNECTOR_INFO, 1); - ret =3D PTR_ERR_OR_ZERO(vc4_hdmi->cec_adap); - if (ret < 0) - return ret; - - cec_fill_conn_info_from_drm(&conn_info, &vc4_hdmi->connector); - cec_s_conn_info(vc4_hdmi->cec_adap, &conn_info); - if (vc4_hdmi->variant->external_irq_controller) { ret =3D devm_request_threaded_irq(dev, platform_get_irq_byname(pdev, "ce= c-rx"), vc4_cec_irq_handler_rx_bare, vc4_cec_irq_handler_rx_thread, 0, "vc4 hdmi cec rx", vc4_hdmi); if (ret) - goto err_delete_cec_adap; + return ret; =20 ret =3D devm_request_threaded_irq(dev, platform_get_irq_byname(pdev, "ce= c-tx"), vc4_cec_irq_handler_tx_bare, vc4_cec_irq_handler_tx_thread, 0, "vc4 hdmi cec tx", vc4_hdmi); if (ret) - goto err_delete_cec_adap; + return ret; } else { ret =3D devm_request_threaded_irq(dev, platform_get_irq(pdev, 0), vc4_cec_irq_handler, vc4_cec_irq_handler_thread, 0, "vc4 hdmi cec", vc4_hdmi); if (ret) - goto err_delete_cec_adap; + return ret; } =20 - ret =3D cec_register_adapter(vc4_hdmi->cec_adap, &pdev->dev); - if (ret < 0) - goto err_delete_cec_adap; + return 0; +} + +static const struct drm_connector_hdmi_cec_adapter_ops vc4_hdmi_cec_adap_o= ps =3D { + .base.unregister =3D drm_connector_hdmi_cec_unregister, + .init =3D vc4_hdmi_cec_init, + .enable =3D vc4_hdmi_cec_adap_enable, + .log_addr =3D vc4_hdmi_cec_adap_log_addr, + .transmit =3D vc4_hdmi_cec_adap_transmit, +}; + +static int vc4_hdmi_cec_register(struct vc4_hdmi *vc4_hdmi) +{ + struct platform_device *pdev =3D vc4_hdmi->pdev; + struct device *dev =3D &pdev->dev; + + if (!of_property_present(dev->of_node, "interrupts")) { + dev_warn(dev, "'interrupts' DT property is missing, no CEC\n"); + return 0; + } =20 /* - * NOTE: Strictly speaking, we should probably use a DRM-managed - * registration there to avoid removing the CEC adapter by the - * time the DRM driver doesn't have any user anymore. + * NOTE: the CEC adapter will be unregistered from + * drm_connector_cleanup(), which is called from drm_dev_unplug() + * during device unbind. * * However, the CEC framework already cleans up the CEC adapter * only when the last user has closed its file descriptor, so we * don't need to handle it in DRM. * - * By the time the device-managed hook is executed, we will give - * up our reference to the CEC adapter and therefore don't - * really care when it's actually freed. - * * There's still a problematic sequence: if we unregister our * CEC adapter, but the userspace keeps a handle on the CEC * adapter but not the DRM device for some reason. In such a @@ -2837,19 +2814,14 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_h= dmi) * the CEC framework already handles this too, by calling * cec_is_registered() in cec_ioctl() and cec_poll(). */ - ret =3D devm_add_action_or_reset(dev, vc4_hdmi_cec_release, vc4_hdmi); - if (ret) - return ret; - - return 0; - -err_delete_cec_adap: - cec_delete_adapter(vc4_hdmi->cec_adap); - - return ret; + return drm_connector_hdmi_cec_register(&vc4_hdmi->connector, + &vc4_hdmi_cec_adap_ops, + vc4_hdmi->variant->card_name, + 1, + &pdev->dev); } #else -static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) +static int vc4_hdmi_cec_register(struct vc4_hdmi *vc4_hdmi) { return 0; } @@ -3271,7 +3243,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 Fri Dec 19 21:28:39 2025 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 267681DA2FD for ; Sun, 2 Feb 2025 12:07:34 +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=1738498057; cv=none; b=HQ++ds9zNMX+zF4TbQMQVR7ruC/+aCp+cANL+mmbQ8DmX6meDMXa+uc+g0H/aliZG+AJDkHPRYO7FNI4h5uRI8jIgptjawiesNs1YiPT2S8IfTWaY8m3gR0SIJ7KyMn9+9gwAdsZJRWQ6FmtK6EG0qq//i3G9Y5ijY+OIt1RSJ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738498057; c=relaxed/simple; bh=0Zce2MHZUThwasIdDT6Yj7aAuEOuVKLQ5WS8bTZxlU4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IYq5WWZTwwQbzbVpzuGnZmpokMNyConD9pAQWa9QfqHMRm7SGmNHvM8QsxmyLRp3SRhtPOgHMiTL9Ts5uKh58gh6iL102dRs5V8CjQfEQS4ZBbBH1TL2UHeNjf/v4vIm1GWwjjQQ6Gb/52cXgpKsfaVcUDJqkE+qROj0bUsbQ2k= 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=m+hqhDPu; 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="m+hqhDPu" Received: by mail-lf1-f51.google.com with SMTP id 2adb3069b0e04-5439a6179a7so3637936e87.1 for ; Sun, 02 Feb 2025 04:07:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1738498053; x=1739102853; 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=FsVgp1pNTXgcNWpTze5zyA6a1PWwEI2e/0X9lqFORpw=; b=m+hqhDPuZWdioman27KAkiNUJC66T0/xhmMPif218GsmpgFFJgwRzPyAcftbCgs0b5 6RgMO9IPTaUH2hsfUI7Vb1lpudXcFESgCtSzB86/knZYE8Ufj42ET3PWHb8huWuRkhTO CoAts29SbExe1bMcsWvzx2qt3rXILVDMB17PtlUWYW0J6oM6sQUcIrX9WCqzebzNYfFh cWwh1kuohOXJnV+Z3a4AiQM4SUUAns3QIWObWBnO4GbswqVCwHcFNhERLqI9lVofj8LZ uo5VhtXr8QvLRWC5/1Z2kfpVlJL8zQpj2GqB9oAPdJmpkCtYBM9fe0nZqXs7WEsgs7V1 K33Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738498053; x=1739102853; 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=FsVgp1pNTXgcNWpTze5zyA6a1PWwEI2e/0X9lqFORpw=; b=LiFNwZLlQw3YAiV7X6y8roEfr/0bSbZRSDLp6DoAhwPo1PX9iNFn6Omvb08wtcjeW/ rGUqgX7TiaRN83C75aYyVJ7gi9IY0/r2K3Hcxdg0AzGF+g6eUtPc59DnATt2QAHG/gWv 8my5bCROf7kZSVfV+LGeRw9oJa6TNJaf3ur0TmKZ0rMRXWRV4P57gp3PGIqXAnB5Sxzj /7enLiVgnQSf6Fc1QAjl9HL9+NcAmPlT/y0PBFV+ydsU/pLbyOBnxuHhg0cHx3CQO+QV xbOEIZxKGNzXKfdnIHHZElh80eCUm4FkAi7jikBUzEQzMOKl5ahXAESfiVDYSS0O+5zf eGLA== X-Forwarded-Encrypted: i=1; AJvYcCWyNeTt7n4UhPuYuasmAxFkcdG0gQjLLubMyb/EEY/nDIslMoZ6nVm1CpoesI7txZymt4lh3du65Yv5pDY=@vger.kernel.org X-Gm-Message-State: AOJu0YzvYzrcIE5TGxONdFTGU9YYKB+gTsDfIsbCvxNoRZLL33TlqdbN iD+C4T4MJz44NP2jMXeucEIBzkckPx3W74F+u4X9avZhBCqwmqNg+mS23JTY4BA= X-Gm-Gg: ASbGncvvESCGyIO1pkDWBBX8k+VyBwX6tCJd8dSazkXfFSZDVmlMmJxUokIQKR/QRVL GIHC2FdocB/wOS6LacYYjk+kqAjYE88bgKJ+O2vqmehvZESHErfKNuHPxmJYZg4aPiL+H6SFNnO NC1VpVNp4MC09bl3ZOnfZnV5bKTRURcdajzBPA/b5sTkfJy+hE0KRbbPM8fRmnskHPeYLkqG9VU gVMtgszDpgw12S1fqkDh8HPgGyOzeIGUqO0sPIUAa318MIzGIgwZVLZ6sfGd+xufOUqHvUUDsaa F2akMGZiH/ZUrHWR6wCo1Mg= X-Google-Smtp-Source: AGHT+IH7oEk4SHP2d+vsxmLK49lixNRWAPfIkqrNwkwhCJ0IBozqe3pGshBvPVntmxxiEl5p0wn0jw== X-Received: by 2002:a05:6512:33cf:b0:542:986b:de08 with SMTP id 2adb3069b0e04-543f0f3ef1bmr2840275e87.26.1738498053262; Sun, 02 Feb 2025 04:07:33 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-543ebe10678sm960695e87.101.2025.02.02.04.07.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 02 Feb 2025 04:07:31 -0800 (PST) From: Dmitry Baryshkov Date: Sun, 02 Feb 2025 14:07:14 +0200 Subject: [PATCH v4 07/12] 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: <20250202-drm-hdmi-connector-cec-v4-7-a71620a54d50@linaro.org> References: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@linaro.org> In-Reply-To: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@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=4248; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=0Zce2MHZUThwasIdDT6Yj7aAuEOuVKLQ5WS8bTZxlU4=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnn1/v2814W6wzHi9b9UxiJ3usIcbsVCSnxz9Io 6eJUmccRcWJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ59f7wAKCRCLPIo+Aiko 1VlnB/41c1gxQJ0w6maHBjQWwKZYqsk4UYRS7Tf/wuIhPJ91XlzjsXZxKE63cJvrEyg+PWD6Isd +6Ut7nn26cOjhLkWUOgySHH2iwufdpSt4BObRsC+j8+o4PNj/i5ArOtR1Uu3EGU3qPH+VQg4CfK HV+t5WonR+tif/VvS43aMlj8Twl2OYzRfe4Rcr9JOnS0FiedLnDQL9pFrVBgSkv5ingRl7DtL/k mmjBUE4KK6InYMt+gL52cRBF1FMyZpHbFfgpUfMBsZFlEMyDa9L2ornVn79lNlTknSEuhy8dLY+ kJf380Tx5seBhxkjnd0vpOM2Y5K99HDYfJkYLdljb2zIeQPc 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. The drm_bridge.hdmi_audio_dev field is renamed to hdmi_dev to facilitate that it specifies just the HDMI device, common to both audio and CEC implementations. 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 3b8fc8f99a3d89741d863749c52167beaf7be2e6..adc4e2f48a20f6702f2b4729d1e= 720a5f27647f6 100644 --- a/drivers/gpu/drm/display/Kconfig +++ b/drivers/gpu/drm/display/Kconfig @@ -17,6 +17,7 @@ if DRM_DISPLAY_HELPER config DRM_BRIDGE_CONNECTOR bool select DRM_DISPLAY_HDMI_AUDIO_HELPER + select DRM_DISPLAY_HDMI_CEC_HELPER select DRM_DISPLAY_HDMI_STATE_HELPER help DRM connector implementation terminating DRM bridge chains. diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index 0397e62f9cbc93321caeae99982f5e3c66d308c5..9f234bc647d5c0880d4c42aea13= 0074b7fa54573 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 Fri Dec 19 21:28:39 2025 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 C57291DA631 for ; Sun, 2 Feb 2025 12:07:36 +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=1738498058; cv=none; b=fT2ythqm0BxfScYmxD2wW1MD3RhUfUV7DlT8kDPAVDgaQURE0p6DcTa5yVhUAkbFLbS1dv57HeysdR7Zp+7NSifVQpB5bKuWLQjD7Di71gUbh08gcEAB8eu8aGYqjoY3ANhsohtyA9L6BLQUTJ048FI2GaxdZCsN9DfhXCvv8do= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738498058; c=relaxed/simple; bh=8WlbJltbqK/InBjSkxjv8tslfatfI2kL2pKEGE9R5LI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ly8WYU2INWd+fetK2sGMKfQ+bMHwm4suHLTnphYqqOangqw/3CbjxkFTJhbibD7JW7znMzhig8zu+AaWXlUkcUk1lnt/UviONFfTZv5aaIku1wdZUPeNvq5pBYGb7TMSyEQ/ZwqBXieC0Zb6YAOp5NHhO31B5VXyZO6+kyEdPz8= 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=F4fLIDvc; 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="F4fLIDvc" Received: by mail-lf1-f46.google.com with SMTP id 2adb3069b0e04-5401c52000dso3540626e87.3 for ; Sun, 02 Feb 2025 04:07:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1738498055; x=1739102855; 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=ZgAVEoNSYZyEjLuTE1oB7V3YJmMK3i9hrDmIRjnWJHg=; b=F4fLIDvc/NtqgyNCEFdv3+A8gnsHaKvyyiJMoAq3SmF/9Kryt7VocdF54LTdpxVYaz ANYiRgZIsdFxaveQWZHibkzrz5eOvQPpCKCAdYa18+ofbnf2x2cVDU3aMW2zxZ9IMhDe Ec2/ezVHvxpc8qHF8y0R4NpAyi0H013Dd3Ih3I/Hcqf9ewr7z+SlwPZ0oE2aGIDrO7Gk c63miMwvtbIsNJyDuKkI/m18v+qMhkQiCdA+rpuhLi2OOMRC89d63EdlrvzeTyfZXvRt /zXdGyhxjs2A08IRGBMeRKl+A6qZLbw8s5a2eA/vtVonW4WpTm/XSQ18tgn9X2KCx28V 4K9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738498055; x=1739102855; 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=ZgAVEoNSYZyEjLuTE1oB7V3YJmMK3i9hrDmIRjnWJHg=; b=KB9wx5ygFvbL3QqjPIOBOFiErP7Ew/rFIwuAKO+XbS8W+0OnCYNtgj6Pq7HYKM/5ti tOC2KVqUIxGLMRYW8EGs4M1bCpesVNuBvjEtJQKXVTbEsvD1HzUJPBwwlolMlOWK7xzv rr/RuCwOToFRjyJG8MIbEMeA87tNITxPHKkctEGaDfhTdjRN6k0S3d2ENXJAjqkl9Iq7 9MYlVZQd5sKhT2Y6SnbnF18XrbH1WrNINDoD41Rp5GK0xaoBeT63onwVEaKFsqD5YF0V wFb7sJtdiETPNHzDQ3ywZZPjc5t91stuNXWUmFvNT8+vx08WPlQZLPAqrmojpb8xk1wU 41oQ== X-Forwarded-Encrypted: i=1; AJvYcCWtHsfOfWmLj54Hp8DaGx8V2hCZJdHBTpkoeXufjwA8hvMHADEn5zKOkY4+MY1KigXCFOGVZPN2h4AhOFY=@vger.kernel.org X-Gm-Message-State: AOJu0Yx6QR97CN67e+/k0ffFokfWQpsDxQh6q2Q7+FiptV4HhGy2Txan U6a2na36oOjHcFDMF3dKCn+MDALkdQqB/SdclJigbPHCJChSnDe4TeZ5zeZlTx8= X-Gm-Gg: ASbGncsEI4n/17AwRwTEuTAs2C6N9EZnksRu/41eEq7Ki4WmHrMjVkdLDK+OT/rxfkg rLkPxYR815ay1BgsYOAzVWnlueTAXCxDAUXvtN9Tv1X6vLLbcW4EP0Q0LorPXhr2ZmRw/7GEnWL 1LLvJ9c0BXVS/RPe4rz6X91bCE5/vPxRqCd/UofRw20vqjH8r0c0qgVp4j3LhwrW3QMKNBTOI7v 9SmFDl/+j0afXQPN8EswllNR8uCOAQJv85ggOv1H1JLOMqAvcw1ZaMT2ZU2EcLNC8CN6PFstsiX K4vFxBUJknPfd7UmGOlCBsM= X-Google-Smtp-Source: AGHT+IFOrkSnrb0EMOZSD3f2+JhY3H6H4djvQ9Cngu8qQR0jXh4YrgCDc8p21Qjtyk4TkLK5BPjAiA== X-Received: by 2002:a05:6512:15a5:b0:540:251e:b2b9 with SMTP id 2adb3069b0e04-543e4c2966amr5607513e87.41.1738498054836; Sun, 02 Feb 2025 04:07:34 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-543ebe10678sm960695e87.101.2025.02.02.04.07.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 02 Feb 2025 04:07:33 -0800 (PST) From: Dmitry Baryshkov Date: Sun, 02 Feb 2025 14:07:15 +0200 Subject: [PATCH v4 08/12] 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: <20250202-drm-hdmi-connector-cec-v4-8-a71620a54d50@linaro.org> References: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@linaro.org> In-Reply-To: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@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=1909; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=8WlbJltbqK/InBjSkxjv8tslfatfI2kL2pKEGE9R5LI=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnn1/vB+CdW60aRQrg/SfxiyTccxBejN5Z8BgD7 3nntMf02q6JATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ59f7wAKCRCLPIo+Aiko 1fF9B/9bM6P3l8/EMpoAwseVEvg2NuykTNvmxRhTvIGk+cljuVHczEdCTGyy1w8WuAvLUL1FFly EZnQxQGOWK/bp1H769ZVsj/Je+2GxD2pp3Q+bPMojWNOCbmw80zxwJarVnS6OKuZ2uzJlklTYNh Fa0o27p+gjtUXnaX3C+4W92uxVqPVam3uuGlv5H8x93aMnyLTYmofm5lFn//1iHFuUV8SYZBtVP 8o98nDxFqSLvepCgEj0lezWyf9CX9JJVU1jEKF7KUZc6oMYGwSt26dkMa9/yZvRZJO5ElqoNEln 2t1cGfh96jZG6Ks8vn1qyUUOm12tAgZTKy/4iYeUax/geqbW 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. Reviewed-by: Maxime Ripard 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 Fri Dec 19 21:28:39 2025 Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 47FE91DB12F for ; Sun, 2 Feb 2025 12:07:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738498061; cv=none; b=HYDMtB5n3Yi/qLy6d3hNPNtZEMmweIkZqFacX56zTAKJs/M8hot5JxQINGXMcCa4MsPbEYwHaXIqVG2Yms+tncGENULqVqndAtcTwjOJ0/mPdmMm64WAE9zFGex6HpcMIav+I1ENNYPp4Gh1BR8hfKFkjp679d3Uxj/mqm8EwI0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738498061; c=relaxed/simple; bh=yi9kuP8xj+IWgEzU7otZJmiGvJToi8ayWBLm49/BFfY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jLOkpMrJjyb7Ec+EdJil/+n7Cf+kifeuoTsvJAwSl6vnUDKaYc+LJp7NLtsHw4lVeFdjoMMU+6RbYz/nniyolHCMk1MxfA23TVx6cDQ/mslKBSKI4Xe3Qk1OAvgXbwh4v0fWjRPQH1a5OounZnOw7ajUd0ikl9gxmXGOx/CZPis= 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=NUbcZZWT; arc=none smtp.client-ip=209.85.167.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="NUbcZZWT" Received: by mail-lf1-f42.google.com with SMTP id 2adb3069b0e04-53e384e3481so3085647e87.2 for ; Sun, 02 Feb 2025 04:07:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1738498057; x=1739102857; 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=UsARv7wcMY/4sKWAI5XqD/IVXti9mEWhbs9ICskYpok=; b=NUbcZZWTFf4qITJ1+wV7U32tGX/JVa+TJaDeECZPLYaM6l1pYLdZYnD3KxNBPkn1MG nbeIv/R+vOvbi9FbSnUhgH56ND5We9Yw7msoO5J2DnlzPY1Fz2LK/00co4jkTOxPV6Kv XF9nI0Jf+IXSx8MUVLNFV9uSEpkBRls577Byo9ltD3FLKz43pWzifdVfnXYChDmg/Y/n fjxtPmtpi8jV3fxaYazTAmFnbdISbMnLdhH/kj9zixwDaDhB6zQ2mmNozPjfdUAbT+Zn dNQRDWCQzmgFagmUaq053tCmKV4lI9nV6Wl2F2MvlJwBK1jjq99L/nWFA2xIlbeb3CvL x8zQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738498057; x=1739102857; 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=UsARv7wcMY/4sKWAI5XqD/IVXti9mEWhbs9ICskYpok=; b=BROf4p0xKVvnWVEontMthRKu+Xe6M35mCmlxaeJLkwF2HgOm/oOTctxqXZ5leskisg bO55J2HWAq0fTZbF7U9jOXcKyGP6uS0HpBZPc3nLs8Dbhn8cZfBqE/HsHmiA9PZuQdWu rLvODjbBEpb7R673N+FR5HA4dz5ADuo0X3IGEzovidSe2WA6pE1irbeFtPVtJI7TaFpm Yo8Tk0C0oyEhi42dYbvOJTeW5VKjx+oNfM9i2UG15CLyVvvbGK2zft8DgP9rnLbc9pqj u1FFUeiYRQcw6jitNlRRDHOgme01/YXyzfxFAR5WZ6u85WR2q9UpX/q+j2gCOopip0IN joiA== X-Forwarded-Encrypted: i=1; AJvYcCVmaCUDS3m4uydetw+U/Afh5PVZTH+zCgRekFXVe0x0ZCK404sMpXCJKFe4uRDRL6PfhLpdpipjMd8lSjM=@vger.kernel.org X-Gm-Message-State: AOJu0YzO+RL6/xGq0r6SjkbjvsZUopkAdH+P3wxaeODP1d1SGLh18mP8 hSvJFWzXy6H1kSYpL14ACKIKkalc3vl8eArChTV0aRSLulMlXyfSk1PQZXVgJTw= X-Gm-Gg: ASbGnctLd0VlA5kBKuvUR1dwfQuBGfKu0MKq6z6P7jZaaoCSyxgC6/3DdoxThD8U3Wh DTv2VU3DnvmtUwDsNuOSPlFFOlr9+bxgKvwKGB5CKZLaVoII8VdsPYS/jtUqOWr8DlWkPYXBKyW tlKfax8VAzHIRyaD89tJ5n0LE8fRwe7lHaesydzGidvIu+C6BHZ2k1WrHfyv66O4AB1etAYhroc lk5kUdJxVDD4xrtli6PFXBiMjOi0co9gVNgHu/LM8h7HRgRVdsR1KG20BPGVHxowpTqxnkn4nOd A6cqQzdzttPpB+Im3fZQ81k= X-Google-Smtp-Source: AGHT+IEzVX4mBQceR92uq3wNyRMur2BgWMNBH3IzLTIb0LGUgelE7xewaM7tpM1lFFY6Kfcq/Rlr+w== X-Received: by 2002:ac2:4c26:0:b0:540:353a:df90 with SMTP id 2adb3069b0e04-543e4c3cacfmr5250298e87.43.1738498057287; Sun, 02 Feb 2025 04:07:37 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-543ebe10678sm960695e87.101.2025.02.02.04.07.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 02 Feb 2025 04:07:36 -0800 (PST) From: Dmitry Baryshkov Date: Sun, 02 Feb 2025 14:07:16 +0200 Subject: [PATCH v4 09/12] 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: <20250202-drm-hdmi-connector-cec-v4-9-a71620a54d50@linaro.org> References: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@linaro.org> In-Reply-To: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@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=5348; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=yi9kuP8xj+IWgEzU7otZJmiGvJToi8ayWBLm49/BFfY=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnn1/wpKlvuZlEwtRG+RVJAXmLqvNbMvM9Ne90W 6ortRDmatKJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ59f8AAKCRCLPIo+Aiko 1cmUB/4wEMF/P5m4Fjpogau7HjnEZL7eRltDOTGgz9zKMkOuPk7rh1nIMyOPgUOveHg6IK+Wm3N zAqAPjDcNFCOf2vG57ZX9gsexEPCAq6VcEEuyjzq9TDFTLUSiMs2/JOzUgUwW7epDG4DdXHT/F+ I6rSwwgzUXMRQFJ+RabeOzxX8Lq1ibqwekzSmiln1ddyAK3MW+YwCCskIZt31Xcnh1goSy4KaGR uCOoczFSmideGJ4uXUS6a3TUgfsAWoGYLZU1UYUQqDQMyyAzqCTMQDMxYp/dKA7iW4IQ6hxdm+p 8lLhJYH24HLkpnzVHVLeKX2u1gU1HwUHkLR4aQ0UZ3P6xd4C 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 | 38 +++++++++++++++++++++++= ++++ drivers/gpu/drm/drm_bridge.c | 15 +++++++++++ include/drm/display/drm_hdmi_cec_helper.h | 8 ++++++ include/drm/drm_bridge.h | 11 ++++++++ 4 files changed, 72 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 a6ed5f0fc3835b013a83308f5285ea0819c5702c..8cb3bd35febd55211f7088b9f47= dfc6a00c06109 100644 --- a/drivers/gpu/drm/display/drm_hdmi_cec_helper.c +++ b/drivers/gpu/drm/display/drm_hdmi_cec_helper.c @@ -207,3 +207,41 @@ 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_data) + drm_connector_hdmi_cec_transmit_done(bridge->cec_data, + 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_data) + drm_connector_hdmi_cec_transmit_attempt_done(bridge->cec_data, 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_data) + drm_connector_hdmi_cec_received_msg(bridge->cec_data, 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..7ee791aa8f962fb13467464cebb= 8f53ab06991f0 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,19 @@ void drm_bridge_hpd_notify(struct drm_bridge *bridge, } EXPORT_SYMBOL_GPL(drm_bridge_hpd_notify); =20 +void drm_bridge_cec_data_set(struct drm_bridge *bridge, void *cec_data) +{ + if (!(bridge->ops & DRM_BRIDGE_OP_HDMI)) + return; + + mutex_lock(&bridge->cec_mutex); + + bridge->cec_data =3D cec_data; + + mutex_unlock(&bridge->cec_mutex); +} +EXPORT_SYMBOL_GPL(drm_bridge_cec_data_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 a9d38835c69a2939ca21a4fc921136a2a022248c..04c0ac482e977423ebbf803fc58= 56321a6b0a523 100644 --- a/include/drm/display/drm_hdmi_cec_helper.h +++ b/include/drm/display/drm_hdmi_cec_helper.h @@ -7,6 +7,7 @@ =20 #include =20 +struct drm_bridge; struct drm_connector; =20 struct cec_msg; @@ -83,4 +84,11 @@ 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..df1d72c7e176c75585283684acc= 2ef2ffb2f8bff 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -939,6 +939,15 @@ struct drm_bridge { * @hpd_cb. */ void *hpd_data; + + /** + * @cec_mutex: Protects the @cec_data field. + */ + struct mutex cec_mutex; + /** + * @cec_data: Private data to be used by the CEC callbacks. + */ + void *cec_data; }; =20 static inline struct drm_bridge * @@ -1062,6 +1071,8 @@ 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_data_set(struct drm_bridge *bridge, void *cec_data); + #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 Fri Dec 19 21:28:39 2025 Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ADB301DB156 for ; Sun, 2 Feb 2025 12:07:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738498063; cv=none; b=VBvN/WD8I7MERu8hkGiNlaFVU938hd1m5rXhyShNDm1oj1JXJn9o78CFgVLRYty35xyia0NoYVaSyok1x/8XZRPb+yiE6ZsHGoZSO/jnTVB4x/inEWppsz4DXhypYLrTvulooQGQodNfZGn+Oq7fXcF2xhrosHPhmpIPjZv87Bg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738498063; c=relaxed/simple; bh=vbGZOMc+V4BW3oRtVXZ0aC7nodmuYNbj76HULcIcwv0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=p2gQV808svZDtF61Ykgn/6YYS1oK7Sa6ong9VeblAMFY4V8l0YQlggvzfE9TiD9qEKGOSDM68t2PCoFwo+J+PC+dy63zTuBa+d002g2uBuQNrv/8MnaLMf40DXrMBYvONFUkRzyrqv+8AF/MHvqiXZoDvO58QnVv7hIpeH4/5o8= 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=Z30m/C6S; arc=none smtp.client-ip=209.85.167.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="Z30m/C6S" Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-543e49a10f5so3623755e87.1 for ; Sun, 02 Feb 2025 04:07:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1738498060; x=1739102860; 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=RLHm3bhxZ2eEkV8ibPSP711qjdIHEc+NFBEKYoktv98=; b=Z30m/C6SpObTWdBf0kmpbhBXkz5S0CE4gPOBaclXkwyL13Kro1ODA0ilq/Xa2LNGQe 6DZ9HnkUX3JJn6qubXgVyVbTeCVVBuJITkIA3RA/Q76KSBXky3O2CyXt3I3DzK7295KI 0khZv+vkV1HeoC/nG2IyMAYNLpwfxltVGQPxr55pK7k4iiOG/5Uk/HvyN7MP/5j1IkwF V6NPVj5orm6i+NCsMyGbg8bFIpX53B8FjdmUqhT7WI4qyLwLfoqYp54PZJ08uO2ibrxr oDulizEvaJL83JHoD8MNY1SrrM5viwmN2qHYRlUugyLPiujDWIto6YV0dDr5SvPgiPLy gpbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738498060; x=1739102860; 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=RLHm3bhxZ2eEkV8ibPSP711qjdIHEc+NFBEKYoktv98=; b=NPE1Zu+34gbrcmgdJ/Nc2tnRybQKgwwKnFinkt0Na9mfB9joIPblc+hwOuayilbkzo Ja1ZNxj4S8Yhnjcf/D/nRWmSKJx7jTtGkK4AOZWpFmi3rCecBTaNN7AcVlTQa4AvG0a2 NEkoeEbvMZ+xxWMWMfXWJJgi6XNKcjEpkeCPuoP+iROR/URAWT603GkzVTQgwKjhR54Y sKJZd3yii6ZquaRvFer5X7dTiSGv99vI8xu1x3SQPI9vCKnce7lbAHGjhgLipa3D0i4q NzI7ljWcM3uL+4eoplIvcENvFeV9ROH0mDvHZrVs3rSED1bJJkwNnw4pS1RIERf+syXG PUaQ== X-Forwarded-Encrypted: i=1; AJvYcCWDy/hXW9zGbchgimVbkXzqjILIthwSL7pJ+NX+qx9m3fbe0dB9n1HZM3lTv5PA0IEuTVEIgj+11MmljtM=@vger.kernel.org X-Gm-Message-State: AOJu0YzllLZ56UAGUJrCVJObSj59gZPRLDMVvQeAmWeny2cjy7TkOD1l bnGsk12MSzeux6wUHW9EbWegMBd2n1F9tFT0j0QgqxkeTudSebnSDspofiG9/2w= X-Gm-Gg: ASbGncsn+NlWociO3rC4F0EV9Xp4NnTU3TpuF9ANLTjoqA1IkQTAoX3yZNBkoFI6ixO KYqbAX5gJcbM8whvtKRjw0Bt6rJl8cz7gmkFrSB4b/nXlW63ECNJrqCWpMAjdunb0BWNLz1nYGz OPNq8gzW0wg6wDO+1yBmz1Mj9IyfeIffN2nmof2LubLrwYzdJ0r4jk0deP4KbM7mCL6WbIKH413 A7VlFnLSZ0XMarr0mi6wBzzKT/Ha6BMPEjMZA5sgMfm77pNZTqpMrvMPyRAhrHXOTwcisvi218l HiOPEaQxjcGdZBqi58S78N8= X-Google-Smtp-Source: AGHT+IHl6Juy16UapZRrVEz0ow3vlGeH9cEUDfxCBbzvk2jva6MFi/0w8KegrO8cbZD1ar970A8W/g== X-Received: by 2002:a19:7501:0:b0:543:e409:1ff9 with SMTP id 2adb3069b0e04-543e4c3fcd7mr5502711e87.45.1738498059704; Sun, 02 Feb 2025 04:07:39 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-543ebe10678sm960695e87.101.2025.02.02.04.07.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 02 Feb 2025 04:07:38 -0800 (PST) From: Dmitry Baryshkov Date: Sun, 02 Feb 2025 14:07:17 +0200 Subject: [PATCH v4 10/12] 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: <20250202-drm-hdmi-connector-cec-v4-10-a71620a54d50@linaro.org> References: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@linaro.org> In-Reply-To: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@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=5547; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=vbGZOMc+V4BW3oRtVXZ0aC7nodmuYNbj76HULcIcwv0=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnn1/wfFeNKR9HpOseH3T/CD9wYWtVlkJ8lUjdy s9RyWPJUxaJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ59f8AAKCRCLPIo+Aiko 1X2AB/0SVy4DyopVw0b+xWrutXdBBkch9Iif/NmsivL4qQ2XNcULYty7QsSWuuS9chP6ZtPb+Kp yHT3+u//Fdgo1wzKzLLLV1RdC0tMLMN56O2+2cyRY0h4lZE259MTQdedCpzNlxfN46XEmAMDJiF 9GOI+JE3iLWHIDSygrHeFXQICC7Y/h02jOMKIJIsdrQshwm/3Yx80pY7PnQNz8AIfp0hFH2GwGq aH10pd3Wr1qxj0BnPlo6os5gjZUplbA+G+e/SA5b9A8Oe4uu7MMMB8irsJAcXhmbQJFqyGJwaIl dvswfLh1EUtbbKfQEjKyagsC3GfgiHvKgMPlURVt0ZYNCiGH 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 | 93 ++++++++++++++++++++++= ++++ include/drm/drm_bridge.h | 21 ++++++ 2 files changed, 114 insertions(+) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index 9f234bc647d5c0880d4c42aea130074b7fa54573..5b77fd59d79abddd419e611a786= 8b001857ccb37 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,82 @@ static const struct drm_connector_hdmi_audio_funcs drm= _bridge_connector_hdmi_aud .mute_stream =3D drm_bridge_connector_audio_mute_stream, }; =20 +static int drm_bridge_connector_hdmi_cec_enable(struct drm_connector *conn= ector, bool enable) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi; + + return bridge->funcs->hdmi_cec_enable(bridge, enable); +} + +static int drm_bridge_connector_hdmi_cec_log_addr(struct drm_connector *co= nnector, u8 logical_addr) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi; + + return bridge->funcs->hdmi_cec_log_addr(bridge, logical_addr); +} + +static int drm_bridge_connector_hdmi_cec_transmit(struct drm_connector *co= nnector, + u8 attempts, + u32 signal_free_time, + struct cec_msg *msg) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi; + + return bridge->funcs->hdmi_cec_transmit(bridge, attempts, + signal_free_time, + msg); +} + +static int drm_bridge_connector_hdmi_cec_init(struct drm_connector *connec= tor) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi; + + drm_bridge_cec_data_set(bridge, connector); + + if (!bridge->funcs->hdmi_cec_init) + return 0; + + return bridge->funcs->hdmi_cec_init(connector, bridge); +} + +static void drm_bridge_connector_hdmi_cec_unregister(struct drm_connector = *connector) +{ + 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_data_set(bridge, NULL); + + drm_connector_hdmi_cec_unregister(connector); +} + +static const struct drm_connector_hdmi_cec_adapter_ops drm_bridge_connecto= r_hdmi_cec_ops =3D { + .base.unregister =3D drm_bridge_connector_hdmi_cec_unregister, + .init =3D drm_bridge_connector_hdmi_cec_init, + .enable =3D drm_bridge_connector_hdmi_cec_enable, + .log_addr =3D drm_bridge_connector_hdmi_cec_log_addr, + .transmit =3D drm_bridge_connector_hdmi_cec_transmit, +}; + + /* -----------------------------------------------------------------------= ------ * Bridge Connector Initialisation */ @@ -633,6 +711,21 @@ struct drm_connector *drm_bridge_connector_init(struct= drm_device *drm, if (ret) return ERR_PTR(ret); } + + if (bridge->hdmi_cec_adapter_name) { + if (!bridge->funcs->hdmi_cec_enable || + !bridge->funcs->hdmi_cec_log_addr || + !bridge->funcs->hdmi_cec_transmit) + return ERR_PTR(-EINVAL); + + ret =3D drm_connector_hdmi_cec_register(connector, + &drm_bridge_connector_hdmi_cec_ops, + bridge->hdmi_cec_adapter_name, + bridge->hdmi_cec_available_las, + 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 df1d72c7e176c75585283684acc2ef2ffb2f8bff..b55e80a57758e8b652eac0cd01c= b245a04e221f5 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -32,6 +32,7 @@ #include #include =20 +struct cec_msg; struct device_node; =20 struct drm_bridge; @@ -729,6 +730,16 @@ struct drm_bridge_funcs { struct drm_bridge *bridge, bool enable, int direction); =20 + int (*hdmi_cec_init)(struct drm_connector *connector, + struct drm_bridge *bridge); + + int (*hdmi_cec_enable)(struct drm_bridge *bridge, bool enable); + + int (*hdmi_cec_log_addr)(struct drm_bridge *bridge, u8 logical_addr); + + int (*hdmi_cec_transmit)(struct drm_bridge *bridge, u8 attempts, + u32 signal_free_time, struct cec_msg *msg); + /** * @debugfs_init: * @@ -924,6 +935,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 From nobody Fri Dec 19 21:28:39 2025 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 138E71DB922 for ; Sun, 2 Feb 2025 12:07:43 +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=1738498066; cv=none; b=nncgWb0nK5M286ewFSuHOQ6rCfedOY6S5qV+v2BWLxnBgPl/MwSl5voRP7KoD497CGu/YH9AMKskr9NSOxxqYPGxUTuLLgANxRxIQepIvxpJ2k5juwvKsanlRbcfr6u1r4v1QWXQgtMvH24KS//cZOni0wogSZfF5nLDh3oHpj4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738498066; c=relaxed/simple; bh=XuOnNZyKMEJb21dZJ9EH3JWXRxLeBXLJ2lTgW8+4Ysg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=R6twV6Ni/lX86e51G27G4uXsIh7dzC0+3khIMqbwrBFDxR1mN20+9V0U5idJfO+OLgMU+huZI65oNVXARk424K3HUGp+ZMwO+tIn07kpDuDMJlof4HeA7lCLHfHAhca4jtNndd3PVa1wAM8z4vkGZx0NcuYDJ2ACzx6ZAsJeo6I= 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=Y/Utwt9W; 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="Y/Utwt9W" Received: by mail-lf1-f48.google.com with SMTP id 2adb3069b0e04-5401bd6cdb7so3557169e87.2 for ; Sun, 02 Feb 2025 04:07:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1738498062; x=1739102862; 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=+MoLTLfgvVTsssQwkzTJYb/dVBWcoZtvFgCsxLGAPgE=; b=Y/Utwt9WgIpcnI+eGoPL7t1x6AU0QKX67H1oJQPGaseFiYS8yCEqfzvpSlpS4z2Mm4 6DRDXDKQiboKWwZZTvb5XEp0qVYn4Cl277E5qCqSh5yvJfXoI8K2DSOWYLU0CtHxm9y5 myaaYPNCP7OdmzVcuWHKGfa4O6YO4veoG4lr3LPuMvJcm43B3DugUsFSL4/JvL+Y/VD7 DpI9ReS4m47NMepYxO2iCCryWFEII6uzH3fepEUyB+vTT0DHXYcHggXjL0A3b3r7UlA4 xhMALPAA152SH7bLODp+V5JqVLTOD9MRQOt/Ufk21C0f40c+e/HvhMHq/hkpZj4Qaf4O bWHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738498062; x=1739102862; 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=+MoLTLfgvVTsssQwkzTJYb/dVBWcoZtvFgCsxLGAPgE=; b=vAFYWZ8SjZjGZJL8ArNLF8rAM+D1GuelvowN/k+DVNeWdtdDDWTNBtCz4yQ+BeEj+0 uDGzBQgfh5zLRuWQM8JxFrgTWft38IkhEWtOeIMhDV4hOzuLkTVWENruhUMj7y2hyg6F 44NbOGp9zZe7Ap1vGvJdkuH5dV2AsIo4Z+6yBDCDftP69H5VIMV3fuENZJKPKWg34jBI t/vhU90/34FnaFmkRzs0a2N3mUMzVgj/i2QstPx1X1nYYfoh3BmANSOipfToR0m1WjJ5 SeGbTbrKpHdftgw1lNy0g5tIw+V1Jm0GzZiITKPRRu6rnp80ya16hRAuaTfh4wdWfuOF EmvQ== X-Forwarded-Encrypted: i=1; AJvYcCWjP7/1iaGZA3VvnEl5k1MsdfxOSWVGGSd+xw2bGq2+Z489bgHpoWv3ELmpaP0o45nMByelSRCgGGqb2J0=@vger.kernel.org X-Gm-Message-State: AOJu0Ywe0f8/ft+g3cPBBPXvH0oqVHt/rU7YgpMZBQTN+4BUSgJ1NSQR qBP21EW3Hy0d5uUN8PmjachxRt9nyMe4KmfyXqceBNO6VfYPNkH5BXdk6HnnMlo= X-Gm-Gg: ASbGncsiBsWxJpWs2JfSx7ala35Acn8qHroeicgLJ9IxUEfTsGjRkTSWvjNUDH0deA/ SvSU/N/PDbNcHqpVbpVg3H62JpOsgXDKVKkQo0r2bHWDJAs+hpgo55r4wmGFi0q66hwm4BHjh1s TuhjZYEwZdx9JSFe8ymMM7y5DcrsdGhqt5lkdUhA49axA7iw7hvLB1cQTeUcok24o/uhSUWLabD m9svKlcvUARt7c0Kz2iFBTLq2sHRmbLbfOUzt1VyCsOact5OfP26UqufB11zOyBQLtxRSA69w9i QCWpAbtimzuioqtf2iJh1Us= X-Google-Smtp-Source: AGHT+IEUfKalUUWmsX+oOc7nb71WmMl6KQYlZpeoQhbwmbgJuGfKMeIWAK+je0Hh3gf7oZept1ESmQ== X-Received: by 2002:ac2:4359:0:b0:542:63a8:3939 with SMTP id 2adb3069b0e04-543e4bda7f7mr4400941e87.8.1738498062162; Sun, 02 Feb 2025 04:07:42 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-543ebe10678sm960695e87.101.2025.02.02.04.07.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 02 Feb 2025 04:07:40 -0800 (PST) From: Dmitry Baryshkov Date: Sun, 02 Feb 2025 14:07:18 +0200 Subject: [PATCH v4 11/12] drm/bridge: allow limiting I2S formats Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250202-drm-hdmi-connector-cec-v4-11-a71620a54d50@linaro.org> References: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@linaro.org> In-Reply-To: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@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=4155; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=XuOnNZyKMEJb21dZJ9EH3JWXRxLeBXLJ2lTgW8+4Ysg=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnn1/wiHzrUFyZRkzXg+ByNNejNZcYn/ntJumxS 9JD2ckY6uiJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ59f8AAKCRCLPIo+Aiko 1ZaIB/9P498XbecyJ6BY6TpSBwrlCvRt4rxa7PvPWrV13TLDTs+X1LjJ24rZz+Qq0rjMnUDtBo8 mMhyqMNGSjmGwz+xgpf2EiyXPJoDTUWv4RlWpevFe2FKXE7ZDI01M4ZedO/z/TBCaiORE+ky/bB LiMQQqU6JEM0WTatd3WuZTu7H//dzRLiHJhZwBaoFXaneIXnow+wJTpOv3GrXJ4NKWrOB0gEQwk QFn+Y/bhJ2xP4ALG4435t1OUdPWNWt0cC+vkGYwvn25Yjb44B2CqWA+xbd8Wo2ZeMCpI/pIQUM6 WsPTDzmTmKtOdZiN68MGZaUqLtMdUKfjc9aLYmZrttcawjmU X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A By default HDMI codec registers all formats supported on the I2S bus. Allow bridges (and connectors) to limit the list of the PCM formats supported by the HDMI codec. Reviewed-by: Maxime Ripard Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/display/drm_bridge_connector.c | 1 + drivers/gpu/drm/display/drm_hdmi_audio_helper.c | 2 ++ drivers/gpu/drm/vc4/vc4_hdmi.c | 2 +- include/drm/display/drm_hdmi_audio_helper.h | 1 + include/drm/drm_bridge.h | 7 +++++++ 5 files changed, 12 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index 5b77fd59d79abddd419e611a7868b001857ccb37..28055bc2e7069d738bbe76b16c3= bbde06f2d6e4e 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -698,6 +698,7 @@ struct drm_connector *drm_bridge_connector_init(struct = drm_device *drm, bridge->hdmi_dev, &drm_bridge_connector_hdmi_audio_funcs, bridge->hdmi_audio_max_i2s_playback_channels, + bridge->hdmi_audio_i2s_formats, bridge->hdmi_audio_spdif_playback, bridge->hdmi_audio_dai_port); if (ret) diff --git a/drivers/gpu/drm/display/drm_hdmi_audio_helper.c b/drivers/gpu/= drm/display/drm_hdmi_audio_helper.c index 05afc9f0bdd6b6f00d74223a9d8875e6d16aea5f..589b0bd6c21366b83bd4d1131e8= 9c71644ebc401 100644 --- a/drivers/gpu/drm/display/drm_hdmi_audio_helper.c +++ b/drivers/gpu/drm/display/drm_hdmi_audio_helper.c @@ -154,6 +154,7 @@ int drm_connector_hdmi_audio_init(struct drm_connector = *connector, struct device *hdmi_codec_dev, const struct drm_connector_hdmi_audio_funcs *funcs, unsigned int max_i2s_playback_channels, + u64 i2s_formats, bool spdif_playback, int dai_port) { @@ -161,6 +162,7 @@ int drm_connector_hdmi_audio_init(struct drm_connector = *connector, .ops =3D &drm_connector_hdmi_audio_ops, .max_i2s_channels =3D max_i2s_playback_channels, .i2s =3D !!max_i2s_playback_channels, + .i2s_formats =3D i2s_formats, .spdif =3D spdif_playback, .no_i2s_capture =3D true, .no_spdif_capture =3D true, diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 1108983c44858382cb9f09b686956903645ebe0a..fcaba4a64a33b2267b22960772c= 2977b4109c67f 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -582,7 +582,7 @@ static int vc4_hdmi_connector_init(struct drm_device *d= ev, =20 ret =3D drm_connector_hdmi_audio_init(connector, dev->dev, &vc4_hdmi_audio_funcs, - 8, false, -1); + 8, 0, false, -1); if (ret) return ret; =20 diff --git a/include/drm/display/drm_hdmi_audio_helper.h b/include/drm/disp= lay/drm_hdmi_audio_helper.h index c9a6faef4109f20ba79b610a9d5e8d5980efe2d1..44d910bdc72dd2fdbbe7ada65b6= 7080d4a41e88b 100644 --- a/include/drm/display/drm_hdmi_audio_helper.h +++ b/include/drm/display/drm_hdmi_audio_helper.h @@ -14,6 +14,7 @@ int drm_connector_hdmi_audio_init(struct drm_connector *c= onnector, struct device *hdmi_codec_dev, const struct drm_connector_hdmi_audio_funcs *funcs, unsigned int max_i2s_playback_channels, + u64 i2s_formats, bool spdif_playback, int sound_dai_port); void drm_connector_hdmi_audio_plugged_notify(struct drm_connector *connect= or, diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index b55e80a57758e8b652eac0cd01cb245a04e221f5..3fcefe8c6720e193beefd7019fa= 456231181cddb 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -920,6 +920,13 @@ struct drm_bridge { */ int hdmi_audio_max_i2s_playback_channels; =20 + /** + * @hdmi_audio_i2s_formats: supported I2S formats, optional. The + * default is to allow all formats supported by the corresponding I2S + * bus driver. + */ + u64 hdmi_audio_i2s_formats; + /** * @hdmi_audio_spdif_playback: set if HDMI codec has S/PDIF playback port */ --=20 2.39.5 From nobody Fri Dec 19 21:28:39 2025 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 D8CB01DB37C for ; Sun, 2 Feb 2025 12:07:45 +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=1738498069; cv=none; b=HMClxd2s7U9xj8L1r8nSoBdE4laii9hVqVcZ+S9a9MOSveLpnmLiCmrg9O8wALns17yg9D5p8dTF1PmxOINTpzcplePisaIzv6XNHeTLhD620j344/jXBfyW84Qoak3tbz+iCI9WMNhhFRmtw9Z0OdyD7C7M8pokfT4+G/V+RiI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738498069; c=relaxed/simple; bh=lJ6Es1IE98Dx2z3zkRUZMAXEtuf423vs1ZA2ENaTKvk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PWrXiNNfSUqlen9XF1lE7sKvzKS0BGEQ26/b0ZZCGs9jWrY0ug3rsd38Mh5FjdcCfgLLRIMaN4LZgE65KN3PNBjrBBb72O7AVf/hUI5ObnfuP+VDHj7a7vo2UV+PbsWxlrPhRl9waL+AXNmBWZ6yEjG7fndstBYqKto+CvVCgmc= 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=pdvnW2jc; 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="pdvnW2jc" Received: by mail-lf1-f44.google.com with SMTP id 2adb3069b0e04-543d8badc30so3629858e87.0 for ; Sun, 02 Feb 2025 04:07:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1738498064; x=1739102864; 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=LqCNtXhuNOYeqhnCsh823VdwuB53D/PNW9qZaLjqVbo=; b=pdvnW2jcV5TIjMzrEWucVCMWP6tTEA3FejPXQFqHaPlCs9mPXnptcxANOnzCzJmTHt qhONLYLqVCAc8pbtc4B1IiMe5N2RaQL37MGg/pDe1eYBUVKdOJ1QwmWgCd+4K3/i+zJb +gLccU47tifSsTvDPAzs0BvnG83VaETFT2KDlaawQhMHzahVbZdpb+ix91DAEuEY22BS RdZ3RYYDaUdmU1IQ2zfqtAhqyrG7Q1LJyPm0GE7yV9oBv68qdMp/ggUrwROqG2FCwoPk 1a1Z5X/iVcx8hui8cDs8zLqRnuOvdp9uE2YtF6cUdKJodmyS/vyxwDK0ygxKVpiWQwXg P0Ew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738498064; x=1739102864; 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=LqCNtXhuNOYeqhnCsh823VdwuB53D/PNW9qZaLjqVbo=; b=nmGv5J6EugCfZOjSrmQrLMjsvsmDH2lAeOokQMMHgpz/MxTPL1UxsSdc4KBJqS0txX CVxtyJexL/O516BbglQqvbbRR3cryKWhFLuf1MJ8Fs5ELUyo4tztEEzdXIIpXSfGqK3D 3qppYJdAL0Q1L4tGM08C0gaenTTXTZu6CPXiyk37lpIIgK/nFgaKE+/JYOfo44shU1RM MXuIZn8fNDcR2Om8OS/fzqt0rLIbA4iMcXy4Mm0HRCgMXnpRVprmYZHVeGF7VoWDAN0t 9UWeDtOUpmNA5dQvSnIvYmev2qLIEX6R0qS4f59+tJA2IK/75D9RHtnM4ywNC77onY1n /8rQ== X-Forwarded-Encrypted: i=1; AJvYcCXT0xBUZmC1H/0XDD1CH9+dp4Rtr7S/fyergEeMb8g1XG//yaRzRgoyo67CQn1Z45Gd4w2r2DUWnTUXVU0=@vger.kernel.org X-Gm-Message-State: AOJu0YxWcyFXBY5ro26h1bcKYYjGjWtoNB7B68g473wEgFTvjMrPagL2 +6lvLbG4Vb6waPYyyvJVJYBqlU2auLRpSCpe11dp+ZrR/kzUhu40F1TccZo98Tk= X-Gm-Gg: ASbGnctvDlWiOD0hJL5IF2xIJSzVl3WE/mPMOah4zfYWmBXANVD0aC7L6ZE4avyKS8H KhicNo6YyGpguNAUXeA7h7lAbeBW90k1LmahJWbxL7PNcUcbK+GLtzO/Ay382I60amkn9DRQY0K FNmHU0JnjspM5FJ+kBJih7Axr6uOsU6drnkafdjp5vJeNu0xlKkn9/ChpSeP88HFlyaLLRw5Bls mvw8vw5WbG6OIM9I0f5omb19E9QoSNkGQgcxD5JRJ8awJE19+5n8yoiwETMJBqYERmldh3k4nT1 Au1CMc45HijHyeh80wDW98Q= X-Google-Smtp-Source: AGHT+IHr7sXeenRYFXiYfSUh0XCasjLH+ETIN+FWeMq7T/9YHqjN5t+NsrCsV2QtcWGL+bXErXIfyg== X-Received: by 2002:ac2:46ef:0:b0:543:c3d9:418d with SMTP id 2adb3069b0e04-543e4be9663mr4977894e87.22.1738498063807; Sun, 02 Feb 2025 04:07:43 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-543ebe10678sm960695e87.101.2025.02.02.04.07.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 02 Feb 2025 04:07:42 -0800 (PST) From: Dmitry Baryshkov Date: Sun, 02 Feb 2025 14:07:19 +0200 Subject: [PATCH v4 12/12] drm/bridge: adv7511: switch to the HDMI connector helpers Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250202-drm-hdmi-connector-cec-v4-12-a71620a54d50@linaro.org> References: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@linaro.org> In-Reply-To: <20250202-drm-hdmi-connector-cec-v4-0-a71620a54d50@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=34304; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=lJ6Es1IE98Dx2z3zkRUZMAXEtuf423vs1ZA2ENaTKvk=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnn1/wTXctcS+e7c+ryjIb9Ats5UX07EZRsdnMR uDBBovMoVKJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZ59f8AAKCRCLPIo+Aiko 1eGSCACOzuQeCiMfrpGaq0r+h/M8wxX6e7LCBNhwtbaVXeTtZbtisKjZlFxUc8KoLIbbr7hBJj4 SzizOxNLzdnDv0pA69ZRyEXQmTdBEisn8Pe53X4h+5PuuvDBCCvCUGqU+9rDU498PPsXgh/Aa7R 5TMk6s5U8Lwory5JL3ZshPDbZ5adGBIoA1qCibAcMAVvoZKTN/YelP32rAhg4fANTo4mXKNEc64 VxedvUtrqgP7+hQN6hwADZ/m+zxR57V8jMFhxrkWS2TyQHHdi7Ox+clMALUC4CbKyJ0q7r9Dh2I u6+sciwzjNBF9ZBmdhw1aMAMjxSfielIozeZmd8gT3jFeplF X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A Rewrite the ADV7511 driver to use implementation provided by the DRM HDMI connector framework, including the Audio and CEC bits. Drop the in-bridge connector support and use drm_bridge_connector if the host requires the connector to be provided by the bridge. Note: currently only AVI InfoFrames are supported. Existing driver doesn't support programming any other InfoFrames directly and Audio InfoFrame seems to be programmed using individual bits and pieces rather than programming it directly. Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/bridge/adv7511/Kconfig | 5 +- drivers/gpu/drm/bridge/adv7511/adv7511.h | 51 ++-- drivers/gpu/drm/bridge/adv7511/adv7511_audio.c | 77 +----- drivers/gpu/drm/bridge/adv7511/adv7511_cec.c | 56 ++-- drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 342 +++++++++++----------= ---- drivers/gpu/drm/bridge/adv7511/adv7533.c | 4 - 6 files changed, 206 insertions(+), 329 deletions(-) diff --git a/drivers/gpu/drm/bridge/adv7511/Kconfig b/drivers/gpu/drm/bridg= e/adv7511/Kconfig index f46a5e26b5dd640670afa21802f9019d5c7439fb..59a5256ce8a6e16dfbf1848a7c8= 5ac7d709a68ed 100644 --- a/drivers/gpu/drm/bridge/adv7511/Kconfig +++ b/drivers/gpu/drm/bridge/adv7511/Kconfig @@ -5,6 +5,9 @@ config DRM_I2C_ADV7511 select DRM_KMS_HELPER select REGMAP_I2C select DRM_MIPI_DSI + select DRM_DISPLAY_HELPER + select DRM_BRIDGE_CONNECTOR + select DRM_DISPLAY_HDMI_STATE_HELPER help Support for the Analog Devices ADV7511(W)/13/33/35 HDMI encoders. =20 @@ -19,7 +22,7 @@ config DRM_I2C_ADV7511_AUDIO config DRM_I2C_ADV7511_CEC bool "ADV7511/33/35 HDMI CEC driver" depends on DRM_I2C_ADV7511 - select CEC_CORE + select DRM_DISPLAY_HDMI_CEC_HELPER default y help When selected the HDMI transmitter will support the CEC feature. diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511.h b/drivers/gpu/drm/bri= dge/adv7511/adv7511.h index ec0b7f3d889c4eedeb1d80369fd2a160cd0e2968..530eb124b8969441939d8a1b7e9= c1268eb929672 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511.h +++ b/drivers/gpu/drm/bridge/adv7511/adv7511.h @@ -313,16 +313,11 @@ enum adv7511_csc_scaling { * @csc_enable: Whether to enable color space conversion * @csc_scaling_factor: Color space conversion scaling factor * @csc_coefficents: Color space conversion coefficents - * @hdmi_mode: Whether to use HDMI or DVI output mode - * @avi_infoframe: HDMI infoframe */ struct adv7511_video_config { bool csc_enable; enum adv7511_csc_scaling csc_scaling_factor; const uint16_t *csc_coefficents; - - bool hdmi_mode; - struct hdmi_avi_infoframe avi_infoframe; }; =20 enum adv7511_type { @@ -337,6 +332,7 @@ struct adv7511_chip_info { enum adv7511_type type; unsigned int max_mode_clock_khz; unsigned int max_lane_freq_khz; + const char *name; const char * const *supply_names; unsigned int num_supplies; unsigned int reg_cec_offset; @@ -371,7 +367,6 @@ struct adv7511 { struct work_struct hpd_work; =20 struct drm_bridge bridge; - struct drm_connector connector; =20 bool embedded_sync; enum adv7511_sync_polarity vsync_polarity; @@ -389,9 +384,7 @@ struct adv7511 { bool use_timing_gen; =20 const struct adv7511_chip_info *info; - struct platform_device *audio_pdev; =20 - struct cec_adapter *cec_adap; u8 cec_addr[ADV7511_MAX_ADDRS]; u8 cec_valid_addrs; bool cec_enabled_adap; @@ -399,16 +392,24 @@ struct adv7511 { u32 cec_clk_freq; }; =20 +static inline struct adv7511 *bridge_to_adv7511(struct drm_bridge *bridge) +{ + return container_of(bridge, struct adv7511, bridge); +} + #ifdef CONFIG_DRM_I2C_ADV7511_CEC -int adv7511_cec_init(struct device *dev, struct adv7511 *adv7511); +int adv7511_cec_init(struct drm_connector *connector, + struct drm_bridge *bridge); +int adv7511_cec_enable(struct drm_bridge *bridge, bool enable); +int adv7511_cec_log_addr(struct drm_bridge *bridge, u8 addr); +int adv7511_cec_transmit(struct drm_bridge *bridge, u8 attempts, + u32 signal_free_time, struct cec_msg *msg); int adv7511_cec_irq_process(struct adv7511 *adv7511, unsigned int irq1); #else -static inline int adv7511_cec_init(struct device *dev, struct adv7511 *adv= 7511) -{ - regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL, - ADV7511_CEC_CTRL_POWER_DOWN); - return 0; -} +#define adv7511_cec_init NULL +#define adv7511_cec_enable NULL +#define adv7511_cec_log_addr NULL +#define adv7511_cec_transmit NULL #endif =20 void adv7533_dsi_power_on(struct adv7511 *adv); @@ -421,16 +422,18 @@ int adv7533_attach_dsi(struct adv7511 *adv); int adv7533_parse_dt(struct device_node *np, struct adv7511 *adv); =20 #ifdef CONFIG_DRM_I2C_ADV7511_AUDIO -int adv7511_audio_init(struct device *dev, struct adv7511 *adv7511); -void adv7511_audio_exit(struct adv7511 *adv7511); +int adv7511_hdmi_audio_startup(struct drm_connector *connector, + struct drm_bridge *bridge); +void adv7511_hdmi_audio_shutdown(struct drm_connector *connector, + struct drm_bridge *bridge); +int adv7511_hdmi_audio_prepare(struct drm_connector *connector, + struct drm_bridge *bridge, + struct hdmi_codec_daifmt *fmt, + struct hdmi_codec_params *hparms); #else /*CONFIG_DRM_I2C_ADV7511_AUDIO */ -static inline int adv7511_audio_init(struct device *dev, struct adv7511 *a= dv7511) -{ - return 0; -} -static inline void adv7511_audio_exit(struct adv7511 *adv7511) -{ -} +#define adv7511_hdmi_audio_startup NULL +#define adv7511_hdmi_audio_shutdown NULL +#define adv7511_hdmi_audio_prepare NULL #endif /* CONFIG_DRM_I2C_ADV7511_AUDIO */ =20 #endif /* __DRM_I2C_ADV7511_H__ */ diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c b/drivers/gpu/d= rm/bridge/adv7511/adv7511_audio.c index 36a7b6f085f9a0fa2c60660df4f569b24b49c4be..9d0193075528186f47ae73a284c= 25376c41075a4 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c @@ -55,11 +55,12 @@ static int adv7511_update_cts_n(struct adv7511 *adv7511) return 0; } =20 -static int adv7511_hdmi_hw_params(struct device *dev, void *data, - struct hdmi_codec_daifmt *fmt, - struct hdmi_codec_params *hparms) +int adv7511_hdmi_audio_prepare(struct drm_connector *connector, + struct drm_bridge *bridge, + struct hdmi_codec_daifmt *fmt, + struct hdmi_codec_params *hparms) { - struct adv7511 *adv7511 =3D dev_get_drvdata(dev); + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); unsigned int audio_source, i2s_format =3D 0; unsigned int invert_clock; unsigned int rate; @@ -158,9 +159,10 @@ static int adv7511_hdmi_hw_params(struct device *dev, = void *data, return 0; } =20 -static int audio_startup(struct device *dev, void *data) +int adv7511_hdmi_audio_startup(struct drm_connector *connector, + struct drm_bridge *bridge) { - struct adv7511 *adv7511 =3D dev_get_drvdata(dev); + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); =20 regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_CONFIG, BIT(7), 0); @@ -194,69 +196,12 @@ static int audio_startup(struct device *dev, void *da= ta) return 0; } =20 -static void audio_shutdown(struct device *dev, void *data) +void adv7511_hdmi_audio_shutdown(struct drm_connector *connector, + struct drm_bridge *bridge) { - struct adv7511 *adv7511 =3D dev_get_drvdata(dev); + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); =20 if (adv7511->audio_source =3D=3D ADV7511_AUDIO_SOURCE_SPDIF) regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_CONFIG, BIT(7), 0); } - -static int adv7511_hdmi_i2s_get_dai_id(struct snd_soc_component *component, - struct device_node *endpoint, - void *data) -{ - struct of_endpoint of_ep; - int ret; - - ret =3D of_graph_parse_endpoint(endpoint, &of_ep); - if (ret < 0) - return ret; - - /* - * HDMI sound should be located as reg =3D <2> - * Then, it is sound port 0 - */ - if (of_ep.port =3D=3D 2) - return 0; - - return -EINVAL; -} - -static const struct hdmi_codec_ops adv7511_codec_ops =3D { - .hw_params =3D adv7511_hdmi_hw_params, - .audio_shutdown =3D audio_shutdown, - .audio_startup =3D audio_startup, - .get_dai_id =3D adv7511_hdmi_i2s_get_dai_id, -}; - -static const struct hdmi_codec_pdata codec_data =3D { - .ops =3D &adv7511_codec_ops, - .i2s_formats =3D (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | - SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_LE | - SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE), - .max_i2s_channels =3D 2, - .i2s =3D 1, - .no_i2s_capture =3D 1, - .spdif =3D 1, - .no_spdif_capture =3D 1, -}; - -int adv7511_audio_init(struct device *dev, struct adv7511 *adv7511) -{ - adv7511->audio_pdev =3D platform_device_register_data(dev, - HDMI_CODEC_DRV_NAME, - PLATFORM_DEVID_AUTO, - &codec_data, - sizeof(codec_data)); - return PTR_ERR_OR_ZERO(adv7511->audio_pdev); -} - -void adv7511_audio_exit(struct adv7511 *adv7511) -{ - if (adv7511->audio_pdev) { - platform_device_unregister(adv7511->audio_pdev); - adv7511->audio_pdev =3D NULL; - } -} diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_cec.c b/drivers/gpu/drm= /bridge/adv7511/adv7511_cec.c index 2e9c88a2b5ed44ef0cd417c553ea7873d00e4a14..bc96f46bbc4480d3439e821991d= ab81ae4950208 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511_cec.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_cec.c @@ -12,6 +12,8 @@ =20 #include =20 +#include + #include "adv7511.h" =20 static const u8 ADV7511_REG_CEC_RX_FRAME_HDR[] =3D { @@ -44,8 +46,8 @@ static void adv_cec_tx_raw_status(struct adv7511 *adv7511= , u8 tx_raw_status) return; =20 if (tx_raw_status & ADV7511_INT1_CEC_TX_ARBIT_LOST) { - cec_transmit_attempt_done(adv7511->cec_adap, - CEC_TX_STATUS_ARB_LOST); + drm_bridge_cec_transmit_attempt_done(&adv7511->bridge, + CEC_TX_STATUS_ARB_LOST); return; } if (tx_raw_status & ADV7511_INT1_CEC_TX_RETRY_TIMEOUT) { @@ -72,12 +74,13 @@ static void adv_cec_tx_raw_status(struct adv7511 *adv75= 11, u8 tx_raw_status) if (low_drive_cnt) status |=3D CEC_TX_STATUS_LOW_DRIVE; } - cec_transmit_done(adv7511->cec_adap, status, - 0, nack_cnt, low_drive_cnt, err_cnt); + drm_bridge_cec_transmit_done(&adv7511->bridge, status, + 0, nack_cnt, low_drive_cnt, + err_cnt); return; } if (tx_raw_status & ADV7511_INT1_CEC_TX_READY) { - cec_transmit_attempt_done(adv7511->cec_adap, CEC_TX_STATUS_OK); + drm_bridge_cec_transmit_attempt_done(&adv7511->bridge, CEC_TX_STATUS_OK); return; } } @@ -116,7 +119,7 @@ static void adv7511_cec_rx(struct adv7511 *adv7511, int= rx_buf) regmap_update_bits(adv7511->regmap_cec, ADV7511_REG_CEC_RX_BUFFERS + offset, BIT(rx_buf), 0); =20 - cec_received_msg(adv7511->cec_adap, &msg); + drm_bridge_cec_received_msg(&adv7511->bridge, &msg); } =20 int adv7511_cec_irq_process(struct adv7511 *adv7511, unsigned int irq1) @@ -179,9 +182,9 @@ int adv7511_cec_irq_process(struct adv7511 *adv7511, un= signed int irq1) return IRQ_HANDLED; } =20 -static int adv7511_cec_adap_enable(struct cec_adapter *adap, bool enable) +int adv7511_cec_enable(struct drm_bridge *bridge, bool enable) { - struct adv7511 *adv7511 =3D cec_get_drvdata(adap); + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); unsigned int offset =3D adv7511->info->reg_cec_offset; =20 if (adv7511->i2c_cec =3D=3D NULL) @@ -225,9 +228,9 @@ static int adv7511_cec_adap_enable(struct cec_adapter *= adap, bool enable) return 0; } =20 -static int adv7511_cec_adap_log_addr(struct cec_adapter *adap, u8 addr) +int adv7511_cec_log_addr(struct drm_bridge *bridge, u8 addr) { - struct adv7511 *adv7511 =3D cec_get_drvdata(adap); + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); unsigned int offset =3D adv7511->info->reg_cec_offset; unsigned int i, free_idx =3D ADV7511_MAX_ADDRS; =20 @@ -293,10 +296,10 @@ static int adv7511_cec_adap_log_addr(struct cec_adapt= er *adap, u8 addr) return 0; } =20 -static int adv7511_cec_adap_transmit(struct cec_adapter *adap, u8 attempts, - u32 signal_free_time, struct cec_msg *msg) +int adv7511_cec_transmit(struct drm_bridge *bridge, u8 attempts, + u32 signal_free_time, struct cec_msg *msg) { - struct adv7511 *adv7511 =3D cec_get_drvdata(adap); + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); unsigned int offset =3D adv7511->info->reg_cec_offset; u8 len =3D msg->len; unsigned int i; @@ -328,12 +331,6 @@ static int adv7511_cec_adap_transmit(struct cec_adapte= r *adap, u8 attempts, return 0; } =20 -static const struct cec_adap_ops adv7511_cec_adap_ops =3D { - .adap_enable =3D adv7511_cec_adap_enable, - .adap_log_addr =3D adv7511_cec_adap_log_addr, - .adap_transmit =3D adv7511_cec_adap_transmit, -}; - static int adv7511_cec_parse_dt(struct device *dev, struct adv7511 *adv751= 1) { adv7511->cec_clk =3D devm_clk_get(dev, "cec"); @@ -348,21 +345,17 @@ static int adv7511_cec_parse_dt(struct device *dev, s= truct adv7511 *adv7511) return 0; } =20 -int adv7511_cec_init(struct device *dev, struct adv7511 *adv7511) +int adv7511_cec_init(struct drm_connector *connector, + struct drm_bridge *bridge) { + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); + struct device *dev =3D &adv7511->i2c_main->dev; unsigned int offset =3D adv7511->info->reg_cec_offset; int ret =3D adv7511_cec_parse_dt(dev, adv7511); =20 if (ret) goto err_cec_parse_dt; =20 - adv7511->cec_adap =3D cec_allocate_adapter(&adv7511_cec_adap_ops, - adv7511, dev_name(dev), CEC_CAP_DEFAULTS, ADV7511_MAX_ADDRS); - if (IS_ERR(adv7511->cec_adap)) { - ret =3D PTR_ERR(adv7511->cec_adap); - goto err_cec_alloc; - } - regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL, 0); /* cec soft reset */ regmap_write(adv7511->regmap_cec, @@ -378,17 +371,8 @@ int adv7511_cec_init(struct device *dev, struct adv751= 1 *adv7511) ADV7511_REG_CEC_CLK_DIV + offset, ((adv7511->cec_clk_freq / 750000) - 1) << 2); =20 - ret =3D cec_register_adapter(adv7511->cec_adap, dev); - if (ret) - goto err_cec_register; return 0; =20 -err_cec_register: - cec_delete_adapter(adv7511->cec_adap); - adv7511->cec_adap =3D NULL; -err_cec_alloc: - dev_info(dev, "Initializing CEC failed with error %d, disabling CEC\n", - ret); err_cec_parse_dt: regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL, ADV7511_CEC_CTRL_POWER_DOWN); diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm= /bridge/adv7511/adv7511_drv.c index 1a76aea6a945ed4b23239edbf084681462fac1d9..60264bc903b58a72e8a2cd772ea= 07766c0ad12cf 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c @@ -12,14 +12,17 @@ #include #include =20 -#include +#include =20 #include #include +#include #include #include #include #include +#include +#include =20 #include "adv7511.h" =20 @@ -203,62 +206,37 @@ static const uint16_t adv7511_csc_ycbcr_to_rgb[] =3D { =20 static void adv7511_set_config_csc(struct adv7511 *adv7511, struct drm_connector *connector, - bool rgb, bool hdmi_mode) + bool rgb) { struct adv7511_video_config config; bool output_format_422, output_format_ycbcr; unsigned int mode; - uint8_t infoframe[17]; - - config.hdmi_mode =3D hdmi_mode; - - hdmi_avi_infoframe_init(&config.avi_infoframe); - - config.avi_infoframe.scan_mode =3D HDMI_SCAN_MODE_UNDERSCAN; =20 if (rgb) { config.csc_enable =3D false; - config.avi_infoframe.colorspace =3D HDMI_COLORSPACE_RGB; + output_format_422 =3D false; + output_format_ycbcr =3D false; } else { config.csc_scaling_factor =3D ADV7511_CSC_SCALING_4; config.csc_coefficents =3D adv7511_csc_ycbcr_to_rgb; =20 if ((connector->display_info.color_formats & DRM_COLOR_FORMAT_YCBCR422) && - config.hdmi_mode) { + connector->display_info.is_hdmi) { config.csc_enable =3D false; - config.avi_infoframe.colorspace =3D - HDMI_COLORSPACE_YUV422; - } else { - config.csc_enable =3D true; - config.avi_infoframe.colorspace =3D HDMI_COLORSPACE_RGB; - } - } - - if (config.hdmi_mode) { - mode =3D ADV7511_HDMI_CFG_MODE_HDMI; - - switch (config.avi_infoframe.colorspace) { - case HDMI_COLORSPACE_YUV444: - output_format_422 =3D false; - output_format_ycbcr =3D true; - break; - case HDMI_COLORSPACE_YUV422: output_format_422 =3D true; output_format_ycbcr =3D true; - break; - default: + } else { + config.csc_enable =3D true; output_format_422 =3D false; output_format_ycbcr =3D false; - break; } - } else { - mode =3D ADV7511_HDMI_CFG_MODE_DVI; - output_format_422 =3D false; - output_format_ycbcr =3D false; } =20 - adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME); + if (connector->display_info.is_hdmi) + mode =3D ADV7511_HDMI_CFG_MODE_HDMI; + else + mode =3D ADV7511_HDMI_CFG_MODE_DVI; =20 adv7511_set_colormap(adv7511, config.csc_enable, config.csc_coefficents, @@ -269,15 +247,6 @@ static void adv7511_set_config_csc(struct adv7511 *adv= 7511, =20 regmap_update_bits(adv7511->regmap, ADV7511_REG_HDCP_HDMI_CFG, ADV7511_HDMI_CFG_MODE_MASK, mode); - - hdmi_avi_infoframe_pack(&config.avi_infoframe, infoframe, - sizeof(infoframe)); - - /* The AVI infoframe id is not configurable */ - regmap_bulk_write(adv7511->regmap, ADV7511_REG_AVI_INFOFRAME_VERSION, - infoframe + 1, sizeof(infoframe) - 1); - - adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME); } =20 static void adv7511_set_link_config(struct adv7511 *adv7511, @@ -446,22 +415,16 @@ static void adv7511_hpd_work(struct work_struct *work) * restore its state. */ if (status =3D=3D connector_status_connected && - adv7511->connector.status =3D=3D connector_status_disconnected && + adv7511->status =3D=3D connector_status_disconnected && adv7511->powered) { regcache_mark_dirty(adv7511->regmap); adv7511_power_on(adv7511); } =20 - if (adv7511->connector.status !=3D status) { - adv7511->connector.status =3D status; + if (adv7511->status !=3D status) { + adv7511->status =3D status; =20 - if (adv7511->connector.dev) { - if (status =3D=3D connector_status_disconnected) - cec_phys_addr_invalidate(adv7511->cec_adap); - drm_kms_helper_hotplug_event(adv7511->connector.dev); - } else { - drm_bridge_hpd_notify(&adv7511->bridge, status); - } + drm_bridge_hpd_notify(&adv7511->bridge, status); } } =20 @@ -636,45 +599,11 @@ static const struct drm_edid *adv7511_edid_read(struc= t adv7511 *adv7511, if (!adv7511->powered) __adv7511_power_off(adv7511); =20 - if (drm_edid) { - /* - * FIXME: The CEC physical address should be set using - * cec_s_phys_addr(adap, - * connector->display_info.source_physical_address, false) from - * a path that has read the EDID and called - * drm_edid_connector_update(). - */ - const struct edid *edid =3D drm_edid_raw(drm_edid); - - adv7511_set_config_csc(adv7511, connector, adv7511->rgb, - drm_detect_hdmi_monitor(edid)); - - cec_s_phys_addr_from_edid(adv7511->cec_adap, edid); - } else { - cec_s_phys_addr_from_edid(adv7511->cec_adap, NULL); - } - return drm_edid; } =20 -static int adv7511_get_modes(struct adv7511 *adv7511, - struct drm_connector *connector) -{ - const struct drm_edid *drm_edid; - unsigned int count; - - drm_edid =3D adv7511_edid_read(adv7511, connector); - - drm_edid_connector_update(connector, drm_edid); - count =3D drm_edid_connector_add_modes(connector); - - drm_edid_free(drm_edid); - - return count; -} - static enum drm_connector_status -adv7511_detect(struct adv7511 *adv7511, struct drm_connector *connector) +adv7511_detect(struct adv7511 *adv7511) { enum drm_connector_status status; unsigned int val; @@ -699,8 +628,6 @@ adv7511_detect(struct adv7511 *adv7511, struct drm_conn= ector *connector) if (status =3D=3D connector_status_connected && hpd && adv7511->powered) { regcache_mark_dirty(adv7511->regmap); adv7511_power_on(adv7511); - if (connector) - adv7511_get_modes(adv7511, connector); if (adv7511->status =3D=3D connector_status_connected) status =3D connector_status_disconnected; } else { @@ -719,17 +646,7 @@ adv7511_detect(struct adv7511 *adv7511, struct drm_con= nector *connector) return status; } =20 -static enum drm_mode_status adv7511_mode_valid(struct adv7511 *adv7511, - const struct drm_display_mode *mode) -{ - if (mode->clock > 165000) - return MODE_CLOCK_HIGH; - - return MODE_OK; -} - static void adv7511_mode_set(struct adv7511 *adv7511, - const struct drm_display_mode *mode, const struct drm_display_mode *adj_mode) { unsigned int low_refresh_rate; @@ -800,11 +717,11 @@ static void adv7511_mode_set(struct adv7511 *adv7511, vsync_polarity =3D 1; } =20 - if (drm_mode_vrefresh(mode) <=3D 24) + if (drm_mode_vrefresh(adj_mode) <=3D 24) low_refresh_rate =3D ADV7511_LOW_REFRESH_RATE_24HZ; - else if (drm_mode_vrefresh(mode) <=3D 25) + else if (drm_mode_vrefresh(adj_mode) <=3D 25) low_refresh_rate =3D ADV7511_LOW_REFRESH_RATE_25HZ; - else if (drm_mode_vrefresh(mode) <=3D 30) + else if (drm_mode_vrefresh(adj_mode) <=3D 30) low_refresh_rate =3D ADV7511_LOW_REFRESH_RATE_30HZ; else low_refresh_rate =3D ADV7511_LOW_REFRESH_RATE_NONE; @@ -826,77 +743,21 @@ static void adv7511_mode_set(struct adv7511 *adv7511, * supposed to give better results. */ =20 - adv7511->f_tmds =3D mode->clock; -} - -/* -----------------------------------------------------------------------= ------ - * DRM Connector Operations - */ - -static struct adv7511 *connector_to_adv7511(struct drm_connector *connecto= r) -{ - return container_of(connector, struct adv7511, connector); + adv7511->f_tmds =3D adj_mode->clock; } =20 -static int adv7511_connector_get_modes(struct drm_connector *connector) -{ - struct adv7511 *adv =3D connector_to_adv7511(connector); - - return adv7511_get_modes(adv, connector); -} - -static enum drm_mode_status -adv7511_connector_mode_valid(struct drm_connector *connector, - const struct drm_display_mode *mode) -{ - struct adv7511 *adv =3D connector_to_adv7511(connector); - - return adv7511_mode_valid(adv, mode); -} - -static struct drm_connector_helper_funcs adv7511_connector_helper_funcs = =3D { - .get_modes =3D adv7511_connector_get_modes, - .mode_valid =3D adv7511_connector_mode_valid, -}; - -static enum drm_connector_status -adv7511_connector_detect(struct drm_connector *connector, bool force) -{ - struct adv7511 *adv =3D connector_to_adv7511(connector); - - return adv7511_detect(adv, connector); -} - -static const struct drm_connector_funcs adv7511_connector_funcs =3D { - .fill_modes =3D drm_helper_probe_single_connector_modes, - .detect =3D adv7511_connector_detect, - .destroy =3D drm_connector_cleanup, - .reset =3D drm_atomic_helper_connector_reset, - .atomic_duplicate_state =3D drm_atomic_helper_connector_duplicate_state, - .atomic_destroy_state =3D drm_atomic_helper_connector_destroy_state, -}; - static int adv7511_connector_init(struct adv7511 *adv) { struct drm_bridge *bridge =3D &adv->bridge; - int ret; - - if (adv->i2c_main->irq) - adv->connector.polled =3D DRM_CONNECTOR_POLL_HPD; - else - adv->connector.polled =3D DRM_CONNECTOR_POLL_CONNECT | - DRM_CONNECTOR_POLL_DISCONNECT; + struct drm_connector *connector; =20 - ret =3D drm_connector_init(bridge->dev, &adv->connector, - &adv7511_connector_funcs, - DRM_MODE_CONNECTOR_HDMIA); - if (ret < 0) { + connector =3D drm_bridge_connector_init(bridge->dev, bridge->encoder); + if (IS_ERR(connector)) { DRM_ERROR("Failed to initialize connector with drm\n"); - return ret; + return PTR_ERR(connector); } - drm_connector_helper_add(&adv->connector, - &adv7511_connector_helper_funcs); - drm_connector_attach_encoder(&adv->connector, bridge->encoder); + + drm_connector_attach_encoder(connector, bridge->encoder); =20 return 0; } @@ -905,7 +766,7 @@ static int adv7511_connector_init(struct adv7511 *adv) * DRM Bridge Operations */ =20 -static struct adv7511 *bridge_to_adv7511(struct drm_bridge *bridge) +static const struct adv7511 *bridge_to_adv7511_const(const struct drm_brid= ge *bridge) { return container_of(bridge, struct adv7511, bridge); } @@ -913,9 +774,31 @@ static struct adv7511 *bridge_to_adv7511(struct drm_br= idge *bridge) static void adv7511_bridge_atomic_enable(struct drm_bridge *bridge, struct drm_bridge_state *bridge_state) { + struct drm_atomic_state *state =3D bridge_state->base.state; struct adv7511 *adv =3D bridge_to_adv7511(bridge); + struct drm_connector *connector; + struct drm_connector_state *conn_state; + struct drm_crtc_state *crtc_state; =20 adv7511_power_on(adv); + + connector =3D drm_atomic_get_new_connector_for_encoder(state, bridge->enc= oder); + if (WARN_ON(!connector)) + return; + + conn_state =3D drm_atomic_get_new_connector_state(state, connector); + if (WARN_ON(!conn_state)) + return; + + crtc_state =3D drm_atomic_get_new_crtc_state(state, conn_state->crtc); + if (WARN_ON(!crtc_state)) + return; + + adv7511_set_config_csc(adv, connector, adv->rgb); + + adv7511_mode_set(adv, &crtc_state->adjusted_mode); + + drm_atomic_helper_connector_hdmi_update_infoframes(connector, state); } =20 static void adv7511_bridge_atomic_disable(struct drm_bridge *bridge, @@ -926,13 +809,17 @@ static void adv7511_bridge_atomic_disable(struct drm_= bridge *bridge, adv7511_power_off(adv); } =20 -static void adv7511_bridge_mode_set(struct drm_bridge *bridge, - const struct drm_display_mode *mode, - const struct drm_display_mode *adj_mode) +static enum drm_mode_status +adv7511_bridge_hdmi_tmds_char_rate_valid(const struct drm_bridge *bridge, + const struct drm_display_mode *mode, + unsigned long long tmds_rate) { - struct adv7511 *adv =3D bridge_to_adv7511(bridge); + const struct adv7511 *adv =3D bridge_to_adv7511_const(bridge); =20 - adv7511_mode_set(adv, mode, adj_mode); + if (mode->clock > 1000ULL * adv->info->max_mode_clock_khz) + return MODE_CLOCK_HIGH; + + return MODE_OK; } =20 static enum drm_mode_status adv7511_bridge_mode_valid(struct drm_bridge *b= ridge, @@ -941,10 +828,10 @@ static enum drm_mode_status adv7511_bridge_mode_valid= (struct drm_bridge *bridge, { struct adv7511 *adv =3D bridge_to_adv7511(bridge); =20 - if (adv->info->has_dsi) - return adv7533_mode_valid(adv, mode); - else - return adv7511_mode_valid(adv, mode); + if (!adv->info->has_dsi) + return MODE_OK; + + return adv7533_mode_valid(adv, mode); } =20 static int adv7511_bridge_attach(struct drm_bridge *bridge, @@ -977,7 +864,7 @@ static enum drm_connector_status adv7511_bridge_detect(= struct drm_bridge *bridge { struct adv7511 *adv =3D bridge_to_adv7511(bridge); =20 - return adv7511_detect(adv, NULL); + return adv7511_detect(adv); } =20 static const struct drm_edid *adv7511_bridge_edid_read(struct drm_bridge *= bridge, @@ -988,28 +875,71 @@ static const struct drm_edid *adv7511_bridge_edid_rea= d(struct drm_bridge *bridge return adv7511_edid_read(adv, connector); } =20 -static void adv7511_bridge_hpd_notify(struct drm_bridge *bridge, - enum drm_connector_status status) +static int adv7511_bridge_hdmi_clear_infoframe(struct drm_bridge *bridge, + enum hdmi_infoframe_type type) { - struct adv7511 *adv =3D bridge_to_adv7511(bridge); + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); + + switch (type) { + case HDMI_INFOFRAME_TYPE_AVI: + adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME); + break; + default: + drm_dbg_driver(adv7511->bridge.dev, "Unsupported HDMI InfoFrame %x\n", t= ype); + break; + } + + return 0; +} + +static int adv7511_bridge_hdmi_write_infoframe(struct drm_bridge *bridge, + enum hdmi_infoframe_type type, + const u8 *buffer, size_t len) +{ + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); + + adv7511_bridge_hdmi_clear_infoframe(bridge, type); + + switch (type) { + case HDMI_INFOFRAME_TYPE_AVI: + /* The AVI infoframe id is not configurable */ + regmap_bulk_write(adv7511->regmap, ADV7511_REG_AVI_INFOFRAME_VERSION, + buffer + 1, len - 1); =20 - if (status =3D=3D connector_status_disconnected) - cec_phys_addr_invalidate(adv->cec_adap); + adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME); + break; + default: + drm_dbg_driver(adv7511->bridge.dev, "Unsupported HDMI InfoFrame %x\n", t= ype); + break; + } + + return 0; } =20 static const struct drm_bridge_funcs adv7511_bridge_funcs =3D { - .mode_set =3D adv7511_bridge_mode_set, .mode_valid =3D adv7511_bridge_mode_valid, .attach =3D adv7511_bridge_attach, .detect =3D adv7511_bridge_detect, .edid_read =3D adv7511_bridge_edid_read, - .hpd_notify =3D adv7511_bridge_hpd_notify, =20 .atomic_enable =3D adv7511_bridge_atomic_enable, .atomic_disable =3D adv7511_bridge_atomic_disable, .atomic_duplicate_state =3D drm_atomic_helper_bridge_duplicate_state, .atomic_destroy_state =3D drm_atomic_helper_bridge_destroy_state, .atomic_reset =3D drm_atomic_helper_bridge_reset, + + .hdmi_tmds_char_rate_valid =3D adv7511_bridge_hdmi_tmds_char_rate_valid, + .hdmi_clear_infoframe =3D adv7511_bridge_hdmi_clear_infoframe, + .hdmi_write_infoframe =3D adv7511_bridge_hdmi_write_infoframe, + + .hdmi_audio_startup =3D adv7511_hdmi_audio_startup, + .hdmi_audio_prepare =3D adv7511_hdmi_audio_prepare, + .hdmi_audio_shutdown =3D adv7511_hdmi_audio_shutdown, + + .hdmi_cec_init =3D adv7511_cec_init, + .hdmi_cec_enable =3D adv7511_cec_enable, + .hdmi_cec_log_addr =3D adv7511_cec_log_addr, + .hdmi_cec_transmit =3D adv7511_cec_transmit, }; =20 /* -----------------------------------------------------------------------= ------ @@ -1320,22 +1250,40 @@ static int adv7511_probe(struct i2c_client *i2c) if (adv7511->info->link_config) adv7511_set_link_config(adv7511, &link_config); =20 - ret =3D adv7511_cec_init(dev, adv7511); - if (ret) - goto err_unregister_cec; + regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL, + ADV7511_CEC_CTRL_POWER_DOWN); =20 adv7511->bridge.funcs =3D &adv7511_bridge_funcs; - adv7511->bridge.ops =3D DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID; + adv7511->bridge.ops =3D DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | + DRM_BRIDGE_OP_HDMI; if (adv7511->i2c_main->irq) adv7511->bridge.ops |=3D DRM_BRIDGE_OP_HPD; =20 + adv7511->bridge.vendor =3D "Analog"; + adv7511->bridge.product =3D adv7511->info->name; + adv7511->bridge.hdmi_dev =3D dev; + +#ifdef CONFIG_DRM_I2C_ADV7511_AUDIO + adv7511->bridge.hdmi_audio_max_i2s_playback_channels =3D 2; + adv7511->bridge.hdmi_audio_i2s_formats =3D (SNDRV_PCM_FMTBIT_S16_LE | + SNDRV_PCM_FMTBIT_S20_3LE | + SNDRV_PCM_FMTBIT_S24_3LE | + SNDRV_PCM_FMTBIT_S24_LE | + SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE), + adv7511->bridge.hdmi_audio_spdif_playback =3D 1; + adv7511->bridge.hdmi_audio_dai_port =3D 2; +#endif + +#ifdef CONFIG_DRM_I2C_ADV7511_CEC + adv7511->bridge.hdmi_cec_adapter_name =3D dev_name(dev); + adv7511->bridge.hdmi_cec_available_las =3D ADV7511_MAX_ADDRS; +#endif + adv7511->bridge.of_node =3D dev->of_node; adv7511->bridge.type =3D DRM_MODE_CONNECTOR_HDMIA; =20 drm_bridge_add(&adv7511->bridge); =20 - adv7511_audio_init(dev, adv7511); - if (i2c->irq) { init_waitqueue_head(&adv7511->wq); =20 @@ -1357,10 +1305,7 @@ static int adv7511_probe(struct i2c_client *i2c) return 0; =20 err_unregister_audio: - adv7511_audio_exit(adv7511); drm_bridge_remove(&adv7511->bridge); -err_unregister_cec: - cec_unregister_adapter(adv7511->cec_adap); i2c_unregister_device(adv7511->i2c_cec); clk_disable_unprepare(adv7511->cec_clk); err_i2c_unregister_packet: @@ -1381,9 +1326,6 @@ static void adv7511_remove(struct i2c_client *i2c) =20 drm_bridge_remove(&adv7511->bridge); =20 - adv7511_audio_exit(adv7511); - - cec_unregister_adapter(adv7511->cec_adap); i2c_unregister_device(adv7511->i2c_cec); clk_disable_unprepare(adv7511->cec_clk); =20 @@ -1393,6 +1335,8 @@ static void adv7511_remove(struct i2c_client *i2c) =20 static const struct adv7511_chip_info adv7511_chip_info =3D { .type =3D ADV7511, + .name =3D "ADV7511", + .max_mode_clock_khz =3D 165000, .supply_names =3D adv7511_supply_names, .num_supplies =3D ARRAY_SIZE(adv7511_supply_names), .link_config =3D true, @@ -1400,6 +1344,7 @@ static const struct adv7511_chip_info adv7511_chip_in= fo =3D { =20 static const struct adv7511_chip_info adv7533_chip_info =3D { .type =3D ADV7533, + .name =3D "ADV7533", .max_mode_clock_khz =3D 80000, .max_lane_freq_khz =3D 800000, .supply_names =3D adv7533_supply_names, @@ -1410,6 +1355,7 @@ static const struct adv7511_chip_info adv7533_chip_in= fo =3D { =20 static const struct adv7511_chip_info adv7535_chip_info =3D { .type =3D ADV7535, + .name =3D "ADV7535", .max_mode_clock_khz =3D 148500, .max_lane_freq_khz =3D 891000, .supply_names =3D adv7533_supply_names, diff --git a/drivers/gpu/drm/bridge/adv7511/adv7533.c b/drivers/gpu/drm/bri= dge/adv7511/adv7533.c index 4481489aaf5ebf164313c86cbf3447d2d7914ab9..3ed0fa56bb97c53c2d578c24260= 3e195a574dc14 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7533.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7533.c @@ -106,10 +106,6 @@ enum drm_mode_status adv7533_mode_valid(struct adv7511= *adv, struct mipi_dsi_device *dsi =3D adv->dsi; u8 bpp =3D mipi_dsi_pixel_format_to_bpp(dsi->format); =20 - /* Check max clock for either 7533 or 7535 */ - if (mode->clock > adv->info->max_mode_clock_khz) - return MODE_CLOCK_HIGH; - /* Check max clock for each lane */ if (mode->clock * bpp > adv->info->max_lane_freq_khz * adv->num_dsi_lanes) return MODE_CLOCK_HIGH; --=20 2.39.5