eeprom: Pull out the RW loop
Unify the code for doing read/write into single function, since the code for both the read and write is almost identical. This again trims down the code duplication. Signed-off-by: Marek Vasut <marex@denx.de> Cc: Simon Glass <sjg@chromium.org> Cc: Tom Rini <trini@konsulko.com> Cc: Heiko Schocher <hs@denx.de> Reviewed-by: Heiko Schocher <hs@denx.de>
This commit is contained in:
parent
39b6f98bd5
commit
1a37889b0a
|
@ -146,38 +146,44 @@ static int eeprom_rw_block(unsigned offset, uchar *addr, unsigned alen,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int eeprom_read (unsigned dev_addr, unsigned offset, uchar *buffer, unsigned cnt)
|
static int eeprom_rw(unsigned dev_addr, unsigned offset, uchar *buffer,
|
||||||
|
unsigned cnt, bool read)
|
||||||
{
|
{
|
||||||
unsigned end = offset + cnt;
|
unsigned end = offset + cnt;
|
||||||
|
unsigned alen, len;
|
||||||
int rcode = 0;
|
int rcode = 0;
|
||||||
uchar addr[3];
|
uchar addr[3];
|
||||||
|
|
||||||
/*
|
|
||||||
* Read data until done or would cross a page boundary.
|
|
||||||
* We must write the address again when changing pages
|
|
||||||
* because the next page may be in a different device.
|
|
||||||
*/
|
|
||||||
while (offset < end) {
|
while (offset < end) {
|
||||||
unsigned alen, len;
|
|
||||||
|
|
||||||
alen = eeprom_addr(dev_addr, offset, addr);
|
alen = eeprom_addr(dev_addr, offset, addr);
|
||||||
|
|
||||||
len = eeprom_len(offset, end);
|
len = eeprom_len(offset, end);
|
||||||
|
|
||||||
rcode = eeprom_rw_block(offset, addr, alen, buffer, len, 1);
|
rcode = eeprom_rw_block(offset, addr, alen, buffer, len, read);
|
||||||
|
|
||||||
buffer += len;
|
buffer += len;
|
||||||
offset += len;
|
offset += len;
|
||||||
|
|
||||||
|
if (!read)
|
||||||
|
udelay(CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rcode;
|
return rcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
int eeprom_write (unsigned dev_addr, unsigned offset, uchar *buffer, unsigned cnt)
|
int eeprom_read(unsigned dev_addr, unsigned offset, uchar *buffer, unsigned cnt)
|
||||||
{
|
{
|
||||||
unsigned end = offset + cnt;
|
/*
|
||||||
int rcode = 0;
|
* Read data until done or would cross a page boundary.
|
||||||
uchar addr[3];
|
* We must write the address again when changing pages
|
||||||
|
* because the next page may be in a different device.
|
||||||
|
*/
|
||||||
|
return eeprom_rw(dev_addr, offset, buffer, cnt, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int eeprom_write(unsigned dev_addr, unsigned offset, uchar *buffer, unsigned cnt)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
eeprom_write_enable(dev_addr, 1);
|
eeprom_write_enable(dev_addr, 1);
|
||||||
|
|
||||||
|
@ -186,25 +192,10 @@ int eeprom_write (unsigned dev_addr, unsigned offset, uchar *buffer, unsigned cn
|
||||||
* We must write the address again when changing pages
|
* We must write the address again when changing pages
|
||||||
* because the address counter only increments within a page.
|
* because the address counter only increments within a page.
|
||||||
*/
|
*/
|
||||||
|
ret = eeprom_rw(dev_addr, offset, buffer, cnt, 1);
|
||||||
while (offset < end) {
|
|
||||||
unsigned alen, len;
|
|
||||||
|
|
||||||
alen = eeprom_addr(dev_addr, offset, addr);
|
|
||||||
|
|
||||||
len = eeprom_len(offset, end);
|
|
||||||
|
|
||||||
rcode = eeprom_rw_block(offset, addr, alen, buffer, len, 0);
|
|
||||||
|
|
||||||
buffer += len;
|
|
||||||
offset += len;
|
|
||||||
|
|
||||||
udelay(CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS * 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
eeprom_write_enable(dev_addr, 0);
|
eeprom_write_enable(dev_addr, 0);
|
||||||
|
return ret;
|
||||||
return rcode;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int do_eeprom(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
static int do_eeprom(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
|
|
Loading…
Reference in New Issue