All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Luca Ceresoli" <luca.ceresoli@bootlin.com>
To: "Liu Ying" <victor.liu@nxp.com>,
	"Andrzej Hajda" <andrzej.hajda@intel.com>,
	"Neil Armstrong" <neil.armstrong@linaro.org>,
	"Robert Foss" <rfoss@kernel.org>,
	"Laurent Pinchart" <Laurent.pinchart@ideasonboard.com>,
	"Jonas Karlman" <jonas@kwiboo.se>,
	"Jernej Skrabec" <jernej.skrabec@gmail.com>,
	"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Thomas Zimmermann" <tzimmermann@suse.de>,
	"David Airlie" <airlied@gmail.com>,
	"Simona Vetter" <simona@ffwll.ch>,
	"Shawn Guo" <shawnguo@kernel.org>,
	"Sascha Hauer" <s.hauer@pengutronix.de>,
	"Pengutronix Kernel Team" <kernel@pengutronix.de>,
	"Fabio Estevam" <festevam@gmail.com>
Cc: "Hui Pu" <Hui.Pu@gehealthcare.com>,
	"Ian Ray" <ian.ray@gehealthcare.com>,
	"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
	<dri-devel@lists.freedesktop.org>, <imx@lists.linux.dev>,
	<linux-arm-kernel@lists.infradead.org>,
	<linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v5] drm/bridge: imx8qxp-pixel-link: get/put the next bridge
Date: Wed, 11 Feb 2026 22:27:29 +0100	[thread overview]
Message-ID: <DGCG90VYLUEA.3IPJ682VDMHP6@bootlin.com> (raw)
In-Reply-To: <910325b6-2a0a-40ae-82c2-656fcbb0d060@nxp.com>

Hello Liu,

On Thu Feb 5, 2026 at 10:26 AM CET, Liu Ying wrote:
> On Thu, Feb 05, 2026 at 09:52:04AM +0100, Luca Ceresoli wrote:
>> Hello Liu,
>
> Hello Luca,
>
>>
>> On Wed Feb 4, 2026 at 7:27 AM CET, Liu Ying wrote:
>>> Hi Luca,
>>>
>>> On Tue, Feb 03, 2026 at 11:35:25AM +0100, Luca Ceresoli wrote:
>>>> 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.
>>>>
>>>> To keep the code as simple and reliable as possible, get a reference for
>>>> each pointer that stores a drm_bridge address when it is stored and release
>>>> it when the pointer is overwritten or goes out of scope. Also remove the
>>>> intermediate selected_bridge variable to reduce the refcounted variables in
>>>> the function. The involved pointers are:
>>>>
>>>>  * next_bridge loop-local variable:
>>>>    - get reference by of_drm_find_and_get_bridge()
>>>>    - put reference at the end of the loop iteration (__free)
>>>>
>>>>  * pl->bridge.next_bridge, tied to struct imx8qxp_pixel_link lifetime:
>>>>    - get reference when assigned (by copy from next_bridge)
>>>>    - put reference before reassignment if reassignment happens
>>>>    - put reference when the struct imx8qxp_pixel_link embedding the
>>>>      struct drm_bridge is destroyed (struct drm_bridge::next_bridge)
>>>>
>>>> Additionally, split the somewhat complex if() for readability.
>>>>
>>>> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
>>>>
>>>> ---
>>>>
>>>> Changes in v5:
>>>> - rewrite commit message after Liu's review to clarify the per-pointer
>>>>   get/put idea
>>>> - split the if()s involved in selcting the bridge
>>>> - remove intermediate selected_bridge pointer
>>>> - removed Maxime's R-by, patch changed
>>>> ---
>>>>  drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c | 17 ++++++++++-------
>>>>  1 file changed, 10 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..e29e099b893a 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 @@
>>>>
>>>>  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,
>>>>  	}
>>>>
>>>>  	return drm_bridge_attach(encoder,
>>>> -				 pl->next_bridge, bridge,
>>>> +				 pl->bridge.next_bridge, bridge,
>>>>  				 DRM_BRIDGE_ATTACH_NO_CONNECTOR);
>>>>  }
>>>>
>>>> @@ -260,7 +259,6 @@ static int imx8qxp_pixel_link_find_next_bridge(struct imx8qxp_pixel_link *pl)
>>>>  {
>>>>  	struct device_node *np = pl->dev->of_node;
>>>>  	struct device_node *port;
>>>> -	struct drm_bridge *selected_bridge = NULL;
>>>>  	u32 port_id;
>>>>  	bool found_port = false;
>>>>  	int reg;
>>>> @@ -297,7 +295,8 @@ static int imx8qxp_pixel_link_find_next_bridge(struct imx8qxp_pixel_link *pl)
>>>>  			continue;
>>>>  		}
>>>>
>>>> -		struct drm_bridge *next_bridge = of_drm_find_bridge(remote);
>>>> +		struct drm_bridge *next_bridge __free(drm_bridge_put) =
>>>> +			of_drm_find_and_get_bridge(remote);
>>>>  		if (!next_bridge)
>>>>  			return -EPROBE_DEFER;
>>>>
>>>> @@ -305,12 +304,16 @@ 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-pxl2dpi"))
>>>> -			selected_bridge = next_bridge;
>>>> +		if (!pl->bridge.next_bridge)
>>>> +			pl->bridge.next_bridge = drm_bridge_get(next_bridge);
>>>> +
>>>> +		if (of_property_present(remote, "fsl,companion-pxl2dpi")) {
>>>> +			drm_bridge_put(pl->bridge.next_bridge);
>>>> +			pl->bridge.next_bridge = drm_bridge_get(next_bridge);
>>>> +		}
>>>
>>> Can you drop the intermediate next_bridge variable to simplify the code?
>>>
>>> -8<-
>>> if (!pl->bridge.next_bridge) {
>>>         pl->bridge.next_bridge = of_drm_find_and_get_bridge(remote);
>>>         if (!pl->bridge.next_bridge)
>>>                 return -EPROBE_DEFER;
>>> }
>>>
>>> if (of_property_present(remote, "fsl,companion-pxl2dpi")) {
>>>         drm_bridge_put(pl->bridge.next_bridge);
>>>         pl->bridge.next_bridge = of_drm_find_and_get_bridge(remote);
>>>         if (!pl->bridge.next_bridge)
>>>                 return -EPROBE_DEFER;
>>> }
>>> -8<-
>>
>> Potentially calling of_drm_find_and_get_bridge() twice on the same node,
>> with a put in the middle, looks poorly readable to me, even though it still
>> looks correct code.
>>
>> However I think we can do even better with an 'else if':
>>
>>   if (!pl->bridge.next_bridge) {
>>          pl->bridge.next_bridge = of_drm_find_and_get_bridge(remote);
>>          if (!pl->bridge.next_bridge)
>>                  return -EPROBE_DEFER;
>>   } else if (of_property_present(remote, "fsl,companion-pxl2dpi")) {   <===
>>          drm_bridge_put(pl->bridge.next_bridge);
>>          pl->bridge.next_bridge = of_drm_find_and_get_bridge(remote);
>>          if (!pl->bridge.next_bridge)
>>                  return -EPROBE_DEFER;
>>   }
>>
>> Looks OK?
>
> Both are fine to me.  TBH, I feel my version with two 'if's is a bit easier
> to read.  But, I'd say up to you.

