From mboxrd@z Thu Jan 1 00:00:00 1970 From: Heiko Schocher Date: Mon, 16 Nov 2015 12:31:39 +0100 Subject: [U-Boot] [PATCH 14/17] eeprom: Pull out the RW loop In-Reply-To: <1447185213-5799-14-git-send-email-marex@denx.de> References: <1447185213-5799-1-git-send-email-marex@denx.de> <1447185213-5799-14-git-send-email-marex@denx.de> Message-ID: <5649BE9B.6080707@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hello Marek, Am 10.11.2015 um 20:53 schrieb Marek Vasut: > 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 > Cc: Simon Glass > Cc: Tom Rini > Cc: Heiko Schocher > --- > common/cmd_eeprom.c | 51 +++++++++++++++++++++------------------------------ > 1 file changed, 21 insertions(+), 30 deletions(-) Reviewed-by: Heiko Schocher bye, Heiko > > diff --git a/common/cmd_eeprom.c b/common/cmd_eeprom.c > index b39ca5d..d0942ef 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[]) > -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany