Hi Saravana, Thanks for your patch! On Thu, Jun 25, 2020 at 5:24 AM Saravana Kannan <saravanak@xxxxxxxxxx> wrote: > Under the following conditions: > - driver A is built in and can probe device-A > - driver B is a module and can probe device-B I think this is not correct: in my case driver B is builtin, too. > - device-A is supplier of device-B > > Without this patch: > 1. device-A is added. > 2. device-B is added. > 3. dpm_list is now [device-A, device-B]. > 4. driver-A defers probe of device-A. > 5. deferred probe of device-A is reattempted I think this is misleading: in my case driver-A did not defer the probe of device-A, and driver-A never returned -EPROBE_DEFER. Probing was merely paused, due to fw_devlink_pause(); > 6. device-A is moved to end of dpm_list. > 6. dpm_list is now [device-B, device-A]. > 7. driver-B is loaded and probes device-B. > 8. dpm_list stays as [device-B, device-A]. > > Suspend (which goes in the reverse order of dpm_list) fails because > device-A (supplier) is suspended before device-B (consumer). > > With this patch: > 1. device-A is added. > 2. device-B is added. > 3. dpm_list is now [device-A, device-B]. > 4. driver-A defers probe of device-A. > 5. deferred probe of device-A is reattempted later. > 6. dpm_list is now [device-B, device-A]. > 7. driver-B is loaded and probes device-B. > 8. dpm_list is now [device-A, device-B]. > > Suspend works because device-B (consumer) is suspended before device-A > (supplier). > > Fixes: 494fd7b7ad10 ("PM / core: fix deferred probe breaking suspend resume order") > Fixes: 716a7a259690 ("driver core: fw_devlink: Add support for batching fwnode parsing") > Cc: Geert Uytterhoeven <geert@xxxxxxxxxxxxxx> > Signed-off-by: Saravana Kannan <saravanak@xxxxxxxxxx> This fixes wake-up by GPIO key on r8a7740/armadillo and sh73a0/kzm9g. Tested-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx> > --- a/drivers/base/dd.c > +++ b/drivers/base/dd.c > @@ -109,6 +109,8 @@ static void deferred_probe_work_func(struct work_struct *work) > * probe makes that very unsafe. > */ > device_pm_move_to_tail(dev); > + /* Greg/Rafael: SHOULD I DELETE THIS? ^^ I think I should, but > + * I'm worried if it'll have some unintended consequeneces. */ Works fine for me with the call to device_pm_move_to_tail() removed, too (at least on the two boards that showed the issue before). Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds