1 /*!***************************************************************************
5 *! DESCRIPTION: implements an interface for IIC/I2C, both directly from other
6 *! kernel modules (i2c_writereg/readreg) and from userspace using
9 *! Nov 30 1998 Torbjorn Eliasson Initial version.
10 *! Bjorn Wesen Elinux kernel version.
11 *! Jan 14 2000 Johan Adolfsson Fixed PB shadow register stuff -
12 *! don't use PB_I2C if DS1302 uses same bits,
15 *! Revision 1.13 2005/03/07 13:13:07 starvik
16 *! Added spinlocks to protect states etc
18 *! Revision 1.12 2005/01/05 06:11:22 starvik
19 *! No need to do local_irq_disable after local_irq_save.
21 *! Revision 1.11 2004/12/13 12:21:52 starvik
22 *! Added I/O and DMA allocators from Linux 2.4
24 *! Revision 1.9 2004/08/24 06:49:14 starvik
27 *! Revision 1.8 2004/06/08 08:48:26 starvik
28 *! Removed unused code
30 *! Revision 1.7 2004/05/28 09:26:59 starvik
31 *! Modified I2C initialization to work in 2.6.
33 *! Revision 1.6 2004/05/14 07:58:03 starvik
34 *! Merge of changes from 2.4
36 *! Revision 1.4 2002/12/11 13:13:57 starvik
37 *! Added arch/ to v10 specific includes
38 *! Added fix from Linux 2.4 in serial.c (flush_to_flip_buffer)
40 *! Revision 1.3 2002/11/20 11:56:11 starvik
41 *! Merge of Linux 2.5.48
43 *! Revision 1.2 2002/11/18 13:16:06 starvik
44 *! Linux 2.5 port of latest 2.4 drivers
46 *! Revision 1.9 2002/10/31 15:32:26 starvik
47 *! Update Port B register and shadow even when running with hardware support
48 *! to avoid glitches when reading bits
49 *! Never set direction to out in i2c_inbyte
50 *! Removed incorrect clock toggling at end of i2c_inbyte
52 *! Revision 1.8 2002/08/13 06:31:53 starvik
53 *! Made SDA and SCL line configurable
54 *! Modified i2c_inbyte to work with PCF8563
56 *! Revision 1.7 2001/04/04 13:11:36 markusl
57 *! Updated according to review remarks
59 *! Revision 1.6 2001/03/19 12:43:00 markusl
60 *! Made some symbols unstatic (used by the eeprom driver)
62 *! Revision 1.5 2001/02/27 13:52:48 bjornw
65 *! Revision 1.4 2001/02/15 07:17:40 starvik
66 *! Corrected usage if port_pb_i2c_shadow
68 *! Revision 1.3 2001/01/26 17:55:13 bjornw
69 *! * Made I2C_USES_PB_NOT_PB_I2C a CONFIG option instead of assigning it
70 *! magically. Config.in needs to set it for the options that need it, like
71 *! Dallas 1302 support. Actually, it should be default since it screws up
72 *! the PB bits even if you don't use I2C..
73 *! * Include linux/config.h to get the above
75 *! Revision 1.2 2001/01/18 15:49:30 bjornw
76 *! 2.4 port of I2C including some cleanups (untested of course)
78 *! Revision 1.1 2001/01/18 15:35:25 bjornw
79 *! Verbatim copy of the Etrax i2c driver, 2.0 elinux version
82 *! ---------------------------------------------------------------------------
84 *! (C) Copyright 1999-2002 Axis Communications AB, LUND, SWEDEN
86 *!***************************************************************************/
87 /* $Id: i2c.c,v 1.13 2005/03/07 13:13:07 starvik Exp $ */
89 /****************** INCLUDE FILES SECTION ***********************************/
91 #include <linux/module.h>
92 #include <linux/sched.h>
93 #include <linux/slab.h>
94 #include <linux/errno.h>
95 #include <linux/kernel.h>
97 #include <linux/string.h>
98 #include <linux/init.h>
100 #include <asm/etraxi2c.h>
102 #include <asm/system.h>
103 #include <asm/arch/svinto.h>
105 #include <asm/delay.h>
106 #include <asm/arch/io_interface_mux.h>
110 /****************** I2C DEFINITION SECTION *************************/
114 #define I2C_MAJOR 123 /* LOCAL/EXPERIMENTAL */
115 static const char i2c_name
[] = "i2c";
117 #define CLOCK_LOW_TIME 8
118 #define CLOCK_HIGH_TIME 8
119 #define START_CONDITION_HOLD_TIME 8
120 #define STOP_CONDITION_HOLD_TIME 8
121 #define ENABLE_OUTPUT 0x01
122 #define ENABLE_INPUT 0x00
123 #define I2C_CLOCK_HIGH 1
124 #define I2C_CLOCK_LOW 0
125 #define I2C_DATA_HIGH 1
126 #define I2C_DATA_LOW 0
128 #ifdef CONFIG_ETRAX_I2C_USES_PB_NOT_PB_I2C
129 /* Use PB and not PB_I2C */
130 #ifndef CONFIG_ETRAX_I2C_DATA_PORT
131 #define CONFIG_ETRAX_I2C_DATA_PORT 0
133 #ifndef CONFIG_ETRAX_I2C_CLK_PORT
134 #define CONFIG_ETRAX_I2C_CLK_PORT 1
137 #define SDABIT CONFIG_ETRAX_I2C_DATA_PORT
138 #define SCLBIT CONFIG_ETRAX_I2C_CLK_PORT
140 #define i2c_disable()
142 /* enable or disable output-enable, to select output or input on the i2c bus */
144 #define i2c_dir_out() \
145 REG_SHADOW_SET(R_PORT_PB_DIR, port_pb_dir_shadow, SDABIT, 1)
146 #define i2c_dir_in() \
147 REG_SHADOW_SET(R_PORT_PB_DIR, port_pb_dir_shadow, SDABIT, 0)
149 /* control the i2c clock and data signals */
152 REG_SHADOW_SET(R_PORT_PB_DATA, port_pb_data_shadow, SCLBIT, x)
153 #define i2c_data(x) \
154 REG_SHADOW_SET(R_PORT_PB_DATA, port_pb_data_shadow, SDABIT, x)
156 /* read a bit from the i2c interface */
158 #define i2c_getbit() (((*R_PORT_PB_READ & (1 << SDABIT))) >> SDABIT)
161 /* enable or disable the i2c interface */
163 #define i2c_enable() *R_PORT_PB_I2C = (port_pb_i2c_shadow |= IO_MASK(R_PORT_PB_I2C, i2c_en))
164 #define i2c_disable() *R_PORT_PB_I2C = (port_pb_i2c_shadow &= ~IO_MASK(R_PORT_PB_I2C, i2c_en))
166 /* enable or disable output-enable, to select output or input on the i2c bus */
168 #define i2c_dir_out() \
169 *R_PORT_PB_I2C = (port_pb_i2c_shadow &= ~IO_MASK(R_PORT_PB_I2C, i2c_oe_)); \
170 REG_SHADOW_SET(R_PORT_PB_DIR, port_pb_dir_shadow, 0, 1);
171 #define i2c_dir_in() \
172 *R_PORT_PB_I2C = (port_pb_i2c_shadow |= IO_MASK(R_PORT_PB_I2C, i2c_oe_)); \
173 REG_SHADOW_SET(R_PORT_PB_DIR, port_pb_dir_shadow, 0, 0);
175 /* control the i2c clock and data signals */
178 *R_PORT_PB_I2C = (port_pb_i2c_shadow = (port_pb_i2c_shadow & \
179 ~IO_MASK(R_PORT_PB_I2C, i2c_clk)) | IO_FIELD(R_PORT_PB_I2C, i2c_clk, (x))); \
180 REG_SHADOW_SET(R_PORT_PB_DATA, port_pb_data_shadow, 1, x);
182 #define i2c_data(x) \
183 *R_PORT_PB_I2C = (port_pb_i2c_shadow = (port_pb_i2c_shadow & \
184 ~IO_MASK(R_PORT_PB_I2C, i2c_d)) | IO_FIELD(R_PORT_PB_I2C, i2c_d, (x))); \
185 REG_SHADOW_SET(R_PORT_PB_DATA, port_pb_data_shadow, 0, x);
187 /* read a bit from the i2c interface */
189 #define i2c_getbit() (*R_PORT_PB_READ & 0x1)
192 /* use the kernels delay routine */
194 #define i2c_delay(usecs) udelay(usecs)
196 static DEFINE_SPINLOCK(i2c_lock
); /* Protect directions etc */
198 /****************** FUNCTION DEFINITION SECTION *************************/
201 /* generate i2c start condition */
210 i2c_delay(CLOCK_HIGH_TIME
/6);
211 i2c_data(I2C_DATA_HIGH
);
212 i2c_clk(I2C_CLOCK_HIGH
);
213 i2c_delay(CLOCK_HIGH_TIME
);
217 i2c_data(I2C_DATA_LOW
);
218 i2c_delay(START_CONDITION_HOLD_TIME
);
222 i2c_clk(I2C_CLOCK_LOW
);
223 i2c_delay(CLOCK_LOW_TIME
);
226 /* generate i2c stop condition */
236 i2c_clk(I2C_CLOCK_LOW
);
237 i2c_data(I2C_DATA_LOW
);
238 i2c_delay(CLOCK_LOW_TIME
*2);
242 i2c_clk(I2C_CLOCK_HIGH
);
243 i2c_delay(CLOCK_HIGH_TIME
*2);
247 i2c_data(I2C_DATA_HIGH
);
248 i2c_delay(STOP_CONDITION_HOLD_TIME
);
253 /* write a byte to the i2c interface */
256 i2c_outbyte(unsigned char x
)
262 for (i
= 0; i
< 8; i
++) {
264 i2c_data(I2C_DATA_HIGH
);
266 i2c_data(I2C_DATA_LOW
);
269 i2c_delay(CLOCK_LOW_TIME
/2);
270 i2c_clk(I2C_CLOCK_HIGH
);
271 i2c_delay(CLOCK_HIGH_TIME
);
272 i2c_clk(I2C_CLOCK_LOW
);
273 i2c_delay(CLOCK_LOW_TIME
/2);
276 i2c_data(I2C_DATA_LOW
);
277 i2c_delay(CLOCK_LOW_TIME
/2);
285 /* read a byte from the i2c interface */
290 unsigned char aBitByte
= 0;
293 /* Switch off I2C to get bit */
296 i2c_delay(CLOCK_HIGH_TIME
/2);
299 aBitByte
|= i2c_getbit();
303 i2c_delay(CLOCK_LOW_TIME
/2);
305 for (i
= 1; i
< 8; i
++) {
308 i2c_clk(I2C_CLOCK_HIGH
);
309 i2c_delay(CLOCK_HIGH_TIME
);
310 i2c_clk(I2C_CLOCK_LOW
);
311 i2c_delay(CLOCK_LOW_TIME
);
313 /* Switch off I2C to get bit */
316 i2c_delay(CLOCK_HIGH_TIME
/2);
319 aBitByte
|= i2c_getbit();
323 i2c_delay(CLOCK_LOW_TIME
/2);
325 i2c_clk(I2C_CLOCK_HIGH
);
326 i2c_delay(CLOCK_HIGH_TIME
);
329 * we leave the clock low, getbyte is usually followed
330 * by sendack/nack, they assume the clock to be low
332 i2c_clk(I2C_CLOCK_LOW
);
336 /*#---------------------------------------------------------------------------
338 *# FUNCTION NAME: i2c_getack
340 *# DESCRIPTION : checks if ack was received from ic2
342 *#--------------------------------------------------------------------------*/
353 * Release data bus by setting
356 i2c_data(I2C_DATA_HIGH
);
361 i2c_delay(CLOCK_HIGH_TIME
/4);
363 * generate ACK clock pulse
365 i2c_clk(I2C_CLOCK_HIGH
);
367 * Use PORT PB instead of I2C
368 * for input. (I2C not working)
381 i2c_delay(CLOCK_HIGH_TIME
/2);
387 i2c_delay(CLOCK_HIGH_TIME
/2);
389 if(!i2c_getbit()) /* receiver pulld SDA low */
391 i2c_delay(CLOCK_HIGH_TIME
/2);
395 * our clock is high now, make sure data is low
396 * before we enable our output. If we keep data high
397 * and enable output, we would generate a stop condition.
399 i2c_data(I2C_DATA_LOW
);
406 i2c_clk(I2C_CLOCK_LOW
);
407 i2c_delay(CLOCK_HIGH_TIME
/4);
413 * remove ACK clock pulse
415 i2c_data(I2C_DATA_HIGH
);
416 i2c_delay(CLOCK_LOW_TIME
/2);
420 /*#---------------------------------------------------------------------------
422 *# FUNCTION NAME: I2C::sendAck
424 *# DESCRIPTION : Send ACK on received data
426 *#--------------------------------------------------------------------------*/
433 i2c_delay(CLOCK_LOW_TIME
);
438 i2c_data(I2C_DATA_LOW
);
440 * generate clock pulse
442 i2c_delay(CLOCK_HIGH_TIME
/6);
443 i2c_clk(I2C_CLOCK_HIGH
);
444 i2c_delay(CLOCK_HIGH_TIME
);
445 i2c_clk(I2C_CLOCK_LOW
);
446 i2c_delay(CLOCK_LOW_TIME
/6);
450 i2c_data(I2C_DATA_HIGH
);
451 i2c_delay(CLOCK_LOW_TIME
);
456 /*#---------------------------------------------------------------------------
458 *# FUNCTION NAME: i2c_sendnack
460 *# DESCRIPTION : Sends NACK on received data
462 *#--------------------------------------------------------------------------*/
469 i2c_delay(CLOCK_LOW_TIME
);
474 i2c_data(I2C_DATA_HIGH
);
476 * generate clock pulse
478 i2c_delay(CLOCK_HIGH_TIME
/6);
479 i2c_clk(I2C_CLOCK_HIGH
);
480 i2c_delay(CLOCK_HIGH_TIME
);
481 i2c_clk(I2C_CLOCK_LOW
);
482 i2c_delay(CLOCK_LOW_TIME
);
487 /*#---------------------------------------------------------------------------
489 *# FUNCTION NAME: i2c_writereg
491 *# DESCRIPTION : Writes a value to an I2C device
493 *#--------------------------------------------------------------------------*/
495 i2c_writereg(unsigned char theSlave
, unsigned char theReg
,
496 unsigned char theValue
)
501 spin_lock(&i2c_lock
);
506 * we don't like to be interrupted
508 local_irq_save(flags
);
514 i2c_outbyte((theSlave
& 0xfe));
521 * now select register
526 * now it's time to wait for ack
531 * send register register data
533 i2c_outbyte(theValue
);
535 * now it's time to wait for ack
544 * enable interrupt again
546 local_irq_restore(flags
);
548 } while(error
&& cntr
--);
550 i2c_delay(CLOCK_LOW_TIME
);
552 spin_unlock(&i2c_lock
);
557 /*#---------------------------------------------------------------------------
559 *# FUNCTION NAME: i2c_readreg
561 *# DESCRIPTION : Reads a value from the decoder registers.
563 *#--------------------------------------------------------------------------*/
565 i2c_readreg(unsigned char theSlave
, unsigned char theReg
)
571 spin_lock(&i2c_lock
);
576 * we don't like to be interrupted
578 local_irq_save(flags
);
580 * generate start condition
587 i2c_outbyte((theSlave
& 0xfe));
594 * now select register
599 * now it's time to wait for ack
604 * repeat start condition
606 i2c_delay(CLOCK_LOW_TIME
);
611 i2c_outbyte(theSlave
| 0x01);
622 * last received byte needs to be nacked
631 * enable interrupt again
633 local_irq_restore(flags
);
635 } while(error
&& cntr
--);
637 spin_unlock(&i2c_lock
);
643 i2c_open(struct inode
*inode
, struct file
*filp
)
649 i2c_release(struct inode
*inode
, struct file
*filp
)
654 /* Main device API. ioctl's to write or read to/from i2c registers.
658 i2c_ioctl(struct inode
*inode
, struct file
*file
,
659 unsigned int cmd
, unsigned long arg
)
661 if(_IOC_TYPE(cmd
) != ETRAXI2C_IOCTYPE
) {
665 switch (_IOC_NR(cmd
)) {
667 /* write to an i2c slave */
668 D(printk("i2cw %d %d %d\n",
673 return i2c_writereg(I2C_ARGSLAVE(arg
),
679 /* read from an i2c slave */
680 D(printk("i2cr %d %d ",
683 val
= i2c_readreg(I2C_ARGSLAVE(arg
), I2C_ARGREG(arg
));
684 D(printk("= %d\n", val
));
695 static const struct file_operations i2c_fops
= {
696 .owner
= THIS_MODULE
,
699 .release
= i2c_release
,
706 static int first
= 1;
712 /* Setup and enable the Port B I2C interface */
714 #ifndef CONFIG_ETRAX_I2C_USES_PB_NOT_PB_I2C
715 if ((res
= cris_request_io_interface(if_i2c
, "I2C"))) {
716 printk(KERN_CRIT
"i2c_init: Failed to get IO interface\n");
720 *R_PORT_PB_I2C
= port_pb_i2c_shadow
|=
721 IO_STATE(R_PORT_PB_I2C
, i2c_en
, on
) |
722 IO_FIELD(R_PORT_PB_I2C
, i2c_d
, 1) |
723 IO_FIELD(R_PORT_PB_I2C
, i2c_clk
, 1) |
724 IO_STATE(R_PORT_PB_I2C
, i2c_oe_
, enable
);
726 port_pb_dir_shadow
&= ~IO_MASK(R_PORT_PB_DIR
, dir0
);
727 port_pb_dir_shadow
&= ~IO_MASK(R_PORT_PB_DIR
, dir1
);
729 *R_PORT_PB_DIR
= (port_pb_dir_shadow
|=
730 IO_STATE(R_PORT_PB_DIR
, dir0
, input
) |
731 IO_STATE(R_PORT_PB_DIR
, dir1
, output
));
733 if ((res
= cris_io_interface_allocate_pins(if_i2c
,
735 CONFIG_ETRAX_I2C_DATA_PORT
,
736 CONFIG_ETRAX_I2C_DATA_PORT
))) {
737 printk(KERN_WARNING
"i2c_init: Failed to get IO pin for I2C data port\n");
739 } else if ((res
= cris_io_interface_allocate_pins(if_i2c
,
741 CONFIG_ETRAX_I2C_CLK_PORT
,
742 CONFIG_ETRAX_I2C_CLK_PORT
))) {
743 cris_io_interface_free_pins(if_i2c
,
745 CONFIG_ETRAX_I2C_DATA_PORT
,
746 CONFIG_ETRAX_I2C_DATA_PORT
);
747 printk(KERN_WARNING
"i2c_init: Failed to get IO pin for I2C clk port\n");
762 res
= register_chrdev(I2C_MAJOR
, i2c_name
, &i2c_fops
);
764 printk(KERN_ERR
"i2c: couldn't get a major number.\n");
768 printk(KERN_INFO
"I2C driver v2.2, (c) 1999-2004 Axis Communications AB\n");
773 /* this makes sure that i2c_register is called during boot */
775 module_init(i2c_register
);
777 /****************** END OF FILE i2c.c ********************************/