blob: fd921ce0b75bf8dbef5466cddd2337162385b7d1 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/* i2c-core.c - a device driver for the iic-bus interface */
2/* ------------------------------------------------------------------------- */
3/* Copyright (C) 1995-99 Simon G. Vogl
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
18/* ------------------------------------------------------------------------- */
19
20/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi>.
21 All SMBus-related things are written by Frodo Looijaard <frodol@dds.nl>
Jean Delvare421ef472005-10-26 21:28:55 +020022 SMBus 2.0 support by Mark Studebaker <mdsxyz123@yahoo.com> and
23 Jean Delvare <khali@linux-fr.org> */
Linus Torvalds1da177e2005-04-16 15:20:36 -070024
Linus Torvalds1da177e2005-04-16 15:20:36 -070025#include <linux/module.h>
26#include <linux/kernel.h>
27#include <linux/errno.h>
28#include <linux/slab.h>
29#include <linux/i2c.h>
30#include <linux/init.h>
31#include <linux/idr.h>
32#include <linux/seq_file.h>
Russell Kingd052d1b2005-10-29 19:07:23 +010033#include <linux/platform_device.h>
Arjan van de Venb3585e42006-01-11 10:50:26 +010034#include <linux/mutex.h>
Jean Delvareb8d6f452007-02-13 22:09:00 +010035#include <linux/completion.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070036#include <asm/uaccess.h>
37
38
39static LIST_HEAD(adapters);
40static LIST_HEAD(drivers);
Arjan van de Venb3585e42006-01-11 10:50:26 +010041static DEFINE_MUTEX(core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -070042static DEFINE_IDR(i2c_adapter_idr);
43
David Brownellf37dd802007-02-13 22:09:00 +010044
45/* ------------------------------------------------------------------------- */
46
Linus Torvalds1da177e2005-04-16 15:20:36 -070047/* match always succeeds, as we want the probe() to tell if we really accept this match */
48static int i2c_device_match(struct device *dev, struct device_driver *drv)
49{
50 return 1;
51}
52
Linus Torvalds1da177e2005-04-16 15:20:36 -070053static int i2c_device_probe(struct device *dev)
54{
55 return -ENODEV;
56}
57
58static int i2c_device_remove(struct device *dev)
59{
60 return 0;
61}
62
David Brownellf37dd802007-02-13 22:09:00 +010063static void i2c_device_shutdown(struct device *dev)
64{
65 struct i2c_driver *driver;
66
67 if (!dev->driver)
68 return;
69 driver = to_i2c_driver(dev->driver);
70 if (driver->shutdown)
71 driver->shutdown(to_i2c_client(dev));
72}
73
74static int i2c_device_suspend(struct device * dev, pm_message_t mesg)
75{
76 struct i2c_driver *driver;
77
78 if (!dev->driver)
79 return 0;
80 driver = to_i2c_driver(dev->driver);
81 if (!driver->suspend)
82 return 0;
83 return driver->suspend(to_i2c_client(dev), mesg);
84}
85
86static int i2c_device_resume(struct device * dev)
87{
88 struct i2c_driver *driver;
89
90 if (!dev->driver)
91 return 0;
92 driver = to_i2c_driver(dev->driver);
93 if (!driver->resume)
94 return 0;
95 return driver->resume(to_i2c_client(dev));
96}
97
Russell Kingb864c7d2006-01-05 14:37:50 +000098struct bus_type i2c_bus_type = {
David Brownellf37dd802007-02-13 22:09:00 +010099 .name = "i2c",
100 .match = i2c_device_match,
101 .probe = i2c_device_probe,
102 .remove = i2c_device_remove,
103 .shutdown = i2c_device_shutdown,
104 .suspend = i2c_device_suspend,
105 .resume = i2c_device_resume,
Russell Kingb864c7d2006-01-05 14:37:50 +0000106};
107
David Brownellf37dd802007-02-13 22:09:00 +0100108/* ------------------------------------------------------------------------- */
109
David Brownell16ffadf2007-05-01 23:26:28 +0200110/* I2C bus adapters -- one roots each I2C or SMBUS segment */
111
Jean Delvareefde7232005-07-20 23:03:50 +0200112void i2c_adapter_dev_release(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700113{
David Brownellef2c83212007-05-01 23:26:28 +0200114 struct i2c_adapter *adap = to_i2c_adapter(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700115 complete(&adap->dev_released);
116}
117
David Brownell16ffadf2007-05-01 23:26:28 +0200118static ssize_t
119show_adapter_name(struct device *dev, struct device_attribute *attr, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700120{
David Brownellef2c83212007-05-01 23:26:28 +0200121 struct i2c_adapter *adap = to_i2c_adapter(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700122 return sprintf(buf, "%s\n", adap->name);
123}
David Brownell16ffadf2007-05-01 23:26:28 +0200124
125static struct device_attribute i2c_adapter_attrs[] = {
126 __ATTR(name, S_IRUGO, show_adapter_name, NULL),
127 { },
128};
129
130struct class i2c_adapter_class = {
131 .owner = THIS_MODULE,
132 .name = "i2c-adapter",
133 .dev_attrs = i2c_adapter_attrs,
134};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700135
136
137static void i2c_client_release(struct device *dev)
138{
139 struct i2c_client *client = to_i2c_client(dev);
140 complete(&client->released);
141}
142
Yani Ioannoue404e272005-05-17 06:42:58 -0400143static ssize_t show_client_name(struct device *dev, struct device_attribute *attr, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700144{
145 struct i2c_client *client = to_i2c_client(dev);
146 return sprintf(buf, "%s\n", client->name);
147}
148
David Brownell438d6c22006-12-10 21:21:31 +0100149/*
Jean Delvare7b77d062006-12-10 21:21:31 +0100150 * We can't use the DEVICE_ATTR() macro here, as we used the same name for
151 * an i2c adapter attribute (above).
Linus Torvalds1da177e2005-04-16 15:20:36 -0700152 */
Jean Delvare7b77d062006-12-10 21:21:31 +0100153static struct device_attribute dev_attr_client_name =
154 __ATTR(name, S_IRUGO, &show_client_name, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700155
156
157/* ---------------------------------------------------
David Brownell438d6c22006-12-10 21:21:31 +0100158 * registering functions
159 * ---------------------------------------------------
Linus Torvalds1da177e2005-04-16 15:20:36 -0700160 */
161
162/* -----
163 * i2c_add_adapter is called from within the algorithm layer,
164 * when a new hw adapter registers. A new device is register to be
165 * available for clients.
166 */
167int i2c_add_adapter(struct i2c_adapter *adap)
168{
169 int id, res = 0;
170 struct list_head *item;
171 struct i2c_driver *driver;
172
Arjan van de Venb3585e42006-01-11 10:50:26 +0100173 mutex_lock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700174
175 if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) == 0) {
176 res = -ENOMEM;
177 goto out_unlock;
178 }
179
Mark M. Hoffmana0920e12005-06-28 00:21:30 -0400180 res = idr_get_new(&i2c_adapter_idr, adap, &id);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700181 if (res < 0) {
182 if (res == -EAGAIN)
183 res = -ENOMEM;
184 goto out_unlock;
185 }
186
187 adap->nr = id & MAX_ID_MASK;
Ingo Molnar5c085d32006-01-18 23:16:04 +0100188 mutex_init(&adap->bus_lock);
189 mutex_init(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190 list_add_tail(&adap->list,&adapters);
191 INIT_LIST_HEAD(&adap->clients);
192
193 /* Add the adapter to the driver core.
194 * If the parent pointer is not set up,
195 * we add this adapter to the host bus.
196 */
David Brownellb119dc32007-01-04 13:07:04 +0100197 if (adap->dev.parent == NULL) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700198 adap->dev.parent = &platform_bus;
Jean Delvarefe2c8d52007-02-13 22:09:04 +0100199 pr_debug("I2C adapter driver [%s] forgot to specify "
200 "physical device\n", adap->name);
David Brownellb119dc32007-01-04 13:07:04 +0100201 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700202 sprintf(adap->dev.bus_id, "i2c-%d", adap->nr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700203 adap->dev.release = &i2c_adapter_dev_release;
Jean Delvarefccb56e2007-05-01 23:26:27 +0200204 adap->dev.class = &i2c_adapter_class;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200205 res = device_register(&adap->dev);
206 if (res)
207 goto out_list;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700208
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200209 dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name);
210
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211 /* inform drivers of new adapters */
212 list_for_each(item,&drivers) {
213 driver = list_entry(item, struct i2c_driver, list);
Jean Delvare8a994752005-11-26 20:28:06 +0100214 if (driver->attach_adapter)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700215 /* We ignore the return code; if it fails, too bad */
216 driver->attach_adapter(adap);
217 }
218
Linus Torvalds1da177e2005-04-16 15:20:36 -0700219out_unlock:
Arjan van de Venb3585e42006-01-11 10:50:26 +0100220 mutex_unlock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700221 return res;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200222
Jean Delvareb119c6c2006-08-15 18:26:30 +0200223out_list:
224 list_del(&adap->list);
225 idr_remove(&i2c_adapter_idr, adap->nr);
226 goto out_unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700227}
228
229
230int i2c_del_adapter(struct i2c_adapter *adap)
231{
232 struct list_head *item, *_n;
233 struct i2c_adapter *adap_from_list;
234 struct i2c_driver *driver;
235 struct i2c_client *client;
236 int res = 0;
237
Arjan van de Venb3585e42006-01-11 10:50:26 +0100238 mutex_lock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700239
240 /* First make sure that this adapter was ever added */
241 list_for_each_entry(adap_from_list, &adapters, list) {
242 if (adap_from_list == adap)
243 break;
244 }
245 if (adap_from_list != adap) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200246 pr_debug("i2c-core: attempting to delete unregistered "
247 "adapter [%s]\n", adap->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700248 res = -EINVAL;
249 goto out_unlock;
250 }
251
252 list_for_each(item,&drivers) {
253 driver = list_entry(item, struct i2c_driver, list);
254 if (driver->detach_adapter)
255 if ((res = driver->detach_adapter(adap))) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200256 dev_err(&adap->dev, "detach_adapter failed "
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100257 "for driver [%s]\n",
258 driver->driver.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700259 goto out_unlock;
260 }
261 }
262
263 /* detach any active clients. This must be done first, because
Tobias Klausera551acc2005-05-19 21:40:38 +0200264 * it can fail; in which case we give up. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700265 list_for_each_safe(item, _n, &adap->clients) {
266 client = list_entry(item, struct i2c_client, list);
267
Linus Torvalds1da177e2005-04-16 15:20:36 -0700268 if ((res=client->driver->detach_client(client))) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200269 dev_err(&adap->dev, "detach_client failed for client "
270 "[%s] at address 0x%02x\n", client->name,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700271 client->addr);
272 goto out_unlock;
273 }
274 }
275
276 /* clean up the sysfs representation */
277 init_completion(&adap->dev_released);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700278 device_unregister(&adap->dev);
279 list_del(&adap->list);
280
281 /* wait for sysfs to drop all references */
282 wait_for_completion(&adap->dev_released);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700283
284 /* free dynamically allocated bus id */
285 idr_remove(&i2c_adapter_idr, adap->nr);
286
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200287 dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700288
289 out_unlock:
Arjan van de Venb3585e42006-01-11 10:50:26 +0100290 mutex_unlock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700291 return res;
292}
293
294
295/* -----
296 * What follows is the "upwards" interface: commands for talking to clients,
297 * which implement the functions to access the physical information of the
298 * chips.
299 */
300
Greg Kroah-Hartmande59cf92005-12-06 15:33:15 -0800301int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700302{
Jean Delvare7eebcb72006-02-05 23:28:21 +0100303 int res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700304
305 /* add the driver to the list of i2c drivers in the driver core */
Greg Kroah-Hartmande59cf92005-12-06 15:33:15 -0800306 driver->driver.owner = owner;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700307 driver->driver.bus = &i2c_bus_type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700308
309 res = driver_register(&driver->driver);
310 if (res)
Jean Delvare7eebcb72006-02-05 23:28:21 +0100311 return res;
David Brownell438d6c22006-12-10 21:21:31 +0100312
Jean Delvare7eebcb72006-02-05 23:28:21 +0100313 mutex_lock(&core_lists);
314
Linus Torvalds1da177e2005-04-16 15:20:36 -0700315 list_add_tail(&driver->list,&drivers);
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100316 pr_debug("i2c-core: driver [%s] registered\n", driver->driver.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700317
318 /* now look for instances of driver on our adapters */
Jean Delvare8a994752005-11-26 20:28:06 +0100319 if (driver->attach_adapter) {
David Brownell4ad4eac2007-05-01 23:26:28 +0200320 struct i2c_adapter *adapter;
321
322 list_for_each_entry(adapter, &adapters, list) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700323 driver->attach_adapter(adapter);
324 }
325 }
326
Arjan van de Venb3585e42006-01-11 10:50:26 +0100327 mutex_unlock(&core_lists);
Jean Delvare7eebcb72006-02-05 23:28:21 +0100328 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700329}
Greg Kroah-Hartmande59cf92005-12-06 15:33:15 -0800330EXPORT_SYMBOL(i2c_register_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700331
332int i2c_del_driver(struct i2c_driver *driver)
333{
334 struct list_head *item1, *item2, *_n;
335 struct i2c_client *client;
336 struct i2c_adapter *adap;
David Brownell438d6c22006-12-10 21:21:31 +0100337
Linus Torvalds1da177e2005-04-16 15:20:36 -0700338 int res = 0;
339
Arjan van de Venb3585e42006-01-11 10:50:26 +0100340 mutex_lock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700341
342 /* Have a look at each adapter, if clients of this driver are still
David Brownell438d6c22006-12-10 21:21:31 +0100343 * attached. If so, detach them to be able to kill the driver
Linus Torvalds1da177e2005-04-16 15:20:36 -0700344 * afterwards.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700345 */
346 list_for_each(item1,&adapters) {
347 adap = list_entry(item1, struct i2c_adapter, list);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700348 if (driver->detach_adapter) {
349 if ((res = driver->detach_adapter(adap))) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200350 dev_err(&adap->dev, "detach_adapter failed "
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100351 "for driver [%s]\n",
352 driver->driver.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700353 goto out_unlock;
354 }
355 } else {
356 list_for_each_safe(item2, _n, &adap->clients) {
357 client = list_entry(item2, struct i2c_client, list);
358 if (client->driver != driver)
359 continue;
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200360 dev_dbg(&adap->dev, "detaching client [%s] "
361 "at 0x%02x\n", client->name,
362 client->addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700363 if ((res = driver->detach_client(client))) {
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200364 dev_err(&adap->dev, "detach_client "
365 "failed for client [%s] at "
366 "0x%02x\n", client->name,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700367 client->addr);
368 goto out_unlock;
369 }
370 }
371 }
372 }
373
374 driver_unregister(&driver->driver);
375 list_del(&driver->list);
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100376 pr_debug("i2c-core: driver [%s] unregistered\n", driver->driver.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700377
378 out_unlock:
Arjan van de Venb3585e42006-01-11 10:50:26 +0100379 mutex_unlock(&core_lists);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700380 return 0;
381}
382
383static int __i2c_check_addr(struct i2c_adapter *adapter, unsigned int addr)
384{
385 struct list_head *item;
386 struct i2c_client *client;
387
388 list_for_each(item,&adapter->clients) {
389 client = list_entry(item, struct i2c_client, list);
390 if (client->addr == addr)
391 return -EBUSY;
392 }
393 return 0;
394}
395
396int i2c_check_addr(struct i2c_adapter *adapter, int addr)
397{
398 int rval;
399
Ingo Molnar5c085d32006-01-18 23:16:04 +0100400 mutex_lock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401 rval = __i2c_check_addr(adapter, addr);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100402 mutex_unlock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700403
404 return rval;
405}
406
407int i2c_attach_client(struct i2c_client *client)
408{
409 struct i2c_adapter *adapter = client->adapter;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200410 int res = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700411
Ingo Molnar5c085d32006-01-18 23:16:04 +0100412 mutex_lock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700413 if (__i2c_check_addr(client->adapter, client->addr)) {
Jean Delvareb119c6c2006-08-15 18:26:30 +0200414 res = -EBUSY;
415 goto out_unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416 }
417 list_add_tail(&client->list,&adapter->clients);
David Brownell438d6c22006-12-10 21:21:31 +0100418
Jean Delvarecde78592005-11-26 21:00:54 +0100419 client->usage_count = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700420
421 client->dev.parent = &client->adapter->dev;
422 client->dev.driver = &client->driver->driver;
423 client->dev.bus = &i2c_bus_type;
424 client->dev.release = &i2c_client_release;
David Brownell438d6c22006-12-10 21:21:31 +0100425
Linus Torvalds1da177e2005-04-16 15:20:36 -0700426 snprintf(&client->dev.bus_id[0], sizeof(client->dev.bus_id),
427 "%d-%04x", i2c_adapter_id(adapter), client->addr);
Jean Delvareb6d7b3d2005-07-31 19:02:53 +0200428 dev_dbg(&adapter->dev, "client [%s] registered with bus id %s\n",
429 client->name, client->dev.bus_id);
Jean Delvareb119c6c2006-08-15 18:26:30 +0200430 res = device_register(&client->dev);
431 if (res)
432 goto out_list;
433 res = device_create_file(&client->dev, &dev_attr_client_name);
434 if (res)
435 goto out_unregister;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200436 mutex_unlock(&adapter->clist_lock);
Jean Delvare77ed74d2006-09-30 17:18:59 +0200437
438 if (adapter->client_register) {
439 if (adapter->client_register(client)) {
440 dev_dbg(&adapter->dev, "client_register "
441 "failed for client [%s] at 0x%02x\n",
442 client->name, client->addr);
443 }
444 }
445
446 return 0;
Jean Delvareb119c6c2006-08-15 18:26:30 +0200447
448out_unregister:
449 init_completion(&client->released); /* Needed? */
450 device_unregister(&client->dev);
451 wait_for_completion(&client->released);
452out_list:
453 list_del(&client->list);
454 dev_err(&adapter->dev, "Failed to attach i2c client %s at 0x%02x "
455 "(%d)\n", client->name, client->addr, res);
Jean Delvare77ed74d2006-09-30 17:18:59 +0200456out_unlock:
457 mutex_unlock(&adapter->clist_lock);
458 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700459}
460
461
462int i2c_detach_client(struct i2c_client *client)
463{
464 struct i2c_adapter *adapter = client->adapter;
465 int res = 0;
David Brownell438d6c22006-12-10 21:21:31 +0100466
Jean Delvarecde78592005-11-26 21:00:54 +0100467 if (client->usage_count > 0) {
Jean Delvare7bef5592005-07-27 22:14:49 +0200468 dev_warn(&client->dev, "Client [%s] still busy, "
469 "can't detach\n", client->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700470 return -EBUSY;
Jean Delvare7bef5592005-07-27 22:14:49 +0200471 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700472
473 if (adapter->client_unregister) {
474 res = adapter->client_unregister(client);
475 if (res) {
476 dev_err(&client->dev,
Jean Delvare86749e82005-07-29 12:15:29 -0700477 "client_unregister [%s] failed, "
478 "client not detached\n", client->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700479 goto out;
480 }
481 }
482
Ingo Molnar5c085d32006-01-18 23:16:04 +0100483 mutex_lock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700484 list_del(&client->list);
485 init_completion(&client->released);
486 device_remove_file(&client->dev, &dev_attr_client_name);
487 device_unregister(&client->dev);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100488 mutex_unlock(&adapter->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700489 wait_for_completion(&client->released);
490
491 out:
492 return res;
493}
494
495static int i2c_inc_use_client(struct i2c_client *client)
496{
497
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100498 if (!try_module_get(client->driver->driver.owner))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700499 return -ENODEV;
500 if (!try_module_get(client->adapter->owner)) {
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100501 module_put(client->driver->driver.owner);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700502 return -ENODEV;
503 }
504
505 return 0;
506}
507
508static void i2c_dec_use_client(struct i2c_client *client)
509{
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100510 module_put(client->driver->driver.owner);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700511 module_put(client->adapter->owner);
512}
513
514int i2c_use_client(struct i2c_client *client)
515{
516 int ret;
517
518 ret = i2c_inc_use_client(client);
519 if (ret)
520 return ret;
521
Jean Delvarecde78592005-11-26 21:00:54 +0100522 client->usage_count++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700523
524 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700525}
526
527int i2c_release_client(struct i2c_client *client)
528{
Jean Delvarecde78592005-11-26 21:00:54 +0100529 if (!client->usage_count) {
530 pr_debug("i2c-core: %s used one too many times\n",
531 __FUNCTION__);
532 return -EPERM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700533 }
David Brownell438d6c22006-12-10 21:21:31 +0100534
Jean Delvarecde78592005-11-26 21:00:54 +0100535 client->usage_count--;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700536 i2c_dec_use_client(client);
David Brownell438d6c22006-12-10 21:21:31 +0100537
Linus Torvalds1da177e2005-04-16 15:20:36 -0700538 return 0;
539}
540
541void i2c_clients_command(struct i2c_adapter *adap, unsigned int cmd, void *arg)
542{
543 struct list_head *item;
544 struct i2c_client *client;
545
Ingo Molnar5c085d32006-01-18 23:16:04 +0100546 mutex_lock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700547 list_for_each(item,&adap->clients) {
548 client = list_entry(item, struct i2c_client, list);
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100549 if (!try_module_get(client->driver->driver.owner))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700550 continue;
551 if (NULL != client->driver->command) {
Ingo Molnar5c085d32006-01-18 23:16:04 +0100552 mutex_unlock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553 client->driver->command(client,cmd,arg);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100554 mutex_lock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700555 }
Laurent Riffard35d8b2e2005-11-26 20:34:05 +0100556 module_put(client->driver->driver.owner);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700557 }
Ingo Molnar5c085d32006-01-18 23:16:04 +0100558 mutex_unlock(&adap->clist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700559}
560
561static int __init i2c_init(void)
562{
563 int retval;
564
565 retval = bus_register(&i2c_bus_type);
566 if (retval)
567 return retval;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700568 return class_register(&i2c_adapter_class);
569}
570
571static void __exit i2c_exit(void)
572{
573 class_unregister(&i2c_adapter_class);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700574 bus_unregister(&i2c_bus_type);
575}
576
577subsys_initcall(i2c_init);
578module_exit(i2c_exit);
579
580/* ----------------------------------------------------
581 * the functional interface to the i2c busses.
582 * ----------------------------------------------------
583 */
584
585int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg *msgs, int num)
586{
587 int ret;
588
589 if (adap->algo->master_xfer) {
590#ifdef DEBUG
591 for (ret = 0; ret < num; ret++) {
592 dev_dbg(&adap->dev, "master_xfer[%d] %c, addr=0x%02x, "
Jean Delvare209d27c2007-05-01 23:26:29 +0200593 "len=%d%s\n", ret, (msgs[ret].flags & I2C_M_RD)
594 ? 'R' : 'W', msgs[ret].addr, msgs[ret].len,
595 (msgs[ret].flags & I2C_M_RECV_LEN) ? "+" : "");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700596 }
597#endif
598
Jiri Kosina6ea23032006-12-10 21:21:30 +0100599 mutex_lock_nested(&adap->bus_lock, adap->level);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700600 ret = adap->algo->master_xfer(adap,msgs,num);
Ingo Molnar5c085d32006-01-18 23:16:04 +0100601 mutex_unlock(&adap->bus_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700602
603 return ret;
604 } else {
605 dev_dbg(&adap->dev, "I2C level transfers not supported\n");
606 return -ENOSYS;
607 }
608}
609
610int i2c_master_send(struct i2c_client *client,const char *buf ,int count)
611{
612 int ret;
613 struct i2c_adapter *adap=client->adapter;
614 struct i2c_msg msg;
615
Jean Delvare815f55f2005-05-07 22:58:46 +0200616 msg.addr = client->addr;
617 msg.flags = client->flags & I2C_M_TEN;
618 msg.len = count;
619 msg.buf = (char *)buf;
David Brownell438d6c22006-12-10 21:21:31 +0100620
Jean Delvare815f55f2005-05-07 22:58:46 +0200621 ret = i2c_transfer(adap, &msg, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700622
Jean Delvare815f55f2005-05-07 22:58:46 +0200623 /* If everything went ok (i.e. 1 msg transmitted), return #bytes
624 transmitted, else error code. */
625 return (ret == 1) ? count : ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700626}
627
628int i2c_master_recv(struct i2c_client *client, char *buf ,int count)
629{
630 struct i2c_adapter *adap=client->adapter;
631 struct i2c_msg msg;
632 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633
Jean Delvare815f55f2005-05-07 22:58:46 +0200634 msg.addr = client->addr;
635 msg.flags = client->flags & I2C_M_TEN;
636 msg.flags |= I2C_M_RD;
637 msg.len = count;
638 msg.buf = buf;
639
640 ret = i2c_transfer(adap, &msg, 1);
641
642 /* If everything went ok (i.e. 1 msg transmitted), return #bytes
643 transmitted, else error code. */
644 return (ret == 1) ? count : ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700645}
646
647
648int i2c_control(struct i2c_client *client,
649 unsigned int cmd, unsigned long arg)
650{
651 int ret = 0;
652 struct i2c_adapter *adap = client->adapter;
653
654 dev_dbg(&client->adapter->dev, "i2c ioctl, cmd: 0x%x, arg: %#lx\n", cmd, arg);
655 switch (cmd) {
656 case I2C_RETRIES:
657 adap->retries = arg;
658 break;
659 case I2C_TIMEOUT:
660 adap->timeout = arg;
661 break;
662 default:
663 if (adap->algo->algo_control!=NULL)
664 ret = adap->algo->algo_control(adap,cmd,arg);
665 }
666 return ret;
667}
668
669/* ----------------------------------------------------
670 * the i2c address scanning function
671 * Will not work for 10-bit addresses!
672 * ----------------------------------------------------
673 */
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200674static int i2c_probe_address(struct i2c_adapter *adapter, int addr, int kind,
675 int (*found_proc) (struct i2c_adapter *, int, int))
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200676{
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200677 int err;
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200678
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200679 /* Make sure the address is valid */
680 if (addr < 0x03 || addr > 0x77) {
681 dev_warn(&adapter->dev, "Invalid probe address 0x%02x\n",
682 addr);
683 return -EINVAL;
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200684 }
685
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200686 /* Skip if already in use */
687 if (i2c_check_addr(adapter, addr))
688 return 0;
689
690 /* Make sure there is something at this address, unless forced */
Jean Delvare4c9337d2005-08-09 20:28:10 +0200691 if (kind < 0) {
692 if (i2c_smbus_xfer(adapter, addr, 0, 0, 0,
693 I2C_SMBUS_QUICK, NULL) < 0)
694 return 0;
695
696 /* prevent 24RF08 corruption */
697 if ((addr & ~0x0f) == 0x50)
698 i2c_smbus_xfer(adapter, addr, 0, 0, 0,
699 I2C_SMBUS_QUICK, NULL);
700 }
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200701
702 /* Finally call the custom detection function */
703 err = found_proc(adapter, addr, kind);
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200704 /* -ENODEV can be returned if there is a chip at the given address
705 but it isn't supported by this chip driver. We catch it here as
706 this isn't an error. */
Jean Delvare114fd182006-09-03 22:25:04 +0200707 if (err == -ENODEV)
708 err = 0;
709
710 if (err)
711 dev_warn(&adapter->dev, "Client creation failed at 0x%x (%d)\n",
712 addr, err);
713 return err;
Jean Delvare9fc6adf2005-07-31 21:20:43 +0200714}
715
Linus Torvalds1da177e2005-04-16 15:20:36 -0700716int i2c_probe(struct i2c_adapter *adapter,
717 struct i2c_client_address_data *address_data,
718 int (*found_proc) (struct i2c_adapter *, int, int))
719{
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200720 int i, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700721 int adap_id = i2c_adapter_id(adapter);
722
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200723 /* Force entries are done first, and are not affected by ignore
724 entries */
725 if (address_data->forces) {
726 unsigned short **forces = address_data->forces;
727 int kind;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700728
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200729 for (kind = 0; forces[kind]; kind++) {
730 for (i = 0; forces[kind][i] != I2C_CLIENT_END;
731 i += 2) {
732 if (forces[kind][i] == adap_id
733 || forces[kind][i] == ANY_I2C_BUS) {
734 dev_dbg(&adapter->dev, "found force "
735 "parameter for adapter %d, "
736 "addr 0x%02x, kind %d\n",
737 adap_id, forces[kind][i + 1],
738 kind);
739 err = i2c_probe_address(adapter,
740 forces[kind][i + 1],
741 kind, found_proc);
742 if (err)
743 return err;
744 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700745 }
746 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747 }
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200748
Jean Delvare4366dc92005-09-25 16:50:06 +0200749 /* Stop here if we can't use SMBUS_QUICK */
750 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_QUICK)) {
751 if (address_data->probe[0] == I2C_CLIENT_END
752 && address_data->normal_i2c[0] == I2C_CLIENT_END)
David Brownell438d6c22006-12-10 21:21:31 +0100753 return 0;
Jean Delvare4366dc92005-09-25 16:50:06 +0200754
755 dev_warn(&adapter->dev, "SMBus Quick command not supported, "
756 "can't probe for chips\n");
757 return -1;
758 }
759
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200760 /* Probe entries are done second, and are not affected by ignore
761 entries either */
762 for (i = 0; address_data->probe[i] != I2C_CLIENT_END; i += 2) {
763 if (address_data->probe[i] == adap_id
764 || address_data->probe[i] == ANY_I2C_BUS) {
765 dev_dbg(&adapter->dev, "found probe parameter for "
766 "adapter %d, addr 0x%02x\n", adap_id,
767 address_data->probe[i + 1]);
768 err = i2c_probe_address(adapter,
769 address_data->probe[i + 1],
770 -1, found_proc);
771 if (err)
772 return err;
773 }
774 }
775
776 /* Normal entries are done last, unless shadowed by an ignore entry */
777 for (i = 0; address_data->normal_i2c[i] != I2C_CLIENT_END; i += 1) {
778 int j, ignore;
779
780 ignore = 0;
781 for (j = 0; address_data->ignore[j] != I2C_CLIENT_END;
782 j += 2) {
783 if ((address_data->ignore[j] == adap_id ||
784 address_data->ignore[j] == ANY_I2C_BUS)
785 && address_data->ignore[j + 1]
786 == address_data->normal_i2c[i]) {
787 dev_dbg(&adapter->dev, "found ignore "
788 "parameter for adapter %d, "
789 "addr 0x%02x\n", adap_id,
790 address_data->ignore[j + 1]);
Mark M. Hoffman2369df92006-07-01 17:01:59 +0200791 ignore = 1;
792 break;
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200793 }
Jean Delvarea89ba0b2005-08-09 20:17:55 +0200794 }
795 if (ignore)
796 continue;
797
798 dev_dbg(&adapter->dev, "found normal entry for adapter %d, "
799 "addr 0x%02x\n", adap_id,
800 address_data->normal_i2c[i]);
801 err = i2c_probe_address(adapter, address_data->normal_i2c[i],
802 -1, found_proc);
803 if (err)
804 return err;
805 }
806
Linus Torvalds1da177e2005-04-16 15:20:36 -0700807 return 0;
808}
809
Linus Torvalds1da177e2005-04-16 15:20:36 -0700810struct i2c_adapter* i2c_get_adapter(int id)
811{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700812 struct i2c_adapter *adapter;
David Brownell438d6c22006-12-10 21:21:31 +0100813
Arjan van de Venb3585e42006-01-11 10:50:26 +0100814 mutex_lock(&core_lists);
Mark M. Hoffmana0920e12005-06-28 00:21:30 -0400815 adapter = (struct i2c_adapter *)idr_find(&i2c_adapter_idr, id);
816 if (adapter && !try_module_get(adapter->owner))
817 adapter = NULL;
818
Arjan van de Venb3585e42006-01-11 10:50:26 +0100819 mutex_unlock(&core_lists);
Mark M. Hoffmana0920e12005-06-28 00:21:30 -0400820 return adapter;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700821}
822
823void i2c_put_adapter(struct i2c_adapter *adap)
824{
825 module_put(adap->owner);
826}
827
828/* The SMBus parts */
829
David Brownell438d6c22006-12-10 21:21:31 +0100830#define POLY (0x1070U << 3)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700831static u8
832crc8(u16 data)
833{
834 int i;
David Brownell438d6c22006-12-10 21:21:31 +0100835
Linus Torvalds1da177e2005-04-16 15:20:36 -0700836 for(i = 0; i < 8; i++) {
David Brownell438d6c22006-12-10 21:21:31 +0100837 if (data & 0x8000)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700838 data = data ^ POLY;
839 data = data << 1;
840 }
841 return (u8)(data >> 8);
842}
843
Jean Delvare421ef472005-10-26 21:28:55 +0200844/* Incremental CRC8 over count bytes in the array pointed to by p */
845static u8 i2c_smbus_pec(u8 crc, u8 *p, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700846{
847 int i;
848
849 for(i = 0; i < count; i++)
Jean Delvare421ef472005-10-26 21:28:55 +0200850 crc = crc8((crc ^ p[i]) << 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700851 return crc;
852}
853
Jean Delvare421ef472005-10-26 21:28:55 +0200854/* Assume a 7-bit address, which is reasonable for SMBus */
855static u8 i2c_smbus_msg_pec(u8 pec, struct i2c_msg *msg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700856{
Jean Delvare421ef472005-10-26 21:28:55 +0200857 /* The address will be sent first */
858 u8 addr = (msg->addr << 1) | !!(msg->flags & I2C_M_RD);
859 pec = i2c_smbus_pec(pec, &addr, 1);
860
861 /* The data buffer follows */
862 return i2c_smbus_pec(pec, msg->buf, msg->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700863}
864
Jean Delvare421ef472005-10-26 21:28:55 +0200865/* Used for write only transactions */
866static inline void i2c_smbus_add_pec(struct i2c_msg *msg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700867{
Jean Delvare421ef472005-10-26 21:28:55 +0200868 msg->buf[msg->len] = i2c_smbus_msg_pec(0, msg);
869 msg->len++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700870}
871
Jean Delvare421ef472005-10-26 21:28:55 +0200872/* Return <0 on CRC error
873 If there was a write before this read (most cases) we need to take the
874 partial CRC from the write part into account.
875 Note that this function does modify the message (we need to decrease the
876 message length to hide the CRC byte from the caller). */
877static int i2c_smbus_check_pec(u8 cpec, struct i2c_msg *msg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700878{
Jean Delvare421ef472005-10-26 21:28:55 +0200879 u8 rpec = msg->buf[--msg->len];
880 cpec = i2c_smbus_msg_pec(cpec, msg);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700881
Linus Torvalds1da177e2005-04-16 15:20:36 -0700882 if (rpec != cpec) {
883 pr_debug("i2c-core: Bad PEC 0x%02x vs. 0x%02x\n",
884 rpec, cpec);
885 return -1;
886 }
David Brownell438d6c22006-12-10 21:21:31 +0100887 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700888}
889
890s32 i2c_smbus_write_quick(struct i2c_client *client, u8 value)
891{
892 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
David Brownell438d6c22006-12-10 21:21:31 +0100893 value,0,I2C_SMBUS_QUICK,NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700894}
895
896s32 i2c_smbus_read_byte(struct i2c_client *client)
897{
898 union i2c_smbus_data data;
899 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
900 I2C_SMBUS_READ,0,I2C_SMBUS_BYTE, &data))
901 return -1;
902 else
Jean Delvare7eff82c2006-09-03 22:24:00 +0200903 return data.byte;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700904}
905
906s32 i2c_smbus_write_byte(struct i2c_client *client, u8 value)
907{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700908 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
Jean Delvare421ef472005-10-26 21:28:55 +0200909 I2C_SMBUS_WRITE, value, I2C_SMBUS_BYTE, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700910}
911
912s32 i2c_smbus_read_byte_data(struct i2c_client *client, u8 command)
913{
914 union i2c_smbus_data data;
915 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
916 I2C_SMBUS_READ,command, I2C_SMBUS_BYTE_DATA,&data))
917 return -1;
918 else
Jean Delvare7eff82c2006-09-03 22:24:00 +0200919 return data.byte;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700920}
921
922s32 i2c_smbus_write_byte_data(struct i2c_client *client, u8 command, u8 value)
923{
924 union i2c_smbus_data data;
925 data.byte = value;
926 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
927 I2C_SMBUS_WRITE,command,
928 I2C_SMBUS_BYTE_DATA,&data);
929}
930
931s32 i2c_smbus_read_word_data(struct i2c_client *client, u8 command)
932{
933 union i2c_smbus_data data;
934 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
935 I2C_SMBUS_READ,command, I2C_SMBUS_WORD_DATA, &data))
936 return -1;
937 else
Jean Delvare7eff82c2006-09-03 22:24:00 +0200938 return data.word;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700939}
940
941s32 i2c_smbus_write_word_data(struct i2c_client *client, u8 command, u16 value)
942{
943 union i2c_smbus_data data;
944 data.word = value;
945 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
946 I2C_SMBUS_WRITE,command,
947 I2C_SMBUS_WORD_DATA,&data);
948}
949
950s32 i2c_smbus_write_block_data(struct i2c_client *client, u8 command,
Krzysztof Halasa46f5ed72006-06-12 21:42:20 +0200951 u8 length, const u8 *values)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700952{
953 union i2c_smbus_data data;
Jean Delvare76560322006-01-18 23:14:55 +0100954
Linus Torvalds1da177e2005-04-16 15:20:36 -0700955 if (length > I2C_SMBUS_BLOCK_MAX)
956 length = I2C_SMBUS_BLOCK_MAX;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700957 data.block[0] = length;
Jean Delvare76560322006-01-18 23:14:55 +0100958 memcpy(&data.block[1], values, length);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700959 return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
960 I2C_SMBUS_WRITE,command,
961 I2C_SMBUS_BLOCK_DATA,&data);
962}
963
964/* Returns the number of read bytes */
965s32 i2c_smbus_read_i2c_block_data(struct i2c_client *client, u8 command, u8 *values)
966{
967 union i2c_smbus_data data;
Jean Delvare76560322006-01-18 23:14:55 +0100968
Linus Torvalds1da177e2005-04-16 15:20:36 -0700969 if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
970 I2C_SMBUS_READ,command,
971 I2C_SMBUS_I2C_BLOCK_DATA,&data))
972 return -1;
Jean Delvare76560322006-01-18 23:14:55 +0100973
974 memcpy(values, &data.block[1], data.block[0]);
975 return data.block[0];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700976}
977
Jean Delvare21bbd692006-01-09 15:19:18 +1100978s32 i2c_smbus_write_i2c_block_data(struct i2c_client *client, u8 command,
Krzysztof Halasa46f5ed72006-06-12 21:42:20 +0200979 u8 length, const u8 *values)
Jean Delvare21bbd692006-01-09 15:19:18 +1100980{
981 union i2c_smbus_data data;
982
983 if (length > I2C_SMBUS_BLOCK_MAX)
984 length = I2C_SMBUS_BLOCK_MAX;
985 data.block[0] = length;
986 memcpy(data.block + 1, values, length);
987 return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
988 I2C_SMBUS_WRITE, command,
989 I2C_SMBUS_I2C_BLOCK_DATA, &data);
990}
991
David Brownell438d6c22006-12-10 21:21:31 +0100992/* Simulate a SMBus command using the i2c protocol
Linus Torvalds1da177e2005-04-16 15:20:36 -0700993 No checking of parameters is done! */
David Brownell438d6c22006-12-10 21:21:31 +0100994static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700995 unsigned short flags,
David Brownell438d6c22006-12-10 21:21:31 +0100996 char read_write, u8 command, int size,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700997 union i2c_smbus_data * data)
998{
999 /* So we need to generate a series of msgs. In the case of writing, we
1000 need to use only one message; when reading, we need two. We initialize
1001 most things with sane defaults, to keep the code below somewhat
1002 simpler. */
Hideki Iwamoto5c50d182005-09-25 17:01:11 +02001003 unsigned char msgbuf0[I2C_SMBUS_BLOCK_MAX+3];
1004 unsigned char msgbuf1[I2C_SMBUS_BLOCK_MAX+2];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001005 int num = read_write == I2C_SMBUS_READ?2:1;
David Brownell438d6c22006-12-10 21:21:31 +01001006 struct i2c_msg msg[2] = { { addr, flags, 1, msgbuf0 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07001007 { addr, flags | I2C_M_RD, 0, msgbuf1 }
1008 };
1009 int i;
Jean Delvare421ef472005-10-26 21:28:55 +02001010 u8 partial_pec = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001011
1012 msgbuf0[0] = command;
1013 switch(size) {
1014 case I2C_SMBUS_QUICK:
1015 msg[0].len = 0;
1016 /* Special case: The read/write field is used as data */
1017 msg[0].flags = flags | (read_write==I2C_SMBUS_READ)?I2C_M_RD:0;
1018 num = 1;
1019 break;
1020 case I2C_SMBUS_BYTE:
1021 if (read_write == I2C_SMBUS_READ) {
1022 /* Special case: only a read! */
1023 msg[0].flags = I2C_M_RD | flags;
1024 num = 1;
1025 }
1026 break;
1027 case I2C_SMBUS_BYTE_DATA:
1028 if (read_write == I2C_SMBUS_READ)
1029 msg[1].len = 1;
1030 else {
1031 msg[0].len = 2;
1032 msgbuf0[1] = data->byte;
1033 }
1034 break;
1035 case I2C_SMBUS_WORD_DATA:
1036 if (read_write == I2C_SMBUS_READ)
1037 msg[1].len = 2;
1038 else {
1039 msg[0].len=3;
1040 msgbuf0[1] = data->word & 0xff;
Jean Delvare7eff82c2006-09-03 22:24:00 +02001041 msgbuf0[2] = data->word >> 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001042 }
1043 break;
1044 case I2C_SMBUS_PROC_CALL:
1045 num = 2; /* Special case */
1046 read_write = I2C_SMBUS_READ;
1047 msg[0].len = 3;
1048 msg[1].len = 2;
1049 msgbuf0[1] = data->word & 0xff;
Jean Delvare7eff82c2006-09-03 22:24:00 +02001050 msgbuf0[2] = data->word >> 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001051 break;
1052 case I2C_SMBUS_BLOCK_DATA:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001053 if (read_write == I2C_SMBUS_READ) {
Jean Delvare209d27c2007-05-01 23:26:29 +02001054 msg[1].flags |= I2C_M_RECV_LEN;
1055 msg[1].len = 1; /* block length will be added by
1056 the underlying bus driver */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001057 } else {
1058 msg[0].len = data->block[0] + 2;
1059 if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 2) {
1060 dev_err(&adapter->dev, "smbus_access called with "
1061 "invalid block write size (%d)\n",
1062 data->block[0]);
1063 return -1;
1064 }
Hideki Iwamoto5c50d182005-09-25 17:01:11 +02001065 for (i = 1; i < msg[0].len; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001066 msgbuf0[i] = data->block[i-1];
1067 }
1068 break;
1069 case I2C_SMBUS_BLOCK_PROC_CALL:
Jean Delvare209d27c2007-05-01 23:26:29 +02001070 num = 2; /* Another special case */
1071 read_write = I2C_SMBUS_READ;
1072 if (data->block[0] > I2C_SMBUS_BLOCK_MAX) {
1073 dev_err(&adapter->dev, "%s called with invalid "
1074 "block proc call size (%d)\n", __FUNCTION__,
1075 data->block[0]);
1076 return -1;
1077 }
1078 msg[0].len = data->block[0] + 2;
1079 for (i = 1; i < msg[0].len; i++)
1080 msgbuf0[i] = data->block[i-1];
1081 msg[1].flags |= I2C_M_RECV_LEN;
1082 msg[1].len = 1; /* block length will be added by
1083 the underlying bus driver */
1084 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001085 case I2C_SMBUS_I2C_BLOCK_DATA:
1086 if (read_write == I2C_SMBUS_READ) {
Jean Delvare30dac742005-10-08 00:15:59 +02001087 msg[1].len = I2C_SMBUS_BLOCK_MAX;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001088 } else {
1089 msg[0].len = data->block[0] + 1;
Jean Delvare30dac742005-10-08 00:15:59 +02001090 if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 1) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001091 dev_err(&adapter->dev, "i2c_smbus_xfer_emulated called with "
1092 "invalid block write size (%d)\n",
1093 data->block[0]);
1094 return -1;
1095 }
1096 for (i = 1; i <= data->block[0]; i++)
1097 msgbuf0[i] = data->block[i];
1098 }
1099 break;
1100 default:
1101 dev_err(&adapter->dev, "smbus_access called with invalid size (%d)\n",
1102 size);
1103 return -1;
1104 }
1105
Jean Delvare421ef472005-10-26 21:28:55 +02001106 i = ((flags & I2C_CLIENT_PEC) && size != I2C_SMBUS_QUICK
1107 && size != I2C_SMBUS_I2C_BLOCK_DATA);
1108 if (i) {
1109 /* Compute PEC if first message is a write */
1110 if (!(msg[0].flags & I2C_M_RD)) {
David Brownell438d6c22006-12-10 21:21:31 +01001111 if (num == 1) /* Write only */
Jean Delvare421ef472005-10-26 21:28:55 +02001112 i2c_smbus_add_pec(&msg[0]);
1113 else /* Write followed by read */
1114 partial_pec = i2c_smbus_msg_pec(0, &msg[0]);
1115 }
1116 /* Ask for PEC if last message is a read */
1117 if (msg[num-1].flags & I2C_M_RD)
David Brownell438d6c22006-12-10 21:21:31 +01001118 msg[num-1].len++;
Jean Delvare421ef472005-10-26 21:28:55 +02001119 }
1120
Linus Torvalds1da177e2005-04-16 15:20:36 -07001121 if (i2c_transfer(adapter, msg, num) < 0)
1122 return -1;
1123
Jean Delvare421ef472005-10-26 21:28:55 +02001124 /* Check PEC if last message is a read */
1125 if (i && (msg[num-1].flags & I2C_M_RD)) {
1126 if (i2c_smbus_check_pec(partial_pec, &msg[num-1]) < 0)
1127 return -1;
1128 }
1129
Linus Torvalds1da177e2005-04-16 15:20:36 -07001130 if (read_write == I2C_SMBUS_READ)
1131 switch(size) {
1132 case I2C_SMBUS_BYTE:
1133 data->byte = msgbuf0[0];
1134 break;
1135 case I2C_SMBUS_BYTE_DATA:
1136 data->byte = msgbuf1[0];
1137 break;
David Brownell438d6c22006-12-10 21:21:31 +01001138 case I2C_SMBUS_WORD_DATA:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001139 case I2C_SMBUS_PROC_CALL:
1140 data->word = msgbuf1[0] | (msgbuf1[1] << 8);
1141 break;
1142 case I2C_SMBUS_I2C_BLOCK_DATA:
1143 /* fixed at 32 for now */
Jean Delvare30dac742005-10-08 00:15:59 +02001144 data->block[0] = I2C_SMBUS_BLOCK_MAX;
1145 for (i = 0; i < I2C_SMBUS_BLOCK_MAX; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001146 data->block[i+1] = msgbuf1[i];
1147 break;
Jean Delvare209d27c2007-05-01 23:26:29 +02001148 case I2C_SMBUS_BLOCK_DATA:
1149 case I2C_SMBUS_BLOCK_PROC_CALL:
1150 for (i = 0; i < msgbuf1[0] + 1; i++)
1151 data->block[i] = msgbuf1[i];
1152 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001153 }
1154 return 0;
1155}
1156
1157
1158s32 i2c_smbus_xfer(struct i2c_adapter * adapter, u16 addr, unsigned short flags,
David Brownell438d6c22006-12-10 21:21:31 +01001159 char read_write, u8 command, int size,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160 union i2c_smbus_data * data)
1161{
1162 s32 res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163
1164 flags &= I2C_M_TEN | I2C_CLIENT_PEC;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165
1166 if (adapter->algo->smbus_xfer) {
Ingo Molnar5c085d32006-01-18 23:16:04 +01001167 mutex_lock(&adapter->bus_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001168 res = adapter->algo->smbus_xfer(adapter,addr,flags,read_write,
1169 command,size,data);
Ingo Molnar5c085d32006-01-18 23:16:04 +01001170 mutex_unlock(&adapter->bus_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001171 } else
1172 res = i2c_smbus_xfer_emulated(adapter,addr,flags,read_write,
1173 command,size,data);
1174
Linus Torvalds1da177e2005-04-16 15:20:36 -07001175 return res;
1176}
1177
1178
Jean Delvareb31366f2007-05-01 23:26:28 +02001179/* Next three are needed by i2c-isa */
Jean Delvareefde7232005-07-20 23:03:50 +02001180EXPORT_SYMBOL_GPL(i2c_adapter_dev_release);
Jean Delvareefde7232005-07-20 23:03:50 +02001181EXPORT_SYMBOL_GPL(i2c_adapter_class);
1182EXPORT_SYMBOL_GPL(i2c_bus_type);
1183
Linus Torvalds1da177e2005-04-16 15:20:36 -07001184EXPORT_SYMBOL(i2c_add_adapter);
1185EXPORT_SYMBOL(i2c_del_adapter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001186EXPORT_SYMBOL(i2c_del_driver);
1187EXPORT_SYMBOL(i2c_attach_client);
1188EXPORT_SYMBOL(i2c_detach_client);
1189EXPORT_SYMBOL(i2c_use_client);
1190EXPORT_SYMBOL(i2c_release_client);
1191EXPORT_SYMBOL(i2c_clients_command);
1192EXPORT_SYMBOL(i2c_check_addr);
1193
1194EXPORT_SYMBOL(i2c_master_send);
1195EXPORT_SYMBOL(i2c_master_recv);
1196EXPORT_SYMBOL(i2c_control);
1197EXPORT_SYMBOL(i2c_transfer);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001198EXPORT_SYMBOL(i2c_get_adapter);
1199EXPORT_SYMBOL(i2c_put_adapter);
1200EXPORT_SYMBOL(i2c_probe);
1201
1202EXPORT_SYMBOL(i2c_smbus_xfer);
1203EXPORT_SYMBOL(i2c_smbus_write_quick);
1204EXPORT_SYMBOL(i2c_smbus_read_byte);
1205EXPORT_SYMBOL(i2c_smbus_write_byte);
1206EXPORT_SYMBOL(i2c_smbus_read_byte_data);
1207EXPORT_SYMBOL(i2c_smbus_write_byte_data);
1208EXPORT_SYMBOL(i2c_smbus_read_word_data);
1209EXPORT_SYMBOL(i2c_smbus_write_word_data);
1210EXPORT_SYMBOL(i2c_smbus_write_block_data);
1211EXPORT_SYMBOL(i2c_smbus_read_i2c_block_data);
Jean Delvare21bbd692006-01-09 15:19:18 +11001212EXPORT_SYMBOL(i2c_smbus_write_i2c_block_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001213
1214MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
1215MODULE_DESCRIPTION("I2C-Bus main module");
1216MODULE_LICENSE("GPL");