1 // SPDX-License-Identifier: GPL-2.0
2 /*!*****************************************************************************
4 *! Implements an interface for i2c compatible eeproms to run under Linux.
5 *! Supports 2k, 8k(?) and 16k. Uses adaptive timing adjustments by
6 *! Johan.Adolfsson@axis.com
9 *! 8k or not is detected (the assumes 2k or 16k)
10 *! 2k or 16k detected using test reads and writes.
12 *!------------------------------------------------------------------------
17 *! Aug 28 1999 Edgar Iglesias Initial Version
18 *! Aug 31 1999 Edgar Iglesias Allow simultaneous users.
19 *! Sep 03 1999 Edgar Iglesias Updated probe.
20 *! Sep 03 1999 Edgar Iglesias Added bail-out stuff if we get interrupted
23 *! (c) 1999 Axis Communications AB, Lund, Sweden
24 *!*****************************************************************************/
26 #include <linux/kernel.h>
27 #include <linux/sched.h>
29 #include <linux/init.h>
30 #include <linux/delay.h>
31 #include <linux/interrupt.h>
32 #include <linux/wait.h>
33 #include <linux/uaccess.h>
38 /* If we should use adaptive timing or not: */
39 /* #define EEPROM_ADAPTIVE_TIMING */
41 #define EEPROM_MAJOR_NR 122 /* use a LOCAL/EXPERIMENTAL major for now */
42 #define EEPROM_MINOR_NR 0
44 /* Empirical sane initial value of the delay, the value will be adapted to
45 * what the chip needs when using EEPROM_ADAPTIVE_TIMING.
47 #define INITIAL_WRITEDELAY_US 4000
48 #define MAX_WRITEDELAY_US 10000 /* 10 ms according to spec for 2KB EEPROM */
50 /* This one defines how many times to try when eeprom fails. */
51 #define EEPROM_RETRIES 10
53 #define EEPROM_2KB (2 * 1024)
54 /*#define EEPROM_4KB (4 * 1024)*/ /* Exists but not used in Axis products */
55 #define EEPROM_8KB (8 * 1024 - 1 ) /* Last byte has write protection bit */
56 #define EEPROM_16KB (16 * 1024)
58 #define i2c_delay(x) udelay(x)
61 * This structure describes the attached eeprom chip.
62 * The values are probed for.
68 unsigned long sequential_write_pagesize
;
69 unsigned char select_cmd
;
70 unsigned long usec_delay_writecycles
; /* Min time between write cycles
71 (up to 10ms for some models) */
72 unsigned long usec_delay_step
; /* For adaptive algorithm */
73 int adapt_state
; /* 1 = To high , 0 = Even, -1 = To low */
75 /* this one is to keep the read/write operations atomic */
77 int retry_cnt_addr
; /* Used to keep track of number of retries for
78 adaptive timing adjustments */
82 static int eeprom_open(struct inode
* inode
, struct file
* file
);
83 static loff_t
eeprom_lseek(struct file
* file
, loff_t offset
, int orig
);
84 static ssize_t
eeprom_read(struct file
* file
, char * buf
, size_t count
,
86 static ssize_t
eeprom_write(struct file
* file
, const char * buf
, size_t count
,
88 static int eeprom_close(struct inode
* inode
, struct file
* file
);
90 static int eeprom_address(unsigned long addr
);
91 static int read_from_eeprom(char * buf
, int count
);
92 static int eeprom_write_buf(loff_t addr
, const char * buf
, int count
);
93 static int eeprom_read_buf(loff_t addr
, char * buf
, int count
);
95 static void eeprom_disable_write_protect(void);
98 static const char eeprom_name
[] = "eeprom";
100 /* chip description */
101 static struct eeprom_type eeprom
;
103 /* This is the exported file-operations structure for this device. */
104 const struct file_operations eeprom_fops
=
106 .llseek
= eeprom_lseek
,
108 .write
= eeprom_write
,
110 .release
= eeprom_close
113 /* eeprom init call. Probes for different eeprom models. */
115 int __init
eeprom_init(void)
117 mutex_init(&eeprom
.lock
);
119 #ifdef CONFIG_ETRAX_I2C_EEPROM_PROBE
120 #define EETEXT "Found"
122 #define EETEXT "Assuming"
124 if (register_chrdev(EEPROM_MAJOR_NR
, eeprom_name
, &eeprom_fops
))
126 printk(KERN_INFO
"%s: unable to get major %d for eeprom device\n",
127 eeprom_name
, EEPROM_MAJOR_NR
);
131 printk("EEPROM char device v0.3, (c) 2000 Axis Communications AB\n");
134 * Note: Most of this probing method was taken from the printserver (5470e)
135 * codebase. It did not contain a way of finding the 16kB chips
136 * (M24128 or variants). The method used here might not work
137 * for all models. If you encounter problems the easiest way
138 * is probably to define your model within #ifdef's, and hard-
143 eeprom
.usec_delay_writecycles
= INITIAL_WRITEDELAY_US
;
144 eeprom
.usec_delay_step
= 128;
145 eeprom
.adapt_state
= 0;
147 #ifdef CONFIG_ETRAX_I2C_EEPROM_PROBE
154 unsigned char buf_2k_start
[16];
156 /* Im not sure this will work... :) */
157 /* assume 2kB, if failure go for 16kB */
158 /* Test with 16kB settings.. */
159 /* If it's a 2kB EEPROM and we address it outside it's range
160 * it will mirror the address space:
161 * 1. We read two locations (that are mirrored),
162 * if the content differs * it's a 16kB EEPROM.
163 * 2. if it doesn't differ - write different value to one of the locations,
164 * check the other - if content still is the same it's a 2k EEPROM,
165 * restore original data.
168 #define LOC2 (0x1fb) /*1fb, 3ed, 5df, 7d1 */
172 eeprom
.size
= EEPROM_2KB
;
173 eeprom
.select_cmd
= 0xA0;
174 eeprom
.sequential_write_pagesize
= 16;
175 if( eeprom_read_buf( 0, buf_2k_start
, 16 ) == 16 )
177 D(printk("2k start: '%16.16s'\n", buf_2k_start
));
181 printk(KERN_INFO
"%s: Failed to read in 2k mode!\n", eeprom_name
);
185 eeprom
.size
= EEPROM_16KB
;
186 eeprom
.select_cmd
= 0xA0;
187 eeprom
.sequential_write_pagesize
= 64;
190 unsigned char loc1
[4], loc2
[4], tmp
[4];
191 if( eeprom_read_buf(LOC2
, loc2
, 4) == 4)
193 if( eeprom_read_buf(LOC1
, loc1
, 4) == 4)
195 D(printk("0 loc1: (%i) '%4.4s' loc2 (%i) '%4.4s'\n",
196 LOC1
, loc1
, LOC2
, loc2
));
198 if (memcmp(loc1
, loc2
, 4) != 0 )
201 printk(KERN_INFO
"%s: 16k detected in step 1\n", eeprom_name
);
202 eeprom
.size
= EEPROM_16KB
;
208 /* Do step 2 check */
211 if (eeprom_write_buf(LOC1
, loc1
, 1) == 1)
213 /* If 2k EEPROM this write will actually write 10 bytes
216 D(printk("1 loc1: (%i) '%4.4s' loc2 (%i) '%4.4s'\n",
217 LOC1
, loc1
, LOC2
, loc2
));
218 if( eeprom_read_buf(LOC1
, tmp
, 4) == 4)
220 D(printk("2 loc1: (%i) '%4.4s' tmp '%4.4s'\n",
222 if (memcmp(loc1
, tmp
, 4) != 0 )
224 printk(KERN_INFO
"%s: read and write differs! Not 16kB\n",
228 if (eeprom_write_buf(LOC1
, loc1
, 1) == 1)
234 printk(KERN_INFO
"%s: Restore 2k failed during probe,"
235 " EEPROM might be corrupt!\n", eeprom_name
);
239 /* Go to 2k mode and write original data */
240 eeprom
.size
= EEPROM_2KB
;
241 eeprom
.select_cmd
= 0xA0;
242 eeprom
.sequential_write_pagesize
= 16;
243 if( eeprom_write_buf(0, buf_2k_start
, 16) == 16)
248 printk(KERN_INFO
"%s: Failed to write back 2k start!\n",
252 eeprom
.size
= EEPROM_2KB
;
258 if( eeprom_read_buf(LOC2
, loc2
, 1) == 1)
260 D(printk("0 loc1: (%i) '%4.4s' loc2 (%i) '%4.4s'\n",
261 LOC1
, loc1
, LOC2
, loc2
));
262 if (memcmp(loc1
, loc2
, 4) == 0 )
264 /* Data the same, must be mirrored -> 2k */
266 printk(KERN_INFO
"%s: 2k detected in step 2\n", eeprom_name
);
268 if (eeprom_write_buf(LOC1
, loc1
, 1) == 1)
274 printk(KERN_INFO
"%s: Restore 2k failed during probe,"
275 " EEPROM might be corrupt!\n", eeprom_name
);
279 eeprom
.size
= EEPROM_2KB
;
283 printk(KERN_INFO
"%s: 16k detected in step 2\n",
286 /* Data differs, assume 16k */
288 if (eeprom_write_buf(LOC1
, loc1
, 1) == 1)
294 printk(KERN_INFO
"%s: Restore 16k failed during probe,"
295 " EEPROM might be corrupt!\n", eeprom_name
);
298 eeprom
.size
= EEPROM_16KB
;
307 printk(KERN_INFO
"%s: Probing failed!, using 2KB!\n", eeprom_name
);
308 eeprom
.size
= EEPROM_2KB
;
319 eeprom
.size
= EEPROM_2KB
;
327 eeprom
.size
= EEPROM_2KB
;
333 eeprom
.size
= EEPROM_8KB
;
338 #elif defined(CONFIG_ETRAX_I2C_EEPROM_16KB)
339 eeprom
.size
= EEPROM_16KB
;
340 #elif defined(CONFIG_ETRAX_I2C_EEPROM_8KB)
341 eeprom
.size
= EEPROM_8KB
;
342 #elif defined(CONFIG_ETRAX_I2C_EEPROM_2KB)
343 eeprom
.size
= EEPROM_2KB
;
349 printk("%s: " EETEXT
" i2c compatible 2kB eeprom.\n", eeprom_name
);
350 eeprom
.sequential_write_pagesize
= 16;
351 eeprom
.select_cmd
= 0xA0;
354 printk("%s: " EETEXT
" i2c compatible 8kB eeprom.\n", eeprom_name
);
355 eeprom
.sequential_write_pagesize
= 16;
356 eeprom
.select_cmd
= 0x80;
359 printk("%s: " EETEXT
" i2c compatible 16kB eeprom.\n", eeprom_name
);
360 eeprom
.sequential_write_pagesize
= 64;
361 eeprom
.select_cmd
= 0xA0;
365 printk("%s: Did not find a supported eeprom\n", eeprom_name
);
371 eeprom_disable_write_protect();
376 /* Opens the device. */
377 static int eeprom_open(struct inode
* inode
, struct file
* file
)
379 if(iminor(inode
) != EEPROM_MINOR_NR
)
381 if(imajor(inode
) != EEPROM_MAJOR_NR
)
384 if( eeprom
.size
> 0 )
390 /* No EEprom found */
394 /* Changes the current file position. */
396 static loff_t
eeprom_lseek(struct file
* file
, loff_t offset
, int orig
)
399 * orig 0: position from beginning of eeprom
400 * orig 1: relative from current position
401 * orig 2: position from last eeprom address
407 file
->f_pos
= offset
;
410 file
->f_pos
+= offset
;
413 file
->f_pos
= eeprom
.size
- offset
;
419 /* truncate position */
426 if (file
->f_pos
>= eeprom
.size
)
428 file
->f_pos
= eeprom
.size
- 1;
432 return ( file
->f_pos
);
435 /* Reads data from eeprom. */
437 static int eeprom_read_buf(loff_t addr
, char * buf
, int count
)
439 return eeprom_read(NULL
, buf
, count
, &addr
);
444 /* Reads data from eeprom. */
446 static ssize_t
eeprom_read(struct file
* file
, char * buf
, size_t count
, loff_t
*off
)
449 unsigned long p
= *off
;
453 if(p
>= eeprom
.size
) /* Address i 0 - (size-1) */
458 if (mutex_lock_interruptible(&eeprom
.lock
))
461 page
= (unsigned char) (p
>> 8);
463 if(!eeprom_address(p
))
465 printk(KERN_INFO
"%s: Read failed to address the eeprom: "
466 "0x%08X (%i) page: %i\n", eeprom_name
, (int)p
, (int)p
, page
);
469 /* don't forget to wake them up */
470 mutex_unlock(&eeprom
.lock
);
474 if( (p
+ count
) > eeprom
.size
)
477 count
= eeprom
.size
- p
;
480 /* stop dummy write op and initiate the read op */
483 /* special case for small eeproms */
484 if(eeprom
.size
< EEPROM_16KB
)
486 i2c_outbyte( eeprom
.select_cmd
| 1 | (page
<< 1) );
489 /* go on with the actual read */
490 read
= read_from_eeprom( buf
, count
);
497 mutex_unlock(&eeprom
.lock
);
501 /* Writes data to eeprom. */
503 static int eeprom_write_buf(loff_t addr
, const char * buf
, int count
)
505 return eeprom_write(NULL
, buf
, count
, &addr
);
509 /* Writes data to eeprom. */
511 static ssize_t
eeprom_write(struct file
* file
, const char * buf
, size_t count
,
514 int i
, written
, restart
=1;
517 if (!access_ok(VERIFY_READ
, buf
, count
))
522 /* bail out if we get interrupted */
523 if (mutex_lock_interruptible(&eeprom
.lock
))
525 for(i
= 0; (i
< EEPROM_RETRIES
) && (restart
> 0); i
++)
532 while( (written
< count
) && (p
< eeprom
.size
))
534 /* address the eeprom */
535 if(!eeprom_address(p
))
537 printk(KERN_INFO
"%s: Write failed to address the eeprom: "
538 "0x%08X (%i) \n", eeprom_name
, (int)p
, (int)p
);
541 /* don't forget to wake them up */
542 mutex_unlock(&eeprom
.lock
);
545 #ifdef EEPROM_ADAPTIVE_TIMING
546 /* Adaptive algorithm to adjust timing */
547 if (eeprom
.retry_cnt_addr
> 0)
550 D(printk(">D=%i d=%i\n",
551 eeprom
.usec_delay_writecycles
, eeprom
.usec_delay_step
));
553 if (eeprom
.usec_delay_step
< 4)
555 eeprom
.usec_delay_step
++;
556 eeprom
.usec_delay_writecycles
+= eeprom
.usec_delay_step
;
561 if (eeprom
.adapt_state
> 0)
564 eeprom
.usec_delay_step
*= 2;
565 if (eeprom
.usec_delay_step
> 2)
567 eeprom
.usec_delay_step
--;
569 eeprom
.usec_delay_writecycles
+= eeprom
.usec_delay_step
;
571 else if (eeprom
.adapt_state
< 0)
573 /* To High before (toggle dir) */
574 eeprom
.usec_delay_writecycles
+= eeprom
.usec_delay_step
;
575 if (eeprom
.usec_delay_step
> 1)
577 eeprom
.usec_delay_step
/= 2;
578 eeprom
.usec_delay_step
--;
583 eeprom
.adapt_state
= 1;
587 /* To High (or good) now */
588 D(printk("<D=%i d=%i\n",
589 eeprom
.usec_delay_writecycles
, eeprom
.usec_delay_step
));
591 if (eeprom
.adapt_state
< 0)
594 if (eeprom
.usec_delay_step
> 1)
596 eeprom
.usec_delay_step
*= 2;
597 eeprom
.usec_delay_step
--;
599 if (eeprom
.usec_delay_writecycles
> eeprom
.usec_delay_step
)
601 eeprom
.usec_delay_writecycles
-= eeprom
.usec_delay_step
;
605 else if (eeprom
.adapt_state
> 0)
607 /* To Low before (toggle dir) */
608 if (eeprom
.usec_delay_writecycles
> eeprom
.usec_delay_step
)
610 eeprom
.usec_delay_writecycles
-= eeprom
.usec_delay_step
;
612 if (eeprom
.usec_delay_step
> 1)
614 eeprom
.usec_delay_step
/= 2;
615 eeprom
.usec_delay_step
--;
618 eeprom
.adapt_state
= -1;
621 if (eeprom
.adapt_state
> -100)
623 eeprom
.adapt_state
--;
627 /* Restart adaption */
628 D(printk("#Restart\n"));
629 eeprom
.usec_delay_step
++;
632 #endif /* EEPROM_ADAPTIVE_TIMING */
633 /* write until we hit a page boundary or count */
636 i2c_outbyte(buf
[written
]);
640 printk(KERN_INFO
"%s: write error, retrying. %d\n", eeprom_name
, i
);
646 } while( written
< count
&& ( p
% eeprom
.sequential_write_pagesize
));
648 /* end write cycle */
650 i2c_delay(eeprom
.usec_delay_writecycles
);
654 mutex_unlock(&eeprom
.lock
);
655 if (written
== 0 && p
>= eeprom
.size
){
662 /* Closes the device. */
664 static int eeprom_close(struct inode
* inode
, struct file
* file
)
666 /* do nothing for now */
670 /* Sets the current address of the eeprom. */
672 static int eeprom_address(unsigned long addr
)
675 unsigned char page
, offset
;
677 page
= (unsigned char) (addr
>> 8);
678 offset
= (unsigned char) addr
;
680 for(i
= 0; i
< EEPROM_RETRIES
; i
++)
682 /* start a dummy write for addressing */
685 if(eeprom
.size
== EEPROM_16KB
)
687 i2c_outbyte( eeprom
.select_cmd
);
693 i2c_outbyte( eeprom
.select_cmd
| (page
<< 1) );
699 /* Must have a delay here.. 500 works, >50, 100->works 5th time*/
700 i2c_delay(MAX_WRITEDELAY_US
/ EEPROM_RETRIES
* i
);
701 /* The chip needs up to 10 ms from write stop to next start */
719 eeprom
.retry_cnt_addr
= i
;
720 D(printk("%i\n", eeprom
.retry_cnt_addr
));
721 if(eeprom
.retry_cnt_addr
== EEPROM_RETRIES
)
729 /* Reads from current address. */
731 static int read_from_eeprom(char * buf
, int count
)
735 for(i
= 0; i
< EEPROM_RETRIES
; i
++)
737 if(eeprom
.size
== EEPROM_16KB
)
739 i2c_outbyte( eeprom
.select_cmd
| 1 );
748 if(i
== EEPROM_RETRIES
)
750 printk(KERN_INFO
"%s: failed to read from eeprom\n", eeprom_name
);
756 while( (read
< count
))
758 if (put_user(i2c_inbyte(), &buf
[read
++]))
766 * make sure we don't ack last byte or you will get very strange
775 /* stop the operation */
781 /* Disables write protection if applicable. */
784 #define ax_printf printk
785 static void eeprom_disable_write_protect(void)
787 /* Disable write protect */
788 if (eeprom
.size
== EEPROM_8KB
)
790 /* Step 1 Set WEL = 1 (write 00000010 to address 1FFFh */
795 DBP_SAVE(ax_printf("Get ack returns false\n"));
800 DBP_SAVE(ax_printf("Get ack returns false 2\n"));
805 DBP_SAVE(ax_printf("Get ack returns false 3\n"));
811 /* Step 2 Set RWEL = 1 (write 00000110 to address 1FFFh */
816 DBP_SAVE(ax_printf("Get ack returns false 55\n"));
821 DBP_SAVE(ax_printf("Get ack returns false 52\n"));
826 DBP_SAVE(ax_printf("Get ack returns false 53\n"));
830 /* Step 3 Set BP1, BP0, and/or WPEN bits (write 00000110 to address 1FFFh */
835 DBP_SAVE(ax_printf("Get ack returns false 56\n"));
840 DBP_SAVE(ax_printf("Get ack returns false 57\n"));
845 DBP_SAVE(ax_printf("Get ack returns false 58\n"));
849 /* Write protect disabled */
852 device_initcall(eeprom_init
);