于 2014年01月29日 16:35, Mika Westerberg 写道: > On Tue, Jan 28, 2014 at 07:30:35PM +0100, Wolfram Sang wrote: >> On Tue, Jan 28, 2014 at 01:48:28PM +0800, xinhui.pan wrote: >>> From: "xinhui.pan" <xinhuix.pan@xxxxxxxxx> >>> >>> i2c_dw_pci_runtime_idle should return -EBUSY rather than zero if it do success. >> >> I don't understand... >> >>> Otherwise rpm_idle will call pm_suspend again and that may cause pm_schedule_suspend delay invalidate. >>> >>> Signed-off-by: bo.he <bo.he@xxxxxxxxx> >>> Signed-off-by: xinhui.pan <xinhuix.pan@xxxxxxxxx> >>> --- >>> drivers/i2c/busses/i2c-designware-pcidrv.c | 4 ++-- >>> 1 file changed, 2 insertions(+), 2 deletions(-) >>> >>> diff --git a/drivers/i2c/busses/i2c-designware-pcidrv.c b/drivers/i2c/busses/i2c-designware-pcidrv.c >>> index f6ed06c..96e81f6 100644 >>> --- a/drivers/i2c/busses/i2c-designware-pcidrv.c >>> +++ b/drivers/i2c/busses/i2c-designware-pcidrv.c >>> @@ -190,8 +190,8 @@ static int i2c_dw_pci_runtime_idle(struct device *dev) >>> int err = pm_schedule_suspend(dev, 500); >>> dev_dbg(dev, "runtime_idle called\n"); >>> >>> - if (err != 0) >>> - return 0; >>> + if (err) >>> + return err; >>> return -EBUSY; >> >> ... it does return EBUSY when pm_schedule_suspend() succeeds? It only >> returns 0 if it does not succeed (for which I don't know if this is an >> apropriate behaviour). Mika? > > If I understand correctly, pm_schedule_suspend(dev, 500) is there because > we want to runtime suspend in 500 ms. It then returns -EBUSY to prevent PM > runtime from carrying on suspend on it's own. However, I have no idea where > this magical 500 ms requirement comes from. > > If we fail to schedule suspend we let the PM core to do whatever it thinks > suitable (in this case I suppose it suspends the device). > Hi ,Mika If the callback returns 0,it means pm_schedule_suspend fails, also means rpm_check_suspend_allowed(pm_schedule_suspend calls it) returns nonzero value.As a result,rpm_suspend will be called by rpm_idle. However in rpm_idle, rpm_check_suspend_allowed is called at first,too. and the return value is treated as it is.But rpm_idle just returns without doing anything(rpm_suspend is not called). in both case above,why goes in different ways? I am confused. > I think the whole idle dance could be replaced with a use of runtime PM > autosuspend, just like we do in the platform version of the driver. > > Xinghui, > > Is this a real problem that you are trying to solve? > To be honest,we got many panic when testing. But is not caused by this driver I think. while checking problems,we found these confusing codes by accident. -- To unsubscribe from this list: send the line "unsubscribe linux-i2c" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html