The patch looks good. I had a few minor nitpicky style comments below: > As suggested by Peter I've implemented the 16-pin support in the existing > pca953x driver. So this is pretty much a re-write of the v1 patch. Is the > commit > message sufficient to document CONFIG_SYS_I2C_PCA953X_WIDTH or is > there something under doc/ that I should be adding to.
You could add a brief description to the top-level README file. There is currently a bit of info in the "GPIO Support" section that could be added to. > #include <common.h> > @@ -38,22 +38,78 @@ enum { > PCA953X_CMD_INVERT, > }; > > +#ifdef CONFIG_SYS_I2C_PCA953X_WIDTH > +struct chip_ngpio { > + uint8_t chip; > + uint8_t ngpio; > +}; Since this structure is 953x-specific I'd rename chip_ngpio pca953x_chip_ngpio to clarify its a driver-specific structure and to prevent the (unlikely) name collision down the road. The same comment applies to ngpio()->pca953x_ngpio(), chip_ngpios[]->pca953x_chip_ngpios[]. > +static struct chip_ngpio chip_ngpios[] = CONFIG_SYS_I2C_PCA953X_WIDTH; > +#define NUM_CHIP_GPIOS (sizeof(chip_ngpios) / sizeof(struct chip_ngpio)) > + > +/* > + * Determine the number of GPIO pins supported. If we don't know we assume > + * 8 pins. > + */ > +static int ngpio(uint8_t chip) > +{ > + int i; > + > + for (i = 0; i < NUM_CHIP_GPIOS; i++) { > + if (chip_ngpios[i].chip == chip) > + return chip_ngpios[i].ngpio; > + } I'd remove the for loop braces above per the Linux CodingStyle documentation that U-Boot adheres to. There should also be an empty line above the "return 8" below. > + return 8; > +} > +#else > +#define ngpio(chip) 8 > +#endif > + > /* > * Modify masked bits in register > */ > static int pca953x_reg_write(uint8_t chip, uint addr, uint mask, uint data) > { > - uint8_t val; > + uint8_t valb; > + uint16_t valw; I'd remove one of the spaces between "valb" above. My understanding is spaces shouldn't be used for such vertical alignment. > > - if (i2c_read(chip, addr, 1, &val, 1)) > - return -1; > + if (ngpio(chip) <= 8) { > + if (i2c_read(chip, addr, 1, &valb, 1)) > + return -1; > + > + valb &= ~mask; > + valb |= data; > + > + return i2c_write(chip, addr, 1, &valb, 1); > + } else { > + if (i2c_read(chip, addr << 1, 1, (u8*)&valw, 2)) > + return -1; > + > + valw &= ~mask; > + valw |= data; > + > + return i2c_write(chip, addr << 1, 1, (u8*)&valw, 2); > + } > +} > > - val &= ~mask; > - val |= data; > +static int pca953x_reg_read(uint8_t chip, uint addr, uint *data) > +{ > + uint8_t valb; > + uint16_t valw; > > - return i2c_write(chip, addr, 1, &val, 1); > + if (ngpio(chip) <= 8) { > + if (i2c_read(chip, addr, 1, &valb, 1)) > + return -1; > + *data = (int) valb; The space in "(int) valb" should be removed. Same below. > + } else { > + if (i2c_read(chip, addr << 1, 1, (u8*)&valw, 2)) > + return -1; > + *data = (int) valw; > + } > + return 0; > } <snip> > + for (i = msb; i >= 0; i--) > + printf("%x",i); > + printf("\n"); > + if (nr_gpio > 8) > + printf("--------"); > printf("-------------------\n"); What about changing the printing of '-'s to a for loop like for (i = 19 + nr_gpio; i >0; i++) puts("-"); I'll give the next iteration of the patch a shot, it looks like it should work just fine. Best, Peter _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot