3 * Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com
5 * SPDX-License-Identifier: GPL-2.0+
12 #define EEPROM_CAP 0x50000358
13 #define EEPROM_DATA 0x5000035c
16 unsigned int eepromReadLong(int offs)
22 out_be16((void *)EEPROM_CAP, offs);
29 ret = in_be16((void *)EEPROM_CAP);
31 if ((ret & 0x8000) != 0)
35 value = in_be32((void *)EEPROM_DATA);
41 unsigned char eepromReadByte(int offs)
43 unsigned int valueLong;
46 valueLong = eepromReadLong(offs & ~3);
47 ptr = (unsigned char *)&valueLong;
53 void eepromWriteLong(int offs, unsigned int value)
60 out_be32((void *)EEPROM_DATA, value);
61 out_be16((void *)EEPROM_CAP, 0x8000 + offs);
66 ret = in_be16((void *)EEPROM_CAP);
68 if ((ret & 0x8000) == 0)
74 void eepromWriteByte(int offs, unsigned char valueByte)
76 unsigned int valueLong;
79 valueLong = eepromReadLong(offs & ~3);
80 ptr = (unsigned char *)&valueLong;
82 ptr[offs & 3] = valueByte;
84 eepromWriteLong(offs & ~3, valueLong);
88 void i2c_read (uchar *addr, int alen, uchar *buffer, int len)
93 /* printf("\naddr=%x alen=%x buffer=%x len=%x", addr[0], addr[1], *(short *)addr, alen, buffer, len); /###* test-only */
98 * Read till lword boundary
100 len2 = 4 - (*(short *)addr & 0x0003);
101 for (i=0; i<len2; i++)
103 *buffer++ = eepromReadByte(ptr++);
109 len2 = (len - len2) >> 2;
110 for (i=0; i<len2; i++)
112 *(unsigned int *)buffer = eepromReadLong(ptr);
120 len2 = (*(short *)addr + len) & 0x0003;
121 for (i=0; i<len2; i++)
123 *buffer++ = eepromReadByte(ptr++);
127 void i2c_write (uchar *addr, int alen, uchar *buffer, int len)
132 /* printf("\naddr=%x alen=%x buffer=%x len=%x", addr[0], addr[1], *(short *)addr, alen, buffer, len); /###* test-only */
134 ptr = *(short *)addr;
137 * Write till lword boundary
139 len2 = 4 - (*(short *)addr & 0x0003);
140 for (i=0; i<len2; i++)
142 eepromWriteByte(ptr++, *buffer++);
148 len2 = (len - len2) >> 2;
149 for (i=0; i<len2; i++)
151 eepromWriteLong(ptr, *(unsigned int *)buffer);
159 len2 = (*(short *)addr + len) & 0x0003;
160 for (i=0; i<len2; i++)
162 eepromWriteByte(ptr++, *buffer++);