]> git.ipfire.org Git - thirdparty/u-boot.git/blob - board/esd/dasa_sim/eeprom.c
Add GPL-2.0+ SPDX-License-Identifier to source files
[thirdparty/u-boot.git] / board / esd / dasa_sim / eeprom.c
1 /*
2 * (C) Copyright 2001
3 * Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com
4 *
5 * SPDX-License-Identifier: GPL-2.0+
6 */
7
8 #include <common.h>
9 #include <command.h>
10 #include <asm/io.h>
11
12 #define EEPROM_CAP 0x50000358
13 #define EEPROM_DATA 0x5000035c
14
15
16 unsigned int eepromReadLong(int offs)
17 {
18 unsigned int value;
19 unsigned short ret;
20 int count;
21
22 out_be16((void *)EEPROM_CAP, offs);
23
24 count = 0;
25
26 for (;;)
27 {
28 count++;
29 ret = in_be16((void *)EEPROM_CAP);
30
31 if ((ret & 0x8000) != 0)
32 break;
33 }
34
35 value = in_be32((void *)EEPROM_DATA);
36
37 return value;
38 }
39
40
41 unsigned char eepromReadByte(int offs)
42 {
43 unsigned int valueLong;
44 unsigned char *ptr;
45
46 valueLong = eepromReadLong(offs & ~3);
47 ptr = (unsigned char *)&valueLong;
48
49 return ptr[offs & 3];
50 }
51
52
53 void eepromWriteLong(int offs, unsigned int value)
54 {
55 unsigned short ret;
56 int count;
57
58 count = 0;
59
60 out_be32((void *)EEPROM_DATA, value);
61 out_be16((void *)EEPROM_CAP, 0x8000 + offs);
62
63 for (;;)
64 {
65 count++;
66 ret = in_be16((void *)EEPROM_CAP);
67
68 if ((ret & 0x8000) == 0)
69 break;
70 }
71 }
72
73
74 void eepromWriteByte(int offs, unsigned char valueByte)
75 {
76 unsigned int valueLong;
77 unsigned char *ptr;
78
79 valueLong = eepromReadLong(offs & ~3);
80 ptr = (unsigned char *)&valueLong;
81
82 ptr[offs & 3] = valueByte;
83
84 eepromWriteLong(offs & ~3, valueLong);
85 }
86
87
88 void i2c_read (uchar *addr, int alen, uchar *buffer, int len)
89 {
90 int i;
91 int len2, ptr;
92
93 /* printf("\naddr=%x alen=%x buffer=%x len=%x", addr[0], addr[1], *(short *)addr, alen, buffer, len); /###* test-only */
94
95 ptr = *(short *)addr;
96
97 /*
98 * Read till lword boundary
99 */
100 len2 = 4 - (*(short *)addr & 0x0003);
101 for (i=0; i<len2; i++)
102 {
103 *buffer++ = eepromReadByte(ptr++);
104 }
105
106 /*
107 * Read all lwords
108 */
109 len2 = (len - len2) >> 2;
110 for (i=0; i<len2; i++)
111 {
112 *(unsigned int *)buffer = eepromReadLong(ptr);
113 buffer += 4;
114 ptr += 4;
115 }
116
117 /*
118 * Read last bytes
119 */
120 len2 = (*(short *)addr + len) & 0x0003;
121 for (i=0; i<len2; i++)
122 {
123 *buffer++ = eepromReadByte(ptr++);
124 }
125 }
126
127 void i2c_write (uchar *addr, int alen, uchar *buffer, int len)
128 {
129 int i;
130 int len2, ptr;
131
132 /* printf("\naddr=%x alen=%x buffer=%x len=%x", addr[0], addr[1], *(short *)addr, alen, buffer, len); /###* test-only */
133
134 ptr = *(short *)addr;
135
136 /*
137 * Write till lword boundary
138 */
139 len2 = 4 - (*(short *)addr & 0x0003);
140 for (i=0; i<len2; i++)
141 {
142 eepromWriteByte(ptr++, *buffer++);
143 }
144
145 /*
146 * Write all lwords
147 */
148 len2 = (len - len2) >> 2;
149 for (i=0; i<len2; i++)
150 {
151 eepromWriteLong(ptr, *(unsigned int *)buffer);
152 buffer += 4;
153 ptr += 4;
154 }
155
156 /*
157 * Write last bytes
158 */
159 len2 = (*(short *)addr + len) & 0x0003;
160 for (i=0; i<len2; i++)
161 {
162 eepromWriteByte(ptr++, *buffer++);
163 }
164 }