]>
git.ipfire.org Git - thirdparty/u-boot.git/blob - drivers/mtd/mw_eeprom.c
1 /* Three-wire (MicroWire) serial eeprom driver (for 93C46 and compatibles) */
5 #include <asm/ic/ssi.h>
8 * Serial EEPROM opcodes, including start bit
10 #define EEP_OPC_ERASE 0x7 /* 3-bit opcode */
11 #define EEP_OPC_WRITE 0x5 /* 3-bit opcode */
12 #define EEP_OPC_READ 0x6 /* 3-bit opcode */
14 #define EEP_OPC_ERASE_ALL 0x12 /* 5-bit opcode */
15 #define EEP_OPC_ERASE_EN 0x13 /* 5-bit opcode */
16 #define EEP_OPC_WRITE_ALL 0x11 /* 5-bit opcode */
17 #define EEP_OPC_ERASE_DIS 0x10 /* 5-bit opcode */
21 static void mw_eeprom_select(int dev
)
23 ssi_set_interface(2048, 0, 0, 0);
30 static int mw_eeprom_size(int dev
)
35 mw_eeprom_select(dev
);
36 ssi_tx_byte(EEP_OPC_READ
);
38 res
= ssi_txrx_byte(0) << 8;
40 for (x
= 0; x
< 16; x
++) {
41 if (! (res
& 0x8000)) {
51 int mw_eeprom_erase_enable(int dev
)
53 mw_eeprom_select(dev
);
54 ssi_tx_byte(EEP_OPC_ERASE_EN
);
62 int mw_eeprom_erase_disable(int dev
)
64 mw_eeprom_select(dev
);
65 ssi_tx_byte(EEP_OPC_ERASE_DIS
);
74 u32
mw_eeprom_read_word(int dev
, int addr
)
80 mw_eeprom_select(dev
);
81 ssi_tx_byte((EEP_OPC_READ
<< 5) | ((addr
>> (addrlen
- 5)) & 0x1f));
82 rcv
= ssi_txrx_byte(addr
<< (13 - addrlen
));
83 res
= rcv
<< (16 - addrlen
);
89 res
|= rcv
<< (bits
- 8);
91 res
|= rcv
>> (8 - bits
);
101 int mw_eeprom_write_word(int dev
, int addr
, u16 data
)
106 mw_eeprom_erase_enable(dev
);
107 mw_eeprom_select(dev
);
111 byte1
= EEP_OPC_WRITE
>> 2;
112 byte2
= (EEP_OPC_WRITE
<< 6)&0xc0;
116 byte1
= EEP_OPC_WRITE
>> 1;
117 byte2
= (EEP_OPC_WRITE
<< 7)&0x80;
121 byte1
= EEP_OPC_WRITE
;
125 byte1
= EEP_OPC_WRITE
<< 1;
130 byte1
= EEP_OPC_WRITE
<< 2;
135 printf("Unsupported number of address bits: %d\n", addrlen
);
142 ssi_tx_byte(data
>> 8);
143 ssi_tx_byte(data
& 0xff);
145 udelay(10000); /* Worst case */
146 mw_eeprom_erase_disable(dev
);
152 int mw_eeprom_write(int dev
, int addr
, u8
*buffer
, int len
)
158 u16 temp
= mw_eeprom_read_word(dev
, addr
>> 1);
162 mw_eeprom_write_word(dev
, addr
>> 1, temp
);
170 mw_eeprom_write_word(dev
, addr
>> 1, *(u16
*)buffer
);
178 u16 temp
= mw_eeprom_read_word(dev
, addr
>> 1);
180 temp
|= buffer
[0] << 8;
182 mw_eeprom_write_word(dev
, addr
>> 1, temp
);
193 int mw_eeprom_read(int dev
, int addr
, u8
*buffer
, int len
)
199 u16 temp
= mw_eeprom_read_word(dev
, addr
>> 1);
200 buffer
[0]= temp
& 0xff;
209 *(u16
*)buffer
= mw_eeprom_read_word(dev
, addr
>> 1);
217 u16 temp
= mw_eeprom_read_word(dev
, addr
>> 1);
218 buffer
[0] = temp
>> 8;
229 int mw_eeprom_probe(int dev
)
231 addrlen
= mw_eeprom_size(dev
);
233 if (addrlen
< 6 || addrlen
> 10) {