blob: 79eaa12474ddc06737709584c96ebaea4eb84e12 [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
Jean Delvarecde78592005-11-26 21:00:54 +0100423 client->usage_count = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700424
425 client->dev.parent = &client->adapter->dev;
426 client->dev.driver = &client->driver->driver;
427 client->dev.bus = &i2c_bus_type;
428 client->dev.release = &i2c_client_release;
429
430 snprintf(&client->dev.bus_id[0], sizeof(client->dev.bus_id),
431 "%d-%04x", i2c_adapter_id(adapter), client->addr);
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200432 dev_dbg(&adapter->dev, "client [%s] registered with bus id %s\n",
433 client->name, client->dev.bus_id);
Jean Delvareb119c6c2006-08-15 18:26:30 +0200434 res = device_register(&client->dev);
435 if (res)
436 goto out_list;
437 res = device_create_file(&client->dev, &dev_attr_client_name);
438 if (res)
439 goto out_unregister;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200440 mutex_unlock(&adapter->clist_lock);
Jean Delvare77ed74d2006-09-30 17:18:59 +0200441
442 if (adapter->client_register) {
443 if (adapter->client_register(client)) {
444 dev_dbg(&adapter->dev, "client_register "
445 "failed for client [%s] at 0x%02x\n",
446 client->name, client->addr);
447 }
448 }
449
450 return 0;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200451
452out_unregister:
453 init_completion(&client->released); /* Needed? */
454 device_unregister(&client->dev);
455 wait_for_completion(&client->released);
456out_list:
457 list_del(&client->list);
458 dev_err(&adapter->dev, "Failed to attach i2c client %s at 0x%02x "
459 "(%d)\n", client->name, client->addr, res);
Jean Delvare77ed74d2006-09-30 17:18:59 +0200460out_unlock:
461 mutex_unlock(&adapter->clist_lock);
462 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700463}
464
465
466int i2c_detach_client(struct i2c_client *client)
467{
468 struct i2c_adapter *adapter = client->adapter;
469 int res = 0;
470
Jean Delvarecde78592005-11-26 21:00:54 +0100471 if (client->usage_count > 0) {
Jean Delvare7bef5592005-07-27 22:14:49 +0200472 dev_warn(&client->dev, "Client [%s] still busy, "
473 "can't detach\n", client->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700474 return -EBUSY;
Jean Delvare7bef5592005-07-27 22:14:49 +0200475 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700476
477 if (adapter->client_unregister) {
478 res = adapter->client_unregister(client);
479 if (res) {
480 dev_err(&client->dev,
Jean Delvare86749e82005-07-29 12:15:29 -0700481 "client_unregister [%s] failed, "
482 "client not detached\n", client->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700483 goto out;
484 }
485 }
486
Ingo Molnar5c085d32006-01-18 23:16:04 +0100487 mutex_lock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700488 list_del(&client->list);
489 init_completion(&client->released);
490 device_remove_file(&client->dev, &dev_attr_client_name);
491 device_unregister(&client->dev);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100492 mutex_unlock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700493 wait_for_completion(&client->released);
494
495 out:
496 return res;
497}
498
499static int i2c_inc_use_client(struct i2c_client *client)
500{
501
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100502 if (!try_module_get(client->driver->driver.owner))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700503 return -ENODEV;
504 if (!try_module_get(client->adapter->owner)) {
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100505 module_put(client->driver->driver.owner);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700506 return -ENODEV;
507 }
508
509 return 0;
510}
511
512static void i2c_dec_use_client(struct i2c_client *client)
513{
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100514 module_put(client->driver->driver.owner);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700515 module_put(client->adapter->owner);
516}
517
518int i2c_use_client(struct i2c_client *client)
519{
520 int ret;
521
522 ret = i2c_inc_use_client(client);
523 if (ret)
524 return ret;
525
Jean Delvarecde78592005-11-26 21:00:54 +0100526 client->usage_count++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700527
528 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700529}
530
531int i2c_release_client(struct i2c_client *client)
532{
Jean Delvarecde78592005-11-26 21:00:54 +0100533 if (!client->usage_count) {
534 pr_debug("i2c-core: %s used one too many times\n",
535 __FUNCTION__);
536 return -EPERM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700537 }
538
Jean Delvarecde78592005-11-26 21:00:54 +0100539 client->usage_count--;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700540 i2c_dec_use_client(client);
541
542 return 0;
543}
544
545void i2c_clients_command(struct i2c_adapter *adap, unsigned int cmd, void *arg)
546{
547 struct list_head *item;
548 struct i2c_client *client;
549
Ingo Molnar5c085d32006-01-18 23:16:04 +0100550 mutex_lock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700551 list_for_each(item,&adap->clients) {
552 client = list_entry(item, struct i2c_client, list);
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100553 if (!try_module_get(client->driver->driver.owner))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700554 continue;
555 if (NULL != client->driver->command) {
Ingo Molnar5c085d32006-01-18 23:16:04 +0100556 mutex_unlock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700557 client->driver->command(client,cmd,arg);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100558 mutex_lock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700559 }
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100560 module_put(client->driver->driver.owner);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700561 }
Ingo Molnar5c085d32006-01-18 23:16:04 +0100562 mutex_unlock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700563}
564
565static int __init i2c_init(void)
566{
567 int retval;
568
569 retval = bus_register(&i2c_bus_type);
570 if (retval)
571 return retval;
572 retval = driver_register(&i2c_adapter_driver);
573 if (retval)
574 return retval;
575 return class_register(&i2c_adapter_class);
576}
577
578static void __exit i2c_exit(void)
579{
580 class_unregister(&i2c_adapter_class);
581 driver_unregister(&i2c_adapter_driver);
582 bus_unregister(&i2c_bus_type);
583}
584
585subsys_initcall(i2c_init);
586module_exit(i2c_exit);
587
588/* ----------------------------------------------------
589 * the functional interface to the i2c busses.
590 * ----------------------------------------------------
591 */
592
593int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg *msgs, int num)
594{
595 int ret;
596
597 if (adap->algo->master_xfer) {
598#ifdef DEBUG
599 for (ret = 0; ret < num; ret++) {
600 dev_dbg(&adap->dev, "master_xfer[%d] %c, addr=0x%02x, "
601 "len=%d\n", ret, msgs[ret].flags & I2C_M_RD ?
602 'R' : 'W', msgs[ret].addr, msgs[ret].len);
603 }
604#endif
605
Jiri Kosina6ea23032006-12-10 21:21:30 +0100606 mutex_lock_nested(&adap->bus_lock, adap->level);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700607 ret = adap->algo->master_xfer(adap,msgs,num);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100608 mutex_unlock(&adap->bus_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700609
610 return ret;
611 } else {
612 dev_dbg(&adap->dev, "I2C level transfers not supported\n");
613 return -ENOSYS;
614 }
615}
616
617int i2c_master_send(struct i2c_client *client,const char *buf ,int count)
618{
619 int ret;
620 struct i2c_adapter *adap=client->adapter;
621 struct i2c_msg msg;
622
Jean Delvare815f55f2005-05-07 22:58:46 +0200623 msg.addr = client->addr;
624 msg.flags = client->flags & I2C_M_TEN;
625 msg.len = count;
626 msg.buf = (char *)buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700627
Jean Delvare815f55f2005-05-07 22:58:46 +0200628 ret = i2c_transfer(adap, &msg, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700629
Jean Delvare815f55f2005-05-07 22:58:46 +0200630 /* If everything went ok (i.e. 1 msg transmitted), return #bytes
631 transmitted, else error code. */
632 return (ret == 1) ? count : ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633}
634
635int i2c_master_recv(struct i2c_client *client, char *buf ,int count)
636{
637 struct i2c_adapter *adap=client->adapter;
638 struct i2c_msg msg;
639 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700640
Jean Delvare815f55f2005-05-07 22:58:46 +0200641 msg.addr = client->addr;
642 msg.flags = client->flags & I2C_M_TEN;
643 msg.flags |= I2C_M_RD;
644 msg.len = count;
645 msg.buf = buf;
646
647 ret = i2c_transfer(adap, &msg, 1);
648
649 /* If everything went ok (i.e. 1 msg transmitted), return #bytes
650 transmitted, else error code. */
651 return (ret == 1) ? count : ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700652}
653
654
655int i2c_control(struct i2c_client *client,
656 unsigned int cmd, unsigned long arg)
657{
658 int ret = 0;
659 struct i2c_adapter *adap = client->adapter;
660
661 dev_dbg(&client->adapter->dev, "i2c ioctl, cmd: 0x%x, arg: %#lx\n", cmd, arg);
662 switch (cmd) {
663 case I2C_RETRIES:
664 adap->retries = arg;
665 break;
666 case I2C_TIMEOUT:
667 adap->timeout = arg;
668 break;
669 default:
670 if (adap->algo->algo_control!=NULL)
671 ret = adap->algo->algo_control(adap,cmd,arg);
672 }
673 return ret;
674}
675
676/* ----------------------------------------------------
677 * the i2c address scanning function
678 * Will not work for 10-bit addresses!
679 * ----------------------------------------------------
680 */
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200681static int i2c_probe_address(struct i2c_adapter *adapter, int addr, int kind,
682 int (*found_proc) (struct i2c_adapter *, int, int))
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200683{
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200684 int err;
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200685
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200686 /* Make sure the address is valid */
687 if (addr < 0x03 || addr > 0x77) {
688 dev_warn(&adapter->dev, "Invalid probe address 0x%02x\n",
689 addr);
690 return -EINVAL;
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200691 }
692
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200693 /* Skip if already in use */
694 if (i2c_check_addr(adapter, addr))
695 return 0;
696
697 /* Make sure there is something at this address, unless forced */
Jean Delvare4c9337d2005-08-09 20:28:10 +0200698 if (kind < 0) {
699 if (i2c_smbus_xfer(adapter, addr, 0, 0, 0,
700 I2C_SMBUS_QUICK, NULL) < 0)
701 return 0;
702
703 /* prevent 24RF08 corruption */
704 if ((addr & ~0x0f) == 0x50)
705 i2c_smbus_xfer(adapter, addr, 0, 0, 0,
706 I2C_SMBUS_QUICK, NULL);
707 }
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200708
709 /* Finally call the custom detection function */
710 err = found_proc(adapter, addr, kind);
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200711 /* -ENODEV can be returned if there is a chip at the given address
712 but it isn't supported by this chip driver. We catch it here as
713 this isn't an error. */
Jean Delvare114fd182006-09-03 22:25:04 +0200714 if (err == -ENODEV)
715 err = 0;
716
717 if (err)
718 dev_warn(&adapter->dev, "Client creation failed at 0x%x (%d)\n",
719 addr, err);
720 return err;
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200721}
722
Linus Torvalds1da177e2005-04-16 15:20:36 -0700723int i2c_probe(struct i2c_adapter *adapter,
724 struct i2c_client_address_data *address_data,
725 int (*found_proc) (struct i2c_adapter *, int, int))
726{
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200727 int i, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700728 int adap_id = i2c_adapter_id(adapter);
729
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200730 /* Force entries are done first, and are not affected by ignore
731 entries */
732 if (address_data->forces) {
733 unsigned short **forces = address_data->forces;
734 int kind;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700735
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200736 for (kind = 0; forces[kind]; kind++) {
737 for (i = 0; forces[kind][i] != I2C_CLIENT_END;
738 i += 2) {
739 if (forces[kind][i] == adap_id
740 || forces[kind][i] == ANY_I2C_BUS) {
741 dev_dbg(&adapter->dev, "found force "
742 "parameter for adapter %d, "
743 "addr 0x%02x, kind %d\n",
744 adap_id, forces[kind][i + 1],
745 kind);
746 err = i2c_probe_address(adapter,
747 forces[kind][i + 1],
748 kind, found_proc);
749 if (err)
750 return err;
751 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700752 }
753 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700754 }
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200755
Jean Delvare4366dc92005-09-25 16:50:06 +0200756 /* Stop here if we can't use SMBUS_QUICK */
757 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_QUICK)) {
758 if (address_data->probe[0] == I2C_CLIENT_END
759 && address_data->normal_i2c[0] == I2C_CLIENT_END)
760 return 0;
761
762 dev_warn(&adapter->dev, "SMBus Quick command not supported, "
763 "can't probe for chips\n");
764 return -1;
765 }
766
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200767 /* Probe entries are done second, and are not affected by ignore
768 entries either */
769 for (i = 0; address_data->probe[i] != I2C_CLIENT_END; i += 2) {
770 if (address_data->probe[i] == adap_id
771 || address_data->probe[i] == ANY_I2C_BUS) {
772 dev_dbg(&adapter->dev, "found probe parameter for "
773 "adapter %d, addr 0x%02x\n", adap_id,
774 address_data->probe[i + 1]);
775 err = i2c_probe_address(adapter,
776 address_data->probe[i + 1],
777 -1, found_proc);
778 if (err)
779 return err;
780 }
781 }
782
783 /* Normal entries are done last, unless shadowed by an ignore entry */
784 for (i = 0; address_data->normal_i2c[i] != I2C_CLIENT_END; i += 1) {
785 int j, ignore;
786
787 ignore = 0;
788 for (j = 0; address_data->ignore[j] != I2C_CLIENT_END;
789 j += 2) {
790 if ((address_data->ignore[j] == adap_id ||
791 address_data->ignore[j] == ANY_I2C_BUS)
792 && address_data->ignore[j + 1]
793 == address_data->normal_i2c[i]) {
794 dev_dbg(&adapter->dev, "found ignore "
795 "parameter for adapter %d, "
796 "addr 0x%02x\n", adap_id,
797 address_data->ignore[j + 1]);
Mark M. Hoffman2369df92006-07-01 17:01:59 +0200798 ignore = 1;
799 break;
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200800 }
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200801 }
802 if (ignore)
803 continue;
804
805 dev_dbg(&adapter->dev, "found normal entry for adapter %d, "
806 "addr 0x%02x\n", adap_id,
807 address_data->normal_i2c[i]);
808 err = i2c_probe_address(adapter, address_data->normal_i2c[i],
809 -1, found_proc);
810 if (err)
811 return err;
812 }
813
Linus Torvalds1da177e2005-04-16 15:20:36 -0700814 return 0;
815}
816
Linus Torvalds1da177e2005-04-16 15:20:36 -0700817struct i2c_adapter* i2c_get_adapter(int id)
818{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700819 struct i2c_adapter *adapter;
820
Arjan van de Venb3585e42006-01-11 10:50:26 +0100821 mutex_lock(&core_lists);
Mark M. Hoffmana0920e12005-06-28 00:21:30 -0400822 adapter = (struct i2c_adapter *)idr_find(&i2c_adapter_idr, id);
823 if (adapter && !try_module_get(adapter->owner))
824 adapter = NULL;
825
Arjan van de Venb3585e42006-01-11 10:50:26 +0100826 mutex_unlock(&core_lists);
Mark M. Hoffmana0920e12005-06-28 00:21:30 -0400827 return adapter;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700828}
829
830void i2c_put_adapter(struct i2c_adapter *adap)
831{
832 module_put(adap->owner);
833}
834
835/* The SMBus parts */
836
837#define POLY (0x1070U << 3)
838static u8
839crc8(u16 data)
840{
841 int i;
842
843 for(i = 0; i < 8; i++) {
844 if (data & 0x8000)
845 data = data ^ POLY;
846 data = data << 1;
847 }
848 return (u8)(data >> 8);
849}
850
Jean Delvare421ef472005-10-26 21:28:55 +0200851/* Incremental CRC8 over count bytes in the array pointed to by p */
852static u8 i2c_smbus_pec(u8 crc, u8 *p, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700853{
854 int i;
855
856 for(i = 0; i < count; i++)
Jean Delvare421ef472005-10-26 21:28:55 +0200857 crc = crc8((crc ^ p[i]) << 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700858 return crc;
859}
860
Jean Delvare421ef472005-10-26 21:28:55 +0200861/* Assume a 7-bit address, which is reasonable for SMBus */
862static u8 i2c_smbus_msg_pec(u8 pec, struct i2c_msg *msg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700863{
Jean Delvare421ef472005-10-26 21:28:55 +0200864 /* The address will be sent first */
865 u8 addr = (msg->addr << 1) | !!(msg->flags & I2C_M_RD);
866 pec = i2c_smbus_pec(pec, &addr, 1);
867
868 /* The data buffer follows */
869 return i2c_smbus_pec(pec, msg->buf, msg->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700870}
871
Jean Delvare421ef472005-10-26 21:28:55 +0200872/* Used for write only transactions */
873static inline void i2c_smbus_add_pec(struct i2c_msg *msg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700874{
Jean Delvare421ef472005-10-26 21:28:55 +0200875 msg->buf[msg->len] = i2c_smbus_msg_pec(0, msg);
876 msg->len++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700877}
878
Jean Delvare421ef472005-10-26 21:28:55 +0200879/* Return <0 on CRC error
880 If there was a write before this read (most cases) we need to take the
881 partial CRC from the write part into account.
882 Note that this function does modify the message (we need to decrease the
883 message length to hide the CRC byte from the caller). */
884static int i2c_smbus_check_pec(u8 cpec, struct i2c_msg *msg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700885{
Jean Delvare421ef472005-10-26 21:28:55 +0200886 u8 rpec = msg->buf[--msg->len];
887 cpec = i2c_smbus_msg_pec(cpec, msg);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700888
Linus Torvalds1da177e2005-04-16 15:20:36 -0700889 if (rpec != cpec) {
890 pr_debug("i2c-core: Bad PEC 0x%02x vs. 0x%02x\n",
891 rpec, cpec);
892 return -1;
893 }
894 return 0;
895}
896
897s32 i2c_smbus_write_quick(struct i2c_client *client, u8 value)
898{
899 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
900 value,0,I2C_SMBUS_QUICK,NULL);
901}
902
903s32 i2c_smbus_read_byte(struct i2c_client *client)
904{
905 union i2c_smbus_data data;
906 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
907 I2C_SMBUS_READ,0,I2C_SMBUS_BYTE, &data))
908 return -1;
909 else
Jean Delvare7eff82c2006-09-03 22:24:00 +0200910 return data.byte;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700911}
912
913s32 i2c_smbus_write_byte(struct i2c_client *client, u8 value)
914{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700915 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
Jean Delvare421ef472005-10-26 21:28:55 +0200916 I2C_SMBUS_WRITE, value, I2C_SMBUS_BYTE, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700917}
918
919s32 i2c_smbus_read_byte_data(struct i2c_client *client, u8 command)
920{
921 union i2c_smbus_data data;
922 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
923 I2C_SMBUS_READ,command, I2C_SMBUS_BYTE_DATA,&data))
924 return -1;
925 else
Jean Delvare7eff82c2006-09-03 22:24:00 +0200926 return data.byte;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700927}
928
929s32 i2c_smbus_write_byte_data(struct i2c_client *client, u8 command, u8 value)
930{
931 union i2c_smbus_data data;
932 data.byte = value;
933 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
934 I2C_SMBUS_WRITE,command,
935 I2C_SMBUS_BYTE_DATA,&data);
936}
937
938s32 i2c_smbus_read_word_data(struct i2c_client *client, u8 command)
939{
940 union i2c_smbus_data data;
941 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
942 I2C_SMBUS_READ,command, I2C_SMBUS_WORD_DATA, &data))
943 return -1;
944 else
Jean Delvare7eff82c2006-09-03 22:24:00 +0200945 return data.word;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700946}
947
948s32 i2c_smbus_write_word_data(struct i2c_client *client, u8 command, u16 value)
949{
950 union i2c_smbus_data data;
951 data.word = value;
952 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
953 I2C_SMBUS_WRITE,command,
954 I2C_SMBUS_WORD_DATA,&data);
955}
956
957s32 i2c_smbus_write_block_data(struct i2c_client *client, u8 command,
Krzysztof Halasa46f5ed72006-06-12 21:42:20 +0200958 u8 length, const u8 *values)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700959{
960 union i2c_smbus_data data;
Jean Delvare76560322006-01-18 23:14:55 +0100961
Linus Torvalds1da177e2005-04-16 15:20:36 -0700962 if (length > I2C_SMBUS_BLOCK_MAX)
963 length = I2C_SMBUS_BLOCK_MAX;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700964 data.block[0] = length;
Jean Delvare76560322006-01-18 23:14:55 +0100965 memcpy(&data.block[1], values, length);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700966 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
967 I2C_SMBUS_WRITE,command,
968 I2C_SMBUS_BLOCK_DATA,&data);
969}
970
971/* Returns the number of read bytes */
972s32 i2c_smbus_read_i2c_block_data(struct i2c_client *client, u8 command, u8 *values)
973{
974 union i2c_smbus_data data;
Jean Delvare76560322006-01-18 23:14:55 +0100975
Linus Torvalds1da177e2005-04-16 15:20:36 -0700976 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
977 I2C_SMBUS_READ,command,
978 I2C_SMBUS_I2C_BLOCK_DATA,&data))
979 return -1;
Jean Delvare76560322006-01-18 23:14:55 +0100980
981 memcpy(values, &data.block[1], data.block[0]);
982 return data.block[0];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700983}
984
Jean Delvare21bbd692006-01-09 15:19:18 +1100985s32 i2c_smbus_write_i2c_block_data(struct i2c_client *client, u8 command,
Krzysztof Halasa46f5ed72006-06-12 21:42:20 +0200986 u8 length, const u8 *values)
Jean Delvare21bbd692006-01-09 15:19:18 +1100987{
988 union i2c_smbus_data data;
989
990 if (length > I2C_SMBUS_BLOCK_MAX)
991 length = I2C_SMBUS_BLOCK_MAX;
992 data.block[0] = length;
993 memcpy(data.block + 1, values, length);
994 return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
995 I2C_SMBUS_WRITE, command,
996 I2C_SMBUS_I2C_BLOCK_DATA, &data);
997}
998
Linus Torvalds1da177e2005-04-16 15:20:36 -0700999/* Simulate a SMBus command using the i2c protocol
1000 No checking of parameters is done! */
1001static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr,
1002 unsigned short flags,
1003 char read_write, u8 command, int size,
1004 union i2c_smbus_data * data)
1005{
1006 /* So we need to generate a series of msgs. In the case of writing, we
1007 need to use only one message; when reading, we need two. We initialize
1008 most things with sane defaults, to keep the code below somewhat
1009 simpler. */
Hideki Iwamoto5c50d182005-09-25 17:01:11 +02001010 unsigned char msgbuf0[I2C_SMBUS_BLOCK_MAX+3];
1011 unsigned char msgbuf1[I2C_SMBUS_BLOCK_MAX+2];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001012 int num = read_write == I2C_SMBUS_READ?2:1;
1013 struct i2c_msg msg[2] = { { addr, flags, 1, msgbuf0 },
1014 { addr, flags | I2C_M_RD, 0, msgbuf1 }
1015 };
1016 int i;
Jean Delvare421ef472005-10-26 21:28:55 +02001017 u8 partial_pec = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001018
1019 msgbuf0[0] = command;
1020 switch(size) {
1021 case I2C_SMBUS_QUICK:
1022 msg[0].len = 0;
1023 /* Special case: The read/write field is used as data */
1024 msg[0].flags = flags | (read_write==I2C_SMBUS_READ)?I2C_M_RD:0;
1025 num = 1;
1026 break;
1027 case I2C_SMBUS_BYTE:
1028 if (read_write == I2C_SMBUS_READ) {
1029 /* Special case: only a read! */
1030 msg[0].flags = I2C_M_RD | flags;
1031 num = 1;
1032 }
1033 break;
1034 case I2C_SMBUS_BYTE_DATA:
1035 if (read_write == I2C_SMBUS_READ)
1036 msg[1].len = 1;
1037 else {
1038 msg[0].len = 2;
1039 msgbuf0[1] = data->byte;
1040 }
1041 break;
1042 case I2C_SMBUS_WORD_DATA:
1043 if (read_write == I2C_SMBUS_READ)
1044 msg[1].len = 2;
1045 else {
1046 msg[0].len=3;
1047 msgbuf0[1] = data->word & 0xff;
Jean Delvare7eff82c2006-09-03 22:24:00 +02001048 msgbuf0[2] = data->word >> 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001049 }
1050 break;
1051 case I2C_SMBUS_PROC_CALL:
1052 num = 2; /* Special case */
1053 read_write = I2C_SMBUS_READ;
1054 msg[0].len = 3;
1055 msg[1].len = 2;
1056 msgbuf0[1] = data->word & 0xff;
Jean Delvare7eff82c2006-09-03 22:24:00 +02001057 msgbuf0[2] = data->word >> 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001058 break;
1059 case I2C_SMBUS_BLOCK_DATA:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001060 if (read_write == I2C_SMBUS_READ) {
1061 dev_err(&adapter->dev, "Block read not supported "
1062 "under I2C emulation!\n");
1063 return -1;
1064 } else {
1065 msg[0].len = data->block[0] + 2;
1066 if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 2) {
1067 dev_err(&adapter->dev, "smbus_access called with "
1068 "invalid block write size (%d)\n",
1069 data->block[0]);
1070 return -1;
1071 }
Hideki Iwamoto5c50d182005-09-25 17:01:11 +02001072 for (i = 1; i < msg[0].len; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001073 msgbuf0[i] = data->block[i-1];
1074 }
1075 break;
1076 case I2C_SMBUS_BLOCK_PROC_CALL:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001077 dev_dbg(&adapter->dev, "Block process call not supported "
1078 "under I2C emulation!\n");
1079 return -1;
1080 case I2C_SMBUS_I2C_BLOCK_DATA:
1081 if (read_write == I2C_SMBUS_READ) {
Jean Delvare30dac742005-10-08 00:15:59 +02001082 msg[1].len = I2C_SMBUS_BLOCK_MAX;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001083 } else {
1084 msg[0].len = data->block[0] + 1;
Jean Delvare30dac742005-10-08 00:15:59 +02001085 if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 1) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001086 dev_err(&adapter->dev, "i2c_smbus_xfer_emulated called with "
1087 "invalid block write size (%d)\n",
1088 data->block[0]);
1089 return -1;
1090 }
1091 for (i = 1; i <= data->block[0]; i++)
1092 msgbuf0[i] = data->block[i];
1093 }
1094 break;
1095 default:
1096 dev_err(&adapter->dev, "smbus_access called with invalid size (%d)\n",
1097 size);
1098 return -1;
1099 }
1100
Jean Delvare421ef472005-10-26 21:28:55 +02001101 i = ((flags & I2C_CLIENT_PEC) && size != I2C_SMBUS_QUICK
1102 && size != I2C_SMBUS_I2C_BLOCK_DATA);
1103 if (i) {
1104 /* Compute PEC if first message is a write */
1105 if (!(msg[0].flags & I2C_M_RD)) {
1106 if (num == 1) /* Write only */
1107 i2c_smbus_add_pec(&msg[0]);
1108 else /* Write followed by read */
1109 partial_pec = i2c_smbus_msg_pec(0, &msg[0]);
1110 }
1111 /* Ask for PEC if last message is a read */
1112 if (msg[num-1].flags & I2C_M_RD)
1113 msg[num-1].len++;
1114 }
1115
Linus Torvalds1da177e2005-04-16 15:20:36 -07001116 if (i2c_transfer(adapter, msg, num) < 0)
1117 return -1;
1118
Jean Delvare421ef472005-10-26 21:28:55 +02001119 /* Check PEC if last message is a read */
1120 if (i && (msg[num-1].flags & I2C_M_RD)) {
1121 if (i2c_smbus_check_pec(partial_pec, &msg[num-1]) < 0)
1122 return -1;
1123 }
1124
Linus Torvalds1da177e2005-04-16 15:20:36 -07001125 if (read_write == I2C_SMBUS_READ)
1126 switch(size) {
1127 case I2C_SMBUS_BYTE:
1128 data->byte = msgbuf0[0];
1129 break;
1130 case I2C_SMBUS_BYTE_DATA:
1131 data->byte = msgbuf1[0];
1132 break;
1133 case I2C_SMBUS_WORD_DATA:
1134 case I2C_SMBUS_PROC_CALL:
1135 data->word = msgbuf1[0] | (msgbuf1[1] << 8);
1136 break;
1137 case I2C_SMBUS_I2C_BLOCK_DATA:
1138 /* fixed at 32 for now */
Jean Delvare30dac742005-10-08 00:15:59 +02001139 data->block[0] = I2C_SMBUS_BLOCK_MAX;
1140 for (i = 0; i < I2C_SMBUS_BLOCK_MAX; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001141 data->block[i+1] = msgbuf1[i];
1142 break;
1143 }
1144 return 0;
1145}
1146
1147
1148s32 i2c_smbus_xfer(struct i2c_adapter * adapter, u16 addr, unsigned short flags,
1149 char read_write, u8 command, int size,
1150 union i2c_smbus_data * data)
1151{
1152 s32 res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001153
1154 flags &= I2C_M_TEN | I2C_CLIENT_PEC;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001155
1156 if (adapter->algo->smbus_xfer) {
Ingo Molnar5c085d32006-01-18 23:16:04 +01001157 mutex_lock(&adapter->bus_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001158 res = adapter->algo->smbus_xfer(adapter,addr,flags,read_write,
1159 command,size,data);
Ingo Molnar5c085d32006-01-18 23:16:04 +01001160 mutex_unlock(&adapter->bus_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001161 } else
1162 res = i2c_smbus_xfer_emulated(adapter,addr,flags,read_write,
1163 command,size,data);
1164
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165 return res;
1166}
1167
1168
Jean Delvareefde7232005-07-20 23:03:50 +02001169/* Next four are needed by i2c-isa */
1170EXPORT_SYMBOL_GPL(i2c_adapter_dev_release);
1171EXPORT_SYMBOL_GPL(i2c_adapter_driver);
1172EXPORT_SYMBOL_GPL(i2c_adapter_class);
1173EXPORT_SYMBOL_GPL(i2c_bus_type);
1174
Linus Torvalds1da177e2005-04-16 15:20:36 -07001175EXPORT_SYMBOL(i2c_add_adapter);
1176EXPORT_SYMBOL(i2c_del_adapter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001177EXPORT_SYMBOL(i2c_del_driver);
1178EXPORT_SYMBOL(i2c_attach_client);
1179EXPORT_SYMBOL(i2c_detach_client);
1180EXPORT_SYMBOL(i2c_use_client);
1181EXPORT_SYMBOL(i2c_release_client);
1182EXPORT_SYMBOL(i2c_clients_command);
1183EXPORT_SYMBOL(i2c_check_addr);
1184
1185EXPORT_SYMBOL(i2c_master_send);
1186EXPORT_SYMBOL(i2c_master_recv);
1187EXPORT_SYMBOL(i2c_control);
1188EXPORT_SYMBOL(i2c_transfer);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001189EXPORT_SYMBOL(i2c_get_adapter);
1190EXPORT_SYMBOL(i2c_put_adapter);
1191EXPORT_SYMBOL(i2c_probe);
1192
1193EXPORT_SYMBOL(i2c_smbus_xfer);
1194EXPORT_SYMBOL(i2c_smbus_write_quick);
1195EXPORT_SYMBOL(i2c_smbus_read_byte);
1196EXPORT_SYMBOL(i2c_smbus_write_byte);
1197EXPORT_SYMBOL(i2c_smbus_read_byte_data);
1198EXPORT_SYMBOL(i2c_smbus_write_byte_data);
1199EXPORT_SYMBOL(i2c_smbus_read_word_data);
1200EXPORT_SYMBOL(i2c_smbus_write_word_data);
1201EXPORT_SYMBOL(i2c_smbus_write_block_data);
1202EXPORT_SYMBOL(i2c_smbus_read_i2c_block_data);
Jean Delvare21bbd692006-01-09 15:19:18 +11001203EXPORT_SYMBOL(i2c_smbus_write_i2c_block_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001204
1205MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
1206MODULE_DESCRIPTION("I2C-Bus main module");
1207MODULE_LICENSE("GPL");