From patchwork Fri Oct 5 08:16:24 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [U-Boot,v2,02/21] pmic:i2c: Add I2C byte order to PMIC framework Date: Thu, 04 Oct 2012 22:16:24 -0000 From: =?utf-8?q?=C5=81ukasz_Majewski?= X-Patchwork-Id: 189429 Message-Id: <1349425003-32523-3-git-send-email-l.majewski@samsung.com> To: u-boot@lists.denx.de Cc: Tom Rini , Kyungmin Park 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 Signed-off-by: Kyungmin Park --- Changes for v2: - Move byte_order variable to struct pmic --- 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;