[U-Boot] [PATCH v2 02/21] pmic:i2c: Add I2C byte order to PMIC framework

Stefano Babic sbabic at denx.de
Tue Oct 9 10:36:36 CEST 2012


On 05/10/2012 10:16, Lukasz Majewski wrote:
> Since the pmic_reg_read is the u32 value, the order in which bytes
> are placed to form u32 value is important.
> 
> This commit adds the reverse (which is default) and normal byte order.
> 
> Signed-off-by: Lukasz Majewski <l.majewski at samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park at samsung.com>
> 
> ---

Hi Lucasz,

> Changes for v2:
> - Move byte_order variable to struct pmic

Is the byte reversal you introduce here only another way for the endianess ?

It seems to me you have a PMIC whose endianess is different as the SOC's
endianess, and that must be changed.

I can suppose that "normal byte" and "reverse byte" works only with ARM
SOC, as they are (normally, but not always) little endian, but not for
example on PowerPC (big endian).

If this is correct, then I think we need a parameter in the structure to
indicate the endianess, and instead using custom way you could use the
cpu_to_le or cpu_to_be functions.



> ---
>  drivers/misc/pmic_i2c.c |   31 ++++++++++++++++++++++++-------
>  include/pmic.h          |    2 ++
>  2 files changed, 26 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/misc/pmic_i2c.c b/drivers/misc/pmic_i2c.c
> index e74c372..6b1487b 100644
> --- a/drivers/misc/pmic_i2c.c
> +++ b/drivers/misc/pmic_i2c.c
> @@ -40,13 +40,24 @@ int pmic_reg_write(struct pmic *p, u32 reg, u32 val)
>  
>  	switch (pmic_i2c_tx_num) {
>  	case 3:
> -		buf[0] = (val >> 16) & 0xff;
> -		buf[1] = (val >> 8) & 0xff;
> -		buf[2] = val & 0xff;
> +		if (p->byte_order == PMIC_BYTE_ORDER_NORMAL) {
> +			buf[2] = (val >> 16) & 0xff;
> +			buf[1] = (val >> 8) & 0xff;
> +			buf[0] = val & 0xff;
> +		} else {
> +			buf[0] = (val >> 16) & 0xff;
> +			buf[1] = (val >> 8) & 0xff;
> +			buf[2] = val & 0xff;
> +		}
>  		break;
>  	case 2:
> -		buf[0] = (val >> 8) & 0xff;
> -		buf[1] = val & 0xff;
> +		if (p->byte_order == PMIC_BYTE_ORDER_NORMAL) {
> +			buf[1] = (val >> 8) & 0xff;
> +			buf[0] = val & 0xff;
> +		} else {
> +			buf[0] = (val >> 8) & 0xff;
> +			buf[1] = val & 0xff;
> +		}
>  		break;
>  	case 1:
>  		buf[0] = val & 0xff;
> @@ -75,10 +86,16 @@ int pmic_reg_read(struct pmic *p, u32 reg, u32 *val)
>  
>  	switch (pmic_i2c_tx_num) {
>  	case 3:
> -		ret_val = buf[0] << 16 | buf[1] << 8 | buf[2];
> +		if (p->byte_order == PMIC_BYTE_ORDER_NORMAL)
> +			ret_val = buf[2] << 16 | buf[1] << 8 | buf[0];
> +		else
> +			ret_val = buf[0] << 16 | buf[1] << 8 | buf[2];
>  		break;
>  	case 2:
> -		ret_val = buf[0] << 8 | buf[1];
> +		if (p->byte_order == PMIC_BYTE_ORDER_NORMAL)
> +			ret_val = buf[1] << 8 | buf[0];
> +		else
> +			ret_val = buf[0] << 8 | buf[1];
>  		break;
>  	case 1:
>  		ret_val = buf[0];
> diff --git a/include/pmic.h b/include/pmic.h
> index 6a05b40..71b7d13 100644
> --- a/include/pmic.h
> +++ b/include/pmic.h
> @@ -27,6 +27,7 @@
>  enum { PMIC_I2C, PMIC_SPI, };
>  enum { I2C_PMIC, I2C_NUM, };
>  enum { PMIC_READ, PMIC_WRITE, };
> +enum { PMIC_BYTE_ORDER_REVERSED, PMIC_BYTE_ORDER_NORMAL, };
>  
>  struct p_i2c {
>  	unsigned char addr;
> @@ -47,6 +48,7 @@ struct pmic {
>  	const char *name;
>  	unsigned char bus;
>  	unsigned char interface;
> +	unsigned char byte_order;
>  	unsigned char number_of_regs;
>  	union hw {
>  		struct p_i2c i2c;
> 

Best regards,
Stefano Babic

-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================


More information about the U-Boot mailing list