1 /* 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
16 /* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi>.
17 All SMBus-related things are written by Frodo Looijaard <frodol@dds.nl>
18 SMBus 2.0 support by Mark Studebaker <mdsxyz123@yahoo.com> and
19 Jean Delvare <jdelvare@suse.de>
20 Mux support by Rodolfo Giometti <giometti@enneenne.com> and
21 Michael Lawnick <michael.lawnick.ext@nsn.com>
22 */
23 /* NOTE: This code derives from i2c-core.c in Linux */
24
25 #include <linux/i2c.h>
26 #include <linux/i2c-mux.h>
27 #include <linux/idr.h>
28
29 static DEFINE_IDR(i2c_adapter_idr);
30 static TAILQ_HEAD(, i2c_driver) i2c_driver_head = TAILQ_HEAD_INITIALIZER(i2c_driver_head);
31
32 struct device_type i2c_adapter_type;
33 struct device_type i2c_client_type;
34
35 #define I2C_ADDR_OFFSET_TEN_BIT 0xa000
36 #define I2C_ADDR_OFFSET_SLAVE 0x1000
37
38 int
i2c_transfer(struct i2c_adapter * adap,struct i2c_msg * msgs,int num)39 i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
40 {
41 unsigned long end_jiffies;
42 int ret;
43 int try;
44
45 if (adap->algo->master_xfer == NULL)
46 return (-EOPNOTSUPP);
47
48 i2c_lock_bus(adap, I2C_LOCK_SEGMENT);
49 end_jiffies = jiffies + adap->timeout;
50 for (ret = 0, try = 0; try <= adap->retries; try++) {
51 ret = adap->algo->master_xfer(adap, msgs, num);
52 if (ret != -EAGAIN)
53 break;
54 if (time_after(jiffies, end_jiffies))
55 break;
56 }
57 i2c_unlock_bus(adap, I2C_LOCK_SEGMENT);
58
59 return (ret);
60 }
61
62 int
__i2c_transfer(struct i2c_adapter * adap,struct i2c_msg * msgs,int num)63 __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
64 {
65 unsigned long end_jiffies;
66 int ret;
67 int try;
68
69 end_jiffies = jiffies + adap->timeout;
70 for (ret = 0, try = 0; try <= adap->retries; try++) {
71 ret = adap->algo->master_xfer(adap, msgs, num);
72 if (ret != -EAGAIN)
73 break;
74 if (time_after(jiffies, end_jiffies))
75 break;
76 }
77 return (ret);
78 }
79
80 int
i2c_register_driver(struct module * mod,struct i2c_driver * drv)81 i2c_register_driver(struct module *mod, struct i2c_driver *drv)
82 {
83 TAILQ_INSERT_TAIL(&i2c_driver_head, drv, entry);
84 return (0);
85 }
86
87 void
i2c_del_driver(struct i2c_driver * drv)88 i2c_del_driver(struct i2c_driver *drv)
89 {
90 TAILQ_REMOVE(&i2c_driver_head, drv, entry);
91 }
92
93 static void
i2c_adapter_lock_bus(struct i2c_adapter * adapter,unsigned int flags)94 i2c_adapter_lock_bus(struct i2c_adapter *adapter,
95 unsigned int flags)
96 {
97 rt_mutex_lock(&adapter->bus_lock);
98 }
99
100 static int
i2c_adapter_trylock_bus(struct i2c_adapter * adapter,unsigned int flags)101 i2c_adapter_trylock_bus(struct i2c_adapter *adapter,
102 unsigned int flags)
103 {
104 return rt_mutex_trylock(&adapter->bus_lock);
105 }
106
107 static void
i2c_adapter_unlock_bus(struct i2c_adapter * adapter,unsigned int flags)108 i2c_adapter_unlock_bus(struct i2c_adapter *adapter,
109 unsigned int flags)
110 {
111 rt_mutex_unlock(&adapter->bus_lock);
112 }
113
114
115 static int
i2c_register_adapter(struct i2c_adapter * adap)116 i2c_register_adapter(struct i2c_adapter *adap)
117 {
118 if (!adap->lock_bus) {
119 adap->lock_bus = i2c_adapter_lock_bus;
120 adap->trylock_bus = i2c_adapter_trylock_bus;
121 adap->unlock_bus = i2c_adapter_unlock_bus;
122 }
123 rt_mutex_init(&adap->bus_lock);
124 rt_mutex_init(&adap->mux_lock);
125
126 if (adap->timeout == 0)
127 adap->timeout = HZ;
128
129 dev_set_name(&adap->dev, "i2c-%d", adap->nr);
130 adap->dev.type = &i2c_adapter_type;
131
132 return (device_register(&adap->dev));
133 }
134
135 static int
i2c_add_numbered_adapter_sub(struct i2c_adapter * adap)136 i2c_add_numbered_adapter_sub(struct i2c_adapter *adap)
137 {
138 int id;
139
140 atomic_lock();
141 id = idr_alloc(&i2c_adapter_idr, adap, adap->nr, adap->nr + 1,
142 GFP_KERNEL);
143 atomic_unlock();
144 if (id < 0)
145 return ((id == -ENOSPC) ? -EBUSY : id);
146
147 return (i2c_register_adapter(adap));
148 }
149
150 int
i2c_add_numbered_adapter(struct i2c_adapter * adap)151 i2c_add_numbered_adapter(struct i2c_adapter *adap)
152 {
153 if (adap->nr == -1) /* -1 means dynamically assign bus id */
154 return (i2c_add_adapter(adap));
155
156 return (i2c_add_numbered_adapter_sub(adap));
157 }
158
159 int
i2c_add_adapter(struct i2c_adapter * adapter)160 i2c_add_adapter(struct i2c_adapter *adapter)
161 {
162 int id;
163
164 atomic_lock();
165 id = idr_alloc(&i2c_adapter_idr, adapter, 128, 0, GFP_KERNEL);
166 atomic_unlock();
167
168 if (id < 0)
169 return (id);
170
171 adapter->nr = id;
172
173 return (i2c_register_adapter(adapter));
174 }
175
176 void
i2c_del_adapter(struct i2c_adapter * adapter)177 i2c_del_adapter(struct i2c_adapter *adapter)
178 {
179
180 }
181
182 struct i2c_client *
i2c_new_dummy_device(struct i2c_adapter * adapter,u16 address)183 i2c_new_dummy_device(struct i2c_adapter *adapter, u16 address)
184 {
185 struct i2c_board_info info = {
186 I2C_BOARD_INFO("dummy", address),
187 };
188 return (i2c_new_device(adapter, &info));
189 }
190
191 struct i2c_client *
i2c_new_device(struct i2c_adapter * adapt,struct i2c_board_info const * info)192 i2c_new_device(struct i2c_adapter *adapt, struct i2c_board_info const *info)
193 {
194 struct i2c_client *client;
195 struct i2c_driver *drv;
196 int status = -1;
197
198 client = kzalloc(sizeof(*client), GFP_KERNEL);
199 if (client == NULL)
200 return (NULL);
201
202 client->adapter = adapt;
203
204 client->dev.platform_data = info->platform_data;
205
206 client->flags = info->flags;
207 client->addr = info->addr;
208 client->irq = info->irq;
209
210 strlcpy(client->name, info->type, sizeof(client->name));
211
212 client->dev.parent = &client->adapter->dev;
213 client->dev.type = &i2c_client_type;
214
215 /* For 10-bit clients, add an arbitrary offset to avoid collisions */
216 dev_set_name(&client->dev, "%d-%04x", i2c_adapter_id(adapt),
217 client->addr | ((client->flags & I2C_CLIENT_TEN)
218 ? 0xa000 : 0));
219
220 TAILQ_FOREACH(drv, &i2c_driver_head, entry) {
221 uint32_t i;
222
223 for (i = 0; drv->id_table != NULL &&
224 drv->id_table[i].name[0] != 0; i++) {
225 if (strcmp(drv->id_table[i].name, client->name) != 0)
226 continue;
227 client->dev.driver = &drv->driver;
228
229 if (drv->probe == NULL && drv->probe_new == NULL) {
230 status = 0;
231 break;
232 }
233 if (drv->probe_new != NULL)
234 status = drv->probe_new(client);
235 else
236 status = drv->probe(client, drv->id_table + i);
237 if (status == 0)
238 break;
239 client->dev.driver = NULL;
240 }
241 }
242 if (status != 0) {
243 kfree(client);
244 return (NULL);
245 }
246 return (client);
247 }
248
249 /*
250 * Dummy I2C driver support
251 */
252
253 static const struct i2c_device_id i2c_dummy_id[] = {
254 { "dummy", 0 },
255 { },
256 };
257
258 static int
i2c_dummy_probe(struct i2c_client * client,const struct i2c_device_id * id)259 i2c_dummy_probe(struct i2c_client *client, const struct i2c_device_id *id)
260 {
261 return (0);
262 }
263
264 static int
i2c_dummy_remove(struct i2c_client * client)265 i2c_dummy_remove(struct i2c_client *client)
266 {
267 return (0);
268 }
269
270 static struct i2c_driver i2c_dummy_driver = {
271 .driver.name = "dummy",
272 .probe = i2c_dummy_probe,
273 .remove = i2c_dummy_remove,
274 .id_table = i2c_dummy_id,
275 };
276
277 static void
i2c_dummy_init(void)278 i2c_dummy_init(void)
279 {
280 i2c_register_driver(NULL, &i2c_dummy_driver);
281 }
282 module_init(i2c_dummy_init);
283
284 struct i2c_client *
i2c_new_dummy(struct i2c_adapter * adapter,u16 address)285 i2c_new_dummy(struct i2c_adapter *adapter, u16 address)
286 {
287 struct i2c_board_info info = {
288 I2C_BOARD_INFO("dummy", address),
289 };
290
291 return (i2c_new_device(adapter, &info));
292 }
293
294 struct i2c_client *
i2c_new_probed_device(struct i2c_adapter * adapt,struct i2c_board_info * info,unsigned short const * addr_list,int (* probe)(struct i2c_adapter *,unsigned short addr))295 i2c_new_probed_device(struct i2c_adapter *adapt,
296 struct i2c_board_info *info,
297 unsigned short const *addr_list,
298 int (*probe) (struct i2c_adapter *, unsigned short addr))
299 {
300 unsigned i;
301
302 if (probe == NULL)
303 i = 0;
304 else
305 for (i = 0; addr_list[i] != I2C_CLIENT_END; i++) {
306 if (probe(adapt, addr_list[i]))
307 break;
308 }
309 if (addr_list[i] == I2C_CLIENT_END)
310 return (NULL);
311
312 info->addr = addr_list[i];
313
314 return (i2c_new_device(adapt, info));
315 }
316
317 void
i2c_unregister_device(struct i2c_client * client)318 i2c_unregister_device(struct i2c_client *client)
319 {
320 struct i2c_driver *driver;
321
322 if (client == NULL || client->dev.driver == NULL)
323 return;
324
325 driver = to_i2c_driver(client->dev.driver);
326 if (driver->remove != NULL)
327 driver->remove(client);
328
329 kfree(client);
330 }
331
332 int
i2c_master_send(const struct i2c_client * client,const char * buf,int count)333 i2c_master_send(const struct i2c_client *client, const char *buf, int count)
334 {
335 int ret;
336 struct i2c_adapter *adap = client->adapter;
337 struct i2c_msg msg;
338
339 msg.addr = client->addr;
340 msg.flags = client->flags & I2C_M_TEN;
341 msg.len = count;
342 msg.buf = (char *)buf;
343
344 ret = i2c_transfer(adap, &msg, 1);
345
346 return ((ret == 1) ? count : ret);
347 }
348
349 int
i2c_master_recv(const struct i2c_client * client,char * buf,int count)350 i2c_master_recv(const struct i2c_client *client, char *buf, int count)
351 {
352 struct i2c_adapter *adap = client->adapter;
353 struct i2c_msg msg;
354 int ret;
355
356 msg.addr = client->addr;
357 msg.flags = client->flags & I2C_M_TEN;
358 msg.flags |= I2C_M_RD;
359 msg.len = count;
360 msg.buf = buf;
361
362 ret = i2c_transfer(adap, &msg, 1);
363
364 return ((ret == 1) ? count : ret);
365 }
366
367 void
i2c_clients_command(struct i2c_adapter * adap,unsigned int cmd,void * arg)368 i2c_clients_command(struct i2c_adapter *adap, unsigned int cmd, void *arg)
369 {
370 printf("WARNING: i2c_clients_command() is not implemented\n");
371 }
372
373 #define POLY (0x1070U << 3)
374
375 static u8
crc8(u16 data)376 crc8(u16 data)
377 {
378 int i;
379
380 for (i = 0; i < 8; i++) {
381 if (data & 0x8000)
382 data = data ^ POLY;
383 data = data << 1;
384 }
385 return (u8) (data >> 8);
386 }
387
388 static u8
i2c_smbus_pec(u8 crc,u8 * p,size_t count)389 i2c_smbus_pec(u8 crc, u8 * p, size_t count)
390 {
391 int i;
392
393 for (i = 0; i < count; i++)
394 crc = crc8((crc ^ p[i]) << 8);
395 return crc;
396 }
397
398 static u8
i2c_smbus_msg_pec(u8 pec,struct i2c_msg * msg)399 i2c_smbus_msg_pec(u8 pec, struct i2c_msg *msg)
400 {
401 u8 addr = i2c_8bit_addr_from_msg(msg);
402
403 pec = i2c_smbus_pec(pec, &addr, 1);
404
405 return i2c_smbus_pec(pec, msg->buf, msg->len);
406 }
407
408 static inline void
i2c_smbus_add_pec(struct i2c_msg * msg)409 i2c_smbus_add_pec(struct i2c_msg *msg)
410 {
411 msg->buf[msg->len] = i2c_smbus_msg_pec(0, msg);
412 msg->len++;
413 }
414
415 static int
i2c_smbus_check_pec(u8 cpec,struct i2c_msg * msg)416 i2c_smbus_check_pec(u8 cpec, struct i2c_msg *msg)
417 {
418 u8 rpec = msg->buf[--msg->len];
419
420 cpec = i2c_smbus_msg_pec(cpec, msg);
421
422 if (rpec != cpec) {
423 pr_debug("i2c-core: Bad PEC 0x%02x vs. 0x%02x\n",
424 rpec, cpec);
425 return -EBADMSG;
426 }
427 return 0;
428 }
429
430 int
i2c_smbus_read_byte(const struct i2c_client * client)431 i2c_smbus_read_byte(const struct i2c_client *client)
432 {
433 union i2c_smbus_data data;
434 int status;
435
436 status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
437 I2C_SMBUS_READ, 0,
438 I2C_SMBUS_BYTE, &data);
439 return (status < 0) ? status : data.byte;
440 }
441
442 int
i2c_smbus_write_byte(const struct i2c_client * client,u8 value)443 i2c_smbus_write_byte(const struct i2c_client *client, u8 value)
444 {
445 return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
446 I2C_SMBUS_WRITE, value, I2C_SMBUS_BYTE, NULL);
447 }
448
449 int
i2c_smbus_read_byte_data(const struct i2c_client * client,u8 command)450 i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command)
451 {
452 union i2c_smbus_data data;
453 int status;
454
455 status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
456 I2C_SMBUS_READ, command,
457 I2C_SMBUS_BYTE_DATA, &data);
458 return (status < 0) ? status : data.byte;
459 }
460
461 int
i2c_smbus_write_byte_data(const struct i2c_client * client,u8 command,u8 value)462 i2c_smbus_write_byte_data(const struct i2c_client *client, u8 command,
463 u8 value)
464 {
465 union i2c_smbus_data data;
466
467 data.byte = value;
468 return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
469 I2C_SMBUS_WRITE, command,
470 I2C_SMBUS_BYTE_DATA, &data);
471 }
472
473 int
i2c_smbus_read_word_data(const struct i2c_client * client,u8 command)474 i2c_smbus_read_word_data(const struct i2c_client *client, u8 command)
475 {
476 union i2c_smbus_data data;
477 int status;
478
479 status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
480 I2C_SMBUS_READ, command,
481 I2C_SMBUS_WORD_DATA, &data);
482 return (status < 0) ? status : data.word;
483 }
484
485 int
i2c_smbus_write_word_data(const struct i2c_client * client,u8 command,u16 value)486 i2c_smbus_write_word_data(const struct i2c_client *client, u8 command,
487 u16 value)
488 {
489 union i2c_smbus_data data;
490
491 data.word = value;
492 return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
493 I2C_SMBUS_WRITE, command,
494 I2C_SMBUS_WORD_DATA, &data);
495 }
496
497 int
i2c_smbus_process_call(const struct i2c_client * client,u8 command,u16 value)498 i2c_smbus_process_call(const struct i2c_client *client, u8 command,
499 u16 value)
500 {
501 union i2c_smbus_data data;
502 int status;
503
504 data.word = value;
505
506 status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
507 I2C_SMBUS_WRITE, command,
508 I2C_SMBUS_PROC_CALL, &data);
509 return (status < 0) ? status : data.word;
510 }
511
512 int
i2c_smbus_read_block_data(const struct i2c_client * client,u8 command,u8 * values)513 i2c_smbus_read_block_data(const struct i2c_client *client, u8 command,
514 u8 * values)
515 {
516 union i2c_smbus_data data;
517 int status;
518
519 status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
520 I2C_SMBUS_READ, command,
521 I2C_SMBUS_BLOCK_DATA, &data);
522 if (status)
523 return status;
524
525 memcpy(values, &data.block[1], data.block[0]);
526 return data.block[0];
527 }
528
529 int
i2c_smbus_write_block_data(const struct i2c_client * client,u8 command,u8 length,const u8 * values)530 i2c_smbus_write_block_data(const struct i2c_client *client, u8 command,
531 u8 length, const u8 * values)
532 {
533 union i2c_smbus_data data;
534
535 if (length > I2C_SMBUS_BLOCK_MAX)
536 length = I2C_SMBUS_BLOCK_MAX;
537 data.block[0] = length;
538 memcpy(&data.block[1], values, length);
539 return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
540 I2C_SMBUS_WRITE, command,
541 I2C_SMBUS_BLOCK_DATA, &data);
542 }
543
544 int
i2c_smbus_read_i2c_block_data(const struct i2c_client * client,u8 command,u8 length,u8 * values)545 i2c_smbus_read_i2c_block_data(const struct i2c_client *client, u8 command,
546 u8 length, u8 * values)
547 {
548 union i2c_smbus_data data;
549 int status;
550
551 if (length > I2C_SMBUS_BLOCK_MAX)
552 length = I2C_SMBUS_BLOCK_MAX;
553 data.block[0] = length;
554 status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
555 I2C_SMBUS_READ, command,
556 I2C_SMBUS_I2C_BLOCK_DATA, &data);
557 if (status < 0)
558 return status;
559
560 memcpy(values, &data.block[1], data.block[0]);
561 return data.block[0];
562 }
563
564 int
i2c_smbus_write_i2c_block_data(const struct i2c_client * client,u8 command,u8 length,const u8 * values)565 i2c_smbus_write_i2c_block_data(const struct i2c_client *client, u8 command,
566 u8 length, const u8 * values)
567 {
568 union i2c_smbus_data data;
569
570 if (length > I2C_SMBUS_BLOCK_MAX)
571 length = I2C_SMBUS_BLOCK_MAX;
572 data.block[0] = length;
573 memcpy(data.block + 1, values, length);
574 return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
575 I2C_SMBUS_WRITE, command,
576 I2C_SMBUS_I2C_BLOCK_DATA, &data);
577 }
578
579 static int
i2c_smbus_xfer_emulated(struct i2c_adapter * adapter,u16 addr,unsigned short flags,char read_write,u8 command,int size,union i2c_smbus_data * data)580 i2c_smbus_xfer_emulated(struct i2c_adapter *adapter, u16 addr,
581 unsigned short flags,
582 char read_write, u8 command, int size,
583 union i2c_smbus_data *data)
584 {
585 unsigned char msgbuf0[I2C_SMBUS_BLOCK_MAX + 3];
586 unsigned char msgbuf1[I2C_SMBUS_BLOCK_MAX + 2];
587 int num = read_write == I2C_SMBUS_READ ? 2 : 1;
588 int i;
589 u8 partial_pec = 0;
590 int status;
591 struct i2c_msg msg[2] = {
592 {
593 .addr = addr,
594 .flags = flags,
595 .len = 1,
596 .buf = msgbuf0,
597 }, {
598 .addr = addr,
599 .flags = flags | I2C_M_RD,
600 .len = 0,
601 .buf = msgbuf1,
602 },
603 };
604
605 msgbuf0[0] = command;
606 switch (size) {
607 case I2C_SMBUS_QUICK:
608 msg[0].len = 0;
609 msg[0].flags = flags | (read_write == I2C_SMBUS_READ ?
610 I2C_M_RD : 0);
611 num = 1;
612 break;
613 case I2C_SMBUS_BYTE:
614 if (read_write == I2C_SMBUS_READ) {
615 msg[0].flags = I2C_M_RD | flags;
616 num = 1;
617 }
618 break;
619 case I2C_SMBUS_BYTE_DATA:
620 if (read_write == I2C_SMBUS_READ)
621 msg[1].len = 1;
622 else {
623 msg[0].len = 2;
624 msgbuf0[1] = data->byte;
625 }
626 break;
627 case I2C_SMBUS_WORD_DATA:
628 if (read_write == I2C_SMBUS_READ)
629 msg[1].len = 2;
630 else {
631 msg[0].len = 3;
632 msgbuf0[1] = data->word & 0xff;
633 msgbuf0[2] = data->word >> 8;
634 }
635 break;
636 case I2C_SMBUS_PROC_CALL:
637 num = 2;
638 read_write = I2C_SMBUS_READ;
639 msg[0].len = 3;
640 msg[1].len = 2;
641 msgbuf0[1] = data->word & 0xff;
642 msgbuf0[2] = data->word >> 8;
643 break;
644 case I2C_SMBUS_BLOCK_DATA:
645 if (read_write == I2C_SMBUS_READ) {
646 msg[1].flags |= I2C_M_RECV_LEN;
647 msg[1].len = 1;
648 } else {
649 msg[0].len = data->block[0] + 2;
650 if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 2) {
651 dev_err(&adapter->dev,
652 "Invalid block write size %d\n",
653 data->block[0]);
654 return -EINVAL;
655 }
656 for (i = 1; i < msg[0].len; i++)
657 msgbuf0[i] = data->block[i - 1];
658 }
659 break;
660 case I2C_SMBUS_BLOCK_PROC_CALL:
661 num = 2;
662 read_write = I2C_SMBUS_READ;
663 if (data->block[0] > I2C_SMBUS_BLOCK_MAX) {
664 dev_err(&adapter->dev,
665 "Invalid block write size %d\n",
666 data->block[0]);
667 return -EINVAL;
668 }
669 msg[0].len = data->block[0] + 2;
670 for (i = 1; i < msg[0].len; i++)
671 msgbuf0[i] = data->block[i - 1];
672 msg[1].flags |= I2C_M_RECV_LEN;
673 msg[1].len = 1;
674 break;
675 case I2C_SMBUS_I2C_BLOCK_DATA:
676 if (read_write == I2C_SMBUS_READ) {
677 msg[1].len = data->block[0];
678 } else {
679 msg[0].len = data->block[0] + 1;
680 if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 1) {
681 dev_err(&adapter->dev,
682 "Invalid block write size %d\n",
683 data->block[0]);
684 return -EINVAL;
685 }
686 for (i = 1; i <= data->block[0]; i++)
687 msgbuf0[i] = data->block[i];
688 }
689 break;
690 default:
691 dev_err(&adapter->dev, "Unsupported transaction %d\n", size);
692 return -EOPNOTSUPP;
693 }
694
695 i = ((flags & I2C_CLIENT_PEC) && size != I2C_SMBUS_QUICK
696 && size != I2C_SMBUS_I2C_BLOCK_DATA);
697 if (i) {
698 if (!(msg[0].flags & I2C_M_RD)) {
699 if (num == 1)
700 i2c_smbus_add_pec(&msg[0]);
701 else
702 partial_pec = i2c_smbus_msg_pec(0, &msg[0]);
703 }
704 if (msg[num - 1].flags & I2C_M_RD)
705 msg[num - 1].len++;
706 }
707 status = i2c_transfer(adapter, msg, num);
708 if (status < 0)
709 return status;
710
711 if (i && (msg[num - 1].flags & I2C_M_RD)) {
712 status = i2c_smbus_check_pec(partial_pec, &msg[num - 1]);
713 if (status < 0)
714 return status;
715 }
716 if (read_write == I2C_SMBUS_READ)
717 switch (size) {
718 case I2C_SMBUS_BYTE:
719 data->byte = msgbuf0[0];
720 break;
721 case I2C_SMBUS_BYTE_DATA:
722 data->byte = msgbuf1[0];
723 break;
724 case I2C_SMBUS_WORD_DATA:
725 case I2C_SMBUS_PROC_CALL:
726 data->word = msgbuf1[0] | (msgbuf1[1] << 8);
727 break;
728 case I2C_SMBUS_I2C_BLOCK_DATA:
729 for (i = 0; i < data->block[0]; i++)
730 data->block[i + 1] = msgbuf1[i];
731 break;
732 case I2C_SMBUS_BLOCK_DATA:
733 case I2C_SMBUS_BLOCK_PROC_CALL:
734 for (i = 0; i < msgbuf1[0] + 1; i++)
735 data->block[i] = msgbuf1[i];
736 break;
737 }
738 return 0;
739 }
740
741 int
i2c_smbus_xfer(struct i2c_adapter * adapter,u16 addr,unsigned short flags,char read_write,u8 command,int protocol,union i2c_smbus_data * data)742 i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr, unsigned short flags,
743 char read_write, u8 command, int protocol,
744 union i2c_smbus_data *data)
745 {
746 unsigned long orig_jiffies;
747 int try;
748 s32 res;
749
750 flags &= I2C_M_TEN | I2C_CLIENT_PEC | I2C_CLIENT_SCCB;
751
752 if (adapter->algo->smbus_xfer) {
753 i2c_lock_bus(adapter, I2C_LOCK_SEGMENT);
754
755 orig_jiffies = jiffies;
756 for (res = 0, try = 0; try <= adapter->retries; try++) {
757 res = adapter->algo->smbus_xfer(adapter, addr, flags,
758 read_write, command,
759 protocol, data);
760 if (res != -EAGAIN)
761 break;
762 if (time_after(jiffies,
763 orig_jiffies + adapter->timeout))
764 break;
765 }
766 i2c_unlock_bus(adapter, I2C_LOCK_SEGMENT);
767
768 if (res != -EOPNOTSUPP || !adapter->algo->master_xfer)
769 goto trace;
770 /*
771 * Fall back to i2c_smbus_xfer_emulated if the adapter doesn't
772 * implement native support for the SMBus operation.
773 */
774 }
775 res = i2c_smbus_xfer_emulated(adapter, addr, flags, read_write,
776 command, protocol, data);
777 trace:
778 return res;
779 }
780
781 struct i2c_client *
i2c_verify_client(struct device * dev)782 i2c_verify_client(struct device *dev)
783 {
784 return ((dev->type == &i2c_client_type) ? to_i2c_client(dev) : NULL);
785 }
786
787 int
i2c_probe_func_quick_read(struct i2c_adapter * adap,unsigned short addr)788 i2c_probe_func_quick_read(struct i2c_adapter *adap, unsigned short addr)
789 {
790 return i2c_smbus_xfer(adap, addr, 0, I2C_SMBUS_READ, 0,
791 I2C_SMBUS_QUICK, NULL) >= 0;
792 }
793