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