mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 19:26:25 +00:00
i2c-core: i2c bus should support PM entries in struct dev_pm_ops
Struct dev_pm_ops is not configured in current i2c bus type. i2c drivers only depends on suspend/resume entries in struct dev_pm_ops are not informed of PM suspend and resume events by i2c framework. Signed-off-by: Sonic Zhang <sonic.zhang@analog.com> Signed-off-by: Jean Delvare <khali@linux-fr.org>
This commit is contained in:
parent
7f508118b1
commit
54067ee206
1 changed files with 35 additions and 0 deletions
|
@ -155,6 +155,35 @@ static void i2c_device_shutdown(struct device *dev)
|
||||||
driver->shutdown(client);
|
driver->shutdown(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SUSPEND
|
||||||
|
static int i2c_device_pm_suspend(struct device *dev)
|
||||||
|
{
|
||||||
|
const struct dev_pm_ops *pm;
|
||||||
|
|
||||||
|
if (!dev->driver)
|
||||||
|
return 0;
|
||||||
|
pm = dev->driver->pm;
|
||||||
|
if (!pm || !pm->suspend)
|
||||||
|
return 0;
|
||||||
|
return pm->suspend(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int i2c_device_pm_resume(struct device *dev)
|
||||||
|
{
|
||||||
|
const struct dev_pm_ops *pm;
|
||||||
|
|
||||||
|
if (!dev->driver)
|
||||||
|
return 0;
|
||||||
|
pm = dev->driver->pm;
|
||||||
|
if (!pm || !pm->resume)
|
||||||
|
return 0;
|
||||||
|
return pm->resume(dev);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define i2c_device_pm_suspend NULL
|
||||||
|
#define i2c_device_pm_resume NULL
|
||||||
|
#endif
|
||||||
|
|
||||||
static int i2c_device_suspend(struct device *dev, pm_message_t mesg)
|
static int i2c_device_suspend(struct device *dev, pm_message_t mesg)
|
||||||
{
|
{
|
||||||
struct i2c_client *client = i2c_verify_client(dev);
|
struct i2c_client *client = i2c_verify_client(dev);
|
||||||
|
@ -219,6 +248,11 @@ static const struct attribute_group *i2c_dev_attr_groups[] = {
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const static struct dev_pm_ops i2c_device_pm_ops = {
|
||||||
|
.suspend = i2c_device_pm_suspend,
|
||||||
|
.resume = i2c_device_pm_resume,
|
||||||
|
};
|
||||||
|
|
||||||
struct bus_type i2c_bus_type = {
|
struct bus_type i2c_bus_type = {
|
||||||
.name = "i2c",
|
.name = "i2c",
|
||||||
.match = i2c_device_match,
|
.match = i2c_device_match,
|
||||||
|
@ -227,6 +261,7 @@ struct bus_type i2c_bus_type = {
|
||||||
.shutdown = i2c_device_shutdown,
|
.shutdown = i2c_device_shutdown,
|
||||||
.suspend = i2c_device_suspend,
|
.suspend = i2c_device_suspend,
|
||||||
.resume = i2c_device_resume,
|
.resume = i2c_device_resume,
|
||||||
|
.pm = &i2c_device_pm_ops,
|
||||||
};
|
};
|
||||||
EXPORT_SYMBOL_GPL(i2c_bus_type);
|
EXPORT_SYMBOL_GPL(i2c_bus_type);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue