blob: 01233f0f7771687951a5dda8e6e2482a0bbaeca5 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/* i2c-core.c - a device driver for the iic-bus interface */
2/* ------------------------------------------------------------------------- */
3/* Copyright (C) 1995-99 Simon G. Vogl
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
18/* ------------------------------------------------------------------------- */
19
20/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi>.
21 All SMBus-related things are written by Frodo Looijaard <frodol@dds.nl>
Jean Delvare421ef472005-10-26 21:28:55 +020022 SMBus 2.0 support by Mark Studebaker <mdsxyz123@yahoo.com> and
23 Jean Delvare <khali@linux-fr.org> */
Linus Torvalds1da177e2005-04-16 15:20:36 -070024
Linus Torvalds1da177e2005-04-16 15:20:36 -070025#include <linux/module.h>
26#include <linux/kernel.h>
27#include <linux/errno.h>
28#include <linux/slab.h>
29#include <linux/i2c.h>
30#include <linux/init.h>
31#include <linux/idr.h>
32#include <linux/seq_file.h>
Russell Kingd052d1b2005-10-29 19:07:23 +010033#include <linux/platform_device.h>
Arjan van de Venb3585e42006-01-11 10:50:26 +010034#include <linux/mutex.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070035#include <asm/uaccess.h>
36
37
38static LIST_HEAD(adapters);
39static LIST_HEAD(drivers);
Arjan van de Venb3585e42006-01-11 10:50:26 +010040static DEFINE_MUTEX(core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -070041static DEFINE_IDR(i2c_adapter_idr);
42
43/* match always succeeds, as we want the probe() to tell if we really accept this match */
44static int i2c_device_match(struct device *dev, struct device_driver *drv)
45{
46 return 1;
47}
48
49static int i2c_bus_suspend(struct device * dev, pm_message_t state)
50{
51 int rc = 0;
52
53 if (dev->driver && dev->driver->suspend)
Russell King9480e302005-10-28 09:52:56 -070054 rc = dev->driver->suspend(dev, state);
Linus Torvalds1da177e2005-04-16 15:20:36 -070055 return rc;
56}
57
58static int i2c_bus_resume(struct device * dev)
59{
60 int rc = 0;
61
62 if (dev->driver && dev->driver->resume)
Russell King9480e302005-10-28 09:52:56 -070063 rc = dev->driver->resume(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -070064 return rc;
65}
66
Linus Torvalds1da177e2005-04-16 15:20:36 -070067static int i2c_device_probe(struct device *dev)
68{
69 return -ENODEV;
70}
71
72static int i2c_device_remove(struct device *dev)
73{
74 return 0;
75}
76
Russell Kingb864c7d2006-01-05 14:37:50 +000077struct bus_type i2c_bus_type = {
78 .name = "i2c",
79 .match = i2c_device_match,
80 .probe = i2c_device_probe,
81 .remove = i2c_device_remove,
82 .suspend = i2c_bus_suspend,
83 .resume = i2c_bus_resume,
84};
85
Jean Delvareefde7232005-07-20 23:03:50 +020086void i2c_adapter_dev_release(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -070087{
88 struct i2c_adapter *adap = dev_to_i2c_adapter(dev);
89 complete(&adap->dev_released);
90}
91
Jean Delvareefde7232005-07-20 23:03:50 +020092struct device_driver i2c_adapter_driver = {
Laurent Riffard6586bcd2005-10-17 22:54:45 +020093 .owner = THIS_MODULE,
Linus Torvalds1da177e2005-04-16 15:20:36 -070094 .name = "i2c_adapter",
95 .bus = &i2c_bus_type,
Linus Torvalds1da177e2005-04-16 15:20:36 -070096};
97
98static void i2c_adapter_class_dev_release(struct class_device *dev)
99{
100 struct i2c_adapter *adap = class_dev_to_i2c_adapter(dev);
101 complete(&adap->class_dev_released);
102}
103
Jean Delvareefde7232005-07-20 23:03:50 +0200104struct class i2c_adapter_class = {
Laurent Riffard6586bcd2005-10-17 22:54:45 +0200105 .owner = THIS_MODULE,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700106 .name = "i2c-adapter",
107 .release = &i2c_adapter_class_dev_release,
108};
109
Yani Ioannoue404e272005-05-17 06:42:58 -0400110static ssize_t show_adapter_name(struct device *dev, struct device_attribute *attr, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700111{
112 struct i2c_adapter *adap = dev_to_i2c_adapter(dev);
113 return sprintf(buf, "%s\n", adap->name);
114}
115static DEVICE_ATTR(name, S_IRUGO, show_adapter_name, NULL);
116
117
118static void i2c_client_release(struct device *dev)
119{
120 struct i2c_client *client = to_i2c_client(dev);
121 complete(&client->released);
122}
123
Yani Ioannoue404e272005-05-17 06:42:58 -0400124static ssize_t show_client_name(struct device *dev, struct device_attribute *attr, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700125{
126 struct i2c_client *client = to_i2c_client(dev);
127 return sprintf(buf, "%s\n", client->name);
128}
129
130/*
131 * We can't use the DEVICE_ATTR() macro here as we want the same filename for a
132 * different type of a device. So beware if the DEVICE_ATTR() macro ever
133 * changes, this definition will also have to change.
134 */
135static struct device_attribute dev_attr_client_name = {
136 .attr = {.name = "name", .mode = S_IRUGO, .owner = THIS_MODULE },
137 .show = &show_client_name,
138};
139
140
141/* ---------------------------------------------------
142 * registering functions
143 * ---------------------------------------------------
144 */
145
146/* -----
147 * i2c_add_adapter is called from within the algorithm layer,
148 * when a new hw adapter registers. A new device is register to be
149 * available for clients.
150 */
151int i2c_add_adapter(struct i2c_adapter *adap)
152{
153 int id, res = 0;
154 struct list_head *item;
155 struct i2c_driver *driver;
156
Arjan van de Venb3585e42006-01-11 10:50:26 +0100157 mutex_lock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700158
159 if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) == 0) {
160 res = -ENOMEM;
161 goto out_unlock;
162 }
163
Mark M. Hoffmana0920e12005-06-28 00:21:30 -0400164 res = idr_get_new(&i2c_adapter_idr, adap, &id);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700165 if (res < 0) {
166 if (res == -EAGAIN)
167 res = -ENOMEM;
168 goto out_unlock;
169 }
170
171 adap->nr = id & MAX_ID_MASK;
Ingo Molnar5c085d32006-01-18 23:16:04 +0100172 mutex_init(&adap->bus_lock);
173 mutex_init(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700174 list_add_tail(&adap->list,&adapters);
175 INIT_LIST_HEAD(&adap->clients);
176
177 /* Add the adapter to the driver core.
178 * If the parent pointer is not set up,
179 * we add this adapter to the host bus.
180 */
181 if (adap->dev.parent == NULL)
182 adap->dev.parent = &platform_bus;
183 sprintf(adap->dev.bus_id, "i2c-%d", adap->nr);
184 adap->dev.driver = &i2c_adapter_driver;
185 adap->dev.release = &i2c_adapter_dev_release;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200186 res = device_register(&adap->dev);
187 if (res)
188 goto out_list;
189 res = device_create_file(&adap->dev, &dev_attr_name);
190 if (res)
191 goto out_unregister;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700192
193 /* Add this adapter to the i2c_adapter class */
194 memset(&adap->class_dev, 0x00, sizeof(struct class_device));
195 adap->class_dev.dev = &adap->dev;
196 adap->class_dev.class = &i2c_adapter_class;
197 strlcpy(adap->class_dev.class_id, adap->dev.bus_id, BUS_ID_SIZE);
Jean Delvareb119c6c2006-08-15 18:26:30 +0200198 res = class_device_register(&adap->class_dev);
199 if (res)
200 goto out_remove_name;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700201
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200202 dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name);
203
Linus Torvalds1da177e2005-04-16 15:20:36 -0700204 /* inform drivers of new adapters */
205 list_for_each(item,&drivers) {
206 driver = list_entry(item, struct i2c_driver, list);
Jean Delvare8a994752005-11-26 20:28:06 +0100207 if (driver->attach_adapter)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700208 /* We ignore the return code; if it fails, too bad */
209 driver->attach_adapter(adap);
210 }
211
Linus Torvalds1da177e2005-04-16 15:20:36 -0700212out_unlock:
Arjan van de Venb3585e42006-01-11 10:50:26 +0100213 mutex_unlock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700214 return res;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200215
216out_remove_name:
217 device_remove_file(&adap->dev, &dev_attr_name);
218out_unregister:
219 init_completion(&adap->dev_released); /* Needed? */
220 device_unregister(&adap->dev);
221 wait_for_completion(&adap->dev_released);
222out_list:
223 list_del(&adap->list);
224 idr_remove(&i2c_adapter_idr, adap->nr);
225 goto out_unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700226}
227
228
229int i2c_del_adapter(struct i2c_adapter *adap)
230{
231 struct list_head *item, *_n;
232 struct i2c_adapter *adap_from_list;
233 struct i2c_driver *driver;
234 struct i2c_client *client;
235 int res = 0;
236
Arjan van de Venb3585e42006-01-11 10:50:26 +0100237 mutex_lock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700238
239 /* First make sure that this adapter was ever added */
240 list_for_each_entry(adap_from_list, &adapters, list) {
241 if (adap_from_list == adap)
242 break;
243 }
244 if (adap_from_list != adap) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200245 pr_debug("i2c-core: attempting to delete unregistered "
246 "adapter [%s]\n", adap->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700247 res = -EINVAL;
248 goto out_unlock;
249 }
250
251 list_for_each(item,&drivers) {
252 driver = list_entry(item, struct i2c_driver, list);
253 if (driver->detach_adapter)
254 if ((res = driver->detach_adapter(adap))) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200255 dev_err(&adap->dev, "detach_adapter failed "
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100256 "for driver [%s]\n",
257 driver->driver.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700258 goto out_unlock;
259 }
260 }
261
262 /* detach any active clients. This must be done first, because
Tobias Klausera551acc2005-05-19 21:40:38 +0200263 * it can fail; in which case we give up. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700264 list_for_each_safe(item, _n, &adap->clients) {
265 client = list_entry(item, struct i2c_client, list);
266
Linus Torvalds1da177e2005-04-16 15:20:36 -0700267 if ((res=client->driver->detach_client(client))) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200268 dev_err(&adap->dev, "detach_client failed for client "
269 "[%s] at address 0x%02x\n", client->name,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700270 client->addr);
271 goto out_unlock;
272 }
273 }
274
275 /* clean up the sysfs representation */
276 init_completion(&adap->dev_released);
277 init_completion(&adap->class_dev_released);
278 class_device_unregister(&adap->class_dev);
279 device_remove_file(&adap->dev, &dev_attr_name);
280 device_unregister(&adap->dev);
281 list_del(&adap->list);
282
283 /* wait for sysfs to drop all references */
284 wait_for_completion(&adap->dev_released);
285 wait_for_completion(&adap->class_dev_released);
286
287 /* free dynamically allocated bus id */
288 idr_remove(&i2c_adapter_idr, adap->nr);
289
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200290 dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700291
292 out_unlock:
Arjan van de Venb3585e42006-01-11 10:50:26 +0100293 mutex_unlock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700294 return res;
295}
296
297
298/* -----
299 * What follows is the "upwards" interface: commands for talking to clients,
300 * which implement the functions to access the physical information of the
301 * chips.
302 */
303
Greg Kroah-Hartmande59cf92005-12-06 15:33:15 -0800304int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700305{
306 struct list_head *item;
307 struct i2c_adapter *adapter;
Jean Delvare7eebcb72006-02-05 23:28:21 +0100308 int res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700309
310 /* add the driver to the list of i2c drivers in the driver core */
Greg Kroah-Hartmande59cf92005-12-06 15:33:15 -0800311 driver->driver.owner = owner;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700312 driver->driver.bus = &i2c_bus_type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700313
314 res = driver_register(&driver->driver);
315 if (res)
Jean Delvare7eebcb72006-02-05 23:28:21 +0100316 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700317
Jean Delvare7eebcb72006-02-05 23:28:21 +0100318 mutex_lock(&core_lists);
319
Linus Torvalds1da177e2005-04-16 15:20:36 -0700320 list_add_tail(&driver->list,&drivers);
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100321 pr_debug("i2c-core: driver [%s] registered\n", driver->driver.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700322
323 /* now look for instances of driver on our adapters */
Jean Delvare8a994752005-11-26 20:28:06 +0100324 if (driver->attach_adapter) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700325 list_for_each(item,&adapters) {
326 adapter = list_entry(item, struct i2c_adapter, list);
327 driver->attach_adapter(adapter);
328 }
329 }
330
Arjan van de Venb3585e42006-01-11 10:50:26 +0100331 mutex_unlock(&core_lists);
Jean Delvare7eebcb72006-02-05 23:28:21 +0100332 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700333}
Greg Kroah-Hartmande59cf92005-12-06 15:33:15 -0800334EXPORT_SYMBOL(i2c_register_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700335
336int i2c_del_driver(struct i2c_driver *driver)
337{
338 struct list_head *item1, *item2, *_n;
339 struct i2c_client *client;
340 struct i2c_adapter *adap;
341
342 int res = 0;
343
Arjan van de Venb3585e42006-01-11 10:50:26 +0100344 mutex_lock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700345
346 /* Have a look at each adapter, if clients of this driver are still
347 * attached. If so, detach them to be able to kill the driver
348 * afterwards.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700349 */
350 list_for_each(item1,&adapters) {
351 adap = list_entry(item1, struct i2c_adapter, list);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700352 if (driver->detach_adapter) {
353 if ((res = driver->detach_adapter(adap))) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200354 dev_err(&adap->dev, "detach_adapter failed "
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100355 "for driver [%s]\n",
356 driver->driver.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700357 goto out_unlock;
358 }
359 } else {
360 list_for_each_safe(item2, _n, &adap->clients) {
361 client = list_entry(item2, struct i2c_client, list);
362 if (client->driver != driver)
363 continue;
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200364 dev_dbg(&adap->dev, "detaching client [%s] "
365 "at 0x%02x\n", client->name,
366 client->addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700367 if ((res = driver->detach_client(client))) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200368 dev_err(&adap->dev, "detach_client "
369 "failed for client [%s] at "
370 "0x%02x\n", client->name,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700371 client->addr);
372 goto out_unlock;
373 }
374 }
375 }
376 }
377
378 driver_unregister(&driver->driver);
379 list_del(&driver->list);
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100380 pr_debug("i2c-core: driver [%s] unregistered\n", driver->driver.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700381
382 out_unlock:
Arjan van de Venb3585e42006-01-11 10:50:26 +0100383 mutex_unlock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700384 return 0;
385}
386
387static int __i2c_check_addr(struct i2c_adapter *adapter, unsigned int addr)
388{
389 struct list_head *item;
390 struct i2c_client *client;
391
392 list_for_each(item,&adapter->clients) {
393 client = list_entry(item, struct i2c_client, list);
394 if (client->addr == addr)
395 return -EBUSY;
396 }
397 return 0;
398}
399
400int i2c_check_addr(struct i2c_adapter *adapter, int addr)
401{
402 int rval;
403
Ingo Molnar5c085d32006-01-18 23:16:04 +0100404 mutex_lock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700405 rval = __i2c_check_addr(adapter, addr);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100406 mutex_unlock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700407
408 return rval;
409}
410
411int i2c_attach_client(struct i2c_client *client)
412{
413 struct i2c_adapter *adapter = client->adapter;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200414 int res = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700415
Ingo Molnar5c085d32006-01-18 23:16:04 +0100416 mutex_lock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700417 if (__i2c_check_addr(client->adapter, client->addr)) {
Jean Delvareb119c6c2006-08-15 18:26:30 +0200418 res = -EBUSY;
419 goto out_unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700420 }
421 list_add_tail(&client->list,&adapter->clients);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700422
423 if (adapter->client_register) {
424 if (adapter->client_register(client)) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200425 dev_dbg(&adapter->dev, "client_register "
426 "failed for client [%s] at 0x%02x\n",
427 client->name, client->addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700428 }
429 }
430
Jean Delvarecde78592005-11-26 21:00:54 +0100431 client->usage_count = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700432
433 client->dev.parent = &client->adapter->dev;
434 client->dev.driver = &client->driver->driver;
435 client->dev.bus = &i2c_bus_type;
436 client->dev.release = &i2c_client_release;
437
438 snprintf(&client->dev.bus_id[0], sizeof(client->dev.bus_id),
439 "%d-%04x", i2c_adapter_id(adapter), client->addr);
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200440 dev_dbg(&adapter->dev, "client [%s] registered with bus id %s\n",
441 client->name, client->dev.bus_id);
Jean Delvareb119c6c2006-08-15 18:26:30 +0200442 res = device_register(&client->dev);
443 if (res)
444 goto out_list;
445 res = device_create_file(&client->dev, &dev_attr_client_name);
446 if (res)
447 goto out_unregister;
448
449out_unlock:
450 mutex_unlock(&adapter->clist_lock);
451 return res;
452
453out_unregister:
454 init_completion(&client->released); /* Needed? */
455 device_unregister(&client->dev);
456 wait_for_completion(&client->released);
457out_list:
458 list_del(&client->list);
459 dev_err(&adapter->dev, "Failed to attach i2c client %s at 0x%02x "
460 "(%d)\n", client->name, client->addr, res);
461 goto out_unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700462}
463
464
465int i2c_detach_client(struct i2c_client *client)
466{
467 struct i2c_adapter *adapter = client->adapter;
468 int res = 0;
469
Jean Delvarecde78592005-11-26 21:00:54 +0100470 if (client->usage_count > 0) {
Jean Delvare7bef5592005-07-27 22:14:49 +0200471 dev_warn(&client->dev, "Client [%s] still busy, "
472 "can't detach\n", client->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700473 return -EBUSY;
Jean Delvare7bef5592005-07-27 22:14:49 +0200474 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700475
476 if (adapter->client_unregister) {
477 res = adapter->client_unregister(client);
478 if (res) {
479 dev_err(&client->dev,
Jean Delvare86749e82005-07-29 12:15:29 -0700480 "client_unregister [%s] failed, "
481 "client not detached\n", client->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700482 goto out;
483 }
484 }
485
Ingo Molnar5c085d32006-01-18 23:16:04 +0100486 mutex_lock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700487 list_del(&client->list);
488 init_completion(&client->released);
489 device_remove_file(&client->dev, &dev_attr_client_name);
490 device_unregister(&client->dev);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100491 mutex_unlock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700492 wait_for_completion(&client->released);
493
494 out:
495 return res;
496}
497
498static int i2c_inc_use_client(struct i2c_client *client)
499{
500
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100501 if (!try_module_get(client->driver->driver.owner))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700502 return -ENODEV;
503 if (!try_module_get(client->adapter->owner)) {
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100504 module_put(client->driver->driver.owner);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700505 return -ENODEV;
506 }
507
508 return 0;
509}
510
511static void i2c_dec_use_client(struct i2c_client *client)
512{
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100513 module_put(client->driver->driver.owner);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700514 module_put(client->adapter->owner);
515}
516
517int i2c_use_client(struct i2c_client *client)
518{
519 int ret;
520
521 ret = i2c_inc_use_client(client);
522 if (ret)
523 return ret;
524
Jean Delvarecde78592005-11-26 21:00:54 +0100525 client->usage_count++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700526
527 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700528}
529
530int i2c_release_client(struct i2c_client *client)
531{
Jean Delvarecde78592005-11-26 21:00:54 +0100532 if (!client->usage_count) {
533 pr_debug("i2c-core: %s used one too many times\n",
534 __FUNCTION__);
535 return -EPERM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700536 }
537
Jean Delvarecde78592005-11-26 21:00:54 +0100538 client->usage_count--;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539 i2c_dec_use_client(client);
540
541 return 0;
542}
543
544void i2c_clients_command(struct i2c_adapter *adap, unsigned int cmd, void *arg)
545{
546 struct list_head *item;
547 struct i2c_client *client;
548
Ingo Molnar5c085d32006-01-18 23:16:04 +0100549 mutex_lock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700550 list_for_each(item,&adap->clients) {
551 client = list_entry(item, struct i2c_client, list);
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100552 if (!try_module_get(client->driver->driver.owner))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553 continue;
554 if (NULL != client->driver->command) {
Ingo Molnar5c085d32006-01-18 23:16:04 +0100555 mutex_unlock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700556 client->driver->command(client,cmd,arg);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100557 mutex_lock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700558 }
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100559 module_put(client->driver->driver.owner);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700560 }
Ingo Molnar5c085d32006-01-18 23:16:04 +0100561 mutex_unlock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700562}
563
564static int __init i2c_init(void)
565{
566 int retval;
567
568 retval = bus_register(&i2c_bus_type);
569 if (retval)
570 return retval;
571 retval = driver_register(&i2c_adapter_driver);
572 if (retval)
573 return retval;
574 return class_register(&i2c_adapter_class);
575}
576
577static void __exit i2c_exit(void)
578{
579 class_unregister(&i2c_adapter_class);
580 driver_unregister(&i2c_adapter_driver);
581 bus_unregister(&i2c_bus_type);
582}
583
584subsys_initcall(i2c_init);
585module_exit(i2c_exit);
586
587/* ----------------------------------------------------
588 * the functional interface to the i2c busses.
589 * ----------------------------------------------------
590 */
591
592int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg *msgs, int num)
593{
594 int ret;
595
596 if (adap->algo->master_xfer) {
597#ifdef DEBUG
598 for (ret = 0; ret < num; ret++) {
599 dev_dbg(&adap->dev, "master_xfer[%d] %c, addr=0x%02x, "
600 "len=%d\n", ret, msgs[ret].flags & I2C_M_RD ?
601 'R' : 'W', msgs[ret].addr, msgs[ret].len);
602 }
603#endif
604
Ingo Molnar5c085d32006-01-18 23:16:04 +0100605 mutex_lock(&adap->bus_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700606 ret = adap->algo->master_xfer(adap,msgs,num);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100607 mutex_unlock(&adap->bus_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700608
609 return ret;
610 } else {
611 dev_dbg(&adap->dev, "I2C level transfers not supported\n");
612 return -ENOSYS;
613 }
614}
615
616int i2c_master_send(struct i2c_client *client,const char *buf ,int count)
617{
618 int ret;
619 struct i2c_adapter *adap=client->adapter;
620 struct i2c_msg msg;
621
Jean Delvare815f55f2005-05-07 22:58:46 +0200622 msg.addr = client->addr;
623 msg.flags = client->flags & I2C_M_TEN;
624 msg.len = count;
625 msg.buf = (char *)buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700626
Jean Delvare815f55f2005-05-07 22:58:46 +0200627 ret = i2c_transfer(adap, &msg, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700628
Jean Delvare815f55f2005-05-07 22:58:46 +0200629 /* If everything went ok (i.e. 1 msg transmitted), return #bytes
630 transmitted, else error code. */
631 return (ret == 1) ? count : ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700632}
633
634int i2c_master_recv(struct i2c_client *client, char *buf ,int count)
635{
636 struct i2c_adapter *adap=client->adapter;
637 struct i2c_msg msg;
638 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700639
Jean Delvare815f55f2005-05-07 22:58:46 +0200640 msg.addr = client->addr;
641 msg.flags = client->flags & I2C_M_TEN;
642 msg.flags |= I2C_M_RD;
643 msg.len = count;
644 msg.buf = buf;
645
646 ret = i2c_transfer(adap, &msg, 1);
647
648 /* If everything went ok (i.e. 1 msg transmitted), return #bytes
649 transmitted, else error code. */
650 return (ret == 1) ? count : ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651}
652
653
654int i2c_control(struct i2c_client *client,
655 unsigned int cmd, unsigned long arg)
656{
657 int ret = 0;
658 struct i2c_adapter *adap = client->adapter;
659
660 dev_dbg(&client->adapter->dev, "i2c ioctl, cmd: 0x%x, arg: %#lx\n", cmd, arg);
661 switch (cmd) {
662 case I2C_RETRIES:
663 adap->retries = arg;
664 break;
665 case I2C_TIMEOUT:
666 adap->timeout = arg;
667 break;
668 default:
669 if (adap->algo->algo_control!=NULL)
670 ret = adap->algo->algo_control(adap,cmd,arg);
671 }
672 return ret;
673}
674
675/* ----------------------------------------------------
676 * the i2c address scanning function
677 * Will not work for 10-bit addresses!
678 * ----------------------------------------------------
679 */
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200680static int i2c_probe_address(struct i2c_adapter *adapter, int addr, int kind,
681 int (*found_proc) (struct i2c_adapter *, int, int))
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200682{
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200683 int err;
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200684
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200685 /* Make sure the address is valid */
686 if (addr < 0x03 || addr > 0x77) {
687 dev_warn(&adapter->dev, "Invalid probe address 0x%02x\n",
688 addr);
689 return -EINVAL;
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200690 }
691
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200692 /* Skip if already in use */
693 if (i2c_check_addr(adapter, addr))
694 return 0;
695
696 /* Make sure there is something at this address, unless forced */
Jean Delvare4c9337d2005-08-09 20:28:10 +0200697 if (kind < 0) {
698 if (i2c_smbus_xfer(adapter, addr, 0, 0, 0,
699 I2C_SMBUS_QUICK, NULL) < 0)
700 return 0;
701
702 /* prevent 24RF08 corruption */
703 if ((addr & ~0x0f) == 0x50)
704 i2c_smbus_xfer(adapter, addr, 0, 0, 0,
705 I2C_SMBUS_QUICK, NULL);
706 }
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200707
708 /* Finally call the custom detection function */
709 err = found_proc(adapter, addr, kind);
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200710 /* -ENODEV can be returned if there is a chip at the given address
711 but it isn't supported by this chip driver. We catch it here as
712 this isn't an error. */
Jean Delvare114fd182006-09-03 22:25:04 +0200713 if (err == -ENODEV)
714 err = 0;
715
716 if (err)
717 dev_warn(&adapter->dev, "Client creation failed at 0x%x (%d)\n",
718 addr, err);
719 return err;
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200720}
721
Linus Torvalds1da177e2005-04-16 15:20:36 -0700722int i2c_probe(struct i2c_adapter *adapter,
723 struct i2c_client_address_data *address_data,
724 int (*found_proc) (struct i2c_adapter *, int, int))
725{
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200726 int i, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700727 int adap_id = i2c_adapter_id(adapter);
728
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200729 /* Force entries are done first, and are not affected by ignore
730 entries */
731 if (address_data->forces) {
732 unsigned short **forces = address_data->forces;
733 int kind;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700734
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200735 for (kind = 0; forces[kind]; kind++) {
736 for (i = 0; forces[kind][i] != I2C_CLIENT_END;
737 i += 2) {
738 if (forces[kind][i] == adap_id
739 || forces[kind][i] == ANY_I2C_BUS) {
740 dev_dbg(&adapter->dev, "found force "
741 "parameter for adapter %d, "
742 "addr 0x%02x, kind %d\n",
743 adap_id, forces[kind][i + 1],
744 kind);
745 err = i2c_probe_address(adapter,
746 forces[kind][i + 1],
747 kind, found_proc);
748 if (err)
749 return err;
750 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700751 }
752 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700753 }
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200754
Jean Delvare4366dc92005-09-25 16:50:06 +0200755 /* Stop here if we can't use SMBUS_QUICK */
756 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_QUICK)) {
757 if (address_data->probe[0] == I2C_CLIENT_END
758 && address_data->normal_i2c[0] == I2C_CLIENT_END)
759 return 0;
760
761 dev_warn(&adapter->dev, "SMBus Quick command not supported, "
762 "can't probe for chips\n");
763 return -1;
764 }
765
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200766 /* Probe entries are done second, and are not affected by ignore
767 entries either */
768 for (i = 0; address_data->probe[i] != I2C_CLIENT_END; i += 2) {
769 if (address_data->probe[i] == adap_id
770 || address_data->probe[i] == ANY_I2C_BUS) {
771 dev_dbg(&adapter->dev, "found probe parameter for "
772 "adapter %d, addr 0x%02x\n", adap_id,
773 address_data->probe[i + 1]);
774 err = i2c_probe_address(adapter,
775 address_data->probe[i + 1],
776 -1, found_proc);
777 if (err)
778 return err;
779 }
780 }
781
782 /* Normal entries are done last, unless shadowed by an ignore entry */
783 for (i = 0; address_data->normal_i2c[i] != I2C_CLIENT_END; i += 1) {
784 int j, ignore;
785
786 ignore = 0;
787 for (j = 0; address_data->ignore[j] != I2C_CLIENT_END;
788 j += 2) {
789 if ((address_data->ignore[j] == adap_id ||
790 address_data->ignore[j] == ANY_I2C_BUS)
791 && address_data->ignore[j + 1]
792 == address_data->normal_i2c[i]) {
793 dev_dbg(&adapter->dev, "found ignore "
794 "parameter for adapter %d, "
795 "addr 0x%02x\n", adap_id,
796 address_data->ignore[j + 1]);
Mark M. Hoffman2369df92006-07-01 17:01:59 +0200797 ignore = 1;
798 break;
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200799 }
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200800 }
801 if (ignore)
802 continue;
803
804 dev_dbg(&adapter->dev, "found normal entry for adapter %d, "
805 "addr 0x%02x\n", adap_id,
806 address_data->normal_i2c[i]);
807 err = i2c_probe_address(adapter, address_data->normal_i2c[i],
808 -1, found_proc);
809 if (err)
810 return err;
811 }
812
Linus Torvalds1da177e2005-04-16 15:20:36 -0700813 return 0;
814}
815
Linus Torvalds1da177e2005-04-16 15:20:36 -0700816struct i2c_adapter* i2c_get_adapter(int id)
817{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700818 struct i2c_adapter *adapter;
819
Arjan van de Venb3585e42006-01-11 10:50:26 +0100820 mutex_lock(&core_lists);
Mark M. Hoffmana0920e12005-06-28 00:21:30 -0400821 adapter = (struct i2c_adapter *)idr_find(&i2c_adapter_idr, id);
822 if (adapter && !try_module_get(adapter->owner))
823 adapter = NULL;
824
Arjan van de Venb3585e42006-01-11 10:50:26 +0100825 mutex_unlock(&core_lists);
Mark M. Hoffmana0920e12005-06-28 00:21:30 -0400826 return adapter;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700827}
828
829void i2c_put_adapter(struct i2c_adapter *adap)
830{
831 module_put(adap->owner);
832}
833
834/* The SMBus parts */
835
836#define POLY (0x1070U << 3)
837static u8
838crc8(u16 data)
839{
840 int i;
841
842 for(i = 0; i < 8; i++) {
843 if (data & 0x8000)
844 data = data ^ POLY;
845 data = data << 1;
846 }
847 return (u8)(data >> 8);
848}
849
Jean Delvare421ef472005-10-26 21:28:55 +0200850/* Incremental CRC8 over count bytes in the array pointed to by p */
851static u8 i2c_smbus_pec(u8 crc, u8 *p, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700852{
853 int i;
854
855 for(i = 0; i < count; i++)
Jean Delvare421ef472005-10-26 21:28:55 +0200856 crc = crc8((crc ^ p[i]) << 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700857 return crc;
858}
859
Jean Delvare421ef472005-10-26 21:28:55 +0200860/* Assume a 7-bit address, which is reasonable for SMBus */
861static u8 i2c_smbus_msg_pec(u8 pec, struct i2c_msg *msg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700862{
Jean Delvare421ef472005-10-26 21:28:55 +0200863 /* The address will be sent first */
864 u8 addr = (msg->addr << 1) | !!(msg->flags & I2C_M_RD);
865 pec = i2c_smbus_pec(pec, &addr, 1);
866
867 /* The data buffer follows */
868 return i2c_smbus_pec(pec, msg->buf, msg->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700869}
870
Jean Delvare421ef472005-10-26 21:28:55 +0200871/* Used for write only transactions */
872static inline void i2c_smbus_add_pec(struct i2c_msg *msg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700873{
Jean Delvare421ef472005-10-26 21:28:55 +0200874 msg->buf[msg->len] = i2c_smbus_msg_pec(0, msg);
875 msg->len++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700876}
877
Jean Delvare421ef472005-10-26 21:28:55 +0200878/* Return <0 on CRC error
879 If there was a write before this read (most cases) we need to take the
880 partial CRC from the write part into account.
881 Note that this function does modify the message (we need to decrease the
882 message length to hide the CRC byte from the caller). */
883static int i2c_smbus_check_pec(u8 cpec, struct i2c_msg *msg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700884{
Jean Delvare421ef472005-10-26 21:28:55 +0200885 u8 rpec = msg->buf[--msg->len];
886 cpec = i2c_smbus_msg_pec(cpec, msg);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700887
Linus Torvalds1da177e2005-04-16 15:20:36 -0700888 if (rpec != cpec) {
889 pr_debug("i2c-core: Bad PEC 0x%02x vs. 0x%02x\n",
890 rpec, cpec);
891 return -1;
892 }
893 return 0;
894}
895
896s32 i2c_smbus_write_quick(struct i2c_client *client, u8 value)
897{
898 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
899 value,0,I2C_SMBUS_QUICK,NULL);
900}
901
902s32 i2c_smbus_read_byte(struct i2c_client *client)
903{
904 union i2c_smbus_data data;
905 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
906 I2C_SMBUS_READ,0,I2C_SMBUS_BYTE, &data))
907 return -1;
908 else
Jean Delvare7eff82c2006-09-03 22:24:00 +0200909 return data.byte;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700910}
911
912s32 i2c_smbus_write_byte(struct i2c_client *client, u8 value)
913{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700914 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
Jean Delvare421ef472005-10-26 21:28:55 +0200915 I2C_SMBUS_WRITE, value, I2C_SMBUS_BYTE, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700916}
917
918s32 i2c_smbus_read_byte_data(struct i2c_client *client, u8 command)
919{
920 union i2c_smbus_data data;
921 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
922 I2C_SMBUS_READ,command, I2C_SMBUS_BYTE_DATA,&data))
923 return -1;
924 else
Jean Delvare7eff82c2006-09-03 22:24:00 +0200925 return data.byte;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700926}
927
928s32 i2c_smbus_write_byte_data(struct i2c_client *client, u8 command, u8 value)
929{
930 union i2c_smbus_data data;
931 data.byte = value;
932 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
933 I2C_SMBUS_WRITE,command,
934 I2C_SMBUS_BYTE_DATA,&data);
935}
936
937s32 i2c_smbus_read_word_data(struct i2c_client *client, u8 command)
938{
939 union i2c_smbus_data data;
940 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
941 I2C_SMBUS_READ,command, I2C_SMBUS_WORD_DATA, &data))
942 return -1;
943 else
Jean Delvare7eff82c2006-09-03 22:24:00 +0200944 return data.word;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700945}
946
947s32 i2c_smbus_write_word_data(struct i2c_client *client, u8 command, u16 value)
948{
949 union i2c_smbus_data data;
950 data.word = value;
951 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
952 I2C_SMBUS_WRITE,command,
953 I2C_SMBUS_WORD_DATA,&data);
954}
955
956s32 i2c_smbus_write_block_data(struct i2c_client *client, u8 command,
Krzysztof Halasa46f5ed72006-06-12 21:42:20 +0200957 u8 length, const u8 *values)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700958{
959 union i2c_smbus_data data;
Jean Delvare76560322006-01-18 23:14:55 +0100960
Linus Torvalds1da177e2005-04-16 15:20:36 -0700961 if (length > I2C_SMBUS_BLOCK_MAX)
962 length = I2C_SMBUS_BLOCK_MAX;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700963 data.block[0] = length;
Jean Delvare76560322006-01-18 23:14:55 +0100964 memcpy(&data.block[1], values, length);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700965 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
966 I2C_SMBUS_WRITE,command,
967 I2C_SMBUS_BLOCK_DATA,&data);
968}
969
970/* Returns the number of read bytes */
971s32 i2c_smbus_read_i2c_block_data(struct i2c_client *client, u8 command, u8 *values)
972{
973 union i2c_smbus_data data;
Jean Delvare76560322006-01-18 23:14:55 +0100974
Linus Torvalds1da177e2005-04-16 15:20:36 -0700975 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
976 I2C_SMBUS_READ,command,
977 I2C_SMBUS_I2C_BLOCK_DATA,&data))
978 return -1;
Jean Delvare76560322006-01-18 23:14:55 +0100979
980 memcpy(values, &data.block[1], data.block[0]);
981 return data.block[0];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700982}
983
Jean Delvare21bbd692006-01-09 15:19:18 +1100984s32 i2c_smbus_write_i2c_block_data(struct i2c_client *client, u8 command,
Krzysztof Halasa46f5ed72006-06-12 21:42:20 +0200985 u8 length, const u8 *values)
Jean Delvare21bbd692006-01-09 15:19:18 +1100986{
987 union i2c_smbus_data data;
988
989 if (length > I2C_SMBUS_BLOCK_MAX)
990 length = I2C_SMBUS_BLOCK_MAX;
991 data.block[0] = length;
992 memcpy(data.block + 1, values, length);
993 return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
994 I2C_SMBUS_WRITE, command,
995 I2C_SMBUS_I2C_BLOCK_DATA, &data);
996}
997
Linus Torvalds1da177e2005-04-16 15:20:36 -0700998/* Simulate a SMBus command using the i2c protocol
999 No checking of parameters is done! */
1000static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr,
1001 unsigned short flags,
1002 char read_write, u8 command, int size,
1003 union i2c_smbus_data * data)
1004{
1005 /* So we need to generate a series of msgs. In the case of writing, we
1006 need to use only one message; when reading, we need two. We initialize
1007 most things with sane defaults, to keep the code below somewhat
1008 simpler. */
Hideki Iwamoto5c50d182005-09-25 17:01:11 +02001009 unsigned char msgbuf0[I2C_SMBUS_BLOCK_MAX+3];
1010 unsigned char msgbuf1[I2C_SMBUS_BLOCK_MAX+2];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001011 int num = read_write == I2C_SMBUS_READ?2:1;
1012 struct i2c_msg msg[2] = { { addr, flags, 1, msgbuf0 },
1013 { addr, flags | I2C_M_RD, 0, msgbuf1 }
1014 };
1015 int i;
Jean Delvare421ef472005-10-26 21:28:55 +02001016 u8 partial_pec = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001017
1018 msgbuf0[0] = command;
1019 switch(size) {
1020 case I2C_SMBUS_QUICK:
1021 msg[0].len = 0;
1022 /* Special case: The read/write field is used as data */
1023 msg[0].flags = flags | (read_write==I2C_SMBUS_READ)?I2C_M_RD:0;
1024 num = 1;
1025 break;
1026 case I2C_SMBUS_BYTE:
1027 if (read_write == I2C_SMBUS_READ) {
1028 /* Special case: only a read! */
1029 msg[0].flags = I2C_M_RD | flags;
1030 num = 1;
1031 }
1032 break;
1033 case I2C_SMBUS_BYTE_DATA:
1034 if (read_write == I2C_SMBUS_READ)
1035 msg[1].len = 1;
1036 else {
1037 msg[0].len = 2;
1038 msgbuf0[1] = data->byte;
1039 }
1040 break;
1041 case I2C_SMBUS_WORD_DATA:
1042 if (read_write == I2C_SMBUS_READ)
1043 msg[1].len = 2;
1044 else {
1045 msg[0].len=3;
1046 msgbuf0[1] = data->word & 0xff;
Jean Delvare7eff82c2006-09-03 22:24:00 +02001047 msgbuf0[2] = data->word >> 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001048 }
1049 break;
1050 case I2C_SMBUS_PROC_CALL:
1051 num = 2; /* Special case */
1052 read_write = I2C_SMBUS_READ;
1053 msg[0].len = 3;
1054 msg[1].len = 2;
1055 msgbuf0[1] = data->word & 0xff;
Jean Delvare7eff82c2006-09-03 22:24:00 +02001056 msgbuf0[2] = data->word >> 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001057 break;
1058 case I2C_SMBUS_BLOCK_DATA:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001059 if (read_write == I2C_SMBUS_READ) {
1060 dev_err(&adapter->dev, "Block read not supported "
1061 "under I2C emulation!\n");
1062 return -1;
1063 } else {
1064 msg[0].len = data->block[0] + 2;
1065 if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 2) {
1066 dev_err(&adapter->dev, "smbus_access called with "
1067 "invalid block write size (%d)\n",
1068 data->block[0]);
1069 return -1;
1070 }
Hideki Iwamoto5c50d182005-09-25 17:01:11 +02001071 for (i = 1; i < msg[0].len; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001072 msgbuf0[i] = data->block[i-1];
1073 }
1074 break;
1075 case I2C_SMBUS_BLOCK_PROC_CALL:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001076 dev_dbg(&adapter->dev, "Block process call not supported "
1077 "under I2C emulation!\n");
1078 return -1;
1079 case I2C_SMBUS_I2C_BLOCK_DATA:
1080 if (read_write == I2C_SMBUS_READ) {
Jean Delvare30dac742005-10-08 00:15:59 +02001081 msg[1].len = I2C_SMBUS_BLOCK_MAX;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001082 } else {
1083 msg[0].len = data->block[0] + 1;
Jean Delvare30dac742005-10-08 00:15:59 +02001084 if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 1) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001085 dev_err(&adapter->dev, "i2c_smbus_xfer_emulated called with "
1086 "invalid block write size (%d)\n",
1087 data->block[0]);
1088 return -1;
1089 }
1090 for (i = 1; i <= data->block[0]; i++)
1091 msgbuf0[i] = data->block[i];
1092 }
1093 break;
1094 default:
1095 dev_err(&adapter->dev, "smbus_access called with invalid size (%d)\n",
1096 size);
1097 return -1;
1098 }
1099
Jean Delvare421ef472005-10-26 21:28:55 +02001100 i = ((flags & I2C_CLIENT_PEC) && size != I2C_SMBUS_QUICK
1101 && size != I2C_SMBUS_I2C_BLOCK_DATA);
1102 if (i) {
1103 /* Compute PEC if first message is a write */
1104 if (!(msg[0].flags & I2C_M_RD)) {
1105 if (num == 1) /* Write only */
1106 i2c_smbus_add_pec(&msg[0]);
1107 else /* Write followed by read */
1108 partial_pec = i2c_smbus_msg_pec(0, &msg[0]);
1109 }
1110 /* Ask for PEC if last message is a read */
1111 if (msg[num-1].flags & I2C_M_RD)
1112 msg[num-1].len++;
1113 }
1114
Linus Torvalds1da177e2005-04-16 15:20:36 -07001115 if (i2c_transfer(adapter, msg, num) < 0)
1116 return -1;
1117
Jean Delvare421ef472005-10-26 21:28:55 +02001118 /* Check PEC if last message is a read */
1119 if (i && (msg[num-1].flags & I2C_M_RD)) {
1120 if (i2c_smbus_check_pec(partial_pec, &msg[num-1]) < 0)
1121 return -1;
1122 }
1123
Linus Torvalds1da177e2005-04-16 15:20:36 -07001124 if (read_write == I2C_SMBUS_READ)
1125 switch(size) {
1126 case I2C_SMBUS_BYTE:
1127 data->byte = msgbuf0[0];
1128 break;
1129 case I2C_SMBUS_BYTE_DATA:
1130 data->byte = msgbuf1[0];
1131 break;
1132 case I2C_SMBUS_WORD_DATA:
1133 case I2C_SMBUS_PROC_CALL:
1134 data->word = msgbuf1[0] | (msgbuf1[1] << 8);
1135 break;
1136 case I2C_SMBUS_I2C_BLOCK_DATA:
1137 /* fixed at 32 for now */
Jean Delvare30dac742005-10-08 00:15:59 +02001138 data->block[0] = I2C_SMBUS_BLOCK_MAX;
1139 for (i = 0; i < I2C_SMBUS_BLOCK_MAX; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001140 data->block[i+1] = msgbuf1[i];
1141 break;
1142 }
1143 return 0;
1144}
1145
1146
1147s32 i2c_smbus_xfer(struct i2c_adapter * adapter, u16 addr, unsigned short flags,
1148 char read_write, u8 command, int size,
1149 union i2c_smbus_data * data)
1150{
1151 s32 res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001152
1153 flags &= I2C_M_TEN | I2C_CLIENT_PEC;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154
1155 if (adapter->algo->smbus_xfer) {
Ingo Molnar5c085d32006-01-18 23:16:04 +01001156 mutex_lock(&adapter->bus_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001157 res = adapter->algo->smbus_xfer(adapter,addr,flags,read_write,
1158 command,size,data);
Ingo Molnar5c085d32006-01-18 23:16:04 +01001159 mutex_unlock(&adapter->bus_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160 } else
1161 res = i2c_smbus_xfer_emulated(adapter,addr,flags,read_write,
1162 command,size,data);
1163
Linus Torvalds1da177e2005-04-16 15:20:36 -07001164 return res;
1165}
1166
1167
Jean Delvareefde7232005-07-20 23:03:50 +02001168/* Next four are needed by i2c-isa */
1169EXPORT_SYMBOL_GPL(i2c_adapter_dev_release);
1170EXPORT_SYMBOL_GPL(i2c_adapter_driver);
1171EXPORT_SYMBOL_GPL(i2c_adapter_class);
1172EXPORT_SYMBOL_GPL(i2c_bus_type);
1173
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174EXPORT_SYMBOL(i2c_add_adapter);
1175EXPORT_SYMBOL(i2c_del_adapter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001176EXPORT_SYMBOL(i2c_del_driver);
1177EXPORT_SYMBOL(i2c_attach_client);
1178EXPORT_SYMBOL(i2c_detach_client);
1179EXPORT_SYMBOL(i2c_use_client);
1180EXPORT_SYMBOL(i2c_release_client);
1181EXPORT_SYMBOL(i2c_clients_command);
1182EXPORT_SYMBOL(i2c_check_addr);
1183
1184EXPORT_SYMBOL(i2c_master_send);
1185EXPORT_SYMBOL(i2c_master_recv);
1186EXPORT_SYMBOL(i2c_control);
1187EXPORT_SYMBOL(i2c_transfer);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001188EXPORT_SYMBOL(i2c_get_adapter);
1189EXPORT_SYMBOL(i2c_put_adapter);
1190EXPORT_SYMBOL(i2c_probe);
1191
1192EXPORT_SYMBOL(i2c_smbus_xfer);
1193EXPORT_SYMBOL(i2c_smbus_write_quick);
1194EXPORT_SYMBOL(i2c_smbus_read_byte);
1195EXPORT_SYMBOL(i2c_smbus_write_byte);
1196EXPORT_SYMBOL(i2c_smbus_read_byte_data);
1197EXPORT_SYMBOL(i2c_smbus_write_byte_data);
1198EXPORT_SYMBOL(i2c_smbus_read_word_data);
1199EXPORT_SYMBOL(i2c_smbus_write_word_data);
1200EXPORT_SYMBOL(i2c_smbus_write_block_data);
1201EXPORT_SYMBOL(i2c_smbus_read_i2c_block_data);
Jean Delvare21bbd692006-01-09 15:19:18 +11001202EXPORT_SYMBOL(i2c_smbus_write_i2c_block_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001203
1204MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
1205MODULE_DESCRIPTION("I2C-Bus main module");
1206MODULE_LICENSE("GPL");