[U-Boot] [PATCHv2] pca953x: support 16-pin devices

Peter Tyser ptyser at xes-inc.com
Thu Dec 9 01:08:52 CET 2010


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



More information about the U-Boot mailing list