Dropping Feng and Toan due to mail bounces. On Thu, Jun 25, 2020 at 1:58 AM Geert Uytterhoeven <geert@xxxxxxxxxxxxxx> wrote: > > 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. This is a correct example, it just doesn't match with your case :) Talking about fw_devlink_pause/resume() just distracts from the real issue that's also present in systems that don't use DT. You have this problem even on an ACPI system -- distributions loading all the modules in a PC. We want suspend/resume to work for those too. So, I'm just going for a simpler example. > > - 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(); What I said above. fw_devlink_pause() just defers the probe for the device -- that's how it pauses and resumes probing. For example, device link can defer the probe for a device without ever getting to the driver too. > > 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> Thanks! > > > --- 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). Yes, it feels right to remove this, but I just wanted to get a few more opinions. -Saravana