blob: a7dcdc69b9e76bb59ec8d9b2e9704e588abd7102 [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>
Jean Delvareb8d6f452007-02-13 22:09:00 +010035#include <linux/completion.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070036#include <asm/uaccess.h>
37
David Brownell9c1600e2007-05-01 23:26:31 +020038#include "i2c-core.h"
39
Linus Torvalds1da177e2005-04-16 15:20:36 -070040
41static LIST_HEAD(adapters);
42static LIST_HEAD(drivers);
Arjan van de Venb3585e42006-01-11 10:50:26 +010043static DEFINE_MUTEX(core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -070044static DEFINE_IDR(i2c_adapter_idr);
45
David Brownella1d9e6e2007-05-01 23:26:30 +020046#define is_newstyle_driver(d) ((d)->probe || (d)->remove)
David Brownellf37dd802007-02-13 22:09:00 +010047
48/* ------------------------------------------------------------------------- */
49
Linus Torvalds1da177e2005-04-16 15:20:36 -070050static int i2c_device_match(struct device *dev, struct device_driver *drv)
51{
David Brownell7b4fbc52007-05-01 23:26:30 +020052 struct i2c_client *client = to_i2c_client(dev);
53 struct i2c_driver *driver = to_i2c_driver(drv);
54
55 /* make legacy i2c drivers bypass driver model probing entirely;
56 * such drivers scan each i2c adapter/bus themselves.
57 */
David Brownella1d9e6e2007-05-01 23:26:30 +020058 if (!is_newstyle_driver(driver))
David Brownell7b4fbc52007-05-01 23:26:30 +020059 return 0;
60
61 /* new style drivers use the same kind of driver matching policy
62 * as platform devices or SPI: compare device and driver IDs.
63 */
64 return strcmp(client->driver_name, drv->name) == 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -070065}
66
David Brownell7b4fbc52007-05-01 23:26:30 +020067#ifdef CONFIG_HOTPLUG
68
69/* uevent helps with hotplug: modprobe -q $(MODALIAS) */
70static int i2c_device_uevent(struct device *dev, char **envp, int num_envp,
71 char *buffer, int buffer_size)
72{
73 struct i2c_client *client = to_i2c_client(dev);
74 int i = 0, length = 0;
75
76 /* by definition, legacy drivers can't hotplug */
77 if (dev->driver || !client->driver_name)
78 return 0;
79
80 if (add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length,
81 "MODALIAS=%s", client->driver_name))
82 return -ENOMEM;
83 envp[i] = NULL;
84 dev_dbg(dev, "uevent\n");
85 return 0;
86}
87
88#else
89#define i2c_device_uevent NULL
90#endif /* CONFIG_HOTPLUG */
91
Linus Torvalds1da177e2005-04-16 15:20:36 -070092static int i2c_device_probe(struct device *dev)
93{
David Brownell7b4fbc52007-05-01 23:26:30 +020094 struct i2c_client *client = to_i2c_client(dev);
95 struct i2c_driver *driver = to_i2c_driver(dev->driver);
96
97 if (!driver->probe)
98 return -ENODEV;
99 client->driver = driver;
100 dev_dbg(dev, "probe\n");
101 return driver->probe(client);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102}
103
104static int i2c_device_remove(struct device *dev)
105{
David Brownella1d9e6e2007-05-01 23:26:30 +0200106 struct i2c_client *client = to_i2c_client(dev);
107 struct i2c_driver *driver;
108 int status;
109
110 if (!dev->driver)
111 return 0;
112
113 driver = to_i2c_driver(dev->driver);
114 if (driver->remove) {
115 dev_dbg(dev, "remove\n");
116 status = driver->remove(client);
117 } else {
118 dev->driver = NULL;
119 status = 0;
120 }
121 if (status == 0)
122 client->driver = NULL;
123 return status;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124}
125
David Brownellf37dd802007-02-13 22:09:00 +0100126static void i2c_device_shutdown(struct device *dev)
127{
128 struct i2c_driver *driver;
129
130 if (!dev->driver)
131 return;
132 driver = to_i2c_driver(dev->driver);
133 if (driver->shutdown)
134 driver->shutdown(to_i2c_client(dev));
135}
136
137static int i2c_device_suspend(struct device * dev, pm_message_t mesg)
138{
139 struct i2c_driver *driver;
140
141 if (!dev->driver)
142 return 0;
143 driver = to_i2c_driver(dev->driver);
144 if (!driver->suspend)
145 return 0;
146 return driver->suspend(to_i2c_client(dev), mesg);
147}
148
149static int i2c_device_resume(struct device * dev)
150{
151 struct i2c_driver *driver;
152
153 if (!dev->driver)
154 return 0;
155 driver = to_i2c_driver(dev->driver);
156 if (!driver->resume)
157 return 0;
158 return driver->resume(to_i2c_client(dev));
159}
160
David Brownell7b4fbc52007-05-01 23:26:30 +0200161static void i2c_client_release(struct device *dev)
162{
163 struct i2c_client *client = to_i2c_client(dev);
164 complete(&client->released);
165}
166
David Brownell9c1600e2007-05-01 23:26:31 +0200167static void i2c_client_dev_release(struct device *dev)
168{
169 kfree(to_i2c_client(dev));
170}
171
David Brownell7b4fbc52007-05-01 23:26:30 +0200172static ssize_t show_client_name(struct device *dev, struct device_attribute *attr, char *buf)
173{
174 struct i2c_client *client = to_i2c_client(dev);
175 return sprintf(buf, "%s\n", client->name);
176}
177
178static ssize_t show_modalias(struct device *dev, struct device_attribute *attr, char *buf)
179{
180 struct i2c_client *client = to_i2c_client(dev);
181 return client->driver_name
182 ? sprintf(buf, "%s\n", client->driver_name)
183 : 0;
184}
185
186static struct device_attribute i2c_dev_attrs[] = {
187 __ATTR(name, S_IRUGO, show_client_name, NULL),
188 /* modalias helps coldplug: modprobe $(cat .../modalias) */
189 __ATTR(modalias, S_IRUGO, show_modalias, NULL),
190 { },
191};
192
Russell Kingb864c7d2006-01-05 14:37:50 +0000193struct bus_type i2c_bus_type = {
David Brownellf37dd802007-02-13 22:09:00 +0100194 .name = "i2c",
David Brownell7b4fbc52007-05-01 23:26:30 +0200195 .dev_attrs = i2c_dev_attrs,
David Brownellf37dd802007-02-13 22:09:00 +0100196 .match = i2c_device_match,
David Brownell7b4fbc52007-05-01 23:26:30 +0200197 .uevent = i2c_device_uevent,
David Brownellf37dd802007-02-13 22:09:00 +0100198 .probe = i2c_device_probe,
199 .remove = i2c_device_remove,
200 .shutdown = i2c_device_shutdown,
201 .suspend = i2c_device_suspend,
202 .resume = i2c_device_resume,
Russell Kingb864c7d2006-01-05 14:37:50 +0000203};
204
David Brownell9c1600e2007-05-01 23:26:31 +0200205/**
206 * i2c_new_device - instantiate an i2c device for use with a new style driver
207 * @adap: the adapter managing the device
208 * @info: describes one I2C device; bus_num is ignored
209 *
210 * Create a device to work with a new style i2c driver, where binding is
211 * handled through driver model probe()/remove() methods. This call is not
212 * appropriate for use by mainboad initialization logic, which usually runs
213 * during an arch_initcall() long before any i2c_adapter could exist.
214 *
215 * This returns the new i2c client, which may be saved for later use with
216 * i2c_unregister_device(); or NULL to indicate an error.
217 */
218struct i2c_client *
219i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
220{
221 struct i2c_client *client;
222 int status;
223
224 client = kzalloc(sizeof *client, GFP_KERNEL);
225 if (!client)
226 return NULL;
227
228 client->adapter = adap;
229
230 client->dev.platform_data = info->platform_data;
231 client->flags = info->flags;
232 client->addr = info->addr;
233 client->irq = info->irq;
234
235 strlcpy(client->driver_name, info->driver_name,
236 sizeof(client->driver_name));
237 strlcpy(client->name, info->type, sizeof(client->name));
238
239 /* a new style driver may be bound to this device when we
240 * return from this function, or any later moment (e.g. maybe
241 * hotplugging will load the driver module). and the device
242 * refcount model is the standard driver model one.
243 */
244 status = i2c_attach_client(client);
245 if (status < 0) {
246 kfree(client);
247 client = NULL;
248 }
249 return client;
250}
251EXPORT_SYMBOL_GPL(i2c_new_device);
252
253
254/**
255 * i2c_unregister_device - reverse effect of i2c_new_device()
256 * @client: value returned from i2c_new_device()
257 */
258void i2c_unregister_device(struct i2c_client *client)
David Brownella1d9e6e2007-05-01 23:26:30 +0200259{
260 struct i2c_adapter *adapter = client->adapter;
261 struct i2c_driver *driver = client->driver;
262
263 if (driver && !is_newstyle_driver(driver)) {
264 dev_err(&client->dev, "can't unregister devices "
265 "with legacy drivers\n");
266 WARN_ON(1);
267 return;
268 }
269
270 mutex_lock(&adapter->clist_lock);
271 list_del(&client->list);
272 mutex_unlock(&adapter->clist_lock);
273
274 device_unregister(&client->dev);
275}
David Brownell9c1600e2007-05-01 23:26:31 +0200276EXPORT_SYMBOL_GPL(i2c_unregister_device);
David Brownella1d9e6e2007-05-01 23:26:30 +0200277
278
David Brownellf37dd802007-02-13 22:09:00 +0100279/* ------------------------------------------------------------------------- */
280
David Brownell16ffadf2007-05-01 23:26:28 +0200281/* I2C bus adapters -- one roots each I2C or SMBUS segment */
282
Jean Delvareefde7232005-07-20 23:03:50 +0200283void i2c_adapter_dev_release(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700284{
David Brownellef2c83212007-05-01 23:26:28 +0200285 struct i2c_adapter *adap = to_i2c_adapter(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700286 complete(&adap->dev_released);
287}
288
David Brownell16ffadf2007-05-01 23:26:28 +0200289static ssize_t
290show_adapter_name(struct device *dev, struct device_attribute *attr, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700291{
David Brownellef2c83212007-05-01 23:26:28 +0200292 struct i2c_adapter *adap = to_i2c_adapter(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700293 return sprintf(buf, "%s\n", adap->name);
294}
David Brownell16ffadf2007-05-01 23:26:28 +0200295
296static struct device_attribute i2c_adapter_attrs[] = {
297 __ATTR(name, S_IRUGO, show_adapter_name, NULL),
298 { },
299};
300
301struct class i2c_adapter_class = {
302 .owner = THIS_MODULE,
303 .name = "i2c-adapter",
304 .dev_attrs = i2c_adapter_attrs,
305};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700306
David Brownell9c1600e2007-05-01 23:26:31 +0200307static void i2c_scan_static_board_info(struct i2c_adapter *adapter)
308{
309 struct i2c_devinfo *devinfo;
310
311 mutex_lock(&__i2c_board_lock);
312 list_for_each_entry(devinfo, &__i2c_board_list, list) {
313 if (devinfo->busnum == adapter->nr
314 && !i2c_new_device(adapter,
315 &devinfo->board_info))
316 printk(KERN_ERR "i2c-core: can't create i2c%d-%04x\n",
317 i2c_adapter_id(adapter),
318 devinfo->board_info.addr);
319 }
320 mutex_unlock(&__i2c_board_lock);
321}
322
Linus Torvalds1da177e2005-04-16 15:20:36 -0700323
Linus Torvalds1da177e2005-04-16 15:20:36 -0700324/* -----
325 * i2c_add_adapter is called from within the algorithm layer,
326 * when a new hw adapter registers. A new device is register to be
327 * available for clients.
328 */
329int i2c_add_adapter(struct i2c_adapter *adap)
330{
331 int id, res = 0;
332 struct list_head *item;
333 struct i2c_driver *driver;
334
Arjan van de Venb3585e42006-01-11 10:50:26 +0100335 mutex_lock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700336
337 if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) == 0) {
338 res = -ENOMEM;
339 goto out_unlock;
340 }
341
Mark M. Hoffmana0920e12005-06-28 00:21:30 -0400342 res = idr_get_new(&i2c_adapter_idr, adap, &id);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700343 if (res < 0) {
344 if (res == -EAGAIN)
345 res = -ENOMEM;
346 goto out_unlock;
347 }
348
349 adap->nr = id & MAX_ID_MASK;
Ingo Molnar5c085d32006-01-18 23:16:04 +0100350 mutex_init(&adap->bus_lock);
351 mutex_init(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700352 list_add_tail(&adap->list,&adapters);
353 INIT_LIST_HEAD(&adap->clients);
354
355 /* Add the adapter to the driver core.
356 * If the parent pointer is not set up,
357 * we add this adapter to the host bus.
358 */
David Brownellb119dc32007-01-04 13:07:04 +0100359 if (adap->dev.parent == NULL) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700360 adap->dev.parent = &platform_bus;
Jean Delvarefe2c8d52007-02-13 22:09:04 +0100361 pr_debug("I2C adapter driver [%s] forgot to specify "
362 "physical device\n", adap->name);
David Brownellb119dc32007-01-04 13:07:04 +0100363 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700364 sprintf(adap->dev.bus_id, "i2c-%d", adap->nr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700365 adap->dev.release = &i2c_adapter_dev_release;
Jean Delvarefccb56e2007-05-01 23:26:27 +0200366 adap->dev.class = &i2c_adapter_class;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200367 res = device_register(&adap->dev);
368 if (res)
369 goto out_list;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700370
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200371 dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name);
372
David Brownell7b4fbc52007-05-01 23:26:30 +0200373 /* let legacy drivers scan this bus for matching devices */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700374 list_for_each(item,&drivers) {
375 driver = list_entry(item, struct i2c_driver, list);
Jean Delvare8a994752005-11-26 20:28:06 +0100376 if (driver->attach_adapter)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700377 /* We ignore the return code; if it fails, too bad */
378 driver->attach_adapter(adap);
379 }
380
Linus Torvalds1da177e2005-04-16 15:20:36 -0700381out_unlock:
Arjan van de Venb3585e42006-01-11 10:50:26 +0100382 mutex_unlock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700383 return res;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200384
Jean Delvareb119c6c2006-08-15 18:26:30 +0200385out_list:
386 list_del(&adap->list);
387 idr_remove(&i2c_adapter_idr, adap->nr);
388 goto out_unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700389}
390
Linus Torvalds1da177e2005-04-16 15:20:36 -0700391int i2c_del_adapter(struct i2c_adapter *adap)
392{
393 struct list_head *item, *_n;
394 struct i2c_adapter *adap_from_list;
395 struct i2c_driver *driver;
396 struct i2c_client *client;
397 int res = 0;
398
Arjan van de Venb3585e42006-01-11 10:50:26 +0100399 mutex_lock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700400
401 /* First make sure that this adapter was ever added */
402 list_for_each_entry(adap_from_list, &adapters, list) {
403 if (adap_from_list == adap)
404 break;
405 }
406 if (adap_from_list != adap) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200407 pr_debug("i2c-core: attempting to delete unregistered "
408 "adapter [%s]\n", adap->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700409 res = -EINVAL;
410 goto out_unlock;
411 }
412
413 list_for_each(item,&drivers) {
414 driver = list_entry(item, struct i2c_driver, list);
415 if (driver->detach_adapter)
416 if ((res = driver->detach_adapter(adap))) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200417 dev_err(&adap->dev, "detach_adapter failed "
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100418 "for driver [%s]\n",
419 driver->driver.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700420 goto out_unlock;
421 }
422 }
423
424 /* detach any active clients. This must be done first, because
Tobias Klausera551acc2005-05-19 21:40:38 +0200425 * it can fail; in which case we give up. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700426 list_for_each_safe(item, _n, &adap->clients) {
David Brownella1d9e6e2007-05-01 23:26:30 +0200427 struct i2c_driver *driver;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700428
David Brownella1d9e6e2007-05-01 23:26:30 +0200429 client = list_entry(item, struct i2c_client, list);
430 driver = client->driver;
431
432 /* new style, follow standard driver model */
433 if (!driver || is_newstyle_driver(driver)) {
434 i2c_unregister_device(client);
435 continue;
436 }
437
438 /* legacy drivers create and remove clients themselves */
439 if ((res = driver->detach_client(client))) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200440 dev_err(&adap->dev, "detach_client failed for client "
441 "[%s] at address 0x%02x\n", client->name,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700442 client->addr);
443 goto out_unlock;
444 }
445 }
446
447 /* clean up the sysfs representation */
448 init_completion(&adap->dev_released);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700449 device_unregister(&adap->dev);
450 list_del(&adap->list);
451
452 /* wait for sysfs to drop all references */
453 wait_for_completion(&adap->dev_released);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700454
455 /* free dynamically allocated bus id */
456 idr_remove(&i2c_adapter_idr, adap->nr);
457
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200458 dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700459
460 out_unlock:
Arjan van de Venb3585e42006-01-11 10:50:26 +0100461 mutex_unlock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700462 return res;
463}
464
465
David Brownell7b4fbc52007-05-01 23:26:30 +0200466/* ------------------------------------------------------------------------- */
467
468/*
469 * An i2c_driver is used with one or more i2c_client (device) nodes to access
470 * i2c slave chips, on a bus instance associated with some i2c_adapter. There
471 * are two models for binding the driver to its device: "new style" drivers
472 * follow the standard Linux driver model and just respond to probe() calls
473 * issued if the driver core sees they match(); "legacy" drivers create device
474 * nodes themselves.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700475 */
476
Greg Kroah-Hartmande59cf92005-12-06 15:33:15 -0800477int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700478{
Jean Delvare7eebcb72006-02-05 23:28:21 +0100479 int res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700480
David Brownell7b4fbc52007-05-01 23:26:30 +0200481 /* new style driver methods can't mix with legacy ones */
David Brownella1d9e6e2007-05-01 23:26:30 +0200482 if (is_newstyle_driver(driver)) {
David Brownell7b4fbc52007-05-01 23:26:30 +0200483 if (driver->attach_adapter || driver->detach_adapter
484 || driver->detach_client) {
485 printk(KERN_WARNING
486 "i2c-core: driver [%s] is confused\n",
487 driver->driver.name);
488 return -EINVAL;
489 }
490 }
491
Linus Torvalds1da177e2005-04-16 15:20:36 -0700492 /* add the driver to the list of i2c drivers in the driver core */
Greg Kroah-Hartmande59cf92005-12-06 15:33:15 -0800493 driver->driver.owner = owner;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700494 driver->driver.bus = &i2c_bus_type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700495
496 res = driver_register(&driver->driver);
497 if (res)
Jean Delvare7eebcb72006-02-05 23:28:21 +0100498 return res;
David Brownell438d6c22006-12-10 21:21:31 +0100499
Jean Delvare7eebcb72006-02-05 23:28:21 +0100500 mutex_lock(&core_lists);
501
Linus Torvalds1da177e2005-04-16 15:20:36 -0700502 list_add_tail(&driver->list,&drivers);
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100503 pr_debug("i2c-core: driver [%s] registered\n", driver->driver.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700504
David Brownell7b4fbc52007-05-01 23:26:30 +0200505 /* legacy drivers scan i2c busses directly */
Jean Delvare8a994752005-11-26 20:28:06 +0100506 if (driver->attach_adapter) {
David Brownell4ad4eac2007-05-01 23:26:28 +0200507 struct i2c_adapter *adapter;
508
509 list_for_each_entry(adapter, &adapters, list) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700510 driver->attach_adapter(adapter);
511 }
512 }
513
Arjan van de Venb3585e42006-01-11 10:50:26 +0100514 mutex_unlock(&core_lists);
Jean Delvare7eebcb72006-02-05 23:28:21 +0100515 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700516}
Greg Kroah-Hartmande59cf92005-12-06 15:33:15 -0800517EXPORT_SYMBOL(i2c_register_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700518
David Brownella1d9e6e2007-05-01 23:26:30 +0200519/**
520 * i2c_del_driver - unregister I2C driver
521 * @driver: the driver being unregistered
522 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700523int i2c_del_driver(struct i2c_driver *driver)
524{
525 struct list_head *item1, *item2, *_n;
526 struct i2c_client *client;
527 struct i2c_adapter *adap;
David Brownell438d6c22006-12-10 21:21:31 +0100528
Linus Torvalds1da177e2005-04-16 15:20:36 -0700529 int res = 0;
530
Arjan van de Venb3585e42006-01-11 10:50:26 +0100531 mutex_lock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700532
David Brownella1d9e6e2007-05-01 23:26:30 +0200533 /* new-style driver? */
534 if (is_newstyle_driver(driver))
535 goto unregister;
536
Linus Torvalds1da177e2005-04-16 15:20:36 -0700537 /* Have a look at each adapter, if clients of this driver are still
David Brownell438d6c22006-12-10 21:21:31 +0100538 * attached. If so, detach them to be able to kill the driver
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539 * afterwards.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700540 */
541 list_for_each(item1,&adapters) {
542 adap = list_entry(item1, struct i2c_adapter, list);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700543 if (driver->detach_adapter) {
544 if ((res = driver->detach_adapter(adap))) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200545 dev_err(&adap->dev, "detach_adapter failed "
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100546 "for driver [%s]\n",
547 driver->driver.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700548 goto out_unlock;
549 }
550 } else {
551 list_for_each_safe(item2, _n, &adap->clients) {
552 client = list_entry(item2, struct i2c_client, list);
553 if (client->driver != driver)
554 continue;
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200555 dev_dbg(&adap->dev, "detaching client [%s] "
556 "at 0x%02x\n", client->name,
557 client->addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700558 if ((res = driver->detach_client(client))) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200559 dev_err(&adap->dev, "detach_client "
560 "failed for client [%s] at "
561 "0x%02x\n", client->name,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700562 client->addr);
563 goto out_unlock;
564 }
565 }
566 }
567 }
568
David Brownella1d9e6e2007-05-01 23:26:30 +0200569 unregister:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700570 driver_unregister(&driver->driver);
571 list_del(&driver->list);
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100572 pr_debug("i2c-core: driver [%s] unregistered\n", driver->driver.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700573
574 out_unlock:
Arjan van de Venb3585e42006-01-11 10:50:26 +0100575 mutex_unlock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700576 return 0;
577}
578
David Brownell7b4fbc52007-05-01 23:26:30 +0200579/* ------------------------------------------------------------------------- */
580
Linus Torvalds1da177e2005-04-16 15:20:36 -0700581static int __i2c_check_addr(struct i2c_adapter *adapter, unsigned int addr)
582{
583 struct list_head *item;
584 struct i2c_client *client;
585
586 list_for_each(item,&adapter->clients) {
587 client = list_entry(item, struct i2c_client, list);
588 if (client->addr == addr)
589 return -EBUSY;
590 }
591 return 0;
592}
593
594int i2c_check_addr(struct i2c_adapter *adapter, int addr)
595{
596 int rval;
597
Ingo Molnar5c085d32006-01-18 23:16:04 +0100598 mutex_lock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700599 rval = __i2c_check_addr(adapter, addr);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100600 mutex_unlock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700601
602 return rval;
603}
604
605int i2c_attach_client(struct i2c_client *client)
606{
607 struct i2c_adapter *adapter = client->adapter;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200608 int res = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700609
Ingo Molnar5c085d32006-01-18 23:16:04 +0100610 mutex_lock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700611 if (__i2c_check_addr(client->adapter, client->addr)) {
Jean Delvareb119c6c2006-08-15 18:26:30 +0200612 res = -EBUSY;
613 goto out_unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700614 }
615 list_add_tail(&client->list,&adapter->clients);
David Brownell438d6c22006-12-10 21:21:31 +0100616
Jean Delvarecde78592005-11-26 21:00:54 +0100617 client->usage_count = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700618
619 client->dev.parent = &client->adapter->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700620 client->dev.bus = &i2c_bus_type;
David Brownell9c1600e2007-05-01 23:26:31 +0200621
622 if (client->driver)
623 client->dev.driver = &client->driver->driver;
624
625 if (client->driver && !is_newstyle_driver(client->driver))
626 client->dev.release = i2c_client_release;
627 else
628 client->dev.release = i2c_client_dev_release;
David Brownell438d6c22006-12-10 21:21:31 +0100629
Linus Torvalds1da177e2005-04-16 15:20:36 -0700630 snprintf(&client->dev.bus_id[0], sizeof(client->dev.bus_id),
631 "%d-%04x", i2c_adapter_id(adapter), client->addr);
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200632 dev_dbg(&adapter->dev, "client [%s] registered with bus id %s\n",
633 client->name, client->dev.bus_id);
Jean Delvareb119c6c2006-08-15 18:26:30 +0200634 res = device_register(&client->dev);
635 if (res)
636 goto out_list;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200637 mutex_unlock(&adapter->clist_lock);
Jean Delvare77ed74d2006-09-30 17:18:59 +0200638
639 if (adapter->client_register) {
640 if (adapter->client_register(client)) {
641 dev_dbg(&adapter->dev, "client_register "
642 "failed for client [%s] at 0x%02x\n",
643 client->name, client->addr);
644 }
645 }
646
647 return 0;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200648
Jean Delvareb119c6c2006-08-15 18:26:30 +0200649out_list:
650 list_del(&client->list);
651 dev_err(&adapter->dev, "Failed to attach i2c client %s at 0x%02x "
652 "(%d)\n", client->name, client->addr, res);
Jean Delvare77ed74d2006-09-30 17:18:59 +0200653out_unlock:
654 mutex_unlock(&adapter->clist_lock);
655 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700656}
657
658
659int i2c_detach_client(struct i2c_client *client)
660{
661 struct i2c_adapter *adapter = client->adapter;
662 int res = 0;
David Brownell438d6c22006-12-10 21:21:31 +0100663
Jean Delvarecde78592005-11-26 21:00:54 +0100664 if (client->usage_count > 0) {
Jean Delvare7bef5592005-07-27 22:14:49 +0200665 dev_warn(&client->dev, "Client [%s] still busy, "
666 "can't detach\n", client->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700667 return -EBUSY;
Jean Delvare7bef5592005-07-27 22:14:49 +0200668 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700669
670 if (adapter->client_unregister) {
671 res = adapter->client_unregister(client);
672 if (res) {
673 dev_err(&client->dev,
Jean Delvare86749e82005-07-29 12:15:29 -0700674 "client_unregister [%s] failed, "
675 "client not detached\n", client->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676 goto out;
677 }
678 }
679
Ingo Molnar5c085d32006-01-18 23:16:04 +0100680 mutex_lock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700681 list_del(&client->list);
682 init_completion(&client->released);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700683 device_unregister(&client->dev);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100684 mutex_unlock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700685 wait_for_completion(&client->released);
686
687 out:
688 return res;
689}
690
691static int i2c_inc_use_client(struct i2c_client *client)
692{
693
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100694 if (!try_module_get(client->driver->driver.owner))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700695 return -ENODEV;
696 if (!try_module_get(client->adapter->owner)) {
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100697 module_put(client->driver->driver.owner);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700698 return -ENODEV;
699 }
700
701 return 0;
702}
703
704static void i2c_dec_use_client(struct i2c_client *client)
705{
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100706 module_put(client->driver->driver.owner);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700707 module_put(client->adapter->owner);
708}
709
710int i2c_use_client(struct i2c_client *client)
711{
712 int ret;
713
714 ret = i2c_inc_use_client(client);
715 if (ret)
716 return ret;
717
Jean Delvarecde78592005-11-26 21:00:54 +0100718 client->usage_count++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700719
720 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700721}
722
723int i2c_release_client(struct i2c_client *client)
724{
Jean Delvarecde78592005-11-26 21:00:54 +0100725 if (!client->usage_count) {
726 pr_debug("i2c-core: %s used one too many times\n",
727 __FUNCTION__);
728 return -EPERM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700729 }
David Brownell438d6c22006-12-10 21:21:31 +0100730
Jean Delvarecde78592005-11-26 21:00:54 +0100731 client->usage_count--;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700732 i2c_dec_use_client(client);
David Brownell438d6c22006-12-10 21:21:31 +0100733
Linus Torvalds1da177e2005-04-16 15:20:36 -0700734 return 0;
735}
736
737void i2c_clients_command(struct i2c_adapter *adap, unsigned int cmd, void *arg)
738{
739 struct list_head *item;
740 struct i2c_client *client;
741
Ingo Molnar5c085d32006-01-18 23:16:04 +0100742 mutex_lock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700743 list_for_each(item,&adap->clients) {
744 client = list_entry(item, struct i2c_client, list);
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100745 if (!try_module_get(client->driver->driver.owner))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700746 continue;
747 if (NULL != client->driver->command) {
Ingo Molnar5c085d32006-01-18 23:16:04 +0100748 mutex_unlock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700749 client->driver->command(client,cmd,arg);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100750 mutex_lock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700751 }
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100752 module_put(client->driver->driver.owner);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700753 }
Ingo Molnar5c085d32006-01-18 23:16:04 +0100754 mutex_unlock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700755}
756
757static int __init i2c_init(void)
758{
759 int retval;
760
761 retval = bus_register(&i2c_bus_type);
762 if (retval)
763 return retval;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700764 return class_register(&i2c_adapter_class);
765}
766
767static void __exit i2c_exit(void)
768{
769 class_unregister(&i2c_adapter_class);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700770 bus_unregister(&i2c_bus_type);
771}
772
773subsys_initcall(i2c_init);
774module_exit(i2c_exit);
775
776/* ----------------------------------------------------
777 * the functional interface to the i2c busses.
778 * ----------------------------------------------------
779 */
780
781int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg *msgs, int num)
782{
783 int ret;
784
785 if (adap->algo->master_xfer) {
786#ifdef DEBUG
787 for (ret = 0; ret < num; ret++) {
788 dev_dbg(&adap->dev, "master_xfer[%d] %c, addr=0x%02x, "
Jean Delvare209d27c2007-05-01 23:26:29 +0200789 "len=%d%s\n", ret, (msgs[ret].flags & I2C_M_RD)
790 ? 'R' : 'W', msgs[ret].addr, msgs[ret].len,
791 (msgs[ret].flags & I2C_M_RECV_LEN) ? "+" : "");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700792 }
793#endif
794
Jiri Kosina6ea23032006-12-10 21:21:30 +0100795 mutex_lock_nested(&adap->bus_lock, adap->level);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700796 ret = adap->algo->master_xfer(adap,msgs,num);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100797 mutex_unlock(&adap->bus_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700798
799 return ret;
800 } else {
801 dev_dbg(&adap->dev, "I2C level transfers not supported\n");
802 return -ENOSYS;
803 }
804}
805
806int i2c_master_send(struct i2c_client *client,const char *buf ,int count)
807{
808 int ret;
809 struct i2c_adapter *adap=client->adapter;
810 struct i2c_msg msg;
811
Jean Delvare815f55f2005-05-07 22:58:46 +0200812 msg.addr = client->addr;
813 msg.flags = client->flags & I2C_M_TEN;
814 msg.len = count;
815 msg.buf = (char *)buf;
David Brownell438d6c22006-12-10 21:21:31 +0100816
Jean Delvare815f55f2005-05-07 22:58:46 +0200817 ret = i2c_transfer(adap, &msg, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700818
Jean Delvare815f55f2005-05-07 22:58:46 +0200819 /* If everything went ok (i.e. 1 msg transmitted), return #bytes
820 transmitted, else error code. */
821 return (ret == 1) ? count : ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700822}
823
824int i2c_master_recv(struct i2c_client *client, char *buf ,int count)
825{
826 struct i2c_adapter *adap=client->adapter;
827 struct i2c_msg msg;
828 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700829
Jean Delvare815f55f2005-05-07 22:58:46 +0200830 msg.addr = client->addr;
831 msg.flags = client->flags & I2C_M_TEN;
832 msg.flags |= I2C_M_RD;
833 msg.len = count;
834 msg.buf = buf;
835
836 ret = i2c_transfer(adap, &msg, 1);
837
838 /* If everything went ok (i.e. 1 msg transmitted), return #bytes
839 transmitted, else error code. */
840 return (ret == 1) ? count : ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700841}
842
843
844int i2c_control(struct i2c_client *client,
845 unsigned int cmd, unsigned long arg)
846{
847 int ret = 0;
848 struct i2c_adapter *adap = client->adapter;
849
850 dev_dbg(&client->adapter->dev, "i2c ioctl, cmd: 0x%x, arg: %#lx\n", cmd, arg);
851 switch (cmd) {
852 case I2C_RETRIES:
853 adap->retries = arg;
854 break;
855 case I2C_TIMEOUT:
856 adap->timeout = arg;
857 break;
858 default:
859 if (adap->algo->algo_control!=NULL)
860 ret = adap->algo->algo_control(adap,cmd,arg);
861 }
862 return ret;
863}
864
865/* ----------------------------------------------------
866 * the i2c address scanning function
867 * Will not work for 10-bit addresses!
868 * ----------------------------------------------------
869 */
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200870static int i2c_probe_address(struct i2c_adapter *adapter, int addr, int kind,
871 int (*found_proc) (struct i2c_adapter *, int, int))
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200872{
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200873 int err;
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200874
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200875 /* Make sure the address is valid */
876 if (addr < 0x03 || addr > 0x77) {
877 dev_warn(&adapter->dev, "Invalid probe address 0x%02x\n",
878 addr);
879 return -EINVAL;
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200880 }
881
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200882 /* Skip if already in use */
883 if (i2c_check_addr(adapter, addr))
884 return 0;
885
886 /* Make sure there is something at this address, unless forced */
Jean Delvare4c9337d2005-08-09 20:28:10 +0200887 if (kind < 0) {
888 if (i2c_smbus_xfer(adapter, addr, 0, 0, 0,
889 I2C_SMBUS_QUICK, NULL) < 0)
890 return 0;
891
892 /* prevent 24RF08 corruption */
893 if ((addr & ~0x0f) == 0x50)
894 i2c_smbus_xfer(adapter, addr, 0, 0, 0,
895 I2C_SMBUS_QUICK, NULL);
896 }
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200897
898 /* Finally call the custom detection function */
899 err = found_proc(adapter, addr, kind);
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200900 /* -ENODEV can be returned if there is a chip at the given address
901 but it isn't supported by this chip driver. We catch it here as
902 this isn't an error. */
Jean Delvare114fd182006-09-03 22:25:04 +0200903 if (err == -ENODEV)
904 err = 0;
905
906 if (err)
907 dev_warn(&adapter->dev, "Client creation failed at 0x%x (%d)\n",
908 addr, err);
909 return err;
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200910}
911
Linus Torvalds1da177e2005-04-16 15:20:36 -0700912int i2c_probe(struct i2c_adapter *adapter,
913 struct i2c_client_address_data *address_data,
914 int (*found_proc) (struct i2c_adapter *, int, int))
915{
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200916 int i, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700917 int adap_id = i2c_adapter_id(adapter);
918
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200919 /* Force entries are done first, and are not affected by ignore
920 entries */
921 if (address_data->forces) {
922 unsigned short **forces = address_data->forces;
923 int kind;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700924
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200925 for (kind = 0; forces[kind]; kind++) {
926 for (i = 0; forces[kind][i] != I2C_CLIENT_END;
927 i += 2) {
928 if (forces[kind][i] == adap_id
929 || forces[kind][i] == ANY_I2C_BUS) {
930 dev_dbg(&adapter->dev, "found force "
931 "parameter for adapter %d, "
932 "addr 0x%02x, kind %d\n",
933 adap_id, forces[kind][i + 1],
934 kind);
935 err = i2c_probe_address(adapter,
936 forces[kind][i + 1],
937 kind, found_proc);
938 if (err)
939 return err;
940 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700941 }
942 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700943 }
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200944
Jean Delvare4366dc92005-09-25 16:50:06 +0200945 /* Stop here if we can't use SMBUS_QUICK */
946 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_QUICK)) {
947 if (address_data->probe[0] == I2C_CLIENT_END
948 && address_data->normal_i2c[0] == I2C_CLIENT_END)
David Brownell438d6c22006-12-10 21:21:31 +0100949 return 0;
Jean Delvare4366dc92005-09-25 16:50:06 +0200950
951 dev_warn(&adapter->dev, "SMBus Quick command not supported, "
952 "can't probe for chips\n");
953 return -1;
954 }
955
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200956 /* Probe entries are done second, and are not affected by ignore
957 entries either */
958 for (i = 0; address_data->probe[i] != I2C_CLIENT_END; i += 2) {
959 if (address_data->probe[i] == adap_id
960 || address_data->probe[i] == ANY_I2C_BUS) {
961 dev_dbg(&adapter->dev, "found probe parameter for "
962 "adapter %d, addr 0x%02x\n", adap_id,
963 address_data->probe[i + 1]);
964 err = i2c_probe_address(adapter,
965 address_data->probe[i + 1],
966 -1, found_proc);
967 if (err)
968 return err;
969 }
970 }
971
972 /* Normal entries are done last, unless shadowed by an ignore entry */
973 for (i = 0; address_data->normal_i2c[i] != I2C_CLIENT_END; i += 1) {
974 int j, ignore;
975
976 ignore = 0;
977 for (j = 0; address_data->ignore[j] != I2C_CLIENT_END;
978 j += 2) {
979 if ((address_data->ignore[j] == adap_id ||
980 address_data->ignore[j] == ANY_I2C_BUS)
981 && address_data->ignore[j + 1]
982 == address_data->normal_i2c[i]) {
983 dev_dbg(&adapter->dev, "found ignore "
984 "parameter for adapter %d, "
985 "addr 0x%02x\n", adap_id,
986 address_data->ignore[j + 1]);
Mark M. Hoffman2369df92006-07-01 17:01:59 +0200987 ignore = 1;
988 break;
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200989 }
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200990 }
991 if (ignore)
992 continue;
993
994 dev_dbg(&adapter->dev, "found normal entry for adapter %d, "
995 "addr 0x%02x\n", adap_id,
996 address_data->normal_i2c[i]);
997 err = i2c_probe_address(adapter, address_data->normal_i2c[i],
998 -1, found_proc);
999 if (err)
1000 return err;
1001 }
1002
Linus Torvalds1da177e2005-04-16 15:20:36 -07001003 return 0;
1004}
1005
Linus Torvalds1da177e2005-04-16 15:20:36 -07001006struct i2c_adapter* i2c_get_adapter(int id)
1007{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001008 struct i2c_adapter *adapter;
David Brownell438d6c22006-12-10 21:21:31 +01001009
Arjan van de Venb3585e42006-01-11 10:50:26 +01001010 mutex_lock(&core_lists);
Mark M. Hoffmana0920e12005-06-28 00:21:30 -04001011 adapter = (struct i2c_adapter *)idr_find(&i2c_adapter_idr, id);
1012 if (adapter && !try_module_get(adapter->owner))
1013 adapter = NULL;
1014
Arjan van de Venb3585e42006-01-11 10:50:26 +01001015 mutex_unlock(&core_lists);
Mark M. Hoffmana0920e12005-06-28 00:21:30 -04001016 return adapter;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001017}
1018
1019void i2c_put_adapter(struct i2c_adapter *adap)
1020{
1021 module_put(adap->owner);
1022}
1023
1024/* The SMBus parts */
1025
David Brownell438d6c22006-12-10 21:21:31 +01001026#define POLY (0x1070U << 3)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001027static u8
1028crc8(u16 data)
1029{
1030 int i;
David Brownell438d6c22006-12-10 21:21:31 +01001031
Linus Torvalds1da177e2005-04-16 15:20:36 -07001032 for(i = 0; i < 8; i++) {
David Brownell438d6c22006-12-10 21:21:31 +01001033 if (data & 0x8000)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001034 data = data ^ POLY;
1035 data = data << 1;
1036 }
1037 return (u8)(data >> 8);
1038}
1039
Jean Delvare421ef472005-10-26 21:28:55 +02001040/* Incremental CRC8 over count bytes in the array pointed to by p */
1041static u8 i2c_smbus_pec(u8 crc, u8 *p, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001042{
1043 int i;
1044
1045 for(i = 0; i < count; i++)
Jean Delvare421ef472005-10-26 21:28:55 +02001046 crc = crc8((crc ^ p[i]) << 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001047 return crc;
1048}
1049
Jean Delvare421ef472005-10-26 21:28:55 +02001050/* Assume a 7-bit address, which is reasonable for SMBus */
1051static u8 i2c_smbus_msg_pec(u8 pec, struct i2c_msg *msg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001052{
Jean Delvare421ef472005-10-26 21:28:55 +02001053 /* The address will be sent first */
1054 u8 addr = (msg->addr << 1) | !!(msg->flags & I2C_M_RD);
1055 pec = i2c_smbus_pec(pec, &addr, 1);
1056
1057 /* The data buffer follows */
1058 return i2c_smbus_pec(pec, msg->buf, msg->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001059}
1060
Jean Delvare421ef472005-10-26 21:28:55 +02001061/* Used for write only transactions */
1062static inline void i2c_smbus_add_pec(struct i2c_msg *msg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001063{
Jean Delvare421ef472005-10-26 21:28:55 +02001064 msg->buf[msg->len] = i2c_smbus_msg_pec(0, msg);
1065 msg->len++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001066}
1067
Jean Delvare421ef472005-10-26 21:28:55 +02001068/* Return <0 on CRC error
1069 If there was a write before this read (most cases) we need to take the
1070 partial CRC from the write part into account.
1071 Note that this function does modify the message (we need to decrease the
1072 message length to hide the CRC byte from the caller). */
1073static int i2c_smbus_check_pec(u8 cpec, struct i2c_msg *msg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001074{
Jean Delvare421ef472005-10-26 21:28:55 +02001075 u8 rpec = msg->buf[--msg->len];
1076 cpec = i2c_smbus_msg_pec(cpec, msg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001077
Linus Torvalds1da177e2005-04-16 15:20:36 -07001078 if (rpec != cpec) {
1079 pr_debug("i2c-core: Bad PEC 0x%02x vs. 0x%02x\n",
1080 rpec, cpec);
1081 return -1;
1082 }
David Brownell438d6c22006-12-10 21:21:31 +01001083 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001084}
1085
1086s32 i2c_smbus_write_quick(struct i2c_client *client, u8 value)
1087{
1088 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
David Brownell438d6c22006-12-10 21:21:31 +01001089 value,0,I2C_SMBUS_QUICK,NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001090}
1091
1092s32 i2c_smbus_read_byte(struct i2c_client *client)
1093{
1094 union i2c_smbus_data data;
1095 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
1096 I2C_SMBUS_READ,0,I2C_SMBUS_BYTE, &data))
1097 return -1;
1098 else
Jean Delvare7eff82c2006-09-03 22:24:00 +02001099 return data.byte;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001100}
1101
1102s32 i2c_smbus_write_byte(struct i2c_client *client, u8 value)
1103{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001104 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
Jean Delvare421ef472005-10-26 21:28:55 +02001105 I2C_SMBUS_WRITE, value, I2C_SMBUS_BYTE, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001106}
1107
1108s32 i2c_smbus_read_byte_data(struct i2c_client *client, u8 command)
1109{
1110 union i2c_smbus_data data;
1111 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
1112 I2C_SMBUS_READ,command, I2C_SMBUS_BYTE_DATA,&data))
1113 return -1;
1114 else
Jean Delvare7eff82c2006-09-03 22:24:00 +02001115 return data.byte;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001116}
1117
1118s32 i2c_smbus_write_byte_data(struct i2c_client *client, u8 command, u8 value)
1119{
1120 union i2c_smbus_data data;
1121 data.byte = value;
1122 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
1123 I2C_SMBUS_WRITE,command,
1124 I2C_SMBUS_BYTE_DATA,&data);
1125}
1126
1127s32 i2c_smbus_read_word_data(struct i2c_client *client, u8 command)
1128{
1129 union i2c_smbus_data data;
1130 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
1131 I2C_SMBUS_READ,command, I2C_SMBUS_WORD_DATA, &data))
1132 return -1;
1133 else
Jean Delvare7eff82c2006-09-03 22:24:00 +02001134 return data.word;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001135}
1136
1137s32 i2c_smbus_write_word_data(struct i2c_client *client, u8 command, u16 value)
1138{
1139 union i2c_smbus_data data;
1140 data.word = value;
1141 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
1142 I2C_SMBUS_WRITE,command,
1143 I2C_SMBUS_WORD_DATA,&data);
1144}
1145
1146s32 i2c_smbus_write_block_data(struct i2c_client *client, u8 command,
Krzysztof Halasa46f5ed72006-06-12 21:42:20 +02001147 u8 length, const u8 *values)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001148{
1149 union i2c_smbus_data data;
Jean Delvare76560322006-01-18 23:14:55 +01001150
Linus Torvalds1da177e2005-04-16 15:20:36 -07001151 if (length > I2C_SMBUS_BLOCK_MAX)
1152 length = I2C_SMBUS_BLOCK_MAX;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001153 data.block[0] = length;
Jean Delvare76560322006-01-18 23:14:55 +01001154 memcpy(&data.block[1], values, length);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001155 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
1156 I2C_SMBUS_WRITE,command,
1157 I2C_SMBUS_BLOCK_DATA,&data);
1158}
1159
1160/* Returns the number of read bytes */
1161s32 i2c_smbus_read_i2c_block_data(struct i2c_client *client, u8 command, u8 *values)
1162{
1163 union i2c_smbus_data data;
Jean Delvare76560322006-01-18 23:14:55 +01001164
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
1166 I2C_SMBUS_READ,command,
1167 I2C_SMBUS_I2C_BLOCK_DATA,&data))
1168 return -1;
Jean Delvare76560322006-01-18 23:14:55 +01001169
1170 memcpy(values, &data.block[1], data.block[0]);
1171 return data.block[0];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001172}
1173
Jean Delvare21bbd692006-01-09 15:19:18 +11001174s32 i2c_smbus_write_i2c_block_data(struct i2c_client *client, u8 command,
Krzysztof Halasa46f5ed72006-06-12 21:42:20 +02001175 u8 length, const u8 *values)
Jean Delvare21bbd692006-01-09 15:19:18 +11001176{
1177 union i2c_smbus_data data;
1178
1179 if (length > I2C_SMBUS_BLOCK_MAX)
1180 length = I2C_SMBUS_BLOCK_MAX;
1181 data.block[0] = length;
1182 memcpy(data.block + 1, values, length);
1183 return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
1184 I2C_SMBUS_WRITE, command,
1185 I2C_SMBUS_I2C_BLOCK_DATA, &data);
1186}
1187
David Brownell438d6c22006-12-10 21:21:31 +01001188/* Simulate a SMBus command using the i2c protocol
Linus Torvalds1da177e2005-04-16 15:20:36 -07001189 No checking of parameters is done! */
David Brownell438d6c22006-12-10 21:21:31 +01001190static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001191 unsigned short flags,
David Brownell438d6c22006-12-10 21:21:31 +01001192 char read_write, u8 command, int size,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001193 union i2c_smbus_data * data)
1194{
1195 /* So we need to generate a series of msgs. In the case of writing, we
1196 need to use only one message; when reading, we need two. We initialize
1197 most things with sane defaults, to keep the code below somewhat
1198 simpler. */
Hideki Iwamoto5c50d182005-09-25 17:01:11 +02001199 unsigned char msgbuf0[I2C_SMBUS_BLOCK_MAX+3];
1200 unsigned char msgbuf1[I2C_SMBUS_BLOCK_MAX+2];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001201 int num = read_write == I2C_SMBUS_READ?2:1;
David Brownell438d6c22006-12-10 21:21:31 +01001202 struct i2c_msg msg[2] = { { addr, flags, 1, msgbuf0 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07001203 { addr, flags | I2C_M_RD, 0, msgbuf1 }
1204 };
1205 int i;
Jean Delvare421ef472005-10-26 21:28:55 +02001206 u8 partial_pec = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001207
1208 msgbuf0[0] = command;
1209 switch(size) {
1210 case I2C_SMBUS_QUICK:
1211 msg[0].len = 0;
1212 /* Special case: The read/write field is used as data */
1213 msg[0].flags = flags | (read_write==I2C_SMBUS_READ)?I2C_M_RD:0;
1214 num = 1;
1215 break;
1216 case I2C_SMBUS_BYTE:
1217 if (read_write == I2C_SMBUS_READ) {
1218 /* Special case: only a read! */
1219 msg[0].flags = I2C_M_RD | flags;
1220 num = 1;
1221 }
1222 break;
1223 case I2C_SMBUS_BYTE_DATA:
1224 if (read_write == I2C_SMBUS_READ)
1225 msg[1].len = 1;
1226 else {
1227 msg[0].len = 2;
1228 msgbuf0[1] = data->byte;
1229 }
1230 break;
1231 case I2C_SMBUS_WORD_DATA:
1232 if (read_write == I2C_SMBUS_READ)
1233 msg[1].len = 2;
1234 else {
1235 msg[0].len=3;
1236 msgbuf0[1] = data->word & 0xff;
Jean Delvare7eff82c2006-09-03 22:24:00 +02001237 msgbuf0[2] = data->word >> 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001238 }
1239 break;
1240 case I2C_SMBUS_PROC_CALL:
1241 num = 2; /* Special case */
1242 read_write = I2C_SMBUS_READ;
1243 msg[0].len = 3;
1244 msg[1].len = 2;
1245 msgbuf0[1] = data->word & 0xff;
Jean Delvare7eff82c2006-09-03 22:24:00 +02001246 msgbuf0[2] = data->word >> 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001247 break;
1248 case I2C_SMBUS_BLOCK_DATA:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001249 if (read_write == I2C_SMBUS_READ) {
Jean Delvare209d27c2007-05-01 23:26:29 +02001250 msg[1].flags |= I2C_M_RECV_LEN;
1251 msg[1].len = 1; /* block length will be added by
1252 the underlying bus driver */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001253 } else {
1254 msg[0].len = data->block[0] + 2;
1255 if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 2) {
1256 dev_err(&adapter->dev, "smbus_access called with "
1257 "invalid block write size (%d)\n",
1258 data->block[0]);
1259 return -1;
1260 }
Hideki Iwamoto5c50d182005-09-25 17:01:11 +02001261 for (i = 1; i < msg[0].len; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001262 msgbuf0[i] = data->block[i-1];
1263 }
1264 break;
1265 case I2C_SMBUS_BLOCK_PROC_CALL:
Jean Delvare209d27c2007-05-01 23:26:29 +02001266 num = 2; /* Another special case */
1267 read_write = I2C_SMBUS_READ;
1268 if (data->block[0] > I2C_SMBUS_BLOCK_MAX) {
1269 dev_err(&adapter->dev, "%s called with invalid "
1270 "block proc call size (%d)\n", __FUNCTION__,
1271 data->block[0]);
1272 return -1;
1273 }
1274 msg[0].len = data->block[0] + 2;
1275 for (i = 1; i < msg[0].len; i++)
1276 msgbuf0[i] = data->block[i-1];
1277 msg[1].flags |= I2C_M_RECV_LEN;
1278 msg[1].len = 1; /* block length will be added by
1279 the underlying bus driver */
1280 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001281 case I2C_SMBUS_I2C_BLOCK_DATA:
1282 if (read_write == I2C_SMBUS_READ) {
Jean Delvare30dac742005-10-08 00:15:59 +02001283 msg[1].len = I2C_SMBUS_BLOCK_MAX;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001284 } else {
1285 msg[0].len = data->block[0] + 1;
Jean Delvare30dac742005-10-08 00:15:59 +02001286 if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 1) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001287 dev_err(&adapter->dev, "i2c_smbus_xfer_emulated called with "
1288 "invalid block write size (%d)\n",
1289 data->block[0]);
1290 return -1;
1291 }
1292 for (i = 1; i <= data->block[0]; i++)
1293 msgbuf0[i] = data->block[i];
1294 }
1295 break;
1296 default:
1297 dev_err(&adapter->dev, "smbus_access called with invalid size (%d)\n",
1298 size);
1299 return -1;
1300 }
1301
Jean Delvare421ef472005-10-26 21:28:55 +02001302 i = ((flags & I2C_CLIENT_PEC) && size != I2C_SMBUS_QUICK
1303 && size != I2C_SMBUS_I2C_BLOCK_DATA);
1304 if (i) {
1305 /* Compute PEC if first message is a write */
1306 if (!(msg[0].flags & I2C_M_RD)) {
David Brownell438d6c22006-12-10 21:21:31 +01001307 if (num == 1) /* Write only */
Jean Delvare421ef472005-10-26 21:28:55 +02001308 i2c_smbus_add_pec(&msg[0]);
1309 else /* Write followed by read */
1310 partial_pec = i2c_smbus_msg_pec(0, &msg[0]);
1311 }
1312 /* Ask for PEC if last message is a read */
1313 if (msg[num-1].flags & I2C_M_RD)
David Brownell438d6c22006-12-10 21:21:31 +01001314 msg[num-1].len++;
Jean Delvare421ef472005-10-26 21:28:55 +02001315 }
1316
Linus Torvalds1da177e2005-04-16 15:20:36 -07001317 if (i2c_transfer(adapter, msg, num) < 0)
1318 return -1;
1319
Jean Delvare421ef472005-10-26 21:28:55 +02001320 /* Check PEC if last message is a read */
1321 if (i && (msg[num-1].flags & I2C_M_RD)) {
1322 if (i2c_smbus_check_pec(partial_pec, &msg[num-1]) < 0)
1323 return -1;
1324 }
1325
Linus Torvalds1da177e2005-04-16 15:20:36 -07001326 if (read_write == I2C_SMBUS_READ)
1327 switch(size) {
1328 case I2C_SMBUS_BYTE:
1329 data->byte = msgbuf0[0];
1330 break;
1331 case I2C_SMBUS_BYTE_DATA:
1332 data->byte = msgbuf1[0];
1333 break;
David Brownell438d6c22006-12-10 21:21:31 +01001334 case I2C_SMBUS_WORD_DATA:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001335 case I2C_SMBUS_PROC_CALL:
1336 data->word = msgbuf1[0] | (msgbuf1[1] << 8);
1337 break;
1338 case I2C_SMBUS_I2C_BLOCK_DATA:
1339 /* fixed at 32 for now */
Jean Delvare30dac742005-10-08 00:15:59 +02001340 data->block[0] = I2C_SMBUS_BLOCK_MAX;
1341 for (i = 0; i < I2C_SMBUS_BLOCK_MAX; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001342 data->block[i+1] = msgbuf1[i];
1343 break;
Jean Delvare209d27c2007-05-01 23:26:29 +02001344 case I2C_SMBUS_BLOCK_DATA:
1345 case I2C_SMBUS_BLOCK_PROC_CALL:
1346 for (i = 0; i < msgbuf1[0] + 1; i++)
1347 data->block[i] = msgbuf1[i];
1348 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001349 }
1350 return 0;
1351}
1352
1353
1354s32 i2c_smbus_xfer(struct i2c_adapter * adapter, u16 addr, unsigned short flags,
David Brownell438d6c22006-12-10 21:21:31 +01001355 char read_write, u8 command, int size,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001356 union i2c_smbus_data * data)
1357{
1358 s32 res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359
1360 flags &= I2C_M_TEN | I2C_CLIENT_PEC;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001361
1362 if (adapter->algo->smbus_xfer) {
Ingo Molnar5c085d32006-01-18 23:16:04 +01001363 mutex_lock(&adapter->bus_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001364 res = adapter->algo->smbus_xfer(adapter,addr,flags,read_write,
1365 command,size,data);
Ingo Molnar5c085d32006-01-18 23:16:04 +01001366 mutex_unlock(&adapter->bus_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001367 } else
1368 res = i2c_smbus_xfer_emulated(adapter,addr,flags,read_write,
1369 command,size,data);
1370
Linus Torvalds1da177e2005-04-16 15:20:36 -07001371 return res;
1372}
1373
1374
Jean Delvareb31366f2007-05-01 23:26:28 +02001375/* Next three are needed by i2c-isa */
Jean Delvareefde7232005-07-20 23:03:50 +02001376EXPORT_SYMBOL_GPL(i2c_adapter_dev_release);
Jean Delvareefde7232005-07-20 23:03:50 +02001377EXPORT_SYMBOL_GPL(i2c_adapter_class);
1378EXPORT_SYMBOL_GPL(i2c_bus_type);
1379
Linus Torvalds1da177e2005-04-16 15:20:36 -07001380EXPORT_SYMBOL(i2c_add_adapter);
1381EXPORT_SYMBOL(i2c_del_adapter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001382EXPORT_SYMBOL(i2c_del_driver);
1383EXPORT_SYMBOL(i2c_attach_client);
1384EXPORT_SYMBOL(i2c_detach_client);
1385EXPORT_SYMBOL(i2c_use_client);
1386EXPORT_SYMBOL(i2c_release_client);
1387EXPORT_SYMBOL(i2c_clients_command);
1388EXPORT_SYMBOL(i2c_check_addr);
1389
1390EXPORT_SYMBOL(i2c_master_send);
1391EXPORT_SYMBOL(i2c_master_recv);
1392EXPORT_SYMBOL(i2c_control);
1393EXPORT_SYMBOL(i2c_transfer);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001394EXPORT_SYMBOL(i2c_get_adapter);
1395EXPORT_SYMBOL(i2c_put_adapter);
1396EXPORT_SYMBOL(i2c_probe);
1397
1398EXPORT_SYMBOL(i2c_smbus_xfer);
1399EXPORT_SYMBOL(i2c_smbus_write_quick);
1400EXPORT_SYMBOL(i2c_smbus_read_byte);
1401EXPORT_SYMBOL(i2c_smbus_write_byte);
1402EXPORT_SYMBOL(i2c_smbus_read_byte_data);
1403EXPORT_SYMBOL(i2c_smbus_write_byte_data);
1404EXPORT_SYMBOL(i2c_smbus_read_word_data);
1405EXPORT_SYMBOL(i2c_smbus_write_word_data);
1406EXPORT_SYMBOL(i2c_smbus_write_block_data);
1407EXPORT_SYMBOL(i2c_smbus_read_i2c_block_data);
Jean Delvare21bbd692006-01-09 15:19:18 +11001408EXPORT_SYMBOL(i2c_smbus_write_i2c_block_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001409
1410MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
1411MODULE_DESCRIPTION("I2C-Bus main module");
1412MODULE_LICENSE("GPL");