blob: c99ebeadb558bc54069aed54af89ecc321dc4486 [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
Jan Engelhardt96de0e22007-10-19 23:21:04 +020020/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi>.
Linus Torvalds1da177e2005-04-16 15:20:36 -070021 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>
Jean Delvareb8d6f452007-02-13 22:09:00 +010035#include <linux/completion.h>
Mike Rapoportcea443a82008-01-27 18:14:50 +010036#include <linux/hardirq.h>
37#include <linux/irqflags.h>
Matthew Wilcox6188e102008-04-18 22:21:05 -040038#include <linux/semaphore.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070039#include <asm/uaccess.h>
40
David Brownell9c1600e2007-05-01 23:26:31 +020041#include "i2c-core.h"
42
Linus Torvalds1da177e2005-04-16 15:20:36 -070043
Jean Delvarecaada322008-01-27 18:14:49 +010044static DEFINE_MUTEX(core_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -070045static DEFINE_IDR(i2c_adapter_idr);
46
David Brownella1d9e6e2007-05-01 23:26:30 +020047#define is_newstyle_driver(d) ((d)->probe || (d)->remove)
David Brownellf37dd802007-02-13 22:09:00 +010048
49/* ------------------------------------------------------------------------- */
50
Jean Delvared2653e92008-04-29 23:11:39 +020051static const struct i2c_device_id *i2c_match_id(const struct i2c_device_id *id,
52 const struct i2c_client *client)
53{
54 while (id->name[0]) {
55 if (strcmp(client->name, id->name) == 0)
56 return id;
57 id++;
58 }
59 return NULL;
60}
61
Linus Torvalds1da177e2005-04-16 15:20:36 -070062static int i2c_device_match(struct device *dev, struct device_driver *drv)
63{
David Brownell7b4fbc52007-05-01 23:26:30 +020064 struct i2c_client *client = to_i2c_client(dev);
65 struct i2c_driver *driver = to_i2c_driver(drv);
66
67 /* make legacy i2c drivers bypass driver model probing entirely;
68 * such drivers scan each i2c adapter/bus themselves.
69 */
David Brownella1d9e6e2007-05-01 23:26:30 +020070 if (!is_newstyle_driver(driver))
David Brownell7b4fbc52007-05-01 23:26:30 +020071 return 0;
72
Jean Delvared2653e92008-04-29 23:11:39 +020073 /* match on an id table if there is one */
74 if (driver->id_table)
75 return i2c_match_id(driver->id_table, client) != NULL;
76
David Brownell7b4fbc52007-05-01 23:26:30 +020077 /* new style drivers use the same kind of driver matching policy
78 * as platform devices or SPI: compare device and driver IDs.
79 */
80 return strcmp(client->driver_name, drv->name) == 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -070081}
82
David Brownell7b4fbc52007-05-01 23:26:30 +020083#ifdef CONFIG_HOTPLUG
84
85/* uevent helps with hotplug: modprobe -q $(MODALIAS) */
Kay Sievers7eff2e72007-08-14 15:15:12 +020086static int i2c_device_uevent(struct device *dev, struct kobj_uevent_env *env)
David Brownell7b4fbc52007-05-01 23:26:30 +020087{
88 struct i2c_client *client = to_i2c_client(dev);
David Brownell7b4fbc52007-05-01 23:26:30 +020089
90 /* by definition, legacy drivers can't hotplug */
Jean Delvared2653e92008-04-29 23:11:39 +020091 if (dev->driver)
David Brownell7b4fbc52007-05-01 23:26:30 +020092 return 0;
93
Jean Delvared2653e92008-04-29 23:11:39 +020094 if (client->driver_name[0]) {
95 if (add_uevent_var(env, "MODALIAS=%s", client->driver_name))
96 return -ENOMEM;
97 } else {
98 if (add_uevent_var(env, "MODALIAS=%s%s",
99 I2C_MODULE_PREFIX, client->name))
100 return -ENOMEM;
101 }
David Brownell7b4fbc52007-05-01 23:26:30 +0200102 dev_dbg(dev, "uevent\n");
103 return 0;
104}
105
106#else
107#define i2c_device_uevent NULL
108#endif /* CONFIG_HOTPLUG */
109
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110static int i2c_device_probe(struct device *dev)
111{
David Brownell7b4fbc52007-05-01 23:26:30 +0200112 struct i2c_client *client = to_i2c_client(dev);
113 struct i2c_driver *driver = to_i2c_driver(dev->driver);
Jean Delvared2653e92008-04-29 23:11:39 +0200114 const struct i2c_device_id *id;
Hans Verkuil50c33042008-03-12 14:15:00 +0100115 int status;
David Brownell7b4fbc52007-05-01 23:26:30 +0200116
117 if (!driver->probe)
118 return -ENODEV;
119 client->driver = driver;
120 dev_dbg(dev, "probe\n");
Jean Delvared2653e92008-04-29 23:11:39 +0200121
122 if (driver->id_table)
123 id = i2c_match_id(driver->id_table, client);
124 else
125 id = NULL;
126 status = driver->probe(client, id);
Hans Verkuil50c33042008-03-12 14:15:00 +0100127 if (status)
128 client->driver = NULL;
129 return status;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700130}
131
132static int i2c_device_remove(struct device *dev)
133{
David Brownella1d9e6e2007-05-01 23:26:30 +0200134 struct i2c_client *client = to_i2c_client(dev);
135 struct i2c_driver *driver;
136 int status;
137
138 if (!dev->driver)
139 return 0;
140
141 driver = to_i2c_driver(dev->driver);
142 if (driver->remove) {
143 dev_dbg(dev, "remove\n");
144 status = driver->remove(client);
145 } else {
146 dev->driver = NULL;
147 status = 0;
148 }
149 if (status == 0)
150 client->driver = NULL;
151 return status;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700152}
153
David Brownellf37dd802007-02-13 22:09:00 +0100154static void i2c_device_shutdown(struct device *dev)
155{
156 struct i2c_driver *driver;
157
158 if (!dev->driver)
159 return;
160 driver = to_i2c_driver(dev->driver);
161 if (driver->shutdown)
162 driver->shutdown(to_i2c_client(dev));
163}
164
165static int i2c_device_suspend(struct device * dev, pm_message_t mesg)
166{
167 struct i2c_driver *driver;
168
169 if (!dev->driver)
170 return 0;
171 driver = to_i2c_driver(dev->driver);
172 if (!driver->suspend)
173 return 0;
174 return driver->suspend(to_i2c_client(dev), mesg);
175}
176
177static int i2c_device_resume(struct device * dev)
178{
179 struct i2c_driver *driver;
180
181 if (!dev->driver)
182 return 0;
183 driver = to_i2c_driver(dev->driver);
184 if (!driver->resume)
185 return 0;
186 return driver->resume(to_i2c_client(dev));
187}
188
David Brownell7b4fbc52007-05-01 23:26:30 +0200189static void i2c_client_release(struct device *dev)
190{
191 struct i2c_client *client = to_i2c_client(dev);
192 complete(&client->released);
193}
194
David Brownell9c1600e2007-05-01 23:26:31 +0200195static void i2c_client_dev_release(struct device *dev)
196{
197 kfree(to_i2c_client(dev));
198}
199
David Brownell7b4fbc52007-05-01 23:26:30 +0200200static ssize_t show_client_name(struct device *dev, struct device_attribute *attr, char *buf)
201{
202 struct i2c_client *client = to_i2c_client(dev);
203 return sprintf(buf, "%s\n", client->name);
204}
205
206static ssize_t show_modalias(struct device *dev, struct device_attribute *attr, char *buf)
207{
208 struct i2c_client *client = to_i2c_client(dev);
Jean Delvared2653e92008-04-29 23:11:39 +0200209 return client->driver_name[0]
David Brownell7b4fbc52007-05-01 23:26:30 +0200210 ? sprintf(buf, "%s\n", client->driver_name)
Jean Delvared2653e92008-04-29 23:11:39 +0200211 : sprintf(buf, "%s%s\n", I2C_MODULE_PREFIX, client->name);
David Brownell7b4fbc52007-05-01 23:26:30 +0200212}
213
214static struct device_attribute i2c_dev_attrs[] = {
215 __ATTR(name, S_IRUGO, show_client_name, NULL),
216 /* modalias helps coldplug: modprobe $(cat .../modalias) */
217 __ATTR(modalias, S_IRUGO, show_modalias, NULL),
218 { },
219};
220
Adrian Bunk83eaaed2007-10-13 23:56:30 +0200221static struct bus_type i2c_bus_type = {
David Brownellf37dd802007-02-13 22:09:00 +0100222 .name = "i2c",
David Brownell7b4fbc52007-05-01 23:26:30 +0200223 .dev_attrs = i2c_dev_attrs,
David Brownellf37dd802007-02-13 22:09:00 +0100224 .match = i2c_device_match,
David Brownell7b4fbc52007-05-01 23:26:30 +0200225 .uevent = i2c_device_uevent,
David Brownellf37dd802007-02-13 22:09:00 +0100226 .probe = i2c_device_probe,
227 .remove = i2c_device_remove,
228 .shutdown = i2c_device_shutdown,
229 .suspend = i2c_device_suspend,
230 .resume = i2c_device_resume,
Russell Kingb864c7d2006-01-05 14:37:50 +0000231};
232
David Brownell9b766b82008-01-27 18:14:51 +0100233
234/**
235 * i2c_verify_client - return parameter as i2c_client, or NULL
236 * @dev: device, probably from some driver model iterator
237 *
238 * When traversing the driver model tree, perhaps using driver model
239 * iterators like @device_for_each_child(), you can't assume very much
240 * about the nodes you find. Use this function to avoid oopses caused
241 * by wrongly treating some non-I2C device as an i2c_client.
242 */
243struct i2c_client *i2c_verify_client(struct device *dev)
244{
245 return (dev->bus == &i2c_bus_type)
246 ? to_i2c_client(dev)
247 : NULL;
248}
249EXPORT_SYMBOL(i2c_verify_client);
250
251
David Brownell9c1600e2007-05-01 23:26:31 +0200252/**
253 * i2c_new_device - instantiate an i2c device for use with a new style driver
254 * @adap: the adapter managing the device
255 * @info: describes one I2C device; bus_num is ignored
David Brownelld64f73b2007-07-12 14:12:28 +0200256 * Context: can sleep
David Brownell9c1600e2007-05-01 23:26:31 +0200257 *
258 * Create a device to work with a new style i2c driver, where binding is
259 * handled through driver model probe()/remove() methods. This call is not
260 * appropriate for use by mainboad initialization logic, which usually runs
261 * during an arch_initcall() long before any i2c_adapter could exist.
262 *
263 * This returns the new i2c client, which may be saved for later use with
264 * i2c_unregister_device(); or NULL to indicate an error.
265 */
266struct i2c_client *
267i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
268{
269 struct i2c_client *client;
270 int status;
271
272 client = kzalloc(sizeof *client, GFP_KERNEL);
273 if (!client)
274 return NULL;
275
276 client->adapter = adap;
277
278 client->dev.platform_data = info->platform_data;
David Brownell3bbb8352007-10-13 23:56:29 +0200279 device_init_wakeup(&client->dev, info->flags & I2C_CLIENT_WAKE);
280
281 client->flags = info->flags & ~I2C_CLIENT_WAKE;
David Brownell9c1600e2007-05-01 23:26:31 +0200282 client->addr = info->addr;
283 client->irq = info->irq;
284
285 strlcpy(client->driver_name, info->driver_name,
286 sizeof(client->driver_name));
287 strlcpy(client->name, info->type, sizeof(client->name));
288
289 /* a new style driver may be bound to this device when we
290 * return from this function, or any later moment (e.g. maybe
291 * hotplugging will load the driver module). and the device
292 * refcount model is the standard driver model one.
293 */
294 status = i2c_attach_client(client);
295 if (status < 0) {
296 kfree(client);
297 client = NULL;
298 }
299 return client;
300}
301EXPORT_SYMBOL_GPL(i2c_new_device);
302
303
304/**
305 * i2c_unregister_device - reverse effect of i2c_new_device()
306 * @client: value returned from i2c_new_device()
David Brownelld64f73b2007-07-12 14:12:28 +0200307 * Context: can sleep
David Brownell9c1600e2007-05-01 23:26:31 +0200308 */
309void i2c_unregister_device(struct i2c_client *client)
David Brownella1d9e6e2007-05-01 23:26:30 +0200310{
311 struct i2c_adapter *adapter = client->adapter;
312 struct i2c_driver *driver = client->driver;
313
314 if (driver && !is_newstyle_driver(driver)) {
315 dev_err(&client->dev, "can't unregister devices "
316 "with legacy drivers\n");
317 WARN_ON(1);
318 return;
319 }
320
321 mutex_lock(&adapter->clist_lock);
322 list_del(&client->list);
323 mutex_unlock(&adapter->clist_lock);
324
325 device_unregister(&client->dev);
326}
David Brownell9c1600e2007-05-01 23:26:31 +0200327EXPORT_SYMBOL_GPL(i2c_unregister_device);
David Brownella1d9e6e2007-05-01 23:26:30 +0200328
329
Jean Delvare60b129d2008-05-11 20:37:06 +0200330static const struct i2c_device_id dummy_id[] = {
331 { "dummy", 0 },
332 { },
333};
334
Jean Delvared2653e92008-04-29 23:11:39 +0200335static int dummy_probe(struct i2c_client *client,
336 const struct i2c_device_id *id)
337{
338 return 0;
339}
340
341static int dummy_remove(struct i2c_client *client)
David Brownelle9f13732008-01-27 18:14:52 +0100342{
343 return 0;
344}
345
346static struct i2c_driver dummy_driver = {
347 .driver.name = "dummy",
Jean Delvared2653e92008-04-29 23:11:39 +0200348 .probe = dummy_probe,
349 .remove = dummy_remove,
Jean Delvare60b129d2008-05-11 20:37:06 +0200350 .id_table = dummy_id,
David Brownelle9f13732008-01-27 18:14:52 +0100351};
352
353/**
354 * i2c_new_dummy - return a new i2c device bound to a dummy driver
355 * @adapter: the adapter managing the device
356 * @address: seven bit address to be used
David Brownelle9f13732008-01-27 18:14:52 +0100357 * Context: can sleep
358 *
359 * This returns an I2C client bound to the "dummy" driver, intended for use
360 * with devices that consume multiple addresses. Examples of such chips
361 * include various EEPROMS (like 24c04 and 24c08 models).
362 *
363 * These dummy devices have two main uses. First, most I2C and SMBus calls
364 * except i2c_transfer() need a client handle; the dummy will be that handle.
365 * And second, this prevents the specified address from being bound to a
366 * different driver.
367 *
368 * This returns the new i2c client, which should be saved for later use with
369 * i2c_unregister_device(); or NULL to indicate an error.
370 */
371struct i2c_client *
Jean Delvare60b129d2008-05-11 20:37:06 +0200372i2c_new_dummy(struct i2c_adapter *adapter, u16 address)
David Brownelle9f13732008-01-27 18:14:52 +0100373{
374 struct i2c_board_info info = {
Jean Delvare60b129d2008-05-11 20:37:06 +0200375 I2C_BOARD_INFO("dummy", address),
David Brownelle9f13732008-01-27 18:14:52 +0100376 };
377
David Brownelle9f13732008-01-27 18:14:52 +0100378 return i2c_new_device(adapter, &info);
379}
380EXPORT_SYMBOL_GPL(i2c_new_dummy);
381
David Brownellf37dd802007-02-13 22:09:00 +0100382/* ------------------------------------------------------------------------- */
383
David Brownell16ffadf2007-05-01 23:26:28 +0200384/* I2C bus adapters -- one roots each I2C or SMBUS segment */
385
Adrian Bunk83eaaed2007-10-13 23:56:30 +0200386static void i2c_adapter_dev_release(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700387{
David Brownellef2c83212007-05-01 23:26:28 +0200388 struct i2c_adapter *adap = to_i2c_adapter(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700389 complete(&adap->dev_released);
390}
391
David Brownell16ffadf2007-05-01 23:26:28 +0200392static ssize_t
393show_adapter_name(struct device *dev, struct device_attribute *attr, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700394{
David Brownellef2c83212007-05-01 23:26:28 +0200395 struct i2c_adapter *adap = to_i2c_adapter(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700396 return sprintf(buf, "%s\n", adap->name);
397}
David Brownell16ffadf2007-05-01 23:26:28 +0200398
399static struct device_attribute i2c_adapter_attrs[] = {
400 __ATTR(name, S_IRUGO, show_adapter_name, NULL),
401 { },
402};
403
Adrian Bunk83eaaed2007-10-13 23:56:30 +0200404static struct class i2c_adapter_class = {
David Brownell16ffadf2007-05-01 23:26:28 +0200405 .owner = THIS_MODULE,
406 .name = "i2c-adapter",
407 .dev_attrs = i2c_adapter_attrs,
408};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700409
David Brownell9c1600e2007-05-01 23:26:31 +0200410static void i2c_scan_static_board_info(struct i2c_adapter *adapter)
411{
412 struct i2c_devinfo *devinfo;
413
414 mutex_lock(&__i2c_board_lock);
415 list_for_each_entry(devinfo, &__i2c_board_list, list) {
416 if (devinfo->busnum == adapter->nr
417 && !i2c_new_device(adapter,
418 &devinfo->board_info))
419 printk(KERN_ERR "i2c-core: can't create i2c%d-%04x\n",
420 i2c_adapter_id(adapter),
421 devinfo->board_info.addr);
422 }
423 mutex_unlock(&__i2c_board_lock);
424}
425
Jean Delvare026526f2008-01-27 18:14:49 +0100426static int i2c_do_add_adapter(struct device_driver *d, void *data)
427{
428 struct i2c_driver *driver = to_i2c_driver(d);
429 struct i2c_adapter *adap = data;
430
431 if (driver->attach_adapter) {
432 /* We ignore the return code; if it fails, too bad */
433 driver->attach_adapter(adap);
434 }
435 return 0;
436}
437
David Brownell6e13e642007-05-01 23:26:31 +0200438static int i2c_register_adapter(struct i2c_adapter *adap)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700439{
Jean Delvare026526f2008-01-27 18:14:49 +0100440 int res = 0, dummy;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700441
Ingo Molnar5c085d32006-01-18 23:16:04 +0100442 mutex_init(&adap->bus_lock);
443 mutex_init(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700444 INIT_LIST_HEAD(&adap->clients);
445
Jean Delvarecaada322008-01-27 18:14:49 +0100446 mutex_lock(&core_lock);
David Brownell6e13e642007-05-01 23:26:31 +0200447
Linus Torvalds1da177e2005-04-16 15:20:36 -0700448 /* Add the adapter to the driver core.
449 * If the parent pointer is not set up,
450 * we add this adapter to the host bus.
451 */
David Brownellb119dc32007-01-04 13:07:04 +0100452 if (adap->dev.parent == NULL) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700453 adap->dev.parent = &platform_bus;
Jean Delvarefe2c8d52007-02-13 22:09:04 +0100454 pr_debug("I2C adapter driver [%s] forgot to specify "
455 "physical device\n", adap->name);
David Brownellb119dc32007-01-04 13:07:04 +0100456 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700457 sprintf(adap->dev.bus_id, "i2c-%d", adap->nr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700458 adap->dev.release = &i2c_adapter_dev_release;
Jean Delvarefccb56e2007-05-01 23:26:27 +0200459 adap->dev.class = &i2c_adapter_class;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200460 res = device_register(&adap->dev);
461 if (res)
462 goto out_list;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700463
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200464 dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name);
465
David Brownell6e13e642007-05-01 23:26:31 +0200466 /* create pre-declared device nodes for new-style drivers */
467 if (adap->nr < __i2c_first_dynamic_bus_num)
468 i2c_scan_static_board_info(adap);
469
David Brownell7b4fbc52007-05-01 23:26:30 +0200470 /* let legacy drivers scan this bus for matching devices */
Jean Delvare026526f2008-01-27 18:14:49 +0100471 dummy = bus_for_each_drv(&i2c_bus_type, NULL, adap,
472 i2c_do_add_adapter);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700473
Linus Torvalds1da177e2005-04-16 15:20:36 -0700474out_unlock:
Jean Delvarecaada322008-01-27 18:14:49 +0100475 mutex_unlock(&core_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700476 return res;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200477
Jean Delvareb119c6c2006-08-15 18:26:30 +0200478out_list:
Jean Delvareb119c6c2006-08-15 18:26:30 +0200479 idr_remove(&i2c_adapter_idr, adap->nr);
480 goto out_unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700481}
482
David Brownell6e13e642007-05-01 23:26:31 +0200483/**
484 * i2c_add_adapter - declare i2c adapter, use dynamic bus number
485 * @adapter: the adapter to add
David Brownelld64f73b2007-07-12 14:12:28 +0200486 * Context: can sleep
David Brownell6e13e642007-05-01 23:26:31 +0200487 *
488 * This routine is used to declare an I2C adapter when its bus number
489 * doesn't matter. Examples: for I2C adapters dynamically added by
490 * USB links or PCI plugin cards.
491 *
492 * When this returns zero, a new bus number was allocated and stored
493 * in adap->nr, and the specified adapter became available for clients.
494 * Otherwise, a negative errno value is returned.
495 */
496int i2c_add_adapter(struct i2c_adapter *adapter)
497{
498 int id, res = 0;
499
500retry:
501 if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) == 0)
502 return -ENOMEM;
503
Jean Delvarecaada322008-01-27 18:14:49 +0100504 mutex_lock(&core_lock);
David Brownell6e13e642007-05-01 23:26:31 +0200505 /* "above" here means "above or equal to", sigh */
506 res = idr_get_new_above(&i2c_adapter_idr, adapter,
507 __i2c_first_dynamic_bus_num, &id);
Jean Delvarecaada322008-01-27 18:14:49 +0100508 mutex_unlock(&core_lock);
David Brownell6e13e642007-05-01 23:26:31 +0200509
510 if (res < 0) {
511 if (res == -EAGAIN)
512 goto retry;
513 return res;
514 }
515
516 adapter->nr = id;
517 return i2c_register_adapter(adapter);
518}
519EXPORT_SYMBOL(i2c_add_adapter);
520
521/**
522 * i2c_add_numbered_adapter - declare i2c adapter, use static bus number
523 * @adap: the adapter to register (with adap->nr initialized)
David Brownelld64f73b2007-07-12 14:12:28 +0200524 * Context: can sleep
David Brownell6e13e642007-05-01 23:26:31 +0200525 *
526 * This routine is used to declare an I2C adapter when its bus number
Randy Dunlap8c07e462008-03-23 20:28:20 +0100527 * matters. For example, use it for I2C adapters from system-on-chip CPUs,
528 * or otherwise built in to the system's mainboard, and where i2c_board_info
David Brownell6e13e642007-05-01 23:26:31 +0200529 * is used to properly configure I2C devices.
530 *
531 * If no devices have pre-been declared for this bus, then be sure to
532 * register the adapter before any dynamically allocated ones. Otherwise
533 * the required bus ID may not be available.
534 *
535 * When this returns zero, the specified adapter became available for
536 * clients using the bus number provided in adap->nr. Also, the table
537 * of I2C devices pre-declared using i2c_register_board_info() is scanned,
538 * and the appropriate driver model device nodes are created. Otherwise, a
539 * negative errno value is returned.
540 */
541int i2c_add_numbered_adapter(struct i2c_adapter *adap)
542{
543 int id;
544 int status;
545
546 if (adap->nr & ~MAX_ID_MASK)
547 return -EINVAL;
548
549retry:
550 if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) == 0)
551 return -ENOMEM;
552
Jean Delvarecaada322008-01-27 18:14:49 +0100553 mutex_lock(&core_lock);
David Brownell6e13e642007-05-01 23:26:31 +0200554 /* "above" here means "above or equal to", sigh;
555 * we need the "equal to" result to force the result
556 */
557 status = idr_get_new_above(&i2c_adapter_idr, adap, adap->nr, &id);
558 if (status == 0 && id != adap->nr) {
559 status = -EBUSY;
560 idr_remove(&i2c_adapter_idr, id);
561 }
Jean Delvarecaada322008-01-27 18:14:49 +0100562 mutex_unlock(&core_lock);
David Brownell6e13e642007-05-01 23:26:31 +0200563 if (status == -EAGAIN)
564 goto retry;
565
566 if (status == 0)
567 status = i2c_register_adapter(adap);
568 return status;
569}
570EXPORT_SYMBOL_GPL(i2c_add_numbered_adapter);
571
Jean Delvare026526f2008-01-27 18:14:49 +0100572static int i2c_do_del_adapter(struct device_driver *d, void *data)
573{
574 struct i2c_driver *driver = to_i2c_driver(d);
575 struct i2c_adapter *adapter = data;
576 int res;
577
578 if (!driver->detach_adapter)
579 return 0;
580 res = driver->detach_adapter(adapter);
581 if (res)
582 dev_err(&adapter->dev, "detach_adapter failed (%d) "
583 "for driver [%s]\n", res, driver->driver.name);
584 return res;
585}
586
David Brownelld64f73b2007-07-12 14:12:28 +0200587/**
588 * i2c_del_adapter - unregister I2C adapter
589 * @adap: the adapter being unregistered
590 * Context: can sleep
591 *
592 * This unregisters an I2C adapter which was previously registered
593 * by @i2c_add_adapter or @i2c_add_numbered_adapter.
594 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700595int i2c_del_adapter(struct i2c_adapter *adap)
596{
597 struct list_head *item, *_n;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700598 struct i2c_client *client;
599 int res = 0;
600
Jean Delvarecaada322008-01-27 18:14:49 +0100601 mutex_lock(&core_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700602
603 /* First make sure that this adapter was ever added */
Jean Delvare87c6c222008-01-27 18:14:48 +0100604 if (idr_find(&i2c_adapter_idr, adap->nr) != adap) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200605 pr_debug("i2c-core: attempting to delete unregistered "
606 "adapter [%s]\n", adap->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700607 res = -EINVAL;
608 goto out_unlock;
609 }
610
Jean Delvare026526f2008-01-27 18:14:49 +0100611 /* Tell drivers about this removal */
612 res = bus_for_each_drv(&i2c_bus_type, NULL, adap,
613 i2c_do_del_adapter);
614 if (res)
615 goto out_unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700616
617 /* detach any active clients. This must be done first, because
Tobias Klausera551acc2005-05-19 21:40:38 +0200618 * it can fail; in which case we give up. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700619 list_for_each_safe(item, _n, &adap->clients) {
David Brownella1d9e6e2007-05-01 23:26:30 +0200620 struct i2c_driver *driver;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700621
David Brownella1d9e6e2007-05-01 23:26:30 +0200622 client = list_entry(item, struct i2c_client, list);
623 driver = client->driver;
624
625 /* new style, follow standard driver model */
626 if (!driver || is_newstyle_driver(driver)) {
627 i2c_unregister_device(client);
628 continue;
629 }
630
631 /* legacy drivers create and remove clients themselves */
632 if ((res = driver->detach_client(client))) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200633 dev_err(&adap->dev, "detach_client failed for client "
634 "[%s] at address 0x%02x\n", client->name,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700635 client->addr);
636 goto out_unlock;
637 }
638 }
639
640 /* clean up the sysfs representation */
641 init_completion(&adap->dev_released);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700642 device_unregister(&adap->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700643
644 /* wait for sysfs to drop all references */
645 wait_for_completion(&adap->dev_released);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700646
David Brownell6e13e642007-05-01 23:26:31 +0200647 /* free bus id */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648 idr_remove(&i2c_adapter_idr, adap->nr);
649
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200650 dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651
652 out_unlock:
Jean Delvarecaada322008-01-27 18:14:49 +0100653 mutex_unlock(&core_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700654 return res;
655}
David Brownellc0564602007-05-01 23:26:31 +0200656EXPORT_SYMBOL(i2c_del_adapter);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700657
658
David Brownell7b4fbc52007-05-01 23:26:30 +0200659/* ------------------------------------------------------------------------- */
660
661/*
662 * An i2c_driver is used with one or more i2c_client (device) nodes to access
663 * i2c slave chips, on a bus instance associated with some i2c_adapter. There
664 * are two models for binding the driver to its device: "new style" drivers
665 * follow the standard Linux driver model and just respond to probe() calls
666 * issued if the driver core sees they match(); "legacy" drivers create device
667 * nodes themselves.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700668 */
669
Greg Kroah-Hartmande59cf92005-12-06 15:33:15 -0800670int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700671{
Jean Delvare7eebcb72006-02-05 23:28:21 +0100672 int res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700673
David Brownell7b4fbc52007-05-01 23:26:30 +0200674 /* new style driver methods can't mix with legacy ones */
David Brownella1d9e6e2007-05-01 23:26:30 +0200675 if (is_newstyle_driver(driver)) {
David Brownell7b4fbc52007-05-01 23:26:30 +0200676 if (driver->attach_adapter || driver->detach_adapter
677 || driver->detach_client) {
678 printk(KERN_WARNING
679 "i2c-core: driver [%s] is confused\n",
680 driver->driver.name);
681 return -EINVAL;
682 }
683 }
684
Linus Torvalds1da177e2005-04-16 15:20:36 -0700685 /* add the driver to the list of i2c drivers in the driver core */
Greg Kroah-Hartmande59cf92005-12-06 15:33:15 -0800686 driver->driver.owner = owner;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700687 driver->driver.bus = &i2c_bus_type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688
David Brownell6e13e642007-05-01 23:26:31 +0200689 /* for new style drivers, when registration returns the driver core
690 * will have called probe() for all matching-but-unbound devices.
691 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700692 res = driver_register(&driver->driver);
693 if (res)
Jean Delvare7eebcb72006-02-05 23:28:21 +0100694 return res;
David Brownell438d6c22006-12-10 21:21:31 +0100695
Jean Delvarecaada322008-01-27 18:14:49 +0100696 mutex_lock(&core_lock);
Jean Delvare7eebcb72006-02-05 23:28:21 +0100697
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100698 pr_debug("i2c-core: driver [%s] registered\n", driver->driver.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700699
David Brownell7b4fbc52007-05-01 23:26:30 +0200700 /* legacy drivers scan i2c busses directly */
Jean Delvare8a994752005-11-26 20:28:06 +0100701 if (driver->attach_adapter) {
David Brownell4ad4eac2007-05-01 23:26:28 +0200702 struct i2c_adapter *adapter;
703
Jean Delvare87c6c222008-01-27 18:14:48 +0100704 down(&i2c_adapter_class.sem);
705 list_for_each_entry(adapter, &i2c_adapter_class.devices,
706 dev.node) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700707 driver->attach_adapter(adapter);
708 }
Jean Delvare87c6c222008-01-27 18:14:48 +0100709 up(&i2c_adapter_class.sem);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700710 }
711
Jean Delvarecaada322008-01-27 18:14:49 +0100712 mutex_unlock(&core_lock);
Jean Delvare7eebcb72006-02-05 23:28:21 +0100713 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700714}
Greg Kroah-Hartmande59cf92005-12-06 15:33:15 -0800715EXPORT_SYMBOL(i2c_register_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700716
David Brownella1d9e6e2007-05-01 23:26:30 +0200717/**
718 * i2c_del_driver - unregister I2C driver
719 * @driver: the driver being unregistered
David Brownelld64f73b2007-07-12 14:12:28 +0200720 * Context: can sleep
David Brownella1d9e6e2007-05-01 23:26:30 +0200721 */
Jean Delvareb3e82092007-05-01 23:26:32 +0200722void i2c_del_driver(struct i2c_driver *driver)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700723{
Jean Delvare87c6c222008-01-27 18:14:48 +0100724 struct list_head *item2, *_n;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700725 struct i2c_client *client;
726 struct i2c_adapter *adap;
David Brownell438d6c22006-12-10 21:21:31 +0100727
Jean Delvarecaada322008-01-27 18:14:49 +0100728 mutex_lock(&core_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700729
David Brownella1d9e6e2007-05-01 23:26:30 +0200730 /* new-style driver? */
731 if (is_newstyle_driver(driver))
732 goto unregister;
733
Linus Torvalds1da177e2005-04-16 15:20:36 -0700734 /* Have a look at each adapter, if clients of this driver are still
David Brownell438d6c22006-12-10 21:21:31 +0100735 * attached. If so, detach them to be able to kill the driver
Linus Torvalds1da177e2005-04-16 15:20:36 -0700736 * afterwards.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700737 */
Jean Delvare87c6c222008-01-27 18:14:48 +0100738 down(&i2c_adapter_class.sem);
739 list_for_each_entry(adap, &i2c_adapter_class.devices, dev.node) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700740 if (driver->detach_adapter) {
Jean Delvareb3e82092007-05-01 23:26:32 +0200741 if (driver->detach_adapter(adap)) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200742 dev_err(&adap->dev, "detach_adapter failed "
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100743 "for driver [%s]\n",
744 driver->driver.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700745 }
746 } else {
747 list_for_each_safe(item2, _n, &adap->clients) {
748 client = list_entry(item2, struct i2c_client, list);
749 if (client->driver != driver)
750 continue;
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200751 dev_dbg(&adap->dev, "detaching client [%s] "
752 "at 0x%02x\n", client->name,
753 client->addr);
Jean Delvareb3e82092007-05-01 23:26:32 +0200754 if (driver->detach_client(client)) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200755 dev_err(&adap->dev, "detach_client "
756 "failed for client [%s] at "
757 "0x%02x\n", client->name,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700758 client->addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700759 }
760 }
761 }
762 }
Jean Delvare87c6c222008-01-27 18:14:48 +0100763 up(&i2c_adapter_class.sem);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700764
David Brownella1d9e6e2007-05-01 23:26:30 +0200765 unregister:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700766 driver_unregister(&driver->driver);
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100767 pr_debug("i2c-core: driver [%s] unregistered\n", driver->driver.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700768
Jean Delvarecaada322008-01-27 18:14:49 +0100769 mutex_unlock(&core_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700770}
David Brownellc0564602007-05-01 23:26:31 +0200771EXPORT_SYMBOL(i2c_del_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700772
David Brownell7b4fbc52007-05-01 23:26:30 +0200773/* ------------------------------------------------------------------------- */
774
David Brownell9b766b82008-01-27 18:14:51 +0100775static int __i2c_check_addr(struct device *dev, void *addrp)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700776{
David Brownell9b766b82008-01-27 18:14:51 +0100777 struct i2c_client *client = i2c_verify_client(dev);
778 int addr = *(int *)addrp;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700779
David Brownell9b766b82008-01-27 18:14:51 +0100780 if (client && client->addr == addr)
781 return -EBUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700782 return 0;
783}
784
Jean Delvare5e31c2b2007-11-15 19:24:02 +0100785static int i2c_check_addr(struct i2c_adapter *adapter, int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700786{
David Brownell9b766b82008-01-27 18:14:51 +0100787 return device_for_each_child(&adapter->dev, &addr, __i2c_check_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700788}
789
790int i2c_attach_client(struct i2c_client *client)
791{
792 struct i2c_adapter *adapter = client->adapter;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200793 int res = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700794
Linus Torvalds1da177e2005-04-16 15:20:36 -0700795 client->dev.parent = &client->adapter->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700796 client->dev.bus = &i2c_bus_type;
David Brownell9c1600e2007-05-01 23:26:31 +0200797
798 if (client->driver)
799 client->dev.driver = &client->driver->driver;
800
David Brownellde81d2a2007-05-22 19:49:16 +0200801 if (client->driver && !is_newstyle_driver(client->driver)) {
David Brownell9c1600e2007-05-01 23:26:31 +0200802 client->dev.release = i2c_client_release;
David Brownellde81d2a2007-05-22 19:49:16 +0200803 client->dev.uevent_suppress = 1;
804 } else
David Brownell9c1600e2007-05-01 23:26:31 +0200805 client->dev.release = i2c_client_dev_release;
David Brownell438d6c22006-12-10 21:21:31 +0100806
Linus Torvalds1da177e2005-04-16 15:20:36 -0700807 snprintf(&client->dev.bus_id[0], sizeof(client->dev.bus_id),
808 "%d-%04x", i2c_adapter_id(adapter), client->addr);
Jean Delvareb119c6c2006-08-15 18:26:30 +0200809 res = device_register(&client->dev);
810 if (res)
David Brownell86ec5ec2008-01-27 18:14:51 +0100811 goto out_err;
812
813 mutex_lock(&adapter->clist_lock);
814 list_add_tail(&client->list, &adapter->clients);
Jean Delvareb119c6c2006-08-15 18:26:30 +0200815 mutex_unlock(&adapter->clist_lock);
Jean Delvare77ed74d2006-09-30 17:18:59 +0200816
David Brownell86ec5ec2008-01-27 18:14:51 +0100817 dev_dbg(&adapter->dev, "client [%s] registered with bus id %s\n",
818 client->name, client->dev.bus_id);
819
Jean Delvare77ed74d2006-09-30 17:18:59 +0200820 if (adapter->client_register) {
821 if (adapter->client_register(client)) {
822 dev_dbg(&adapter->dev, "client_register "
823 "failed for client [%s] at 0x%02x\n",
824 client->name, client->addr);
825 }
826 }
827
828 return 0;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200829
David Brownell86ec5ec2008-01-27 18:14:51 +0100830out_err:
Jean Delvareb119c6c2006-08-15 18:26:30 +0200831 dev_err(&adapter->dev, "Failed to attach i2c client %s at 0x%02x "
832 "(%d)\n", client->name, client->addr, res);
Jean Delvare77ed74d2006-09-30 17:18:59 +0200833 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700834}
David Brownellc0564602007-05-01 23:26:31 +0200835EXPORT_SYMBOL(i2c_attach_client);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700836
837int i2c_detach_client(struct i2c_client *client)
838{
839 struct i2c_adapter *adapter = client->adapter;
840 int res = 0;
David Brownell438d6c22006-12-10 21:21:31 +0100841
Linus Torvalds1da177e2005-04-16 15:20:36 -0700842 if (adapter->client_unregister) {
843 res = adapter->client_unregister(client);
844 if (res) {
845 dev_err(&client->dev,
Jean Delvare86749e82005-07-29 12:15:29 -0700846 "client_unregister [%s] failed, "
847 "client not detached\n", client->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848 goto out;
849 }
850 }
851
Ingo Molnar5c085d32006-01-18 23:16:04 +0100852 mutex_lock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700853 list_del(&client->list);
Jean Delvare9ddced12008-01-27 18:14:51 +0100854 mutex_unlock(&adapter->clist_lock);
855
Linus Torvalds1da177e2005-04-16 15:20:36 -0700856 init_completion(&client->released);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700857 device_unregister(&client->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700858 wait_for_completion(&client->released);
859
860 out:
861 return res;
862}
David Brownellc0564602007-05-01 23:26:31 +0200863EXPORT_SYMBOL(i2c_detach_client);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700864
Jean Delvaree48d3312008-01-27 18:14:48 +0100865/**
866 * i2c_use_client - increments the reference count of the i2c client structure
867 * @client: the client being referenced
868 *
869 * Each live reference to a client should be refcounted. The driver model does
870 * that automatically as part of driver binding, so that most drivers don't
871 * need to do this explicitly: they hold a reference until they're unbound
872 * from the device.
873 *
874 * A pointer to the client with the incremented reference counter is returned.
875 */
876struct i2c_client *i2c_use_client(struct i2c_client *client)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700877{
Jean Delvarebdc511f2008-01-27 18:14:48 +0100878 get_device(&client->dev);
Jean Delvaree48d3312008-01-27 18:14:48 +0100879 return client;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700880}
David Brownellc0564602007-05-01 23:26:31 +0200881EXPORT_SYMBOL(i2c_use_client);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700882
Jean Delvaree48d3312008-01-27 18:14:48 +0100883/**
884 * i2c_release_client - release a use of the i2c client structure
885 * @client: the client being no longer referenced
886 *
887 * Must be called when a user of a client is finished with it.
888 */
889void i2c_release_client(struct i2c_client *client)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700890{
Jean Delvarebdc511f2008-01-27 18:14:48 +0100891 put_device(&client->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700892}
David Brownellc0564602007-05-01 23:26:31 +0200893EXPORT_SYMBOL(i2c_release_client);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700894
David Brownell9b766b82008-01-27 18:14:51 +0100895struct i2c_cmd_arg {
896 unsigned cmd;
897 void *arg;
898};
899
900static int i2c_cmd(struct device *dev, void *_arg)
901{
902 struct i2c_client *client = i2c_verify_client(dev);
903 struct i2c_cmd_arg *arg = _arg;
904
905 if (client && client->driver && client->driver->command)
906 client->driver->command(client, arg->cmd, arg->arg);
907 return 0;
908}
909
Linus Torvalds1da177e2005-04-16 15:20:36 -0700910void i2c_clients_command(struct i2c_adapter *adap, unsigned int cmd, void *arg)
911{
David Brownell9b766b82008-01-27 18:14:51 +0100912 struct i2c_cmd_arg cmd_arg;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700913
David Brownell9b766b82008-01-27 18:14:51 +0100914 cmd_arg.cmd = cmd;
915 cmd_arg.arg = arg;
916 device_for_each_child(&adap->dev, &cmd_arg, i2c_cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700917}
David Brownellc0564602007-05-01 23:26:31 +0200918EXPORT_SYMBOL(i2c_clients_command);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700919
920static int __init i2c_init(void)
921{
922 int retval;
923
924 retval = bus_register(&i2c_bus_type);
925 if (retval)
926 return retval;
David Brownelle9f13732008-01-27 18:14:52 +0100927 retval = class_register(&i2c_adapter_class);
928 if (retval)
929 goto bus_err;
930 retval = i2c_add_driver(&dummy_driver);
931 if (retval)
932 goto class_err;
933 return 0;
934
935class_err:
936 class_unregister(&i2c_adapter_class);
937bus_err:
938 bus_unregister(&i2c_bus_type);
939 return retval;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700940}
941
942static void __exit i2c_exit(void)
943{
David Brownelle9f13732008-01-27 18:14:52 +0100944 i2c_del_driver(&dummy_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700945 class_unregister(&i2c_adapter_class);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700946 bus_unregister(&i2c_bus_type);
947}
948
949subsys_initcall(i2c_init);
950module_exit(i2c_exit);
951
952/* ----------------------------------------------------
953 * the functional interface to the i2c busses.
954 * ----------------------------------------------------
955 */
956
957int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg *msgs, int num)
958{
959 int ret;
960
961 if (adap->algo->master_xfer) {
962#ifdef DEBUG
963 for (ret = 0; ret < num; ret++) {
964 dev_dbg(&adap->dev, "master_xfer[%d] %c, addr=0x%02x, "
Jean Delvare209d27c2007-05-01 23:26:29 +0200965 "len=%d%s\n", ret, (msgs[ret].flags & I2C_M_RD)
966 ? 'R' : 'W', msgs[ret].addr, msgs[ret].len,
967 (msgs[ret].flags & I2C_M_RECV_LEN) ? "+" : "");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700968 }
969#endif
970
Mike Rapoportcea443a82008-01-27 18:14:50 +0100971 if (in_atomic() || irqs_disabled()) {
972 ret = mutex_trylock(&adap->bus_lock);
973 if (!ret)
974 /* I2C activity is ongoing. */
975 return -EAGAIN;
976 } else {
977 mutex_lock_nested(&adap->bus_lock, adap->level);
978 }
979
Linus Torvalds1da177e2005-04-16 15:20:36 -0700980 ret = adap->algo->master_xfer(adap,msgs,num);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100981 mutex_unlock(&adap->bus_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700982
983 return ret;
984 } else {
985 dev_dbg(&adap->dev, "I2C level transfers not supported\n");
986 return -ENOSYS;
987 }
988}
David Brownellc0564602007-05-01 23:26:31 +0200989EXPORT_SYMBOL(i2c_transfer);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700990
991int i2c_master_send(struct i2c_client *client,const char *buf ,int count)
992{
993 int ret;
994 struct i2c_adapter *adap=client->adapter;
995 struct i2c_msg msg;
996
Jean Delvare815f55f2005-05-07 22:58:46 +0200997 msg.addr = client->addr;
998 msg.flags = client->flags & I2C_M_TEN;
999 msg.len = count;
1000 msg.buf = (char *)buf;
David Brownell438d6c22006-12-10 21:21:31 +01001001
Jean Delvare815f55f2005-05-07 22:58:46 +02001002 ret = i2c_transfer(adap, &msg, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001003
Jean Delvare815f55f2005-05-07 22:58:46 +02001004 /* If everything went ok (i.e. 1 msg transmitted), return #bytes
1005 transmitted, else error code. */
1006 return (ret == 1) ? count : ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001007}
David Brownellc0564602007-05-01 23:26:31 +02001008EXPORT_SYMBOL(i2c_master_send);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001009
1010int i2c_master_recv(struct i2c_client *client, char *buf ,int count)
1011{
1012 struct i2c_adapter *adap=client->adapter;
1013 struct i2c_msg msg;
1014 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001015
Jean Delvare815f55f2005-05-07 22:58:46 +02001016 msg.addr = client->addr;
1017 msg.flags = client->flags & I2C_M_TEN;
1018 msg.flags |= I2C_M_RD;
1019 msg.len = count;
1020 msg.buf = buf;
1021
1022 ret = i2c_transfer(adap, &msg, 1);
1023
1024 /* If everything went ok (i.e. 1 msg transmitted), return #bytes
1025 transmitted, else error code. */
1026 return (ret == 1) ? count : ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001027}
David Brownellc0564602007-05-01 23:26:31 +02001028EXPORT_SYMBOL(i2c_master_recv);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001029
Linus Torvalds1da177e2005-04-16 15:20:36 -07001030/* ----------------------------------------------------
1031 * the i2c address scanning function
1032 * Will not work for 10-bit addresses!
1033 * ----------------------------------------------------
1034 */
Jean Delvarea89ba0b2005-08-09 20:17:55 +02001035static int i2c_probe_address(struct i2c_adapter *adapter, int addr, int kind,
1036 int (*found_proc) (struct i2c_adapter *, int, int))
Jean Delvare9fc6adf2005-07-31 21:20:43 +02001037{
Jean Delvarea89ba0b2005-08-09 20:17:55 +02001038 int err;
Jean Delvare9fc6adf2005-07-31 21:20:43 +02001039
Jean Delvarea89ba0b2005-08-09 20:17:55 +02001040 /* Make sure the address is valid */
1041 if (addr < 0x03 || addr > 0x77) {
1042 dev_warn(&adapter->dev, "Invalid probe address 0x%02x\n",
1043 addr);
1044 return -EINVAL;
Jean Delvare9fc6adf2005-07-31 21:20:43 +02001045 }
1046
Jean Delvarea89ba0b2005-08-09 20:17:55 +02001047 /* Skip if already in use */
1048 if (i2c_check_addr(adapter, addr))
1049 return 0;
1050
1051 /* Make sure there is something at this address, unless forced */
Jean Delvare4c9337d2005-08-09 20:28:10 +02001052 if (kind < 0) {
1053 if (i2c_smbus_xfer(adapter, addr, 0, 0, 0,
1054 I2C_SMBUS_QUICK, NULL) < 0)
1055 return 0;
1056
1057 /* prevent 24RF08 corruption */
1058 if ((addr & ~0x0f) == 0x50)
1059 i2c_smbus_xfer(adapter, addr, 0, 0, 0,
1060 I2C_SMBUS_QUICK, NULL);
1061 }
Jean Delvarea89ba0b2005-08-09 20:17:55 +02001062
1063 /* Finally call the custom detection function */
1064 err = found_proc(adapter, addr, kind);
Jean Delvarea89ba0b2005-08-09 20:17:55 +02001065 /* -ENODEV can be returned if there is a chip at the given address
1066 but it isn't supported by this chip driver. We catch it here as
1067 this isn't an error. */
Jean Delvare114fd182006-09-03 22:25:04 +02001068 if (err == -ENODEV)
1069 err = 0;
1070
1071 if (err)
1072 dev_warn(&adapter->dev, "Client creation failed at 0x%x (%d)\n",
1073 addr, err);
1074 return err;
Jean Delvare9fc6adf2005-07-31 21:20:43 +02001075}
1076
Linus Torvalds1da177e2005-04-16 15:20:36 -07001077int i2c_probe(struct i2c_adapter *adapter,
Mark M. Hoffmanbfb6df22008-01-27 18:14:46 +01001078 const struct i2c_client_address_data *address_data,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001079 int (*found_proc) (struct i2c_adapter *, int, int))
1080{
Jean Delvarea89ba0b2005-08-09 20:17:55 +02001081 int i, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001082 int adap_id = i2c_adapter_id(adapter);
1083
Jean Delvarea89ba0b2005-08-09 20:17:55 +02001084 /* Force entries are done first, and are not affected by ignore
1085 entries */
1086 if (address_data->forces) {
Mark M. Hoffmanbfb6df22008-01-27 18:14:46 +01001087 const unsigned short * const *forces = address_data->forces;
Jean Delvarea89ba0b2005-08-09 20:17:55 +02001088 int kind;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001089
Jean Delvarea89ba0b2005-08-09 20:17:55 +02001090 for (kind = 0; forces[kind]; kind++) {
1091 for (i = 0; forces[kind][i] != I2C_CLIENT_END;
1092 i += 2) {
1093 if (forces[kind][i] == adap_id
1094 || forces[kind][i] == ANY_I2C_BUS) {
1095 dev_dbg(&adapter->dev, "found force "
1096 "parameter for adapter %d, "
1097 "addr 0x%02x, kind %d\n",
1098 adap_id, forces[kind][i + 1],
1099 kind);
1100 err = i2c_probe_address(adapter,
1101 forces[kind][i + 1],
1102 kind, found_proc);
1103 if (err)
1104 return err;
1105 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001106 }
1107 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001108 }
Jean Delvarea89ba0b2005-08-09 20:17:55 +02001109
Jean Delvare4366dc92005-09-25 16:50:06 +02001110 /* Stop here if we can't use SMBUS_QUICK */
1111 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_QUICK)) {
1112 if (address_data->probe[0] == I2C_CLIENT_END
1113 && address_data->normal_i2c[0] == I2C_CLIENT_END)
David Brownell438d6c22006-12-10 21:21:31 +01001114 return 0;
Jean Delvare4366dc92005-09-25 16:50:06 +02001115
1116 dev_warn(&adapter->dev, "SMBus Quick command not supported, "
1117 "can't probe for chips\n");
1118 return -1;
1119 }
1120
Jean Delvarea89ba0b2005-08-09 20:17:55 +02001121 /* Probe entries are done second, and are not affected by ignore
1122 entries either */
1123 for (i = 0; address_data->probe[i] != I2C_CLIENT_END; i += 2) {
1124 if (address_data->probe[i] == adap_id
1125 || address_data->probe[i] == ANY_I2C_BUS) {
1126 dev_dbg(&adapter->dev, "found probe parameter for "
1127 "adapter %d, addr 0x%02x\n", adap_id,
1128 address_data->probe[i + 1]);
1129 err = i2c_probe_address(adapter,
1130 address_data->probe[i + 1],
1131 -1, found_proc);
1132 if (err)
1133 return err;
1134 }
1135 }
1136
1137 /* Normal entries are done last, unless shadowed by an ignore entry */
1138 for (i = 0; address_data->normal_i2c[i] != I2C_CLIENT_END; i += 1) {
1139 int j, ignore;
1140
1141 ignore = 0;
1142 for (j = 0; address_data->ignore[j] != I2C_CLIENT_END;
1143 j += 2) {
1144 if ((address_data->ignore[j] == adap_id ||
1145 address_data->ignore[j] == ANY_I2C_BUS)
1146 && address_data->ignore[j + 1]
1147 == address_data->normal_i2c[i]) {
1148 dev_dbg(&adapter->dev, "found ignore "
1149 "parameter for adapter %d, "
1150 "addr 0x%02x\n", adap_id,
1151 address_data->ignore[j + 1]);
Mark M. Hoffman2369df92006-07-01 17:01:59 +02001152 ignore = 1;
1153 break;
Jean Delvarea89ba0b2005-08-09 20:17:55 +02001154 }
Jean Delvarea89ba0b2005-08-09 20:17:55 +02001155 }
1156 if (ignore)
1157 continue;
1158
1159 dev_dbg(&adapter->dev, "found normal entry for adapter %d, "
1160 "addr 0x%02x\n", adap_id,
1161 address_data->normal_i2c[i]);
1162 err = i2c_probe_address(adapter, address_data->normal_i2c[i],
1163 -1, found_proc);
1164 if (err)
1165 return err;
1166 }
1167
Linus Torvalds1da177e2005-04-16 15:20:36 -07001168 return 0;
1169}
David Brownellc0564602007-05-01 23:26:31 +02001170EXPORT_SYMBOL(i2c_probe);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001171
Jean Delvare12b5053a2007-05-01 23:26:31 +02001172struct i2c_client *
1173i2c_new_probed_device(struct i2c_adapter *adap,
1174 struct i2c_board_info *info,
1175 unsigned short const *addr_list)
1176{
1177 int i;
1178
1179 /* Stop here if the bus doesn't support probing */
1180 if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_READ_BYTE)) {
1181 dev_err(&adap->dev, "Probing not supported\n");
1182 return NULL;
1183 }
1184
Jean Delvare12b5053a2007-05-01 23:26:31 +02001185 for (i = 0; addr_list[i] != I2C_CLIENT_END; i++) {
1186 /* Check address validity */
1187 if (addr_list[i] < 0x03 || addr_list[i] > 0x77) {
1188 dev_warn(&adap->dev, "Invalid 7-bit address "
1189 "0x%02x\n", addr_list[i]);
1190 continue;
1191 }
1192
1193 /* Check address availability */
David Brownell9b766b82008-01-27 18:14:51 +01001194 if (i2c_check_addr(adap, addr_list[i])) {
Jean Delvare12b5053a2007-05-01 23:26:31 +02001195 dev_dbg(&adap->dev, "Address 0x%02x already in "
1196 "use, not probing\n", addr_list[i]);
1197 continue;
1198 }
1199
1200 /* Test address responsiveness
1201 The default probe method is a quick write, but it is known
1202 to corrupt the 24RF08 EEPROMs due to a state machine bug,
1203 and could also irreversibly write-protect some EEPROMs, so
1204 for address ranges 0x30-0x37 and 0x50-0x5f, we use a byte
1205 read instead. Also, some bus drivers don't implement
1206 quick write, so we fallback to a byte read it that case
1207 too. */
1208 if ((addr_list[i] & ~0x07) == 0x30
1209 || (addr_list[i] & ~0x0f) == 0x50
1210 || !i2c_check_functionality(adap, I2C_FUNC_SMBUS_QUICK)) {
1211 if (i2c_smbus_xfer(adap, addr_list[i], 0,
1212 I2C_SMBUS_READ, 0,
1213 I2C_SMBUS_BYTE, NULL) >= 0)
1214 break;
1215 } else {
1216 if (i2c_smbus_xfer(adap, addr_list[i], 0,
1217 I2C_SMBUS_WRITE, 0,
1218 I2C_SMBUS_QUICK, NULL) >= 0)
1219 break;
1220 }
1221 }
Jean Delvare12b5053a2007-05-01 23:26:31 +02001222
1223 if (addr_list[i] == I2C_CLIENT_END) {
1224 dev_dbg(&adap->dev, "Probing failed, no device found\n");
1225 return NULL;
1226 }
1227
1228 info->addr = addr_list[i];
1229 return i2c_new_device(adap, info);
1230}
1231EXPORT_SYMBOL_GPL(i2c_new_probed_device);
1232
Linus Torvalds1da177e2005-04-16 15:20:36 -07001233struct i2c_adapter* i2c_get_adapter(int id)
1234{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001235 struct i2c_adapter *adapter;
David Brownell438d6c22006-12-10 21:21:31 +01001236
Jean Delvarecaada322008-01-27 18:14:49 +01001237 mutex_lock(&core_lock);
Mark M. Hoffmana0920e12005-06-28 00:21:30 -04001238 adapter = (struct i2c_adapter *)idr_find(&i2c_adapter_idr, id);
1239 if (adapter && !try_module_get(adapter->owner))
1240 adapter = NULL;
1241
Jean Delvarecaada322008-01-27 18:14:49 +01001242 mutex_unlock(&core_lock);
Mark M. Hoffmana0920e12005-06-28 00:21:30 -04001243 return adapter;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001244}
David Brownellc0564602007-05-01 23:26:31 +02001245EXPORT_SYMBOL(i2c_get_adapter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001246
1247void i2c_put_adapter(struct i2c_adapter *adap)
1248{
1249 module_put(adap->owner);
1250}
David Brownellc0564602007-05-01 23:26:31 +02001251EXPORT_SYMBOL(i2c_put_adapter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001252
1253/* The SMBus parts */
1254
David Brownell438d6c22006-12-10 21:21:31 +01001255#define POLY (0x1070U << 3)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001256static u8
1257crc8(u16 data)
1258{
1259 int i;
David Brownell438d6c22006-12-10 21:21:31 +01001260
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261 for(i = 0; i < 8; i++) {
David Brownell438d6c22006-12-10 21:21:31 +01001262 if (data & 0x8000)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001263 data = data ^ POLY;
1264 data = data << 1;
1265 }
1266 return (u8)(data >> 8);
1267}
1268
Jean Delvare421ef472005-10-26 21:28:55 +02001269/* Incremental CRC8 over count bytes in the array pointed to by p */
1270static u8 i2c_smbus_pec(u8 crc, u8 *p, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001271{
1272 int i;
1273
1274 for(i = 0; i < count; i++)
Jean Delvare421ef472005-10-26 21:28:55 +02001275 crc = crc8((crc ^ p[i]) << 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001276 return crc;
1277}
1278
Jean Delvare421ef472005-10-26 21:28:55 +02001279/* Assume a 7-bit address, which is reasonable for SMBus */
1280static u8 i2c_smbus_msg_pec(u8 pec, struct i2c_msg *msg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001281{
Jean Delvare421ef472005-10-26 21:28:55 +02001282 /* The address will be sent first */
1283 u8 addr = (msg->addr << 1) | !!(msg->flags & I2C_M_RD);
1284 pec = i2c_smbus_pec(pec, &addr, 1);
1285
1286 /* The data buffer follows */
1287 return i2c_smbus_pec(pec, msg->buf, msg->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001288}
1289
Jean Delvare421ef472005-10-26 21:28:55 +02001290/* Used for write only transactions */
1291static inline void i2c_smbus_add_pec(struct i2c_msg *msg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001292{
Jean Delvare421ef472005-10-26 21:28:55 +02001293 msg->buf[msg->len] = i2c_smbus_msg_pec(0, msg);
1294 msg->len++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001295}
1296
Jean Delvare421ef472005-10-26 21:28:55 +02001297/* Return <0 on CRC error
1298 If there was a write before this read (most cases) we need to take the
1299 partial CRC from the write part into account.
1300 Note that this function does modify the message (we need to decrease the
1301 message length to hide the CRC byte from the caller). */
1302static int i2c_smbus_check_pec(u8 cpec, struct i2c_msg *msg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001303{
Jean Delvare421ef472005-10-26 21:28:55 +02001304 u8 rpec = msg->buf[--msg->len];
1305 cpec = i2c_smbus_msg_pec(cpec, msg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001306
Linus Torvalds1da177e2005-04-16 15:20:36 -07001307 if (rpec != cpec) {
1308 pr_debug("i2c-core: Bad PEC 0x%02x vs. 0x%02x\n",
1309 rpec, cpec);
1310 return -1;
1311 }
David Brownell438d6c22006-12-10 21:21:31 +01001312 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001313}
1314
1315s32 i2c_smbus_write_quick(struct i2c_client *client, u8 value)
1316{
1317 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
David Brownell438d6c22006-12-10 21:21:31 +01001318 value,0,I2C_SMBUS_QUICK,NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001319}
David Brownellc0564602007-05-01 23:26:31 +02001320EXPORT_SYMBOL(i2c_smbus_write_quick);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001321
1322s32 i2c_smbus_read_byte(struct i2c_client *client)
1323{
1324 union i2c_smbus_data data;
1325 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
1326 I2C_SMBUS_READ,0,I2C_SMBUS_BYTE, &data))
1327 return -1;
1328 else
Jean Delvare7eff82c2006-09-03 22:24:00 +02001329 return data.byte;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001330}
David Brownellc0564602007-05-01 23:26:31 +02001331EXPORT_SYMBOL(i2c_smbus_read_byte);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001332
1333s32 i2c_smbus_write_byte(struct i2c_client *client, u8 value)
1334{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001335 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
Jean Delvare421ef472005-10-26 21:28:55 +02001336 I2C_SMBUS_WRITE, value, I2C_SMBUS_BYTE, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001337}
David Brownellc0564602007-05-01 23:26:31 +02001338EXPORT_SYMBOL(i2c_smbus_write_byte);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001339
1340s32 i2c_smbus_read_byte_data(struct i2c_client *client, u8 command)
1341{
1342 union i2c_smbus_data data;
1343 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
1344 I2C_SMBUS_READ,command, I2C_SMBUS_BYTE_DATA,&data))
1345 return -1;
1346 else
Jean Delvare7eff82c2006-09-03 22:24:00 +02001347 return data.byte;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001348}
David Brownellc0564602007-05-01 23:26:31 +02001349EXPORT_SYMBOL(i2c_smbus_read_byte_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001350
1351s32 i2c_smbus_write_byte_data(struct i2c_client *client, u8 command, u8 value)
1352{
1353 union i2c_smbus_data data;
1354 data.byte = value;
1355 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
1356 I2C_SMBUS_WRITE,command,
1357 I2C_SMBUS_BYTE_DATA,&data);
1358}
David Brownellc0564602007-05-01 23:26:31 +02001359EXPORT_SYMBOL(i2c_smbus_write_byte_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001360
1361s32 i2c_smbus_read_word_data(struct i2c_client *client, u8 command)
1362{
1363 union i2c_smbus_data data;
1364 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
1365 I2C_SMBUS_READ,command, I2C_SMBUS_WORD_DATA, &data))
1366 return -1;
1367 else
Jean Delvare7eff82c2006-09-03 22:24:00 +02001368 return data.word;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001369}
David Brownellc0564602007-05-01 23:26:31 +02001370EXPORT_SYMBOL(i2c_smbus_read_word_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001371
1372s32 i2c_smbus_write_word_data(struct i2c_client *client, u8 command, u16 value)
1373{
1374 union i2c_smbus_data data;
1375 data.word = value;
1376 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
1377 I2C_SMBUS_WRITE,command,
1378 I2C_SMBUS_WORD_DATA,&data);
1379}
David Brownellc0564602007-05-01 23:26:31 +02001380EXPORT_SYMBOL(i2c_smbus_write_word_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001381
David Brownella64ec072007-10-13 23:56:31 +02001382/**
1383 * i2c_smbus_read_block_data - SMBus block read request
1384 * @client: Handle to slave device
1385 * @command: Command byte issued to let the slave know what data should
1386 * be returned
1387 * @values: Byte array into which data will be read; big enough to hold
1388 * the data returned by the slave. SMBus allows at most 32 bytes.
1389 *
1390 * Returns the number of bytes read in the slave's response, else a
1391 * negative number to indicate some kind of error.
1392 *
1393 * Note that using this function requires that the client's adapter support
1394 * the I2C_FUNC_SMBUS_READ_BLOCK_DATA functionality. Not all adapter drivers
1395 * support this; its emulation through I2C messaging relies on a specific
1396 * mechanism (I2C_M_RECV_LEN) which may not be implemented.
1397 */
Jean Delvareb86a1bc2007-05-01 23:26:34 +02001398s32 i2c_smbus_read_block_data(struct i2c_client *client, u8 command,
1399 u8 *values)
1400{
1401 union i2c_smbus_data data;
1402
1403 if (i2c_smbus_xfer(client->adapter, client->addr, client->flags,
1404 I2C_SMBUS_READ, command,
1405 I2C_SMBUS_BLOCK_DATA, &data))
1406 return -1;
1407
1408 memcpy(values, &data.block[1], data.block[0]);
1409 return data.block[0];
1410}
1411EXPORT_SYMBOL(i2c_smbus_read_block_data);
1412
Linus Torvalds1da177e2005-04-16 15:20:36 -07001413s32 i2c_smbus_write_block_data(struct i2c_client *client, u8 command,
Krzysztof Halasa46f5ed72006-06-12 21:42:20 +02001414 u8 length, const u8 *values)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001415{
1416 union i2c_smbus_data data;
Jean Delvare76560322006-01-18 23:14:55 +01001417
Linus Torvalds1da177e2005-04-16 15:20:36 -07001418 if (length > I2C_SMBUS_BLOCK_MAX)
1419 length = I2C_SMBUS_BLOCK_MAX;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001420 data.block[0] = length;
Jean Delvare76560322006-01-18 23:14:55 +01001421 memcpy(&data.block[1], values, length);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001422 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
1423 I2C_SMBUS_WRITE,command,
1424 I2C_SMBUS_BLOCK_DATA,&data);
1425}
David Brownellc0564602007-05-01 23:26:31 +02001426EXPORT_SYMBOL(i2c_smbus_write_block_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001427
1428/* Returns the number of read bytes */
Jean Delvare4b2643d2007-07-12 14:12:29 +02001429s32 i2c_smbus_read_i2c_block_data(struct i2c_client *client, u8 command,
1430 u8 length, u8 *values)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001431{
1432 union i2c_smbus_data data;
Jean Delvare76560322006-01-18 23:14:55 +01001433
Jean Delvare4b2643d2007-07-12 14:12:29 +02001434 if (length > I2C_SMBUS_BLOCK_MAX)
1435 length = I2C_SMBUS_BLOCK_MAX;
1436 data.block[0] = length;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001437 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
1438 I2C_SMBUS_READ,command,
1439 I2C_SMBUS_I2C_BLOCK_DATA,&data))
1440 return -1;
Jean Delvare76560322006-01-18 23:14:55 +01001441
1442 memcpy(values, &data.block[1], data.block[0]);
1443 return data.block[0];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001444}
David Brownellc0564602007-05-01 23:26:31 +02001445EXPORT_SYMBOL(i2c_smbus_read_i2c_block_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001446
Jean Delvare21bbd692006-01-09 15:19:18 +11001447s32 i2c_smbus_write_i2c_block_data(struct i2c_client *client, u8 command,
Krzysztof Halasa46f5ed72006-06-12 21:42:20 +02001448 u8 length, const u8 *values)
Jean Delvare21bbd692006-01-09 15:19:18 +11001449{
1450 union i2c_smbus_data data;
1451
1452 if (length > I2C_SMBUS_BLOCK_MAX)
1453 length = I2C_SMBUS_BLOCK_MAX;
1454 data.block[0] = length;
1455 memcpy(data.block + 1, values, length);
1456 return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
1457 I2C_SMBUS_WRITE, command,
1458 I2C_SMBUS_I2C_BLOCK_DATA, &data);
1459}
David Brownellc0564602007-05-01 23:26:31 +02001460EXPORT_SYMBOL(i2c_smbus_write_i2c_block_data);
Jean Delvare21bbd692006-01-09 15:19:18 +11001461
David Brownell438d6c22006-12-10 21:21:31 +01001462/* Simulate a SMBus command using the i2c protocol
Linus Torvalds1da177e2005-04-16 15:20:36 -07001463 No checking of parameters is done! */
David Brownell438d6c22006-12-10 21:21:31 +01001464static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001465 unsigned short flags,
David Brownell438d6c22006-12-10 21:21:31 +01001466 char read_write, u8 command, int size,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001467 union i2c_smbus_data * data)
1468{
1469 /* So we need to generate a series of msgs. In the case of writing, we
1470 need to use only one message; when reading, we need two. We initialize
1471 most things with sane defaults, to keep the code below somewhat
1472 simpler. */
Hideki Iwamoto5c50d182005-09-25 17:01:11 +02001473 unsigned char msgbuf0[I2C_SMBUS_BLOCK_MAX+3];
1474 unsigned char msgbuf1[I2C_SMBUS_BLOCK_MAX+2];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001475 int num = read_write == I2C_SMBUS_READ?2:1;
David Brownell438d6c22006-12-10 21:21:31 +01001476 struct i2c_msg msg[2] = { { addr, flags, 1, msgbuf0 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07001477 { addr, flags | I2C_M_RD, 0, msgbuf1 }
1478 };
1479 int i;
Jean Delvare421ef472005-10-26 21:28:55 +02001480 u8 partial_pec = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001481
1482 msgbuf0[0] = command;
1483 switch(size) {
1484 case I2C_SMBUS_QUICK:
1485 msg[0].len = 0;
1486 /* Special case: The read/write field is used as data */
1487 msg[0].flags = flags | (read_write==I2C_SMBUS_READ)?I2C_M_RD:0;
1488 num = 1;
1489 break;
1490 case I2C_SMBUS_BYTE:
1491 if (read_write == I2C_SMBUS_READ) {
1492 /* Special case: only a read! */
1493 msg[0].flags = I2C_M_RD | flags;
1494 num = 1;
1495 }
1496 break;
1497 case I2C_SMBUS_BYTE_DATA:
1498 if (read_write == I2C_SMBUS_READ)
1499 msg[1].len = 1;
1500 else {
1501 msg[0].len = 2;
1502 msgbuf0[1] = data->byte;
1503 }
1504 break;
1505 case I2C_SMBUS_WORD_DATA:
1506 if (read_write == I2C_SMBUS_READ)
1507 msg[1].len = 2;
1508 else {
1509 msg[0].len=3;
1510 msgbuf0[1] = data->word & 0xff;
Jean Delvare7eff82c2006-09-03 22:24:00 +02001511 msgbuf0[2] = data->word >> 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001512 }
1513 break;
1514 case I2C_SMBUS_PROC_CALL:
1515 num = 2; /* Special case */
1516 read_write = I2C_SMBUS_READ;
1517 msg[0].len = 3;
1518 msg[1].len = 2;
1519 msgbuf0[1] = data->word & 0xff;
Jean Delvare7eff82c2006-09-03 22:24:00 +02001520 msgbuf0[2] = data->word >> 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001521 break;
1522 case I2C_SMBUS_BLOCK_DATA:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001523 if (read_write == I2C_SMBUS_READ) {
Jean Delvare209d27c2007-05-01 23:26:29 +02001524 msg[1].flags |= I2C_M_RECV_LEN;
1525 msg[1].len = 1; /* block length will be added by
1526 the underlying bus driver */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001527 } else {
1528 msg[0].len = data->block[0] + 2;
1529 if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 2) {
1530 dev_err(&adapter->dev, "smbus_access called with "
1531 "invalid block write size (%d)\n",
1532 data->block[0]);
1533 return -1;
1534 }
Hideki Iwamoto5c50d182005-09-25 17:01:11 +02001535 for (i = 1; i < msg[0].len; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001536 msgbuf0[i] = data->block[i-1];
1537 }
1538 break;
1539 case I2C_SMBUS_BLOCK_PROC_CALL:
Jean Delvare209d27c2007-05-01 23:26:29 +02001540 num = 2; /* Another special case */
1541 read_write = I2C_SMBUS_READ;
1542 if (data->block[0] > I2C_SMBUS_BLOCK_MAX) {
1543 dev_err(&adapter->dev, "%s called with invalid "
Harvey Harrison08882d22008-04-22 22:16:47 +02001544 "block proc call size (%d)\n", __func__,
Jean Delvare209d27c2007-05-01 23:26:29 +02001545 data->block[0]);
1546 return -1;
1547 }
1548 msg[0].len = data->block[0] + 2;
1549 for (i = 1; i < msg[0].len; i++)
1550 msgbuf0[i] = data->block[i-1];
1551 msg[1].flags |= I2C_M_RECV_LEN;
1552 msg[1].len = 1; /* block length will be added by
1553 the underlying bus driver */
1554 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001555 case I2C_SMBUS_I2C_BLOCK_DATA:
1556 if (read_write == I2C_SMBUS_READ) {
Jean Delvare4b2643d2007-07-12 14:12:29 +02001557 msg[1].len = data->block[0];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001558 } else {
1559 msg[0].len = data->block[0] + 1;
Jean Delvare30dac742005-10-08 00:15:59 +02001560 if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 1) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001561 dev_err(&adapter->dev, "i2c_smbus_xfer_emulated called with "
1562 "invalid block write size (%d)\n",
1563 data->block[0]);
1564 return -1;
1565 }
1566 for (i = 1; i <= data->block[0]; i++)
1567 msgbuf0[i] = data->block[i];
1568 }
1569 break;
1570 default:
1571 dev_err(&adapter->dev, "smbus_access called with invalid size (%d)\n",
1572 size);
1573 return -1;
1574 }
1575
Jean Delvare421ef472005-10-26 21:28:55 +02001576 i = ((flags & I2C_CLIENT_PEC) && size != I2C_SMBUS_QUICK
1577 && size != I2C_SMBUS_I2C_BLOCK_DATA);
1578 if (i) {
1579 /* Compute PEC if first message is a write */
1580 if (!(msg[0].flags & I2C_M_RD)) {
David Brownell438d6c22006-12-10 21:21:31 +01001581 if (num == 1) /* Write only */
Jean Delvare421ef472005-10-26 21:28:55 +02001582 i2c_smbus_add_pec(&msg[0]);
1583 else /* Write followed by read */
1584 partial_pec = i2c_smbus_msg_pec(0, &msg[0]);
1585 }
1586 /* Ask for PEC if last message is a read */
1587 if (msg[num-1].flags & I2C_M_RD)
David Brownell438d6c22006-12-10 21:21:31 +01001588 msg[num-1].len++;
Jean Delvare421ef472005-10-26 21:28:55 +02001589 }
1590
Linus Torvalds1da177e2005-04-16 15:20:36 -07001591 if (i2c_transfer(adapter, msg, num) < 0)
1592 return -1;
1593
Jean Delvare421ef472005-10-26 21:28:55 +02001594 /* Check PEC if last message is a read */
1595 if (i && (msg[num-1].flags & I2C_M_RD)) {
1596 if (i2c_smbus_check_pec(partial_pec, &msg[num-1]) < 0)
1597 return -1;
1598 }
1599
Linus Torvalds1da177e2005-04-16 15:20:36 -07001600 if (read_write == I2C_SMBUS_READ)
1601 switch(size) {
1602 case I2C_SMBUS_BYTE:
1603 data->byte = msgbuf0[0];
1604 break;
1605 case I2C_SMBUS_BYTE_DATA:
1606 data->byte = msgbuf1[0];
1607 break;
David Brownell438d6c22006-12-10 21:21:31 +01001608 case I2C_SMBUS_WORD_DATA:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001609 case I2C_SMBUS_PROC_CALL:
1610 data->word = msgbuf1[0] | (msgbuf1[1] << 8);
1611 break;
1612 case I2C_SMBUS_I2C_BLOCK_DATA:
Jean Delvare4b2643d2007-07-12 14:12:29 +02001613 for (i = 0; i < data->block[0]; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001614 data->block[i+1] = msgbuf1[i];
1615 break;
Jean Delvare209d27c2007-05-01 23:26:29 +02001616 case I2C_SMBUS_BLOCK_DATA:
1617 case I2C_SMBUS_BLOCK_PROC_CALL:
1618 for (i = 0; i < msgbuf1[0] + 1; i++)
1619 data->block[i] = msgbuf1[i];
1620 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001621 }
1622 return 0;
1623}
1624
1625
1626s32 i2c_smbus_xfer(struct i2c_adapter * adapter, u16 addr, unsigned short flags,
David Brownell438d6c22006-12-10 21:21:31 +01001627 char read_write, u8 command, int size,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001628 union i2c_smbus_data * data)
1629{
1630 s32 res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001631
1632 flags &= I2C_M_TEN | I2C_CLIENT_PEC;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001633
1634 if (adapter->algo->smbus_xfer) {
Ingo Molnar5c085d32006-01-18 23:16:04 +01001635 mutex_lock(&adapter->bus_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001636 res = adapter->algo->smbus_xfer(adapter,addr,flags,read_write,
1637 command,size,data);
Ingo Molnar5c085d32006-01-18 23:16:04 +01001638 mutex_unlock(&adapter->bus_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001639 } else
1640 res = i2c_smbus_xfer_emulated(adapter,addr,flags,read_write,
1641 command,size,data);
1642
Linus Torvalds1da177e2005-04-16 15:20:36 -07001643 return res;
1644}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001645EXPORT_SYMBOL(i2c_smbus_xfer);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001646
1647MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
1648MODULE_DESCRIPTION("I2C-Bus main module");
1649MODULE_LICENSE("GPL");