eeprom.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:23k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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