diff mbox series

[v2] driver core: fw_devlink: Stop trying to optimize cycle detection logic

Message ID 20241026045243.452957-1-saravanak@google.com (mailing list archive)
State New, archived
Headers show
Series [v2] driver core: fw_devlink: Stop trying to optimize cycle detection logic | expand

Commit Message

Saravana Kannan Oct. 26, 2024, 4:52 a.m. UTC
In attempting to optimize fw_devlink runtime, I introduced numerous cycle
detection bugs by foregoing cycle detection logic under specific
conditions. Each fix has further narrowed the conditions for optimization.

It's time to give up on these optimization attempts and just run the cycle
detection logic every time fw_devlink tries to create a device link.

The specific bug report that triggered this fix involved a supplier fwnode
that never gets a device created for it. Instead, the supplier fwnode is
represented by the device that corresponds to an ancestor fwnode.

In this case, fw_devlink didn't do any cycle detection because the cycle
detection logic is only run when a device link is created between the
devices that correspond to the actual consumer and supplier fwnodes.

With this change, fw_devlink will run cycle detection logic even when
creating SYNC_STATE_ONLY proxy device links from a device that is an
ancestor of a consumer fwnode.

Reported-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Closes: https://lore.kernel.org/all/1a1ab663-d068-40fb-8c94-f0715403d276@ideasonboard.com/
Fixes: 6442d79d880c ("driver core: fw_devlink: Improve detection of overlapping cycles")
Signed-off-by: Saravana Kannan <saravanak@google.com>
---
Greg,

I've tested this on my end and it looks ok and nothing fishy is going
on. You can pick this up once Tomi gives a Tested-by.

Thanks,
Saravana

v1 -> v2:
- Removed the RFC tag
- Remaned the subject. v1 is https://lore.kernel.org/all/20241025223721.184998-1-saravanak@google.com/T/#u
- Added a NULL check to avoid NULL pointer deref

 drivers/base/core.c | 46 ++++++++++++++++++++-------------------------
 1 file changed, 20 insertions(+), 26 deletions(-)

Comments

Tomi Valkeinen Oct. 28, 2024, 8:06 a.m. UTC | #1
Hi,

On 26/10/2024 07:52, Saravana Kannan wrote:
> In attempting to optimize fw_devlink runtime, I introduced numerous cycle
> detection bugs by foregoing cycle detection logic under specific
> conditions. Each fix has further narrowed the conditions for optimization.
> 
> It's time to give up on these optimization attempts and just run the cycle
> detection logic every time fw_devlink tries to create a device link.
> 
> The specific bug report that triggered this fix involved a supplier fwnode
> that never gets a device created for it. Instead, the supplier fwnode is
> represented by the device that corresponds to an ancestor fwnode.
> 
> In this case, fw_devlink didn't do any cycle detection because the cycle
> detection logic is only run when a device link is created between the
> devices that correspond to the actual consumer and supplier fwnodes.
> 
> With this change, fw_devlink will run cycle detection logic even when
> creating SYNC_STATE_ONLY proxy device links from a device that is an
> ancestor of a consumer fwnode.
> 
> Reported-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
> Closes: https://lore.kernel.org/all/1a1ab663-d068-40fb-8c94-f0715403d276@ideasonboard.com/
> Fixes: 6442d79d880c ("driver core: fw_devlink: Improve detection of overlapping cycles")
> Signed-off-by: Saravana Kannan <saravanak@google.com>
> ---
> Greg,
> 
> I've tested this on my end and it looks ok and nothing fishy is going
> on. You can pick this up once Tomi gives a Tested-by.

I tested this on TI AM62 SK board. It has an LVDS (OLDI) display and a 
HDMI output, and both displays are connected to the same display 
subsystem. I tested with OLDI single and dual link cases, with and 
without HDMI, and in all cases probing works fine.

Looks good on that front, so:

Tested-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>

You also asked for a diff of the devlinks. That part doesn't look so 
good to me, but probably you can tell if it's normal or not.

$ diff devlink-single-broken.txt devlink-single-fixed.txt
2d1
< i2c:1-0022--i2c:1-003b
11d9
< 
platform:44043000.system-controller:clock-controller--platform:20010000.i2c
27d24
< platform:44043000.system-controller:clock-controller--platform:601000.gpio
42d38
< 
platform:44043000.system-controller:power-controller--platform:20010000.i2c
58d53
< platform:44043000.system-controller:power-controller--platform:601000.gpio
74d68
< platform:4d000000.mailbox--platform:44043000.system-controller
76d69
< platform:601000.gpio--i2c:1-0022
80d72
< platform:bus@f0000:interrupt-controller@a00000--platform:601000.gpio
82d73
< platform:f4000.pinctrl--i2c:1-0022
84d74
< platform:f4000.pinctrl--platform:20010000.i2c

"i2c:1-003b" is the hdmi bridge, "i2c:1-0022" is a gpio expander. So, 
for example, we lose the devlink between the gpio expander and the hdmi 
bridge. The expander is used for interrupts. There's an interrupt line 
from the HDMI bridge to the expander, and from there there's an 
interrupt line going to the SoC.

Also, I noticed the devlinks change if I load the display drivers. The 
above is before loading. Comparing the loaded/not-loaded:

$ diff devlink-dual-fixed.txt devlink-dual-fixed-loaded.txt
3d2
< i2c:1-003b--platform:30200000.dss
23d21
< 
platform:44043000.system-controller:clock-controller--platform:30200000.dss
52d49
< 
platform:44043000.system-controller:power-controller--platform:30200000.dss
73d69
< platform:display--platform:30200000.dss
78d73
< platform:f4000.pinctrl--platform:30200000.dss
97a93
 > regulator:regulator.0--platform:display

  Tomi


