[PATCH 1/2] Documentation: i2c: Use PM ops instead of legacy suspend/resume

2014-11-30 Thread Lars-Peter Clausen
New drivers should use PM ops instead of the legacy suspend/resume
callbacks. Update the I2C device driver guides to reflect this.

Signed-off-by: Lars-Peter Clausen l...@metafoo.de
---
 Documentation/i2c/upgrading-clients | 6 ++
 Documentation/i2c/writing-clients   | 8 
 2 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/Documentation/i2c/upgrading-clients 
b/Documentation/i2c/upgrading-clients
index 8e5fbd8..ccba3ff 100644
--- a/Documentation/i2c/upgrading-clients
+++ b/Documentation/i2c/upgrading-clients
@@ -79,11 +79,10 @@ static struct i2c_driver example_driver = {
.driver = {
.owner  = THIS_MODULE,
.name   = example,
+   .pm = example_pm_ops,
},
.attach_adapter = example_attach_adapter,
.detach_client  = example_detach,
-   .suspend= example_suspend,
-   .resume = example_resume,
 };
 
 
@@ -272,10 +271,9 @@ static struct i2c_driver example_driver = {
.driver = {
.owner  = THIS_MODULE,
.name   = example,
+   .pm = example_pm_ops,
},
.id_table   = example_idtable,
.probe  = example_probe,
.remove = example_remove,
-   .suspend= example_suspend,
-   .resume = example_resume,
 };
diff --git a/Documentation/i2c/writing-clients 
b/Documentation/i2c/writing-clients
index 6b344b5..a755b14 100644
--- a/Documentation/i2c/writing-clients
+++ b/Documentation/i2c/writing-clients
@@ -36,6 +36,7 @@ MODULE_DEVICE_TABLE(i2c, foo_idtable);
 static struct i2c_driver foo_driver = {
.driver = {
.name   = foo,
+   .pm = foo_pm_ops,  /* optional */
},
 
.id_table   = foo_idtable,
@@ -47,8 +48,6 @@ static struct i2c_driver foo_driver = {
.address_list   = normal_i2c,
 
.shutdown   = foo_shutdown, /* optional */
-   .suspend= foo_suspend,  /* optional */
-   .resume = foo_resume,   /* optional */
.command= foo_command,  /* optional, deprecated */
 }
 
@@ -279,8 +278,9 @@ Power Management
 
 If your I2C device needs special handling when entering a system low
 power state -- like putting a transceiver into a low power mode, or
-activating a system wakeup mechanism -- do that in the suspend() method.
-The resume() method should reverse what the suspend() method does.
+activating a system wakeup mechanism -- do that by implementing the
+appropriate callbacks for the dev_pm_ops of the driver (like suspend
+and resume).
 
 These are standard driver model calls, and they work just like they
 would for any other driver stack.  The calls can sleep, and can use
-- 
1.8.0

--
To unsubscribe from this list: send the line unsubscribe linux-i2c in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 2/2] i2c: Remove support for legacy PM

2014-11-30 Thread Lars-Peter Clausen
There haven't been any I2C driver that use the legacy suspend/resume
callbacks for a while now and new drivers are supposed to use PM ops. So
remove support for legacy suspend/resume for I2C drivers.

Since there aren't any special bus specific things to do during
suspend/resume and since the PM core will automatically fallback directly to
using the device's PM ops if no bus PM ops are specified there is no need to
have any I2C bus PM ops.

Signed-off-by: Lars-Peter Clausen l...@metafoo.de
---
 drivers/i2c/i2c-core.c | 118 -
 include/linux/i2c.h|   4 --
 2 files changed, 122 deletions(-)

diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
index 3105bd2..f23c03b 100644
--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -695,101 +695,6 @@ static void i2c_device_shutdown(struct device *dev)
driver-shutdown(client);
 }
 
