aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/i2c')
-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);