> Thanks,
> Saravana
> 
> v1 -> v2:
> - Removed the RFC tag
> - Remaned the subject. v1 is https://lore.kernel.org/all/20241025223721.184998-1-saravanak@google.com/T/#u
> - Added a NULL check to avoid NULL pointer deref
> 
>   drivers/base/core.c | 46 ++++++++++++++++++++-------------------------
>   1 file changed, 20 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/base/core.c b/drivers/base/core.c
> index 3b13fed1c3e3..f96f2e4c76b4 100644
> --- a/drivers/base/core.c
> +++ b/drivers/base/core.c
> @@ -1990,10 +1990,10 @@ static struct device *fwnode_get_next_parent_dev(const struct fwnode_handle *fwn
>    *
>    * Return true if one or more cycles were found. Otherwise, return false.
>    */
> -static bool __fw_devlink_relax_cycles(struct device *con,
> +static bool __fw_devlink_relax_cycles(struct fwnode_handle *con_handle,
>   				 struct fwnode_handle *sup_handle)
>   {
> -	struct device *sup_dev = NULL, *par_dev = NULL;
> +	struct device *sup_dev = NULL, *par_dev = NULL, *con_dev = NULL;
>   	struct fwnode_link *link;
>   	struct device_link *dev_link;
>   	bool ret = false;
> @@ -2010,22 +2010,22 @@ static bool __fw_devlink_relax_cycles(struct device *con,
>   
>   	sup_handle->flags |= FWNODE_FLAG_VISITED;
>   
> -	sup_dev = get_dev_from_fwnode(sup_handle);
> -
>   	/* Termination condition. */
> -	if (sup_dev == con) {
> +	if (sup_handle == con_handle) {
>   		pr_debug("----- cycle: start -----\n");
>   		ret = true;
>   		goto out;
>   	}
>   
> +	sup_dev = get_dev_from_fwnode(sup_handle);
> +	con_dev = get_dev_from_fwnode(con_handle);
>   	/*
>   	 * If sup_dev is bound to a driver and @con hasn't started binding to a
>   	 * driver, sup_dev can't be a consumer of @con. So, no need to check
>   	 * further.
>   	 */
>   	if (sup_dev && sup_dev->links.status ==  DL_DEV_DRIVER_BOUND &&
> -	    con->links.status == DL_DEV_NO_DRIVER) {
> +	    con_dev && con_dev->links.status == DL_DEV_NO_DRIVER) {
>   		ret = false;
>   		goto out;
>   	}
> @@ -2034,7 +2034,7 @@ static bool __fw_devlink_relax_cycles(struct device *con,
>   		if (link->flags & FWLINK_FLAG_IGNORE)
>   			continue;
>   
> -		if (__fw_devlink_relax_cycles(con, link->supplier)) {
> +		if (__fw_devlink_relax_cycles(con_handle, link->supplier)) {
>   			__fwnode_link_cycle(link);
>   			ret = true;
>   		}
> @@ -2049,7 +2049,7 @@ static bool __fw_devlink_relax_cycles(struct device *con,
>   	else
>   		par_dev = fwnode_get_next_parent_dev(sup_handle);
>   
> -	if (par_dev && __fw_devlink_relax_cycles(con, par_dev->fwnode)) {
> +	if (par_dev && __fw_devlink_relax_cycles(con_handle, par_dev->fwnode)) {
>   		pr_debug("%pfwf: cycle: child of %pfwf\n", sup_handle,
>   			 par_dev->fwnode);
>   		ret = true;
> @@ -2067,7 +2067,7 @@ static bool __fw_devlink_relax_cycles(struct device *con,
>   		    !(dev_link->flags & DL_FLAG_CYCLE))
>   			continue;
>   
> -		if (__fw_devlink_relax_cycles(con,
> +		if (__fw_devlink_relax_cycles(con_handle,
>   					      dev_link->supplier->fwnode)) {
>   			pr_debug("%pfwf: cycle: depends on %pfwf\n", sup_handle,
>   				 dev_link->supplier->fwnode);
> @@ -2140,25 +2140,19 @@ static int fw_devlink_create_devlink(struct device *con,
>   		return -EINVAL;
>   
>   	/*
> -	 * SYNC_STATE_ONLY device links don't block probing and supports cycles.
> -	 * So, one might expect that cycle detection isn't necessary for them.
> -	 * However, if the device link was marked as SYNC_STATE_ONLY because
> -	 * it's part of a cycle, then we still need to do cycle detection. This
> -	 * is because the consumer and supplier might be part of multiple cycles
> -	 * and we need to detect all those cycles.
> +	 * Don't try to optimize by not calling the cycle detection logic under
> +	 * certain conditions. There's always some corner case that won't get
> +	 * detected.
>   	 */
> -	if (!device_link_flag_is_sync_state_only(flags) ||
> -	    flags & DL_FLAG_CYCLE) {
> -		device_links_write_lock();
> -		if (__fw_devlink_relax_cycles(con, sup_handle)) {
> -			__fwnode_link_cycle(link);
> -			flags = fw_devlink_get_flags(link->flags);
> -			pr_debug("----- cycle: end -----\n");
> -			dev_info(con, "Fixed dependency cycle(s) with %pfwf\n",
> -				 sup_handle);
> -		}
> -		device_links_write_unlock();
> +	device_links_write_lock();
> +	if (__fw_devlink_relax_cycles(link->consumer, sup_handle)) {
> +		__fwnode_link_cycle(link);
> +		flags = fw_devlink_get_flags(link->flags);
> +		pr_debug("----- cycle: end -----\n");
> +		pr_info("%pfwf: Fixed dependency cycle(s) with %pfwf\n",
> +			link->consumer, sup_handle);
>   	}
> +	device_links_write_unlock();
>   
>   	if (sup_handle->flags & FWNODE_FLAG_NOT_DEVICE)
>   		sup_dev = fwnode_get_next_parent_dev(sup_handle);
Saravana Kannan Oct. 28, 2024, 8:39 p.m. UTC | #2
On Mon, Oct 28, 2024 at 1:06 AM Tomi Valkeinen
<tomi.valkeinen@ideasonboard.com> wrote:
>
> Hi,
>
> On 26/10/2024 07:52, Saravana Kannan wrote:
> > In attempting to optimize fw_devlink runtime, I introduced numerous cycle
> > detection bugs by foregoing cycle detection logic under specific
> > conditions. Each fix has further narrowed the conditions for optimization.
> >
> > It's time to give up on these optimization attempts and just run the cycle
> > detection logic every time fw_devlink tries to create a device link.
> >
> > The specific bug report that triggered this fix involved a supplier fwnode
> > that never gets a device created for it. Instead, the supplier fwnode is
> > represented by the device that corresponds to an ancestor fwnode.
> >
> > In this case, fw_devlink didn't do any cycle detection because the cycle
> > detection logic is only run when a device link is created between the
> > devices that correspond to the actual consumer and supplier fwnodes.
> >
> > With this change, fw_devlink will run cycle detection logic even when
> > creating SYNC_STATE_ONLY proxy device links from a device that is an
> > ancestor of a consumer fwnode.
> >
> > Reported-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
> > Closes: https://lore.kernel.org/all/1a1ab663-d068-40fb-8c94-f0715403d276@ideasonboard.com/
> > Fixes: 6442d79d880c ("driver core: fw_devlink: Improve detection of overlapping cycles")
> > Signed-off-by: Saravana Kannan <saravanak@google.com>
> > ---
> > Greg,
> >
> > I've tested this on my end and it looks ok and nothing fishy is going
> > on. You can pick this up once Tomi gives a Tested-by.
>
> I tested this on TI AM62 SK board. It has an LVDS (OLDI) display and a
> HDMI output, and both displays are connected to the same display
> subsystem. I tested with OLDI single and dual link cases, with and
> without HDMI, and in all cases probing works fine.
>
> Looks good on that front, so:
>
> Tested-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>

Great! Thanks!

> You also asked for a diff of the devlinks. That part doesn't look so
> good to me, but probably you can tell if it's normal or not.

TL;DR: All device links in a cycle get marked as
DL_FLAG_SYNC_STATE_ONLY and DL_FLAG_CYCLE (in addition to other
flags). All DL_FLAG_SYNC_STATE_ONLY (not all of them are cycles) will
get deleted after the consumer probes (since they are no longer needed
after that). My guess on what's going on is that with the patch,
fw_devlink found and marked more device links as cycles. Ones that in
the past weren't detected as being part of a cycle but coincidentally
the "post-init" dependency was the one that was getting ignored/not
enforced. So the actual links in a cycle getting deleted after all the
devices have probed is not a problem.

You can enable the "cycle" logs in drivers/base/core.c so it's easier
to follow the cycles fw_devlink detected. But the logs are a bit
cryptic because it tries to print all the multiple cycles that were
detected using a recursive search.

The non-cycle use for DL_FLAG_SYNC_STATE_ONLY is for parent devices to
put a "proxy-vote" (Hey supplier, you still have a consumer that
hasn't bound to a driver yet) for descendant (children, grand
children) devices that haven't been created yet. So, without the fix
it's possible some descendant child never got to probe and the
DL_FLAG_SYNC_STATE_ONLY device link stuck around.

If you can confirm all the deleted device links fall into one of these
two categories, then there's no issue here. If you find cases that
aren't clear, then let me know which one and point to specific nodes
in an upstream DTS file and I can take a look.

Every device link folder has a "sync_state_only" file that says if it
has the DL_FLAG_SYNC_STATE_ONLY set. But to check for the cycle flag,
you'll have to extend the debug log in device_link_add() that goes:
"Linked as a sync state only consumer to......" and print the "flags" param.

>
> $ diff devlink-single-broken.txt devlink-single-fixed.txt

I was hoping you'd give me some line count diff too to get a sense of
if it's wreaking havoc or not. But based on my local testing on
different hardware, I'm expecting a very small number of device links
are getting affected.

> 2d1
> < i2c:1-0022--i2c:1-003b
> 11d9
> <
> platform:44043000.system-controller:clock-controller--platform:20010000.i2c
> 27d24
> < platform:44043000.system-controller:clock-controller--platform:601000.gpio
> 42d38
> <
> platform:44043000.system-controller:power-controller--platform:20010000.i2c
> 58d53
> < platform:44043000.system-controller:power-controller--platform:601000.gpio
> 74d68
> < platform:4d000000.mailbox--platform:44043000.system-controller

I took a quick look at this one in
arch/arm64/boot/dts/ti/k3-am62-main.dtsi which I assume is part of the
device you are testing on and I couldn't find a cycle. But with dtsi
and dts files, it's hard to find these manually. Let me know if
fw_devlink is thinking there's a cycle where there is none.

> 76d69
> < platform:601000.gpio--i2c:1-0022
> 80d72
> < platform:bus@f0000:interrupt-controller@a00000--platform:601000.gpio
> 82d73
> < platform:f4000.pinctrl--i2c:1-0022
> 84d74
> < platform:f4000.pinctrl--platform:20010000.i2c
>
> "i2c:1-003b" is the hdmi bridge, "i2c:1-0022" is a gpio expander. So,
> for example, we lose the devlink between the gpio expander and the hdmi
> bridge. The expander is used for interrupts. There's an interrupt line
> from the HDMI bridge to the expander, and from there there's an
> interrupt line going to the SoC.
>
> Also, I noticed the devlinks change if I load the display drivers. The
> above is before loading. Comparing the loaded/not-loaded:

Yeah, DL_FLAG_SYNC_STATE_ONLY device links vanishing as more devices
probe is not a problem. That's working as intended.

Thanks,
Saravana

>
> $ diff devlink-dual-fixed.txt devlink-dual-fixed-loaded.txt
> 3d2
> < i2c:1-003b--platform:30200000.dss
> 23d21
> <
> platform:44043000.system-controller:clock-controller--platform:30200000.dss
> 52d49
> <
> platform:44043000.system-controller:power-controller--platform:30200000.dss
> 73d69
> < platform:display--platform:30200000.dss
> 78d73
> < platform:f4000.pinctrl--platform:30200000.dss
> 97a93
>  > regulator:regulator.0--platform:display
>
>   Tomi
>
>
> > Thanks,
> > Saravana
> >
> > v1 -> v2:
> > - Removed the RFC tag
> > - Remaned the subject. v1 is https://lore.kernel.org/all/20241025223721.184998-1-saravanak@google.com/T/#u
> > - Added a NULL check to avoid NULL pointer deref
> >
> >   drivers/base/core.c | 46 ++++++++++++++++++++-------------------------
> >   1 file changed, 20 insertions(+), 26 deletions(-)
> >
> > diff --git a/drivers/base/core.c b/drivers/base/core.c
> > index 3b13fed1c3e3..f96f2e4c76b4 100644
> > --- a/drivers/base/core.c
> > +++ b/drivers/base/core.c
> > @@ -1990,10 +1990,10 @@ static struct device *fwnode_get_next_parent_dev(const struct fwnode_handle *fwn
> >    *
> >    * Return true if one or more cycles were found. Otherwise, return false.
> >    */
> > -static bool __fw_devlink_relax_cycles(struct device *con,
> > +static bool __fw_devlink_relax_cycles(struct fwnode_handle *con_handle,
> >                                struct fwnode_handle *sup_handle)
> >   {
> > -     struct device *sup_dev = NULL, *par_dev = NULL;
> > +     struct device *sup_dev = NULL, *par_dev = NULL, *con_dev = NULL;
> >       struct fwnode_link *link;
> >       struct device_link *dev_link;
> >       bool ret = false;
> > @@ -2010,22 +2010,22 @@ static bool __fw_devlink_relax_cycles(struct device *con,
> >
> >       sup_handle->flags |= FWNODE_FLAG_VISITED;
> >
> > -     sup_dev = get_dev_from_fwnode(sup_handle);
> > -
> >       /* Termination condition. */
> > -     if (sup_dev == con) {
> > +     if (sup_handle == con_handle) {
> >               pr_debug("----- cycle: start -----\n");
> >               ret = true;
> >               goto out;
> >       }
> >
> > +     sup_dev = get_dev_from_fwnode(sup_handle);
> > +     con_dev = get_dev_from_fwnode(con_handle);
> >       /*
> >        * If sup_dev is bound to a driver and @con hasn't started binding to a
> >        * driver, sup_dev can't be a consumer of @con. So, no need to check
> >        * further.
> >        */
> >       if (sup_dev && sup_dev->links.status ==  DL_DEV_DRIVER_BOUND &&
> > -         con->links.status == DL_DEV_NO_DRIVER) {
> > +         con_dev && con_dev->links.status == DL_DEV_NO_DRIVER) {
> >               ret = false;
> >               goto out;
> >       }
> > @@ -2034,7 +2034,7 @@ static bool __fw_devlink_relax_cycles(struct device *con,
> >               if (link->flags & FWLINK_FLAG_IGNORE)
> >                       continue;
> >
> > -             if (__fw_devlink_relax_cycles(con, link->supplier)) {
> > +             if (__fw_devlink_relax_cycles(con_handle, link->supplier)) {
> >                       __fwnode_link_cycle(link);
> >                       ret = true;
> >               }
> > @@ -2049,7 +2049,7 @@ static bool __fw_devlink_relax_cycles(struct device *con,
> >       else
> >               par_dev = fwnode_get_next_parent_dev(sup_handle);
> >
> > -     if (par_dev && __fw_devlink_relax_cycles(con, par_dev->fwnode)) {
> > +     if (par_dev && __fw_devlink_relax_cycles(con_handle, par_dev->fwnode)) {
> >               pr_debug("%pfwf: cycle: child of %pfwf\n", sup_handle,
> >                        par_dev->fwnode);
> >               ret = true;
> > @@ -2067,7 +2067,7 @@ static bool __fw_devlink_relax_cycles(struct device *con,
> >                   !(dev_link->flags & DL_FLAG_CYCLE))
> >                       continue;
> >
> > -             if (__fw_devlink_relax_cycles(con,
> > +             if (__fw_devlink_relax_cycles(con_handle,
> >                                             dev_link->supplier->fwnode)) {
> >                       pr_debug("%pfwf: cycle: depends on %pfwf\n", sup_handle,
> >                                dev_link->supplier->fwnode);
> > @@ -2140,25 +2140,19 @@ static int fw_devlink_create_devlink(struct device *con,
> >               return -EINVAL;
> >
> >       /*
> > -      * SYNC_STATE_ONLY device links don't block probing and supports cycles.
> > -      * So, one might expect that cycle detection isn't necessary for them.
> > -      * However, if the device link was marked as SYNC_STATE_ONLY because
> > -      * it's part of a cycle, then we still need to do cycle detection. This
> > -      * is because the consumer and supplier might be part of multiple cycles
> > -      * and we need to detect all those cycles.
> > +      * Don't try to optimize by not calling the cycle detection logic under
> > +      * certain conditions. There's always some corner case that won't get
> > +      * detected.
> >        */
> > -     if (!device_link_flag_is_sync_state_only(flags) ||
> > -         flags & DL_FLAG_CYCLE) {
> > -             device_links_write_lock();
> > -             if (__fw_devlink_relax_cycles(con, sup_handle)) {
> > -                     __fwnode_link_cycle(link);
> > -                     flags = fw_devlink_get_flags(link->flags);
> > -                     pr_debug("----- cycle: end -----\n");
> > -                     dev_info(con, "Fixed dependency cycle(s) with %pfwf\n",
> > -                              sup_handle);
> > -             }
> > -             device_links_write_unlock();
> > +     device_links_write_lock();
> > +     if (__fw_devlink_relax_cycles(link->consumer, sup_handle)) {
> > +             __fwnode_link_cycle(link);
> > +             flags = fw_devlink_get_flags(link->flags);
> > +             pr_debug("----- cycle: end -----\n");
> > +             pr_info("%pfwf: Fixed dependency cycle(s) with %pfwf\n",
> > +                     link->consumer, sup_handle);
> >       }
> > +     device_links_write_unlock();
> >
> >       if (sup_handle->flags & FWNODE_FLAG_NOT_DEVICE)
> >               sup_dev = fwnode_get_next_parent_dev(sup_handle);
>
Tomi Valkeinen Oct. 29, 2024, 11:21 a.m. UTC | #3
Hi,

On 28/10/2024 22:39, Saravana Kannan wrote:
> On Mon, Oct 28, 2024 at 1:06 AM Tomi Valkeinen
> <tomi.valkeinen@ideasonboard.com> wrote:
>>
>> Hi,
>>
>> On 26/10/2024 07:52, Saravana Kannan wrote:
>>> In attempting to optimize fw_devlink runtime, I introduced numerous cycle
>>> detection bugs by foregoing cycle detection logic under specific
>>> conditions. Each fix has further narrowed the conditions for optimization.
>>>
>>> It's time to give up on these optimization attempts and just run the cycle
>>> detection logic every time fw_devlink tries to create a device link.
>>>
>>> The specific bug report that triggered this fix involved a supplier fwnode
>>> that never gets a device created for it. Instead, the supplier fwnode is
>>> represented by the device that corresponds to an ancestor fwnode.
>>>
>>> In this case, fw_devlink didn't do any cycle detection because the cycle
>>> detection logic is only run when a device link is created between the
>>> devices that correspond to the actual consumer and supplier fwnodes.
>>>
>>> With this change, fw_devlink will run cycle detection logic even when
>>> creating SYNC_STATE_ONLY proxy device links from a device that is an
>>> ancestor of a consumer fwnode.
>>>
>>> Reported-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
>>> Closes: https://lore.kernel.org/all/1a1ab663-d068-40fb-8c94-f0715403d276@ideasonboard.com/
>>> Fixes: 6442d79d880c ("driver core: fw_devlink: Improve detection of overlapping cycles")
>>> Signed-off-by: Saravana Kannan <saravanak@google.com>
>>> ---
>>> Greg,
>>>
>>> I've tested this on my end and it looks ok and nothing fishy is going
>>> on. You can pick this up once Tomi gives a Tested-by.
>>
>> I tested this on TI AM62 SK board. It has an LVDS (OLDI) display and a
>> HDMI output, and both displays are connected to the same display
>> subsystem. I tested with OLDI single and dual link cases, with and
>> without HDMI, and in all cases probing works fine.
>>
>> Looks good on that front, so:
>>
>> Tested-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
> 
> Great! Thanks!
> 
>> You also asked for a diff of the devlinks. That part doesn't look so
>> good to me, but probably you can tell if it's normal or not.
> 
> TL;DR: All device links in a cycle get marked as
> DL_FLAG_SYNC_STATE_ONLY and DL_FLAG_CYCLE (in addition to other
> flags). All DL_FLAG_SYNC_STATE_ONLY (not all of them are cycles) will
> get deleted after the consumer probes (since they are no longer needed
> after that). My guess on what's going on is that with the patch,
> fw_devlink found and marked more device links as cycles. Ones that in
> the past weren't detected as being part of a cycle but coincidentally
> the "post-init" dependency was the one that was getting ignored/not
> enforced. So the actual links in a cycle getting deleted after all the
> devices have probed is not a problem.

Ok. Yep, it might all be fine. I still don't understand all that's going 
on here, so maybe look at one more case below.

> You can enable the "cycle" logs in drivers/base/core.c so it's easier
> to follow the cycles fw_devlink detected. But the logs are a bit
> cryptic because it tries to print all the multiple cycles that were
> detected using a recursive search.
> 
> The non-cycle use for DL_FLAG_SYNC_STATE_ONLY is for parent devices to
> put a "proxy-vote" (Hey supplier, you still have a consumer that
> hasn't bound to a driver yet) for descendant (children, grand
> children) devices that haven't been created yet. So, without the fix
> it's possible some descendant child never got to probe and the
> DL_FLAG_SYNC_STATE_ONLY device link stuck around.
> 
> If you can confirm all the deleted device links fall into one of these
> two categories, then there's no issue here. If you find cases that
> aren't clear, then let me know which one and point to specific nodes
> in an upstream DTS file and I can take a look.
> 
> Every device link folder has a "sync_state_only" file that says if it
> has the DL_FLAG_SYNC_STATE_ONLY set. But to check for the cycle flag,
> you'll have to extend the debug log in device_link_add() that goes:
> "Linked as a sync state only consumer to......" and print the "flags" param.

I added this print.

I thought I'll test without any non-upstream patches, so this is booting 
with the upstream k3-am625-sk.dtb, no overlays. I've attached boot log 
(with this patch applied), and devlink lists, without and with this patch.

As the OLDI stuff is not upstream, I did expect to see less diff, and 
that is the case. It's still somewhat interesting diff:

$ diff devlink-broken.txt devlink-fixed.txt
1d0
< i2c:1-0022--i2c:1-003b

So that's the gpio expander (exp1: gpio@22 in k3-am625-sk.dts) and the 
hdmi bridge (sii9022: bridge-hdmi@3b in k3-am62x-sk-common.dtsi). And, 
indeed, in the log I can see:

i2c 1-003b: Linked as a sync state only consumer to 1-0022 (flags 0x3c0)
/bus@f0000/i2c@20010000/bridge-hdmi@3b Dropping the fwnode link to 
/bus@f0000/i2c@20010000/gpio@22

If I'm not mistaken, the above means that the framework has decided 
there's a (possible) probe time cyclic dependency between the gpio 
expander and the hdmi bridge, right?

I don't think that makes sense, and I was trying to understand why the 
framework has arrived to such a conclusion, but it's not clear to me.

Also, I can see, e.g.:

/bus@f0000/i2c@20010000: cycle: depends on /bus@f0000/dss@30200000

So somehow the i2c bus has a dependency on the DSS? The DSS does not 
depend on the i2c, but the HDMI does, so I can understand that the DSS 
would have a dependency to i2c. But the other way around?

  Tomi

>>
>> $ diff devlink-single-broken.txt devlink-single-fixed.txt
> 
> I was hoping you'd give me some line count diff too to get a sense of
> if it's wreaking havoc or not. But based on my local testing on
> different hardware, I'm expecting a very small number of device links
> are getting affected.
> 
>> 2d1
>> < i2c:1-0022--i2c:1-003b
>> 11d9
>> <
>> platform:44043000.system-controller:clock-controller--platform:20010000.i2c
>> 27d24
>> < platform:44043000.system-controller:clock-controller--platform:601000.gpio
>> 42d38
>> <
>> platform:44043000.system-controller:power-controller--platform:20010000.i2c
>> 58d53
>> < platform:44043000.system-controller:power-controller--platform:601000.gpio
>> 74d68
>> < platform:4d000000.mailbox--platform:44043000.system-controller
> 
> I took a quick look at this one in
> arch/arm64/boot/dts/ti/k3-am62-main.dtsi which I assume is part of the
> device you are testing on and I couldn't find a cycle. But with dtsi
> and dts files, it's hard to find these manually. Let me know if
> fw_devlink is thinking there's a cycle where there is none.
> 
>> 76d69
>> < platform:601000.gpio--i2c:1-0022
>> 80d72
>> < platform:bus@f0000:interrupt-controller@a00000--platform:601000.gpio
>> 82d73
>> < platform:f4000.pinctrl--i2c:1-0022
>> 84d74
>> < platform:f4000.pinctrl--platform:20010000.i2c
>>
>> "i2c:1-003b" is the hdmi bridge, "i2c:1-0022" is a gpio expander. So,
>> for example, we lose the devlink between the gpio expander and the hdmi
>> bridge. The expander is used for interrupts. There's an interrupt line
>> from the HDMI bridge to the expander, and from there there's an
>> interrupt line going to the SoC.
>>
>> Also, I noticed the devlinks change if I load the display drivers. The
>> above is before loading. Comparing the loaded/not-loaded:
> 
> Yeah, DL_FLAG_SYNC_STATE_ONLY device links vanishing as more devices
> probe is not a problem. That's working as intended.
> 
> Thanks,
> Saravana
> 
>>
>> $ diff devlink-dual-fixed.txt devlink-dual-fixed-loaded.txt
>> 3d2
>> < i2c:1-003b--platform:30200000.dss
>> 23d21
>> <
>> platform:44043000.system-controller:clock-controller--platform:30200000.dss
>> 52d49
>> <
>> platform:44043000.system-controller:power-controller--platform:30200000.dss
>> 73d69
>> < platform:display--platform:30200000.dss
>> 78d73
>> < platform:f4000.pinctrl--platform:30200000.dss
>> 97a93
>>   > regulator:regulator.0--platform:display
>>
>>    Tomi
>>
>>
>>> Thanks,
>>> Saravana
>>>
>>> v1 -> v2:
>>> - Removed the RFC tag
>>> - Remaned the subject. v1 is https://lore.kernel.org/all/20241025223721.184998-1-saravanak@google.com/T/#u
>>> - Added a NULL check to avoid NULL pointer deref
>>>
>>>    drivers/base/core.c | 46 ++++++++++++++++++++-------------------------
>>>    1 file changed, 20 insertions(+), 26 deletions(-)
>>>
>>> diff --git a/drivers/base/core.c b/drivers/base/core.c
>>> index 3b13fed1c3e3..f96f2e4c76b4 100644
>>> --- a/drivers/base/core.c
>>> +++ b/drivers/base/core.c
>>> @@ -1990,10 +1990,10 @@ static struct device *fwnode_get_next_parent_dev(const struct fwnode_handle *fwn
>>>     *
>>>     * Return true if one or more cycles were found. Otherwise, return false.
>>>     */
>>> -static bool __fw_devlink_relax_cycles(struct device *con,
>>> +static bool __fw_devlink_relax_cycles(struct fwnode_handle *con_handle,
>>>                                 struct fwnode_handle *sup_handle)
>>>    {
>>> -     struct device *sup_dev = NULL, *par_dev = NULL;
>>> +     struct device *sup_dev = NULL, *par_dev = NULL, *con_dev = NULL;
>>>        struct fwnode_link *link;
>>>        struct device_link *dev_link;
>>>        bool ret = false;
>>> @@ -2010,22 +2010,22 @@ static bool __fw_devlink_relax_cycles(struct device *con,
>>>
>>>        sup_handle->flags |= FWNODE_FLAG_VISITED;
>>>
>>> -     sup_dev = get_dev_from_fwnode(sup_handle);
>>> -
>>>        /* Termination condition. */
>>> -     if (sup_dev == con) {
>>> +     if (sup_handle == con_handle) {
>>>                pr_debug("----- cycle: start -----\n");
>>>                ret = true;
>>>                goto out;
>>>        }
>>>
>>> +     sup_dev = get_dev_from_fwnode(sup_handle);
>>> +     con_dev = get_dev_from_fwnode(con_handle);
>>>        /*
>>>         * If sup_dev is bound to a driver and @con hasn't started binding to a
>>>         * driver, sup_dev can't be a consumer of @con. So, no need to check
>>>         * further.
>>>         */
>>>        if (sup_dev && sup_dev->links.status ==  DL_DEV_DRIVER_BOUND &&
>>> -         con->links.status == DL_DEV_NO_DRIVER) {
>>> +         con_dev && con_dev->links.status == DL_DEV_NO_DRIVER) {
>>>                ret = false;
>>>                goto out;
>>>        }
>>> @@ -2034,7 +2034,7 @@ static bool __fw_devlink_relax_cycles(struct device *con,
>>>                if (link->flags & FWLINK_FLAG_IGNORE)
>>>                        continue;
>>>
>>> -             if (__fw_devlink_relax_cycles(con, link->supplier)) {
>>> +             if (__fw_devlink_relax_cycles(con_handle, link->supplier)) {
>>>                        __fwnode_link_cycle(link);
>>>                        ret = true;
>>>                }
>>> @@ -2049,7 +2049,7 @@ static bool __fw_devlink_relax_cycles(struct device *con,
>>>        else
>>>                par_dev = fwnode_get_next_parent_dev(sup_handle);
>>>
>>> -     if (par_dev && __fw_devlink_relax_cycles(con, par_dev->fwnode)) {
>>> +     if (par_dev && __fw_devlink_relax_cycles(con_handle, par_dev->fwnode)) {
>>>                pr_debug("%pfwf: cycle: child of %pfwf\n", sup_handle,
>>>                         par_dev->fwnode);
>>>                ret = true;
>>> @@ -2067,7 +2067,7 @@ static bool __fw_devlink_relax_cycles(struct device *con,
>>>                    !(dev_link->flags & DL_FLAG_CYCLE))
>>>                        continue;
>>>
>>> -             if (__fw_devlink_relax_cycles(con,
>>> +             if (__fw_devlink_relax_cycles(con_handle,
>>>                                              dev_link->supplier->fwnode)) {
>>>                        pr_debug("%pfwf: cycle: depends on %pfwf\n", sup_handle,
>>>                                 dev_link->supplier->fwnode);
>>> @@ -2140,25 +2140,19 @@ static int fw_devlink_create_devlink(struct device *con,
>>>                return -EINVAL;
>>>
>>>        /*
>>> -      * SYNC_STATE_ONLY device links don't block probing and supports cycles.
>>> -      * So, one might expect that cycle detection isn't necessary for them.
>>> -      * However, if the device link was marked as SYNC_STATE_ONLY because
>>> -      * it's part of a cycle, then we still need to do cycle detection. This
>>> -      * is because the consumer and supplier might be part of multiple cycles
>>> -      * and we need to detect all those cycles.
>>> +      * Don't try to optimize by not calling the cycle detection logic under
>>> +      * certain conditions. There's always some corner case that won't get
>>> +      * detected.
>>>         */
>>> -     if (!device_link_flag_is_sync_state_only(flags) ||
>>> -         flags & DL_FLAG_CYCLE) {
>>> -             device_links_write_lock();
>>> -             if (__fw_devlink_relax_cycles(con, sup_handle)) {
>>> -                     __fwnode_link_cycle(link);
>>> -                     flags = fw_devlink_get_flags(link->flags);
>>> -                     pr_debug("----- cycle: end -----\n");
>>> -                     dev_info(con, "Fixed dependency cycle(s) with %pfwf\n",
>>> -                              sup_handle);
>>> -             }
>>> -             device_links_write_unlock();
>>> +     device_links_write_lock();
>>> +     if (__fw_devlink_relax_cycles(link->consumer, sup_handle)) {
>>> +             __fwnode_link_cycle(link);
>>> +             flags = fw_devlink_get_flags(link->flags);
>>> +             pr_debug("----- cycle: end -----\n");
>>> +             pr_info("%pfwf: Fixed dependency cycle(s) with %pfwf\n",
>>> +                     link->consumer, sup_handle);
>>>        }
>>> +     device_links_write_unlock();
>>>
>>>        if (sup_handle->flags & FWNODE_FLAG_NOT_DEVICE)
>>>                sup_dev = fwnode_get_next_parent_dev(sup_handle);
>>
Booting Linux on physical CPU 0x0000000000 [0x410fd034]
Linux version 6.12.0-rc4+ (tomba@deskari) (aarch64-linux-gnu-gcc (Ubuntu 13.2.0-23ubuntu4) 13.2.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #5 SMP PREEMPT Tue Oct 29 12:57:21 EET 2024
Machine model: Texas Instruments AM625 SK
efi: UEFI not found.
Reserved memory: bypass linux,cma node, using cmdline CMA params instead
OF: reserved mem: node linux,cma compatible matching fail
OF: reserved mem: 0x000000009ca00000..0x000000009cafffff (1024 KiB) map non-reusable ramoops@9ca00000
Reserved memory: created DMA memory pool at 0x000000009db00000, size 12 MiB
OF: reserved mem: initialized node r5f-dma-memory@9db00000, compatible id shared-dma-pool
OF: reserved mem: 0x000000009db00000..0x000000009e6fffff (12288 KiB) nomap non-reusable r5f-dma-memory@9db00000
OF: reserved mem: 0x000000009e780000..0x000000009e7fffff (512 KiB) nomap non-reusable tfa@9e780000
OF: reserved mem: 0x000000009e800000..0x000000009fffffff (24576 KiB) nomap non-reusable optee@9e800000
NUMA: Faking a node at [mem 0x0000000080000000-0x00000000ffffffff]
NODE_DATA(0) allocated [mem 0xffbc7700-0xffbca0ff]
Zone ranges:
  DMA      [mem 0x0000000080000000-0x00000000ffffffff]
  DMA32    empty
  Normal   empty
Movable zone start for each node
Early memory node ranges
  node   0: [mem 0x0000000080000000-0x000000009dafffff]
  node   0: [mem 0x000000009db00000-0x000000009e6fffff]
  node   0: [mem 0x000000009e700000-0x000000009e77ffff]
  node   0: [mem 0x000000009e780000-0x000000009fffffff]
  node   0: [mem 0x00000000a0000000-0x00000000ffffffff]
Initmem setup node 0 [mem 0x0000000080000000-0x00000000ffffffff]
cma: Reserved 64 MiB at 0x00000000f9a00000 on node -1
psci: probing for conduit method from DT.
psci: PSCIv1.1 detected in firmware.
psci: Using standard PSCI v0.2 function IDs
psci: Trusted OS migration not required
psci: SMC Calling Convention v1.4
percpu: Embedded 34 pages/cpu s98832 r8192 d32240 u139264
pcpu-alloc: s98832 r8192 d32240 u139264 alloc=34*4096
pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3 
Detected VIPT I-cache on CPU0
CPU features: detected: GIC system register CPU interface
CPU features: detected: ARM erratum 845719
alternatives: applying boot alternatives
Kernel command line: console=ttyS2,115200n8 root=/dev/nfs rw nfsroot=/home/tomba/nfs/rootfs32,v3,tcp ip=::::buildroot:eth0:dhcp cma=64M
Dentry cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
Inode-cache hash table entries: 131072 (order: 8, 1048576 bytes, linear)
Fallback order for Node 0: 0 
Built 1 zonelists, mobility grouping on.  Total pages: 524288
Policy zone: DMA
mem auto-init: stack:all(zero), heap alloc:off, heap free:off
stackdepot: allocating hash table via alloc_large_system_hash
stackdepot hash table entries: 131072 (order: 9, 2097152 bytes, linear)
software IO TLB: SWIOTLB bounce buffer size adjusted to 2MB
software IO TLB: area num 4.
software IO TLB: mapped [mem 0x00000000f9300000-0x00000000f9500000] (2MB)
SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
ftrace: allocating 48749 entries in 191 pages
ftrace: allocated 191 pages with 7 groups
trace event string verifier disabled
Running RCU self tests
Running RCU synchronous self tests
rcu: Preemptible hierarchical RCU implementation.
rcu: 	RCU event tracing is enabled.
rcu: 	RCU lockdep checking is enabled.
rcu: 	RCU restricting CPUs from NR_CPUS=512 to nr_cpu_ids=4.
	Trampoline variant of Tasks RCU enabled.
	Rude variant of Tasks RCU enabled.
	Tracing variant of Tasks RCU enabled.
rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
Running RCU synchronous self tests
RCU Tasks: Setting shift to 2 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=4.
RCU Tasks Rude: Setting shift to 2 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=4.
RCU Tasks Trace: Setting shift to 2 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=4.
NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
GICv3: GIC: Using split EOI/Deactivate mode
GICv3: 256 SPIs implemented
GICv3: 0 Extended SPIs implemented
Root IRQ handler: gic_handle_irq
GICv3: GICv3 features: 16 PPIs
GICv3: GICD_CTRL.DS=0, SCR_EL3.FIQ=1
GICv3: CPU0: found redistributor 0 region 0:0x0000000001880000
ITS [mem 0x01820000-0x0182ffff]
GIC: enabling workaround for ITS: Socionext Synquacer pre-ITS
ITS@0x0000000001820000: Devices Table too large, reduce ids 20->19
ITS@0x0000000001820000: allocated 524288 Devices @80800000 (flat, esz 8, psz 64K, shr 0)
ITS: using cache flushing for cmd queue
GICv3: using LPI property table @0x0000000080300000
GIC: using cache flushing for LPI property table
GICv3: CPU0: using allocated LPI pending table @0x0000000080310000
rcu: srcu_init: Setting srcu_struct sizes based on contention.
arch_timer: cp15 timer(s) running at 200.00MHz (phys).
clocksource: arch_sys_counter: mask: 0x3ffffffffffffff max_cycles: 0x2e2049d3e8, max_idle_ns: 440795210634 ns
sched_clock: 58 bits at 200MHz, resolution 5ns, wraps every 4398046511102ns
Console: colour dummy device 80x25
Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar
... MAX_LOCKDEP_SUBCLASSES:  8
... MAX_LOCK_DEPTH:          48
... MAX_LOCKDEP_KEYS:        8192
... CLASSHASH_SIZE:          4096
... MAX_LOCKDEP_ENTRIES:     32768
... MAX_LOCKDEP_CHAINS:      65536
... CHAINHASH_SIZE:          32768
 memory used by lock dependency info: 6429 kB
 memory used for stack traces: 4224 kB
 per task-struct memory footprint: 1920 bytes
Calibrating delay loop (skipped), value calculated using timer frequency.. 400.00 BogoMIPS (lpj=800000)
pid_max: default: 32768 minimum: 301
LSM: initializing lsm=capability
Mount-cache hash table entries: 4096 (order: 3, 32768 bytes, linear)
Mountpoint-cache hash table entries: 4096 (order: 3, 32768 bytes, linear)
Running RCU synchronous self tests
Running RCU synchronous self tests
Running RCU Tasks wait API self tests
Running RCU Tasks Rude wait API self tests
Running RCU Tasks Trace wait API self tests
rcu: Hierarchical SRCU implementation.
rcu: 	Max phase no-delay instances is 1000.
Timer migration: 1 hierarchy levels; 8 children per group; 1 crossnode level
Callback from call_rcu_tasks_trace() invoked.
EFI services will not be available.
smp: Bringing up secondary CPUs ...
Detected VIPT I-cache on CPU1
GICv3: CPU1: found redistributor 1 region 0:0x00000000018a0000
GICv3: CPU1: using allocated LPI pending table @0x0000000080320000
CPU1: Booted secondary processor 0x0000000001 [0x410fd034]
Detected VIPT I-cache on CPU2
GICv3: CPU2: found redistributor 2 region 0:0x00000000018c0000
GICv3: CPU2: using allocated LPI pending table @0x0000000080330000
CPU2: Booted secondary processor 0x0000000002 [0x410fd034]
Detected VIPT I-cache on CPU3
GICv3: CPU3: found redistributor 3 region 0:0x00000000018e0000
GICv3: CPU3: using allocated LPI pending table @0x0000000080340000
CPU3: Booted secondary processor 0x0000000003 [0x410fd034]
smp: Brought up 1 node, 4 CPUs
SMP: Total of 4 processors activated.
CPU: All CPU(s) started at EL2
CPU features: detected: 32-bit EL0 Support
CPU features: detected: CRC32 instructions
alternatives: applying system-wide alternatives
Memory: 1886264K/2097152K available (15616K kernel code, 4046K rwdata, 6308K rodata, 5888K init, 16700K bss, 133100K reserved, 65536K cma-reserved)
devtmpfs: initialized
device: 'platform': device_add
device: 'memory': device_add
device: 'memory16': device_add
device: 'memory17': device_add
device: 'memory18': device_add
device: 'memory19': device_add
device: 'memory20': device_add
device: 'memory21': device_add
device: 'memory22': device_add
device: 'memory23': device_add
device: 'memory24': device_add
device: 'memory25': device_add
device: 'memory26': device_add
device: 'memory27': device_add
device: 'memory28': device_add
device: 'memory29': device_add
device: 'memory30': device_add
device: 'memory31': device_add
device: 'node': device_add
device: 'node0': device_add
device: 'cpu': device_add
device: 'cpu0': device_add
device: 'cpu1': device_add
device: 'cpu2': device_add
device: 'cpu3': device_add
device: 'container': device_add
device: 'workqueue': device_add
Running RCU synchronous self tests
Running RCU synchronous self tests
DMA-API: preallocated 65536 debug entries
DMA-API: debugging enabled by kernel config
clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
futex hash table entries: 1024 (order: 5, 131072 bytes, linear)
20560 pages in range for non-PLT usage
512080 pages in range for PLT usage
pinctrl core: initialized pinctrl subsystem
device: 'reg-dummy': device_add
Callback from call_rcu_tasks() invoked.
DMI not present or invalid.
device: 'regulator.0': device_add
NET: Registered PF_NETLINK/PF_ROUTE protocol family
DMA: preallocated 256 KiB GFP_KERNEL pool for atomic allocations
DMA: preallocated 256 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
DMA: preallocated 256 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
audit: initializing netlink subsys (disabled)
audit: type=2000 audit(0.352:1): state=initialized audit_enabled=0 res=1
device: 'vtcon0': device_add
thermal_sys: Registered thermal governor 'step_wise'
thermal_sys: Registered thermal governor 'power_allocator'
cpuidle: using governor menu
hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
ASID allocator initialised with 65536 entries
Serial: AMBA PL011 UART driver
device: '9ca00000.ramoops': device_add
device: 'firmware:optee': device_add
device: 'firmware:psci': device_add
device: 'timer-cl0-cpu0': device_add
/timer-cl0-cpu0 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
platform timer-cl0-cpu0: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/timer-cl0-cpu0 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: 'pmu': device_add
/pmu Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
platform pmu: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/pmu Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: 'bus@f0000': device_add
/bus@f0000/bus@b00000/target-module@2b300050 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/bus@b00000/target-module@2b300050 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/bus@b00000/rtc@2b1f0000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/bus@b00000/rtc@2b1f0000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/bus@b00000/rtc@2b1f0000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/bus@b00000/temperature-sensor@b00000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/interrupt-controller@1800000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/bus@100000/clock-controller@82e0 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/bus@100000/clock-controller@82e4 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/bus@48000000/mailbox@4d000000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/bus@48000000/interrupt-controller@48000000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/bus@48000000/dma-controller@485c0100 Linked as a fwnode consumer to /bus@f0000/bus@48000000/interrupt-controller@48000000
/bus@f0000/bus@48000000/dma-controller@485c0000 Linked as a fwnode consumer to /bus@f0000/bus@48000000/interrupt-controller@48000000
/bus@f0000/system-controller@44043000 Linked as a fwnode consumer to /bus@f0000/bus@48000000/mailbox@4d000000
/bus@f0000/timer@2400000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/timer@2400000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/timer@2400000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/timer@2410000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/timer@2410000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/timer@2410000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/timer@2420000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/timer@2420000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/timer@2420000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/timer@2430000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/timer@2430000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/timer@2430000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/timer@2440000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/timer@2440000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/timer@2440000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/timer@2450000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/timer@2450000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/timer@2450000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/timer@2460000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/timer@2460000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/timer@2460000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/timer@2470000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/timer@2470000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/timer@2470000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/serial@2800000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/serial@2800000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/serial@2800000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/serial@2800000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000/main-uart0-default-pins
/bus@f0000/i2c@20000000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/i2c@20000000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/i2c@20000000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/i2c@20000000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000/main-i2c0-default-pins
/bus@f0000/i2c@20000000/tps6598x@3f/connector Linked as a fwnode consumer to /bus@f0000/dwc3-usb@f900000/usb@31000000
/bus@f0000/i2c@20010000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/i2c@20010000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/i2c@20010000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/i2c@20010000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000/main-i2c1-default-pins
/bus@f0000/i2c@20010000/audio-codec@1b Linked as a fwnode consumer to /regulator-2
/bus@f0000/i2c@20010000/audio-codec@1b Linked as a fwnode consumer to /regulator-5
/bus@f0000/i2c@20010000/bridge-hdmi@3b Linked as a fwnode consumer to /bus@f0000/i2c@20010000/gpio@22
/bus@f0000/i2c@20010000/bridge-hdmi@3b Linked as a fwnode consumer to /bus@f0000/dss@30200000
/bus@f0000/i2c@20010000/bridge-hdmi@3b Linked as a fwnode consumer to /connector-hdmi
/bus@f0000/i2c@20010000/gpio@22 Linked as a fwnode consumer to /bus@f0000/gpio@601000
/bus@f0000/i2c@20010000/gpio@22 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000/main-gpio1-ioexp-intr-default-pins
/bus@f0000/i2c@20020000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/i2c@20020000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/i2c@20020000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/i2c@20020000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000/main-i2c2-default-pins
/bus@f0000/interrupt-controller@a00000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/gpio@600000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@a00000
/bus@f0000/gpio@600000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/gpio@600000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/gpio@601000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@a00000
/bus@f0000/gpio@601000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/gpio@601000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/mmc@fa10000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/mmc@fa10000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/mmc@fa10000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/mmc@fa10000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000/main-mmc0-default-pins
/bus@f0000/mmc@fa00000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/mmc@fa00000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/mmc@fa00000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/mmc@fa00000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000/main-mmc1-default-pins
/bus@f0000/mmc@fa00000 Linked as a fwnode consumer to /regulator-3
/bus@f0000/mmc@fa00000 Linked as a fwnode consumer to /regulator-4
/bus@f0000/dwc3-usb@f900000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/dwc3-usb@f900000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/dwc3-usb@f900000/usb@31000000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/dwc3-usb@f900000/usb@31000000 Linked as a fwnode consumer to /bus@f0000/i2c@20000000/tps6598x@3f/connector
/bus@f0000/dwc3-usb@f910000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/dwc3-usb@f910000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/dwc3-usb@f910000/usb@31100000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/dwc3-usb@f910000/usb@31100000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000/main-usb1-default-pins
/bus@f0000/bus@fc00000/spi@fc40000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/bus@fc00000/spi@fc40000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/bus@fc00000/spi@fc40000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/bus@fc00000/spi@fc40000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000/ospi0-default-pins
/bus@f0000/gpu@fd00000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/gpu@fd00000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/gpu@fd00000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/ethernet@8000000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/ethernet@8000000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/ethernet@8000000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000/main-rgmii1-default-pins
/bus@f0000/ethernet@8000000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000/main-rgmii2-default-pins
/bus@f0000/ethernet@8000000/ethernet-ports/port@1 Linked as a fwnode consumer to /bus@f0000/bus@100000/phy@4044
/bus@f0000/ethernet@8000000/ethernet-ports/port@2 Linked as a fwnode consumer to /bus@f0000/bus@100000/phy@4044
/bus@f0000/ethernet@8000000/mdio@f00 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/ethernet@8000000/mdio@f00 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000/main-mdio1-default-pins
/bus@f0000/ethernet@8000000/cpts@3d000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/ethernet@8000000/cpts@3d000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/dss@30200000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/dss@30200000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/dss@30200000 Linked as a fwnode consumer to /clock-divider-oldi
/bus@f0000/dss@30200000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/dss@30200000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000/main-dss0-default-pins
/bus@f0000/dss@30200000 Linked as a fwnode consumer to /bus@f0000/i2c@20010000/bridge-hdmi@3b
/bus@f0000/mailbox@29000000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/watchdog@e000000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/watchdog@e000000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/watchdog@e010000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/watchdog@e010000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/watchdog@e020000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/watchdog@e020000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/watchdog@e030000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/watchdog@e030000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/watchdog@e0f0000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/watchdog@e0f0000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/audio-controller@2b10000 Linked as a fwnode consumer to /bus@f0000/interrupt-controller@1800000
/bus@f0000/audio-controller@2b10000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/clock-controller
/bus@f0000/audio-controller@2b10000 Linked as a fwnode consumer to /bus@f0000/system-controller@44043000/power-controller
/bus@f0000/audio-controller@2b10000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000/main-mcasp1-default-pins
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
----- cycle: start -----
/bus@f0000/interrupt-controller@1800000: cycle: depends on /bus@f0000/interrupt-controller@1800000
----- cycle: end -----
/bus@f0000/interrupt-controller@1800000: Fixed dependency cycle(s) with /bus@f0000/interrupt-controller@1800000
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
----- cycle: start -----
/bus@f0000/dwc3-usb@f900000/usb@31000000: cycle: depends on /bus@f0000/i2c@20000000/tps6598x@3f/connector
/bus@f0000/i2c@20000000/tps6598x@3f/connector: cycle: depends on /bus@f0000/dwc3-usb@f900000/usb@31000000
----- cycle: end -----
/bus@f0000/i2c@20000000/tps6598x@3f/connector: Fixed dependency cycle(s) with /bus@f0000/dwc3-usb@f900000/usb@31000000
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
----- cycle: start -----
/bus@f0000/dss@30200000: cycle: depends on /bus@f0000/i2c@20010000/bridge-hdmi@3b
/bus@f0000/i2c@20010000/bridge-hdmi@3b: cycle: depends on /bus@f0000/dss@30200000
----- cycle: end -----
/bus@f0000/i2c@20010000/bridge-hdmi@3b: Fixed dependency cycle(s) with /bus@f0000/dss@30200000
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
----- cycle: start -----
/bus@f0000/i2c@20000000/tps6598x@3f/connector: cycle: depends on /bus@f0000/dwc3-usb@f900000/usb@31000000
/bus@f0000/dwc3-usb@f900000/usb@31000000: cycle: depends on /bus@f0000/i2c@20000000/tps6598x@3f/connector
----- cycle: end -----
/bus@f0000/dwc3-usb@f900000/usb@31000000: Fixed dependency cycle(s) with /bus@f0000/i2c@20000000/tps6598x@3f/connector
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
----- cycle: start -----
/bus@f0000/i2c@20010000/bridge-hdmi@3b: cycle: depends on /bus@f0000/dss@30200000
/bus@f0000/dss@30200000: cycle: depends on /bus@f0000/i2c@20010000/bridge-hdmi@3b
----- cycle: end -----
/bus@f0000/dss@30200000: Fixed dependency cycle(s) with /bus@f0000/i2c@20010000/bridge-hdmi@3b
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /clock-divider-oldi - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
device: 'bus@f0000:bus@4000000': device_add
device: '4084000.pinctrl': device_add
device: '4100000.esm': device_add
device: 'bus@f0000:bus@b00000': device_add
platform bus@f0000:bus@b00000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
device: '43000000.syscon': device_add
device: '43000014.chipid': device_add
device: '43000200.ethernet-mac-syscon': device_add
device: '43004008.syscon': device_add
device: '43004018.syscon': device_add
device: '2b300050.target-module': device_add
device: '2b1f0000.rtc': device_add
platform 2b1f0000.rtc: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/bus@b00000/rtc@2b1f0000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: 'b00000.temperature-sensor': device_add
device: '70000000.sram': device_add
device: 'bus@f0000:bus@100000': device_add
device: '104044.phy': device_add
device: '104130.clock-controller': device_add
device: '1082e0.clock-controller': device_add
device: '1082e4.clock-controller': device_add
device: 'bus@f0000:bus@48000000': device_add
platform bus@f0000:bus@48000000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
platform bus@f0000:bus@48000000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
device: '4d000000.mailbox': device_add
platform 4d000000.mailbox: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/bus@48000000/mailbox@4d000000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: '48000000.interrupt-controller': device_add
platform 48000000.interrupt-controller: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/bus@48000000/interrupt-controller@48000000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: '485c0100.dma-controller': device_add
device: 'platform:48000000.interrupt-controller--platform:485c0100.dma-controller': device_add
devices_kset: Moving 485c0100.dma-controller to end of list
platform 485c0100.dma-controller: Linked as a consumer to 48000000.interrupt-controller
/bus@f0000/bus@48000000/dma-controller@485c0100 Dropping the fwnode link to /bus@f0000/bus@48000000/interrupt-controller@48000000
device: '485c0000.dma-controller': device_add
device: 'platform:48000000.interrupt-controller--platform:485c0000.dma-controller': device_add
devices_kset: Moving 485c0000.dma-controller to end of list
platform 485c0000.dma-controller: Linked as a consumer to 48000000.interrupt-controller
/bus@f0000/bus@48000000/dma-controller@485c0000 Dropping the fwnode link to /bus@f0000/bus@48000000/interrupt-controller@48000000
device: '44043000.system-controller': device_add
device: 'platform:4d000000.mailbox--platform:44043000.system-controller': device_add
devices_kset: Moving 44043000.system-controller to end of list
platform 44043000.system-controller: Linked as a consumer to 4d000000.mailbox
/bus@f0000/system-controller@44043000 Dropping the fwnode link to /bus@f0000/bus@48000000/mailbox@4d000000
device: '40900000.crypto': device_add
device: 'f4000.pinctrl': device_add
device: '420000.esm': device_add
device: '2400000.timer': device_add
platform 2400000.timer: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/timer@2400000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: '2410000.timer': device_add
platform 2410000.timer: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/timer@2410000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: '2420000.timer': device_add
platform 2420000.timer: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/timer@2420000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: '2430000.timer': device_add
platform 2430000.timer: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/timer@2430000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: '2440000.timer': device_add
platform 2440000.timer: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/timer@2440000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: '2450000.timer': device_add
platform 2450000.timer: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/timer@2450000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: '2460000.timer': device_add
platform 2460000.timer: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/timer@2460000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: '2470000.timer': device_add
platform 2470000.timer: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/timer@2470000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: '2800000.serial': device_add
platform 2800000.serial: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/serial@2800000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: '20000000.i2c': device_add
platform 20000000.i2c: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/i2c@20000000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
----- cycle: start -----
/bus@f0000/dwc3-usb@f900000/usb@31000000: cycle: depends on /bus@f0000/i2c@20000000/tps6598x@3f/connector
/bus@f0000/i2c@20000000/tps6598x@3f/connector: cycle: depends on /bus@f0000/dwc3-usb@f900000/usb@31000000
----- cycle: end -----
/bus@f0000/i2c@20000000/tps6598x@3f/connector: Fixed dependency cycle(s) with /bus@f0000/dwc3-usb@f900000/usb@31000000
device: '20010000.i2c': device_add
platform 20010000.i2c: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/i2c@20010000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
----- cycle: start -----
/bus@f0000/dss@30200000: cycle: depends on /bus@f0000/i2c@20010000/bridge-hdmi@3b
/bus@f0000/i2c@20010000/bridge-hdmi@3b: cycle: depends on /bus@f0000/dss@30200000
----- cycle: end -----
/bus@f0000/i2c@20010000/bridge-hdmi@3b: Fixed dependency cycle(s) with /bus@f0000/dss@30200000
device: '20020000.i2c': device_add
platform 20020000.i2c: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/i2c@20020000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: 'bus@f0000:interrupt-controller@a00000': device_add
platform bus@f0000:interrupt-controller@a00000: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/interrupt-controller@a00000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: '600000.gpio': device_add
device: 'platform:bus@f0000:interrupt-controller@a00000--platform:600000.gpio': device_add
devices_kset: Moving 600000.gpio to end of list
platform 600000.gpio: Linked as a consumer to bus@f0000:interrupt-controller@a00000
/bus@f0000/gpio@600000 Dropping the fwnode link to /bus@f0000/interrupt-controller@a00000
platform 600000.gpio: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/clock-controller
device: '601000.gpio': device_add
device: 'platform:601000.gpio--platform:20010000.i2c': device_add
platform 20010000.i2c: Linked as a sync state only consumer to 601000.gpio (flags 0x1c0)
device: 'platform:bus@f0000:interrupt-controller@a00000--platform:601000.gpio': device_add
devices_kset: Moving 601000.gpio to end of list
platform 601000.gpio: Linked as a consumer to bus@f0000:interrupt-controller@a00000
/bus@f0000/gpio@601000 Dropping the fwnode link to /bus@f0000/interrupt-controller@a00000
platform 601000.gpio: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/clock-controller
device: 'fa10000.mmc': device_add
platform fa10000.mmc: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/mmc@fa10000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: 'fa00000.mmc': device_add
platform fa00000.mmc: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/mmc@fa00000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: 'f900000.dwc3-usb': device_add
----- cycle: start -----
/bus@f0000/i2c@20000000/tps6598x@3f/connector: cycle: depends on /bus@f0000/dwc3-usb@f900000/usb@31000000
/bus@f0000/dwc3-usb@f900000/usb@31000000: cycle: depends on /bus@f0000/i2c@20000000/tps6598x@3f/connector
----- cycle: end -----
/bus@f0000/dwc3-usb@f900000/usb@31000000: Fixed dependency cycle(s) with /bus@f0000/i2c@20000000/tps6598x@3f/connector
platform f900000.dwc3-usb: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
device: 'f910000.dwc3-usb': device_add
platform f910000.dwc3-usb: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
device: 'fc00000.bus': device_add
platform fc00000.bus: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
device: 'fc40000.spi': device_add
platform fc40000.spi: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/bus@fc00000/spi@fc40000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: 'fd00000.gpu': device_add
platform fd00000.gpu: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/gpu@fd00000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: '8000000.ethernet': device_add
device: 'platform:104044.phy--platform:8000000.ethernet': device_add
platform 8000000.ethernet: Linked as a sync state only consumer to 104044.phy (flags 0x1c0)
platform 8000000.ethernet: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
device: '30200000.dss': device_add
----- cycle: start -----
/bus@f0000/dss@30200000: cycle: depends on /bus@f0000/i2c@20010000/bridge-hdmi@3b
/bus@f0000/i2c@20010000/bridge-hdmi@3b: cycle: depends on /bus@f0000/dss@30200000
----- cycle: end -----
/bus@f0000/i2c@20010000/bridge-hdmi@3b: Fixed dependency cycle(s) with /bus@f0000/dss@30200000
device: 'platform:30200000.dss--platform:20010000.i2c': device_add
platform 20010000.i2c: Linked as a sync state only consumer to 30200000.dss (flags 0x3c0)
----- cycle: start -----
/bus@f0000/i2c@20010000/bridge-hdmi@3b: cycle: depends on /bus@f0000/dss@30200000
----- cycle: start -----
/bus@f0000/i2c@20010000: cycle: depends on /bus@f0000/dss@30200000
/bus@f0000/i2c@20010000/gpio@22: cycle: child of /bus@f0000/i2c@20010000
/bus@f0000/i2c@20010000/bridge-hdmi@3b: cycle: depends on /bus@f0000/i2c@20010000/gpio@22
----- cycle: start -----
/bus@f0000/i2c@20010000: cycle: depends on /bus@f0000/dss@30200000
/bus@f0000/i2c@20010000/bridge-hdmi@3b: cycle: child of /bus@f0000/i2c@20010000
/bus@f0000/dss@30200000: cycle: depends on /bus@f0000/i2c@20010000/bridge-hdmi@3b
----- cycle: end -----
/bus@f0000/dss@30200000: Fixed dependency cycle(s) with /bus@f0000/i2c@20010000/bridge-hdmi@3b
platform 30200000.dss: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/dss@30200000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
platform 30200000.dss: Not linking /clock-divider-oldi - might never become dev
/bus@f0000/dss@30200000 Dropping the fwnode link to /clock-divider-oldi
device: '2a000000.spinlock': device_add
device: '29000000.mailbox': device_add
platform 29000000.mailbox: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/mailbox@29000000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: 'e000000.watchdog': device_add
device: 'e010000.watchdog': device_add
device: 'e020000.watchdog': device_add
device: 'e030000.watchdog': device_add
device: 'e0f0000.watchdog': device_add
device: '2b10000.audio-controller': device_add
platform 2b10000.audio-controller: Not linking /bus@f0000/interrupt-controller@1800000 - might never become dev
/bus@f0000/audio-controller@2b10000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: 'opp-table': device_add
device: 'l2-cache0': device_add
device: 'leds': device_add
/leds Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000/usr-led-default-pins
/leds/led-0 Linked as a fwnode consumer to /bus@f0000/gpio@601000
device: 'platform:601000.gpio--platform:leds': device_add
platform leds: Linked as a sync state only consumer to 601000.gpio (flags 0x1c0)
device: 'sound': device_add
/sound/simple-audio-card,codec Linked as a fwnode consumer to /clk-0
platform sound: Not linking /clk-0 - might never become dev
device: 'connector-hdmi': device_add
/connector-hdmi Linked as a fwnode consumer to /bus@f0000/i2c@20010000/bridge-hdmi@3b
----- cycle: start -----
/connector-hdmi: cycle: depends on /bus@f0000/i2c@20010000/bridge-hdmi@3b
/bus@f0000/i2c@20010000/bridge-hdmi@3b: cycle: depends on /connector-hdmi
----- cycle: end -----
/bus@f0000/i2c@20010000/bridge-hdmi@3b: Fixed dependency cycle(s) with /connector-hdmi
device: 'platform:connector-hdmi--platform:20010000.i2c': device_add
platform 20010000.i2c: Linked as a sync state only consumer to connector-hdmi (flags 0x3c0)
----- cycle: start -----
/bus@f0000/i2c@20010000/bridge-hdmi@3b: cycle: depends on /connector-hdmi
----- cycle: start -----
/bus@f0000/i2c@20010000: cycle: depends on /connector-hdmi
/bus@f0000/i2c@20010000/gpio@22: cycle: child of /bus@f0000/i2c@20010000
/bus@f0000/i2c@20010000/bridge-hdmi@3b: cycle: depends on /bus@f0000/i2c@20010000/gpio@22
----- cycle: start -----
/bus@f0000/i2c@20010000: cycle: depends on /connector-hdmi
/bus@f0000/i2c@20010000/bridge-hdmi@3b: cycle: child of /bus@f0000/i2c@20010000
/connector-hdmi: cycle: depends on /bus@f0000/i2c@20010000/bridge-hdmi@3b
----- cycle: end -----
/connector-hdmi: Fixed dependency cycle(s) with /bus@f0000/i2c@20010000/bridge-hdmi@3b
device: 'regulator-0': device_add
device: 'regulator-1': device_add
/regulator-1 Linked as a fwnode consumer to /regulator-0
device: 'platform:regulator-0--platform:regulator-1': device_add
devices_kset: Moving regulator-1 to end of list
platform regulator-1: Linked as a consumer to regulator-0
/regulator-1 Dropping the fwnode link to /regulator-0
device: 'regulator-2': device_add
/regulator-2 Linked as a fwnode consumer to /regulator-0
device: 'platform:regulator-2--platform:20010000.i2c': device_add
platform 20010000.i2c: Linked as a sync state only consumer to regulator-2 (flags 0x1c0)
device: 'platform:regulator-0--platform:regulator-2': device_add
devices_kset: Moving regulator-2 to end of list
platform regulator-2: Linked as a consumer to regulator-0
/regulator-2 Dropping the fwnode link to /regulator-0
device: 'regulator-3': device_add
/regulator-3 Linked as a fwnode consumer to /regulator-2
/regulator-3 Linked as a fwnode consumer to /bus@f0000/i2c@20010000/gpio@22
device: 'platform:regulator-3--platform:fa00000.mmc': device_add
devices_kset: Moving fa00000.mmc to end of list
platform fa00000.mmc: Linked as a consumer to regulator-3
/bus@f0000/mmc@fa00000 Dropping the fwnode link to /regulator-3
device: 'platform:regulator-2--platform:regulator-3': device_add
devices_kset: Moving regulator-3 to end of list
devices_kset: Moving fa00000.mmc to end of list
platform regulator-3: Linked as a consumer to regulator-2
/regulator-3 Dropping the fwnode link to /regulator-2
device: 'regulator-4': device_add
/regulator-4 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000/vdd-sd-dv-default-pins
/regulator-4 Linked as a fwnode consumer to /regulator-1
/regulator-4 Linked as a fwnode consumer to /bus@f0000/gpio@600000
device: 'platform:regulator-4--platform:fa00000.mmc': device_add
devices_kset: Moving fa00000.mmc to end of list
platform fa00000.mmc: Linked as a consumer to regulator-4
/bus@f0000/mmc@fa00000 Dropping the fwnode link to /regulator-4
device: 'platform:600000.gpio--platform:regulator-4': device_add
devices_kset: Moving regulator-4 to end of list
devices_kset: Moving fa00000.mmc to end of list
platform regulator-4: Linked as a consumer to 600000.gpio
/regulator-4 Dropping the fwnode link to /bus@f0000/gpio@600000
device: 'platform:regulator-1--platform:regulator-4': device_add
devices_kset: Moving regulator-4 to end of list
devices_kset: Moving fa00000.mmc to end of list
platform regulator-4: Linked as a consumer to regulator-1
/regulator-4 Dropping the fwnode link to /regulator-1
device: 'regulator-5': device_add
/regulator-5 Linked as a fwnode consumer to /regulator-2
device: 'platform:regulator-5--platform:20010000.i2c': device_add
platform 20010000.i2c: Linked as a sync state only consumer to regulator-5 (flags 0x1c0)
device: 'platform:regulator-2--platform:regulator-5': device_add
devices_kset: Moving regulator-5 to end of list
platform regulator-5: Linked as a consumer to regulator-2
/regulator-5 Dropping the fwnode link to /regulator-2
device: 'writeback': device_add
HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
HugeTLB: registered 32.0 MiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 32.0 MiB page
HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 2.00 MiB page
HugeTLB: registered 64.0 KiB page size, pre-allocated 0 pages
HugeTLB: 0 KiB vmemmap can be freed for a 64.0 KiB page
device: 'memory_tiering': device_add
ACPI: Interpreter disabled.
device: 'soc0': device_add
k3-chipinfo 43000014.chipid: Family:AM62X rev:SR1.0 JTAGID[0x0bb7e02f] Detected
platform regulator-1: error -EPROBE_DEFER: supplier regulator-0 not ready
platform regulator-2: error -EPROBE_DEFER: supplier regulator-0 not ready
platform regulator-3: error -EPROBE_DEFER: wait for supplier /bus@f0000/i2c@20010000/gpio@22
device: 'regulator.1': device_add
platform regulator-5: error -EPROBE_DEFER: supplier regulator-2 not ready
platform regulator-4: error -EPROBE_DEFER: wait for supplier /bus@f0000/pinctrl@f4000/vdd-sd-dv-default-pins
iommu: Default domain type: Translated
iommu: DMA domain TLB invalidation policy: strict mode
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
platform 20000000.i2c: error -EPROBE_DEFER: wait for supplier /bus@f0000/pinctrl@f4000/main-i2c0-default-pins
platform 20010000.i2c: error -EPROBE_DEFER: wait for supplier /bus@f0000/pinctrl@f4000/main-i2c1-default-pins
platform 20020000.i2c: error -EPROBE_DEFER: wait for supplier /bus@f0000/pinctrl@f4000/main-i2c2-default-pins
pps_core: LinuxPPS API ver. 1 registered
pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
PTP clock support registered
EDAC MC: Ver: 3.0.0
device: 'edac': device_add
device: 'mc': device_add
scmi_core: SCMI protocol bus registered
FPGA manager framework
Advanced Linux Sound Architecture Driver Initialized.
device: 'lo': device_add
clocksource: Switched to clocksource arch_sys_counter
VFS: Disk quotas dquot_6.6.0
VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
pnp: PnP ACPI: disabled
device: 'mem': device_add
device: 'null': device_add
device: 'port': device_add
device: 'zero': device_add
device: 'full': device_add
device: 'random': device_add
device: 'urandom': device_add
device: 'kmsg': device_add
device: 'tty': device_add
device: 'console': device_add
device: 'tty0': device_add
device: 'vcs': device_add
device: 'vcsu': device_add
device: 'vcsa': device_add
device: 'vcs1': device_add
device: 'vcsu1': device_add
device: 'vcsa1': device_add
device: 'tty1': device_add
device: 'tty2': device_add
device: 'tty3': device_add
device: 'tty4': device_add
device: 'tty5': device_add
device: 'tty6': device_add
device: 'tty7': device_add
device: 'tty8': device_add
device: 'tty9': device_add
device: 'tty10': device_add
device: 'tty11': device_add
device: 'tty12': device_add
device: 'tty13': device_add
device: 'tty14': device_add
device: 'tty15': device_add
device: 'tty16': device_add
device: 'tty17': device_add
device: 'tty18': device_add
device: 'tty19': device_add
device: 'tty20': device_add
device: 'tty21': device_add
device: 'tty22': device_add
device: 'tty23': device_add
device: 'tty24': device_add
device: 'tty25': device_add
device: 'tty26': device_add
device: 'tty27': device_add
device: 'tty28': device_add
device: 'tty29': device_add
device: 'tty30': device_add
device: 'tty31': device_add
device: 'tty32': device_add
device: 'tty33': device_add
device: 'tty34': device_add
device: 'tty35': device_add
device: 'tty36': device_add
device: 'tty37': device_add
device: 'tty38': device_add
device: 'tty39': device_add
device: 'tty40': device_add
device: 'tty41': device_add
device: 'tty42': device_add
device: 'tty43': device_add
device: 'tty44': device_add
device: 'tty45': device_add
device: 'tty46': device_add
device: 'tty47': device_add
device: 'tty48': device_add
device: 'tty49': device_add
device: 'tty50': device_add
device: 'tty51': device_add
device: 'tty52': device_add
device: 'tty53': device_add
device: 'tty54': device_add
device: 'tty55': device_add
device: 'tty56': device_add
device: 'tty57': device_add
device: 'tty58': device_add
device: 'tty59': device_add
device: 'tty60': device_add
device: 'tty61': device_add
device: 'tty62': device_add
device: 'tty63': device_add
device: 'hw_random': device_add
NET: Registered PF_INET protocol family
IP idents hash table entries: 32768 (order: 6, 262144 bytes, linear)
tcp_listen_portaddr_hash hash table entries: 1024 (order: 4, 73728 bytes, linear)
Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
TCP established hash table entries: 16384 (order: 5, 131072 bytes, linear)
TCP bind hash table entries: 16384 (order: 9, 2359296 bytes, linear)
TCP: Hash tables configured (established 16384 bind 16384)
UDP hash table entries: 1024 (order: 5, 163840 bytes, linear)
UDP-Lite hash table entries: 1024 (order: 5, 163840 bytes, linear)
NET: Registered PF_UNIX/PF_LOCAL protocol family
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp-with-tls transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
device: 'snapshot': device_add
device: 'clocksource': device_add
device: 'clocksource0': device_add
device: 'clockevents': device_add
device: 'clockevent0': device_add
device: 'clockevent1': device_add
device: 'clockevent2': device_add
device: 'clockevent3': device_add
device: 'broadcast': device_add
device: 'breakpoint': device_add
device: 'uprobe': device_add
device: 'tracepoint': device_add
device: 'software': device_add
Initialise system trusted keyrings
workingset: timestamp_bits=42 max_order=19 bucket_order=0
squashfs: version 4.0 (2009/01/31) Phillip Lougher
NFS: Registering the id_resolver key type
Key type id_resolver registered
Key type id_legacy registered
nfs4filelayout_init: NFSv4 File Layout Driver Registering...
nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...
device: 'autofs': device_add
Key type asymmetric registered
Asymmetric key parser 'x509' registered
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 245)
io scheduler mq-deadline registered
io scheduler kyber registered
io scheduler bfq registered
ti-sci-intr bus@f0000:interrupt-controller@a00000: error -EPROBE_DEFER: ti,sci read fail
ti-sci-inta 48000000.interrupt-controller: error -EPROBE_DEFER: ti,sci read fail
/bus@f0000/ethernet@8000000/cpts@3d000 Linked as a fwnode consumer to /bus@f0000
/bus@f0000/ethernet@8000000/cpts@3d000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
/bus@f0000/dwc3-usb@f910000/usb@31100000 Linked as a fwnode consumer to /bus@f0000
/bus@f0000/dwc3-usb@f910000/usb@31100000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
/bus@f0000/dwc3-usb@f900000/usb@31000000 Linked as a fwnode consumer to /bus@f0000
/bus@f0000/dwc3-usb@f900000/usb@31000000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
/bus@f0000/interrupt-controller@1800000 Linked as a fwnode consumer to /bus@f0000
/bus@f0000/interrupt-controller@1800000 Dropping the fwnode link to /bus@f0000/interrupt-controller@1800000
device: 'platform:bus@f0000--platform:f900000.dwc3-usb': device_add
platform f900000.dwc3-usb: Linked as a sync state only consumer to bus@f0000 (flags 0x1c0)
device: 'platform:bus@f0000--platform:f910000.dwc3-usb': device_add
platform f910000.dwc3-usb: Linked as a sync state only consumer to bus@f0000 (flags 0x1c0)
device: 'platform:bus@f0000--platform:8000000.ethernet': device_add
platform 8000000.ethernet: Linked as a sync state only consumer to bus@f0000 (flags 0x1c0)
platform 2b300050.target-module: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/clock-controller
device: 'phy-104044.phy.0': device_add
device: 'phy-104044.phy.1': device_add
pinctrl-single 4084000.pinctrl: 34 pins, size 136
pinctrl-single f4000.pinctrl: 171 pins, size 684
/bus@f0000/serial@2800000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000
/bus@f0000/serial@2800000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000/main-uart0-default-pins
/bus@f0000/i2c@20000000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000
/bus@f0000/i2c@20000000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000/main-i2c0-default-pins
/bus@f0000/i2c@20010000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000
/bus@f0000/i2c@20010000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000/main-i2c1-default-pins
/bus@f0000/i2c@20020000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000
/bus@f0000/i2c@20020000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000/main-i2c2-default-pins
/bus@f0000/mmc@fa10000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000
/bus@f0000/mmc@fa10000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000/main-mmc0-default-pins
/bus@f0000/mmc@fa00000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000
/bus@f0000/mmc@fa00000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000/main-mmc1-default-pins
/leds Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000
/leds Dropping the fwnode link to /bus@f0000/pinctrl@f4000/usr-led-default-pins
/bus@f0000/ethernet@8000000/mdio@f00 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000
/bus@f0000/ethernet@8000000/mdio@f00 Dropping the fwnode link to /bus@f0000/pinctrl@f4000/main-mdio1-default-pins
/bus@f0000/ethernet@8000000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000
/bus@f0000/ethernet@8000000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000/main-rgmii1-default-pins
/bus@f0000/dwc3-usb@f910000/usb@31100000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000
/bus@f0000/dwc3-usb@f910000/usb@31100000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000/main-usb1-default-pins
/bus@f0000/audio-controller@2b10000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000
/bus@f0000/audio-controller@2b10000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000/main-mcasp1-default-pins
/bus@f0000/dss@30200000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000
/bus@f0000/dss@30200000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000/main-dss0-default-pins
/bus@f0000/ethernet@8000000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000/main-rgmii2-default-pins
/bus@f0000/bus@fc00000/spi@fc40000 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000
/bus@f0000/bus@fc00000/spi@fc40000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000/ospi0-default-pins
/regulator-4 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000
/regulator-4 Dropping the fwnode link to /bus@f0000/pinctrl@f4000/vdd-sd-dv-default-pins
/bus@f0000/i2c@20010000/gpio@22 Linked as a fwnode consumer to /bus@f0000/pinctrl@f4000
/bus@f0000/i2c@20010000/gpio@22 Dropping the fwnode link to /bus@f0000/pinctrl@f4000/main-gpio1-ioexp-intr-default-pins
device: 'platform:f4000.pinctrl--platform:20010000.i2c': device_add
platform 20010000.i2c: Linked as a sync state only consumer to f4000.pinctrl (flags 0x1c0)
device: 'platform:f4000.pinctrl--platform:regulator-4': device_add
devices_kset: Moving regulator-4 to end of list
devices_kset: Moving fa00000.mmc to end of list
platform regulator-4: Linked as a consumer to f4000.pinctrl
/regulator-4 Dropping the fwnode link to /bus@f0000/pinctrl@f4000
device: 'platform:f4000.pinctrl--platform:fc40000.spi': device_add
devices_kset: Moving fc40000.spi to end of list
platform fc40000.spi: Linked as a consumer to f4000.pinctrl
/bus@f0000/bus@fc00000/spi@fc40000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000
device: 'platform:f4000.pinctrl--platform:30200000.dss': device_add
devices_kset: Moving 30200000.dss to end of list
platform 30200000.dss: Linked as a consumer to f4000.pinctrl
/bus@f0000/dss@30200000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000
device: 'platform:f4000.pinctrl--platform:2b10000.audio-controller': device_add
devices_kset: Moving 2b10000.audio-controller to end of list
platform 2b10000.audio-controller: Linked as a consumer to f4000.pinctrl
/bus@f0000/audio-controller@2b10000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000
device: 'platform:f4000.pinctrl--platform:f910000.dwc3-usb': device_add
platform f910000.dwc3-usb: Linked as a sync state only consumer to f4000.pinctrl (flags 0x1c0)
device: 'platform:f4000.pinctrl--platform:8000000.ethernet': device_add
devices_kset: Moving 8000000.ethernet to end of list
platform 8000000.ethernet: Linked as a consumer to f4000.pinctrl
/bus@f0000/ethernet@8000000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000
device: 'platform:f4000.pinctrl--platform:leds': device_add
devices_kset: Moving leds to end of list
platform leds: Linked as a consumer to f4000.pinctrl
/leds Dropping the fwnode link to /bus@f0000/pinctrl@f4000
device: 'platform:f4000.pinctrl--platform:fa00000.mmc': device_add
devices_kset: Moving fa00000.mmc to end of list
platform fa00000.mmc: Linked as a consumer to f4000.pinctrl
/bus@f0000/mmc@fa00000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000
device: 'platform:f4000.pinctrl--platform:fa10000.mmc': device_add
devices_kset: Moving fa10000.mmc to end of list
platform fa10000.mmc: Linked as a consumer to f4000.pinctrl
/bus@f0000/mmc@fa10000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000
device: 'platform:f4000.pinctrl--platform:20020000.i2c': device_add
devices_kset: Moving 20020000.i2c to end of list
platform 20020000.i2c: Linked as a consumer to f4000.pinctrl
/bus@f0000/i2c@20020000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000
devices_kset: Moving 20010000.i2c to end of list
platform 20010000.i2c: Linked as a consumer to f4000.pinctrl
/bus@f0000/i2c@20010000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000
device: 'platform:f4000.pinctrl--platform:20000000.i2c': device_add
devices_kset: Moving 20000000.i2c to end of list
platform 20000000.i2c: Linked as a consumer to f4000.pinctrl
/bus@f0000/i2c@20000000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000
device: 'platform:f4000.pinctrl--platform:2800000.serial': device_add
devices_kset: Moving 2800000.serial to end of list
platform 2800000.serial: Linked as a consumer to f4000.pinctrl
/bus@f0000/serial@2800000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000
leds-gpio leds: error -EPROBE_DEFER: Failed to get GPIO '/leds/led-0'
ledtrig-cpu: registered to indicate activity on CPUs
device: 'acpi-einj': device_add
platform 1082e0.clock-controller: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/clock-controller
platform 1082e4.clock-controller: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/clock-controller
platform 485c0100.dma-controller: error -EPROBE_DEFER: supplier 48000000.interrupt-controller not ready
platform 485c0000.dma-controller: error -EPROBE_DEFER: supplier 48000000.interrupt-controller not ready
device: 'ptyp0': device_add
device: 'ptyp1': device_add
device: 'ptyp2': device_add
device: 'ptyp3': device_add
device: 'ptyp4': device_add
device: 'ptyp5': device_add
device: 'ptyp6': device_add
device: 'ptyp7': device_add
device: 'ptyp8': device_add
device: 'ptyp9': device_add
device: 'ptypa': device_add
device: 'ptypb': device_add
device: 'ptypc': device_add
device: 'ptypd': device_add
device: 'ptype': device_add
device: 'ptypf': device_add
device: 'ttyp0': device_add
device: 'ttyp1': device_add
device: 'ttyp2': device_add
device: 'ttyp3': device_add
device: 'ttyp4': device_add
device: 'ttyp5': device_add
device: 'ttyp6': device_add
device: 'ttyp7': device_add
device: 'ttyp8': device_add
device: 'ttyp9': device_add
device: 'ttypa': device_add
device: 'ttypb': device_add
device: 'ttypc': device_add
device: 'ttypd': device_add
device: 'ttype': device_add
device: 'ttypf': device_add
device: 'ptmx': device_add
Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
device: 'serial8250': device_add
device: 'serial8250:0': device_add
device: 'serial8250:0.0': device_add
device: 'serial0': device_add
device: 'ttyS0': device_add
device: 'serial8250:0.1': device_add
device: 'serial0': device_add
device: 'ttyS1': device_add
device: 'serial8250:0.2': device_add
device: 'serial0': device_add
device: 'ttyS2': device_add
device: 'serial8250:0.3': device_add
device: 'serial0': device_add
device: 'ttyS3': device_add
STM32 USART driver initialized
/connector-hdmi Dropping the fwnode link to /bus@f0000/i2c@20010000/bridge-hdmi@3b
device: 'cache': device_add
device: 'index0': device_add
device: 'index1': device_add
device: 'index2': device_add
device: 'cache': device_add
device: 'index0': device_add
device: 'index1': device_add
device: 'index2': device_add
device: 'cache': device_add
device: 'index0': device_add
device: 'index1': device_add
device: 'index2': device_add
device: 'cache': device_add
device: 'index0': device_add
device: 'index1': device_add
device: 'index2': device_add
device: 'loop-control': device_add
device: 'loop0': device_add
device: '7:0': device_add
device: 'loop1': device_add
device: '7:1': device_add
device: 'loop2': device_add
device: '7:2': device_add
device: 'loop3': device_add
device: '7:3': device_add
device: 'loop4': device_add
device: '7:4': device_add
device: 'loop5': device_add
device: '7:5': device_add
device: 'loop6': device_add
device: '7:6': device_add
device: 'loop7': device_add
device: '7:7': device_add
loop: module loaded
device: 'system': device_add
device: 'reserved': device_add
device: 'mtd-0': device_add
platform fc40000.spi: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/power-controller
device: 'Fixed MDIO bus.0': device_add
device: 'fixed-0': device_add
tun: Universal TUN/TAP device driver, 1.6
device: 'tun': device_add
platform 8000000.ethernet: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/power-controller
device: 'vfio': device_add
VFIO - User Level meta-driver version: 0.3
platform f900000.dwc3-usb: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/power-controller
platform f910000.dwc3-usb: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/power-controller
platform 2b1f0000.rtc: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/power-controller
i2c_dev: i2c /dev entries driver
device: 'ti-cpufreq': device_add
device: 'cpufreq-dt': device_add
cpu cpu0: error -EPROBE_DEFER: Couldn't find clock
device: 'psci-cpuidle': device_add
platform 44043000.system-controller: error -EPROBE_DEFER: supplier 4d000000.mailbox not ready
SMCCC: SOC_ID: ARCH_SOC_ID not implemented, skipping ....
platform 2400000.timer: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/power-controller
platform 2410000.timer: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/power-controller
platform 2420000.timer: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/power-controller
platform 2430000.timer: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/power-controller
platform 2440000.timer: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/power-controller
platform 2450000.timer: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/power-controller
platform 2460000.timer: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/power-controller
platform 2470000.timer: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/power-controller
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
device: 'armv8_cortex_a53': device_add
hw perfevents: enabled with armv8_cortex_a53 PMU driver, 7 (0,8000003f) counters available
watchdog: NMI not fully supported
watchdog: Hard watchdog permanently disabled
optee: probing for conduit method.
optee: revision 4.0 (2a5b1d12)
device: 'tee0': device_add
device: 'teepriv0': device_add
optee: dynamic shared memory is enabled
device: 'optee-ta-ab7a617c-b8e7-4d8f-8301-d09b61036b64': device_add
random: crng init done
optee: initialized driver
device: 'timer': device_add
device: 'snd-soc-dummy': device_add
NET: Registered PF_PACKET protocol family
Key type dns_resolver registered
device: 'cpu_dma_latency': device_add
registered taskstats version 1
Loading compiled-in X.509 certificates
device: 'memory_tier4': device_add
Demotion targets for Node 0: null
kmemleak: Kernel memory leak detector initialized (mem pool available: 15791)
kmemleak: Automatic memory scanning thread started
devices_kset: Moving 600000.gpio to end of list
devices_kset: Moving regulator-4 to end of list
devices_kset: Moving fa00000.mmc to end of list
platform 600000.gpio: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/clock-controller
devices_kset: Moving 601000.gpio to end of list
platform 601000.gpio: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/clock-controller
devices_kset: Moving regulator-1 to end of list
devices_kset: Moving regulator-4 to end of list
devices_kset: Moving fa00000.mmc to end of list
devices_kset: Moving regulator-2 to end of list
devices_kset: Moving regulator-3 to end of list
devices_kset: Moving fa00000.mmc to end of list
devices_kset: Moving regulator-5 to end of list
devices_kset: Moving regulator-3 to end of list
devices_kset: Moving fa00000.mmc to end of list
devices_kset: Moving regulator-5 to end of list
device: 'regulator.2': device_add
devices_kset: Moving regulator-4 to end of list
devices_kset: Moving fa00000.mmc to end of list
devices_kset: Moving 20000000.i2c to end of list
platform 20000000.i2c: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/clock-controller
devices_kset: Moving 20010000.i2c to end of list
device: 'regulator.3': device_add
platform 20010000.i2c: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/clock-controller
devices_kset: Moving 20020000.i2c to end of list
platform 20020000.i2c: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/clock-controller
devices_kset: Moving bus@f0000:interrupt-controller@a00000 to end of list
devices_kset: Moving 600000.gpio to end of list
devices_kset: Moving regulator-4 to end of list
devices_kset: Moving fa00000.mmc to end of list
devices_kset: Moving 601000.gpio to end of list
platform regulator-3: error -EPROBE_DEFER: wait for supplier /bus@f0000/i2c@20010000/gpio@22
platform regulator-5: error -EPROBE_DEFER: supplier regulator-2 not ready
platform regulator-4: error -EPROBE_DEFER: supplier 600000.gpio not ready
ti-sci-intr bus@f0000:interrupt-controller@a00000: error -EPROBE_DEFER: ti,sci read fail
devices_kset: Moving 48000000.interrupt-controller to end of list
devices_kset: Moving 485c0100.dma-controller to end of list
devices_kset: Moving 485c0000.dma-controller to end of list
ti-sci-inta 48000000.interrupt-controller: error -EPROBE_DEFER: ti,sci read fail
devices_kset: Moving 2b300050.target-module to end of list
platform 2b300050.target-module: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/clock-controller
devices_kset: Moving leds to end of list
leds-gpio leds: error -EPROBE_DEFER: Failed to get GPIO '/leds/led-0'
devices_kset: Moving 1082e0.clock-controller to end of list
platform 1082e0.clock-controller: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/clock-controller
devices_kset: Moving 1082e4.clock-controller to end of list
platform 1082e4.clock-controller: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/clock-controller
devices_kset: Moving 485c0100.dma-controller to end of list
platform 485c0100.dma-controller: error -EPROBE_DEFER: supplier 48000000.interrupt-controller not ready
devices_kset: Moving 485c0000.dma-controller to end of list
platform 485c0000.dma-controller: error -EPROBE_DEFER: supplier 48000000.interrupt-controller not ready
devices_kset: Moving 2800000.serial to end of list
devices_kset: Moving fc40000.spi to end of list
platform fc40000.spi: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/power-controller
devices_kset: Moving 8000000.ethernet to end of list
platform 8000000.ethernet: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/power-controller
devices_kset: Moving f900000.dwc3-usb to end of list
platform f900000.dwc3-usb: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/power-controller
devices_kset: Moving f910000.dwc3-usb to end of list
platform f910000.dwc3-usb: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/power-controller
devices_kset: Moving 2b1f0000.rtc to end of list
platform 2b1f0000.rtc: error -EPROBE_DEFER: wait for supplier /bus@f0000/system-controller@44043000/power-controller
devices_kset: Moving cpufreq-dt to end of list
cpu cpu0: error -EPROBE_DEFER: Couldn't find clock
devices_kset: Moving 44043000.system-controller to end of list
ti-sci 44043000.system-controller: ABI: 3.1 (firmware rev 0x0009 '9.1.8--v09.01.08 (Kool Koala)')
device: '44043000.system-controller:power-controller': device_add
device: 'platform:44043000.system-controller:power-controller--platform:2b10000.audio-controller': device_add
devices_kset: Moving 2b10000.audio-controller to end of list
platform 2b10000.audio-controller: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/audio-controller@2b10000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:e0f0000.watchdog': device_add
devices_kset: Moving e0f0000.watchdog to end of list
platform e0f0000.watchdog: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/watchdog@e0f0000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:e030000.watchdog': device_add
devices_kset: Moving e030000.watchdog to end of list
platform e030000.watchdog: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/watchdog@e030000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:e020000.watchdog': device_add
devices_kset: Moving e020000.watchdog to end of list
platform e020000.watchdog: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/watchdog@e020000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:e010000.watchdog': device_add
devices_kset: Moving e010000.watchdog to end of list
platform e010000.watchdog: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/watchdog@e010000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:e000000.watchdog': device_add
devices_kset: Moving e000000.watchdog to end of list
platform e000000.watchdog: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/watchdog@e000000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:30200000.dss': device_add
devices_kset: Moving 30200000.dss to end of list
platform 30200000.dss: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/dss@30200000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:8000000.ethernet': device_add
devices_kset: Moving 8000000.ethernet to end of list
platform 8000000.ethernet: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/ethernet@8000000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:fd00000.gpu': device_add
devices_kset: Moving fd00000.gpu to end of list
platform fd00000.gpu: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/gpu@fd00000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:fc40000.spi': device_add
devices_kset: Moving fc40000.spi to end of list
platform fc40000.spi: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/bus@fc00000/spi@fc40000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:f910000.dwc3-usb': device_add
devices_kset: Moving f910000.dwc3-usb to end of list
platform f910000.dwc3-usb: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/dwc3-usb@f910000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:f900000.dwc3-usb': device_add
devices_kset: Moving f900000.dwc3-usb to end of list
platform f900000.dwc3-usb: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/dwc3-usb@f900000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:fa00000.mmc': device_add
devices_kset: Moving fa00000.mmc to end of list
platform fa00000.mmc: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/mmc@fa00000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:fa10000.mmc': device_add
devices_kset: Moving fa10000.mmc to end of list
platform fa10000.mmc: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/mmc@fa10000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:601000.gpio': device_add
devices_kset: Moving 601000.gpio to end of list
platform 601000.gpio: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/gpio@601000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:600000.gpio': device_add
devices_kset: Moving 600000.gpio to end of list
devices_kset: Moving regulator-4 to end of list
devices_kset: Moving fa00000.mmc to end of list
platform 600000.gpio: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/gpio@600000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:20020000.i2c': device_add
devices_kset: Moving 20020000.i2c to end of list
platform 20020000.i2c: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/i2c@20020000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:20010000.i2c': device_add
devices_kset: Moving 20010000.i2c to end of list
platform 20010000.i2c: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/i2c@20010000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:20000000.i2c': device_add
devices_kset: Moving 20000000.i2c to end of list
platform 20000000.i2c: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/i2c@20000000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:2800000.serial': device_add
devices_kset: Moving 2800000.serial to end of list
platform 2800000.serial: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/serial@2800000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:2470000.timer': device_add
devices_kset: Moving 2470000.timer to end of list
platform 2470000.timer: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/timer@2470000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:2460000.timer': device_add
devices_kset: Moving 2460000.timer to end of list
platform 2460000.timer: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/timer@2460000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:2450000.timer': device_add
devices_kset: Moving 2450000.timer to end of list
platform 2450000.timer: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/timer@2450000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:2440000.timer': device_add
devices_kset: Moving 2440000.timer to end of list
platform 2440000.timer: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/timer@2440000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:2430000.timer': device_add
devices_kset: Moving 2430000.timer to end of list
platform 2430000.timer: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/timer@2430000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:2420000.timer': device_add
devices_kset: Moving 2420000.timer to end of list
platform 2420000.timer: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/timer@2420000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:2410000.timer': device_add
devices_kset: Moving 2410000.timer to end of list
platform 2410000.timer: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/timer@2410000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:2400000.timer': device_add
devices_kset: Moving 2400000.timer to end of list
platform 2400000.timer: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/timer@2400000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:b00000.temperature-sensor': device_add
devices_kset: Moving b00000.temperature-sensor to end of list
platform b00000.temperature-sensor: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/bus@b00000/temperature-sensor@b00000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:2b1f0000.rtc': device_add
devices_kset: Moving 2b1f0000.rtc to end of list
platform 2b1f0000.rtc: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/bus@b00000/rtc@2b1f0000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: 'platform:44043000.system-controller:power-controller--platform:2b300050.target-module': device_add
devices_kset: Moving 2b300050.target-module to end of list
platform 2b300050.target-module: Linked as a consumer to 44043000.system-controller:power-controller
/bus@f0000/bus@b00000/target-module@2b300050 Dropping the fwnode link to /bus@f0000/system-controller@44043000/power-controller
device: '44043000.system-controller:clock-controller': device_add
device: 'platform:44043000.system-controller:clock-controller--platform:2b10000.audio-controller': device_add
devices_kset: Moving 2b10000.audio-controller to end of list
platform 2b10000.audio-controller: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/audio-controller@2b10000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:e0f0000.watchdog': device_add
devices_kset: Moving e0f0000.watchdog to end of list
platform e0f0000.watchdog: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/watchdog@e0f0000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:e030000.watchdog': device_add
devices_kset: Moving e030000.watchdog to end of list
platform e030000.watchdog: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/watchdog@e030000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:e020000.watchdog': device_add
devices_kset: Moving e020000.watchdog to end of list
platform e020000.watchdog: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/watchdog@e020000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:e010000.watchdog': device_add
devices_kset: Moving e010000.watchdog to end of list
platform e010000.watchdog: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/watchdog@e010000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:e000000.watchdog': device_add
devices_kset: Moving e000000.watchdog to end of list
platform e000000.watchdog: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/watchdog@e000000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:30200000.dss': device_add
devices_kset: Moving 30200000.dss to end of list
platform 30200000.dss: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/dss@30200000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:8000000.ethernet': device_add
platform 8000000.ethernet: Linked as a sync state only consumer to 44043000.system-controller:clock-controller (flags 0x1c0)
devices_kset: Moving 8000000.ethernet to end of list
platform 8000000.ethernet: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/ethernet@8000000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:fd00000.gpu': device_add
devices_kset: Moving fd00000.gpu to end of list
platform fd00000.gpu: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/gpu@fd00000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:fc40000.spi': device_add
devices_kset: Moving fc40000.spi to end of list
platform fc40000.spi: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/bus@fc00000/spi@fc40000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:f910000.dwc3-usb': device_add
devices_kset: Moving f910000.dwc3-usb to end of list
platform f910000.dwc3-usb: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/dwc3-usb@f910000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:f900000.dwc3-usb': device_add
devices_kset: Moving f900000.dwc3-usb to end of list
platform f900000.dwc3-usb: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/dwc3-usb@f900000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:fa00000.mmc': device_add
devices_kset: Moving fa00000.mmc to end of list
platform fa00000.mmc: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/mmc@fa00000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:fa10000.mmc': device_add
devices_kset: Moving fa10000.mmc to end of list
platform fa10000.mmc: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/mmc@fa10000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:601000.gpio': device_add
devices_kset: Moving 601000.gpio to end of list
platform 601000.gpio: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/gpio@601000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:600000.gpio': device_add
devices_kset: Moving 600000.gpio to end of list
devices_kset: Moving regulator-4 to end of list
devices_kset: Moving fa00000.mmc to end of list
platform 600000.gpio: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/gpio@600000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:20020000.i2c': device_add
devices_kset: Moving 20020000.i2c to end of list
platform 20020000.i2c: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/i2c@20020000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:20010000.i2c': device_add
devices_kset: Moving 20010000.i2c to end of list
platform 20010000.i2c: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/i2c@20010000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:20000000.i2c': device_add
devices_kset: Moving 20000000.i2c to end of list
platform 20000000.i2c: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/i2c@20000000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:2800000.serial': device_add
devices_kset: Moving 2800000.serial to end of list
platform 2800000.serial: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/serial@2800000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:2470000.timer': device_add
devices_kset: Moving 2470000.timer to end of list
platform 2470000.timer: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/timer@2470000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:2460000.timer': device_add
devices_kset: Moving 2460000.timer to end of list
platform 2460000.timer: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/timer@2460000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:2450000.timer': device_add
devices_kset: Moving 2450000.timer to end of list
platform 2450000.timer: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/timer@2450000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:2440000.timer': device_add
devices_kset: Moving 2440000.timer to end of list
platform 2440000.timer: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/timer@2440000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:2430000.timer': device_add
devices_kset: Moving 2430000.timer to end of list
platform 2430000.timer: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/timer@2430000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:2420000.timer': device_add
devices_kset: Moving 2420000.timer to end of list
platform 2420000.timer: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/timer@2420000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:2410000.timer': device_add
devices_kset: Moving 2410000.timer to end of list
platform 2410000.timer: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/timer@2410000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:2400000.timer': device_add
devices_kset: Moving 2400000.timer to end of list
platform 2400000.timer: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/timer@2400000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:1082e4.clock-controller': device_add
devices_kset: Moving 1082e4.clock-controller to end of list
platform 1082e4.clock-controller: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/bus@100000/clock-controller@82e4 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:1082e0.clock-controller': device_add
devices_kset: Moving 1082e0.clock-controller to end of list
platform 1082e0.clock-controller: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/bus@100000/clock-controller@82e0 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:2b1f0000.rtc': device_add
devices_kset: Moving 2b1f0000.rtc to end of list
platform 2b1f0000.rtc: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/bus@b00000/rtc@2b1f0000 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: 'platform:44043000.system-controller:clock-controller--platform:2b300050.target-module': device_add
devices_kset: Moving 2b300050.target-module to end of list
platform 2b300050.target-module: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/bus@b00000/target-module@2b300050 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
device: '44043000.system-controller:reset-controller': device_add
devices_kset: Moving 2400000.timer to end of list
devices_kset: Moving 2410000.timer to end of list
devices_kset: Moving 2420000.timer to end of list
devices_kset: Moving 2430000.timer to end of list
devices_kset: Moving 2440000.timer to end of list
devices_kset: Moving 2450000.timer to end of list
devices_kset: Moving 2460000.timer to end of list
devices_kset: Moving 2470000.timer to end of list
devices_kset: Moving 600000.gpio to end of list
devices_kset: Moving regulator-4 to end of list
devices_kset: Moving fa00000.mmc to end of list
platform 600000.gpio: error -EPROBE_DEFER: supplier bus@f0000:interrupt-controller@a00000 not ready
devices_kset: Moving 601000.gpio to end of list
platform 601000.gpio: error -EPROBE_DEFER: supplier bus@f0000:interrupt-controller@a00000 not ready
devices_kset: Moving regulator-4 to end of list
devices_kset: Moving fa00000.mmc to end of list
devices_kset: Moving 20000000.i2c to end of list
platform regulator-4: error -EPROBE_DEFER: supplier 600000.gpio not ready
device: 'i2c-0': device_add
device: 'i2c-0': device_add
device: '0-0051': device_add
device: '0-003f': device_add
----- cycle: start -----
/bus@f0000/dwc3-usb@f900000/usb@31000000: cycle: depends on /bus@f0000/i2c@20000000/tps6598x@3f/connector
/bus@f0000/i2c@20000000/tps6598x@3f/connector: cycle: depends on /bus@f0000/dwc3-usb@f900000/usb@31000000
----- cycle: end -----
/bus@f0000/i2c@20000000/tps6598x@3f/connector: Fixed dependency cycle(s) with /bus@f0000/dwc3-usb@f900000/usb@31000000
omap_i2c 20000000.i2c: bus 0 rev0.12 at 400 kHz
devices_kset: Moving 20010000.i2c to end of list
device: 'i2c-1': device_add
device: 'i2c-1': device_add
device: '1-001b': device_add
device: 'platform:regulator-5--i2c:1-001b': device_add
devices_kset: Moving 1-001b to end of list
i2c 1-001b: Linked as a consumer to regulator-5
/bus@f0000/i2c@20010000/audio-codec@1b Dropping the fwnode link to /regulator-5
device: 'platform:regulator-2--i2c:1-001b': device_add
devices_kset: Moving 1-001b to end of list
i2c 1-001b: Linked as a consumer to regulator-2
/bus@f0000/i2c@20010000/audio-codec@1b Dropping the fwnode link to /regulator-2
device: '1-003b': device_add
----- cycle: start -----
/bus@f0000/i2c@20010000/bridge-hdmi@3b: cycle: depends on /bus@f0000/dss@30200000
----- cycle: start -----
/bus@f0000/i2c@20010000: cycle: depends on /bus@f0000/dss@30200000
/bus@f0000/i2c@20010000/gpio@22: cycle: child of /bus@f0000/i2c@20010000
/bus@f0000/i2c@20010000/bridge-hdmi@3b: cycle: depends on /bus@f0000/i2c@20010000/gpio@22
/bus@f0000/dss@30200000: cycle: depends on /bus@f0000/i2c@20010000/bridge-hdmi@3b
----- cycle: end -----
/bus@f0000/dss@30200000: Fixed dependency cycle(s) with /bus@f0000/i2c@20010000/bridge-hdmi@3b
device: 'i2c:1-003b--platform:30200000.dss': device_add
platform 30200000.dss: Linked as a sync state only consumer to 1-003b (flags 0x3c0)
/bus@f0000/dss@30200000 Dropping the fwnode link to /bus@f0000/i2c@20010000/bridge-hdmi@3b
device: 'platform:connector-hdmi--i2c:1-003b': device_add
i2c 1-003b: Linked as a sync state only consumer to connector-hdmi (flags 0x3c0)
/bus@f0000/i2c@20010000/bridge-hdmi@3b Dropping the fwnode link to /connector-hdmi
----- cycle: start -----
/bus@f0000/dss@30200000: cycle: depends on /bus@f0000/i2c@20010000/bridge-hdmi@3b
/bus@f0000/i2c@20010000/bridge-hdmi@3b: cycle: depends on /bus@f0000/dss@30200000
----- cycle: end -----
/bus@f0000/i2c@20010000/bridge-hdmi@3b: Fixed dependency cycle(s) with /bus@f0000/dss@30200000
device: 'platform:30200000.dss--i2c:1-003b': device_add
i2c 1-003b: Linked as a sync state only consumer to 30200000.dss (flags 0x3c0)
/bus@f0000/i2c@20010000/bridge-hdmi@3b Dropping the fwnode link to /bus@f0000/dss@30200000
----- cycle: start -----
/bus@f0000/dss@30200000: cycle: depends on /bus@f0000/i2c@20010000/bridge-hdmi@3b
/bus@f0000/i2c@20010000: cycle: depends on /bus@f0000/dss@30200000
/bus@f0000/i2c@20010000/gpio@22: cycle: child of /bus@f0000/i2c@20010000
/bus@f0000/i2c@20010000/bridge-hdmi@3b: cycle: depends on /bus@f0000/i2c@20010000/gpio@22
----- cycle: end -----
/bus@f0000/i2c@20010000/bridge-hdmi@3b: Fixed dependency cycle(s) with /bus@f0000/i2c@20010000/gpio@22
device: '1-0022': device_add
device: 'i2c:1-0022--platform:regulator-3': device_add
devices_kset: Moving regulator-3 to end of list
devices_kset: Moving fa00000.mmc to end of list
platform regulator-3: Linked as a consumer to 1-0022
/regulator-3 Dropping the fwnode link to /bus@f0000/i2c@20010000/gpio@22
device: 'i2c:1-0022--i2c:1-003b': device_add
i2c 1-003b: Linked as a sync state only consumer to 1-0022 (flags 0x3c0)
/bus@f0000/i2c@20010000/bridge-hdmi@3b Dropping the fwnode link to /bus@f0000/i2c@20010000/gpio@22
device: 'platform:f4000.pinctrl--i2c:1-0022': device_add
devices_kset: Moving 1-0022 to end of list
devices_kset: Moving regulator-3 to end of list
devices_kset: Moving fa00000.mmc to end of list
i2c 1-0022: Linked as a consumer to f4000.pinctrl
/bus@f0000/i2c@20010000/gpio@22 Dropping the fwnode link to /bus@f0000/pinctrl@f4000
device: 'platform:601000.gpio--i2c:1-0022': device_add
devices_kset: Moving 1-0022 to end of list
devices_kset: Moving regulator-3 to end of list
devices_kset: Moving fa00000.mmc to end of list
i2c 1-0022: Linked as a consumer to 601000.gpio
/bus@f0000/i2c@20010000/gpio@22 Dropping the fwnode link to /bus@f0000/gpio@601000
i2c 1-0022: error -EPROBE_DEFER: supplier 601000.gpio not ready
omap_i2c 20010000.i2c: bus 1 rev0.12 at 100 kHz
omap_i2c 20010000.i2c: Dropping the link to 601000.gpio
device: 'platform:601000.gpio--platform:20010000.i2c': device_unregister
omap_i2c 20010000.i2c: Dropping the link to 30200000.dss
device: 'platform:30200000.dss--platform:20010000.i2c': device_unregister
omap_i2c 20010000.i2c: Dropping the link to connector-hdmi
device: 'platform:connector-hdmi--platform:20010000.i2c': device_unregister
omap_i2c 20010000.i2c: Dropping the link to regulator-2
device: 'platform:regulator-2--platform:20010000.i2c': device_unregister
omap_i2c 20010000.i2c: Dropping the link to regulator-5
device: 'platform:regulator-5--platform:20010000.i2c': device_unregister
devices_kset: Moving 20020000.i2c to end of list
device: 'i2c-2': device_add
device: 'i2c-2': device_add
omap_i2c 20020000.i2c: bus 2 rev0.12 at 400 kHz
devices_kset: Moving regulator-3 to end of list
devices_kset: Moving fa00000.mmc to end of list
devices_kset: Moving regulator-5 to end of list
devices_kset: Moving 1-001b to end of list
platform regulator-3: error -EPROBE_DEFER: supplier 1-0022 not ready
devices_kset: Moving bus@f0000:interrupt-controller@a00000 to end of list
devices_kset: Moving 600000.gpio to end of list
devices_kset: Moving regulator-4 to end of list
devices_kset: Moving fa00000.mmc to end of list
devices_kset: Moving 601000.gpio to end of list
devices_kset: Moving 1-0022 to end of list
devices_kset: Moving regulator-3 to end of list
devices_kset: Moving fa00000.mmc to end of list
ti-sci-intr bus@f0000:interrupt-controller@a00000: Interrupt Router 3 domain created
devices_kset: Moving 48000000.interrupt-controller to end of list
devices_kset: Moving 485c0100.dma-controller to end of list
devices_kset: Moving 485c0000.dma-controller to end of list
device: 'regulator.4': device_add
ti-sci-inta 48000000.interrupt-controller: Interrupt Aggregator domain 28 created
devices_kset: Moving 2b300050.target-module to end of list
devices_kset: Moving leds to end of list
leds-gpio leds: error -EPROBE_DEFER: Failed to get GPIO '/leds/led-0'
devices_kset: Moving 1082e0.clock-controller to end of list
devices_kset: Moving 1082e4.clock-controller to end of list
devices_kset: Moving 485c0100.dma-controller to end of list
ti-udma 485c0100.dma-controller: Number of rings: 82
ti-udma 485c0100.dma-controller: Channels: 48 (bchan: 18, tchan: 12, rchan: 18)
device: 'dma0chan0': device_add
device: 'dma0chan1': device_add
device: 'dma0chan2': device_add
device: 'dma0chan3': device_add
device: 'dma0chan4': device_add
device: 'dma0chan5': device_add
device: 'dma0chan6': device_add
device: 'dma0chan7': device_add
device: 'dma0chan8': device_add
device: 'dma0chan9': device_add
device: 'dma0chan10': device_add
device: 'dma0chan11': device_add
device: 'dma0chan12': device_add
device: 'dma0chan13': device_add
device: 'dma0chan14': device_add
device: 'dma0chan15': device_add
device: 'dma0chan16': device_add
device: 'dma0chan17': device_add
device: 'dma0chan18': device_add
device: 'dma0chan19': device_add
device: 'dma0chan20': device_add
device: 'dma0chan21': device_add
device: 'dma0chan22': device_add
device: 'dma0chan23': device_add
device: 'dma0chan24': device_add
device: 'dma0chan25': device_add
device: 'dma0chan26': device_add
device: 'dma0chan27': device_add
device: 'dma0chan28': device_add
device: 'dma0chan29': device_add
device: 'dma0chan30': device_add
device: 'dma0chan31': device_add
device: 'dma0chan32': device_add
device: 'dma0chan33': device_add
device: 'dma0chan34': device_add
device: 'dma0chan35': device_add
device: 'dma0chan36': device_add
device: 'dma0chan37': device_add
device: 'dma0chan38': device_add
device: 'dma0chan39': device_add
device: 'dma0chan40': device_add
device: 'dma0chan41': device_add
device: 'dma0chan42': device_add
device: 'dma0chan43': device_add
device: 'dma0chan44': device_add
device: 'dma0chan45': device_add
device: 'dma0chan46': device_add
device: 'dma0chan47': device_add
devices_kset: Moving 485c0000.dma-controller to end of list
ti-udma 485c0000.dma-controller: Number of rings: 150
ti-udma 485c0000.dma-controller: Channels: 35 (tchan: 20, rchan: 15)
device: 'dma1chan0': device_add
device: 'dma1chan1': device_add
device: 'dma1chan2': device_add
device: 'dma1chan3': device_add
device: 'dma1chan4': device_add
device: 'dma1chan5': device_add
device: 'dma1chan6': device_add
device: 'dma1chan7': device_add
device: 'dma1chan8': device_add
device: 'dma1chan9': device_add
device: 'dma1chan10': device_add
device: 'dma1chan11': device_add
device: 'dma1chan12': device_add
device: 'dma1chan13': device_add
device: 'dma1chan14': device_add
device: 'dma1chan15': device_add
device: 'dma1chan16': device_add
device: 'dma1chan17': device_add
device: 'dma1chan18': device_add
device: 'dma1chan19': device_add
device: 'dma1chan20': device_add
device: 'dma1chan21': device_add
device: 'dma1chan22': device_add
device: 'dma1chan23': device_add
device: 'dma1chan24': device_add
device: 'dma1chan25': device_add
device: 'dma1chan26': device_add
device: 'dma1chan27': device_add
device: 'dma1chan28': device_add
device: 'dma1chan29': device_add
device: 'dma1chan30': device_add
device: 'dma1chan31': device_add
device: 'dma1chan32': device_add
device: 'dma1chan33': device_add
device: 'dma1chan34': device_add
devices_kset: Moving 2800000.serial to end of list
device: 'ttyS2': device_unregister
printk: legacy console [ttyS2] disabled
device: '2800000.serial:0': device_add
device: '2800000.serial:0.0': device_add
2800000.serial: ttyS2 at MMIO 0x2800000 (irq = 237, base_baud = 3000000) is a 8250
printk: legacy console [ttyS2] enabled
device: 'serial0': device_add
device: 'ttyS2': device_add
devices_kset: Moving fc40000.spi to end of list
device: 'spi0': device_add
device: 'spi0.0': device_add
7 fixed-partitions partitions found on MTD device fc40000.spi.0
Creating 7 MTD partitions on "fc40000.spi.0":
0x000000000000-0x000000080000 : "ospi.tiboot3"
device: 'mtd0': device_add
device: 'mtd0': device_add
device: 'mtd0ro': device_add
device: 'mtdblock0': device_add
device: '31:0': device_add
0x000000080000-0x000000280000 : "ospi.tispl"
device: 'mtd1': device_add
device: 'mtd1': device_add
device: 'mtd1ro': device_add
device: 'mtdblock1': device_add
device: '31:1': device_add
0x000000280000-0x000000680000 : "ospi.u-boot"
device: 'mtd2': device_add
device: 'mtd2': device_add
device: 'mtd2ro': device_add
device: 'mtdblock2': device_add
device: '31:2': device_add
0x000000680000-0x0000006c0000 : "ospi.env"
device: 'mtd3': device_add
device: 'mtd3': device_add
device: 'mtd3ro': device_add
device: 'mtdblock3': device_add
device: '31:3': device_add
0x0000006c0000-0x000000700000 : "ospi.env.backup"
device: 'mtd4': device_add
device: 'mtd4': device_add
device: 'mtd4ro': device_add
device: 'mtdblock4': device_add
device: '31:4': device_add
0x000000800000-0x000003fc0000 : "ospi.rootfs"
device: 'mtd5': device_add
device: 'mtd5': device_add
device: 'mtd5ro': device_add
device: 'mtdblock5': device_add
device: '31:5': device_add
0x000003fc0000-0x000004000000 : "ospi.phypattern"
device: 'mtd6': device_add
device: 'mtd6': device_add
device: 'mtd6ro': device_add
device: 'mtdblock6': device_add
device: '31:6': device_add
devices_kset: Moving 8000000.ethernet to end of list
device: '8000f00.mdio': device_add
device: 'platform:f4000.pinctrl--platform:8000f00.mdio': device_add
devices_kset: Moving 8000f00.mdio to end of list
platform 8000f00.mdio: Linked as a consumer to f4000.pinctrl
/bus@f0000/ethernet@8000000/mdio@f00 Dropping the fwnode link to /bus@f0000/pinctrl@f4000
device: 'platform:44043000.system-controller:clock-controller--platform:8000f00.mdio': device_add
devices_kset: Moving 8000f00.mdio to end of list
platform 8000f00.mdio: Linked as a consumer to 44043000.system-controller:clock-controller
/bus@f0000/ethernet@8000000/mdio@f00 Dropping the fwnode link to /bus@f0000/system-controller@44043000/clock-controller
davinci_mdio 8000f00.mdio: Configuring MDIO in manual mode
device: '8000f00.mdio': device_add
davinci_mdio 8000f00.mdio: davinci mdio revision 9.7, bus freq 1000000
device: '8000f00.mdio:00': device_add
device: '8000f00.mdio:01': device_add
davinci_mdio 8000f00.mdio: phy[0]: device 8000f00.mdio:00, driver TI DP83867
davinci_mdio 8000f00.mdio: phy[1]: device 8000f00.mdio:01, driver TI DP83867
am65-cpsw-nuss 8000000.ethernet: initializing am65 cpsw nuss version 0x6BA01103, cpsw version 0x6BA81103 Ports: 3 quirks:00000002
device: 'phy:phy-104044.phy.0--platform:8000000.ethernet': device_add
devices_kset: Moving 8000000.ethernet to end of list
devices_kset: Moving 8000f00.mdio to end of list
devices_kset: Moving 8000f00.mdio to end of list
devices_kset: Moving 8000f00.mdio:00 to end of list
devices_kset: Moving 8000f00.mdio:01 to end of list
am65-cpsw-nuss 8000000.ethernet: Linked as a consumer to phy-104044.phy.0
device: 'phy:phy-104044.phy.1--platform:8000000.ethernet': device_add
devices_kset: Moving 8000000.ethernet to end of list
devices_kset: Moving 8000f00.mdio to end of list
devices_kset: Moving 8000f00.mdio to end of list
devices_kset: Moving 8000f00.mdio:00 to end of list
devices_kset: Moving 8000f00.mdio:01 to end of list
am65-cpsw-nuss 8000000.ethernet: Linked as a consumer to phy-104044.phy.1
am65-cpsw-nuss 8000000.ethernet: initialized cpsw ale version 1.5
am65-cpsw-nuss 8000000.ethernet: ALE Table size 512, Policers 32
device: 'tchan19-0xc600': device_add
device: 'tchan20-0xc601': device_add
device: 'tchan21-0xc602': device_add
device: 'tchan22-0xc603': device_add
device: 'tchan23-0xc604': device_add
device: 'tchan24-0xc605': device_add
device: 'tchan25-0xc606': device_add
device: 'tchan26-0xc607': device_add
device: 'rchan19-0x4600': device_add
am65-cpsw-nuss 8000000.ethernet: set new flow-id-base 19
device: 'eth0': device_add
device: 'eth1': device_add
am65-cpsw-nuss 8000000.ethernet: Dropping the link to 104044.phy
device: 'platform:104044.phy--platform:8000000.ethernet': device_unregister
am65-cpsw-nuss 8000000.ethernet: Dropping the link to bus@f0000
device: 'platform:bus@f0000--platform:8000000.ethernet': device_unregister
devices_kset: Moving f900000.dwc3-usb to end of list
device: '31000000.usb': device_add
----- cycle: start -----
/bus@f0000/dwc3-usb@f900000/usb@31000000: cycle: depends on /bus@f0000/i2c@20000000/tps6598x@3f/connector
/bus@f0000/i2c@20000000/tps6598x@3f/connector: cycle: depends on /bus@f0000/dwc3-usb@f900000/usb@31000000
----- cycle: end -----
/bus@f0000/i2c@20000000/tps6598x@3f/connector: Fixed dependency cycle(s) with /bus@f0000/dwc3-usb@f900000/usb@31000000
device: 'platform:31000000.usb--i2c:0-003f': device_add
i2c 0-003f: Linked as a sync state only consumer to 31000000.usb (flags 0x3c0)
device: 'platform:bus@f0000--platform:31000000.usb': device_add
devices_kset: Moving 31000000.usb to end of list
platform 31000000.usb: Linked as a consumer to bus@f0000
/bus@f0000/dwc3-usb@f900000/usb@31000000 Dropping the fwnode link to /bus@f0000
----- cycle: start -----
/bus@f0000/i2c@20000000/tps6598x@3f/connector: cycle: depends on /bus@f0000/dwc3-usb@f900000/usb@31000000
----- cycle: start -----
/bus@f0000/i2c@20000000/tps6598x@3f: cycle: depends on /bus@f0000/dwc3-usb@f900000/usb@31000000
/bus@f0000/i2c@20000000/tps6598x@3f/connector: cycle: child of /bus@f0000/i2c@20000000/tps6598x@3f
/bus@f0000/dwc3-usb@f900000/usb@31000000: cycle: depends on /bus@f0000/i2c@20000000/tps6598x@3f/connector
----- cycle: end -----
/bus@f0000/dwc3-usb@f900000/usb@31000000: Fixed dependency cycle(s) with /bus@f0000/i2c@20000000/tps6598x@3f/connector
dwc3 31000000.usb: Configuration mismatch. dr_mode forced to host
device: 'xhci-hcd.0.auto': device_add
xhci-hcd xhci-hcd.0.auto: xHCI Host Controller
xhci-hcd xhci-hcd.0.auto: new USB bus registered, assigned bus number 1
xhci-hcd xhci-hcd.0.auto: USB3 root hub has no ports
xhci-hcd xhci-hcd.0.auto: hcc params 0x0258fe6d hci version 0x110 quirks 0x0000808020000010
xhci-hcd xhci-hcd.0.auto: irq 240, io mem 0x31000000
device: 'usb1': device_add
device: '1-0:1.0': device_add
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 1 port detected
device: 'usb1-port1': device_add
device: 'ep_81': device_add
device: 'ep_00': device_add
/bus@f0000/dwc3-usb@f900000/usb@31000000 Dropping the fwnode link to /bus@f0000/i2c@20000000/tps6598x@3f/connector
device: 'wakeup0': device_add
dwc3-am62 f900000.dwc3-usb: Dropping the link to bus@f0000
device: 'platform:bus@f0000--platform:f900000.dwc3-usb': device_unregister
devices_kset: Moving f910000.dwc3-usb to end of list
device: '31100000.usb': device_add
device: 'platform:f4000.pinctrl--platform:31100000.usb': device_add
devices_kset: Moving 31100000.usb to end of list
platform 31100000.usb: Linked as a consumer to f4000.pinctrl
/bus@f0000/dwc3-usb@f910000/usb@31100000 Dropping the fwnode link to /bus@f0000/pinctrl@f4000
device: 'platform:bus@f0000--platform:31100000.usb': device_add
devices_kset: Moving 31100000.usb to end of list
platform 31100000.usb: Linked as a consumer to bus@f0000
/bus@f0000/dwc3-usb@f910000/usb@31100000 Dropping the fwnode link to /bus@f0000
device: 'xhci-hcd.1.auto': device_add
xhci-hcd xhci-hcd.1.auto: xHCI Host Controller
xhci-hcd xhci-hcd.1.auto: new USB bus registered, assigned bus number 2
xhci-hcd xhci-hcd.1.auto: USB3 root hub has no ports
xhci-hcd xhci-hcd.1.auto: hcc params 0x0258fe6d hci version 0x110 quirks 0x0000808020000010
xhci-hcd xhci-hcd.1.auto: irq 241, io mem 0x31100000
device: 'usb2': device_add
device: '2-0:1.0': device_add
hub 2-0:1.0: USB hub found
hub 2-0:1.0: 1 port detected
device: 'usb2-port1': device_add
device: 'ep_81': device_add
device: 'ep_00': device_add
device: 'wakeup1': device_add
dwc3-am62 f910000.dwc3-usb: Dropping the link to bus@f0000
device: 'platform:bus@f0000--platform:f910000.dwc3-usb': device_unregister
dwc3-am62 f910000.dwc3-usb: Dropping the link to f4000.pinctrl
device: 'platform:f4000.pinctrl--platform:f910000.dwc3-usb': device_unregister
devices_kset: Moving 2b1f0000.rtc to end of list
device: 'wakeup2': device_add
device: 'rtc0': device_add
device: 'alarmtimer.2.auto': device_add
device: 'wakeup3': device_add
rtc-ti-k3 2b1f0000.rtc: registered as rtc0
rtc-ti-k3 2b1f0000.rtc: setting system clock to 1970-01-01T00:00:18 UTC (18)
device: 'ti_k3_rtc_scratch0': device_add
devices_kset: Moving cpufreq-dt to end of list
device: 'cooling_device0': device_add
devices_kset: Moving 600000.gpio to end of list
devices_kset: Moving regulator-4 to end of list
devices_kset: Moving fa00000.mmc to end of list
device: 'gpiochip0': device_add
devices_kset: Moving 601000.gpio to end of list
devices_kset: Moving 1-0022 to end of list
devices_kset: Moving regulator-3 to end of list
devices_kset: Moving fa00000.mmc to end of list
device: 'gpiochip1': device_add
devices_kset: Moving regulator-4 to end of list
devices_kset: Moving fa00000.mmc to end of list
devices_kset: Moving 1-003b to end of list
devices_kset: Moving 1-0022 to end of list
devices_kset: Moving regulator-3 to end of list
devices_kset: Moving fa00000.mmc to end of list
pca953x 1-0022: supply vcc not found, using dummy regulator
device: 'regulator.5': device_add
device: 'regulator:regulator.0--i2c:1-0022': device_add
devices_kset: Moving 1-0022 to end of list
devices_kset: Moving regulator-3 to end of list
devices_kset: Moving fa00000.mmc to end of list
pca953x 1-0022: Linked as a consumer to regulator.0
pca953x 1-0022: using AI
device: 'gpiochip2': device_add
devices_kset: Moving regulator-3 to end of list
devices_kset: Moving fa00000.mmc to end of list
devices_kset: Moving 2b300050.target-module to end of list
devices_kset: Moving leds to end of list
device: 'regulator.6': device_add
device: 'am62-sk:green:heartbeat': device_add
leds-gpio leds: Dropping the link to 601000.gpio
device: 'platform:601000.gpio--platform:leds': device_unregister
devices_kset: Moving 1-003b to end of list
sii902x 1-003b: supply iovcc not found, using dummy regulator
device: 'regulator:regulator.0--i2c:1-003b': device_add
devices_kset: Moving 1-003b to end of list
sii902x 1-003b: Linked as a consumer to regulator.0
sii902x 1-003b: supply cvcc12 not found, using dummy regulator
device: 'hdmi-audio-codec.3.auto': device_add
device: 'i2c-3': device_add
device: 'i2c-3': device_add
i2c i2c-1: Added multiplexed i2c bus 3
sii902x 1-003b: Dropping the link to connector-hdmi
device: 'platform:connector-hdmi--i2c:1-003b': device_unregister
sii902x 1-003b: Dropping the link to 30200000.dss
device: 'platform:30200000.dss--i2c:1-003b': device_unregister
sii902x 1-003b: Dropping the link to 1-0022
device: 'i2c:1-0022--i2c:1-003b': device_unregister
devices_kset: Moving 2b300050.target-module to end of list
devices_kset: Moving 2b300050.target-module to end of list
am65-cpsw-nuss 8000000.ethernet eth0: PHY [8000f00.mdio:00] driver [TI DP83867] (irq=POLL)
am65-cpsw-nuss 8000000.ethernet eth0: configuring for phy/rgmii-rxid link mode
am65-cpsw-nuss 8000000.ethernet eth0: Link is Up - 1Gbps/Full - flow control off
Sending DHCP requests .., OK
IP-Config: Got DHCP answer from 192.168.89.1, my address is 192.168.89.100
IP-Config: Complete:
     device=eth0, hwaddr=1c:63:49:0f:62:0e, ipaddr=192.168.89.100, mask=255.255.255.0, gw=192.168.89.1
     host=buildroot, domain=lab, nis-domain=(none)
     bootserver=192.168.88.20, rootserver=192.168.88.20, rootpath=
     nameserver0=192.168.89.1
     ntpserver0=192.168.89.1
clk: Disabling unused clocks
PM: genpd: Disabling unused power domains
ALSA device list:
  No soundcards found.
device: '0:22': device_add
VFS: Mounted root (nfs filesystem) on device 0:22.
devtmpfs: mounted
Freeing unused kernel memory: 5888K
Run /sbin/init as init process
  with arguments:
    /sbin/init
  with environment:
    HOME=/
    TERM=linux
udevd[121]: starting version 3.2.14
udevd[122]: starting eudev-3.2.14
device: '0:29': device_add
i2c:1-0022--i2c:1-003b
i2c:1-0022--platform:regulator-3
i2c:1-003b--platform:30200000.dss
phy:phy-104044.phy.0--platform:8000000.ethernet
phy:phy-104044.phy.1--platform:8000000.ethernet
platform:31000000.usb--i2c:0-003f
platform:44043000.system-controller:clock-controller--platform:1082e0.clock-controller
platform:44043000.system-controller:clock-controller--platform:1082e4.clock-controller
platform:44043000.system-controller:clock-controller--platform:20000000.i2c
platform:44043000.system-controller:clock-controller--platform:20010000.i2c
platform:44043000.system-controller:clock-controller--platform:20020000.i2c
platform:44043000.system-controller:clock-controller--platform:2400000.timer
platform:44043000.system-controller:clock-controller--platform:2410000.timer
platform:44043000.system-controller:clock-controller--platform:2420000.timer
platform:44043000.system-controller:clock-controller--platform:2430000.timer
platform:44043000.system-controller:clock-controller--platform:2440000.timer
platform:44043000.system-controller:clock-controller--platform:2450000.timer
platform:44043000.system-controller:clock-controller--platform:2460000.timer
platform:44043000.system-controller:clock-controller--platform:2470000.timer
platform:44043000.system-controller:clock-controller--platform:2800000.serial
platform:44043000.system-controller:clock-controller--platform:2b10000.audio-controller
platform:44043000.system-controller:clock-controller--platform:2b1f0000.rtc
platform:44043000.system-controller:clock-controller--platform:2b300050.target-module
platform:44043000.system-controller:clock-controller--platform:30200000.dss
platform:44043000.system-controller:clock-controller--platform:600000.gpio
platform:44043000.system-controller:clock-controller--platform:601000.gpio
platform:44043000.system-controller:clock-controller--platform:8000000.ethernet
platform:44043000.system-controller:clock-controller--platform:8000f00.mdio
platform:44043000.system-controller:clock-controller--platform:e000000.watchdog
platform:44043000.system-controller:clock-controller--platform:e010000.watchdog
platform:44043000.system-controller:clock-controller--platform:e020000.watchdog
platform:44043000.system-controller:clock-controller--platform:e030000.watchdog
platform:44043000.system-controller:clock-controller--platform:e0f0000.watchdog
platform:44043000.system-controller:clock-controller--platform:f900000.dwc3-usb
platform:44043000.system-controller:clock-controller--platform:f910000.dwc3-usb
platform:44043000.system-controller:clock-controller--platform:fa00000.mmc
platform:44043000.system-controller:clock-controller--platform:fa10000.mmc
platform:44043000.system-controller:clock-controller--platform:fc40000.spi
platform:44043000.system-controller:clock-controller--platform:fd00000.gpu
platform:44043000.system-controller:power-controller--platform:20000000.i2c
platform:44043000.system-controller:power-controller--platform:20010000.i2c
platform:44043000.system-controller:power-controller--platform:20020000.i2c
platform:44043000.system-controller:power-controller--platform:2400000.timer
platform:44043000.system-controller:power-controller--platform:2410000.timer
platform:44043000.system-controller:power-controller--platform:2420000.timer
platform:44043000.system-controller:power-controller--platform:2430000.timer
platform:44043000.system-controller:power-controller--platform:2440000.timer
platform:44043000.system-controller:power-controller--platform:2450000.timer
platform:44043000.system-controller:power-controller--platform:2460000.timer
platform:44043000.system-controller:power-controller--platform:2470000.timer
platform:44043000.system-controller:power-controller--platform:2800000.serial
platform:44043000.system-controller:power-controller--platform:2b10000.audio-controller
platform:44043000.system-controller:power-controller--platform:2b1f0000.rtc
platform:44043000.system-controller:power-controller--platform:2b300050.target-module
platform:44043000.system-controller:power-controller--platform:30200000.dss
platform:44043000.system-controller:power-controller--platform:600000.gpio
platform:44043000.system-controller:power-controller--platform:601000.gpio
platform:44043000.system-controller:power-controller--platform:8000000.ethernet
platform:44043000.system-controller:power-controller--platform:b00000.temperature-sensor
platform:44043000.system-controller:power-controller--platform:e000000.watchdog
platform:44043000.system-controller:power-controller--platform:e010000.watchdog
platform:44043000.system-controller:power-controller--platform:e020000.watchdog
platform:44043000.system-controller:power-controller--platform:e030000.watchdog
platform:44043000.system-controller:power-controller--platform:e0f0000.watchdog
platform:44043000.system-controller:power-controller--platform:f900000.dwc3-usb
platform:44043000.system-controller:power-controller--platform:f910000.dwc3-usb
platform:44043000.system-controller:power-controller--platform:fa00000.mmc
platform:44043000.system-controller:power-controller--platform:fa10000.mmc
platform:44043000.system-controller:power-controller--platform:fc40000.spi
platform:44043000.system-controller:power-controller--platform:fd00000.gpu
platform:48000000.interrupt-controller--platform:485c0000.dma-controller
platform:48000000.interrupt-controller--platform:485c0100.dma-controller
platform:4d000000.mailbox--platform:44043000.system-controller
platform:600000.gpio--platform:regulator-4
platform:601000.gpio--i2c:1-0022
platform:bus@f0000--platform:31000000.usb
platform:bus@f0000--platform:31100000.usb
platform:bus@f0000:interrupt-controller@a00000--platform:600000.gpio
platform:bus@f0000:interrupt-controller@a00000--platform:601000.gpio
platform:f4000.pinctrl--i2c:1-0022
platform:f4000.pinctrl--platform:20000000.i2c
platform:f4000.pinctrl--platform:20010000.i2c
platform:f4000.pinctrl--platform:20020000.i2c
platform:f4000.pinctrl--platform:2800000.serial
platform:f4000.pinctrl--platform:2b10000.audio-controller
platform:f4000.pinctrl--platform:30200000.dss
platform:f4000.pinctrl--platform:31100000.usb
platform:f4000.pinctrl--platform:8000000.ethernet
platform:f4000.pinctrl--platform:8000f00.mdio
platform:f4000.pinctrl--platform:fa00000.mmc
platform:f4000.pinctrl--platform:fa10000.mmc
platform:f4000.pinctrl--platform:fc40000.spi
platform:f4000.pinctrl--platform:leds
platform:f4000.pinctrl--platform:regulator-4
platform:regulator-0--platform:regulator-1
platform:regulator-0--platform:regulator-2
platform:regulator-1--platform:regulator-4
platform:regulator-2--i2c:1-001b
platform:regulator-2--platform:regulator-3
platform:regulator-2--platform:regulator-5
platform:regulator-3--platform:fa00000.mmc
platform:regulator-4--platform:fa00000.mmc
platform:regulator-5--i2c:1-001b
regulator:regulator.0--i2c:1-0022
regulator:regulator.0--i2c:1-003b
i2c:1-0022--platform:regulator-3
i2c:1-003b--platform:30200000.dss
phy:phy-104044.phy.0--platform:8000000.ethernet
phy:phy-104044.phy.1--platform:8000000.ethernet
platform:31000000.usb--i2c:0-003f
platform:44043000.system-controller:clock-controller--platform:1082e0.clock-controller
platform:44043000.system-controller:clock-controller--platform:1082e4.clock-controller
platform:44043000.system-controller:clock-controller--platform:20000000.i2c
platform:44043000.system-controller:clock-controller--platform:20010000.i2c
platform:44043000.system-controller:clock-controller--platform:20020000.i2c
platform:44043000.system-controller:clock-controller--platform:2400000.timer
platform:44043000.system-controller:clock-controller--platform:2410000.timer
platform:44043000.system-controller:clock-controller--platform:2420000.timer
platform:44043000.system-controller:clock-controller--platform:2430000.timer
platform:44043000.system-controller:clock-controller--platform:2440000.timer
platform:44043000.system-controller:clock-controller--platform:2450000.timer
platform:44043000.system-controller:clock-controller--platform:2460000.timer
platform:44043000.system-controller:clock-controller--platform:2470000.timer
platform:44043000.system-controller:clock-controller--platform:2800000.serial
platform:44043000.system-controller:clock-controller--platform:2b10000.audio-controller
platform:44043000.system-controller:clock-controller--platform:2b1f0000.rtc
platform:44043000.system-controller:clock-controller--platform:2b300050.target-module
platform:44043000.system-controller:clock-controller--platform:30200000.dss
platform:44043000.system-controller:clock-controller--platform:600000.gpio
platform:44043000.system-controller:clock-controller--platform:601000.gpio
platform:44043000.system-controller:clock-controller--platform:8000000.ethernet
platform:44043000.system-controller:clock-controller--platform:8000f00.mdio
platform:44043000.system-controller:clock-controller--platform:e000000.watchdog
platform:44043000.system-controller:clock-controller--platform:e010000.watchdog
platform:44043000.system-controller:clock-controller--platform:e020000.watchdog
platform:44043000.system-controller:clock-controller--platform:e030000.watchdog
platform:44043000.system-controller:clock-controller--platform:e0f0000.watchdog
platform:44043000.system-controller:clock-controller--platform:f900000.dwc3-usb
platform:44043000.system-controller:clock-controller--platform:f910000.dwc3-usb
platform:44043000.system-controller:clock-controller--platform:fa00000.mmc
platform:44043000.system-controller:clock-controller--platform:fa10000.mmc
platform:44043000.system-controller:clock-controller--platform:fc40000.spi
platform:44043000.system-controller:clock-controller--platform:fd00000.gpu
platform:44043000.system-controller:power-controller--platform:20000000.i2c
platform:44043000.system-controller:power-controller--platform:20010000.i2c
platform:44043000.system-controller:power-controller--platform:20020000.i2c
platform:44043000.system-controller:power-controller--platform:2400000.timer
platform:44043000.system-controller:power-controller--platform:2410000.timer
platform:44043000.system-controller:power-controller--platform:2420000.timer
platform:44043000.system-controller:power-controller--platform:2430000.timer
platform:44043000.system-controller:power-controller--platform:2440000.timer
platform:44043000.system-controller:power-controller--platform:2450000.timer
platform:44043000.system-controller:power-controller--platform:2460000.timer
platform:44043000.system-controller:power-controller--platform:2470000.timer
platform:44043000.system-controller:power-controller--platform:2800000.serial
platform:44043000.system-controller:power-controller--platform:2b10000.audio-controller
platform:44043000.system-controller:power-controller--platform:2b1f0000.rtc
platform:44043000.system-controller:power-controller--platform:2b300050.target-module
platform:44043000.system-controller:power-controller--platform:30200000.dss
platform:44043000.system-controller:power-controller--platform:600000.gpio
platform:44043000.system-controller:power-controller--platform:601000.gpio
platform:44043000.system-controller:power-controller--platform:8000000.ethernet
platform:44043000.system-controller:power-controller--platform:b00000.temperature-sensor
platform:44043000.system-controller:power-controller--platform:e000000.watchdog
platform:44043000.system-controller:power-controller--platform:e010000.watchdog
platform:44043000.system-controller:power-controller--platform:e020000.watchdog
platform:44043000.system-controller:power-controller--platform:e030000.watchdog
platform:44043000.system-controller:power-controller--platform:e0f0000.watchdog
platform:44043000.system-controller:power-controller--platform:f900000.dwc3-usb
platform:44043000.system-controller:power-controller--platform:f910000.dwc3-usb
platform:44043000.system-controller:power-controller--platform:fa00000.mmc
platform:44043000.system-controller:power-controller--platform:fa10000.mmc
platform:44043000.system-controller:power-controller--platform:fc40000.spi
platform:44043000.system-controller:power-controller--platform:fd00000.gpu
platform:48000000.interrupt-controller--platform:485c0000.dma-controller
platform:48000000.interrupt-controller--platform:485c0100.dma-controller
platform:4d000000.mailbox--platform:44043000.system-controller
platform:600000.gpio--platform:regulator-4
platform:601000.gpio--i2c:1-0022
platform:bus@f0000--platform:31000000.usb
platform:bus@f0000--platform:31100000.usb
platform:bus@f0000:interrupt-controller@a00000--platform:600000.gpio
platform:bus@f0000:interrupt-controller@a00000--platform:601000.gpio
platform:f4000.pinctrl--i2c:1-0022
platform:f4000.pinctrl--platform:20000000.i2c
platform:f4000.pinctrl--platform:20010000.i2c
platform:f4000.pinctrl--platform:20020000.i2c
platform:f4000.pinctrl--platform:2800000.serial
platform:f4000.pinctrl--platform:2b10000.audio-controller
platform:f4000.pinctrl--platform:30200000.dss
platform:f4000.pinctrl--platform:31100000.usb
platform:f4000.pinctrl--platform:8000000.ethernet
platform:f4000.pinctrl--platform:8000f00.mdio
platform:f4000.pinctrl--platform:fa00000.mmc
platform:f4000.pinctrl--platform:fa10000.mmc
platform:f4000.pinctrl--platform:fc40000.spi
platform:f4000.pinctrl--platform:leds
platform:f4000.pinctrl--platform:regulator-4
platform:regulator-0--platform:regulator-1
platform:regulator-0--platform:regulator-2
platform:regulator-1--platform:regulator-4
platform:regulator-2--i2c:1-001b
platform:regulator-2--platform:regulator-3
platform:regulator-2--platform:regulator-5
platform:regulator-3--platform:fa00000.mmc
platform:regulator-4--platform:fa00000.mmc
platform:regulator-5--i2c:1-001b
regulator:regulator.0--i2c:1-0022
regulator:regulator.0--i2c:1-003b
Saravana Kannan Oct. 30, 2024, 4:51 a.m. UTC | #4
On Tue, Oct 29, 2024 at 4:21 AM Tomi Valkeinen
<tomi.valkeinen@ideasonboard.com> wrote:
>
> Hi,
>
> On 28/10/2024 22:39, Saravana Kannan wrote:
> > On Mon, Oct 28, 2024 at 1:06 AM Tomi Valkeinen
> > <tomi.valkeinen@ideasonboard.com> wrote:
> >>
> >> Hi,
> >>
> >> On 26/10/2024 07:52, Saravana Kannan wrote:
> >>> In attempting to optimize fw_devlink runtime, I introduced numerous cycle
> >>> detection bugs by foregoing cycle detection logic under specific
> >>> conditions. Each fix has further narrowed the conditions for optimization.
> >>>
> >>> It's time to give up on these optimization attempts and just run the cycle
> >>> detection logic every time fw_devlink tries to create a device link.
> >>>
> >>> The specific bug report that triggered this fix involved a supplier fwnode
> >>> that never gets a device created for it. Instead, the supplier fwnode is
> >>> represented by the device that corresponds to an ancestor fwnode.
> >>>
> >>> In this case, fw_devlink didn't do any cycle detection because the cycle
> >>> detection logic is only run when a device link is created between the
> >>> devices that correspond to the actual consumer and supplier fwnodes.
> >>>
> >>> With this change, fw_devlink will run cycle detection logic even when
> >>> creating SYNC_STATE_ONLY proxy device links from a device that is an
> >>> ancestor of a consumer fwnode.
> >>>
> >>> Reported-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
> >>> Closes: https://lore.kernel.org/all/1a1ab663-d068-40fb-8c94-f0715403d276@ideasonboard.com/
> >>> Fixes: 6442d79d880c ("driver core: fw_devlink: Improve detection of overlapping cycles")
> >>> Signed-off-by: Saravana Kannan <saravanak@google.com>
> >>> ---
> >>> Greg,
> >>>
> >>> I've tested this on my end and it looks ok and nothing fishy is going
> >>> on. You can pick this up once Tomi gives a Tested-by.
> >>
> >> I tested this on TI AM62 SK board. It has an LVDS (OLDI) display and a
> >> HDMI output, and both displays are connected to the same display
> >> subsystem. I tested with OLDI single and dual link cases, with and
> >> without HDMI, and in all cases probing works fine.
> >>
> >> Looks good on that front, so:
> >>
> >> Tested-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
> >
> > Great! Thanks!
> >
> >> You also asked for a diff of the devlinks. That part doesn't look so
> >> good to me, but probably you can tell if it's normal or not.
> >
> > TL;DR: All device links in a cycle get marked as
> > DL_FLAG_SYNC_STATE_ONLY and DL_FLAG_CYCLE (in addition to other
> > flags). All DL_FLAG_SYNC_STATE_ONLY (not all of them are cycles) will
> > get deleted after the consumer probes (since they are no longer needed
> > after that). My guess on what's going on is that with the patch,
> > fw_devlink found and marked more device links as cycles. Ones that in
> > the past weren't detected as being part of a cycle but coincidentally
> > the "post-init" dependency was the one that was getting ignored/not
> > enforced. So the actual links in a cycle getting deleted after all the
> > devices have probed is not a problem.
>
> Ok. Yep, it might all be fine. I still don't understand all that's going
> on here, so maybe look at one more case below.
>
> > You can enable the "cycle" logs in drivers/base/core.c so it's easier
> > to follow the cycles fw_devlink detected. But the logs are a bit
> > cryptic because it tries to print all the multiple cycles that were
> > detected using a recursive search.
> >
> > The non-cycle use for DL_FLAG_SYNC_STATE_ONLY is for parent devices to
> > put a "proxy-vote" (Hey supplier, you still have a consumer that
> > hasn't bound to a driver yet) for descendant (children, grand
> > children) devices that haven't been created yet. So, without the fix
> > it's possible some descendant child never got to probe and the
> > DL_FLAG_SYNC_STATE_ONLY device link stuck around.
> >
> > If you can confirm all the deleted device links fall into one of these
> > two categories, then there's no issue here. If you find cases that
> > aren't clear, then let me know which one and point to specific nodes
> > in an upstream DTS file and I can take a look.
> >
> > Every device link folder has a "sync_state_only" file that says if it
> > has the DL_FLAG_SYNC_STATE_ONLY set. But to check for the cycle flag,
> > you'll have to extend the debug log in device_link_add() that goes:
> > "Linked as a sync state only consumer to......" and print the "flags" param.
>
> I added this print.
>
> I thought I'll test without any non-upstream patches, so this is booting
> with the upstream k3-am625-sk.dtb, no overlays. I've attached boot log
> (with this patch applied), and devlink lists, without and with this patch.
>
> As the OLDI stuff is not upstream, I did expect to see less diff, and
> that is the case. It's still somewhat interesting diff:
>
> $ diff devlink-broken.txt devlink-fixed.txt
> 1d0
> < i2c:1-0022--i2c:1-003b
>
> So that's the gpio expander (exp1: gpio@22 in k3-am625-sk.dts) and the
> hdmi bridge (sii9022: bridge-hdmi@3b in k3-am62x-sk-common.dtsi). And,
> indeed, in the log I can see:
>
> i2c 1-003b: Linked as a sync state only consumer to 1-0022 (flags 0x3c0)
> /bus@f0000/i2c@20010000/bridge-hdmi@3b Dropping the fwnode link to
> /bus@f0000/i2c@20010000/gpio@22
>
> If I'm not mistaken, the above means that the framework has decided
> there's a (possible) probe time cyclic dependency between the gpio
> expander and the hdmi bridge, right?
>
> I don't think that makes sense, and I was trying to understand why the
> framework has arrived to such a conclusion, but it's not clear to me.
>
> Also, I can see, e.g.:
>
> /bus@f0000/i2c@20010000: cycle: depends on /bus@f0000/dss@30200000
>
> So somehow the i2c bus has a dependency on the DSS? The DSS does not
> depend on the i2c, but the HDMI does, so I can understand that the DSS
> would have a dependency to i2c. But the other way around?

Thanks for being persistent! :) I think you found a real issue in this patch.
I'm squeezing these fixes late at night and between my regular work.
So, apologies in advance for untested patches and me going with
hunches.

This part probably won't make sense, but I'm "explaining" it here just
to record it somewhere if I or someone else comes back and looks at
this after a few months.

What's happening is that when 30200000.dss was added, 20010000.i2c was
creating a sync state only proxy link for bridge-hdmi@3b (child of
i2c). But when creating the proxy link, fw_devlink detected the cycle
between bridge-hdmi@3b and 30200000.dss. That cycle is valid, but this
patch also results in marking the "proxy" link as part of a cycle
(when it wasn't). So it incorrectly marked i2c as being in a consumer
of with dss and part of a cycle.

Later on when running cycle detection logic between bridge-hdmi@3b and
gpio@22, the cycle detection logic follows the i2c to dss link because
it thinks the i2c really depends on dss but is part of a cycle.

Try this fix on top of this patch and it should allow probing for all
the previous broken scenarios AND should avoid dropping some links
incorrectly.

--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -2115,11 +2115,6 @@ static int fw_devlink_create_devlink(struct device *con,
        if (link->flags & FWLINK_FLAG_IGNORE)
                return 0;

-       if (con->fwnode == link->consumer)
-               flags = fw_devlink_get_flags(link->flags);
-       else
-               flags = FW_DEVLINK_FLAGS_PERMISSIVE;
-
        /*
         * In some cases, a device P might also be a supplier to its child node
         * C. However, this would defer the probe of C until the probe of P
@@ -2147,13 +2142,17 @@ static int fw_devlink_create_devlink(struct device *con,
        device_links_write_lock();
        if (__fw_devlink_relax_cycles(link->consumer, sup_handle)) {
                __fwnode_link_cycle(link);
-               flags = fw_devlink_get_flags(link->flags);
                pr_debug("----- cycle: end -----\n");
                pr_info("%pfwf: Fixed dependency cycle(s) with %pfwf\n",
                        link->consumer, sup_handle);
        }
        device_links_write_unlock();

+       if (con->fwnode == link->consumer)
+               flags = fw_devlink_get_flags(link->flags);
+       else
+               flags = FW_DEVLINK_FLAGS_PERMISSIVE;
+
        if (sup_handle->flags & FWNODE_FLAG_NOT_DEVICE)
                sup_dev = fwnode_get_next_parent_dev(sup_handle);
        else

Thanks,
Saravana

>
>   Tomi
>
> >>
> >> $ diff devlink-single-broken.txt devlink-single-fixed.txt
> >
> > I was hoping you'd give me some line count diff too to get a sense of
> > if it's wreaking havoc or not. But based on my local testing on
> > different hardware, I'm expecting a very small number of device links
> > are getting affected.
> >
> >> 2d1
> >> < i2c:1-0022--i2c:1-003b
> >> 11d9
> >> <
> >> platform:44043000.system-controller:clock-controller--platform:20010000.i2c
> >> 27d24
> >> < platform:44043000.system-controller:clock-controller--platform:601000.gpio
> >> 42d38
> >> <
> >> platform:44043000.system-controller:power-controller--platform:20010000.i2c
> >> 58d53
> >> < platform:44043000.system-controller:power-controller--platform:601000.gpio
> >> 74d68
> >> < platform:4d000000.mailbox--platform:44043000.system-controller
> >
> > I took a quick look at this one in
> > arch/arm64/boot/dts/ti/k3-am62-main.dtsi which I assume is part of the
> > device you are testing on and I couldn't find a cycle. But with dtsi
> > and dts files, it's hard to find these manually. Let me know if
> > fw_devlink is thinking there's a cycle where there is none.
> >
> >> 76d69
> >> < platform:601000.gpio--i2c:1-0022
> >> 80d72
> >> < platform:bus@f0000:interrupt-controller@a00000--platform:601000.gpio
> >> 82d73
> >> < platform:f4000.pinctrl--i2c:1-0022
> >> 84d74
> >> < platform:f4000.pinctrl--platform:20010000.i2c
> >>
> >> "i2c:1-003b" is the hdmi bridge, "i2c:1-0022" is a gpio expander. So,
> >> for example, we lose the devlink between the gpio expander and the hdmi
> >> bridge. The expander is used for interrupts. There's an interrupt line
> >> from the HDMI bridge to the expander, and from there there's an
> >> interrupt line going to the SoC.
> >>
> >> Also, I noticed the devlinks change if I load the display drivers. The
> >> above is before loading. Comparing the loaded/not-loaded:
> >
> > Yeah, DL_FLAG_SYNC_STATE_ONLY device links vanishing as more devices
> > probe is not a problem. That's working as intended.
> >
> > Thanks,
> > Saravana
> >
> >>
> >> $ diff devlink-dual-fixed.txt devlink-dual-fixed-loaded.txt
> >> 3d2
> >> < i2c:1-003b--platform:30200000.dss
> >> 23d21
> >> <
> >> platform:44043000.system-controller:clock-controller--platform:30200000.dss
> >> 52d49
> >> <
> >> platform:44043000.system-controller:power-controller--platform:30200000.dss
> >> 73d69
> >> < platform:display--platform:30200000.dss
> >> 78d73
> >> < platform:f4000.pinctrl--platform:30200000.dss
> >> 97a93
> >>   > regulator:regulator.0--platform:display
> >>
> >>    Tomi
> >>
> >>
> >>> Thanks,
> >>> Saravana
> >>>
> >>> v1 -> v2:
> >>> - Removed the RFC tag
> >>> - Remaned the subject. v1 is https://lore.kernel.org/all/20241025223721.184998-1-saravanak@google.com/T/#u
> >>> - Added a NULL check to avoid NULL pointer deref
> >>>
> >>>    drivers/base/core.c | 46 ++++++++++++++++++++-------------------------
> >>>    1 file changed, 20 insertions(+), 26 deletions(-)
> >>>
> >>> diff --git a/drivers/base/core.c b/drivers/base/core.c
> >>> index 3b13fed1c3e3..f96f2e4c76b4 100644
> >>> --- a/drivers/base/core.c
> >>> +++ b/drivers/base/core.c
> >>> @@ -1990,10 +1990,10 @@ static struct device *fwnode_get_next_parent_dev(const struct fwnode_handle *fwn
> >>>     *
> >>>     * Return true if one or more cycles were found. Otherwise, return false.
> >>>     */
> >>> -static bool __fw_devlink_relax_cycles(struct device *con,
> >>> +static bool __fw_devlink_relax_cycles(struct fwnode_handle *con_handle,
> >>>                                 struct fwnode_handle *sup_handle)
> >>>    {
> >>> -     struct device *sup_dev = NULL, *par_dev = NULL;
> >>> +     struct device *sup_dev = NULL, *par_dev = NULL, *con_dev = NULL;
> >>>        struct fwnode_link *link;
> >>>        struct device_link *dev_link;
> >>>        bool ret = false;
> >>> @@ -2010,22 +2010,22 @@ static bool __fw_devlink_relax_cycles(struct device *con,
> >>>
> >>>        sup_handle->flags |= FWNODE_FLAG_VISITED;
> >>>
> >>> -     sup_dev = get_dev_from_fwnode(sup_handle);
> >>> -
> >>>        /* Termination condition. */
> >>> -     if (sup_dev == con) {
> >>> +     if (sup_handle == con_handle) {
> >>>                pr_debug("----- cycle: start -----\n");
> >>>                ret = true;
> >>>                goto out;
> >>>        }
> >>>
> >>> +     sup_dev = get_dev_from_fwnode(sup_handle);
> >>> +     con_dev = get_dev_from_fwnode(con_handle);
> >>>        /*
> >>>         * If sup_dev is bound to a driver and @con hasn't started binding to a
> >>>         * driver, sup_dev can't be a consumer of @con. So, no need to check
> >>>         * further.
> >>>         */
> >>>        if (sup_dev && sup_dev->links.status ==  DL_DEV_DRIVER_BOUND &&
> >>> -         con->links.status == DL_DEV_NO_DRIVER) {
> >>> +         con_dev && con_dev->links.status == DL_DEV_NO_DRIVER) {
> >>>                ret = false;
> >>>                goto out;
> >>>        }
> >>> @@ -2034,7 +2034,7 @@ static bool __fw_devlink_relax_cycles(struct device *con,
> >>>                if (link->flags & FWLINK_FLAG_IGNORE)
> >>>                        continue;
> >>>
> >>> -             if (__fw_devlink_relax_cycles(con, link->supplier)) {
> >>> +             if (__fw_devlink_relax_cycles(con_handle, link->supplier)) {
> >>>                        __fwnode_link_cycle(link);
> >>>                        ret = true;
> >>>                }
> >>> @@ -2049,7 +2049,7 @@ static bool __fw_devlink_relax_cycles(struct device *con,
> >>>        else
> >>>                par_dev = fwnode_get_next_parent_dev(sup_handle);
> >>>
> >>> -     if (par_dev && __fw_devlink_relax_cycles(con, par_dev->fwnode)) {
> >>> +     if (par_dev && __fw_devlink_relax_cycles(con_handle, par_dev->fwnode)) {
> >>>                pr_debug("%pfwf: cycle: child of %pfwf\n", sup_handle,
> >>>                         par_dev->fwnode);
> >>>                ret = true;
> >>> @@ -2067,7 +2067,7 @@ static bool __fw_devlink_relax_cycles(struct device *con,
> >>>                    !(dev_link->flags & DL_FLAG_CYCLE))
> >>>                        continue;
> >>>
> >>> -             if (__fw_devlink_relax_cycles(con,
> >>> +             if (__fw_devlink_relax_cycles(con_handle,
> >>>                                              dev_link->supplier->fwnode)) {
> >>>                        pr_debug("%pfwf: cycle: depends on %pfwf\n", sup_handle,
> >>>                                 dev_link->supplier->fwnode);
> >>> @@ -2140,25 +2140,19 @@ static int fw_devlink_create_devlink(struct device *con,
> >>>                return -EINVAL;
> >>>
> >>>        /*
> >>> -      * SYNC_STATE_ONLY device links don't block probing and supports cycles.
> >>> -      * So, one might expect that cycle detection isn't necessary for them.
> >>> -      * However, if the device link was marked as SYNC_STATE_ONLY because
> >>> -      * it's part of a cycle, then we still need to do cycle detection. This
> >>> -      * is because the consumer and supplier might be part of multiple cycles
> >>> -      * and we need to detect all those cycles.
> >>> +      * Don't try to optimize by not calling the cycle detection logic under
> >>> +      * certain conditions. There's always some corner case that won't get
> >>> +      * detected.
> >>>         */
> >>> -     if (!device_link_flag_is_sync_state_only(flags) ||
> >>> -         flags & DL_FLAG_CYCLE) {
> >>> -             device_links_write_lock();
> >>> -             if (__fw_devlink_relax_cycles(con, sup_handle)) {
> >>> -                     __fwnode_link_cycle(link);
> >>> -                     flags = fw_devlink_get_flags(link->flags);
> >>> -                     pr_debug("----- cycle: end -----\n");
> >>> -                     dev_info(con, "Fixed dependency cycle(s) with %pfwf\n",
> >>> -                              sup_handle);
> >>> -             }
> >>> -             device_links_write_unlock();
> >>> +     device_links_write_lock();
> >>> +     if (__fw_devlink_relax_cycles(link->consumer, sup_handle)) {
> >>> +             __fwnode_link_cycle(link);
> >>> +             flags = fw_devlink_get_flags(link->flags);
> >>> +             pr_debug("----- cycle: end -----\n");
> >>> +             pr_info("%pfwf: Fixed dependency cycle(s) with %pfwf\n",
> >>> +                     link->consumer, sup_handle);
> >>>        }
> >>> +     device_links_write_unlock();
> >>>
> >>>        if (sup_handle->flags & FWNODE_FLAG_NOT_DEVICE)
> >>>                sup_dev = fwnode_get_next_parent_dev(sup_handle);
> >>
Tomi Valkeinen Oct. 30, 2024, 2:04 p.m. UTC | #5
Hi,

On 30/10/2024 06:51, Saravana Kannan wrote:
> On Tue, Oct 29, 2024 at 4:21 AM Tomi Valkeinen
> <tomi.valkeinen@ideasonboard.com> wrote:
>>
>> Hi,
>>
>> On 28/10/2024 22:39, Saravana Kannan wrote:
>>> On Mon, Oct 28, 2024 at 1:06 AM Tomi Valkeinen
>>> <tomi.valkeinen@ideasonboard.com> wrote:
>>>>
>>>> Hi,
>>>>
>>>> On 26/10/2024 07:52, Saravana Kannan wrote:
>>>>> In attempting to optimize fw_devlink runtime, I introduced numerous cycle
>>>>> detection bugs by foregoing cycle detection logic under specific
>>>>> conditions. Each fix has further narrowed the conditions for optimization.
>>>>>
>>>>> It's time to give up on these optimization attempts and just run the cycle
>>>>> detection logic every time fw_devlink tries to create a device link.
>>>>>
>>>>> The specific bug report that triggered this fix involved a supplier fwnode
>>>>> that never gets a device created for it. Instead, the supplier fwnode is
>>>>> represented by the device that corresponds to an ancestor fwnode.
>>>>>
>>>>> In this case, fw_devlink didn't do any cycle detection because the cycle
>>>>> detection logic is only run when a device link is created between the
>>>>> devices that correspond to the actual consumer and supplier fwnodes.
>>>>>
>>>>> With this change, fw_devlink will run cycle detection logic even when
>>>>> creating SYNC_STATE_ONLY proxy device links from a device that is an
>>>>> ancestor of a consumer fwnode.
>>>>>
>>>>> Reported-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
>>>>> Closes: https://lore.kernel.org/all/1a1ab663-d068-40fb-8c94-f0715403d276@ideasonboard.com/
>>>>> Fixes: 6442d79d880c ("driver core: fw_devlink: Improve detection of overlapping cycles")
>>>>> Signed-off-by: Saravana Kannan <saravanak@google.com>
>>>>> ---
>>>>> Greg,
>>>>>
>>>>> I've tested this on my end and it looks ok and nothing fishy is going
>>>>> on. You can pick this up once Tomi gives a Tested-by.
>>>>
>>>> I tested this on TI AM62 SK board. It has an LVDS (OLDI) display and a
>>>> HDMI output, and both displays are connected to the same display
>>>> subsystem. I tested with OLDI single and dual link cases, with and
>>>> without HDMI, and in all cases probing works fine.
>>>>
>>>> Looks good on that front, so:
>>>>
>>>> Tested-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
>>>
>>> Great! Thanks!
>>>
>>>> You also asked for a diff of the devlinks. That part doesn't look so
>>>> good to me, but probably you can tell if it's normal or not.
>>>
>>> TL;DR: All device links in a cycle get marked as
>>> DL_FLAG_SYNC_STATE_ONLY and DL_FLAG_CYCLE (in addition to other
>>> flags). All DL_FLAG_SYNC_STATE_ONLY (not all of them are cycles) will
>>> get deleted after the consumer probes (since they are no longer needed
>>> after that). My guess on what's going on is that with the patch,
>>> fw_devlink found and marked more device links as cycles. Ones that in
>>> the past weren't detected as being part of a cycle but coincidentally
>>> the "post-init" dependency was the one that was getting ignored/not
>>> enforced. So the actual links in a cycle getting deleted after all the
>>> devices have probed is not a problem.
>>
>> Ok. Yep, it might all be fine. I still don't understand all that's going
>> on here, so maybe look at one more case below.
>>
>>> You can enable the "cycle" logs in drivers/base/core.c so it's easier
>>> to follow the cycles fw_devlink detected. But the logs are a bit
>>> cryptic because it tries to print all the multiple cycles that were
>>> detected using a recursive search.
>>>
>>> The non-cycle use for DL_FLAG_SYNC_STATE_ONLY is for parent devices to
>>> put a "proxy-vote" (Hey supplier, you still have a consumer that
>>> hasn't bound to a driver yet) for descendant (children, grand
>>> children) devices that haven't been created yet. So, without the fix
>>> it's possible some descendant child never got to probe and the
>>> DL_FLAG_SYNC_STATE_ONLY device link stuck around.
>>>
>>> If you can confirm all the deleted device links fall into one of these
>>> two categories, then there's no issue here. If you find cases that
>>> aren't clear, then let me know which one and point to specific nodes
>>> in an upstream DTS file and I can take a look.
>>>
>>> Every device link folder has a "sync_state_only" file that says if it
>>> has the DL_FLAG_SYNC_STATE_ONLY set. But to check for the cycle flag,
>>> you'll have to extend the debug log in device_link_add() that goes:
>>> "Linked as a sync state only consumer to......" and print the "flags" param.
>>
>> I added this print.
>>
>> I thought I'll test without any non-upstream patches, so this is booting
>> with the upstream k3-am625-sk.dtb, no overlays. I've attached boot log
>> (with this patch applied), and devlink lists, without and with this patch.
>>
>> As the OLDI stuff is not upstream, I did expect to see less diff, and
>> that is the case. It's still somewhat interesting diff:
>>
>> $ diff devlink-broken.txt devlink-fixed.txt
>> 1d0
>> < i2c:1-0022--i2c:1-003b
>>
>> So that's the gpio expander (exp1: gpio@22 in k3-am625-sk.dts) and the
>> hdmi bridge (sii9022: bridge-hdmi@3b in k3-am62x-sk-common.dtsi). And,
>> indeed, in the log I can see:
>>
>> i2c 1-003b: Linked as a sync state only consumer to 1-0022 (flags 0x3c0)
>> /bus@f0000/i2c@20010000/bridge-hdmi@3b Dropping the fwnode link to
>> /bus@f0000/i2c@20010000/gpio@22
>>
>> If I'm not mistaken, the above means that the framework has decided
>> there's a (possible) probe time cyclic dependency between the gpio
>> expander and the hdmi bridge, right?
>>
>> I don't think that makes sense, and I was trying to understand why the
>> framework has arrived to such a conclusion, but it's not clear to me.
>>
>> Also, I can see, e.g.:
>>
>> /bus@f0000/i2c@20010000: cycle: depends on /bus@f0000/dss@30200000
>>
>> So somehow the i2c bus has a dependency on the DSS? The DSS does not
>> depend on the i2c, but the HDMI does, so I can understand that the DSS
>> would have a dependency to i2c. But the other way around?
> 
> Thanks for being persistent! :) I think you found a real issue in this patch.
> I'm squeezing these fixes late at night and between my regular work.
> So, apologies in advance for untested patches and me going with
> hunches.
> 
> This part probably won't make sense, but I'm "explaining" it here just
> to record it somewhere if I or someone else comes back and looks at
> this after a few months.
> 
> What's happening is that when 30200000.dss was added, 20010000.i2c was
> creating a sync state only proxy link for bridge-hdmi@3b (child of
> i2c). But when creating the proxy link, fw_devlink detected the cycle
> between bridge-hdmi@3b and 30200000.dss. That cycle is valid, but this
> patch also results in marking the "proxy" link as part of a cycle
> (when it wasn't). So it incorrectly marked i2c as being in a consumer
> of with dss and part of a cycle.
> 
> Later on when running cycle detection logic between bridge-hdmi@3b and
> gpio@22, the cycle detection logic follows the i2c to dss link because
> it thinks the i2c really depends on dss but is part of a cycle.
> 
> Try this fix on top of this patch and it should allow probing for all
> the previous broken scenarios AND should avoid dropping some links
> incorrectly.

Thanks! With this change on top, the behavior I see is:

- "ls -1 /sys/class/devlink" is identical between a) no driver core 
fixes and b) this patch and the change below, when I test all three 
cases I have: 1) no OLDI at all (i.e. plain upstream AM62 SK), 2) OLDI 
single-link, 3) OLDI dual link.

- The OLDI single-link probes with these changes (and it didn't probe 
before these changes).

In other words, with the patch and the change below, everything seems to 
work fine without any devlinks disappearing. So (this time for real):

Tested-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>

That said, these kind of changes scare me a bit, and I wouldn't mind 
someone else testing on some other platform =).

Francesco, I think you said you have an OLDI single-link platform. 
That's still a TI platform, but not the same as I have, so maybe worth 
testing out.

  Tomi

> --- a/drivers/base/core.c
> +++ b/drivers/base/core.c
> @@ -2115,11 +2115,6 @@ static int fw_devlink_create_devlink(struct device *con,
>          if (link->flags & FWLINK_FLAG_IGNORE)
>                  return 0;
> 
> -       if (con->fwnode == link->consumer)
> -               flags = fw_devlink_get_flags(link->flags);
> -       else
> -               flags = FW_DEVLINK_FLAGS_PERMISSIVE;
> -
>          /*
>           * In some cases, a device P might also be a supplier to its child node
>           * C. However, this would defer the probe of C until the probe of P
> @@ -2147,13 +2142,17 @@ static int fw_devlink_create_devlink(struct device *con,
>          device_links_write_lock();
>          if (__fw_devlink_relax_cycles(link->consumer, sup_handle)) {
>                  __fwnode_link_cycle(link);
> -               flags = fw_devlink_get_flags(link->flags);
>                  pr_debug("----- cycle: end -----\n");
>                  pr_info("%pfwf: Fixed dependency cycle(s) with %pfwf\n",
>                          link->consumer, sup_handle);
>          }
>          device_links_write_unlock();
> 
> +       if (con->fwnode == link->consumer)
> +               flags = fw_devlink_get_flags(link->flags);
> +       else
> +               flags = FW_DEVLINK_FLAGS_PERMISSIVE;
> +
>          if (sup_handle->flags & FWNODE_FLAG_NOT_DEVICE)
>                  sup_dev = fwnode_get_next_parent_dev(sup_handle);
>          else
> 
> Thanks,
> Saravana
> 
>>
>>    Tomi
>>
>>>>
>>>> $ diff devlink-single-broken.txt devlink-single-fixed.txt
>>>
>>> I was hoping you'd give me some line count diff too to get a sense of
>>> if it's wreaking havoc or not. But based on my local testing on
>>> different hardware, I'm expecting a very small number of device links
>>> are getting affected.
>>>
>>>> 2d1
>>>> < i2c:1-0022--i2c:1-003b
>>>> 11d9
>>>> <
>>>> platform:44043000.system-controller:clock-controller--platform:20010000.i2c
>>>> 27d24
>>>> < platform:44043000.system-controller:clock-controller--platform:601000.gpio
>>>> 42d38
>>>> <
>>>> platform:44043000.system-controller:power-controller--platform:20010000.i2c
>>>> 58d53
>>>> < platform:44043000.system-controller:power-controller--platform:601000.gpio
>>>> 74d68
>>>> < platform:4d000000.mailbox--platform:44043000.system-controller
>>>
>>> I took a quick look at this one in
>>> arch/arm64/boot/dts/ti/k3-am62-main.dtsi which I assume is part of the
>>> device you are testing on and I couldn't find a cycle. But with dtsi
>>> and dts files, it's hard to find these manually. Let me know if
>>> fw_devlink is thinking there's a cycle where there is none.
>>>
>>>> 76d69
>>>> < platform:601000.gpio--i2c:1-0022
>>>> 80d72
>>>> < platform:bus@f0000:interrupt-controller@a00000--platform:601000.gpio
>>>> 82d73
>>>> < platform:f4000.pinctrl--i2c:1-0022
>>>> 84d74
>>>> < platform:f4000.pinctrl--platform:20010000.i2c
>>>>
>>>> "i2c:1-003b" is the hdmi bridge, "i2c:1-0022" is a gpio expander. So,
>>>> for example, we lose the devlink between the gpio expander and the hdmi
>>>> bridge. The expander is used for interrupts. There's an interrupt line
>>>> from the HDMI bridge to the expander, and from there there's an
>>>> interrupt line going to the SoC.
>>>>
>>>> Also, I noticed the devlinks change if I load the display drivers. The
>>>> above is before loading. Comparing the loaded/not-loaded:
>>>
>>> Yeah, DL_FLAG_SYNC_STATE_ONLY device links vanishing as more devices
>>> probe is not a problem. That's working as intended.
>>>
>>> Thanks,
>>> Saravana
>>>
>>>>
>>>> $ diff devlink-dual-fixed.txt devlink-dual-fixed-loaded.txt
>>>> 3d2
>>>> < i2c:1-003b--platform:30200000.dss
>>>> 23d21
>>>> <
>>>> platform:44043000.system-controller:clock-controller--platform:30200000.dss
>>>> 52d49
>>>> <
>>>> platform:44043000.system-controller:power-controller--platform:30200000.dss
>>>> 73d69
>>>> < platform:display--platform:30200000.dss
>>>> 78d73
>>>> < platform:f4000.pinctrl--platform:30200000.dss
>>>> 97a93
>>>>    > regulator:regulator.0--platform:display
>>>>
>>>>     Tomi
>>>>
>>>>
>>>>> Thanks,
>>>>> Saravana
>>>>>
>>>>> v1 -> v2:
>>>>> - Removed the RFC tag
>>>>> - Remaned the subject. v1 is https://lore.kernel.org/all/20241025223721.184998-1-saravanak@google.com/T/#u
>>>>> - Added a NULL check to avoid NULL pointer deref
>>>>>
>>>>>     drivers/base/core.c | 46 ++++++++++++++++++++-------------------------
>>>>>     1 file changed, 20 insertions(+), 26 deletions(-)
>>>>>
>>>>> diff --git a/drivers/base/core.c b/drivers/base/core.c
>>>>> index 3b13fed1c3e3..f96f2e4c76b4 100644
>>>>> --- a/drivers/base/core.c
>>>>> +++ b/drivers/base/core.c
>>>>> @@ -1990,10 +1990,10 @@ static struct device *fwnode_get_next_parent_dev(const struct fwnode_handle *fwn
>>>>>      *
>>>>>      * Return true if one or more cycles were found. Otherwise, return false.
>>>>>      */
>>>>> -static bool __fw_devlink_relax_cycles(struct device *con,
>>>>> +static bool __fw_devlink_relax_cycles(struct fwnode_handle *con_handle,
>>>>>                                  struct fwnode_handle *sup_handle)
>>>>>     {
>>>>> -     struct device *sup_dev = NULL, *par_dev = NULL;
>>>>> +     struct device *sup_dev = NULL, *par_dev = NULL, *con_dev = NULL;
>>>>>         struct fwnode_link *link;
>>>>>         struct device_link *dev_link;
>>>>>         bool ret = false;
>>>>> @@ -2010,22 +2010,22 @@ static bool __fw_devlink_relax_cycles(struct device *con,
>>>>>
>>>>>         sup_handle->flags |= FWNODE_FLAG_VISITED;
>>>>>
>>>>> -     sup_dev = get_dev_from_fwnode(sup_handle);
>>>>> -
>>>>>         /* Termination condition. */
>>>>> -     if (sup_dev == con) {
>>>>> +     if (sup_handle == con_handle) {
>>>>>                 pr_debug("----- cycle: start -----\n");
>>>>>                 ret = true;
>>>>>                 goto out;
>>>>>         }
>>>>>
>>>>> +     sup_dev = get_dev_from_fwnode(sup_handle);
>>>>> +     con_dev = get_dev_from_fwnode(con_handle);
>>>>>         /*
>>>>>          * If sup_dev is bound to a driver and @con hasn't started binding to a
>>>>>          * driver, sup_dev can't be a consumer of @con. So, no need to check
>>>>>          * further.
>>>>>          */
>>>>>         if (sup_dev && sup_dev->links.status ==  DL_DEV_DRIVER_BOUND &&
>>>>> -         con->links.status == DL_DEV_NO_DRIVER) {
>>>>> +         con_dev && con_dev->links.status == DL_DEV_NO_DRIVER) {
>>>>>                 ret = false;
>>>>>                 goto out;
>>>>>         }
>>>>> @@ -2034,7 +2034,7 @@ static bool __fw_devlink_relax_cycles(struct device *con,
>>>>>                 if (link->flags & FWLINK_FLAG_IGNORE)
>>>>>                         continue;
>>>>>
>>>>> -             if (__fw_devlink_relax_cycles(con, link->supplier)) {
>>>>> +             if (__fw_devlink_relax_cycles(con_handle, link->supplier)) {
>>>>>                         __fwnode_link_cycle(link);
>>>>>                         ret = true;
>>>>>                 }
>>>>> @@ -2049,7 +2049,7 @@ static bool __fw_devlink_relax_cycles(struct device *con,
>>>>>         else
>>>>>                 par_dev = fwnode_get_next_parent_dev(sup_handle);
>>>>>
>>>>> -     if (par_dev && __fw_devlink_relax_cycles(con, par_dev->fwnode)) {
>>>>> +     if (par_dev && __fw_devlink_relax_cycles(con_handle, par_dev->fwnode)) {
>>>>>                 pr_debug("%pfwf: cycle: child of %pfwf\n", sup_handle,
>>>>>                          par_dev->fwnode);
>>>>>                 ret = true;
>>>>> @@ -2067,7 +2067,7 @@ static bool __fw_devlink_relax_cycles(struct device *con,
>>>>>                     !(dev_link->flags & DL_FLAG_CYCLE))
>>>>>                         continue;
>>>>>
>>>>> -             if (__fw_devlink_relax_cycles(con,
>>>>> +             if (__fw_devlink_relax_cycles(con_handle,
>>>>>                                               dev_link->supplier->fwnode)) {
>>>>>                         pr_debug("%pfwf: cycle: depends on %pfwf\n", sup_handle,
>>>>>                                  dev_link->supplier->fwnode);
>>>>> @@ -2140,25 +2140,19 @@ static int fw_devlink_create_devlink(struct device *con,
>>>>>                 return -EINVAL;
>>>>>
>>>>>         /*
>>>>> -      * SYNC_STATE_ONLY device links don't block probing and supports cycles.
>>>>> -      * So, one might expect that cycle detection isn't necessary for them.
>>>>> -      * However, if the device link was marked as SYNC_STATE_ONLY because
>>>>> -      * it's part of a cycle, then we still need to do cycle detection. This
>>>>> -      * is because the consumer and supplier might be part of multiple cycles
>>>>> -      * and we need to detect all those cycles.
>>>>> +      * Don't try to optimize by not calling the cycle detection logic under
>>>>> +      * certain conditions. There's always some corner case that won't get
>>>>> +      * detected.
>>>>>          */
>>>>> -     if (!device_link_flag_is_sync_state_only(flags) ||
>>>>> -         flags & DL_FLAG_CYCLE) {
>>>>> -             device_links_write_lock();
>>>>> -             if (__fw_devlink_relax_cycles(con, sup_handle)) {
>>>>> -                     __fwnode_link_cycle(link);
>>>>> -                     flags = fw_devlink_get_flags(link->flags);
>>>>> -                     pr_debug("----- cycle: end -----\n");
>>>>> -                     dev_info(con, "Fixed dependency cycle(s) with %pfwf\n",
>>>>> -                              sup_handle);
>>>>> -             }
>>>>> -             device_links_write_unlock();
>>>>> +     device_links_write_lock();
>>>>> +     if (__fw_devlink_relax_cycles(link->consumer, sup_handle)) {
>>>>> +             __fwnode_link_cycle(link);
>>>>> +             flags = fw_devlink_get_flags(link->flags);
>>>>> +             pr_debug("----- cycle: end -----\n");
>>>>> +             pr_info("%pfwf: Fixed dependency cycle(s) with %pfwf\n",
>>>>> +                     link->consumer, sup_handle);
>>>>>         }
>>>>> +     device_links_write_unlock();
>>>>>
>>>>>         if (sup_handle->flags & FWNODE_FLAG_NOT_DEVICE)
>>>>>                 sup_dev = fwnode_get_next_parent_dev(sup_handle);
>>>>
diff mbox series

Patch

diff --git a/drivers/base/core.c b/drivers/base/core.c
index 3b13fed1c3e3..f96f2e4c76b4 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -1990,10 +1990,10 @@  static struct device *fwnode_get_next_parent_dev(const struct fwnode_handle *fwn
  *
  * Return true if one or more cycles were found. Otherwise, return false.
  */
-static bool __fw_devlink_relax_cycles(struct device *con,
+static bool __fw_devlink_relax_cycles(struct fwnode_handle *con_handle,
 				 struct fwnode_handle *sup_handle)
 {
-	struct device *sup_dev = NULL, *par_dev = NULL;
+	struct device *sup_dev = NULL, *par_dev = NULL, *con_dev = NULL;
 	struct fwnode_link *link;
 	struct device_link *dev_link;
 	bool ret = false;
@@ -2010,22 +2010,22 @@  static bool __fw_devlink_relax_cycles(struct device *con,
 
 	sup_handle->flags |= FWNODE_FLAG_VISITED;
 
-	sup_dev = get_dev_from_fwnode(sup_handle);
-
 	/* Termination condition. */
-	if (sup_dev == con) {
+	if (sup_handle == con_handle) {
 		pr_debug("----- cycle: start -----\n");
 		ret = true;
 		goto out;
 	}
 
+	sup_dev = get_dev_from_fwnode(sup_handle);
+	con_dev = get_dev_from_fwnode(con_handle);
 	/*
 	 * If sup_dev is bound to a driver and @con hasn't started binding to a
 	 * driver, sup_dev can't be a consumer of @con. So, no need to check
 	 * further.
 	 */
 	if (sup_dev && sup_dev->links.status ==  DL_DEV_DRIVER_BOUND &&
-	    con->links.status == DL_DEV_NO_DRIVER) {
+	    con_dev && con_dev->links.status == DL_DEV_NO_DRIVER) {
 		ret = false;
 		goto out;
 	}
@@ -2034,7 +2034,7 @@  static bool __fw_devlink_relax_cycles(struct device *con,
 		if (link->flags & FWLINK_FLAG_IGNORE)
 			continue;
 
-		if (__fw_devlink_relax_cycles(con, link->supplier)) {
+		if (__fw_devlink_relax_cycles(con_handle, link->supplier)) {
 			__fwnode_link_cycle(link);
 			ret = true;
 		}
@@ -2049,7 +2049,7 @@  static bool __fw_devlink_relax_cycles(struct device *con,
 	else
 		par_dev = fwnode_get_next_parent_dev(sup_handle);
 
-	if (par_dev && __fw_devlink_relax_cycles(con, par_dev->fwnode)) {
+	if (par_dev && __fw_devlink_relax_cycles(con_handle, par_dev->fwnode)) {
 		pr_debug("%pfwf: cycle: child of %pfwf\n", sup_handle,
 			 par_dev->fwnode);
 		ret = true;
@@ -2067,7 +2067,7 @@  static bool __fw_devlink_relax_cycles(struct device *con,
 		    !(dev_link->flags & DL_FLAG_CYCLE))
 			continue;
 
-		if (__fw_devlink_relax_cycles(con,
+		if (__fw_devlink_relax_cycles(con_handle,
 					      dev_link->supplier->fwnode)) {
 			pr_debug("%pfwf: cycle: depends on %pfwf\n", sup_handle,
 				 dev_link->supplier->fwnode);
@@ -2140,25 +2140,19 @@  static int fw_devlink_create_devlink(struct device *con,
 		return -EINVAL;
 
 	/*
-	 * SYNC_STATE_ONLY device links don't block probing and supports cycles.
-	 * So, one might expect that cycle detection isn't necessary for them.
-	 * However, if the device link was marked as SYNC_STATE_ONLY because
-	 * it's part of a cycle, then we still need to do cycle detection. This
-	 * is because the consumer and supplier might be part of multiple cycles
-	 * and we need to detect all those cycles.
+	 * Don't try to optimize by not calling the cycle detection logic under
+	 * certain conditions. There's always some corner case that won't get
+	 * detected.
 	 */
-	if (!device_link_flag_is_sync_state_only(flags) ||
-	    flags & DL_FLAG_CYCLE) {
-		device_links_write_lock();
-		if (__fw_devlink_relax_cycles(con, sup_handle)) {
-			__fwnode_link_cycle(link);
-			flags = fw_devlink_get_flags(link->flags);
-			pr_debug("----- cycle: end -----\n");
-			dev_info(con, "Fixed dependency cycle(s) with %pfwf\n",
-				 sup_handle);
-		}
-		device_links_write_unlock();
+	device_links_write_lock();
+	if (__fw_devlink_relax_cycles(link->consumer, sup_handle)) {
+		__fwnode_link_cycle(link);
+		flags = fw_devlink_get_flags(link->flags);
+		pr_debug("----- cycle: end -----\n");
+		pr_info("%pfwf: Fixed dependency cycle(s) with %pfwf\n",
+			link->consumer, sup_handle);
 	}
+	device_links_write_unlock();
 
 	if (sup_handle->flags & FWNODE_FLAG_NOT_DEVICE)
 		sup_dev = fwnode_get_next_parent_dev(sup_handle);