-#ifdef CONFIG_PM_SLEEP
-static int i2c_legacy_suspend(struct device *dev, pm_message_t mesg)
-{
-   struct i2c_client *client = i2c_verify_client(dev);
-   struct i2c_driver *driver;
-
-   if (!client || !dev-driver)
-   return 0;
-   driver = to_i2c_driver(dev-driver);
-   if (!driver-suspend)
-   return 0;
-   return driver-suspend(client, mesg);
-}
-
-static int i2c_legacy_resume(struct device *dev)
-{
-   struct i2c_client *client = i2c_verify_client(dev);
-   struct i2c_driver *driver;
-
-   if (!client || !dev-driver)
-   return 0;
-   driver = to_i2c_driver(dev-driver);
-   if (!driver-resume)
-   return 0;
-   return driver-resume(client);
-}
-
-static int i2c_device_pm_suspend(struct device *dev)
-{
-   const struct dev_pm_ops *pm = dev-driver ? dev-driver-pm : NULL;
-
-   if (pm)
-   return pm_generic_suspend(dev);
-   else
-   return i2c_legacy_suspend(dev, PMSG_SUSPEND);
-}
-
-static int i2c_device_pm_resume(struct device *dev)
-{
-   const struct dev_pm_ops *pm = dev-driver ? dev-driver-pm : NULL;
-
-   if (pm)
-   return pm_generic_resume(dev);
-   else
-   return i2c_legacy_resume(dev);
-}
-
-static int i2c_device_pm_freeze(struct device *dev)
-{
-   const struct dev_pm_ops *pm = dev-driver ? dev-driver-pm : NULL;
-
-   if (pm)
-   return pm_generic_freeze(dev);
-   else
-   return i2c_legacy_suspend(dev, PMSG_FREEZE);
-}
-
-static int i2c_device_pm_thaw(struct device *dev)
-{
-   const struct dev_pm_ops *pm = dev-driver ? dev-driver-pm : NULL;
-
-   if (pm)
-   return pm_generic_thaw(dev);
-   else
-   return i2c_legacy_resume(dev);
-}
-
-static int i2c_device_pm_poweroff(struct device *dev)
-{
-   const struct dev_pm_ops *pm = dev-driver ? dev-driver-pm : NULL;
-
-   if (pm)
-   return pm_generic_poweroff(dev);
-   else
-   return i2c_legacy_suspend(dev, PMSG_HIBERNATE);
-}
-
-static int i2c_device_pm_restore(struct device *dev)
-{
-   const struct dev_pm_ops *pm = dev-driver ? dev-driver-pm : NULL;
-
-   if (pm)
-   return pm_generic_restore(dev);
-   else
-   return i2c_legacy_resume(dev);
-}
-#else /* !CONFIG_PM_SLEEP */
-#define i2c_device_pm_suspend  NULL
-#define i2c_device_pm_resume   NULL
-#define i2c_device_pm_freeze   NULL
-#define i2c_device_pm_thaw NULL
-#define i2c_device_pm_poweroff NULL
-#define i2c_device_pm_restore  NULL
-#endif /* !CONFIG_PM_SLEEP */
-
 static void i2c_client_dev_release(struct device *dev)
 {
kfree(to_i2c_client(dev));
@@ -834,27 +739,12 @@ static const struct attribute_group 
*i2c_dev_attr_groups[] = {
NULL
 };
 
-static const struct dev_pm_ops i2c_device_pm_ops = {
-   .suspend = i2c_device_pm_suspend,
-   .resume = i2c_device_pm_resume,
-   .freeze = i2c_device_pm_freeze,
-   .thaw = i2c_device_pm_thaw,
-   .poweroff = i2c_device_pm_poweroff,
-   .restore = i2c_device_pm_restore,
-   SET_RUNTIME_PM_OPS(
-   pm_generic_runtime_suspend,
-   pm_generic_runtime_resume,
-   NULL
-   )
-};
-
 struct bus_type i2c_bus_type = {
.name   = i2c,
.match  = i2c_device_match,
.probe  = i2c_device_probe,
.remove = i2c_device_remove,
.shutdown   = i2c_device_shutdown,
-   .pm = i2c_device_pm_ops,
 };
 EXPORT_SYMBOL_GPL(i2c_bus_type);
 
@@ -1850,14 +1740,6 @@ int i2c_register_driver(struct module *owner, struct 
i2c_driver *driver)
if (res)
return res;
 
-   /* Drivers should switch to dev_pm_ops instead. */
-   if (driver-suspend)
-   pr_warn(i2c-core: driver [%s] using legacy suspend method\n,
-   driver-driver.name);
-   if (driver-resume)
-   pr_warn(i2c-core: driver [%s] using legacy resume method\n,
-