aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDavid Brownell <david-b@pacbell.net>2007-02-13 16:09:00 -0500
committerJean Delvare <khali@arrakis.delvare>2007-02-13 16:09:00 -0500
commitf37dd80ac2a67e4e4e921f99d34a1ceeb2488abb (patch)
treec845e39b24feac331a9a67d49e0b8061f52131b3 /drivers
parentb8d6f45b32f6fe72bf7304183275e99332544ce1 (diff)
i2c: Add driver suspend/resume/shutdown support
Driver model updates for the I2C core: - Add new suspend(), resume(), and shutdown() methods. Use them in the standard driver model style; document them. - Minor doc updates to highlight zero-initialized fields in drivers, and the driver model accessors for "clientdata". If any i2c drivers were previously using the old suspend/resume calls in "struct driver", they were getting warning messages ... and will now no longer work. Other than that, this patch changes no behaviors; and it lets I2C drivers use conventional PM and shutdown support. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Jean Delvare <khali@linux-fr.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/i2c/i2c-core.c65
1 files changed, 44 insertions, 21 deletions
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
index 60f6eb194046..9653f7f81561 100644
--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -41,49 +41,72 @@ static LIST_HEAD(drivers);
41static DEFINE_MUTEX(core_lists); 41static DEFINE_MUTEX(core_lists);
42static DEFINE_IDR(i2c_adapter_idr); 42static DEFINE_IDR(i2c_adapter_idr);
43 43
44
45/* ------------------------------------------------------------------------- */
46
44/* match always succeeds, as we want the probe() to tell if we really accept this match */ 47/* match always succeeds, as we want the probe() to tell if we really accept this match */
45static int i2c_device_match(struct device *dev, struct device_driver *drv) 48static int i2c_device_match(struct device *dev, struct device_driver *drv)
46{ 49{
47 return 1; 50 return 1;
48} 51}
49 52
50static int i2c_bus_suspend(struct device * dev, pm_message_t state) 53static int i2c_device_probe(struct device *dev)
51{ 54{
52 int rc = 0; 55 return -ENODEV;
56}
53 57
54 if (dev->driver && dev->driver->suspend) 58static int i2c_device_remove(struct device *dev)
55 rc = dev->driver->suspend(dev, state); 59{
56 return rc; 60 return 0;
57} 61}
58 62
59static int i2c_bus_resume(struct device * dev) 63static void i2c_device_shutdown(struct device *dev)
60{ 64{
61 int rc = 0; 65 struct i2c_driver *driver;
62 66
63 if (dev->driver && dev->driver->resume) 67 if (!dev->driver)
64 rc = dev->driver->resume(dev); 68 return;
65 return rc; 69 driver = to_i2c_driver(dev->driver);
70 if (driver->shutdown)
71 driver->shutdown(to_i2c_client(dev));
66} 72}
67 73
68static int i2c_device_probe(struct device *dev) 74static int i2c_device_suspend(struct device * dev, pm_message_t mesg)
69{ 75{
70 return -ENODEV; 76 struct i2c_driver *driver;
77
78 if (!dev->driver)
79 return 0;
80 driver = to_i2c_driver(dev->driver);
81 if (!driver->suspend)
82 return 0;
83 return driver->suspend(to_i2c_client(dev), mesg);
71} 84}
72 85
73static int i2c_device_remove(struct device *dev) 86static int i2c_device_resume(struct device * dev)
74{ 87{
75 return 0; 88 struct i2c_driver *driver;
89
90 if (!dev->driver)
91 return 0;
92 driver = to_i2c_driver(dev->driver);
93 if (!driver->resume)
94 return 0;
95 return driver->resume(to_i2c_client(dev));
76} 96}
77 97
78struct bus_type i2c_bus_type = { 98struct bus_type i2c_bus_type = {
79 .name = "i2c", 99 .name = "i2c",
80 .match = i2c_device_match, 100 .match = i2c_device_match,
81 .probe = i2c_device_probe, 101 .probe = i2c_device_probe,
82 .remove = i2c_device_remove, 102 .remove = i2c_device_remove,
83 .suspend = i2c_bus_suspend, 103 .shutdown = i2c_device_shutdown,
84 .resume = i2c_bus_resume, 104 .suspend = i2c_device_suspend,
105 .resume = i2c_device_resume,
85}; 106};
86 107
108/* ------------------------------------------------------------------------- */
109
87void i2c_adapter_dev_release(struct device *dev) 110void i2c_adapter_dev_release(struct device *dev)
88{ 111{
89 struct i2c_adapter *adap = dev_to_i2c_adapter(dev); 112 struct i2c_adapter *adap = dev_to_i2c_adapter(dev);