| 1 | /*!*************************************************************************** |
| 2 | *! |
| 3 | *! FILE NAME : i2c.c |
| 4 | *! |
| 5 | *! |
| 6 | *! --------------------------------------------------------------------------- |
| 7 | *! |
| 8 | *! ( C ) Copyright 1999-2002 Axis Communications AB, LUND, SWEDEN |
| 9 | *! |
| 10 | *!***************************************************************************/ |
| 11 | |
| 12 | /******************** INCLUDE FILES SECTION ****************************/ |
| 13 | |
| 14 | #include <linux/module.h> |
| 15 | #include <linux/fs.h> |
| 16 | |
| 17 | #ifdef CONFIG_ETRAX_I2C_DYN_ALLOC |
| 18 | #include <linux/types.h> /* for dev_t */ |
| 19 | #include <linux/cdev.h> /* for struct cdev */ |
| 20 | #endif |
| 21 | |
| 22 | #include <linux/device.h> |
| 23 | |
| 24 | #include "etraxi2c.h" |
| 25 | |
| 26 | #include "i2c_errno.h" |
| 27 | |
| 28 | #include <asm/io.h> |
| 29 | #include <asm/delay.h> |
| 30 | #include <asm/arch/io_interface_mux.h> |
| 31 | #include <asm/uaccess.h> |
| 32 | |
| 33 | #include "i2c_gvc.h" |
| 34 | |
| 35 | MODULE_DESCRIPTION( "I2C Device Driver - 2.3" ); |
| 36 | |
| 37 | /*!********************************************************************* |
| 38 | *!History I2C driver Geert Vancompernolle |
| 39 | *!--------------------------------------- |
| 40 | *! |
| 41 | *! - v1.0: |
| 42 | *! First official version. |
| 43 | *! |
| 44 | *! - v1.1: |
| 45 | *! Changes to remove unwanted spikes at ACK/NACK time. |
| 46 | *! |
| 47 | *!*********************************************************************/ |
| 48 | |
| 49 | MODULE_LICENSE( "GPL" ); |
| 50 | |
| 51 | /****************** MACRO's **********************/ |
| 52 | |
| 53 | #define D( x ) |
| 54 | |
| 55 | #ifndef CONFIG_ETRAX_I2C_DYN_ALLOC |
| 56 | #define I2C_MAJOR 123 /* LOCAL/EXPERIMENTAL */ |
| 57 | #endif |
| 58 | |
| 59 | #define WAITONEUS 1 |
| 60 | /* Following are abbreviations taken from Philips I2C standard */ |
| 61 | /* Values are representing time in us and are rounded to next whole number, if relevant */ |
| 62 | #define THDSTA 4 /* Hold delay time for (repeated) START condition */ |
| 63 | #define TLOW 5 /* LOW period of the SCL clock */ |
| 64 | #define THDDAT 1 /* Hold delay time for DATA: value of 0 is allowed but 1 taken to be sure */ |
| 65 | #define TSUDAT 1 /* Set-up time for DATA */ |
| 66 | #define THIGH 4 /* HIGH period of the SCL clock */ |
| 67 | #define TSUSTA 5 /* Set-up time for a repeated START condition */ |
| 68 | #define TSUSTO 4 /* Set-up time for STOP condition */ |
| 69 | #define TBUF 5 /* Bus-free time between STOP and START condition */ |
| 70 | |
| 71 | #ifdef CONFIG_ETRAX_I2C_SLAVE_DELAY |
| 72 | #define MAXSCLRETRIES 100 |
| 73 | #endif |
| 74 | |
| 75 | #define MAXBUSFREERETRIES 5 |
| 76 | #define MAXRETRIES 3 |
| 77 | #define WRITEADDRESS_MASK ( 0xFE ) |
| 78 | #define READADDRESS_MASK ( 0x01 ) |
| 79 | |
| 80 | #define SCL_HIGH 1 |
| 81 | #define SCL_LOW 0 |
| 82 | #define SDA_HIGH 1 |
| 83 | #define SDA_LOW 0 |
| 84 | |
| 85 | #ifdef CONFIG_ETRAX_I2C_USES_PB_NOT_PB_I2C |
| 86 | /* Use PB and not PB_I2C */ |
| 87 | #ifndef CONFIG_ETRAX_I2C_DATA_PORT |
| 88 | #define CONFIG_ETRAX_I2C_DATA_PORT 0 |
| 89 | #endif |
| 90 | #ifndef CONFIG_ETRAX_I2C_CLK_PORT |
| 91 | #define CONFIG_ETRAX_I2C_CLK_PORT 1 |
| 92 | #endif |
| 93 | |
| 94 | #define SDABIT CONFIG_ETRAX_I2C_DATA_PORT |
| 95 | #define SCLBIT CONFIG_ETRAX_I2C_CLK_PORT |
| 96 | #define i2c_enable() |
| 97 | #define i2c_disable() |
| 98 | |
| 99 | /* enable or disable output-enable, to select output or input on the i2c bus */ |
| 100 | #define i2c_sda_dir_out() \ |
| 101 | REG_SHADOW_SET( R_PORT_PB_DIR, port_pb_dir_shadow, SDABIT, 1 ) |
| 102 | #define i2c_sda_dir_in() \ |
| 103 | REG_SHADOW_SET( R_PORT_PB_DIR, port_pb_dir_shadow, SDABIT, 0 ) |
| 104 | |
| 105 | #ifdef CONFIG_ETRAX_I2C_SLAVE_DELAY |
| 106 | #define i2c_scl_dir_out() \ |
| 107 | REG_SHADOW_SET( R_PORT_PB_DIR, port_pb_dir_shadow, SCLBIT, 1 ) |
| 108 | #define i2c_scl_dir_in() \ |
| 109 | REG_SHADOW_SET( R_PORT_PB_DIR, port_pb_dir_shadow, SCLBIT, 0 ) |
| 110 | #endif |
| 111 | |
| 112 | /* control the i2c clock and data signals */ |
| 113 | #define i2c_set_scl( x ) \ |
| 114 | REG_SHADOW_SET( R_PORT_PB_DATA, port_pb_data_shadow, SCLBIT, x ) |
| 115 | #define i2c_set_sda( x ) \ |
| 116 | REG_SHADOW_SET( R_PORT_PB_DATA, port_pb_data_shadow, SDABIT, x ) |
| 117 | |
| 118 | /* read status of SDA bit from the i2c interface */ |
| 119 | #define i2c_sda_is_high() ( ( ( *R_PORT_PB_READ & ( 1 << SDABIT ) ) ) >> SDABIT ) |
| 120 | |
| 121 | /* read status of SCL bit from the i2c interface */ |
| 122 | #define i2c_scl_is_high() ( ( ( *R_PORT_PB_READ & ( 1 << SCLBIT ) ) ) >> SCLBIT ) |
| 123 | |
| 124 | #else |
| 125 | /* enable or disable the i2c interface */ |
| 126 | #define i2c_enable() *R_PORT_PB_I2C = ( port_pb_i2c_shadow |= IO_MASK( R_PORT_PB_I2C, i2c_en ) ) |
| 127 | #define i2c_disable() *R_PORT_PB_I2C = ( port_pb_i2c_shadow &= ~IO_MASK( R_PORT_PB_I2C, i2c_en ) ) |
| 128 | |
| 129 | /* enable or disable output-enable, to select output or input on the i2c bus */ |
| 130 | #define i2c_sda_dir_out() \ |
| 131 | *R_PORT_PB_I2C = ( port_pb_i2c_shadow &= ~IO_MASK( R_PORT_PB_I2C, i2c_oe_ ) ); \ |
| 132 | REG_SHADOW_SET( R_PORT_PB_DIR, port_pb_dir_shadow, 0, 1 ); |
| 133 | #define i2c_sda_dir_in() \ |
| 134 | *R_PORT_PB_I2C = ( port_pb_i2c_shadow |= IO_MASK( R_PORT_PB_I2C, i2c_oe_ ) ); \ |
| 135 | REG_SHADOW_SET( R_PORT_PB_DIR, port_pb_dir_shadow, 0, 0 ); |
| 136 | |
| 137 | /* control the i2c clock and data signals */ |
| 138 | #define i2c_set_scl( x ) \ |
| 139 | *R_PORT_PB_I2C = ( port_pb_i2c_shadow = ( port_pb_i2c_shadow & \ |
| 140 | ~IO_MASK( R_PORT_PB_I2C, i2c_set_scl ) ) | IO_FIELD( R_PORT_PB_I2C, i2c_set_scl, ( x ) ) ); \ |
| 141 | REG_SHADOW_SET( R_PORT_PB_DATA, port_pb_data_shadow, 1, x ); |
| 142 | |
| 143 | #define i2c_set_sda( x ) \ |
| 144 | *R_PORT_PB_I2C = ( port_pb_i2c_shadow = ( port_pb_i2c_shadow & \ |
| 145 | ~IO_MASK( R_PORT_PB_I2C, i2c_d ) ) | IO_FIELD( R_PORT_PB_I2C, i2c_d, ( x ) ) ); \ |
| 146 | REG_SHADOW_SET( R_PORT_PB_DATA, port_pb_data_shadow, 0, x ); |
| 147 | |
| 148 | /* read a bit from the i2c interface */ |
| 149 | #define i2c_sda_is_high() ( *R_PORT_PB_READ & 0x1 ) |
| 150 | #endif |
| 151 | |
| 152 | /* use the kernels delay routine */ |
| 153 | #define i2c_delay( usecs ) udelay( usecs ) |
| 154 | |
| 155 | |
| 156 | /****************** TYPEDEF's **********************/ |
| 157 | |
| 158 | |
| 159 | /****************** STATIC (file scope) VARIABLES **********************/ |
| 160 | static DEFINE_SPINLOCK( i2c_lock ); /* Protect directions etc */ |
| 161 | static const char i2c_name[] = "i2c"; |
| 162 | |
| 163 | |
| 164 | |
| 165 | /****************** PROTOTYPING SECTION *************************/ |
| 166 | static int i2c_open( struct inode *inode, struct file *filp ); |
| 167 | static int i2c_release( struct inode *inode, struct file *filp ); |
| 168 | static int i2c_command( unsigned char slave |
| 169 | , unsigned char* wbuf |
| 170 | , unsigned char wlen |
| 171 | , unsigned char* rbuf |
| 172 | , unsigned char rlen |
| 173 | ); |
| 174 | static int i2c_bus_free_check( unsigned char maxretries ); |
| 175 | static void i2c_finalise( const char* text, unsigned long irqflags ); |
| 176 | |
| 177 | |
| 178 | /************************************************************************/ |
| 179 | /****************** AUXILIARIES *************************/ |
| 180 | /************************************************************************/ |
| 181 | |
| 182 | /*#--------------------------------------------------------------------------- |
| 183 | *# |
| 184 | *# FUNCTION NAME: i2c_open |
| 185 | *# |
| 186 | *# DESCRIPTION : opens an I2C device |
| 187 | *# |
| 188 | *# PARAMETERS : *inode: reference to inode |
| 189 | *# *filp : reference to file pointer |
| 190 | *# |
| 191 | *#--------------------------------------------------------------------------- |
| 192 | */ |
| 193 | static int i2c_open( struct inode *inode, struct file *filp ) |
| 194 | { |
| 195 | return 0; |
| 196 | } /* i2c_open */ |
| 197 | |
| 198 | |
| 199 | /*#--------------------------------------------------------------------------- |
| 200 | *# |
| 201 | *# FUNCTION NAME: i2c_release |
| 202 | *# |
| 203 | *# DESCRIPTION : Releases the I2C device |
| 204 | *# |
| 205 | *# PARAMETERS : *inode: reference to inode |
| 206 | *# *filp : reference to file pointer |
| 207 | *# |
| 208 | *#--------------------------------------------------------------------------- |
| 209 | */ |
| 210 | static int i2c_release( struct inode *inode, struct file *filp ) |
| 211 | { |
| 212 | return 0; |
| 213 | } /* i2c_release */ |
| 214 | |
| 215 | |
| 216 | /*#--------------------------------------------------------------------------- |
| 217 | *# |
| 218 | *# FUNCTION NAME: i2c_ioctl |
| 219 | *# |
| 220 | *# DESCRIPTION : Main device API: ioctl's to write/read |
| 221 | *# to/from i2c registers |
| 222 | *# |
| 223 | *# PARAMETERS : *inode: reference to inode |
| 224 | *# *filp : reference to file pointer |
| 225 | *# cmd : command to be executed during the ioctl call |
| 226 | *# arg : pointer to a structure with the data??? |
| 227 | *# |
| 228 | *# RETURN : result of the ioctl call |
| 229 | *# |
| 230 | *#--------------------------------------------------------------------------- |
| 231 | */ |
| 232 | static int i2c_ioctl( struct inode *inode |
| 233 | , struct file *file |
| 234 | , unsigned int cmd |
| 235 | , unsigned long arg |
| 236 | ) |
| 237 | { |
| 238 | /* the acme ioctls */ |
| 239 | I2C_DATA i2cdata; |
| 240 | int RetVal = EI2CNOERRORS; |
| 241 | |
| 242 | if ( _IOC_TYPE( cmd ) != ETRAXI2C_IOCTYPE ) |
| 243 | { |
| 244 | return ( -EINVAL ); |
| 245 | } |
| 246 | |
| 247 | switch ( _IOC_NR( cmd ) ) |
| 248 | { |
| 249 | case I2C_WRITEREG: |
| 250 | /* write to an i2c slave */ |
| 251 | RetVal = i2c_writereg( I2C_ARGSLAVE( arg ) |
| 252 | , I2C_ARGREG( arg ) |
| 253 | , I2C_ARGVALUE( arg ) |
| 254 | ); |
| 255 | break; |
| 256 | |
| 257 | case I2C_READREG: |
| 258 | RetVal = i2c_readreg( I2C_ARGSLAVE( arg ), I2C_ARGREG( arg ) ); |
| 259 | break; |
| 260 | |
| 261 | /* New functions added by GVC */ |
| 262 | case I2C_READ: |
| 263 | copy_from_user( (char*)&i2cdata, (char*)arg, sizeof( I2C_DATA ) ); |
| 264 | { |
| 265 | int RetryCntr = MAXRETRIES; |
| 266 | |
| 267 | do |
| 268 | { |
| 269 | RetVal = i2c_command( i2cdata.slave |
| 270 | , NULL |
| 271 | , 0 |
| 272 | , i2cdata.rbuf |
| 273 | , i2cdata.rlen |
| 274 | ); |
| 275 | } while ( ( EI2CNOERRORS != RetVal ) |
| 276 | &&( --RetryCntr ) |
| 277 | ); |
| 278 | } |
| 279 | copy_to_user( (char*)arg, (char*)&i2cdata, sizeof( I2C_DATA ) ); |
| 280 | break; |
| 281 | |
| 282 | case I2C_WRITE: |
| 283 | copy_from_user( (char*)&i2cdata, (char*)arg, sizeof( I2C_DATA ) ); |
| 284 | { |
| 285 | int RetryCntr = MAXRETRIES; |
| 286 | |
| 287 | do |
| 288 | { |
| 289 | RetVal = i2c_command( i2cdata.slave |
| 290 | , i2cdata.wbuf |
| 291 | , i2cdata.wlen |
| 292 | , NULL |
| 293 | , 0 |
| 294 | ); |
| 295 | } while ( ( EI2CNOERRORS != RetVal ) |
| 296 | &&( --RetryCntr ) |
| 297 | ); |
| 298 | } |
| 299 | break; |
| 300 | |
| 301 | case I2C_WRITEREAD: |
| 302 | copy_from_user( (char*)&i2cdata, (char*)arg, sizeof( I2C_DATA ) ); |
| 303 | { |
| 304 | int RetryCntr = MAXRETRIES; |
| 305 | |
| 306 | do |
| 307 | { |
| 308 | RetVal = i2c_command( i2cdata.slave |
| 309 | , i2cdata.wbuf |
| 310 | , i2cdata.wlen |
| 311 | , i2cdata.rbuf |
| 312 | , i2cdata.rlen |
| 313 | ); |
| 314 | } while ( ( EI2CNOERRORS != RetVal ) |
| 315 | &&( --RetryCntr ) |
| 316 | ); |
| 317 | } |
| 318 | copy_to_user( (char*)arg, (char*)&i2cdata, sizeof( I2C_DATA ) ); |
| 319 | break; |
| 320 | |
| 321 | default: |
| 322 | RetVal = -EINVAL; |
| 323 | } |
| 324 | |
| 325 | return ( -RetVal ); |
| 326 | } /* i2c_ioctl */ |
| 327 | |
| 328 | |
| 329 | /*#--------------------------------------------------------------------------- |
| 330 | *# |
| 331 | *# FUNCTION NAME: i2c_command |
| 332 | *# |
| 333 | *# DESCRIPTION : general routine to read/write bytes from an I2C device |
| 334 | *# |
| 335 | *# 'i2c_command()' sends wlen bytes to the I2c bus and receives |
| 336 | *# rlen bytes from the I2c bus. |
| 337 | *# The data to be send must be placed in wbuf[ 0 ] upto wbuf[ wlen - 1 ). |
| 338 | *# The data to be received is assembled in rbuf[ 0 ] upto rbuf[ rlen - 1 ]. |
| 339 | *# |
| 340 | *# If no data is to be sent or received, put appropriate buffer parameter |
| 341 | *# to "NULL" and appropriate length parameter to "0". |
| 342 | *# |
| 343 | *# PARAMETERS : slave = slave address of the I2C device |
| 344 | *# wbuf = address of first element of write buffer (wbuf) |
| 345 | *# wlen = number of bytes to be written to slave |
| 346 | *# rbuf = address of first element of read buffer (rbuf) |
| 347 | *# rlen = number of bytes to be read from slave |
| 348 | *# |
| 349 | *# RETURN : |
| 350 | *# EI2CNOERRORS: I2C communication went fine |
| 351 | *# EI2CBUSNFREE: I2C bus is not free |
| 352 | *# EI2CWADDRESS: I2C write address failed |
| 353 | *# EI2CRADDRESS: I2C read address failed |
| 354 | *# EI2CSENDDATA: I2C send data failed |
| 355 | *# EI2CRECVDATA: I2C receive data failed |
| 356 | *# EI2CSTRTCOND: I2C start condition failed |
| 357 | *# EI2CRSTACOND: I2C repeated start condition failed |
| 358 | *# EI2CSTOPCOND: I2C stop condition failed |
| 359 | *# EI2CNOSNDBYT: I2C no bytes to be sent |
| 360 | *# EI2CNOSNDBUF: I2C no send buffer defined |
| 361 | *# EI2CNORCVBYT: I2C no bytes to be received |
| 362 | *# EI2CNORCVBUF: I2C no receive buffer defined |
| 363 | *# EI2CNOACKNLD: I2C no acknowledge received |
| 364 | *# |
| 365 | *# REMARK : |
| 366 | *# First, the send part is completed. |
| 367 | *# In the send routine, there is no stop generated. This is because maybe |
| 368 | *# a repeated start condition must be generated. |
| 369 | *# This happens when we want to receive some data from the I2c bus. If not, |
| 370 | *# at the end of the general I2c loop the stopcondition is generated. |
| 371 | *# If, on the contrary, there are a number of bytes to be received, a new |
| 372 | *# startcondition is generated in the 'if' part of the main I2c routine, |
| 373 | *# which controls the receiving part. |
| 374 | *# Only when the receiving of data is finished, a final stopcondition is |
| 375 | *# generated. |
| 376 | *# |
| 377 | *#--------------------------------------------------------------------------- |
| 378 | */ |
| 379 | static int i2c_command( unsigned char slave |
| 380 | , unsigned char* wbuf |
| 381 | , unsigned char wlen |
| 382 | , unsigned char* rbuf |
| 383 | , unsigned char rlen |
| 384 | ) |
| 385 | { |
| 386 | /* Check arguments and report error if relevant... */ |
| 387 | if ( ( wlen > 0 ) && ( wbuf == NULL ) ) |
| 388 | { |
| 389 | printk( KERN_DEBUG "I2C: EI2CNOSNDBUF\n" ); |
| 390 | return ( EI2CNOSNDBUF ); |
| 391 | } |
| 392 | else if ( ( wlen == 0 ) && ( wbuf != NULL ) ) |
| 393 | { |
| 394 | printk( KERN_DEBUG "I2C: EI2CNOSNDBYT\n" ); |
| 395 | return ( EI2CNOSNDBYT ); |
| 396 | } |
| 397 | else if ( ( rlen > 0 ) && ( rbuf == NULL ) ) |
| 398 | { |
| 399 | printk( KERN_DEBUG "I2C: EI2CNORCVBUF\n" ); |
| 400 | return ( EI2CNORCVBUF ); |
| 401 | } |
| 402 | else if ( ( rlen == 0 ) && ( rbuf != NULL ) ) |
| 403 | { |
| 404 | printk( KERN_DEBUG "I2C: EI2CNORCVBYT\n" ); |
| 405 | return ( EI2CNORCVBYT ); |
| 406 | } |
| 407 | else if ( EI2CBUSNFREE == i2c_bus_free_check( MAXBUSFREERETRIES ) ) |
| 408 | { |
| 409 | /* There's no need to try more, since we weren't even |
| 410 | * able to start the I2C communication. |
| 411 | * So, no IRQ flags are stored yet, no changes to any other |
| 412 | * stuff like START, STOP, SENDBYTES... |
| 413 | * Result, simply write down the error and return the correct error code. |
| 414 | */ |
| 415 | printk( KERN_DEBUG "I2C: EI2CBUSNFREE\n" ); |
| 416 | return ( EI2CBUSNFREE ); |
| 417 | } |
| 418 | else |
| 419 | { |
| 420 | /* Finally... We made it... */ |
| 421 | unsigned long irqflags = 0; |
| 422 | |
| 423 | /* we don't like to be interrupted */ |
| 424 | local_irq_save( irqflags ); |
| 425 | |
| 426 | /* Check if there are bytes to be send, |
| 427 | * or if you immediately want to receive data. |
| 428 | */ |
| 429 | if ( 0 < wlen ) |
| 430 | { |
| 431 | /* start I2C communication */ |
| 432 | if ( EI2CNOERRORS != i2c_start() ) |
| 433 | { |
| 434 | return ( i2c_finalise( "I2C: EI2CSTRTCOND\n", irqflags ) |
| 435 | , EI2CSTRTCOND |
| 436 | ); |
| 437 | } |
| 438 | |
| 439 | /* send slave address: xxxxxxx0B (last bit must be zero) */ |
| 440 | if ( EI2CNOERRORS != i2c_outbyte( slave & WRITEADDRESS_MASK ) ) |
| 441 | { |
| 442 | return ( i2c_finalise( "I2C: EI2CWADDRESS\n", irqflags ) |
| 443 | , EI2CWADDRESS |
| 444 | ); |
| 445 | } |
| 446 | |
| 447 | while ( wlen-- ) |
| 448 | { |
| 449 | /* send register data */ |
| 450 | if ( EI2CNOERRORS != i2c_outbyte( *wbuf ) && wlen ) |
| 451 | { |
| 452 | return ( i2c_finalise( "I2C: EI2CSENDDATA\n", irqflags ) |
| 453 | , EI2CSENDDATA |
| 454 | ); |
| 455 | } |
| 456 | |
| 457 | wbuf++; |
| 458 | }; |
| 459 | |
| 460 | i2c_delay( TLOW ); |
| 461 | } |
| 462 | |
| 463 | /* |
| 464 | * Receiving data from I2c_bus |
| 465 | * If there are bytes to be received, a new start condition is |
| 466 | * generated => Repeated Startcondition. |
| 467 | * A final stopcondition is generated at the end of the main I2c |
| 468 | * routine. |
| 469 | */ |
| 470 | if ( 0 < rlen ) |
| 471 | { |
| 472 | /* |
| 473 | * Generate start condition if wlen == 0 |
| 474 | * or repeated start condition if wlen != 0... |
| 475 | */ |
| 476 | if ( EI2CNOERRORS != i2c_start() ) |
| 477 | { |
| 478 | return ( i2c_finalise( ( ( 0 < wlen ) |
| 479 | ? "I2C: EI2CRSTACOND\n" |
| 480 | : "I2C: EI2CSTRTCOND\n" |
| 481 | ) |
| 482 | , irqflags |
| 483 | ) |
| 484 | , ( ( 0 < wlen ) ? EI2CRSTACOND : EI2CSTRTCOND ) |
| 485 | ); |
| 486 | } |
| 487 | |
| 488 | /* Send ReadAddress: xxxxxxx1B (last bit must be one) */ |
| 489 | if ( EI2CNOERRORS != i2c_outbyte( slave | READADDRESS_MASK ) ) |
| 490 | { |
| 491 | return ( i2c_finalise( "I2C: EI2CRADDRESS\n", irqflags ) |
| 492 | , EI2CRADDRESS |
| 493 | ); |
| 494 | } |
| 495 | |
| 496 | while ( rlen-- ) |
| 497 | { |
| 498 | /* fetch register */ |
| 499 | *rbuf = i2c_inbyte(); |
| 500 | rbuf++; |
| 501 | |
| 502 | /* last received byte needs to be NACK-ed instead of ACK-ed */ |
| 503 | if ( rlen ) |
| 504 | { |
| 505 | i2c_sendack(); |
| 506 | } |
| 507 | else |
| 508 | { |
| 509 | i2c_sendnack(); |
| 510 | } |
| 511 | }; |
| 512 | } |
| 513 | |
| 514 | /* Generate final stop condition */ |
| 515 | if ( EI2CNOERRORS != i2c_stop() ) |
| 516 | { |
| 517 | return ( i2c_finalise( "I2C CMD: EI2CSTOPCOND\n", irqflags ) |
| 518 | , EI2CSTOPCOND |
| 519 | ); |
| 520 | } |
| 521 | |
| 522 | /* enable interrupt again */ |
| 523 | local_irq_restore( irqflags ); |
| 524 | } |
| 525 | |
| 526 | return ( EI2CNOERRORS ); |
| 527 | } /* i2c_command */ |
| 528 | |
| 529 | |
| 530 | /*#--------------------------------------------------------------------------- |
| 531 | *# |
| 532 | *# FUNCTION NAME: i2c_bus_free_check |
| 533 | *# |
| 534 | *# DESCRIPTION : checks if the I2C bus is free before starting |
| 535 | *# an I2C communication |
| 536 | *# |
| 537 | *# PARAMETERS : maxretries, the number of times we will try to release |
| 538 | *# the I2C bus |
| 539 | *# |
| 540 | *# RETURN : I2cStatus_I2cBusNotFreeError in case the bus is not free, |
| 541 | *# I2cStatus_I2cNoError otherwise |
| 542 | *# |
| 543 | *#--------------------------------------------------------------------------- |
| 544 | */ |
| 545 | static int i2c_bus_free_check( unsigned char maxretries ) |
| 546 | { |
| 547 | i2c_sda_dir_in(); /* Release SDA line */ |
| 548 | i2c_set_scl( SCL_HIGH ); /* put SCL line high */ |
| 549 | |
| 550 | i2c_delay( WAITONEUS ); |
| 551 | |
| 552 | while ( ( !i2c_sda_is_high() || !i2c_scl_is_high() ) |
| 553 | &&( maxretries-- ) |
| 554 | ) |
| 555 | { |
| 556 | /* Try to release I2C bus by generating STOP conditions */ |
| 557 | i2c_stop(); |
| 558 | } |
| 559 | |
| 560 | if ( 0 == maxretries ) |
| 561 | { |
| 562 | printk( KERN_DEBUG "I2C: EI2CBUSNFREE\n" ); |
| 563 | return ( EI2CBUSNFREE ); |
| 564 | } |
| 565 | else |
| 566 | { |
| 567 | return ( EI2CNOERRORS ); |
| 568 | } |
| 569 | } /* i2c_bus_free_check */ |
| 570 | |
| 571 | |
| 572 | static void i2c_finalise( const char* errortxt |
| 573 | , unsigned long irqflags |
| 574 | ) |
| 575 | { |
| 576 | printk( KERN_DEBUG "%s", errortxt ); |
| 577 | local_irq_restore( irqflags ); |
| 578 | /* The least we can do when things go terribly wrong, |
| 579 | * is to try to release the bus. |
| 580 | * If this fails, well, then I don't know |
| 581 | * what I can do more for the moment... |
| 582 | */ |
| 583 | (void)i2c_bus_free_check( MAXBUSFREERETRIES ); |
| 584 | } /* i2c_finalise */ |
| 585 | |
| 586 | |
| 587 | static struct file_operations i2c_fops = |
| 588 | { |
| 589 | .owner = THIS_MODULE |
| 590 | , .ioctl = i2c_ioctl |
| 591 | , .open = i2c_open |
| 592 | , .release = i2c_release |
| 593 | }; |
| 594 | |
| 595 | |
| 596 | /***********************************************************************/ |
| 597 | /************* EXTERNAL FUNCTION DEFINITION SECTION ********************/ |
| 598 | /***********************************************************************/ |
| 599 | |
| 600 | /*#--------------------------------------------------------------------------- |
| 601 | *# |
| 602 | *# FUNCTION NAME: i2c_init |
| 603 | *# |
| 604 | *# DESCRIPTION : initialises the I2C device driver |
| 605 | *# |
| 606 | *# PARAMETERS : |
| 607 | *# |
| 608 | *#--------------------------------------------------------------------------- |
| 609 | */ |
| 610 | int __init i2c_init( void ) |
| 611 | { |
| 612 | static int res = 0; |
| 613 | static int first = 1; |
| 614 | |
| 615 | if ( !first ) |
| 616 | { |
| 617 | return res; |
| 618 | } |
| 619 | |
| 620 | first = 0; |
| 621 | |
| 622 | /* Setup and enable the Port B I2C interface */ |
| 623 | |
| 624 | #ifndef CONFIG_ETRAX_I2C_USES_PB_NOT_PB_I2C |
| 625 | /* here, we're using the dedicated I2C pins of FoxBoard */ |
| 626 | if ( ( res = cris_request_io_interface( if_i2c, "I2C" ) ) ) |
| 627 | { |
| 628 | printk( KERN_CRIT "i2c_init: Failed to get IO interface\n" ); |
| 629 | return res; |
| 630 | } |
| 631 | |
| 632 | *R_PORT_PB_I2C = port_pb_i2c_shadow |= |
| 633 | IO_STATE( R_PORT_PB_I2C, i2c_en, on ) | |
| 634 | IO_FIELD( R_PORT_PB_I2C, i2c_d, 1 ) | |
| 635 | IO_FIELD( R_PORT_PB_I2C, i2c_set_scl, 1 ) | |
| 636 | IO_STATE( R_PORT_PB_I2C, i2c_oe_, enable ); |
| 637 | |
| 638 | port_pb_dir_shadow &= ~IO_MASK( R_PORT_PB_DIR, dir0 ); |
| 639 | port_pb_dir_shadow &= ~IO_MASK( R_PORT_PB_DIR, dir1 ); |
| 640 | |
| 641 | *R_PORT_PB_DIR = ( port_pb_dir_shadow |= |
| 642 | IO_STATE( R_PORT_PB_DIR, dir0, input ) | |
| 643 | IO_STATE( R_PORT_PB_DIR, dir1, output ) ); |
| 644 | #else |
| 645 | /* If everything goes fine, res = 0, meaning "if" fails => |
| 646 | * will do the "else" too and as such initialise the clock port... |
| 647 | * Clever trick! |
| 648 | */ |
| 649 | if ( ( res = cris_io_interface_allocate_pins( if_i2c |
| 650 | , 'b' |
| 651 | , CONFIG_ETRAX_I2C_DATA_PORT |
| 652 | , CONFIG_ETRAX_I2C_DATA_PORT |
| 653 | ) |
| 654 | ) |
| 655 | ) |
| 656 | { |
| 657 | printk( KERN_WARNING "i2c_init: Failed to get IO pin for I2C data port\n" ); |
| 658 | return ( res ); |
| 659 | } |
| 660 | /* Same here...*/ |
| 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 | ) |
| 666 | ) |
| 667 | ) |
| 668 | { |
| 669 | cris_io_interface_free_pins( if_i2c |
| 670 | , 'b' |
| 671 | , CONFIG_ETRAX_I2C_DATA_PORT |
| 672 | , CONFIG_ETRAX_I2C_DATA_PORT |
| 673 | ); |
| 674 | printk( KERN_WARNING "i2c_init: Failed to get IO pin for I2C clk port\n" ); |
| 675 | } |
| 676 | #endif |
| 677 | |
| 678 | return ( res ); |
| 679 | } /* i2c_init */ |
| 680 | |
| 681 | |
| 682 | /*#--------------------------------------------------------------------------- |
| 683 | *# |
| 684 | *# FUNCTION NAME: i2c_register |
| 685 | *# |
| 686 | *# DESCRIPTION : this registers the i2c driver as a character device |
| 687 | *# |
| 688 | *# PARAMETERS : |
| 689 | *# |
| 690 | *#--------------------------------------------------------------------------- |
| 691 | */ |
| 692 | |
| 693 | static struct class *i2c_class; |
| 694 | |
| 695 | static int __init i2c_register( void ) |
| 696 | { |
| 697 | int res; |
| 698 | #ifdef CONFIG_ETRAX_I2C_DYN_ALLOC |
| 699 | dev_t devt; |
| 700 | struct cdev *my_i2cdev = NULL; |
| 701 | #endif |
| 702 | |
| 703 | res = i2c_init(); |
| 704 | |
| 705 | if ( res < 0 ) |
| 706 | { |
| 707 | return res; |
| 708 | } |
| 709 | |
| 710 | #ifdef CONFIG_ETRAX_I2C_DYN_ALLOC |
| 711 | res = alloc_chrdev_region( &devt, 0, 1, i2c_name ); |
| 712 | |
| 713 | if ( res < 0 ) |
| 714 | { |
| 715 | printk( KERN_DEBUG "I2C: EI2CNOMNUMBR\n" ); |
| 716 | return ( res ); |
| 717 | } |
| 718 | |
| 719 | my_i2cdev = cdev_alloc(); |
| 720 | my_i2cdev->ops = &i2c_fops; |
| 721 | my_i2cdev->owner = THIS_MODULE; |
| 722 | |
| 723 | /* make device "alive" */ |
| 724 | res = cdev_add( my_i2cdev, devt, 1 ); |
| 725 | |
| 726 | if ( res < 0 ) |
| 727 | { |
| 728 | printk( KERN_DEBUG "I2C: EI2CDADDFAIL\n" ); |
| 729 | return ( res ); |
| 730 | } |
| 731 | |
| 732 | int i2c_major = MAJOR( devt ); |
| 733 | #else |
| 734 | res = register_chrdev( I2C_MAJOR, i2c_name, &i2c_fops ); |
| 735 | |
| 736 | if ( res < 0 ) |
| 737 | { |
| 738 | printk( KERN_ERR "i2c: couldn't get a major number.\n" ); |
| 739 | return res; |
| 740 | } |
| 741 | |
| 742 | int i2c_major = I2C_MAJOR; |
| 743 | #endif |
| 744 | |
| 745 | printk( KERN_INFO "I2C: driver v2.3, (c) 1999-2004 Axis Communications AB\n" ); |
| 746 | printk( KERN_INFO "I2C: Improvements by Geert Vancompernolle, Positive Going, BK srl\n" ); |
| 747 | |
| 748 | #ifdef CONFIG_ETRAX_I2C_SLAVE_DELAY |
| 749 | printk( KERN_INFO "I2C: with master/slave delay patch\n" ); |
| 750 | #endif |
| 751 | |
| 752 | i2c_class = class_create (THIS_MODULE, "i2c_etrax"); |
| 753 | device_create (i2c_class, NULL, |
| 754 | MKDEV(i2c_major,0), NULL, i2c_name); |
| 755 | |
| 756 | return ( 0 ); |
| 757 | } /* i2c_register */ |
| 758 | |
| 759 | |
| 760 | /*#--------------------------------------------------------------------------- |
| 761 | *# |
| 762 | *# FUNCTION NAME: i2c_start |
| 763 | *# |
| 764 | *# DESCRIPTION : generate i2c start condition |
| 765 | *# |
| 766 | *# PARAMETERS : none |
| 767 | *# |
| 768 | *# RETURN : EI2CNOERRORS if OK, EI2CSTRTCOND otherwise |
| 769 | *# |
| 770 | *#--------------------------------------------------------------------------- |
| 771 | */ |
| 772 | int i2c_start( void ) |
| 773 | { |
| 774 | /* Set SCL=1, SDA=1 */ |
| 775 | i2c_sda_dir_out(); |
| 776 | i2c_set_sda( SDA_HIGH ); |
| 777 | i2c_delay( WAITONEUS ); |
| 778 | i2c_set_scl( SCL_HIGH ); |
| 779 | i2c_delay( WAITONEUS ); |
| 780 | |
| 781 | /* Set SCL=1, SDA=0 */ |
| 782 | i2c_set_sda( SDA_LOW ); |
| 783 | i2c_delay( THDSTA ); |
| 784 | |
| 785 | /* Set SCL=0, SDA=0 */ |
| 786 | i2c_set_scl( SCL_LOW ); |
| 787 | /* We can take 1 us less than defined in spec (5 us), since the next action |
| 788 | * will be to set the dataline high or low and this action is 1 us |
| 789 | * before the clock is put high, so that makes our 5 us. |
| 790 | */ |
| 791 | i2c_delay( TLOW - WAITONEUS ); |
| 792 | |
| 793 | if ( i2c_sda_is_high() || i2c_scl_is_high() ) |
| 794 | { |
| 795 | printk( KERN_DEBUG "I2C: EI2CSTRTCOND\n" ); |
| 796 | return ( EI2CSTRTCOND ); |
| 797 | } |
| 798 | |
| 799 | return ( EI2CNOERRORS ); |
| 800 | } /* i2c_start */ |
| 801 | |
| 802 | |
| 803 | /*#--------------------------------------------------------------------------- |
| 804 | *# |
| 805 | *# FUNCTION NAME: i2c_stop |
| 806 | *# |
| 807 | *# DESCRIPTION : generate i2c stop condition |
| 808 | *# |
| 809 | *# PARAMETERS : none |
| 810 | *# |
| 811 | *# RETURN : none |
| 812 | *# |
| 813 | *#--------------------------------------------------------------------------- |
| 814 | */ |
| 815 | int i2c_stop( void ) |
| 816 | { |
| 817 | #ifdef CONFIG_ETRAX_I2C_SLAVE_DELAY |
| 818 | int n=MAXSCLRETRIES; |
| 819 | #endif |
| 820 | i2c_sda_dir_out(); |
| 821 | |
| 822 | /* Set SCL=0, SDA=0 */ |
| 823 | /* Don't change order, otherwise you might generate a start condition! */ |
| 824 | i2c_set_scl( SCL_LOW ); |
| 825 | i2c_delay( WAITONEUS ); |
| 826 | i2c_set_sda( SDA_LOW ); |
| 827 | i2c_delay( WAITONEUS ); |
| 828 | |
| 829 | /* Set SCL=1, SDA=0 */ |
| 830 | |
| 831 | #ifdef CONFIG_ETRAX_I2C_SLAVE_DELAY |
| 832 | i2c_set_scl( SCL_HIGH ); |
| 833 | i2c_scl_dir_in(); |
| 834 | for( ; n>0; n-- ) |
| 835 | { |
| 836 | if( i2c_scl_is_high() ) |
| 837 | break; |
| 838 | i2c_delay( TSUSTO ); |
| 839 | } |
| 840 | |
| 841 | i2c_scl_dir_out(); |
| 842 | #else |
| 843 | i2c_set_scl( SCL_HIGH ); |
| 844 | #endif |
| 845 | i2c_delay( TSUSTO ); |
| 846 | |
| 847 | /* Set SCL=1, SDA=1 */ |
| 848 | i2c_set_sda( SDA_HIGH ); |
| 849 | i2c_delay( TBUF ); |
| 850 | |
| 851 | i2c_sda_dir_in(); |
| 852 | |
| 853 | if ( !i2c_sda_is_high() || !i2c_scl_is_high() ) |
| 854 | { |
| 855 | return ( EI2CSTOPCOND ); |
| 856 | } |
| 857 | |
| 858 | return ( EI2CNOERRORS ); |
| 859 | } /* i2c_stop */ |
| 860 | |
| 861 | |
| 862 | /*#--------------------------------------------------------------------------- |
| 863 | *# |
| 864 | *# FUNCTION NAME: i2c_outbyte |
| 865 | *# |
| 866 | *# DESCRIPTION : write a byte to the i2c interface |
| 867 | *# |
| 868 | *# PARAMETERS : x: byte to be sent on the I2C bus |
| 869 | *# |
| 870 | *# RETURN : none |
| 871 | *# |
| 872 | *#--------------------------------------------------------------------------- |
| 873 | */ |
| 874 | int i2c_outbyte( unsigned char x ) |
| 875 | { |
| 876 | int i; |
| 877 | |
| 878 | i2c_sda_dir_out(); |
| 879 | |
| 880 | for ( i = 0; i < 8; i++ ) |
| 881 | { |
| 882 | if ( x & 0x80 ) |
| 883 | { |
| 884 | i2c_set_sda( SDA_HIGH ); |
| 885 | } |
| 886 | else |
| 887 | { |
| 888 | i2c_set_sda( SDA_LOW ); |
| 889 | } |
| 890 | |
| 891 | i2c_delay( TSUDAT ); |
| 892 | i2c_set_scl( SCL_HIGH ); |
| 893 | i2c_delay( THIGH ); |
| 894 | i2c_set_scl( SCL_LOW ); |
| 895 | i2c_delay( TSUDAT ); |
| 896 | i2c_set_sda( SDA_LOW ); |
| 897 | /* There should be only 5 us between falling edge and new rising |
| 898 | * edge of clock pulse. |
| 899 | * Since we spend already 1 us since clock edge was low, there are |
| 900 | * only ( TLOW - TSUDAT ) us left. |
| 901 | * Next to this, since the data line will be set up 1 us before the |
| 902 | * clock line is set up, we can reduce the delay with another us. |
| 903 | */ |
| 904 | i2c_delay( TLOW - TSUDAT - WAITONEUS ); |
| 905 | x <<= 1; |
| 906 | } |
| 907 | |
| 908 | /* enable input */ |
| 909 | i2c_sda_dir_in(); |
| 910 | |
| 911 | if ( !i2c_getack() ) |
| 912 | { |
| 913 | return( EI2CNOACKNLD ); |
| 914 | } |
| 915 | |
| 916 | return ( EI2CNOERRORS ); |
| 917 | } /* i2c_outbyte */ |
| 918 | |
| 919 | |
| 920 | /*#--------------------------------------------------------------------------- |
| 921 | *# |
| 922 | *# FUNCTION NAME: i2c_inbyte |
| 923 | *# |
| 924 | *# DESCRIPTION : read a byte from the i2c interface |
| 925 | *# |
| 926 | *# PARAMETERS : none |
| 927 | *# |
| 928 | *# RETURN : returns the byte read from the I2C device |
| 929 | *# |
| 930 | *#--------------------------------------------------------------------------- |
| 931 | */ |
| 932 | unsigned char i2c_inbyte( void ) |
| 933 | { |
| 934 | #ifdef CONFIG_ETRAX_I2C_SLAVE_DELAY |
| 935 | int n=MAXSCLRETRIES; |
| 936 | #endif |
| 937 | unsigned char aBitByte = 0; |
| 938 | unsigned char Mask = 0x80; /* !!! ATTENTION: do NOT use 'char', otherwise shifting is wrong!!! */ |
| 939 | /* Must be UNSIGNED, not SIGNED! */ |
| 940 | |
| 941 | |
| 942 | /* Switch off I2C to get bit */ |
| 943 | i2c_disable(); |
| 944 | i2c_sda_dir_in(); |
| 945 | |
| 946 | while ( Mask != 0 ) |
| 947 | { |
| 948 | #ifdef CONFIG_ETRAX_I2C_SLAVE_DELAY |
| 949 | i2c_scl_dir_in(); |
| 950 | for( ; n>0; n-- ) |
| 951 | { |
| 952 | if( i2c_scl_is_high() ) |
| 953 | break; |
| 954 | i2c_delay( THIGH ); |
| 955 | } |
| 956 | |
| 957 | i2c_set_scl( SCL_HIGH ); |
| 958 | i2c_scl_dir_out(); |
| 959 | #else |
| 960 | i2c_set_scl( SCL_HIGH ); |
| 961 | #endif |
| 962 | i2c_delay( THIGH ); |
| 963 | |
| 964 | if ( i2c_sda_is_high() ) |
| 965 | { |
| 966 | aBitByte |= Mask; |
| 967 | } |
| 968 | |
| 969 | i2c_set_scl( SCL_LOW ); |
| 970 | |
| 971 | Mask >>= 1; |
| 972 | |
| 973 | i2c_delay( TLOW ); |
| 974 | } |
| 975 | |
| 976 | /* |
| 977 | * we leave the clock low, getbyte is usually followed |
| 978 | * by sendack/nack, they assume the clock to be low |
| 979 | */ |
| 980 | return ( aBitByte ); |
| 981 | } /* i2c_inbyte */ |
| 982 | |
| 983 | |
| 984 | /*#--------------------------------------------------------------------------- |
| 985 | *# |
| 986 | *# FUNCTION NAME: i2c_getack |
| 987 | *# |
| 988 | *# DESCRIPTION : checks if ack was received from ic2 |
| 989 | *# |
| 990 | *# PARAMETERS : none |
| 991 | *# |
| 992 | *# RETURN : returns the ack state of the I2C device |
| 993 | *# |
| 994 | *#--------------------------------------------------------------------------- |
| 995 | */ |
| 996 | int i2c_getack( void ) |
| 997 | { |
| 998 | int ack = 1; |
| 999 | #ifdef CONFIG_ETRAX_I2C_SLAVE_DELAY |
| 1000 | int n=MAXSCLRETRIES; |
| 1001 | #endif |
| 1002 | |
| 1003 | /* generate ACK clock pulse */ |
| 1004 | i2c_set_scl( SCL_HIGH ); |
| 1005 | |
| 1006 | /* switch off I2C */ |
| 1007 | i2c_disable(); |
| 1008 | |
| 1009 | #ifdef CONFIG_ETRAX_I2C_SLAVE_DELAY |
| 1010 | /* set clock low */ |
| 1011 | i2c_set_scl( SCL_LOW ); |
| 1012 | |
| 1013 | /* now wait for ack */ |
| 1014 | i2c_delay( THIGH ); |
| 1015 | |
| 1016 | /* set clock as input */ |
| 1017 | i2c_scl_dir_in(); |
| 1018 | |
| 1019 | /* wait for clock to rise (n=MAXSCLRETRIES) */ |
| 1020 | for( ; n>0; n-- ) |
| 1021 | { |
| 1022 | if( i2c_scl_is_high() ) |
| 1023 | break; |
| 1024 | i2c_delay( THIGH ); |
| 1025 | } |
| 1026 | |
| 1027 | i2c_set_scl( SCL_HIGH ); |
| 1028 | |
| 1029 | i2c_scl_dir_out(); |
| 1030 | |
| 1031 | i2c_delay( THIGH ); |
| 1032 | #else |
| 1033 | /* now wait for ack */ |
| 1034 | i2c_delay( THIGH ); |
| 1035 | #endif |
| 1036 | |
| 1037 | /* check for ack: if SDA is high, then NACK, else ACK */ |
| 1038 | if ( i2c_sda_is_high() ) |
| 1039 | { |
| 1040 | ack = 0; |
| 1041 | } |
| 1042 | else |
| 1043 | { |
| 1044 | ack = 1; |
| 1045 | } |
| 1046 | |
| 1047 | /* end clock pulse */ |
| 1048 | i2c_enable(); |
| 1049 | i2c_set_scl( SCL_LOW ); |
| 1050 | i2c_sda_dir_out(); |
| 1051 | i2c_set_sda( SDA_LOW ); |
| 1052 | |
| 1053 | /* Since we "lost" already THDDAT time, we can subtract it here... */ |
| 1054 | i2c_delay( TLOW - THDDAT ); |
| 1055 | |
| 1056 | return ( ack ); |
| 1057 | } /* i2c_getack */ |
| 1058 | |
| 1059 | |
| 1060 | /*#--------------------------------------------------------------------------- |
| 1061 | *# |
| 1062 | *# FUNCTION NAME: i2c_sendack |
| 1063 | *# |
| 1064 | *# DESCRIPTION : sends ACK on received data |
| 1065 | *# |
| 1066 | *# PARAMETERS : none |
| 1067 | *# |
| 1068 | *# RETURN : none |
| 1069 | *# |
| 1070 | *#--------------------------------------------------------------------------- |
| 1071 | */ |
| 1072 | void i2c_sendack( void ) |
| 1073 | { |
| 1074 | #ifdef CONFIG_ETRAX_I2C_SLAVE_DELAY |
| 1075 | int n=MAXSCLRETRIES; |
| 1076 | #endif |
| 1077 | |
| 1078 | /* enable output */ |
| 1079 | /* Clock has been set to TLOW already at end of i2c_inbyte() |
| 1080 | * and i2c_outbyte(), so no need to do it again. |
| 1081 | */ |
| 1082 | i2c_sda_dir_out(); |
| 1083 | /* set ack pulse low */ |
| 1084 | i2c_set_sda( SDA_LOW ); |
| 1085 | /* generate clock pulse */ |
| 1086 | i2c_delay( TSUDAT ); |
| 1087 | |
| 1088 | #ifdef CONFIG_ETRAX_I2C_SLAVE_DELAY |
| 1089 | i2c_scl_dir_in(); |
| 1090 | /* wait for clock to rise (n=MAXSCLRETRIES) */ |
| 1091 | for( ; n>0; n-- ) |
| 1092 | { |
| 1093 | if( i2c_scl_is_high() ) |
| 1094 | break; |
| 1095 | i2c_delay( THIGH ); |
| 1096 | } |
| 1097 | |
| 1098 | i2c_set_scl( SCL_HIGH ); |
| 1099 | i2c_scl_dir_out(); |
| 1100 | i2c_delay( THIGH ); |
| 1101 | #else |
| 1102 | i2c_set_scl( SCL_HIGH ); |
| 1103 | |
| 1104 | i2c_delay( THIGH ); |
| 1105 | #endif |
| 1106 | i2c_set_scl( SCL_LOW ); |
| 1107 | i2c_delay( THDDAT ); |
| 1108 | /* reset data out */ |
| 1109 | i2c_set_sda( SDA_HIGH ); |
| 1110 | /* Subtract time spend already when waited to put SDA high */ |
| 1111 | i2c_delay( TLOW - THDDAT ); |
| 1112 | |
| 1113 | /* release the SDA line */ |
| 1114 | i2c_sda_dir_in(); |
| 1115 | } /* i2c_sendack */ |
| 1116 | |
| 1117 | |
| 1118 | /*#--------------------------------------------------------------------------- |
| 1119 | *# |
| 1120 | *# FUNCTION NAME: i2c_sendnack |
| 1121 | *# |
| 1122 | *# DESCRIPTION : sends NACK on received data |
| 1123 | *# |
| 1124 | *# PARAMETERS : none |
| 1125 | *# |
| 1126 | *# RETURN : none |
| 1127 | *# |
| 1128 | *#--------------------------------------------------------------------------- |
| 1129 | */ |
| 1130 | void i2c_sendnack( void ) |
| 1131 | { |
| 1132 | #ifdef CONFIG_ETRAX_I2C_SLAVE_DELAY |
| 1133 | int n=MAXSCLRETRIES; |
| 1134 | #endif |
| 1135 | |
| 1136 | /* make sure the SDA line is set high prior to activation of the output. |
| 1137 | * this way, you avoid an unnecessary peak to ground when a NACK has to |
| 1138 | * be created. |
| 1139 | */ |
| 1140 | /* set data high */ |
| 1141 | i2c_set_sda( SDA_HIGH ); |
| 1142 | /* enable output */ |
| 1143 | i2c_sda_dir_out(); |
| 1144 | |
| 1145 | /* generate clock pulse */ |
| 1146 | i2c_delay( TSUDAT ); |
| 1147 | |
| 1148 | #ifdef CONFIG_ETRAX_I2C_SLAVE_DELAY |
| 1149 | i2c_scl_dir_in(); |
| 1150 | /* wait for clock to rise (n=MAXSCLRETRIES) */ |
| 1151 | for( ; n>0; n-- ) |
| 1152 | { |
| 1153 | if( i2c_scl_is_high() ) |
| 1154 | break; |
| 1155 | i2c_delay( THIGH ); |
| 1156 | } |
| 1157 | |
| 1158 | i2c_set_scl( SCL_HIGH ); |
| 1159 | i2c_scl_dir_out(); |
| 1160 | i2c_delay( THIGH ); |
| 1161 | #else |
| 1162 | i2c_set_scl( SCL_HIGH ); |
| 1163 | |
| 1164 | i2c_delay( THIGH ); |
| 1165 | #endif |
| 1166 | i2c_set_scl( SCL_LOW ); |
| 1167 | i2c_delay( TSUDAT ); |
| 1168 | i2c_set_sda( SDA_LOW ); |
| 1169 | i2c_delay( TLOW - TSUDAT ); |
| 1170 | |
| 1171 | /* There's no need to change the direction of SDA to "in" again, |
| 1172 | * since a NACK is always followed by a stop condition. |
| 1173 | * A STOP condition will put the direction of SDA back to "out" |
| 1174 | * resulting in a useless SDA "dip" on the line... |
| 1175 | */ |
| 1176 | /* i2c_sda_dir_in(); */ |
| 1177 | } /* i2c_sendnack */ |
| 1178 | |
| 1179 | |
| 1180 | /*#--------------------------------------------------------------------------- |
| 1181 | *# |
| 1182 | *# FUNCTION NAME: i2c_writereg |
| 1183 | *# |
| 1184 | *# DESCRIPTION : writes a value to a register of an I2C device |
| 1185 | *# |
| 1186 | *# PARAMETERS : theSlave = slave address of the I2C device |
| 1187 | *# theReg = register of the I2C device that needs to be written |
| 1188 | *# theValue = value to be written to the register |
| 1189 | *# |
| 1190 | *# RETURN : returns OR-ed result of the write action: |
| 1191 | *# 0 = Ok |
| 1192 | *# 1 = Slave_NoAck |
| 1193 | *# 2 = Reg_NoAck |
| 1194 | *# 4 = Val_NoAck |
| 1195 | *# |
| 1196 | *#--------------------------------------------------------------------------- |
| 1197 | */ |
| 1198 | int i2c_writereg( unsigned char theSlave |
| 1199 | , unsigned char theReg |
| 1200 | , unsigned char theValue |
| 1201 | ) |
| 1202 | { |
| 1203 | int error, cntr = 3; |
| 1204 | unsigned long flags; |
| 1205 | |
| 1206 | spin_lock( &i2c_lock ); |
| 1207 | |
| 1208 | do |
| 1209 | { |
| 1210 | error = 0; |
| 1211 | /* we don't like to be interrupted */ |
| 1212 | local_irq_save( flags ); |
| 1213 | |
| 1214 | i2c_start(); |
| 1215 | /* send slave address */ |
| 1216 | if ( EI2CNOACKNLD == i2c_outbyte( theSlave & 0xfe ) ) |
| 1217 | { |
| 1218 | error = 1; |
| 1219 | } |
| 1220 | |
| 1221 | /* now select register */ |
| 1222 | if ( EI2CNOACKNLD == i2c_outbyte( theReg ) ) |
| 1223 | { |
| 1224 | error |= 2; |
| 1225 | } |
| 1226 | |
| 1227 | /* send register register data */ |
| 1228 | if ( EI2CNOACKNLD == i2c_outbyte( theValue ) ) |
| 1229 | { |
| 1230 | error |= 4; |
| 1231 | } |
| 1232 | |
| 1233 | /* end byte stream */ |
| 1234 | i2c_stop(); |
| 1235 | /* enable interrupt again */ |
| 1236 | local_irq_restore( flags ); |
| 1237 | |
| 1238 | } while ( error && cntr-- ); |
| 1239 | |
| 1240 | i2c_delay( TLOW ); |
| 1241 | |
| 1242 | spin_unlock( &i2c_lock ); |
| 1243 | |
| 1244 | return ( -error ); |
| 1245 | } /* i2c_writereg */ |
| 1246 | |
| 1247 | |
| 1248 | /*#--------------------------------------------------------------------------- |
| 1249 | *# |
| 1250 | *# FUNCTION NAME: i2c_readreg |
| 1251 | *# |
| 1252 | *# DESCRIPTION : reads the value from a certain register of an I2C device. |
| 1253 | *# Function first writes the register that it wants to read |
| 1254 | *# later on. |
| 1255 | *# |
| 1256 | *# PARAMETERS : theSlave = slave address of the I2C device |
| 1257 | *# theReg = register of the I2C device that needs to be written |
| 1258 | *# |
| 1259 | *# RETURN : returns OR-ed result of the write action: |
| 1260 | *# 0 = Ok |
| 1261 | *# 1 = Slave_NoAck |
| 1262 | *# 2 = Reg_NoAck |
| 1263 | *# 4 = Val_NoAck |
| 1264 | *# |
| 1265 | *#--------------------------------------------------------------------------- |
| 1266 | */ |
| 1267 | unsigned char i2c_readreg( unsigned char theSlave |
| 1268 | , unsigned char theReg |
| 1269 | ) |
| 1270 | { |
| 1271 | unsigned char b = 0; |
| 1272 | int error, cntr = 3; |
| 1273 | unsigned long flags; |
| 1274 | |
| 1275 | spin_lock( &i2c_lock ); |
| 1276 | |
| 1277 | do |
| 1278 | { |
| 1279 | error = 0; |
| 1280 | |
| 1281 | /* we don't like to be interrupted */ |
| 1282 | local_irq_save( flags ); |
| 1283 | |
| 1284 | /* generate start condition */ |
| 1285 | i2c_start(); |
| 1286 | |
| 1287 | /* send slave address */ |
| 1288 | if ( EI2CNOACKNLD == i2c_outbyte( theSlave & 0xfe ) ) |
| 1289 | { |
| 1290 | error = 1; |
| 1291 | } |
| 1292 | |
| 1293 | /* now select register */ |
| 1294 | i2c_sda_dir_out(); |
| 1295 | |
| 1296 | if ( EI2CNOACKNLD == i2c_outbyte( theReg ) ) |
| 1297 | { |
| 1298 | error |= 2; |
| 1299 | } |
| 1300 | |
| 1301 | /* repeat start condition */ |
| 1302 | i2c_delay( TLOW ); |
| 1303 | i2c_start(); |
| 1304 | |
| 1305 | /* send slave address */ |
| 1306 | if ( EI2CNOACKNLD == i2c_outbyte( theSlave | 0x01 ) ) |
| 1307 | { |
| 1308 | error |= 1; |
| 1309 | } |
| 1310 | |
| 1311 | /* fetch register */ |
| 1312 | b = i2c_inbyte(); |
| 1313 | /* |
| 1314 | * last received byte needs to be nacked |
| 1315 | * instead of acked |
| 1316 | */ |
| 1317 | i2c_sendnack(); |
| 1318 | |
| 1319 | /* end sequence */ |
| 1320 | i2c_stop(); |
| 1321 | |
| 1322 | /* enable interrupt again */ |
| 1323 | local_irq_restore( flags ); |
| 1324 | |
| 1325 | } while ( error && cntr-- ); |
| 1326 | |
| 1327 | spin_unlock( &i2c_lock ); |
| 1328 | |
| 1329 | return ( b ); |
| 1330 | } /* i2c_readreg */ |
| 1331 | |
| 1332 | |
| 1333 | /*#--------------------------------------------------------------------------- |
| 1334 | *# |
| 1335 | *# FUNCTION NAME: i2c_read |
| 1336 | *# |
| 1337 | *# DESCRIPTION : |
| 1338 | *# |
| 1339 | *# PARAMETERS : |
| 1340 | *# |
| 1341 | *# RETURN : |
| 1342 | *# |
| 1343 | *#--------------------------------------------------------------------------- |
| 1344 | */ |
| 1345 | int i2c_read( unsigned char slave, unsigned char* rbuf, unsigned char rlen ) |
| 1346 | { |
| 1347 | return ( i2c_command( slave, NULL, 0, rbuf, rlen ) ); |
| 1348 | } /* i2c_read */ |
| 1349 | |
| 1350 | |
| 1351 | /*#--------------------------------------------------------------------------- |
| 1352 | *# |
| 1353 | *# FUNCTION NAME: i2c_write |
| 1354 | *# |
| 1355 | *# DESCRIPTION : |
| 1356 | *# |
| 1357 | *# PARAMETERS : |
| 1358 | *# |
| 1359 | *# RETURN : |
| 1360 | *# |
| 1361 | *#--------------------------------------------------------------------------- |
| 1362 | */ |
| 1363 | int i2c_write( unsigned char slave, unsigned char* wbuf, unsigned char wlen ) |
| 1364 | { |
| 1365 | return ( i2c_command( slave, wbuf, wlen, NULL, 0 ) ); |
| 1366 | } /* i2c_write */ |
| 1367 | |
| 1368 | |
| 1369 | /*#--------------------------------------------------------------------------- |
| 1370 | *# |
| 1371 | *# FUNCTION NAME: i2c_writeread |
| 1372 | *# |
| 1373 | *# DESCRIPTION : |
| 1374 | *# |
| 1375 | *# PARAMETERS : |
| 1376 | *# |
| 1377 | *# RETURN : |
| 1378 | *# |
| 1379 | *#--------------------------------------------------------------------------- |
| 1380 | */ |
| 1381 | int i2c_writeread( unsigned char slave |
| 1382 | , unsigned char* wbuf |
| 1383 | , unsigned char wlen |
| 1384 | , unsigned char* rbuf |
| 1385 | , unsigned char rlen |
| 1386 | ) |
| 1387 | { |
| 1388 | return ( i2c_command( slave, wbuf, wlen, rbuf, rlen ) ); |
| 1389 | } /* i2c_writeread */ |
| 1390 | |
| 1391 | |
| 1392 | /*#--------------------------------------------------------------------------- |
| 1393 | *# |
| 1394 | *# FUNCTION NAME: module_init |
| 1395 | *# |
| 1396 | *# DESCRIPTION : this makes sure that i2c_register is called during boot |
| 1397 | *# |
| 1398 | *# PARAMETERS : |
| 1399 | *# |
| 1400 | *#--------------------------------------------------------------------------- |
| 1401 | */ |
| 1402 | module_init( i2c_register ); |
| 1403 | |
| 1404 | /****************** END OF FILE i2c.c ********************************/ |
| 1405 | |