I think this is really a minor detail and there is no obvious "best"
version, so I'll send v6 as I had it ready and build-tested already,
i.e. with the 'else if' version.

Thanks for the discussion!

Luca

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

      reply	other threads:[~2026-02-11 21:27 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-02-03 10:35 [PATCH v5] drm/bridge: add of_drm_find_and_get_bridge() and a managed *next_bridge, deprecate of_drm_find_bridge() Luca Ceresoli
2026-02-03 10:35 ` [PATCH v5] drm/bridge: imx8qxp-pixel-link: get/put the next bridge Luca Ceresoli
2026-02-04  6:27   ` Liu Ying
2026-02-05  8:52     ` Luca Ceresoli
2026-02-05  9:26       ` Liu Ying
2026-02-11 21:27         ` Luca Ceresoli [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DGCG90VYLUEA.3IPJ682VDMHP6@bootlin.com \
    --to=luca.ceresoli@bootlin.com \
    --cc=Hui.Pu@gehealthcare.com \
    --cc=Laurent.pinchart@ideasonboard.com \
    --cc=airlied@gmail.com \
    --cc=andrzej.hajda@intel.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=festevam@gmail.com \
    --cc=ian.ray@gehealthcare.com \
    --cc=imx@lists.linux.dev \
    --cc=jernej.skrabec@gmail.com \
    --cc=jonas@kwiboo.se \
    --cc=kernel@pengutronix.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=mripard@kernel.org \
    --cc=neil.armstrong@linaro.org \
    --cc=rfoss@kernel.org \
    --cc=s.hauer@pengutronix.de \
    --cc=shawnguo@kernel.org \
    --cc=simona@ffwll.ch \
    --cc=thomas.petazzoni@bootlin.com \
    --cc=tzimmermann@suse.de \
    --cc=victor.liu@nxp.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.