From nobody Mon Feb 9 07:31:41 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2BE0B3148A5 for ; Wed, 7 Jan 2026 09:57:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767779827; cv=none; b=aLCLiC/9Le1/QvofsRaYrnjYs90RYh8d+bsoQ9AThq+2nCosnkmr/SZSHp0g1+Gjh4Kcm2a8J0CKuTF/G5mPunQV3caV6hJptilTZAQOZAEPcDaZotgB1ze2z/R+ZD1GRVfngxkaLNqAk+hwIAzU9kI1NX7kURShSdWbPqfspwU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767779827; c=relaxed/simple; bh=GnD/10b+8eRTbFi7EEfQ4yX6GWkn0KdClBqUxuPEWNA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oW0W7qv0ScRBs37dwwQ7v9ewXnGF6dg/GvqZIABEBhZZvEFE46nj79XMKL4/wKdPiddNlzGeuNAjZqXQKyuj39e5gv44B2rcfCYHlmX35o+7ZCPM+1zc3a+wBfm9g+UHRCtOZIDkCnrVpc0NPiA5dDAgsidVs/GWlb3/Bxq/pYU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=Wkh0MxEN; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="Wkh0MxEN" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id A70191A26DE; Wed, 7 Jan 2026 09:56:58 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 7D380606F8; Wed, 7 Jan 2026 09:56:58 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id C5CBF103C8711; Wed, 7 Jan 2026 10:56:54 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1767779817; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=wS6YbhsKzRZdVKVOke4vSg+5H3aJM7c2KrQk8UTxBXw=; b=Wkh0MxENAKkZZ27YuXWGx4Ou6jdTB9dvCKXtlNkRjx3mNk7mn0Aoi4o8AqWlOHvRuFNUJW 9qrq1Pn/jiUdEC3vIsf9waYkl/1qJqrbbNp7nSGsP4H5Hycr7/BpoDi5dql8ttUZrmiUxM 5rm0rCQ8PPdyhyiNkm26ZFGi/ob47H9zRyNL65I9SJPTDFm78Qqj0jSvKPZIt3XnBMMDlM EXcD9E3O7x6FQ4BF8fHj+cOxPgvDH4VqETdfMzK85t0dp28r/h+0lt7YBDlei8FsLxIStf lBeK1hB7n64XD+LALMhLaxmG7jHz3J32c5UqlNKyc9ScZ7StpxiU+sUyu/5ATA== From: Luca Ceresoli Date: Wed, 07 Jan 2026 10:56:26 +0100 Subject: [PATCH v4 1/4] drm/bridge: imx8qxp-pixel-link: simplify logic to find next bridge 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: <20260107-drm-bridge-alloc-getput-drm_of_find_bridge-v4-1-a62b4399a6bf@bootlin.com> References: <20260107-drm-bridge-alloc-getput-drm_of_find_bridge-v4-0-a62b4399a6bf@bootlin.com> In-Reply-To: <20260107-drm-bridge-alloc-getput-drm_of_find_bridge-v4-0-a62b4399a6bf@bootlin.com> To: Liu Ying , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam Cc: Hui Pu , Thomas Petazzoni , dri-devel@lists.freedesktop.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Luca Ceresoli X-Mailer: b4 0.14.3 X-Last-TLS-Session-Version: TLSv1.3 imx8qxp_pixel_link_find_next_bridge() uses a sophisticated logic to find the preferred next bridge, using an array with two supporting index variables. This is more sophisticated than required because we only ever need a pointer to the "current" bridge and to the "best so far" bridge. Additionally this logic is going to make the addition of proper refcounting quite complex. Rewrite the logic using two drm_bridge pointers, which is by itself slightly simpler and is a preparation step for introducing bridge refcounting in a later commit. Also reword a comment to make it clearer. Signed-off-by: Luca Ceresoli Reviewed-by: Liu Ying --- drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c | 23 +++++++++++----------= -- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c b/drivers/gpu/= drm/bridge/imx/imx8qxp-pixel-link.c index 433c080197a2..4f84825fddca 100644 --- a/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c +++ b/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c @@ -261,12 +261,10 @@ imx8qxp_pixel_link_find_next_bridge(struct imx8qxp_pi= xel_link *pl) { struct device_node *np =3D pl->dev->of_node; struct device_node *port, *remote; - struct drm_bridge *next_bridge[PL_MAX_NEXT_BRIDGES]; + struct drm_bridge *selected_bridge =3D NULL; u32 port_id; bool found_port =3D false; - int reg, ep_cnt =3D 0; - /* select the first next bridge by default */ - int bridge_sel =3D 0; + int reg; =20 for (port_id =3D 1; port_id <=3D PL_MAX_MST_ADDR + 1; port_id++) { port =3D of_graph_get_port_by_id(np, port_id); @@ -300,24 +298,25 @@ imx8qxp_pixel_link_find_next_bridge(struct imx8qxp_pi= xel_link *pl) continue; } =20 - next_bridge[ep_cnt] =3D of_drm_find_bridge(remote); - if (!next_bridge[ep_cnt]) { + struct drm_bridge *next_bridge =3D of_drm_find_bridge(remote); + if (!next_bridge) { of_node_put(remote); return ERR_PTR(-EPROBE_DEFER); } =20 - /* specially select the next bridge with companion PXL2DPI */ - if (of_property_present(remote, "fsl,companion-pxl2dpi")) - bridge_sel =3D ep_cnt; - - ep_cnt++; + /* + * Select the next bridge with companion PXL2DPI if + * present, otherwise default to the first bridge + */ + if (!selected_bridge || of_property_present(remote, "fsl,companion-pxl2d= pi")) + selected_bridge =3D next_bridge; =20 of_node_put(remote); } =20 pl->mst_addr =3D port_id - 1; =20 - return next_bridge[bridge_sel]; + return selected_bridge; } =20 static int imx8qxp_pixel_link_bridge_probe(struct platform_device *pdev) --=20 2.52.0 From nobody Mon Feb 9 07:31:41 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4471831B11E for ; Wed, 7 Jan 2026 09:57:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767779830; cv=none; b=XcnRHrOAH3gDCsCNZW5AAq4C5spVtOeM7mztZiwA5sYmrNZuB31Bqy62/BK4VpXUXfzfUq8/XM3vT/lPbGywv2Qm0I7aMbwcybscKys8CAI4DbJtCg+zl1OQaMckNkjWobDehD8BbjD0G9xBkJdoaFzJxmWU8Y/2d3d22VXeeXI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767779830; c=relaxed/simple; bh=xdLw1WWjk1NrcPgduBp+7aWmOA1+UK2tB+s31GYFXic=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KZb9jueiiWD/LUFYTvGotsfxfjT5rUfZmQ62LBVFrwADO2alHk8WVNppYFwHvHUFt6erRnCZSoYWLdD5lmV60Gtz3IFqM85r8kg8riaLG0ZujMEA67cvtR3UlsmNRbCip8/z/VSpu2SYPDXEKyIKUrv7Pu6UKspSqCxjbxkSpQ4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=DpVvpTUM; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="DpVvpTUM" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 8888E1A26E0; Wed, 7 Jan 2026 09:57:01 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 5425D6072B; Wed, 7 Jan 2026 09:57:01 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id CA497103C870F; Wed, 7 Jan 2026 10:56:57 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1767779820; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=meGA74IEurNMdTL93yq5uF40iG29aU1P+OGqYX95yp0=; b=DpVvpTUMGI1H+WF4rLxhW4WmbWWWhZYaH2l8fi50mG7e6701lqvv+3FfoLslJT/KA5SKaE w2bNvavMNp4i/+arZ0LtgZHPZ/K16Zc8JdBc2W4a8IeLUgw+tIlcSzvWOknbfkpbFw2bCB TSCABfIooB/fVmgevekCa6uJWaZZqd/GcXZJx0ujsreDq/hP/8+vo4jiEXMux+B1IHhmqb zP+tB7C8QDvrHOs6qgjJGhd8wPzVMN/iPTpTCVoTisxLRHwdcMeNL5jl8QKlG0tULy4g/f 0Q0SiWFCo5gNKUvWtATnzco92M4W0Xdr9Xh3kEeq98sWAq2VuCV59k0c55aJpg== From: Luca Ceresoli Date: Wed, 07 Jan 2026 10:56:27 +0100 Subject: [PATCH v4 2/4] drm/bridge: imx8qxp-pixel-link: simplify freeing of the remote device_node 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: <20260107-drm-bridge-alloc-getput-drm_of_find_bridge-v4-2-a62b4399a6bf@bootlin.com> References: <20260107-drm-bridge-alloc-getput-drm_of_find_bridge-v4-0-a62b4399a6bf@bootlin.com> In-Reply-To: <20260107-drm-bridge-alloc-getput-drm_of_find_bridge-v4-0-a62b4399a6bf@bootlin.com> To: Liu Ying , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam Cc: Hui Pu , Thomas Petazzoni , dri-devel@lists.freedesktop.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Luca Ceresoli X-Mailer: b4 0.14.3 X-Last-TLS-Session-Version: TLSv1.3 The main loop in imx8qxp_pixel_link_find_next_bridge() requires calling of_node_put() in multiple places, complicating code flow. Simplify it by using a cleanup action and making the 'remote' variable scope local to the loop. Reviewed-by: Maxime Ripard Signed-off-by: Luca Ceresoli Reviewed-by: Liu Ying --- drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c b/drivers/gpu/= drm/bridge/imx/imx8qxp-pixel-link.c index 4f84825fddca..0c5ed06eee1b 100644 --- a/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c +++ b/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c @@ -260,7 +260,7 @@ static struct drm_bridge * imx8qxp_pixel_link_find_next_bridge(struct imx8qxp_pixel_link *pl) { struct device_node *np =3D pl->dev->of_node; - struct device_node *port, *remote; + struct device_node *port; struct drm_bridge *selected_bridge =3D NULL; u32 port_id; bool found_port =3D false; @@ -286,7 +286,8 @@ imx8qxp_pixel_link_find_next_bridge(struct imx8qxp_pixe= l_link *pl) } =20 for (reg =3D 0; reg < PL_MAX_NEXT_BRIDGES; reg++) { - remote =3D of_graph_get_remote_node(np, port_id, reg); + struct device_node *remote __free(device_node) =3D + of_graph_get_remote_node(np, port_id, reg); if (!remote) continue; =20 @@ -294,15 +295,12 @@ imx8qxp_pixel_link_find_next_bridge(struct imx8qxp_pi= xel_link *pl) DRM_DEV_DEBUG(pl->dev, "port%u endpoint%u remote parent is not available\n", port_id, reg); - of_node_put(remote); continue; } =20 struct drm_bridge *next_bridge =3D of_drm_find_bridge(remote); - if (!next_bridge) { - of_node_put(remote); + if (!next_bridge) return ERR_PTR(-EPROBE_DEFER); - } =20 /* * Select the next bridge with companion PXL2DPI if @@ -310,8 +308,6 @@ imx8qxp_pixel_link_find_next_bridge(struct imx8qxp_pixe= l_link *pl) */ if (!selected_bridge || of_property_present(remote, "fsl,companion-pxl2d= pi")) selected_bridge =3D next_bridge; - - of_node_put(remote); } =20 pl->mst_addr =3D port_id - 1; --=20 2.52.0 From nobody Mon Feb 9 07:31:41 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3887E314A82 for ; Wed, 7 Jan 2026 09:57:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767779827; cv=none; b=YvY7r33PYR7bC2fvRa5iALe/FPCbHNREjrUpGQF+ZK7BsFVd/A6xXmHubXsjYp7VWmmjC/64EhOLh9++2xDbmSlGDMM9cRyS1Qw7C2vTdu/O+wEvRZiXYaI2CgwcEuA0mw1gniOdd8aJjhsaFYCpfq8HhYSxflpacDl+tx8OBMM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767779827; c=relaxed/simple; bh=6YMFOfmuSq3yW3iH3wEBrwE8lB6eeWtB5qNfvfcf7i8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=d60kiPlTYhnLgMQhagjfVjnOZ1VfjMSK79SPy6j54Q0OAKfdYpRdYb0wCA2ShjEYg6DaDcLNYn7OEliX9VlR//rUxFlmvbxvaUVUKydpy0WGV6ec0hoFpLKoLVYbD5liCQmgRv6SzIXv5CATSTIjAFmZBHpzs+a71xMmj9iSRyo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=rYnPVNBL; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="rYnPVNBL" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id E60371A26E2; Wed, 7 Jan 2026 09:57:03 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id B9C0960734; Wed, 7 Jan 2026 09:57:03 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 5FDB7103C8715; Wed, 7 Jan 2026 10:57:00 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1767779822; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=kg0Uw3LRVfNHDM/aCR6pFV93DPSIETQ7K2PCrzE/Fng=; b=rYnPVNBLZYpCqpKk3jfP1C3fIOxJbc/uPxJX55MAzfCVcUAF77Qrt4M2/TvzAWre2/cnZH MxSmRRIqTSTX6PhkXPJTIJ8jqIWDdsUFh0TyORZ+P11SCsV6OieT7s06IFrjYOhcwH0WqT zFM5Td2WtFhW55sH6IcW/tbGANs+v/ULB233DgjC3N2leYIMVdxel4qyZ8EcSO3kTpaAER B7yhRtvSuFGf1e3hLaOCINZuZuwY6NuOEN/ISSUfkbhNjFGJrvY2ygzdAMjVA465fVAXT4 77PvsXWkeC6vngnMed0PIEotNVrEGjwp07xyB0OoE/aohRu2/6pAEIJ8MzAT/w== From: Luca Ceresoli Date: Wed, 07 Jan 2026 10:56:28 +0100 Subject: [PATCH v4 3/4] drm/bridge: imx8qxp-pixel-link: imx8qxp_pixel_link_find_next_bridge: return int, not ERR_PTR 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: <20260107-drm-bridge-alloc-getput-drm_of_find_bridge-v4-3-a62b4399a6bf@bootlin.com> References: <20260107-drm-bridge-alloc-getput-drm_of_find_bridge-v4-0-a62b4399a6bf@bootlin.com> In-Reply-To: <20260107-drm-bridge-alloc-getput-drm_of_find_bridge-v4-0-a62b4399a6bf@bootlin.com> To: Liu Ying , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam Cc: Hui Pu , Thomas Petazzoni , dri-devel@lists.freedesktop.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Luca Ceresoli X-Mailer: b4 0.14.3 X-Last-TLS-Session-Version: TLSv1.3 In preparation for using bridge->next_bridge, we need to ensure that it will never contain anything but NULL or a valid bridge pointer. Current code stores an ERR_PTR when imx8qxp_pixel_link_find_next_bridge() errors out. Instead of fixing that after the facts in the caller, change the function to internally set pl->next_bridge and just return an int error value. No functional changes. Reviewed-by: Maxime Ripard Signed-off-by: Luca Ceresoli Acked-by: Liu Ying --- drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c b/drivers/gpu/= drm/bridge/imx/imx8qxp-pixel-link.c index 0c5ed06eee1b..91e4f4d55469 100644 --- a/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c +++ b/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c @@ -256,8 +256,7 @@ static int imx8qxp_pixel_link_disable_all_controls(stru= ct imx8qxp_pixel_link *pl return imx8qxp_pixel_link_disable_sync(pl); } =20 -static struct drm_bridge * -imx8qxp_pixel_link_find_next_bridge(struct imx8qxp_pixel_link *pl) +static int imx8qxp_pixel_link_find_next_bridge(struct imx8qxp_pixel_link *= pl) { struct device_node *np =3D pl->dev->of_node; struct device_node *port; @@ -282,7 +281,7 @@ imx8qxp_pixel_link_find_next_bridge(struct imx8qxp_pixe= l_link *pl) =20 if (!found_port) { DRM_DEV_ERROR(pl->dev, "no available output port\n"); - return ERR_PTR(-ENODEV); + return -ENODEV; } =20 for (reg =3D 0; reg < PL_MAX_NEXT_BRIDGES; reg++) { @@ -300,7 +299,7 @@ imx8qxp_pixel_link_find_next_bridge(struct imx8qxp_pixe= l_link *pl) =20 struct drm_bridge *next_bridge =3D of_drm_find_bridge(remote); if (!next_bridge) - return ERR_PTR(-EPROBE_DEFER); + return -EPROBE_DEFER; =20 /* * Select the next bridge with companion PXL2DPI if @@ -311,8 +310,9 @@ imx8qxp_pixel_link_find_next_bridge(struct imx8qxp_pixe= l_link *pl) } =20 pl->mst_addr =3D port_id - 1; + pl->next_bridge =3D selected_bridge; =20 - return selected_bridge; + return 0; } =20 static int imx8qxp_pixel_link_bridge_probe(struct platform_device *pdev) @@ -368,9 +368,9 @@ static int imx8qxp_pixel_link_bridge_probe(struct platf= orm_device *pdev) if (ret) return ret; =20 - pl->next_bridge =3D imx8qxp_pixel_link_find_next_bridge(pl); - if (IS_ERR(pl->next_bridge)) - return PTR_ERR(pl->next_bridge); + ret =3D imx8qxp_pixel_link_find_next_bridge(pl); + if (ret) + return ret; =20 platform_set_drvdata(pdev, pl); =20 --=20 2.52.0 From nobody Mon Feb 9 07:31:41 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F1C2431AAA7 for ; Wed, 7 Jan 2026 09:57:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767779832; cv=none; b=SVMZjDiKZdVZplzbkkirePNtqETNnckAH7hgOgV8anUw3oITLg9h5yJJBZuBcevsWOE3hGesyZ59b6kdvHZvpXddF9LLHVkpd1Ucg1L4Tnze26PUVmQ3NM+tiPz26n7rs2dXbSQ5IHCRNRfd33jmIu0tYZ4t472RTtZdlfW39ZE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767779832; c=relaxed/simple; bh=DM/D6zwn/uTZ7Pgj/sIygdfJRpLNQ4yHQQTH5gFY43M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mtHhIgEjRj062dHlGs8TNG/BhSAex60SF3M4MN55l2EcOYPcVX3t5CWbsuAl2gpt9q5MeaB1OSZ2UimVQx4LBcskvGnBzATdOK47lKKtJwzTuiZtNYRrBTjRUqnklLlYXho/X8oqupbfpZE8kB+weZwXq8VQRwA/gdYsZnEQ3Yk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=vQhgwmik; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="vQhgwmik" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 98B86C1EC96; Wed, 7 Jan 2026 09:56:42 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id ED8CA60757; Wed, 7 Jan 2026 09:57:06 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id F2E8D103C8717; Wed, 7 Jan 2026 10:57:02 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1767779825; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=9jZtxJrH4yjNHJxNoJwo1HCjHiuPX2NJqEJefkI38sk=; b=vQhgwmik6I5YnkxAJ7jdfHhUlb5Ae91P4JFwrIEAz4FbfR45JtEECfYqmbIQzgFB/xIsER KusKrH4+d6N3ut7QxYtjQau9s2TosN67M2ERj6gBRUKrK4OEaQh9ZsBD0iLG519P/Cb3HD 62fZ4su+j7loGRaMJsjX3asOnV5Xz7ShWV2KBPJuQk+1dHkBJZupyzd3TZxS3y3b+BcnAk h+XR79PFbfYqWKWHl4KH7H/srDK4xn94oRChDC2mMdbvtzTjWNB2sX0zGFSjfBrmSsGKef mdMTYyuuezRdsHjAg/1IPaCyH0nAXveIb6sd6FhEzM/+mKL9lbUzYWMM9b5k6w== From: Luca Ceresoli Date: Wed, 07 Jan 2026 10:56:29 +0100 Subject: [PATCH v4 4/4] drm/bridge: imx8qxp-pixel-link: get/put the next bridge 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: <20260107-drm-bridge-alloc-getput-drm_of_find_bridge-v4-4-a62b4399a6bf@bootlin.com> References: <20260107-drm-bridge-alloc-getput-drm_of_find_bridge-v4-0-a62b4399a6bf@bootlin.com> In-Reply-To: <20260107-drm-bridge-alloc-getput-drm_of_find_bridge-v4-0-a62b4399a6bf@bootlin.com> To: Liu Ying , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam Cc: Hui Pu , Thomas Petazzoni , dri-devel@lists.freedesktop.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Luca Ceresoli X-Mailer: b4 0.14.3 X-Last-TLS-Session-Version: TLSv1.3 This driver obtains a bridge pointer from of_drm_find_bridge() in the probe function and stores it until driver removal. of_drm_find_bridge() is deprecated. Move to of_drm_find_and_get_bridge() for the bridge to be refcounted and use bridge->next_bridge to put the reference on deallocation. This needs to be handled in various steps: * the bridge returned of_drm_get_bridge() is stored in the local temporary variable next_bridge whose scope is the for loop, so a cleanup action is enough * the value of next_bridge is copied into selected_bridge, potentially more than once, so a cleanup action at function scope plus a drm_bridge_put() in case of reassignment are enough * on successful return selected_bridge is stored in bridge->next_bridge, which ensures it is put when the bridge is deallocated Reviewed-by: Maxime Ripard Signed-off-by: Luca Ceresoli --- drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c b/drivers/gpu/= drm/bridge/imx/imx8qxp-pixel-link.c index 91e4f4d55469..b3050310a7f0 100644 --- a/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c +++ b/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c @@ -23,7 +23,6 @@ =20 struct imx8qxp_pixel_link { struct drm_bridge bridge; - struct drm_bridge *next_bridge; struct device *dev; struct imx_sc_ipc *ipc_handle; u8 stream_id; @@ -140,7 +139,7 @@ static int imx8qxp_pixel_link_bridge_attach(struct drm_= bridge *bridge, } =20 return drm_bridge_attach(encoder, - pl->next_bridge, bridge, + pl->bridge.next_bridge, bridge, DRM_BRIDGE_ATTACH_NO_CONNECTOR); } =20 @@ -260,7 +259,7 @@ static int imx8qxp_pixel_link_find_next_bridge(struct i= mx8qxp_pixel_link *pl) { struct device_node *np =3D pl->dev->of_node; struct device_node *port; - struct drm_bridge *selected_bridge =3D NULL; + struct drm_bridge *selected_bridge __free(drm_bridge_put) =3D NULL; u32 port_id; bool found_port =3D false; int reg; @@ -297,7 +296,8 @@ static int imx8qxp_pixel_link_find_next_bridge(struct i= mx8qxp_pixel_link *pl) continue; } =20 - struct drm_bridge *next_bridge =3D of_drm_find_bridge(remote); + struct drm_bridge *next_bridge __free(drm_bridge_put) =3D + of_drm_find_and_get_bridge(remote); if (!next_bridge) return -EPROBE_DEFER; =20 @@ -305,12 +305,14 @@ static int imx8qxp_pixel_link_find_next_bridge(struct= imx8qxp_pixel_link *pl) * Select the next bridge with companion PXL2DPI if * present, otherwise default to the first bridge */ - if (!selected_bridge || of_property_present(remote, "fsl,companion-pxl2d= pi")) - selected_bridge =3D next_bridge; + if (!selected_bridge || of_property_present(remote, "fsl,companion-pxl2d= pi")) { + drm_bridge_put(selected_bridge); + selected_bridge =3D drm_bridge_get(next_bridge); + } } =20 pl->mst_addr =3D port_id - 1; - pl->next_bridge =3D selected_bridge; + pl->bridge.next_bridge =3D drm_bridge_get(selected_bridge); =20 return 0; } --=20 2.52.0