[U-Boot] [PATCHv2] pca953x: support 16-pin devices
Chris Packham
judge.packham at gmail.com
Thu Dec 9 05:40:45 CET 2010
On Thu, Dec 9, 2010 at 1:08 PM, Peter Tyser <ptyser at xes-inc.com> wrote:
> 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
>
Hi Peter,
I'll try and get an updated patch through as soon as I can. I'm on a
training course today and tomorrow but it won't take me long to make
the changes you've suggested once I find some time.
Thanks,
Chris
More information about the U-Boot
mailing list