lkml.org 
[lkml]   [2014]   [Jan]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH] i2c-designware-pcidrv: fix the incorrect return of idle callback
On Wed, Jan 29, 2014 at 06:00:26PM +0800, xinhui.pan wrote:
>
>
> 于 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@intel.com>
> >>>
> >>> 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@intel.com>
> >>> Signed-off-by: xinhui.pan <xinhuix.pan@intel.com>
> >>> ---
> >>> 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.

To be honest, I don't know ;-)

> > 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.

OK, so if this is not a problem, I would suggest keeping the code as is for
now as someone who introduced the pm_schedule_suspend() thing probably
tested it and it worked then.

In fact, I think that the PCI part of that driver needs an audit since it
does some PCI power management magic itself which drivers aren't supposed
to do anymore.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2014-01-29 11:41    [W:0.078 / U:3.184 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site