i2c: Fix checks which cause legacy suspend to never get called
For devices which are not adapted to runtime PM a call to pm_runtime_suspended always returns true. Hence the pm_runtime_suspended checks below prevent legacy suspend from getting called. So do a pm_runtime_suspended check only for devices with a dev_pm_ops populated (which hence do not rely on the legacy suspend.) Signed-off-by: Rajendra Nayak <rnayak@ti.com> Acked-by: Rafael J. Wysocki <rjw@sisk.pl> Cc: Ben Dooks <ben-linux@fluff.org> Cc: Mark Brown <broonie@opensource.wolfsonmicro.com> Cc: Kevin Hilman <khilman@deeprootsystems.com> Signed-off-by: Jean Delvare <khali@linux-fr.org>
This commit is contained in:
committed by
Jean Delvare
parent
6abb930af0
commit
64b4782fc9
@@ -197,11 +197,12 @@ static int i2c_device_pm_suspend(struct device *dev)
|
|||||||
{
|
{
|
||||||
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
||||||
|
|
||||||
|
if (pm) {
|
||||||
if (pm_runtime_suspended(dev))
|
if (pm_runtime_suspended(dev))
|
||||||
return 0;
|
return 0;
|
||||||
|
else
|
||||||
if (pm)
|
|
||||||
return pm->suspend ? pm->suspend(dev) : 0;
|
return pm->suspend ? pm->suspend(dev) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
return i2c_legacy_suspend(dev, PMSG_SUSPEND);
|
return i2c_legacy_suspend(dev, PMSG_SUSPEND);
|
||||||
}
|
}
|
||||||
@@ -223,11 +224,12 @@ static int i2c_device_pm_freeze(struct device *dev)
|
|||||||
{
|
{
|
||||||
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
||||||
|
|
||||||
|
if (pm) {
|
||||||
if (pm_runtime_suspended(dev))
|
if (pm_runtime_suspended(dev))
|
||||||
return 0;
|
return 0;
|
||||||
|
else
|
||||||
if (pm)
|
|
||||||
return pm->freeze ? pm->freeze(dev) : 0;
|
return pm->freeze ? pm->freeze(dev) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
return i2c_legacy_suspend(dev, PMSG_FREEZE);
|
return i2c_legacy_suspend(dev, PMSG_FREEZE);
|
||||||
}
|
}
|
||||||
@@ -236,11 +238,12 @@ static int i2c_device_pm_thaw(struct device *dev)
|
|||||||
{
|
{
|
||||||
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
||||||
|
|
||||||
|
if (pm) {
|
||||||
if (pm_runtime_suspended(dev))
|
if (pm_runtime_suspended(dev))
|
||||||
return 0;
|
return 0;
|
||||||
|
else
|
||||||
if (pm)
|
|
||||||
return pm->thaw ? pm->thaw(dev) : 0;
|
return pm->thaw ? pm->thaw(dev) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
return i2c_legacy_resume(dev);
|
return i2c_legacy_resume(dev);
|
||||||
}
|
}
|
||||||
@@ -249,11 +252,12 @@ static int i2c_device_pm_poweroff(struct device *dev)
|
|||||||
{
|
{
|
||||||
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
||||||
|
|
||||||
|
if (pm) {
|
||||||
if (pm_runtime_suspended(dev))
|
if (pm_runtime_suspended(dev))
|
||||||
return 0;
|
return 0;
|
||||||
|
else
|
||||||
if (pm)
|
|
||||||
return pm->poweroff ? pm->poweroff(dev) : 0;
|
return pm->poweroff ? pm->poweroff(dev) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
return i2c_legacy_suspend(dev, PMSG_HIBERNATE);
|
return i2c_legacy_suspend(dev, PMSG_HIBERNATE);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user