This source file includes following definitions.
- crc8
- i2c_smbus_pec
- i2c_smbus_msg_pec
- i2c_smbus_add_pec
- i2c_smbus_check_pec
- i2c_smbus_read_byte
- i2c_smbus_write_byte
- i2c_smbus_read_byte_data
- i2c_smbus_write_byte_data
- i2c_smbus_read_word_data
- i2c_smbus_write_word_data
- i2c_smbus_read_block_data
- i2c_smbus_write_block_data
- i2c_smbus_read_i2c_block_data
- i2c_smbus_write_i2c_block_data
- i2c_smbus_try_get_dmabuf
- i2c_smbus_xfer_emulated
- i2c_smbus_xfer
- __i2c_smbus_xfer
- i2c_smbus_read_i2c_block_data_or_emulated
- i2c_setup_smbus_alert
- of_i2c_setup_smbus_alert
1
2
3
4
5
6
7
8
9
10
11
12
13 #include <linux/device.h>
14 #include <linux/err.h>
15 #include <linux/i2c.h>
16 #include <linux/i2c-smbus.h>
17 #include <linux/slab.h>
18
19 #include "i2c-core.h"
20
21 #define CREATE_TRACE_POINTS
22 #include <trace/events/smbus.h>
23
24
25
26
27 #define POLY (0x1070U << 3)
28 static u8 crc8(u16 data)
29 {
30 int i;
31
32 for (i = 0; i < 8; i++) {
33 if (data & 0x8000)
34 data = data ^ POLY;
35 data = data << 1;
36 }
37 return (u8)(data >> 8);
38 }
39
40
41 static u8 i2c_smbus_pec(u8 crc, u8 *p, size_t count)
42 {
43 int i;
44
45 for (i = 0; i < count; i++)
46 crc = crc8((crc ^ p[i]) << 8);
47 return crc;
48 }
49
50
51 static u8 i2c_smbus_msg_pec(u8 pec, struct i2c_msg *msg)
52 {
53
54 u8 addr = i2c_8bit_addr_from_msg(msg);
55 pec = i2c_smbus_pec(pec, &addr, 1);
56
57
58 return i2c_smbus_pec(pec, msg->buf, msg->len);
59 }
60
61
62 static inline void i2c_smbus_add_pec(struct i2c_msg *msg)
63 {
64 msg->buf[msg->len] = i2c_smbus_msg_pec(0, msg);
65 msg->len++;
66 }
67
68
69
70
71
72
73 static int i2c_smbus_check_pec(u8 cpec, struct i2c_msg *msg)
74 {
75 u8 rpec = msg->buf[--msg->len];
76 cpec = i2c_smbus_msg_pec(cpec, msg);
77
78 if (rpec != cpec) {
79 pr_debug("Bad PEC 0x%02x vs. 0x%02x\n",
80 rpec, cpec);
81 return -EBADMSG;
82 }
83 return 0;
84 }
85
86
87
88
89
90
91
92
93 s32 i2c_smbus_read_byte(const struct i2c_client *client)
94 {
95 union i2c_smbus_data data;
96 int status;
97
98 status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
99 I2C_SMBUS_READ, 0,
100 I2C_SMBUS_BYTE, &data);
101 return (status < 0) ? status : data.byte;
102 }
103 EXPORT_SYMBOL(i2c_smbus_read_byte);
104
105
106
107
108
109
110
111
112
113 s32 i2c_smbus_write_byte(const struct i2c_client *client, u8 value)
114 {
115 return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
116 I2C_SMBUS_WRITE, value, I2C_SMBUS_BYTE, NULL);
117 }
118 EXPORT_SYMBOL(i2c_smbus_write_byte);
119
120
121
122
123
124
125
126
127
128 s32 i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command)
129 {
130 union i2c_smbus_data data;
131 int status;
132
133 status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
134 I2C_SMBUS_READ, command,
135 I2C_SMBUS_BYTE_DATA, &data);
136 return (status < 0) ? status : data.byte;
137 }
138 EXPORT_SYMBOL(i2c_smbus_read_byte_data);
139
140
141
142
143
144
145
146
147
148
149 s32 i2c_smbus_write_byte_data(const struct i2c_client *client, u8 command,
150 u8 value)
151 {
152 union i2c_smbus_data data;
153 data.byte = value;
154 return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
155 I2C_SMBUS_WRITE, command,
156 I2C_SMBUS_BYTE_DATA, &data);
157 }
158 EXPORT_SYMBOL(i2c_smbus_write_byte_data);
159
160
161
162
163
164
165
166
167
168 s32 i2c_smbus_read_word_data(const struct i2c_client *client, u8 command)
169 {
170 union i2c_smbus_data data;
171 int status;
172
173 status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
174 I2C_SMBUS_READ, command,
175 I2C_SMBUS_WORD_DATA, &data);
176 return (status < 0) ? status : data.word;
177 }
178 EXPORT_SYMBOL(i2c_smbus_read_word_data);
179
180
181
182
183
184
185
186
187
188
189 s32 i2c_smbus_write_word_data(const struct i2c_client *client, u8 command,
190 u16 value)
191 {
192 union i2c_smbus_data data;
193 data.word = value;
194 return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
195 I2C_SMBUS_WRITE, command,
196 I2C_SMBUS_WORD_DATA, &data);
197 }
198 EXPORT_SYMBOL(i2c_smbus_write_word_data);
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215 s32 i2c_smbus_read_block_data(const struct i2c_client *client, u8 command,
216 u8 *values)
217 {
218 union i2c_smbus_data data;
219 int status;
220
221 status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
222 I2C_SMBUS_READ, command,
223 I2C_SMBUS_BLOCK_DATA, &data);
224 if (status)
225 return status;
226
227 memcpy(values, &data.block[1], data.block[0]);
228 return data.block[0];
229 }
230 EXPORT_SYMBOL(i2c_smbus_read_block_data);
231
232
233
234
235
236
237
238
239
240
241
242 s32 i2c_smbus_write_block_data(const struct i2c_client *client, u8 command,
243 u8 length, const u8 *values)
244 {
245 union i2c_smbus_data data;
246
247 if (length > I2C_SMBUS_BLOCK_MAX)
248 length = I2C_SMBUS_BLOCK_MAX;
249 data.block[0] = length;
250 memcpy(&data.block[1], values, length);
251 return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
252 I2C_SMBUS_WRITE, command,
253 I2C_SMBUS_BLOCK_DATA, &data);
254 }
255 EXPORT_SYMBOL(i2c_smbus_write_block_data);
256
257
258 s32 i2c_smbus_read_i2c_block_data(const struct i2c_client *client, u8 command,
259 u8 length, u8 *values)
260 {
261 union i2c_smbus_data data;
262 int status;
263
264 if (length > I2C_SMBUS_BLOCK_MAX)
265 length = I2C_SMBUS_BLOCK_MAX;
266 data.block[0] = length;
267 status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
268 I2C_SMBUS_READ, command,
269 I2C_SMBUS_I2C_BLOCK_DATA, &data);
270 if (status < 0)
271 return status;
272
273 memcpy(values, &data.block[1], data.block[0]);
274 return data.block[0];
275 }
276 EXPORT_SYMBOL(i2c_smbus_read_i2c_block_data);
277
278 s32 i2c_smbus_write_i2c_block_data(const struct i2c_client *client, u8 command,
279 u8 length, const u8 *values)
280 {
281 union i2c_smbus_data data;
282
283 if (length > I2C_SMBUS_BLOCK_MAX)
284 length = I2C_SMBUS_BLOCK_MAX;
285 data.block[0] = length;
286 memcpy(data.block + 1, values, length);
287 return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
288 I2C_SMBUS_WRITE, command,
289 I2C_SMBUS_I2C_BLOCK_DATA, &data);
290 }
291 EXPORT_SYMBOL(i2c_smbus_write_i2c_block_data);
292
293 static void i2c_smbus_try_get_dmabuf(struct i2c_msg *msg, u8 init_val)
294 {
295 bool is_read = msg->flags & I2C_M_RD;
296 unsigned char *dma_buf;
297
298 dma_buf = kzalloc(I2C_SMBUS_BLOCK_MAX + (is_read ? 2 : 3), GFP_KERNEL);
299 if (!dma_buf)
300 return;
301
302 msg->buf = dma_buf;
303 msg->flags |= I2C_M_DMA_SAFE;
304
305 if (init_val)
306 msg->buf[0] = init_val;
307 }
308
309
310
311
312
313 static s32 i2c_smbus_xfer_emulated(struct i2c_adapter *adapter, u16 addr,
314 unsigned short flags,
315 char read_write, u8 command, int size,
316 union i2c_smbus_data *data)
317 {
318
319
320
321
322
323
324 unsigned char msgbuf0[I2C_SMBUS_BLOCK_MAX+3];
325 unsigned char msgbuf1[I2C_SMBUS_BLOCK_MAX+2];
326 int num = read_write == I2C_SMBUS_READ ? 2 : 1;
327 int i;
328 u8 partial_pec = 0;
329 int status;
330 struct i2c_msg msg[2] = {
331 {
332 .addr = addr,
333 .flags = flags,
334 .len = 1,
335 .buf = msgbuf0,
336 }, {
337 .addr = addr,
338 .flags = flags | I2C_M_RD,
339 .len = 0,
340 .buf = msgbuf1,
341 },
342 };
343
344 msgbuf0[0] = command;
345 switch (size) {
346 case I2C_SMBUS_QUICK:
347 msg[0].len = 0;
348
349 msg[0].flags = flags | (read_write == I2C_SMBUS_READ ?
350 I2C_M_RD : 0);
351 num = 1;
352 break;
353 case I2C_SMBUS_BYTE:
354 if (read_write == I2C_SMBUS_READ) {
355
356 msg[0].flags = I2C_M_RD | flags;
357 num = 1;
358 }
359 break;
360 case I2C_SMBUS_BYTE_DATA:
361 if (read_write == I2C_SMBUS_READ)
362 msg[1].len = 1;
363 else {
364 msg[0].len = 2;
365 msgbuf0[1] = data->byte;
366 }
367 break;
368 case I2C_SMBUS_WORD_DATA:
369 if (read_write == I2C_SMBUS_READ)
370 msg[1].len = 2;
371 else {
372 msg[0].len = 3;
373 msgbuf0[1] = data->word & 0xff;
374 msgbuf0[2] = data->word >> 8;
375 }
376 break;
377 case I2C_SMBUS_PROC_CALL:
378 num = 2;
379 read_write = I2C_SMBUS_READ;
380 msg[0].len = 3;
381 msg[1].len = 2;
382 msgbuf0[1] = data->word & 0xff;
383 msgbuf0[2] = data->word >> 8;
384 break;
385 case I2C_SMBUS_BLOCK_DATA:
386 if (read_write == I2C_SMBUS_READ) {
387 msg[1].flags |= I2C_M_RECV_LEN;
388 msg[1].len = 1;
389
390 i2c_smbus_try_get_dmabuf(&msg[1], 0);
391 } else {
392 msg[0].len = data->block[0] + 2;
393 if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 2) {
394 dev_err(&adapter->dev,
395 "Invalid block write size %d\n",
396 data->block[0]);
397 return -EINVAL;
398 }
399
400 i2c_smbus_try_get_dmabuf(&msg[0], command);
401 for (i = 1; i < msg[0].len; i++)
402 msg[0].buf[i] = data->block[i - 1];
403 }
404 break;
405 case I2C_SMBUS_BLOCK_PROC_CALL:
406 num = 2;
407 read_write = I2C_SMBUS_READ;
408 if (data->block[0] > I2C_SMBUS_BLOCK_MAX) {
409 dev_err(&adapter->dev,
410 "Invalid block write size %d\n",
411 data->block[0]);
412 return -EINVAL;
413 }
414
415 msg[0].len = data->block[0] + 2;
416 i2c_smbus_try_get_dmabuf(&msg[0], command);
417 for (i = 1; i < msg[0].len; i++)
418 msg[0].buf[i] = data->block[i - 1];
419
420 msg[1].flags |= I2C_M_RECV_LEN;
421 msg[1].len = 1;
422
423 i2c_smbus_try_get_dmabuf(&msg[1], 0);
424 break;
425 case I2C_SMBUS_I2C_BLOCK_DATA:
426 if (data->block[0] > I2C_SMBUS_BLOCK_MAX) {
427 dev_err(&adapter->dev, "Invalid block %s size %d\n",
428 read_write == I2C_SMBUS_READ ? "read" : "write",
429 data->block[0]);
430 return -EINVAL;
431 }
432
433 if (read_write == I2C_SMBUS_READ) {
434 msg[1].len = data->block[0];
435 i2c_smbus_try_get_dmabuf(&msg[1], 0);
436 } else {
437 msg[0].len = data->block[0] + 1;
438
439 i2c_smbus_try_get_dmabuf(&msg[0], command);
440 for (i = 1; i <= data->block[0]; i++)
441 msg[0].buf[i] = data->block[i];
442 }
443 break;
444 default:
445 dev_err(&adapter->dev, "Unsupported transaction %d\n", size);
446 return -EOPNOTSUPP;
447 }
448
449 i = ((flags & I2C_CLIENT_PEC) && size != I2C_SMBUS_QUICK
450 && size != I2C_SMBUS_I2C_BLOCK_DATA);
451 if (i) {
452
453 if (!(msg[0].flags & I2C_M_RD)) {
454 if (num == 1)
455 i2c_smbus_add_pec(&msg[0]);
456 else
457 partial_pec = i2c_smbus_msg_pec(0, &msg[0]);
458 }
459
460 if (msg[num-1].flags & I2C_M_RD)
461 msg[num-1].len++;
462 }
463
464 status = __i2c_transfer(adapter, msg, num);
465 if (status < 0)
466 goto cleanup;
467 if (status != num) {
468 status = -EIO;
469 goto cleanup;
470 }
471 status = 0;
472
473
474 if (i && (msg[num-1].flags & I2C_M_RD)) {
475 status = i2c_smbus_check_pec(partial_pec, &msg[num-1]);
476 if (status < 0)
477 goto cleanup;
478 }
479
480 if (read_write == I2C_SMBUS_READ)
481 switch (size) {
482 case I2C_SMBUS_BYTE:
483 data->byte = msgbuf0[0];
484 break;
485 case I2C_SMBUS_BYTE_DATA:
486 data->byte = msgbuf1[0];
487 break;
488 case I2C_SMBUS_WORD_DATA:
489 case I2C_SMBUS_PROC_CALL:
490 data->word = msgbuf1[0] | (msgbuf1[1] << 8);
491 break;
492 case I2C_SMBUS_I2C_BLOCK_DATA:
493 for (i = 0; i < data->block[0]; i++)
494 data->block[i + 1] = msg[1].buf[i];
495 break;
496 case I2C_SMBUS_BLOCK_DATA:
497 case I2C_SMBUS_BLOCK_PROC_CALL:
498 for (i = 0; i < msg[1].buf[0] + 1; i++)
499 data->block[i] = msg[1].buf[i];
500 break;
501 }
502
503 cleanup:
504 if (msg[0].flags & I2C_M_DMA_SAFE)
505 kfree(msg[0].buf);
506 if (msg[1].flags & I2C_M_DMA_SAFE)
507 kfree(msg[1].buf);
508
509 return status;
510 }
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525 s32 i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
526 unsigned short flags, char read_write,
527 u8 command, int protocol, union i2c_smbus_data *data)
528 {
529 s32 res;
530
531 res = __i2c_lock_bus_helper(adapter);
532 if (res)
533 return res;
534
535 res = __i2c_smbus_xfer(adapter, addr, flags, read_write,
536 command, protocol, data);
537 i2c_unlock_bus(adapter, I2C_LOCK_SEGMENT);
538
539 return res;
540 }
541 EXPORT_SYMBOL(i2c_smbus_xfer);
542
543 s32 __i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
544 unsigned short flags, char read_write,
545 u8 command, int protocol, union i2c_smbus_data *data)
546 {
547 int (*xfer_func)(struct i2c_adapter *adap, u16 addr,
548 unsigned short flags, char read_write,
549 u8 command, int size, union i2c_smbus_data *data);
550 unsigned long orig_jiffies;
551 int try;
552 s32 res;
553
554 res = __i2c_check_suspended(adapter);
555 if (res)
556 return res;
557
558
559
560
561 trace_smbus_write(adapter, addr, flags, read_write,
562 command, protocol, data);
563 trace_smbus_read(adapter, addr, flags, read_write,
564 command, protocol);
565
566 flags &= I2C_M_TEN | I2C_CLIENT_PEC | I2C_CLIENT_SCCB;
567
568 xfer_func = adapter->algo->smbus_xfer;
569 if (i2c_in_atomic_xfer_mode()) {
570 if (adapter->algo->smbus_xfer_atomic)
571 xfer_func = adapter->algo->smbus_xfer_atomic;
572 else if (adapter->algo->master_xfer_atomic)
573 xfer_func = NULL;
574 }
575
576 if (xfer_func) {
577
578 orig_jiffies = jiffies;
579 for (res = 0, try = 0; try <= adapter->retries; try++) {
580 res = xfer_func(adapter, addr, flags, read_write,
581 command, protocol, data);
582 if (res != -EAGAIN)
583 break;
584 if (time_after(jiffies,
585 orig_jiffies + adapter->timeout))
586 break;
587 }
588
589 if (res != -EOPNOTSUPP || !adapter->algo->master_xfer)
590 goto trace;
591
592
593
594
595 }
596
597 res = i2c_smbus_xfer_emulated(adapter, addr, flags, read_write,
598 command, protocol, data);
599
600 trace:
601
602 trace_smbus_reply(adapter, addr, flags, read_write,
603 command, protocol, data, res);
604 trace_smbus_result(adapter, addr, flags, read_write,
605 command, protocol, res);
606
607 return res;
608 }
609 EXPORT_SYMBOL(__i2c_smbus_xfer);
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630 s32 i2c_smbus_read_i2c_block_data_or_emulated(const struct i2c_client *client,
631 u8 command, u8 length, u8 *values)
632 {
633 u8 i = 0;
634 int status;
635
636 if (length > I2C_SMBUS_BLOCK_MAX)
637 length = I2C_SMBUS_BLOCK_MAX;
638
639 if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_I2C_BLOCK))
640 return i2c_smbus_read_i2c_block_data(client, command, length, values);
641
642 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE_DATA))
643 return -EOPNOTSUPP;
644
645 if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_WORD_DATA)) {
646 while ((i + 2) <= length) {
647 status = i2c_smbus_read_word_data(client, command + i);
648 if (status < 0)
649 return status;
650 values[i] = status & 0xff;
651 values[i + 1] = status >> 8;
652 i += 2;
653 }
654 }
655
656 while (i < length) {
657 status = i2c_smbus_read_byte_data(client, command + i);
658 if (status < 0)
659 return status;
660 values[i] = status;
661 i++;
662 }
663
664 return i;
665 }
666 EXPORT_SYMBOL(i2c_smbus_read_i2c_block_data_or_emulated);
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688 struct i2c_client *i2c_setup_smbus_alert(struct i2c_adapter *adapter,
689 struct i2c_smbus_alert_setup *setup)
690 {
691 struct i2c_board_info ara_board_info = {
692 I2C_BOARD_INFO("smbus_alert", 0x0c),
693 .platform_data = setup,
694 };
695
696 return i2c_new_device(adapter, &ara_board_info);
697 }
698 EXPORT_SYMBOL_GPL(i2c_setup_smbus_alert);
699
700 #if IS_ENABLED(CONFIG_I2C_SMBUS) && IS_ENABLED(CONFIG_OF)
701 int of_i2c_setup_smbus_alert(struct i2c_adapter *adapter)
702 {
703 struct i2c_client *client;
704 int irq;
705
706 irq = of_property_match_string(adapter->dev.of_node, "interrupt-names",
707 "smbus_alert");
708 if (irq == -EINVAL || irq == -ENODATA)
709 return 0;
710 else if (irq < 0)
711 return irq;
712
713 client = i2c_setup_smbus_alert(adapter, NULL);
714 if (!client)
715 return -ENODEV;
716
717 return 0;
718 }
719 EXPORT_SYMBOL_GPL(of_i2c_setup_smbus_alert);
720 #endif