diff options
author | Marek Vasut <marex@denx.de> | 2015-11-10 20:53:30 +0100 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2015-11-21 21:50:25 -0500 |
commit | 1a37889b0ad084a740b4f785031d7ae9955d947b (patch) | |
tree | 809c2ca0c648f119a14b27252552334ea2b8f323 /common | |
parent | 39b6f98bd55541a89eddaf59effeb75f6fe631f6 (diff) | |
download | u-boot-1a37889b0ad084a740b4f785031d7ae9955d947b.tar.gz u-boot-1a37889b0ad084a740b4f785031d7ae9955d947b.tar.xz u-boot-1a37889b0ad084a740b4f785031d7ae9955d947b.zip |
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>
Diffstat (limited to 'common')
-rw-r--r-- | common/cmd_eeprom.c | 51 |
1 files changed, 21 insertions, 30 deletions
diff --git a/common/cmd_eeprom.c b/common/cmd_eeprom.c index b39ca5d94d..d0942ef65d 100644 --- a/common/cmd_eeprom.c +++ b/common/cmd_eeprom.c @@ -146,38 +146,44 @@ static int eeprom_rw_block(unsigned offset, uchar *addr, unsigned alen, 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 alen, len; int rcode = 0; 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) { - unsigned alen, len; - alen = eeprom_addr(dev_addr, offset, addr); 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; offset += len; + + if (!read) + udelay(CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS * 1000); } 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; - 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. + */ + 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); @@ -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 * because the address counter only increments within a page. */ - - 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); - } + ret = eeprom_rw(dev_addr, offset, buffer, cnt, 1); eeprom_write_enable(dev_addr, 0); - - return rcode; + return ret; } static int do_eeprom(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |