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