[U-Boot] [PATCH v2 07/11] sandbox: Rewrite i2c_pmic_emul.c to support PMIC with 3 bytes transmission
Simon Glass
sjg at chromium.org
Sun May 13 22:02:01 UTC 2018
Hi Lukasz,
On 7 May 2018 at 06:26, Lukasz Majewski <lukma at denx.de> wrote:
> This change enables support for MC34708 PMIC in sandbox. Now we can
> emulate the I2C transfers larger than 1 byte.
>
> Notable changes for this driver:
>
> - From now on the register number is not equal to index in the buffer,
> which emulates the PMIC registers
>
> - The PMIC register's pool is now dynamically allocated up till
> 64 regs * 3 bytes each = 192 B
>
> Signed-off-by: Lukasz Majewski <lukma at denx.de>
>
> ---
>
> Changes in v2:
> - New patch
>
> drivers/power/pmic/i2c_pmic_emul.c | 45 ++++++++++++++++++++++++++------------
> 1 file changed, 31 insertions(+), 14 deletions(-)
Reviewed-by: Simon Glass <sjg at chromium.org>
Comments below
>
> diff --git a/drivers/power/pmic/i2c_pmic_emul.c b/drivers/power/pmic/i2c_pmic_emul.c
> index c58ebb8825..6f227a92f3 100644
> --- a/drivers/power/pmic/i2c_pmic_emul.c
> +++ b/drivers/power/pmic/i2c_pmic_emul.c
> @@ -19,8 +19,11 @@
> * @reg: PMICs registers array
> */
> struct sandbox_i2c_pmic_plat_data {
> - u8 rw_reg;
> - u8 reg[SANDBOX_PMIC_REG_COUNT];
> + u8 rw_reg, rw_idx;
> + u8 reg_count;
> + u8 trans_len;
> + u8 buf_size;
> + u8 *reg;
> };
>
> static int sandbox_i2c_pmic_read_data(struct udevice *emul, uchar chip,
> @@ -28,16 +31,16 @@ static int sandbox_i2c_pmic_read_data(struct udevice *emul, uchar chip,
> {
> struct sandbox_i2c_pmic_plat_data *plat = dev_get_platdata(emul);
>
> - if (plat->rw_reg + len > SANDBOX_PMIC_REG_COUNT) {
> + if (plat->rw_idx + len > plat->buf_size) {
> pr_err("Request exceeds PMIC register range! Max register: %#x",
> - SANDBOX_PMIC_REG_COUNT);
> + plat->reg_count);
> return -EFAULT;
> }
>
> - debug("Read PMIC: %#x at register: %#x count: %d\n",
> - (unsigned)chip & 0xff, plat->rw_reg, len);
> + debug("Read PMIC: %#x at register: %#x idx: %#x count: %d\n",
> + (unsigned int)chip & 0xff, plat->rw_reg, plat->rw_idx, len);
>
> - memcpy(buffer, &plat->reg[plat->rw_reg], len);
> + memcpy(buffer, plat->reg + plat->rw_idx, len);
Why change this?
>
> return 0;
> }
> @@ -54,9 +57,10 @@ static int sandbox_i2c_pmic_write_data(struct udevice *emul, uchar chip,
>
> /* Set PMIC register for I/O */
> plat->rw_reg = *buffer;
> + plat->rw_idx = plat->rw_reg * plat->trans_len;
>
> - debug("Write PMIC: %#x at register: %#x count: %d\n",
> - (unsigned)chip & 0xff, plat->rw_reg, len);
> + debug("Write PMIC: %#x at register: %#x idx: %#x count: %d\n",
> + (unsigned int)chip & 0xff, plat->rw_reg, plat->rw_idx, len);
>
> /* For read operation, set (write) only chip reg */
> if (next_is_read)
> @@ -65,12 +69,12 @@ static int sandbox_i2c_pmic_write_data(struct udevice *emul, uchar chip,
> buffer++;
> len--;
>
> - if (plat->rw_reg + len > SANDBOX_PMIC_REG_COUNT) {
> + if (plat->rw_idx + len > plat->buf_size) {
> pr_err("Request exceeds PMIC register range! Max register: %#x",
> - SANDBOX_PMIC_REG_COUNT);
> + plat->reg_count);
> }
>
> - memcpy(&plat->reg[plat->rw_reg], buffer, len);
> + memcpy(plat->reg + plat->rw_idx, buffer, len);
and this?
>
> return 0;
> }
> @@ -101,20 +105,33 @@ static int sandbox_i2c_pmic_xfer(struct udevice *emul, struct i2c_msg *msg,
> static int sandbox_i2c_pmic_ofdata_to_platdata(struct udevice *emul)
> {
> struct sandbox_i2c_pmic_plat_data *plat = dev_get_platdata(emul);
> + struct udevice *pmic_dev = dev_get_parent(emul);
> + struct dm_pmic_info *pmic_info = dev_get_uclass_priv(pmic_dev);
> const u8 *reg_defaults;
>
> debug("%s:%d Setting PMIC default registers\n", __func__, __LINE__);
> + plat->reg_count = pmic_reg_count(pmic_dev);
> + plat->trans_len = pmic_info->trans_len;
> + plat->buf_size = plat->reg_count * plat->trans_len;
> +
> + plat->reg = calloc(1, plat->buf_size);
> + if (!plat->reg) {
> + pr_err("Canot allocate memory (%d B) for PMIC I2C emulation!\n",
> + plat->buf_size);
debug()
> + return -ENOMEM;
> + }
>
> reg_defaults = dev_read_u8_array_ptr(emul, "reg-defaults",
> - SANDBOX_PMIC_REG_COUNT);
> + plat->buf_size);
>
> if (!reg_defaults) {
> pr_err("Property \"reg-defaults\" not found for device: %s!",
> emul->name);
> + free(plat->reg);
> return -EINVAL;
> }
>
> - memcpy(&plat->reg, reg_defaults, SANDBOX_PMIC_REG_COUNT);
> + memcpy(plat->reg, reg_defaults, plat->buf_size);
>
> return 0;
> }
> --
> 2.11.0
>
Regards,
Simon
More information about the U-Boot
mailing list