linux/arch/cris/arch-v10/drivers/eeprom.c
<<
>>
Prefs
   1/*!*****************************************************************************
   2*!
   3*!  Implements an interface for i2c compatible eeproms to run under Linux.
   4*!  Supports 2k, 8k(?) and 16k. Uses adaptive timing adjustments by
   5*!  Johan.Adolfsson@axis.com
   6*!
   7*!  Probing results:
   8*!    8k or not is detected (the assumes 2k or 16k)
   9*!    2k or 16k detected using test reads and writes.
  10*!
  11*!------------------------------------------------------------------------
  12*!  HISTORY
  13*!
  14*!  DATE          NAME              CHANGES
  15*!  ----          ----              -------
  16*!  Aug  28 1999  Edgar Iglesias    Initial Version
  17*!  Aug  31 1999  Edgar Iglesias    Allow simultaneous users.
  18*!  Sep  03 1999  Edgar Iglesias    Updated probe.
  19*!  Sep  03 1999  Edgar Iglesias    Added bail-out stuff if we get interrupted
  20*!                                  in the spin-lock.
  21*!
  22*!        (c) 1999 Axis Communications AB, Lund, Sweden
  23*!*****************************************************************************/
  24
  25#include <linux/kernel.h>
  26#include <linux/sched.h>
  27#include <linux/fs.h>
  28#include <linux/init.h>
  29#include <linux/delay.h>
  30#include <linux/interrupt.h>
  31#include <linux/wait.h>
  32#include <asm/uaccess.h>
  33#include "i2c.h"
  34
  35#define D(x)
  36
  37/* If we should use adaptive timing or not: */
  38/* #define EEPROM_ADAPTIVE_TIMING */
  39
  40#define EEPROM_MAJOR_NR 122  /* use a LOCAL/EXPERIMENTAL major for now */
  41#define EEPROM_MINOR_NR 0
  42
  43/* Empirical sane initial value of the delay, the value will be adapted to
  44 * what the chip needs when using EEPROM_ADAPTIVE_TIMING.
  45 */
  46#define INITIAL_WRITEDELAY_US 4000
  47#define MAX_WRITEDELAY_US 10000 /* 10 ms according to spec for 2KB EEPROM */
  48
  49/* This one defines how many times to try when eeprom fails. */
  50#define EEPROM_RETRIES 10
  51
  52#define EEPROM_2KB (2 * 1024)
  53/*#define EEPROM_4KB (4 * 1024)*/ /* Exists but not used in Axis products */
  54#define EEPROM_8KB (8 * 1024 - 1 ) /* Last byte has write protection bit */
  55#define EEPROM_16KB (16 * 1024)
  56
  57#define i2c_delay(x) udelay(x)
  58
  59/*
  60 *  This structure describes the attached eeprom chip.
  61 *  The values are probed for.
  62 */
  63
  64struct eeprom_type
  65{
  66  unsigned long size;
  67  unsigned long sequential_write_pagesize;
  68  unsigned char select_cmd;
  69  unsigned long usec_delay_writecycles; /* Min time between write cycles
  70                                           (up to 10ms for some models) */
  71  unsigned long usec_delay_step; /* For adaptive algorithm */
  72  int adapt_state; /* 1 = To high , 0 = Even, -1 = To low */
  73  
  74  /* this one is to keep the read/write operations atomic */
  75  struct mutex lock;
  76  int retry_cnt_addr; /* Used to keep track of number of retries for
  77                         adaptive timing adjustments */
  78  int retry_cnt_read;
  79};
  80
  81static int  eeprom_open(struct inode * inode, struct file * file);
  82static loff_t  eeprom_lseek(struct file * file, loff_t offset, int orig);
  83static ssize_t  eeprom_read(struct file * file, char * buf, size_t count,
  84                            loff_t *off);
  85static ssize_t  eeprom_write(struct file * file, const char * buf, size_t count,
  86                             loff_t *off);
  87static int eeprom_close(struct inode * inode, struct file * file);
  88
  89static int  eeprom_address(unsigned long addr);
  90static int  read_from_eeprom(char * buf, int count);
  91static int eeprom_write_buf(loff_t addr, const char * buf, int count);
  92static int eeprom_read_buf(loff_t addr, char * buf, int count);
  93
  94static void eeprom_disable_write_protect(void);
  95
  96
  97static const char eeprom_name[] = "eeprom";
  98
  99/* chip description */
 100static struct eeprom_type eeprom;
 101
 102/* This is the exported file-operations structure for this device. */
 103const struct file_operations eeprom_fops =
 104{
 105  .llseek  = eeprom_lseek,
 106  .read    = eeprom_read,
 107  .write   = eeprom_write,
 108  .open    = eeprom_open,
 109  .release = eeprom_close
 110};
 111
 112/* eeprom init call. Probes for different eeprom models. */
 113
 114int __init eeprom_init(void)
 115{
 116  mutex_init(&eeprom.lock);
 117
 118#ifdef CONFIG_ETRAX_I2C_EEPROM_PROBE
 119#define EETEXT "Found"
 120#else
 121#define EETEXT "Assuming"
 122#endif
 123  if (register_chrdev(EEPROM_MAJOR_NR, eeprom_name, &eeprom_fops))
 124  {
 125    printk(KERN_INFO "%s: unable to get major %d for eeprom device\n",
 126           eeprom_name, EEPROM_MAJOR_NR);
 127    return -1;
 128  }
 129  
 130  printk("EEPROM char device v0.3, (c) 2000 Axis Communications AB\n");
 131
 132  /*
 133   *  Note: Most of this probing method was taken from the printserver (5470e)
 134   *        codebase. It did not contain a way of finding the 16kB chips
 135   *        (M24128 or variants). The method used here might not work
 136   *        for all models. If you encounter problems the easiest way
 137   *        is probably to define your model within #ifdef's, and hard-
 138   *        code it.
 139   */
 140
 141  eeprom.size = 0;
 142  eeprom.usec_delay_writecycles = INITIAL_WRITEDELAY_US;
 143  eeprom.usec_delay_step = 128;
 144  eeprom.adapt_state = 0;
 145  
 146#ifdef CONFIG_ETRAX_I2C_EEPROM_PROBE
 147  i2c_start();
 148  i2c_outbyte(0x80);
 149  if(!i2c_getack())
 150  {
 151    /* It's not 8k.. */
 152    int success = 0;
 153    unsigned char buf_2k_start[16];
 154    
 155    /* Im not sure this will work... :) */
 156    /* assume 2kB, if failure go for 16kB */
 157    /* Test with 16kB settings.. */
 158    /* If it's a 2kB EEPROM and we address it outside it's range
 159     * it will mirror the address space:
 160     * 1. We read two locations (that are mirrored), 
 161     *    if the content differs * it's a 16kB EEPROM.
 162     * 2. if it doesn't differ - write different value to one of the locations,
 163     *    check the other - if content still is the same it's a 2k EEPROM,
 164     *    restore original data.
 165     */
 166#define LOC1 8
 167#define LOC2 (0x1fb) /*1fb, 3ed, 5df, 7d1 */
 168
 169   /* 2k settings */  
 170    i2c_stop();
 171    eeprom.size = EEPROM_2KB;
 172    eeprom.select_cmd = 0xA0;   
 173    eeprom.sequential_write_pagesize = 16;
 174    if( eeprom_read_buf( 0, buf_2k_start, 16 ) == 16 )
 175    {
 176      D(printk("2k start: '%16.16s'\n", buf_2k_start));
 177    }
 178    else
 179    {
 180      printk(KERN_INFO "%s: Failed to read in 2k mode!\n", eeprom_name);  
 181    }
 182    
 183    /* 16k settings */
 184    eeprom.size = EEPROM_16KB;
 185    eeprom.select_cmd = 0xA0;   
 186    eeprom.sequential_write_pagesize = 64;
 187
 188    {
 189      unsigned char loc1[4], loc2[4], tmp[4];
 190      if( eeprom_read_buf(LOC2, loc2, 4) == 4)
 191      {
 192        if( eeprom_read_buf(LOC1, loc1, 4) == 4)
 193        {
 194          D(printk("0 loc1: (%i) '%4.4s' loc2 (%i) '%4.4s'\n", 
 195                   LOC1, loc1, LOC2, loc2));
 196#if 0
 197          if (memcmp(loc1, loc2, 4) != 0 )
 198          {
 199            /* It's 16k */
 200            printk(KERN_INFO "%s: 16k detected in step 1\n", eeprom_name);
 201            eeprom.size = EEPROM_16KB;     
 202            success = 1;
 203          }
 204          else
 205#endif
 206          {
 207            /* Do step 2 check */
 208            /* Invert value */
 209            loc1[0] = ~loc1[0];
 210            if (eeprom_write_buf(LOC1, loc1, 1) == 1)
 211            {
 212              /* If 2k EEPROM this write will actually write 10 bytes
 213               * from pos 0
 214               */
 215              D(printk("1 loc1: (%i) '%4.4s' loc2 (%i) '%4.4s'\n", 
 216                       LOC1, loc1, LOC2, loc2));
 217              if( eeprom_read_buf(LOC1, tmp, 4) == 4)
 218              {
 219                D(printk("2 loc1: (%i) '%4.4s' tmp '%4.4s'\n", 
 220                         LOC1, loc1, tmp));
 221                if (memcmp(loc1, tmp, 4) != 0 )
 222                {
 223                  printk(KERN_INFO "%s: read and write differs! Not 16kB\n",
 224                         eeprom_name);
 225                  loc1[0] = ~loc1[0];
 226                  
 227                  if (eeprom_write_buf(LOC1, loc1, 1) == 1)
 228                  {
 229                    success = 1;
 230                  }
 231                  else
 232                  {
 233                    printk(KERN_INFO "%s: Restore 2k failed during probe,"
 234                           " EEPROM might be corrupt!\n", eeprom_name);
 235                    
 236                  }
 237                  i2c_stop();
 238                  /* Go to 2k mode and write original data */
 239                  eeprom.size = EEPROM_2KB;
 240                  eeprom.select_cmd = 0xA0;   
 241                  eeprom.sequential_write_pagesize = 16;
 242                  if( eeprom_write_buf(0, buf_2k_start, 16) == 16)
 243                  {
 244                  }
 245                  else
 246                  {
 247                    printk(KERN_INFO "%s: Failed to write back 2k start!\n",
 248                           eeprom_name);
 249                  }
 250                  
 251                  eeprom.size = EEPROM_2KB;
 252                }
 253              }
 254                
 255              if(!success)
 256              {
 257                if( eeprom_read_buf(LOC2, loc2, 1) == 1)
 258                {
 259                  D(printk("0 loc1: (%i) '%4.4s' loc2 (%i) '%4.4s'\n", 
 260                           LOC1, loc1, LOC2, loc2));
 261                  if (memcmp(loc1, loc2, 4) == 0 )
 262                  {
 263                    /* Data the same, must be mirrored -> 2k */
 264                    /* Restore data */
 265                    printk(KERN_INFO "%s: 2k detected in step 2\n", eeprom_name);
 266                    loc1[0] = ~loc1[0];
 267                    if (eeprom_write_buf(LOC1, loc1, 1) == 1)
 268                    {
 269                      success = 1;
 270                    }
 271                    else
 272                    {
 273                      printk(KERN_INFO "%s: Restore 2k failed during probe,"
 274                             " EEPROM might be corrupt!\n", eeprom_name);
 275                      
 276                    }
 277                    
 278                    eeprom.size = EEPROM_2KB;     
 279                  }
 280                  else
 281                  {
 282                    printk(KERN_INFO "%s: 16k detected in step 2\n",
 283                           eeprom_name);
 284                    loc1[0] = ~loc1[0];
 285                    /* Data differs, assume 16k */
 286                    /* Restore data */
 287                    if (eeprom_write_buf(LOC1, loc1, 1) == 1)
 288                    {
 289                      success = 1;
 290                    }
 291                    else
 292                    {
 293                      printk(KERN_INFO "%s: Restore 16k failed during probe,"
 294                             " EEPROM might be corrupt!\n", eeprom_name);
 295                    }
 296                    
 297                    eeprom.size = EEPROM_16KB;
 298                  }
 299                }
 300              }
 301            }
 302          } /* read LOC1 */
 303        } /* address LOC1 */
 304        if (!success)
 305        {
 306          printk(KERN_INFO "%s: Probing failed!, using 2KB!\n", eeprom_name);
 307          eeprom.size = EEPROM_2KB;               
 308        }
 309      } /* read */
 310    }
 311  }
 312  else
 313  {
 314    i2c_outbyte(0x00);
 315    if(!i2c_getack())
 316    {
 317      /* No 8k */
 318      eeprom.size = EEPROM_2KB;
 319    }
 320    else
 321    {
 322      i2c_start();
 323      i2c_outbyte(0x81);
 324      if (!i2c_getack())
 325      {
 326        eeprom.size = EEPROM_2KB;
 327      }
 328      else
 329      {
 330        /* It's a 8kB */
 331        i2c_inbyte();
 332        eeprom.size = EEPROM_8KB;
 333      }
 334    }
 335  }
 336  i2c_stop();
 337#elif defined(CONFIG_ETRAX_I2C_EEPROM_16KB)
 338  eeprom.size = EEPROM_16KB;
 339#elif defined(CONFIG_ETRAX_I2C_EEPROM_8KB)
 340  eeprom.size = EEPROM_8KB;
 341#elif defined(CONFIG_ETRAX_I2C_EEPROM_2KB)
 342  eeprom.size = EEPROM_2KB;
 343#endif
 344
 345  switch(eeprom.size)
 346  {
 347   case (EEPROM_2KB):
 348     printk("%s: " EETEXT " i2c compatible 2kB eeprom.\n", eeprom_name);
 349     eeprom.sequential_write_pagesize = 16;
 350     eeprom.select_cmd = 0xA0;
 351     break;
 352   case (EEPROM_8KB):
 353     printk("%s: " EETEXT " i2c compatible 8kB eeprom.\n", eeprom_name);
 354     eeprom.sequential_write_pagesize = 16;
 355     eeprom.select_cmd = 0x80;
 356     break;
 357   case (EEPROM_16KB):
 358     printk("%s: " EETEXT " i2c compatible 16kB eeprom.\n", eeprom_name);
 359     eeprom.sequential_write_pagesize = 64;
 360     eeprom.select_cmd = 0xA0;     
 361     break;
 362   default:
 363     eeprom.size = 0;
 364     printk("%s: Did not find a supported eeprom\n", eeprom_name);
 365     break;
 366  }
 367
 368  
 369
 370  eeprom_disable_write_protect();
 371
 372  return 0;
 373}
 374
 375/* Opens the device. */
 376static int eeprom_open(struct inode * inode, struct file * file)
 377{
 378  if(iminor(inode) != EEPROM_MINOR_NR)
 379     return -ENXIO;
 380  if(imajor(inode) != EEPROM_MAJOR_NR)
 381     return -ENXIO;
 382
 383  if( eeprom.size > 0 )
 384  {
 385    /* OK */
 386    return 0;
 387  }
 388
 389  /* No EEprom found */
 390  return -EFAULT;
 391}
 392
 393/* Changes the current file position. */
 394
 395static loff_t eeprom_lseek(struct file * file, loff_t offset, int orig)
 396{
 397/*
 398 *  orig 0: position from begning of eeprom
 399 *  orig 1: relative from current position
 400 *  orig 2: position from last eeprom address
 401 */
 402  
 403  switch (orig)
 404  {
 405   case 0:
 406     file->f_pos = offset;
 407     break;
 408   case 1:
 409     file->f_pos += offset;
 410     break;
 411   case 2:
 412     file->f_pos = eeprom.size - offset;
 413     break;
 414   default:
 415     return -EINVAL;
 416  }
 417
 418  /* truncate position */
 419  if (file->f_pos < 0)
 420  {
 421    file->f_pos = 0;    
 422    return(-EOVERFLOW);
 423  }
 424  
 425  if (file->f_pos >= eeprom.size)
 426  {
 427    file->f_pos = eeprom.size - 1;
 428    return(-EOVERFLOW);
 429  }
 430
 431  return ( file->f_pos );
 432}
 433
 434/* Reads data from eeprom. */
 435
 436static int eeprom_read_buf(loff_t addr, char * buf, int count)
 437{
 438  return eeprom_read(NULL, buf, count, &addr);
 439}
 440
 441
 442
 443/* Reads data from eeprom. */
 444
 445static ssize_t eeprom_read(struct file * file, char * buf, size_t count, loff_t *off)
 446{
 447  int read=0;
 448  unsigned long p = *off;
 449
 450  unsigned char page;
 451
 452  if(p >= eeprom.size)  /* Address i 0 - (size-1) */
 453  {
 454    return -EFAULT;
 455  }
 456  
 457  if (mutex_lock_interruptible(&eeprom.lock))
 458    return -EINTR;
 459
 460  page = (unsigned char) (p >> 8);
 461  
 462  if(!eeprom_address(p))
 463  {
 464    printk(KERN_INFO "%s: Read failed to address the eeprom: "
 465           "0x%08X (%i) page: %i\n", eeprom_name, (int)p, (int)p, page);
 466    i2c_stop();
 467    
 468    /* don't forget to wake them up */
 469    mutex_unlock(&eeprom.lock);
 470    return -EFAULT;
 471  }
 472
 473  if( (p + count) > eeprom.size)
 474  {
 475    /* truncate count */
 476    count = eeprom.size - p;
 477  }
 478
 479  /* stop dummy write op and initiate the read op */
 480  i2c_start();
 481
 482  /* special case for small eeproms */
 483  if(eeprom.size < EEPROM_16KB)
 484  {
 485    i2c_outbyte( eeprom.select_cmd | 1 | (page << 1) );
 486  }
 487
 488  /* go on with the actual read */
 489  read = read_from_eeprom( buf, count);
 490  
 491  if(read > 0)
 492  {
 493    *off += read;
 494  }
 495
 496  mutex_unlock(&eeprom.lock);
 497  return read;
 498}
 499
 500/* Writes data to eeprom. */
 501
 502static int eeprom_write_buf(loff_t addr, const char * buf, int count)
 503{
 504  return eeprom_write(NULL, buf, count, &addr);
 505}
 506
 507
 508/* Writes data to eeprom. */
 509
 510static ssize_t eeprom_write(struct file * file, const char * buf, size_t count,
 511                            loff_t *off)
 512{
 513  int i, written, restart=1;
 514  unsigned long p;
 515
 516  if (!access_ok(VERIFY_READ, buf, count))
 517  {
 518    return -EFAULT;
 519  }
 520
 521  /* bail out if we get interrupted */
 522  if (mutex_lock_interruptible(&eeprom.lock))
 523    return -EINTR;
 524  for(i = 0; (i < EEPROM_RETRIES) && (restart > 0); i++)
 525  {
 526    restart = 0;
 527    written = 0;
 528    p = *off;
 529   
 530    
 531    while( (written < count) && (p < eeprom.size))
 532    {
 533      /* address the eeprom */
 534      if(!eeprom_address(p))
 535      {
 536        printk(KERN_INFO "%s: Write failed to address the eeprom: "
 537               "0x%08X (%i) \n", eeprom_name, (int)p, (int)p);
 538        i2c_stop();
 539        
 540        /* don't forget to wake them up */
 541        mutex_unlock(&eeprom.lock);
 542        return -EFAULT;
 543      }
 544#ifdef EEPROM_ADAPTIVE_TIMING      
 545      /* Adaptive algorithm to adjust timing */
 546      if (eeprom.retry_cnt_addr > 0)
 547      {
 548        /* To Low now */
 549        D(printk(">D=%i d=%i\n",
 550               eeprom.usec_delay_writecycles, eeprom.usec_delay_step));
 551
 552        if (eeprom.usec_delay_step < 4)
 553        {
 554          eeprom.usec_delay_step++;
 555          eeprom.usec_delay_writecycles += eeprom.usec_delay_step;
 556        }
 557        else
 558        {
 559
 560          if (eeprom.adapt_state > 0)
 561          {
 562            /* To Low before */
 563            eeprom.usec_delay_step *= 2;
 564            if (eeprom.usec_delay_step > 2)
 565            {
 566              eeprom.usec_delay_step--;
 567            }
 568            eeprom.usec_delay_writecycles += eeprom.usec_delay_step;
 569          }
 570          else if (eeprom.adapt_state < 0)
 571          {
 572            /* To High before (toggle dir) */
 573            eeprom.usec_delay_writecycles += eeprom.usec_delay_step;
 574            if (eeprom.usec_delay_step > 1)
 575            {
 576              eeprom.usec_delay_step /= 2;
 577              eeprom.usec_delay_step--;
 578            }
 579          }
 580        }
 581
 582        eeprom.adapt_state = 1;
 583      }
 584      else
 585      {
 586        /* To High (or good) now */
 587        D(printk("<D=%i d=%i\n",
 588               eeprom.usec_delay_writecycles, eeprom.usec_delay_step));
 589        
 590        if (eeprom.adapt_state < 0)
 591        {
 592          /* To High before */
 593          if (eeprom.usec_delay_step > 1)
 594          {
 595            eeprom.usec_delay_step *= 2;
 596            eeprom.usec_delay_step--;
 597            
 598            if (eeprom.usec_delay_writecycles > eeprom.usec_delay_step)
 599            {
 600              eeprom.usec_delay_writecycles -= eeprom.usec_delay_step;
 601            }
 602          }
 603        }
 604        else if (eeprom.adapt_state > 0)
 605        {
 606          /* To Low before (toggle dir) */
 607          if (eeprom.usec_delay_writecycles > eeprom.usec_delay_step)
 608          {
 609            eeprom.usec_delay_writecycles -= eeprom.usec_delay_step;
 610          }
 611          if (eeprom.usec_delay_step > 1)
 612          {
 613            eeprom.usec_delay_step /= 2;
 614            eeprom.usec_delay_step--;
 615          }
 616          
 617          eeprom.adapt_state = -1;
 618        }
 619
 620        if (eeprom.adapt_state > -100)
 621        {
 622          eeprom.adapt_state--;
 623        }
 624        else
 625        {
 626          /* Restart adaption */
 627          D(printk("#Restart\n"));
 628          eeprom.usec_delay_step++;
 629        }
 630      }
 631#endif /* EEPROM_ADAPTIVE_TIMING */
 632      /* write until we hit a page boundary or count */
 633      do
 634      {
 635        i2c_outbyte(buf[written]);        
 636        if(!i2c_getack())
 637        {
 638          restart=1;
 639          printk(KERN_INFO "%s: write error, retrying. %d\n", eeprom_name, i);
 640          i2c_stop();
 641          break;
 642        }
 643        written++;
 644        p++;        
 645      } while( written < count && ( p % eeprom.sequential_write_pagesize ));
 646
 647      /* end write cycle */
 648      i2c_stop();
 649      i2c_delay(eeprom.usec_delay_writecycles);
 650    } /* while */
 651  } /* for  */
 652
 653  mutex_unlock(&eeprom.lock);
 654  if (written == 0 && p >= eeprom.size){
 655    return -ENOSPC;
 656  }
 657  *off = p;
 658  return written;
 659}
 660
 661/* Closes the device. */
 662
 663static int eeprom_close(struct inode * inode, struct file * file)
 664{
 665  /* do nothing for now */
 666  return 0;
 667}
 668
 669/* Sets the current address of the eeprom. */
 670
 671static int eeprom_address(unsigned long addr)
 672{
 673  int i;
 674  unsigned char page, offset;
 675
 676  page   = (unsigned char) (addr >> 8);
 677  offset = (unsigned char)  addr;
 678
 679  for(i = 0; i < EEPROM_RETRIES; i++)
 680  {
 681    /* start a dummy write for addressing */
 682    i2c_start();
 683
 684    if(eeprom.size == EEPROM_16KB)
 685    {
 686      i2c_outbyte( eeprom.select_cmd ); 
 687      i2c_getack();
 688      i2c_outbyte(page); 
 689    }
 690    else
 691    {
 692      i2c_outbyte( eeprom.select_cmd | (page << 1) ); 
 693    }
 694    if(!i2c_getack())
 695    {
 696      /* retry */
 697      i2c_stop();
 698      /* Must have a delay here.. 500 works, >50, 100->works 5th time*/
 699      i2c_delay(MAX_WRITEDELAY_US / EEPROM_RETRIES * i);
 700      /* The chip needs up to 10 ms from write stop to next start */
 701     
 702    }
 703    else
 704    {
 705      i2c_outbyte(offset);
 706      
 707      if(!i2c_getack())
 708      {
 709        /* retry */
 710        i2c_stop();
 711      }
 712      else
 713        break;
 714    }
 715  }    
 716
 717  
 718  eeprom.retry_cnt_addr = i;
 719  D(printk("%i\n", eeprom.retry_cnt_addr));
 720  if(eeprom.retry_cnt_addr == EEPROM_RETRIES)
 721  {
 722    /* failed */
 723    return 0;
 724  }
 725  return 1;
 726}
 727
 728/* Reads from current address. */
 729
 730static int read_from_eeprom(char * buf, int count)
 731{
 732  int i, read=0;
 733
 734  for(i = 0; i < EEPROM_RETRIES; i++)
 735  {    
 736    if(eeprom.size == EEPROM_16KB)
 737    {
 738      i2c_outbyte( eeprom.select_cmd | 1 );
 739    }
 740
 741    if(i2c_getack())
 742    {
 743      break;
 744    }
 745  }
 746  
 747  if(i == EEPROM_RETRIES)
 748  {
 749    printk(KERN_INFO "%s: failed to read from eeprom\n", eeprom_name);
 750    i2c_stop();
 751    
 752    return -EFAULT;
 753  }
 754
 755  while( (read < count))
 756  {    
 757    if (put_user(i2c_inbyte(), &buf[read++]))
 758    {
 759      i2c_stop();
 760
 761      return -EFAULT;
 762    }
 763
 764    /*
 765     *  make sure we don't ack last byte or you will get very strange
 766     *  results!
 767     */
 768    if(read < count)
 769    {
 770      i2c_sendack();
 771    }
 772  }
 773
 774  /* stop the operation */
 775  i2c_stop();
 776
 777  return read;
 778}
 779
 780/* Disables write protection if applicable. */
 781
 782#define DBP_SAVE(x)
 783#define ax_printf printk
 784static void eeprom_disable_write_protect(void)
 785{
 786  /* Disable write protect */
 787  if (eeprom.size == EEPROM_8KB)
 788  {
 789    /* Step 1 Set WEL = 1 (write 00000010 to address 1FFFh */
 790    i2c_start();
 791    i2c_outbyte(0xbe);
 792    if(!i2c_getack())
 793    {
 794      DBP_SAVE(ax_printf("Get ack returns false\n"));
 795    }
 796    i2c_outbyte(0xFF);
 797    if(!i2c_getack())
 798    {
 799      DBP_SAVE(ax_printf("Get ack returns false 2\n"));
 800    }
 801    i2c_outbyte(0x02);
 802    if(!i2c_getack())
 803    {
 804      DBP_SAVE(ax_printf("Get ack returns false 3\n"));
 805    }
 806    i2c_stop();
 807
 808    i2c_delay(1000);
 809
 810    /* Step 2 Set RWEL = 1 (write 00000110 to address 1FFFh */
 811    i2c_start();
 812    i2c_outbyte(0xbe);
 813    if(!i2c_getack())
 814    {
 815      DBP_SAVE(ax_printf("Get ack returns false 55\n"));
 816    }
 817    i2c_outbyte(0xFF);
 818    if(!i2c_getack())
 819    {
 820      DBP_SAVE(ax_printf("Get ack returns false 52\n"));
 821    }
 822    i2c_outbyte(0x06);
 823    if(!i2c_getack())
 824    {
 825      DBP_SAVE(ax_printf("Get ack returns false 53\n"));
 826    }
 827    i2c_stop();
 828    
 829    /* Step 3 Set BP1, BP0, and/or WPEN bits (write 00000110 to address 1FFFh */
 830    i2c_start();
 831    i2c_outbyte(0xbe);
 832    if(!i2c_getack())
 833    {
 834      DBP_SAVE(ax_printf("Get ack returns false 56\n"));
 835    }
 836    i2c_outbyte(0xFF);
 837    if(!i2c_getack())
 838    {
 839      DBP_SAVE(ax_printf("Get ack returns false 57\n"));
 840    }
 841    i2c_outbyte(0x06);
 842    if(!i2c_getack())
 843    {
 844      DBP_SAVE(ax_printf("Get ack returns false 58\n"));
 845    }
 846    i2c_stop();
 847    
 848    /* Write protect disabled */
 849  }
 850}
 851
 852module_init(eeprom_init);
 853