Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/i2c/algos/i2c-algo-bit.c
17531 views
1
/* -------------------------------------------------------------------------
2
* i2c-algo-bit.c i2c driver algorithms for bit-shift adapters
3
* -------------------------------------------------------------------------
4
* Copyright (C) 1995-2000 Simon G. Vogl
5
6
This program is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2 of the License, or
9
(at your option) any later version.
10
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
GNU General Public License for more details.
15
16
You should have received a copy of the GNU General Public License
17
along with this program; if not, write to the Free Software
18
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19
* ------------------------------------------------------------------------- */
20
21
/* With some changes from Frodo Looijaard <[email protected]>, Kyösti Mälkki
22
<[email protected]> and Jean Delvare <[email protected]> */
23
24
#include <linux/kernel.h>
25
#include <linux/module.h>
26
#include <linux/delay.h>
27
#include <linux/init.h>
28
#include <linux/errno.h>
29
#include <linux/sched.h>
30
#include <linux/i2c.h>
31
#include <linux/i2c-algo-bit.h>
32
33
34
/* ----- global defines ----------------------------------------------- */
35
36
#ifdef DEBUG
37
#define bit_dbg(level, dev, format, args...) \
38
do { \
39
if (i2c_debug >= level) \
40
dev_dbg(dev, format, ##args); \
41
} while (0)
42
#else
43
#define bit_dbg(level, dev, format, args...) \
44
do {} while (0)
45
#endif /* DEBUG */
46
47
/* ----- global variables --------------------------------------------- */
48
49
static int bit_test; /* see if the line-setting functions work */
50
module_param(bit_test, bool, 0);
51
MODULE_PARM_DESC(bit_test, "Test the lines of the bus to see if it is stuck");
52
53
#ifdef DEBUG
54
static int i2c_debug = 1;
55
module_param(i2c_debug, int, S_IRUGO | S_IWUSR);
56
MODULE_PARM_DESC(i2c_debug,
57
"debug level - 0 off; 1 normal; 2 verbose; 3 very verbose");
58
#endif
59
60
/* --- setting states on the bus with the right timing: --------------- */
61
62
#define setsda(adap, val) adap->setsda(adap->data, val)
63
#define setscl(adap, val) adap->setscl(adap->data, val)
64
#define getsda(adap) adap->getsda(adap->data)
65
#define getscl(adap) adap->getscl(adap->data)
66
67
static inline void sdalo(struct i2c_algo_bit_data *adap)
68
{
69
setsda(adap, 0);
70
udelay((adap->udelay + 1) / 2);
71
}
72
73
static inline void sdahi(struct i2c_algo_bit_data *adap)
74
{
75
setsda(adap, 1);
76
udelay((adap->udelay + 1) / 2);
77
}
78
79
static inline void scllo(struct i2c_algo_bit_data *adap)
80
{
81
setscl(adap, 0);
82
udelay(adap->udelay / 2);
83
}
84
85
/*
86
* Raise scl line, and do checking for delays. This is necessary for slower
87
* devices.
88
*/
89
static int sclhi(struct i2c_algo_bit_data *adap)
90
{
91
unsigned long start;
92
93
setscl(adap, 1);
94
95
/* Not all adapters have scl sense line... */
96
if (!adap->getscl)
97
goto done;
98
99
start = jiffies;
100
while (!getscl(adap)) {
101
/* This hw knows how to read the clock line, so we wait
102
* until it actually gets high. This is safer as some
103
* chips may hold it low ("clock stretching") while they
104
* are processing data internally.
105
*/
106
if (time_after(jiffies, start + adap->timeout))
107
return -ETIMEDOUT;
108
cond_resched();
109
}
110
#ifdef DEBUG
111
if (jiffies != start && i2c_debug >= 3)
112
pr_debug("i2c-algo-bit: needed %ld jiffies for SCL to go "
113
"high\n", jiffies - start);
114
#endif
115
116
done:
117
udelay(adap->udelay);
118
return 0;
119
}
120
121
122
/* --- other auxiliary functions -------------------------------------- */
123
static void i2c_start(struct i2c_algo_bit_data *adap)
124
{
125
/* assert: scl, sda are high */
126
setsda(adap, 0);
127
udelay(adap->udelay);
128
scllo(adap);
129
}
130
131
static void i2c_repstart(struct i2c_algo_bit_data *adap)
132
{
133
/* assert: scl is low */
134
sdahi(adap);
135
sclhi(adap);
136
setsda(adap, 0);
137
udelay(adap->udelay);
138
scllo(adap);
139
}
140
141
142
static void i2c_stop(struct i2c_algo_bit_data *adap)
143
{
144
/* assert: scl is low */
145
sdalo(adap);
146
sclhi(adap);
147
setsda(adap, 1);
148
udelay(adap->udelay);
149
}
150
151
152
153
/* send a byte without start cond., look for arbitration,
154
check ackn. from slave */
155
/* returns:
156
* 1 if the device acknowledged
157
* 0 if the device did not ack
158
* -ETIMEDOUT if an error occurred (while raising the scl line)
159
*/
160
static int i2c_outb(struct i2c_adapter *i2c_adap, unsigned char c)
161
{
162
int i;
163
int sb;
164
int ack;
165
struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
166
167
/* assert: scl is low */
168
for (i = 7; i >= 0; i--) {
169
sb = (c >> i) & 1;
170
setsda(adap, sb);
171
udelay((adap->udelay + 1) / 2);
172
if (sclhi(adap) < 0) { /* timed out */
173
bit_dbg(1, &i2c_adap->dev, "i2c_outb: 0x%02x, "
174
"timeout at bit #%d\n", (int)c, i);
175
return -ETIMEDOUT;
176
}
177
/* FIXME do arbitration here:
178
* if (sb && !getsda(adap)) -> ouch! Get out of here.
179
*
180
* Report a unique code, so higher level code can retry
181
* the whole (combined) message and *NOT* issue STOP.
182
*/
183
scllo(adap);
184
}
185
sdahi(adap);
186
if (sclhi(adap) < 0) { /* timeout */
187
bit_dbg(1, &i2c_adap->dev, "i2c_outb: 0x%02x, "
188
"timeout at ack\n", (int)c);
189
return -ETIMEDOUT;
190
}
191
192
/* read ack: SDA should be pulled down by slave, or it may
193
* NAK (usually to report problems with the data we wrote).
194
*/
195
ack = !getsda(adap); /* ack: sda is pulled low -> success */
196
bit_dbg(2, &i2c_adap->dev, "i2c_outb: 0x%02x %s\n", (int)c,
197
ack ? "A" : "NA");
198
199
scllo(adap);
200
return ack;
201
/* assert: scl is low (sda undef) */
202
}
203
204
205
static int i2c_inb(struct i2c_adapter *i2c_adap)
206
{
207
/* read byte via i2c port, without start/stop sequence */
208
/* acknowledge is sent in i2c_read. */
209
int i;
210
unsigned char indata = 0;
211
struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
212
213
/* assert: scl is low */
214
sdahi(adap);
215
for (i = 0; i < 8; i++) {
216
if (sclhi(adap) < 0) { /* timeout */
217
bit_dbg(1, &i2c_adap->dev, "i2c_inb: timeout at bit "
218
"#%d\n", 7 - i);
219
return -ETIMEDOUT;
220
}
221
indata *= 2;
222
if (getsda(adap))
223
indata |= 0x01;
224
setscl(adap, 0);
225
udelay(i == 7 ? adap->udelay / 2 : adap->udelay);
226
}
227
/* assert: scl is low */
228
return indata;
229
}
230
231
/*
232
* Sanity check for the adapter hardware - check the reaction of
233
* the bus lines only if it seems to be idle.
234
*/
235
static int test_bus(struct i2c_adapter *i2c_adap)
236
{
237
struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
238
const char *name = i2c_adap->name;
239
int scl, sda, ret;
240
241
if (adap->pre_xfer) {
242
ret = adap->pre_xfer(i2c_adap);
243
if (ret < 0)
244
return -ENODEV;
245
}
246
247
if (adap->getscl == NULL)
248
pr_info("%s: Testing SDA only, SCL is not readable\n", name);
249
250
sda = getsda(adap);
251
scl = (adap->getscl == NULL) ? 1 : getscl(adap);
252
if (!scl || !sda) {
253
printk(KERN_WARNING "%s: bus seems to be busy\n", name);
254
goto bailout;
255
}
256
257
sdalo(adap);
258
sda = getsda(adap);
259
scl = (adap->getscl == NULL) ? 1 : getscl(adap);
260
if (sda) {
261
printk(KERN_WARNING "%s: SDA stuck high!\n", name);
262
goto bailout;
263
}
264
if (!scl) {
265
printk(KERN_WARNING "%s: SCL unexpected low "
266
"while pulling SDA low!\n", name);
267
goto bailout;
268
}
269
270
sdahi(adap);
271
sda = getsda(adap);
272
scl = (adap->getscl == NULL) ? 1 : getscl(adap);
273
if (!sda) {
274
printk(KERN_WARNING "%s: SDA stuck low!\n", name);
275
goto bailout;
276
}
277
if (!scl) {
278
printk(KERN_WARNING "%s: SCL unexpected low "
279
"while pulling SDA high!\n", name);
280
goto bailout;
281
}
282
283
scllo(adap);
284
sda = getsda(adap);
285
scl = (adap->getscl == NULL) ? 0 : getscl(adap);
286
if (scl) {
287
printk(KERN_WARNING "%s: SCL stuck high!\n", name);
288
goto bailout;
289
}
290
if (!sda) {
291
printk(KERN_WARNING "%s: SDA unexpected low "
292
"while pulling SCL low!\n", name);
293
goto bailout;
294
}
295
296
sclhi(adap);
297
sda = getsda(adap);
298
scl = (adap->getscl == NULL) ? 1 : getscl(adap);
299
if (!scl) {
300
printk(KERN_WARNING "%s: SCL stuck low!\n", name);
301
goto bailout;
302
}
303
if (!sda) {
304
printk(KERN_WARNING "%s: SDA unexpected low "
305
"while pulling SCL high!\n", name);
306
goto bailout;
307
}
308
309
if (adap->post_xfer)
310
adap->post_xfer(i2c_adap);
311
312
pr_info("%s: Test OK\n", name);
313
return 0;
314
bailout:
315
sdahi(adap);
316
sclhi(adap);
317
318
if (adap->post_xfer)
319
adap->post_xfer(i2c_adap);
320
321
return -ENODEV;
322
}
323
324
/* ----- Utility functions
325
*/
326
327
/* try_address tries to contact a chip for a number of
328
* times before it gives up.
329
* return values:
330
* 1 chip answered
331
* 0 chip did not answer
332
* -x transmission error
333
*/
334
static int try_address(struct i2c_adapter *i2c_adap,
335
unsigned char addr, int retries)
336
{
337
struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
338
int i, ret = 0;
339
340
for (i = 0; i <= retries; i++) {
341
ret = i2c_outb(i2c_adap, addr);
342
if (ret == 1 || i == retries)
343
break;
344
bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n");
345
i2c_stop(adap);
346
udelay(adap->udelay);
347
yield();
348
bit_dbg(3, &i2c_adap->dev, "emitting start condition\n");
349
i2c_start(adap);
350
}
351
if (i && ret)
352
bit_dbg(1, &i2c_adap->dev, "Used %d tries to %s client at "
353
"0x%02x: %s\n", i + 1,
354
addr & 1 ? "read from" : "write to", addr >> 1,
355
ret == 1 ? "success" : "failed, timeout?");
356
return ret;
357
}
358
359
static int sendbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
360
{
361
const unsigned char *temp = msg->buf;
362
int count = msg->len;
363
unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK;
364
int retval;
365
int wrcount = 0;
366
367
while (count > 0) {
368
retval = i2c_outb(i2c_adap, *temp);
369
370
/* OK/ACK; or ignored NAK */
371
if ((retval > 0) || (nak_ok && (retval == 0))) {
372
count--;
373
temp++;
374
wrcount++;
375
376
/* A slave NAKing the master means the slave didn't like
377
* something about the data it saw. For example, maybe
378
* the SMBus PEC was wrong.
379
*/
380
} else if (retval == 0) {
381
dev_err(&i2c_adap->dev, "sendbytes: NAK bailout.\n");
382
return -EIO;
383
384
/* Timeout; or (someday) lost arbitration
385
*
386
* FIXME Lost ARB implies retrying the transaction from
387
* the first message, after the "winning" master issues
388
* its STOP. As a rule, upper layer code has no reason
389
* to know or care about this ... it is *NOT* an error.
390
*/
391
} else {
392
dev_err(&i2c_adap->dev, "sendbytes: error %d\n",
393
retval);
394
return retval;
395
}
396
}
397
return wrcount;
398
}
399
400
static int acknak(struct i2c_adapter *i2c_adap, int is_ack)
401
{
402
struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
403
404
/* assert: sda is high */
405
if (is_ack) /* send ack */
406
setsda(adap, 0);
407
udelay((adap->udelay + 1) / 2);
408
if (sclhi(adap) < 0) { /* timeout */
409
dev_err(&i2c_adap->dev, "readbytes: ack/nak timeout\n");
410
return -ETIMEDOUT;
411
}
412
scllo(adap);
413
return 0;
414
}
415
416
static int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
417
{
418
int inval;
419
int rdcount = 0; /* counts bytes read */
420
unsigned char *temp = msg->buf;
421
int count = msg->len;
422
const unsigned flags = msg->flags;
423
424
while (count > 0) {
425
inval = i2c_inb(i2c_adap);
426
if (inval >= 0) {
427
*temp = inval;
428
rdcount++;
429
} else { /* read timed out */
430
break;
431
}
432
433
temp++;
434
count--;
435
436
/* Some SMBus transactions require that we receive the
437
transaction length as the first read byte. */
438
if (rdcount == 1 && (flags & I2C_M_RECV_LEN)) {
439
if (inval <= 0 || inval > I2C_SMBUS_BLOCK_MAX) {
440
if (!(flags & I2C_M_NO_RD_ACK))
441
acknak(i2c_adap, 0);
442
dev_err(&i2c_adap->dev, "readbytes: invalid "
443
"block length (%d)\n", inval);
444
return -EREMOTEIO;
445
}
446
/* The original count value accounts for the extra
447
bytes, that is, either 1 for a regular transaction,
448
or 2 for a PEC transaction. */
449
count += inval;
450
msg->len += inval;
451
}
452
453
bit_dbg(2, &i2c_adap->dev, "readbytes: 0x%02x %s\n",
454
inval,
455
(flags & I2C_M_NO_RD_ACK)
456
? "(no ack/nak)"
457
: (count ? "A" : "NA"));
458
459
if (!(flags & I2C_M_NO_RD_ACK)) {
460
inval = acknak(i2c_adap, count);
461
if (inval < 0)
462
return inval;
463
}
464
}
465
return rdcount;
466
}
467
468
/* doAddress initiates the transfer by generating the start condition (in
469
* try_address) and transmits the address in the necessary format to handle
470
* reads, writes as well as 10bit-addresses.
471
* returns:
472
* 0 everything went okay, the chip ack'ed, or IGNORE_NAK flag was set
473
* -x an error occurred (like: -EREMOTEIO if the device did not answer, or
474
* -ETIMEDOUT, for example if the lines are stuck...)
475
*/
476
static int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
477
{
478
unsigned short flags = msg->flags;
479
unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK;
480
struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
481
482
unsigned char addr;
483
int ret, retries;
484
485
retries = nak_ok ? 0 : i2c_adap->retries;
486
487
if (flags & I2C_M_TEN) {
488
/* a ten bit address */
489
addr = 0xf0 | ((msg->addr >> 7) & 0x03);
490
bit_dbg(2, &i2c_adap->dev, "addr0: %d\n", addr);
491
/* try extended address code...*/
492
ret = try_address(i2c_adap, addr, retries);
493
if ((ret != 1) && !nak_ok) {
494
dev_err(&i2c_adap->dev,
495
"died at extended address code\n");
496
return -EREMOTEIO;
497
}
498
/* the remaining 8 bit address */
499
ret = i2c_outb(i2c_adap, msg->addr & 0x7f);
500
if ((ret != 1) && !nak_ok) {
501
/* the chip did not ack / xmission error occurred */
502
dev_err(&i2c_adap->dev, "died at 2nd address code\n");
503
return -EREMOTEIO;
504
}
505
if (flags & I2C_M_RD) {
506
bit_dbg(3, &i2c_adap->dev, "emitting repeated "
507
"start condition\n");
508
i2c_repstart(adap);
509
/* okay, now switch into reading mode */
510
addr |= 0x01;
511
ret = try_address(i2c_adap, addr, retries);
512
if ((ret != 1) && !nak_ok) {
513
dev_err(&i2c_adap->dev,
514
"died at repeated address code\n");
515
return -EREMOTEIO;
516
}
517
}
518
} else { /* normal 7bit address */
519
addr = msg->addr << 1;
520
if (flags & I2C_M_RD)
521
addr |= 1;
522
if (flags & I2C_M_REV_DIR_ADDR)
523
addr ^= 1;
524
ret = try_address(i2c_adap, addr, retries);
525
if ((ret != 1) && !nak_ok)
526
return -ENXIO;
527
}
528
529
return 0;
530
}
531
532
static int bit_xfer(struct i2c_adapter *i2c_adap,
533
struct i2c_msg msgs[], int num)
534
{
535
struct i2c_msg *pmsg;
536
struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
537
int i, ret;
538
unsigned short nak_ok;
539
540
if (adap->pre_xfer) {
541
ret = adap->pre_xfer(i2c_adap);
542
if (ret < 0)
543
return ret;
544
}
545
546
bit_dbg(3, &i2c_adap->dev, "emitting start condition\n");
547
i2c_start(adap);
548
for (i = 0; i < num; i++) {
549
pmsg = &msgs[i];
550
nak_ok = pmsg->flags & I2C_M_IGNORE_NAK;
551
if (!(pmsg->flags & I2C_M_NOSTART)) {
552
if (i) {
553
bit_dbg(3, &i2c_adap->dev, "emitting "
554
"repeated start condition\n");
555
i2c_repstart(adap);
556
}
557
ret = bit_doAddress(i2c_adap, pmsg);
558
if ((ret != 0) && !nak_ok) {
559
bit_dbg(1, &i2c_adap->dev, "NAK from "
560
"device addr 0x%02x msg #%d\n",
561
msgs[i].addr, i);
562
goto bailout;
563
}
564
}
565
if (pmsg->flags & I2C_M_RD) {
566
/* read bytes into buffer*/
567
ret = readbytes(i2c_adap, pmsg);
568
if (ret >= 1)
569
bit_dbg(2, &i2c_adap->dev, "read %d byte%s\n",
570
ret, ret == 1 ? "" : "s");
571
if (ret < pmsg->len) {
572
if (ret >= 0)
573
ret = -EREMOTEIO;
574
goto bailout;
575
}
576
} else {
577
/* write bytes from buffer */
578
ret = sendbytes(i2c_adap, pmsg);
579
if (ret >= 1)
580
bit_dbg(2, &i2c_adap->dev, "wrote %d byte%s\n",
581
ret, ret == 1 ? "" : "s");
582
if (ret < pmsg->len) {
583
if (ret >= 0)
584
ret = -EREMOTEIO;
585
goto bailout;
586
}
587
}
588
}
589
ret = i;
590
591
bailout:
592
bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n");
593
i2c_stop(adap);
594
595
if (adap->post_xfer)
596
adap->post_xfer(i2c_adap);
597
return ret;
598
}
599
600
static u32 bit_func(struct i2c_adapter *adap)
601
{
602
return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
603
I2C_FUNC_SMBUS_READ_BLOCK_DATA |
604
I2C_FUNC_SMBUS_BLOCK_PROC_CALL |
605
I2C_FUNC_10BIT_ADDR | I2C_FUNC_PROTOCOL_MANGLING;
606
}
607
608
609
/* -----exported algorithm data: ------------------------------------- */
610
611
static const struct i2c_algorithm i2c_bit_algo = {
612
.master_xfer = bit_xfer,
613
.functionality = bit_func,
614
};
615
616
/*
617
* registering functions to load algorithms at runtime
618
*/
619
static int __i2c_bit_add_bus(struct i2c_adapter *adap,
620
int (*add_adapter)(struct i2c_adapter *))
621
{
622
struct i2c_algo_bit_data *bit_adap = adap->algo_data;
623
int ret;
624
625
if (bit_test) {
626
ret = test_bus(adap);
627
if (ret < 0)
628
return -ENODEV;
629
}
630
631
/* register new adapter to i2c module... */
632
adap->algo = &i2c_bit_algo;
633
adap->retries = 3;
634
635
ret = add_adapter(adap);
636
if (ret < 0)
637
return ret;
638
639
/* Complain if SCL can't be read */
640
if (bit_adap->getscl == NULL) {
641
dev_warn(&adap->dev, "Not I2C compliant: can't read SCL\n");
642
dev_warn(&adap->dev, "Bus may be unreliable\n");
643
}
644
return 0;
645
}
646
647
int i2c_bit_add_bus(struct i2c_adapter *adap)
648
{
649
return __i2c_bit_add_bus(adap, i2c_add_adapter);
650
}
651
EXPORT_SYMBOL(i2c_bit_add_bus);
652
653
int i2c_bit_add_numbered_bus(struct i2c_adapter *adap)
654
{
655
return __i2c_bit_add_bus(adap, i2c_add_numbered_adapter);
656
}
657
EXPORT_SYMBOL(i2c_bit_add_numbered_bus);
658
659
MODULE_AUTHOR("Simon G. Vogl <[email protected]>");
660
MODULE_DESCRIPTION("I2C-Bus bit-banging algorithm");
661
MODULE_LICENSE("GPL");
662
663