Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/cris/arch-v10/drivers/i2c.c
15126 views
1
/*!***************************************************************************
2
*!
3
*! FILE NAME : i2c.c
4
*!
5
*! DESCRIPTION: implements an interface for IIC/I2C, both directly from other
6
*! kernel modules (i2c_writereg/readreg) and from userspace using
7
*! ioctl()'s
8
*!
9
*! (C) Copyright 1999-2007 Axis Communications AB, LUND, SWEDEN
10
*!
11
*!***************************************************************************/
12
13
/****************** INCLUDE FILES SECTION ***********************************/
14
15
#include <linux/module.h>
16
#include <linux/sched.h>
17
#include <linux/errno.h>
18
#include <linux/kernel.h>
19
#include <linux/fs.h>
20
#include <linux/string.h>
21
#include <linux/init.h>
22
23
#include <asm/etraxi2c.h>
24
25
#include <asm/system.h>
26
#include <arch/svinto.h>
27
#include <asm/io.h>
28
#include <asm/delay.h>
29
#include <arch/io_interface_mux.h>
30
31
#include "i2c.h"
32
33
/****************** I2C DEFINITION SECTION *************************/
34
35
#define D(x)
36
37
#define I2C_MAJOR 123 /* LOCAL/EXPERIMENTAL */
38
static const char i2c_name[] = "i2c";
39
40
#define CLOCK_LOW_TIME 8
41
#define CLOCK_HIGH_TIME 8
42
#define START_CONDITION_HOLD_TIME 8
43
#define STOP_CONDITION_HOLD_TIME 8
44
#define ENABLE_OUTPUT 0x01
45
#define ENABLE_INPUT 0x00
46
#define I2C_CLOCK_HIGH 1
47
#define I2C_CLOCK_LOW 0
48
#define I2C_DATA_HIGH 1
49
#define I2C_DATA_LOW 0
50
51
#ifdef CONFIG_ETRAX_I2C_USES_PB_NOT_PB_I2C
52
/* Use PB and not PB_I2C */
53
#ifndef CONFIG_ETRAX_I2C_DATA_PORT
54
#define CONFIG_ETRAX_I2C_DATA_PORT 0
55
#endif
56
#ifndef CONFIG_ETRAX_I2C_CLK_PORT
57
#define CONFIG_ETRAX_I2C_CLK_PORT 1
58
#endif
59
60
#define SDABIT CONFIG_ETRAX_I2C_DATA_PORT
61
#define SCLBIT CONFIG_ETRAX_I2C_CLK_PORT
62
#define i2c_enable()
63
#define i2c_disable()
64
65
/* enable or disable output-enable, to select output or input on the i2c bus */
66
67
#define i2c_dir_out() \
68
REG_SHADOW_SET(R_PORT_PB_DIR, port_pb_dir_shadow, SDABIT, 1)
69
#define i2c_dir_in() \
70
REG_SHADOW_SET(R_PORT_PB_DIR, port_pb_dir_shadow, SDABIT, 0)
71
72
/* control the i2c clock and data signals */
73
74
#define i2c_clk(x) \
75
REG_SHADOW_SET(R_PORT_PB_DATA, port_pb_data_shadow, SCLBIT, x)
76
#define i2c_data(x) \
77
REG_SHADOW_SET(R_PORT_PB_DATA, port_pb_data_shadow, SDABIT, x)
78
79
/* read a bit from the i2c interface */
80
81
#define i2c_getbit() (((*R_PORT_PB_READ & (1 << SDABIT))) >> SDABIT)
82
83
#else
84
/* enable or disable the i2c interface */
85
86
#define i2c_enable() *R_PORT_PB_I2C = (port_pb_i2c_shadow |= IO_MASK(R_PORT_PB_I2C, i2c_en))
87
#define i2c_disable() *R_PORT_PB_I2C = (port_pb_i2c_shadow &= ~IO_MASK(R_PORT_PB_I2C, i2c_en))
88
89
/* enable or disable output-enable, to select output or input on the i2c bus */
90
91
#define i2c_dir_out() \
92
*R_PORT_PB_I2C = (port_pb_i2c_shadow &= ~IO_MASK(R_PORT_PB_I2C, i2c_oe_)); \
93
REG_SHADOW_SET(R_PORT_PB_DIR, port_pb_dir_shadow, 0, 1);
94
#define i2c_dir_in() \
95
*R_PORT_PB_I2C = (port_pb_i2c_shadow |= IO_MASK(R_PORT_PB_I2C, i2c_oe_)); \
96
REG_SHADOW_SET(R_PORT_PB_DIR, port_pb_dir_shadow, 0, 0);
97
98
/* control the i2c clock and data signals */
99
100
#define i2c_clk(x) \
101
*R_PORT_PB_I2C = (port_pb_i2c_shadow = (port_pb_i2c_shadow & \
102
~IO_MASK(R_PORT_PB_I2C, i2c_clk)) | IO_FIELD(R_PORT_PB_I2C, i2c_clk, (x))); \
103
REG_SHADOW_SET(R_PORT_PB_DATA, port_pb_data_shadow, 1, x);
104
105
#define i2c_data(x) \
106
*R_PORT_PB_I2C = (port_pb_i2c_shadow = (port_pb_i2c_shadow & \
107
~IO_MASK(R_PORT_PB_I2C, i2c_d)) | IO_FIELD(R_PORT_PB_I2C, i2c_d, (x))); \
108
REG_SHADOW_SET(R_PORT_PB_DATA, port_pb_data_shadow, 0, x);
109
110
/* read a bit from the i2c interface */
111
112
#define i2c_getbit() (*R_PORT_PB_READ & 0x1)
113
#endif
114
115
/* use the kernels delay routine */
116
117
#define i2c_delay(usecs) udelay(usecs)
118
119
static DEFINE_SPINLOCK(i2c_lock); /* Protect directions etc */
120
121
/****************** FUNCTION DEFINITION SECTION *************************/
122
123
124
/* generate i2c start condition */
125
126
void
127
i2c_start(void)
128
{
129
/*
130
* SCL=1 SDA=1
131
*/
132
i2c_dir_out();
133
i2c_delay(CLOCK_HIGH_TIME/6);
134
i2c_data(I2C_DATA_HIGH);
135
i2c_clk(I2C_CLOCK_HIGH);
136
i2c_delay(CLOCK_HIGH_TIME);
137
/*
138
* SCL=1 SDA=0
139
*/
140
i2c_data(I2C_DATA_LOW);
141
i2c_delay(START_CONDITION_HOLD_TIME);
142
/*
143
* SCL=0 SDA=0
144
*/
145
i2c_clk(I2C_CLOCK_LOW);
146
i2c_delay(CLOCK_LOW_TIME);
147
}
148
149
/* generate i2c stop condition */
150
151
void
152
i2c_stop(void)
153
{
154
i2c_dir_out();
155
156
/*
157
* SCL=0 SDA=0
158
*/
159
i2c_clk(I2C_CLOCK_LOW);
160
i2c_data(I2C_DATA_LOW);
161
i2c_delay(CLOCK_LOW_TIME*2);
162
/*
163
* SCL=1 SDA=0
164
*/
165
i2c_clk(I2C_CLOCK_HIGH);
166
i2c_delay(CLOCK_HIGH_TIME*2);
167
/*
168
* SCL=1 SDA=1
169
*/
170
i2c_data(I2C_DATA_HIGH);
171
i2c_delay(STOP_CONDITION_HOLD_TIME);
172
173
i2c_dir_in();
174
}
175
176
/* write a byte to the i2c interface */
177
178
void
179
i2c_outbyte(unsigned char x)
180
{
181
int i;
182
183
i2c_dir_out();
184
185
for (i = 0; i < 8; i++) {
186
if (x & 0x80) {
187
i2c_data(I2C_DATA_HIGH);
188
} else {
189
i2c_data(I2C_DATA_LOW);
190
}
191
192
i2c_delay(CLOCK_LOW_TIME/2);
193
i2c_clk(I2C_CLOCK_HIGH);
194
i2c_delay(CLOCK_HIGH_TIME);
195
i2c_clk(I2C_CLOCK_LOW);
196
i2c_delay(CLOCK_LOW_TIME/2);
197
x <<= 1;
198
}
199
i2c_data(I2C_DATA_LOW);
200
i2c_delay(CLOCK_LOW_TIME/2);
201
202
/*
203
* enable input
204
*/
205
i2c_dir_in();
206
}
207
208
/* read a byte from the i2c interface */
209
210
unsigned char
211
i2c_inbyte(void)
212
{
213
unsigned char aBitByte = 0;
214
int i;
215
216
/* Switch off I2C to get bit */
217
i2c_disable();
218
i2c_dir_in();
219
i2c_delay(CLOCK_HIGH_TIME/2);
220
221
/* Get bit */
222
aBitByte |= i2c_getbit();
223
224
/* Enable I2C */
225
i2c_enable();
226
i2c_delay(CLOCK_LOW_TIME/2);
227
228
for (i = 1; i < 8; i++) {
229
aBitByte <<= 1;
230
/* Clock pulse */
231
i2c_clk(I2C_CLOCK_HIGH);
232
i2c_delay(CLOCK_HIGH_TIME);
233
i2c_clk(I2C_CLOCK_LOW);
234
i2c_delay(CLOCK_LOW_TIME);
235
236
/* Switch off I2C to get bit */
237
i2c_disable();
238
i2c_dir_in();
239
i2c_delay(CLOCK_HIGH_TIME/2);
240
241
/* Get bit */
242
aBitByte |= i2c_getbit();
243
244
/* Enable I2C */
245
i2c_enable();
246
i2c_delay(CLOCK_LOW_TIME/2);
247
}
248
i2c_clk(I2C_CLOCK_HIGH);
249
i2c_delay(CLOCK_HIGH_TIME);
250
251
/*
252
* we leave the clock low, getbyte is usually followed
253
* by sendack/nack, they assume the clock to be low
254
*/
255
i2c_clk(I2C_CLOCK_LOW);
256
return aBitByte;
257
}
258
259
/*#---------------------------------------------------------------------------
260
*#
261
*# FUNCTION NAME: i2c_getack
262
*#
263
*# DESCRIPTION : checks if ack was received from ic2
264
*#
265
*#--------------------------------------------------------------------------*/
266
267
int
268
i2c_getack(void)
269
{
270
int ack = 1;
271
/*
272
* enable output
273
*/
274
i2c_dir_out();
275
/*
276
* Release data bus by setting
277
* data high
278
*/
279
i2c_data(I2C_DATA_HIGH);
280
/*
281
* enable input
282
*/
283
i2c_dir_in();
284
i2c_delay(CLOCK_HIGH_TIME/4);
285
/*
286
* generate ACK clock pulse
287
*/
288
i2c_clk(I2C_CLOCK_HIGH);
289
/*
290
* Use PORT PB instead of I2C
291
* for input. (I2C not working)
292
*/
293
i2c_clk(1);
294
i2c_data(1);
295
/*
296
* switch off I2C
297
*/
298
i2c_data(1);
299
i2c_disable();
300
i2c_dir_in();
301
/*
302
* now wait for ack
303
*/
304
i2c_delay(CLOCK_HIGH_TIME/2);
305
/*
306
* check for ack
307
*/
308
if(i2c_getbit())
309
ack = 0;
310
i2c_delay(CLOCK_HIGH_TIME/2);
311
if(!ack){
312
if(!i2c_getbit()) /* receiver pulld SDA low */
313
ack = 1;
314
i2c_delay(CLOCK_HIGH_TIME/2);
315
}
316
317
/*
318
* our clock is high now, make sure data is low
319
* before we enable our output. If we keep data high
320
* and enable output, we would generate a stop condition.
321
*/
322
i2c_data(I2C_DATA_LOW);
323
324
/*
325
* end clock pulse
326
*/
327
i2c_enable();
328
i2c_dir_out();
329
i2c_clk(I2C_CLOCK_LOW);
330
i2c_delay(CLOCK_HIGH_TIME/4);
331
/*
332
* enable output
333
*/
334
i2c_dir_out();
335
/*
336
* remove ACK clock pulse
337
*/
338
i2c_data(I2C_DATA_HIGH);
339
i2c_delay(CLOCK_LOW_TIME/2);
340
return ack;
341
}
342
343
/*#---------------------------------------------------------------------------
344
*#
345
*# FUNCTION NAME: I2C::sendAck
346
*#
347
*# DESCRIPTION : Send ACK on received data
348
*#
349
*#--------------------------------------------------------------------------*/
350
void
351
i2c_sendack(void)
352
{
353
/*
354
* enable output
355
*/
356
i2c_delay(CLOCK_LOW_TIME);
357
i2c_dir_out();
358
/*
359
* set ack pulse high
360
*/
361
i2c_data(I2C_DATA_LOW);
362
/*
363
* generate clock pulse
364
*/
365
i2c_delay(CLOCK_HIGH_TIME/6);
366
i2c_clk(I2C_CLOCK_HIGH);
367
i2c_delay(CLOCK_HIGH_TIME);
368
i2c_clk(I2C_CLOCK_LOW);
369
i2c_delay(CLOCK_LOW_TIME/6);
370
/*
371
* reset data out
372
*/
373
i2c_data(I2C_DATA_HIGH);
374
i2c_delay(CLOCK_LOW_TIME);
375
376
i2c_dir_in();
377
}
378
379
/*#---------------------------------------------------------------------------
380
*#
381
*# FUNCTION NAME: i2c_sendnack
382
*#
383
*# DESCRIPTION : Sends NACK on received data
384
*#
385
*#--------------------------------------------------------------------------*/
386
void
387
i2c_sendnack(void)
388
{
389
/*
390
* enable output
391
*/
392
i2c_delay(CLOCK_LOW_TIME);
393
i2c_dir_out();
394
/*
395
* set data high
396
*/
397
i2c_data(I2C_DATA_HIGH);
398
/*
399
* generate clock pulse
400
*/
401
i2c_delay(CLOCK_HIGH_TIME/6);
402
i2c_clk(I2C_CLOCK_HIGH);
403
i2c_delay(CLOCK_HIGH_TIME);
404
i2c_clk(I2C_CLOCK_LOW);
405
i2c_delay(CLOCK_LOW_TIME);
406
407
i2c_dir_in();
408
}
409
410
/*#---------------------------------------------------------------------------
411
*#
412
*# FUNCTION NAME: i2c_writereg
413
*#
414
*# DESCRIPTION : Writes a value to an I2C device
415
*#
416
*#--------------------------------------------------------------------------*/
417
int
418
i2c_writereg(unsigned char theSlave, unsigned char theReg,
419
unsigned char theValue)
420
{
421
int error, cntr = 3;
422
unsigned long flags;
423
424
spin_lock(&i2c_lock);
425
426
do {
427
error = 0;
428
/*
429
* we don't like to be interrupted
430
*/
431
local_irq_save(flags);
432
433
i2c_start();
434
/*
435
* send slave address
436
*/
437
i2c_outbyte((theSlave & 0xfe));
438
/*
439
* wait for ack
440
*/
441
if(!i2c_getack())
442
error = 1;
443
/*
444
* now select register
445
*/
446
i2c_dir_out();
447
i2c_outbyte(theReg);
448
/*
449
* now it's time to wait for ack
450
*/
451
if(!i2c_getack())
452
error |= 2;
453
/*
454
* send register register data
455
*/
456
i2c_outbyte(theValue);
457
/*
458
* now it's time to wait for ack
459
*/
460
if(!i2c_getack())
461
error |= 4;
462
/*
463
* end byte stream
464
*/
465
i2c_stop();
466
/*
467
* enable interrupt again
468
*/
469
local_irq_restore(flags);
470
471
} while(error && cntr--);
472
473
i2c_delay(CLOCK_LOW_TIME);
474
475
spin_unlock(&i2c_lock);
476
477
return -error;
478
}
479
480
/*#---------------------------------------------------------------------------
481
*#
482
*# FUNCTION NAME: i2c_readreg
483
*#
484
*# DESCRIPTION : Reads a value from the decoder registers.
485
*#
486
*#--------------------------------------------------------------------------*/
487
unsigned char
488
i2c_readreg(unsigned char theSlave, unsigned char theReg)
489
{
490
unsigned char b = 0;
491
int error, cntr = 3;
492
unsigned long flags;
493
494
spin_lock(&i2c_lock);
495
496
do {
497
error = 0;
498
/*
499
* we don't like to be interrupted
500
*/
501
local_irq_save(flags);
502
/*
503
* generate start condition
504
*/
505
i2c_start();
506
507
/*
508
* send slave address
509
*/
510
i2c_outbyte((theSlave & 0xfe));
511
/*
512
* wait for ack
513
*/
514
if(!i2c_getack())
515
error = 1;
516
/*
517
* now select register
518
*/
519
i2c_dir_out();
520
i2c_outbyte(theReg);
521
/*
522
* now it's time to wait for ack
523
*/
524
if(!i2c_getack())
525
error = 1;
526
/*
527
* repeat start condition
528
*/
529
i2c_delay(CLOCK_LOW_TIME);
530
i2c_start();
531
/*
532
* send slave address
533
*/
534
i2c_outbyte(theSlave | 0x01);
535
/*
536
* wait for ack
537
*/
538
if(!i2c_getack())
539
error = 1;
540
/*
541
* fetch register
542
*/
543
b = i2c_inbyte();
544
/*
545
* last received byte needs to be nacked
546
* instead of acked
547
*/
548
i2c_sendnack();
549
/*
550
* end sequence
551
*/
552
i2c_stop();
553
/*
554
* enable interrupt again
555
*/
556
local_irq_restore(flags);
557
558
} while(error && cntr--);
559
560
spin_unlock(&i2c_lock);
561
562
return b;
563
}
564
565
static int
566
i2c_open(struct inode *inode, struct file *filp)
567
{
568
return 0;
569
}
570
571
static int
572
i2c_release(struct inode *inode, struct file *filp)
573
{
574
return 0;
575
}
576
577
/* Main device API. ioctl's to write or read to/from i2c registers.
578
*/
579
580
static long i2c_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
581
{
582
if(_IOC_TYPE(cmd) != ETRAXI2C_IOCTYPE) {
583
return -EINVAL;
584
}
585
586
switch (_IOC_NR(cmd)) {
587
case I2C_WRITEREG:
588
/* write to an i2c slave */
589
D(printk(KERN_DEBUG "i2cw %d %d %d\n",
590
I2C_ARGSLAVE(arg),
591
I2C_ARGREG(arg),
592
I2C_ARGVALUE(arg)));
593
594
return i2c_writereg(I2C_ARGSLAVE(arg),
595
I2C_ARGREG(arg),
596
I2C_ARGVALUE(arg));
597
case I2C_READREG:
598
{
599
unsigned char val;
600
/* read from an i2c slave */
601
D(printk(KERN_DEBUG "i2cr %d %d ",
602
I2C_ARGSLAVE(arg),
603
I2C_ARGREG(arg)));
604
val = i2c_readreg(I2C_ARGSLAVE(arg), I2C_ARGREG(arg));
605
D(printk(KERN_DEBUG "= %d\n", val));
606
return val;
607
}
608
default:
609
return -EINVAL;
610
611
}
612
return 0;
613
}
614
615
static const struct file_operations i2c_fops = {
616
.owner = THIS_MODULE,
617
.unlocked_ioctl = i2c_ioctl,
618
.open = i2c_open,
619
.release = i2c_release,
620
.llseek = noop_llseek,
621
};
622
623
int __init
624
i2c_init(void)
625
{
626
static int res = 0;
627
static int first = 1;
628
629
if (!first) {
630
return res;
631
}
632
first = 0;
633
634
/* Setup and enable the Port B I2C interface */
635
636
#ifndef CONFIG_ETRAX_I2C_USES_PB_NOT_PB_I2C
637
if ((res = cris_request_io_interface(if_i2c, "I2C"))) {
638
printk(KERN_CRIT "i2c_init: Failed to get IO interface\n");
639
return res;
640
}
641
642
*R_PORT_PB_I2C = port_pb_i2c_shadow |=
643
IO_STATE(R_PORT_PB_I2C, i2c_en, on) |
644
IO_FIELD(R_PORT_PB_I2C, i2c_d, 1) |
645
IO_FIELD(R_PORT_PB_I2C, i2c_clk, 1) |
646
IO_STATE(R_PORT_PB_I2C, i2c_oe_, enable);
647
648
port_pb_dir_shadow &= ~IO_MASK(R_PORT_PB_DIR, dir0);
649
port_pb_dir_shadow &= ~IO_MASK(R_PORT_PB_DIR, dir1);
650
651
*R_PORT_PB_DIR = (port_pb_dir_shadow |=
652
IO_STATE(R_PORT_PB_DIR, dir0, input) |
653
IO_STATE(R_PORT_PB_DIR, dir1, output));
654
#else
655
if ((res = cris_io_interface_allocate_pins(if_i2c,
656
'b',
657
CONFIG_ETRAX_I2C_DATA_PORT,
658
CONFIG_ETRAX_I2C_DATA_PORT))) {
659
printk(KERN_WARNING "i2c_init: Failed to get IO pin for I2C data port\n");
660
return res;
661
} else if ((res = cris_io_interface_allocate_pins(if_i2c,
662
'b',
663
CONFIG_ETRAX_I2C_CLK_PORT,
664
CONFIG_ETRAX_I2C_CLK_PORT))) {
665
cris_io_interface_free_pins(if_i2c,
666
'b',
667
CONFIG_ETRAX_I2C_DATA_PORT,
668
CONFIG_ETRAX_I2C_DATA_PORT);
669
printk(KERN_WARNING "i2c_init: Failed to get IO pin for I2C clk port\n");
670
}
671
#endif
672
673
return res;
674
}
675
676
static int __init
677
i2c_register(void)
678
{
679
int res;
680
681
res = i2c_init();
682
if (res < 0)
683
return res;
684
res = register_chrdev(I2C_MAJOR, i2c_name, &i2c_fops);
685
if(res < 0) {
686
printk(KERN_ERR "i2c: couldn't get a major number.\n");
687
return res;
688
}
689
690
printk(KERN_INFO "I2C driver v2.2, (c) 1999-2004 Axis Communications AB\n");
691
692
return 0;
693
}
694
695
/* this makes sure that i2c_register is called during boot */
696
697
module_init(i2c_register);
698
699
/****************** END OF FILE i2c.c ********************************/
700
701