blob: 3e31f1d265c9e7d403d57a19ac87d7a4c4c443bd [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/* i2c-core.c - a device driver for the iic-bus interface */
2/* ------------------------------------------------------------------------- */
3/* Copyright (C) 1995-99 Simon G. Vogl
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
18/* ------------------------------------------------------------------------- */
19
20/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi>.
21 All SMBus-related things are written by Frodo Looijaard <frodol@dds.nl>
Jean Delvare421ef472005-10-26 21:28:55 +020022 SMBus 2.0 support by Mark Studebaker <mdsxyz123@yahoo.com> and
23 Jean Delvare <khali@linux-fr.org> */
Linus Torvalds1da177e2005-04-16 15:20:36 -070024
Linus Torvalds1da177e2005-04-16 15:20:36 -070025#include <linux/module.h>
26#include <linux/kernel.h>
27#include <linux/errno.h>
28#include <linux/slab.h>
29#include <linux/i2c.h>
30#include <linux/init.h>
31#include <linux/idr.h>
32#include <linux/seq_file.h>
Russell Kingd052d1b2005-10-29 19:07:23 +010033#include <linux/platform_device.h>
Arjan van de Venb3585e42006-01-11 10:50:26 +010034#include <linux/mutex.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070035#include <asm/uaccess.h>
36
37
38static LIST_HEAD(adapters);
39static LIST_HEAD(drivers);
Arjan van de Venb3585e42006-01-11 10:50:26 +010040static DEFINE_MUTEX(core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -070041static DEFINE_IDR(i2c_adapter_idr);
42
43/* match always succeeds, as we want the probe() to tell if we really accept this match */
44static int i2c_device_match(struct device *dev, struct device_driver *drv)
45{
46 return 1;
47}
48
49static int i2c_bus_suspend(struct device * dev, pm_message_t state)
50{
51 int rc = 0;
52
53 if (dev->driver && dev->driver->suspend)
Russell King9480e302005-10-28 09:52:56 -070054 rc = dev->driver->suspend(dev, state);
Linus Torvalds1da177e2005-04-16 15:20:36 -070055 return rc;
56}
57
58static int i2c_bus_resume(struct device * dev)
59{
60 int rc = 0;
61
62 if (dev->driver && dev->driver->resume)
Russell King9480e302005-10-28 09:52:56 -070063 rc = dev->driver->resume(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -070064 return rc;
65}
66
Linus Torvalds1da177e2005-04-16 15:20:36 -070067static int i2c_device_probe(struct device *dev)
68{
69 return -ENODEV;
70}
71
72static int i2c_device_remove(struct device *dev)
73{
74 return 0;
75}
76
Russell Kingb864c7d2006-01-05 14:37:50 +000077struct bus_type i2c_bus_type = {
78 .name = "i2c",
79 .match = i2c_device_match,
80 .probe = i2c_device_probe,
81 .remove = i2c_device_remove,
82 .suspend = i2c_bus_suspend,
83 .resume = i2c_bus_resume,
84};
85
Jean Delvareefde7232005-07-20 23:03:50 +020086void i2c_adapter_dev_release(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -070087{
88 struct i2c_adapter *adap = dev_to_i2c_adapter(dev);
89 complete(&adap->dev_released);
90}
91
Jean Delvareefde7232005-07-20 23:03:50 +020092struct device_driver i2c_adapter_driver = {
Laurent Riffard6586bcd2005-10-17 22:54:45 +020093 .owner = THIS_MODULE,
Linus Torvalds1da177e2005-04-16 15:20:36 -070094 .name = "i2c_adapter",
95 .bus = &i2c_bus_type,
Linus Torvalds1da177e2005-04-16 15:20:36 -070096};
97
98static void i2c_adapter_class_dev_release(struct class_device *dev)
99{
100 struct i2c_adapter *adap = class_dev_to_i2c_adapter(dev);
101 complete(&adap->class_dev_released);
102}
103
Jean Delvareefde7232005-07-20 23:03:50 +0200104struct class i2c_adapter_class = {
Laurent Riffard6586bcd2005-10-17 22:54:45 +0200105 .owner = THIS_MODULE,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700106 .name = "i2c-adapter",
107 .release = &i2c_adapter_class_dev_release,
108};
109
Yani Ioannoue404e272005-05-17 06:42:58 -0400110static ssize_t show_adapter_name(struct device *dev, struct device_attribute *attr, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700111{
112 struct i2c_adapter *adap = dev_to_i2c_adapter(dev);
113 return sprintf(buf, "%s\n", adap->name);
114}
115static DEVICE_ATTR(name, S_IRUGO, show_adapter_name, NULL);
116
117
118static void i2c_client_release(struct device *dev)
119{
120 struct i2c_client *client = to_i2c_client(dev);
121 complete(&client->released);
122}
123
Yani Ioannoue404e272005-05-17 06:42:58 -0400124static ssize_t show_client_name(struct device *dev, struct device_attribute *attr, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700125{
126 struct i2c_client *client = to_i2c_client(dev);
127 return sprintf(buf, "%s\n", client->name);
128}
129
David Brownell438d6c22006-12-10 21:21:31 +0100130/*
Jean Delvare7b77d062006-12-10 21:21:31 +0100131 * We can't use the DEVICE_ATTR() macro here, as we used the same name for
132 * an i2c adapter attribute (above).
Linus Torvalds1da177e2005-04-16 15:20:36 -0700133 */
Jean Delvare7b77d062006-12-10 21:21:31 +0100134static struct device_attribute dev_attr_client_name =
135 __ATTR(name, S_IRUGO, &show_client_name, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700136
137
138/* ---------------------------------------------------
David Brownell438d6c22006-12-10 21:21:31 +0100139 * registering functions
140 * ---------------------------------------------------
Linus Torvalds1da177e2005-04-16 15:20:36 -0700141 */
142
143/* -----
144 * i2c_add_adapter is called from within the algorithm layer,
145 * when a new hw adapter registers. A new device is register to be
146 * available for clients.
147 */
148int i2c_add_adapter(struct i2c_adapter *adap)
149{
150 int id, res = 0;
151 struct list_head *item;
152 struct i2c_driver *driver;
153
Arjan van de Venb3585e42006-01-11 10:50:26 +0100154 mutex_lock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700155
156 if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) == 0) {
157 res = -ENOMEM;
158 goto out_unlock;
159 }
160
Mark M. Hoffmana0920e12005-06-28 00:21:30 -0400161 res = idr_get_new(&i2c_adapter_idr, adap, &id);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700162 if (res < 0) {
163 if (res == -EAGAIN)
164 res = -ENOMEM;
165 goto out_unlock;
166 }
167
168 adap->nr = id & MAX_ID_MASK;
Ingo Molnar5c085d32006-01-18 23:16:04 +0100169 mutex_init(&adap->bus_lock);
170 mutex_init(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700171 list_add_tail(&adap->list,&adapters);
172 INIT_LIST_HEAD(&adap->clients);
173
174 /* Add the adapter to the driver core.
175 * If the parent pointer is not set up,
176 * we add this adapter to the host bus.
177 */
178 if (adap->dev.parent == NULL)
179 adap->dev.parent = &platform_bus;
180 sprintf(adap->dev.bus_id, "i2c-%d", adap->nr);
181 adap->dev.driver = &i2c_adapter_driver;
182 adap->dev.release = &i2c_adapter_dev_release;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200183 res = device_register(&adap->dev);
184 if (res)
185 goto out_list;
186 res = device_create_file(&adap->dev, &dev_attr_name);
187 if (res)
188 goto out_unregister;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700189
190 /* Add this adapter to the i2c_adapter class */
191 memset(&adap->class_dev, 0x00, sizeof(struct class_device));
192 adap->class_dev.dev = &adap->dev;
193 adap->class_dev.class = &i2c_adapter_class;
194 strlcpy(adap->class_dev.class_id, adap->dev.bus_id, BUS_ID_SIZE);
Jean Delvareb119c6c2006-08-15 18:26:30 +0200195 res = class_device_register(&adap->class_dev);
196 if (res)
197 goto out_remove_name;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700198
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200199 dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name);
200
Linus Torvalds1da177e2005-04-16 15:20:36 -0700201 /* inform drivers of new adapters */
202 list_for_each(item,&drivers) {
203 driver = list_entry(item, struct i2c_driver, list);
Jean Delvare8a994752005-11-26 20:28:06 +0100204 if (driver->attach_adapter)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700205 /* We ignore the return code; if it fails, too bad */
206 driver->attach_adapter(adap);
207 }
208
Linus Torvalds1da177e2005-04-16 15:20:36 -0700209out_unlock:
Arjan van de Venb3585e42006-01-11 10:50:26 +0100210 mutex_unlock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211 return res;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200212
213out_remove_name:
214 device_remove_file(&adap->dev, &dev_attr_name);
215out_unregister:
216 init_completion(&adap->dev_released); /* Needed? */
217 device_unregister(&adap->dev);
218 wait_for_completion(&adap->dev_released);
219out_list:
220 list_del(&adap->list);
221 idr_remove(&i2c_adapter_idr, adap->nr);
222 goto out_unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700223}
224
225
226int i2c_del_adapter(struct i2c_adapter *adap)
227{
228 struct list_head *item, *_n;
229 struct i2c_adapter *adap_from_list;
230 struct i2c_driver *driver;
231 struct i2c_client *client;
232 int res = 0;
233
Arjan van de Venb3585e42006-01-11 10:50:26 +0100234 mutex_lock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700235
236 /* First make sure that this adapter was ever added */
237 list_for_each_entry(adap_from_list, &adapters, list) {
238 if (adap_from_list == adap)
239 break;
240 }
241 if (adap_from_list != adap) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200242 pr_debug("i2c-core: attempting to delete unregistered "
243 "adapter [%s]\n", adap->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700244 res = -EINVAL;
245 goto out_unlock;
246 }
247
248 list_for_each(item,&drivers) {
249 driver = list_entry(item, struct i2c_driver, list);
250 if (driver->detach_adapter)
251 if ((res = driver->detach_adapter(adap))) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200252 dev_err(&adap->dev, "detach_adapter failed "
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100253 "for driver [%s]\n",
254 driver->driver.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700255 goto out_unlock;
256 }
257 }
258
259 /* detach any active clients. This must be done first, because
Tobias Klausera551acc2005-05-19 21:40:38 +0200260 * it can fail; in which case we give up. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700261 list_for_each_safe(item, _n, &adap->clients) {
262 client = list_entry(item, struct i2c_client, list);
263
Linus Torvalds1da177e2005-04-16 15:20:36 -0700264 if ((res=client->driver->detach_client(client))) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200265 dev_err(&adap->dev, "detach_client failed for client "
266 "[%s] at address 0x%02x\n", client->name,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700267 client->addr);
268 goto out_unlock;
269 }
270 }
271
272 /* clean up the sysfs representation */
273 init_completion(&adap->dev_released);
274 init_completion(&adap->class_dev_released);
275 class_device_unregister(&adap->class_dev);
276 device_remove_file(&adap->dev, &dev_attr_name);
277 device_unregister(&adap->dev);
278 list_del(&adap->list);
279
280 /* wait for sysfs to drop all references */
281 wait_for_completion(&adap->dev_released);
282 wait_for_completion(&adap->class_dev_released);
283
284 /* free dynamically allocated bus id */
285 idr_remove(&i2c_adapter_idr, adap->nr);
286
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200287 dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700288
289 out_unlock:
Arjan van de Venb3585e42006-01-11 10:50:26 +0100290 mutex_unlock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700291 return res;
292}
293
294
295/* -----
296 * What follows is the "upwards" interface: commands for talking to clients,
297 * which implement the functions to access the physical information of the
298 * chips.
299 */
300
Greg Kroah-Hartmande59cf92005-12-06 15:33:15 -0800301int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700302{
303 struct list_head *item;
304 struct i2c_adapter *adapter;
Jean Delvare7eebcb72006-02-05 23:28:21 +0100305 int res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700306
307 /* add the driver to the list of i2c drivers in the driver core */
Greg Kroah-Hartmande59cf92005-12-06 15:33:15 -0800308 driver->driver.owner = owner;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700309 driver->driver.bus = &i2c_bus_type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700310
311 res = driver_register(&driver->driver);
312 if (res)
Jean Delvare7eebcb72006-02-05 23:28:21 +0100313 return res;
David Brownell438d6c22006-12-10 21:21:31 +0100314
Jean Delvare7eebcb72006-02-05 23:28:21 +0100315 mutex_lock(&core_lists);
316
Linus Torvalds1da177e2005-04-16 15:20:36 -0700317 list_add_tail(&driver->list,&drivers);
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100318 pr_debug("i2c-core: driver [%s] registered\n", driver->driver.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700319
320 /* now look for instances of driver on our adapters */
Jean Delvare8a994752005-11-26 20:28:06 +0100321 if (driver->attach_adapter) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700322 list_for_each(item,&adapters) {
323 adapter = list_entry(item, struct i2c_adapter, list);
324 driver->attach_adapter(adapter);
325 }
326 }
327
Arjan van de Venb3585e42006-01-11 10:50:26 +0100328 mutex_unlock(&core_lists);
Jean Delvare7eebcb72006-02-05 23:28:21 +0100329 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700330}
Greg Kroah-Hartmande59cf92005-12-06 15:33:15 -0800331EXPORT_SYMBOL(i2c_register_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700332
333int i2c_del_driver(struct i2c_driver *driver)
334{
335 struct list_head *item1, *item2, *_n;
336 struct i2c_client *client;
337 struct i2c_adapter *adap;
David Brownell438d6c22006-12-10 21:21:31 +0100338
Linus Torvalds1da177e2005-04-16 15:20:36 -0700339 int res = 0;
340
Arjan van de Venb3585e42006-01-11 10:50:26 +0100341 mutex_lock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700342
343 /* Have a look at each adapter, if clients of this driver are still
David Brownell438d6c22006-12-10 21:21:31 +0100344 * attached. If so, detach them to be able to kill the driver
Linus Torvalds1da177e2005-04-16 15:20:36 -0700345 * afterwards.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700346 */
347 list_for_each(item1,&adapters) {
348 adap = list_entry(item1, struct i2c_adapter, list);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700349 if (driver->detach_adapter) {
350 if ((res = driver->detach_adapter(adap))) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200351 dev_err(&adap->dev, "detach_adapter failed "
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100352 "for driver [%s]\n",
353 driver->driver.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700354 goto out_unlock;
355 }
356 } else {
357 list_for_each_safe(item2, _n, &adap->clients) {
358 client = list_entry(item2, struct i2c_client, list);
359 if (client->driver != driver)
360 continue;
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200361 dev_dbg(&adap->dev, "detaching client [%s] "
362 "at 0x%02x\n", client->name,
363 client->addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700364 if ((res = driver->detach_client(client))) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200365 dev_err(&adap->dev, "detach_client "
366 "failed for client [%s] at "
367 "0x%02x\n", client->name,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700368 client->addr);
369 goto out_unlock;
370 }
371 }
372 }
373 }
374
375 driver_unregister(&driver->driver);
376 list_del(&driver->list);
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100377 pr_debug("i2c-core: driver [%s] unregistered\n", driver->driver.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700378
379 out_unlock:
Arjan van de Venb3585e42006-01-11 10:50:26 +0100380 mutex_unlock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700381 return 0;
382}
383
384static int __i2c_check_addr(struct i2c_adapter *adapter, unsigned int addr)
385{
386 struct list_head *item;
387 struct i2c_client *client;
388
389 list_for_each(item,&adapter->clients) {
390 client = list_entry(item, struct i2c_client, list);
391 if (client->addr == addr)
392 return -EBUSY;
393 }
394 return 0;
395}
396
397int i2c_check_addr(struct i2c_adapter *adapter, int addr)
398{
399 int rval;
400
Ingo Molnar5c085d32006-01-18 23:16:04 +0100401 mutex_lock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700402 rval = __i2c_check_addr(adapter, addr);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100403 mutex_unlock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700404
405 return rval;
406}
407
408int i2c_attach_client(struct i2c_client *client)
409{
410 struct i2c_adapter *adapter = client->adapter;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200411 int res = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700412
Ingo Molnar5c085d32006-01-18 23:16:04 +0100413 mutex_lock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700414 if (__i2c_check_addr(client->adapter, client->addr)) {
Jean Delvareb119c6c2006-08-15 18:26:30 +0200415 res = -EBUSY;
416 goto out_unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700417 }
418 list_add_tail(&client->list,&adapter->clients);
David Brownell438d6c22006-12-10 21:21:31 +0100419
Jean Delvarecde78592005-11-26 21:00:54 +0100420 client->usage_count = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421
422 client->dev.parent = &client->adapter->dev;
423 client->dev.driver = &client->driver->driver;
424 client->dev.bus = &i2c_bus_type;
425 client->dev.release = &i2c_client_release;
David Brownell438d6c22006-12-10 21:21:31 +0100426
Linus Torvalds1da177e2005-04-16 15:20:36 -0700427 snprintf(&client->dev.bus_id[0], sizeof(client->dev.bus_id),
428 "%d-%04x", i2c_adapter_id(adapter), client->addr);
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200429 dev_dbg(&adapter->dev, "client [%s] registered with bus id %s\n",
430 client->name, client->dev.bus_id);
Jean Delvareb119c6c2006-08-15 18:26:30 +0200431 res = device_register(&client->dev);
432 if (res)
433 goto out_list;
434 res = device_create_file(&client->dev, &dev_attr_client_name);
435 if (res)
436 goto out_unregister;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200437 mutex_unlock(&adapter->clist_lock);
Jean Delvare77ed74d2006-09-30 17:18:59 +0200438
439 if (adapter->client_register) {
440 if (adapter->client_register(client)) {
441 dev_dbg(&adapter->dev, "client_register "
442 "failed for client [%s] at 0x%02x\n",
443 client->name, client->addr);
444 }
445 }
446
447 return 0;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200448
449out_unregister:
450 init_completion(&client->released); /* Needed? */
451 device_unregister(&client->dev);
452 wait_for_completion(&client->released);
453out_list:
454 list_del(&client->list);
455 dev_err(&adapter->dev, "Failed to attach i2c client %s at 0x%02x "
456 "(%d)\n", client->name, client->addr, res);
Jean Delvare77ed74d2006-09-30 17:18:59 +0200457out_unlock:
458 mutex_unlock(&adapter->clist_lock);
459 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700460}
461
462
463int i2c_detach_client(struct i2c_client *client)
464{
465 struct i2c_adapter *adapter = client->adapter;
466 int res = 0;
David Brownell438d6c22006-12-10 21:21:31 +0100467
Jean Delvarecde78592005-11-26 21:00:54 +0100468 if (client->usage_count > 0) {
Jean Delvare7bef5592005-07-27 22:14:49 +0200469 dev_warn(&client->dev, "Client [%s] still busy, "
470 "can't detach\n", client->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700471 return -EBUSY;
Jean Delvare7bef5592005-07-27 22:14:49 +0200472 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700473
474 if (adapter->client_unregister) {
475 res = adapter->client_unregister(client);
476 if (res) {
477 dev_err(&client->dev,
Jean Delvare86749e82005-07-29 12:15:29 -0700478 "client_unregister [%s] failed, "
479 "client not detached\n", client->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700480 goto out;
481 }
482 }
483
Ingo Molnar5c085d32006-01-18 23:16:04 +0100484 mutex_lock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700485 list_del(&client->list);
486 init_completion(&client->released);
487 device_remove_file(&client->dev, &dev_attr_client_name);
488 device_unregister(&client->dev);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100489 mutex_unlock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700490 wait_for_completion(&client->released);
491
492 out:
493 return res;
494}
495
496static int i2c_inc_use_client(struct i2c_client *client)
497{
498
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100499 if (!try_module_get(client->driver->driver.owner))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700500 return -ENODEV;
501 if (!try_module_get(client->adapter->owner)) {
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100502 module_put(client->driver->driver.owner);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700503 return -ENODEV;
504 }
505
506 return 0;
507}
508
509static void i2c_dec_use_client(struct i2c_client *client)
510{
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100511 module_put(client->driver->driver.owner);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700512 module_put(client->adapter->owner);
513}
514
515int i2c_use_client(struct i2c_client *client)
516{
517 int ret;
518
519 ret = i2c_inc_use_client(client);
520 if (ret)
521 return ret;
522
Jean Delvarecde78592005-11-26 21:00:54 +0100523 client->usage_count++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700524
525 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700526}
527
528int i2c_release_client(struct i2c_client *client)
529{
Jean Delvarecde78592005-11-26 21:00:54 +0100530 if (!client->usage_count) {
531 pr_debug("i2c-core: %s used one too many times\n",
532 __FUNCTION__);
533 return -EPERM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534 }
David Brownell438d6c22006-12-10 21:21:31 +0100535
Jean Delvarecde78592005-11-26 21:00:54 +0100536 client->usage_count--;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700537 i2c_dec_use_client(client);
David Brownell438d6c22006-12-10 21:21:31 +0100538
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539 return 0;
540}
541
542void i2c_clients_command(struct i2c_adapter *adap, unsigned int cmd, void *arg)
543{
544 struct list_head *item;
545 struct i2c_client *client;
546
Ingo Molnar5c085d32006-01-18 23:16:04 +0100547 mutex_lock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700548 list_for_each(item,&adap->clients) {
549 client = list_entry(item, struct i2c_client, list);
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100550 if (!try_module_get(client->driver->driver.owner))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700551 continue;
552 if (NULL != client->driver->command) {
Ingo Molnar5c085d32006-01-18 23:16:04 +0100553 mutex_unlock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700554 client->driver->command(client,cmd,arg);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100555 mutex_lock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700556 }
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100557 module_put(client->driver->driver.owner);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700558 }
Ingo Molnar5c085d32006-01-18 23:16:04 +0100559 mutex_unlock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700560}
561
562static int __init i2c_init(void)
563{
564 int retval;
565
566 retval = bus_register(&i2c_bus_type);
567 if (retval)
568 return retval;
569 retval = driver_register(&i2c_adapter_driver);
570 if (retval)
571 return retval;
572 return class_register(&i2c_adapter_class);
573}
574
575static void __exit i2c_exit(void)
576{
577 class_unregister(&i2c_adapter_class);
578 driver_unregister(&i2c_adapter_driver);
579 bus_unregister(&i2c_bus_type);
580}
581
582subsys_initcall(i2c_init);
583module_exit(i2c_exit);
584
585/* ----------------------------------------------------
586 * the functional interface to the i2c busses.
587 * ----------------------------------------------------
588 */
589
590int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg *msgs, int num)
591{
592 int ret;
593
594 if (adap->algo->master_xfer) {
595#ifdef DEBUG
596 for (ret = 0; ret < num; ret++) {
597 dev_dbg(&adap->dev, "master_xfer[%d] %c, addr=0x%02x, "
598 "len=%d\n", ret, msgs[ret].flags & I2C_M_RD ?
599 'R' : 'W', msgs[ret].addr, msgs[ret].len);
600 }
601#endif
602
Jiri Kosina6ea23032006-12-10 21:21:30 +0100603 mutex_lock_nested(&adap->bus_lock, adap->level);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700604 ret = adap->algo->master_xfer(adap,msgs,num);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100605 mutex_unlock(&adap->bus_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700606
607 return ret;
608 } else {
609 dev_dbg(&adap->dev, "I2C level transfers not supported\n");
610 return -ENOSYS;
611 }
612}
613
614int i2c_master_send(struct i2c_client *client,const char *buf ,int count)
615{
616 int ret;
617 struct i2c_adapter *adap=client->adapter;
618 struct i2c_msg msg;
619
Jean Delvare815f55f2005-05-07 22:58:46 +0200620 msg.addr = client->addr;
621 msg.flags = client->flags & I2C_M_TEN;
622 msg.len = count;
623 msg.buf = (char *)buf;
David Brownell438d6c22006-12-10 21:21:31 +0100624
Jean Delvare815f55f2005-05-07 22:58:46 +0200625 ret = i2c_transfer(adap, &msg, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700626
Jean Delvare815f55f2005-05-07 22:58:46 +0200627 /* If everything went ok (i.e. 1 msg transmitted), return #bytes
628 transmitted, else error code. */
629 return (ret == 1) ? count : ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700630}
631
632int i2c_master_recv(struct i2c_client *client, char *buf ,int count)
633{
634 struct i2c_adapter *adap=client->adapter;
635 struct i2c_msg msg;
636 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700637
Jean Delvare815f55f2005-05-07 22:58:46 +0200638 msg.addr = client->addr;
639 msg.flags = client->flags & I2C_M_TEN;
640 msg.flags |= I2C_M_RD;
641 msg.len = count;
642 msg.buf = buf;
643
644 ret = i2c_transfer(adap, &msg, 1);
645
646 /* If everything went ok (i.e. 1 msg transmitted), return #bytes
647 transmitted, else error code. */
648 return (ret == 1) ? count : ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700649}
650
651
652int i2c_control(struct i2c_client *client,
653 unsigned int cmd, unsigned long arg)
654{
655 int ret = 0;
656 struct i2c_adapter *adap = client->adapter;
657
658 dev_dbg(&client->adapter->dev, "i2c ioctl, cmd: 0x%x, arg: %#lx\n", cmd, arg);
659 switch (cmd) {
660 case I2C_RETRIES:
661 adap->retries = arg;
662 break;
663 case I2C_TIMEOUT:
664 adap->timeout = arg;
665 break;
666 default:
667 if (adap->algo->algo_control!=NULL)
668 ret = adap->algo->algo_control(adap,cmd,arg);
669 }
670 return ret;
671}
672
673/* ----------------------------------------------------
674 * the i2c address scanning function
675 * Will not work for 10-bit addresses!
676 * ----------------------------------------------------
677 */
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200678static int i2c_probe_address(struct i2c_adapter *adapter, int addr, int kind,
679 int (*found_proc) (struct i2c_adapter *, int, int))
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200680{
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200681 int err;
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200682
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200683 /* Make sure the address is valid */
684 if (addr < 0x03 || addr > 0x77) {
685 dev_warn(&adapter->dev, "Invalid probe address 0x%02x\n",
686 addr);
687 return -EINVAL;
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200688 }
689
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200690 /* Skip if already in use */
691 if (i2c_check_addr(adapter, addr))
692 return 0;
693
694 /* Make sure there is something at this address, unless forced */
Jean Delvare4c9337d2005-08-09 20:28:10 +0200695 if (kind < 0) {
696 if (i2c_smbus_xfer(adapter, addr, 0, 0, 0,
697 I2C_SMBUS_QUICK, NULL) < 0)
698 return 0;
699
700 /* prevent 24RF08 corruption */
701 if ((addr & ~0x0f) == 0x50)
702 i2c_smbus_xfer(adapter, addr, 0, 0, 0,
703 I2C_SMBUS_QUICK, NULL);
704 }
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200705
706 /* Finally call the custom detection function */
707 err = found_proc(adapter, addr, kind);
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200708 /* -ENODEV can be returned if there is a chip at the given address
709 but it isn't supported by this chip driver. We catch it here as
710 this isn't an error. */
Jean Delvare114fd182006-09-03 22:25:04 +0200711 if (err == -ENODEV)
712 err = 0;
713
714 if (err)
715 dev_warn(&adapter->dev, "Client creation failed at 0x%x (%d)\n",
716 addr, err);
717 return err;
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200718}
719
Linus Torvalds1da177e2005-04-16 15:20:36 -0700720int i2c_probe(struct i2c_adapter *adapter,
721 struct i2c_client_address_data *address_data,
722 int (*found_proc) (struct i2c_adapter *, int, int))
723{
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200724 int i, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700725 int adap_id = i2c_adapter_id(adapter);
726
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200727 /* Force entries are done first, and are not affected by ignore
728 entries */
729 if (address_data->forces) {
730 unsigned short **forces = address_data->forces;
731 int kind;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700732
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200733 for (kind = 0; forces[kind]; kind++) {
734 for (i = 0; forces[kind][i] != I2C_CLIENT_END;
735 i += 2) {
736 if (forces[kind][i] == adap_id
737 || forces[kind][i] == ANY_I2C_BUS) {
738 dev_dbg(&adapter->dev, "found force "
739 "parameter for adapter %d, "
740 "addr 0x%02x, kind %d\n",
741 adap_id, forces[kind][i + 1],
742 kind);
743 err = i2c_probe_address(adapter,
744 forces[kind][i + 1],
745 kind, found_proc);
746 if (err)
747 return err;
748 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700749 }
750 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700751 }
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200752
Jean Delvare4366dc92005-09-25 16:50:06 +0200753 /* Stop here if we can't use SMBUS_QUICK */
754 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_QUICK)) {
755 if (address_data->probe[0] == I2C_CLIENT_END
756 && address_data->normal_i2c[0] == I2C_CLIENT_END)
David Brownell438d6c22006-12-10 21:21:31 +0100757 return 0;
Jean Delvare4366dc92005-09-25 16:50:06 +0200758
759 dev_warn(&adapter->dev, "SMBus Quick command not supported, "
760 "can't probe for chips\n");
761 return -1;
762 }
763
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200764 /* Probe entries are done second, and are not affected by ignore
765 entries either */
766 for (i = 0; address_data->probe[i] != I2C_CLIENT_END; i += 2) {
767 if (address_data->probe[i] == adap_id
768 || address_data->probe[i] == ANY_I2C_BUS) {
769 dev_dbg(&adapter->dev, "found probe parameter for "
770 "adapter %d, addr 0x%02x\n", adap_id,
771 address_data->probe[i + 1]);
772 err = i2c_probe_address(adapter,
773 address_data->probe[i + 1],
774 -1, found_proc);
775 if (err)
776 return err;
777 }
778 }
779
780 /* Normal entries are done last, unless shadowed by an ignore entry */
781 for (i = 0; address_data->normal_i2c[i] != I2C_CLIENT_END; i += 1) {
782 int j, ignore;
783
784 ignore = 0;
785 for (j = 0; address_data->ignore[j] != I2C_CLIENT_END;
786 j += 2) {
787 if ((address_data->ignore[j] == adap_id ||
788 address_data->ignore[j] == ANY_I2C_BUS)
789 && address_data->ignore[j + 1]
790 == address_data->normal_i2c[i]) {
791 dev_dbg(&adapter->dev, "found ignore "
792 "parameter for adapter %d, "
793 "addr 0x%02x\n", adap_id,
794 address_data->ignore[j + 1]);
Mark M. Hoffman2369df92006-07-01 17:01:59 +0200795 ignore = 1;
796 break;
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200797 }
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200798 }
799 if (ignore)
800 continue;
801
802 dev_dbg(&adapter->dev, "found normal entry for adapter %d, "
803 "addr 0x%02x\n", adap_id,
804 address_data->normal_i2c[i]);
805 err = i2c_probe_address(adapter, address_data->normal_i2c[i],
806 -1, found_proc);
807 if (err)
808 return err;
809 }
810
Linus Torvalds1da177e2005-04-16 15:20:36 -0700811 return 0;
812}
813
Linus Torvalds1da177e2005-04-16 15:20:36 -0700814struct i2c_adapter* i2c_get_adapter(int id)
815{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700816 struct i2c_adapter *adapter;
David Brownell438d6c22006-12-10 21:21:31 +0100817
Arjan van de Venb3585e42006-01-11 10:50:26 +0100818 mutex_lock(&core_lists);
Mark M. Hoffmana0920e12005-06-28 00:21:30 -0400819 adapter = (struct i2c_adapter *)idr_find(&i2c_adapter_idr, id);
820 if (adapter && !try_module_get(adapter->owner))
821 adapter = NULL;
822
Arjan van de Venb3585e42006-01-11 10:50:26 +0100823 mutex_unlock(&core_lists);
Mark M. Hoffmana0920e12005-06-28 00:21:30 -0400824 return adapter;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700825}
826
827void i2c_put_adapter(struct i2c_adapter *adap)
828{
829 module_put(adap->owner);
830}
831
832/* The SMBus parts */
833
David Brownell438d6c22006-12-10 21:21:31 +0100834#define POLY (0x1070U << 3)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700835static u8
836crc8(u16 data)
837{
838 int i;
David Brownell438d6c22006-12-10 21:21:31 +0100839
Linus Torvalds1da177e2005-04-16 15:20:36 -0700840 for(i = 0; i < 8; i++) {
David Brownell438d6c22006-12-10 21:21:31 +0100841 if (data & 0x8000)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700842 data = data ^ POLY;
843 data = data << 1;
844 }
845 return (u8)(data >> 8);
846}
847
Jean Delvare421ef472005-10-26 21:28:55 +0200848/* Incremental CRC8 over count bytes in the array pointed to by p */
849static u8 i2c_smbus_pec(u8 crc, u8 *p, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700850{
851 int i;
852
853 for(i = 0; i < count; i++)
Jean Delvare421ef472005-10-26 21:28:55 +0200854 crc = crc8((crc ^ p[i]) << 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700855 return crc;
856}
857
Jean Delvare421ef472005-10-26 21:28:55 +0200858/* Assume a 7-bit address, which is reasonable for SMBus */
859static u8 i2c_smbus_msg_pec(u8 pec, struct i2c_msg *msg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700860{
Jean Delvare421ef472005-10-26 21:28:55 +0200861 /* The address will be sent first */
862 u8 addr = (msg->addr << 1) | !!(msg->flags & I2C_M_RD);
863 pec = i2c_smbus_pec(pec, &addr, 1);
864
865 /* The data buffer follows */
866 return i2c_smbus_pec(pec, msg->buf, msg->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700867}
868
Jean Delvare421ef472005-10-26 21:28:55 +0200869/* Used for write only transactions */
870static inline void i2c_smbus_add_pec(struct i2c_msg *msg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700871{
Jean Delvare421ef472005-10-26 21:28:55 +0200872 msg->buf[msg->len] = i2c_smbus_msg_pec(0, msg);
873 msg->len++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700874}
875
Jean Delvare421ef472005-10-26 21:28:55 +0200876/* Return <0 on CRC error
877 If there was a write before this read (most cases) we need to take the
878 partial CRC from the write part into account.
879 Note that this function does modify the message (we need to decrease the
880 message length to hide the CRC byte from the caller). */
881static int i2c_smbus_check_pec(u8 cpec, struct i2c_msg *msg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700882{
Jean Delvare421ef472005-10-26 21:28:55 +0200883 u8 rpec = msg->buf[--msg->len];
884 cpec = i2c_smbus_msg_pec(cpec, msg);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700885
Linus Torvalds1da177e2005-04-16 15:20:36 -0700886 if (rpec != cpec) {
887 pr_debug("i2c-core: Bad PEC 0x%02x vs. 0x%02x\n",
888 rpec, cpec);
889 return -1;
890 }
David Brownell438d6c22006-12-10 21:21:31 +0100891 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700892}
893
894s32 i2c_smbus_write_quick(struct i2c_client *client, u8 value)
895{
896 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
David Brownell438d6c22006-12-10 21:21:31 +0100897 value,0,I2C_SMBUS_QUICK,NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700898}
899
900s32 i2c_smbus_read_byte(struct i2c_client *client)
901{
902 union i2c_smbus_data data;
903 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
904 I2C_SMBUS_READ,0,I2C_SMBUS_BYTE, &data))
905 return -1;
906 else
Jean Delvare7eff82c2006-09-03 22:24:00 +0200907 return data.byte;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700908}
909
910s32 i2c_smbus_write_byte(struct i2c_client *client, u8 value)
911{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700912 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
Jean Delvare421ef472005-10-26 21:28:55 +0200913 I2C_SMBUS_WRITE, value, I2C_SMBUS_BYTE, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700914}
915
916s32 i2c_smbus_read_byte_data(struct i2c_client *client, u8 command)
917{
918 union i2c_smbus_data data;
919 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
920 I2C_SMBUS_READ,command, I2C_SMBUS_BYTE_DATA,&data))
921 return -1;
922 else
Jean Delvare7eff82c2006-09-03 22:24:00 +0200923 return data.byte;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700924}
925
926s32 i2c_smbus_write_byte_data(struct i2c_client *client, u8 command, u8 value)
927{
928 union i2c_smbus_data data;
929 data.byte = value;
930 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
931 I2C_SMBUS_WRITE,command,
932 I2C_SMBUS_BYTE_DATA,&data);
933}
934
935s32 i2c_smbus_read_word_data(struct i2c_client *client, u8 command)
936{
937 union i2c_smbus_data data;
938 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
939 I2C_SMBUS_READ,command, I2C_SMBUS_WORD_DATA, &data))
940 return -1;
941 else
Jean Delvare7eff82c2006-09-03 22:24:00 +0200942 return data.word;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700943}
944
945s32 i2c_smbus_write_word_data(struct i2c_client *client, u8 command, u16 value)
946{
947 union i2c_smbus_data data;
948 data.word = value;
949 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
950 I2C_SMBUS_WRITE,command,
951 I2C_SMBUS_WORD_DATA,&data);
952}
953
954s32 i2c_smbus_write_block_data(struct i2c_client *client, u8 command,
Krzysztof Halasa46f5ed72006-06-12 21:42:20 +0200955 u8 length, const u8 *values)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700956{
957 union i2c_smbus_data data;
Jean Delvare76560322006-01-18 23:14:55 +0100958
Linus Torvalds1da177e2005-04-16 15:20:36 -0700959 if (length > I2C_SMBUS_BLOCK_MAX)
960 length = I2C_SMBUS_BLOCK_MAX;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700961 data.block[0] = length;
Jean Delvare76560322006-01-18 23:14:55 +0100962 memcpy(&data.block[1], values, length);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700963 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
964 I2C_SMBUS_WRITE,command,
965 I2C_SMBUS_BLOCK_DATA,&data);
966}
967
968/* Returns the number of read bytes */
969s32 i2c_smbus_read_i2c_block_data(struct i2c_client *client, u8 command, u8 *values)
970{
971 union i2c_smbus_data data;
Jean Delvare76560322006-01-18 23:14:55 +0100972
Linus Torvalds1da177e2005-04-16 15:20:36 -0700973 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
974 I2C_SMBUS_READ,command,
975 I2C_SMBUS_I2C_BLOCK_DATA,&data))
976 return -1;
Jean Delvare76560322006-01-18 23:14:55 +0100977
978 memcpy(values, &data.block[1], data.block[0]);
979 return data.block[0];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700980}
981
Jean Delvare21bbd692006-01-09 15:19:18 +1100982s32 i2c_smbus_write_i2c_block_data(struct i2c_client *client, u8 command,
Krzysztof Halasa46f5ed72006-06-12 21:42:20 +0200983 u8 length, const u8 *values)
Jean Delvare21bbd692006-01-09 15:19:18 +1100984{
985 union i2c_smbus_data data;
986
987 if (length > I2C_SMBUS_BLOCK_MAX)
988 length = I2C_SMBUS_BLOCK_MAX;
989 data.block[0] = length;
990 memcpy(data.block + 1, values, length);
991 return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
992 I2C_SMBUS_WRITE, command,
993 I2C_SMBUS_I2C_BLOCK_DATA, &data);
994}
995
David Brownell438d6c22006-12-10 21:21:31 +0100996/* Simulate a SMBus command using the i2c protocol
Linus Torvalds1da177e2005-04-16 15:20:36 -0700997 No checking of parameters is done! */
David Brownell438d6c22006-12-10 21:21:31 +0100998static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700999 unsigned short flags,
David Brownell438d6c22006-12-10 21:21:31 +01001000 char read_write, u8 command, int size,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001001 union i2c_smbus_data * data)
1002{
1003 /* So we need to generate a series of msgs. In the case of writing, we
1004 need to use only one message; when reading, we need two. We initialize
1005 most things with sane defaults, to keep the code below somewhat
1006 simpler. */
Hideki Iwamoto5c50d182005-09-25 17:01:11 +02001007 unsigned char msgbuf0[I2C_SMBUS_BLOCK_MAX+3];
1008 unsigned char msgbuf1[I2C_SMBUS_BLOCK_MAX+2];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001009 int num = read_write == I2C_SMBUS_READ?2:1;
David Brownell438d6c22006-12-10 21:21:31 +01001010 struct i2c_msg msg[2] = { { addr, flags, 1, msgbuf0 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07001011 { addr, flags | I2C_M_RD, 0, msgbuf1 }
1012 };
1013 int i;
Jean Delvare421ef472005-10-26 21:28:55 +02001014 u8 partial_pec = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001015
1016 msgbuf0[0] = command;
1017 switch(size) {
1018 case I2C_SMBUS_QUICK:
1019 msg[0].len = 0;
1020 /* Special case: The read/write field is used as data */
1021 msg[0].flags = flags | (read_write==I2C_SMBUS_READ)?I2C_M_RD:0;
1022 num = 1;
1023 break;
1024 case I2C_SMBUS_BYTE:
1025 if (read_write == I2C_SMBUS_READ) {
1026 /* Special case: only a read! */
1027 msg[0].flags = I2C_M_RD | flags;
1028 num = 1;
1029 }
1030 break;
1031 case I2C_SMBUS_BYTE_DATA:
1032 if (read_write == I2C_SMBUS_READ)
1033 msg[1].len = 1;
1034 else {
1035 msg[0].len = 2;
1036 msgbuf0[1] = data->byte;
1037 }
1038 break;
1039 case I2C_SMBUS_WORD_DATA:
1040 if (read_write == I2C_SMBUS_READ)
1041 msg[1].len = 2;
1042 else {
1043 msg[0].len=3;
1044 msgbuf0[1] = data->word & 0xff;
Jean Delvare7eff82c2006-09-03 22:24:00 +02001045 msgbuf0[2] = data->word >> 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001046 }
1047 break;
1048 case I2C_SMBUS_PROC_CALL:
1049 num = 2; /* Special case */
1050 read_write = I2C_SMBUS_READ;
1051 msg[0].len = 3;
1052 msg[1].len = 2;
1053 msgbuf0[1] = data->word & 0xff;
Jean Delvare7eff82c2006-09-03 22:24:00 +02001054 msgbuf0[2] = data->word >> 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001055 break;
1056 case I2C_SMBUS_BLOCK_DATA:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001057 if (read_write == I2C_SMBUS_READ) {
1058 dev_err(&adapter->dev, "Block read not supported "
1059 "under I2C emulation!\n");
1060 return -1;
1061 } else {
1062 msg[0].len = data->block[0] + 2;
1063 if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 2) {
1064 dev_err(&adapter->dev, "smbus_access called with "
1065 "invalid block write size (%d)\n",
1066 data->block[0]);
1067 return -1;
1068 }
Hideki Iwamoto5c50d182005-09-25 17:01:11 +02001069 for (i = 1; i < msg[0].len; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001070 msgbuf0[i] = data->block[i-1];
1071 }
1072 break;
1073 case I2C_SMBUS_BLOCK_PROC_CALL:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001074 dev_dbg(&adapter->dev, "Block process call not supported "
1075 "under I2C emulation!\n");
1076 return -1;
1077 case I2C_SMBUS_I2C_BLOCK_DATA:
1078 if (read_write == I2C_SMBUS_READ) {
Jean Delvare30dac742005-10-08 00:15:59 +02001079 msg[1].len = I2C_SMBUS_BLOCK_MAX;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001080 } else {
1081 msg[0].len = data->block[0] + 1;
Jean Delvare30dac742005-10-08 00:15:59 +02001082 if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 1) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001083 dev_err(&adapter->dev, "i2c_smbus_xfer_emulated called with "
1084 "invalid block write size (%d)\n",
1085 data->block[0]);
1086 return -1;
1087 }
1088 for (i = 1; i <= data->block[0]; i++)
1089 msgbuf0[i] = data->block[i];
1090 }
1091 break;
1092 default:
1093 dev_err(&adapter->dev, "smbus_access called with invalid size (%d)\n",
1094 size);
1095 return -1;
1096 }
1097
Jean Delvare421ef472005-10-26 21:28:55 +02001098 i = ((flags & I2C_CLIENT_PEC) && size != I2C_SMBUS_QUICK
1099 && size != I2C_SMBUS_I2C_BLOCK_DATA);
1100 if (i) {
1101 /* Compute PEC if first message is a write */
1102 if (!(msg[0].flags & I2C_M_RD)) {
David Brownell438d6c22006-12-10 21:21:31 +01001103 if (num == 1) /* Write only */
Jean Delvare421ef472005-10-26 21:28:55 +02001104 i2c_smbus_add_pec(&msg[0]);
1105 else /* Write followed by read */
1106 partial_pec = i2c_smbus_msg_pec(0, &msg[0]);
1107 }
1108 /* Ask for PEC if last message is a read */
1109 if (msg[num-1].flags & I2C_M_RD)
David Brownell438d6c22006-12-10 21:21:31 +01001110 msg[num-1].len++;
Jean Delvare421ef472005-10-26 21:28:55 +02001111 }
1112
Linus Torvalds1da177e2005-04-16 15:20:36 -07001113 if (i2c_transfer(adapter, msg, num) < 0)
1114 return -1;
1115
Jean Delvare421ef472005-10-26 21:28:55 +02001116 /* Check PEC if last message is a read */
1117 if (i && (msg[num-1].flags & I2C_M_RD)) {
1118 if (i2c_smbus_check_pec(partial_pec, &msg[num-1]) < 0)
1119 return -1;
1120 }
1121
Linus Torvalds1da177e2005-04-16 15:20:36 -07001122 if (read_write == I2C_SMBUS_READ)
1123 switch(size) {
1124 case I2C_SMBUS_BYTE:
1125 data->byte = msgbuf0[0];
1126 break;
1127 case I2C_SMBUS_BYTE_DATA:
1128 data->byte = msgbuf1[0];
1129 break;
David Brownell438d6c22006-12-10 21:21:31 +01001130 case I2C_SMBUS_WORD_DATA:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001131 case I2C_SMBUS_PROC_CALL:
1132 data->word = msgbuf1[0] | (msgbuf1[1] << 8);
1133 break;
1134 case I2C_SMBUS_I2C_BLOCK_DATA:
1135 /* fixed at 32 for now */
Jean Delvare30dac742005-10-08 00:15:59 +02001136 data->block[0] = I2C_SMBUS_BLOCK_MAX;
1137 for (i = 0; i < I2C_SMBUS_BLOCK_MAX; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001138 data->block[i+1] = msgbuf1[i];
1139 break;
1140 }
1141 return 0;
1142}
1143
1144
1145s32 i2c_smbus_xfer(struct i2c_adapter * adapter, u16 addr, unsigned short flags,
David Brownell438d6c22006-12-10 21:21:31 +01001146 char read_write, u8 command, int size,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001147 union i2c_smbus_data * data)
1148{
1149 s32 res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001150
1151 flags &= I2C_M_TEN | I2C_CLIENT_PEC;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001152
1153 if (adapter->algo->smbus_xfer) {
Ingo Molnar5c085d32006-01-18 23:16:04 +01001154 mutex_lock(&adapter->bus_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001155 res = adapter->algo->smbus_xfer(adapter,addr,flags,read_write,
1156 command,size,data);
Ingo Molnar5c085d32006-01-18 23:16:04 +01001157 mutex_unlock(&adapter->bus_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001158 } else
1159 res = i2c_smbus_xfer_emulated(adapter,addr,flags,read_write,
1160 command,size,data);
1161
Linus Torvalds1da177e2005-04-16 15:20:36 -07001162 return res;
1163}
1164
1165
Jean Delvareefde7232005-07-20 23:03:50 +02001166/* Next four are needed by i2c-isa */
1167EXPORT_SYMBOL_GPL(i2c_adapter_dev_release);
1168EXPORT_SYMBOL_GPL(i2c_adapter_driver);
1169EXPORT_SYMBOL_GPL(i2c_adapter_class);
1170EXPORT_SYMBOL_GPL(i2c_bus_type);
1171
Linus Torvalds1da177e2005-04-16 15:20:36 -07001172EXPORT_SYMBOL(i2c_add_adapter);
1173EXPORT_SYMBOL(i2c_del_adapter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174EXPORT_SYMBOL(i2c_del_driver);
1175EXPORT_SYMBOL(i2c_attach_client);
1176EXPORT_SYMBOL(i2c_detach_client);
1177EXPORT_SYMBOL(i2c_use_client);
1178EXPORT_SYMBOL(i2c_release_client);
1179EXPORT_SYMBOL(i2c_clients_command);
1180EXPORT_SYMBOL(i2c_check_addr);
1181
1182EXPORT_SYMBOL(i2c_master_send);
1183EXPORT_SYMBOL(i2c_master_recv);
1184EXPORT_SYMBOL(i2c_control);
1185EXPORT_SYMBOL(i2c_transfer);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001186EXPORT_SYMBOL(i2c_get_adapter);
1187EXPORT_SYMBOL(i2c_put_adapter);
1188EXPORT_SYMBOL(i2c_probe);
1189
1190EXPORT_SYMBOL(i2c_smbus_xfer);
1191EXPORT_SYMBOL(i2c_smbus_write_quick);
1192EXPORT_SYMBOL(i2c_smbus_read_byte);
1193EXPORT_SYMBOL(i2c_smbus_write_byte);
1194EXPORT_SYMBOL(i2c_smbus_read_byte_data);
1195EXPORT_SYMBOL(i2c_smbus_write_byte_data);
1196EXPORT_SYMBOL(i2c_smbus_read_word_data);
1197EXPORT_SYMBOL(i2c_smbus_write_word_data);
1198EXPORT_SYMBOL(i2c_smbus_write_block_data);
1199EXPORT_SYMBOL(i2c_smbus_read_i2c_block_data);
Jean Delvare21bbd692006-01-09 15:19:18 +11001200EXPORT_SYMBOL(i2c_smbus_write_i2c_block_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001201
1202MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
1203MODULE_DESCRIPTION("I2C-Bus main module");
1204MODULE_LICENSE("GPL");