> -----Original Message----- > From: Leonard Crestez > Sent: Monday, September 3, 2018 6:16 PM > To: Anson Huang <anson.huang@xxxxxxx>; A.s. Dong > <aisheng.dong@xxxxxxx> > Cc: Ranjani Vaidyanathan <ranjani.vaidyanathan@xxxxxxx>; Nitin Garg > <nitin.garg@xxxxxxx>; Jason Liu <jason.hui.liu@xxxxxxx>; Pete Zhang > <pete.zhang@xxxxxxx>; Eagle Zhou <eagle.zhou@xxxxxxx>; LnxRevLi > <LnxRevLi@xxxxxxx>; Ulf Hansson <ulf.hansson@xxxxxxxxxx>; v4 . 11+ > <stable@xxxxxxxxxxxxxxx>; Rafael J . Wysocki <rafael.j.wysocki@xxxxxxxxx> > Subject: [PATCH imx_4.9.y 1/2] PM / Domains: Fix error path during attach in > genpd > > From: Ulf Hansson <ulf.hansson@xxxxxxxxxx> > > In case the PM domain fails to be powered on in genpd_dev_pm_attach(), it > returns -EPROBE_DEFER, but keeping the device attached to its PM domain. > This leads to problems when the next attempt to attach is re-tried. More > precisely, in that situation an -EEXIST error code is returned, because the device > already has its PM domain pointer assigned, from the first attempt. > > Now, because of the sloppy error handling by the existing callers of > dev_pm_domain_attach(), probing is allowed to continue when -EEXIST is > returned. However, in such case there are no guarantees that the PM domain is > powered on by genpd, which may lead to hangs when buses/drivers tried to > access their devices. > > Let's fix this behaviour, simply by detaching the device when powering on fails > in genpd_dev_pm_attach(). > > Cc: v4.11+ <stable@xxxxxxxxxxxxxxx> # v4.11+ Although this patch is stated only needed for v4.11+, but it seems to me 4.9 has the same issue and also needs it. Reviewed-by: Dong Aisheng <Aisheng.dong@xxxxxxx> Hi Leonard, I guess you could also try to send it to 4.9 LTS kernel maillist to test maintainer later. Regards Dong Aisheng > Signed-off-by: Ulf Hansson <ulf.hansson@xxxxxxxxxx> > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx> > > (cherry picked from commit 72038df3c580c4c326b83c86149d7ac34007532a) > > Cherry-picked to imx_4.9.y with minimal conflicts so that we can properly > handle errors from SCFW pm calls > Signed-off-by: Leonard Crestez <leonard.crestez@xxxxxxx> > --- > drivers/base/power/domain.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index > 9c3e535795a0..d9681d372997 100644 > --- a/drivers/base/power/domain.c > +++ b/drivers/base/power/domain.c > @@ -1936,10 +1936,13 @@ int genpd_dev_pm_attach(struct device *dev) > dev->pm_domain->sync = genpd_dev_pm_sync; > > mutex_lock(&pd->lock); > ret = genpd_poweron(pd, 0); > mutex_unlock(&pd->lock); > + > + if (ret) > + genpd_remove_device(pd, dev); > out: > return ret ? -EPROBE_DEFER : 0; > } > EXPORT_SYMBOL_GPL(genpd_dev_pm_attach); > #endif /* CONFIG_PM_GENERIC_DOMAINS_OF */ > -- > 2.17.1