Dear Peter Tyser, In message <300544b7901dacbe6b9e3edd052629f612b92735.1228160312.git.pty...@xes-inc.com> you wrote: > Initial support for the DS4510, a CPU supervisor with > integrated EEPROM, SRAM, and 4 programmable non-volatile > GPIO pins. The CONFIG_DS4510 define enables support > for the device while the CONFIG_CMD_DS4510 define > enables the ds4510 command. The additional > CONFIG_DS4510_INFO, CONFIG_DS4510_MEM, and > CONFIG_DS4510_RST defines add additional sub-commands > to the ds4510 command when defined.
General note: the code shows a serious lack of error detection and error handling. > Signed-off-by: Peter Tyser <[email protected]> > --- > README | 4 + > drivers/misc/Makefile | 1 + > drivers/misc/ds4510.c | 400 > +++++++++++++++++++++++++++++++++++++++++++++++++ > include/gpio/ds4510.h | 75 +++++++++ > 4 files changed, 480 insertions(+), 0 deletions(-) > create mode 100644 drivers/misc/ds4510.c > create mode 100644 include/gpio/ds4510.h The driver would probably be better placed in the drivers/hwmon/ directory. Also, I don't see a reason to create a new include/gpio/ directory here, especially since this is not primarily a GPIO device. > diff --git a/README b/README > index bca8061..cea057d 100644 > --- a/README > +++ b/README > @@ -574,6 +574,10 @@ The following options need to be configured: > CONFIG_CMD_DHCP * DHCP support > CONFIG_CMD_DIAG * Diagnostics > CONFIG_CMD_DOC * Disk-On-Chip Support > + CONFIG_CMD_DS4510 * ds4510 I2C gpio commands > + CONFIG_CMD_DS4510_INFO * ds4510 I2C info command > + CONFIG_CMD_DS4510_MEM * ds4510 I2C eeprom/sram commansd > + CONFIG_CMD_DS4510_RST * ds4510 I2C rst command Do we really need such granularity? If you have the device on your board and suppoort it in U-Boot, you probably always want to have CONFIG_CMD_DS4510_INFO and CONFIG_CMD_DS4510_RST. And CONFIG_CMD_DS4510_MEM seems reduindand - that should already be covered by the CONFIG_CMD_EEPROM setting. > diff --git a/drivers/misc/ds4510.c b/drivers/misc/ds4510.c > new file mode 100644 > index 0000000..572dcb7 > --- /dev/null > +++ b/drivers/misc/ds4510.c ... > +/* > + * Write to DS4510, taking page boundaries into account > + */ > +int ds4510_mem_write(uint8_t chip, int offset, uint8_t *buf, int count) > +{ > + int wrlen; > + int i = 0; > + > + do { > + wrlen = DS4510_EEPROM_PAGE_SIZE - > + DS4510_EEPROM_PAGE_OFFSET(offset); > + if (count < wrlen) > + wrlen = count; > + i2c_write(chip, offset, 1, &buf[i], wrlen); i2c_write() can fail - it returns error codes. I'm missing error handling here and elsewhere. I'll flag a few locations, but please check all the code. > +int ds4510_gpio_write(uint8_t chip, uint8_t val) > +{ > + uint8_t data; > + int i; > + > + for (i = 0; i < DS4510_NUM_IO; i++) { > + i2c_read(chip, DS4510_IO0 - i, 1, &data, 1); Error handling? > + if (val & (0x1 << i)) > + data |= 0x1; > + else > + data &= ~0x1; > + > + ds4510_mem_write(chip, DS4510_IO0 - i, &data, 1); Error handling? > +int ds4510_gpio_read(uint8_t chip) > +{ > + uint8_t data; > + int val = 0; > + int i; > + > + for (i = 0; i < DS4510_NUM_IO; i++) { > + i2c_read(chip, DS4510_IO0 - i, 1, &data, 1); Error handling? > +static int ds4510_info(uint8_t chip) > +{ > + int i; > + int tmp; > + uint8_t data; > + > + printf("DS4510 @ 0x%x:\n\n", chip); > + > + i2c_read(chip, DS4510_RSTDELAY, 1, &data, 1); error handling? > + printf("rstdelay = 0x%x\n\n", data & DS4510_RSTDELAY_MASK); > + > + i2c_read(chip, DS4510_CFG, 1, &data, 1); error handling? > +/* Use 'maxargs' field as minimum number of args to ease error checking */ > +cmd_tbl_t cmd_ds4510[] = { Please do not mis-use variables with a clearly defined meaning in such a way. This is not acceptable. > +#ifdef CONFIG_CMD_DS4510_MEM > + "ds4510 eeprom read addr off cnt\n" > + "ds4510 eeprom write addr off cnt\n" > + " - read/write 'cnt' bytes at EEPROM offset 'off'\n" > + "ds4510 seeprom read addr off cnt\n" > + "ds4510 seeprom write addr off cnt\n" > + " - read/write 'cnt' bytes at SRAM-shadowed EEPROM offset 'off'\n" > + "ds4510 sram read addr off cnt\n" > + "ds4510 sram write addr off cnt\n" > + " - read/write 'cnt' bytes at SRAM offset 'off'\n" > +#endif We should not need a separate EEPROM command here, I think. And cannot this SRAM be written using plain "cp" commands? Best regards, Wolfgang Denk -- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: [email protected] For every problem there is one solution which is simple, neat, and wrong. - H. L. Mencken _______________________________________________ U-Boot mailing list [email protected] http://lists.denx.de/mailman/listinfo/u-boot

