Message ID | 1440289904-31280-18-git-send-email-sjg@chromium.org |
---|---|
State | Accepted |
Delegated to: | Simon Glass |
Headers | show |
Hi Simon, This one is fine with me. Acked-by: Christophe Ricard<christophe-h.ricard@st.com> Best Regards Christophe On 23/08/2015 02:31, Simon Glass wrote: > I2C chips can support a register offset, with registers accessible by > sending this offset as the first part of any read or write transaction. > Most I2C chips have a single byte offset, thus the offset length is 1. > This provides access for up 256 registers. > > However other offset lengths are supported, including 0. > > Add a command to provide access to the offset length from the command > line. This allows the offset length to be read or written. > > Signed-off-by: Simon Glass <sjg@chromium.org> > --- > > Changes in v2: None > > common/cmd_i2c.c | 33 +++++++++++++++++++++++++++++++++ > 1 file changed, 33 insertions(+) > > diff --git a/common/cmd_i2c.c b/common/cmd_i2c.c > index 1bc0db8..864b259 100644 > --- a/common/cmd_i2c.c > +++ b/common/cmd_i2c.c > @@ -453,6 +453,37 @@ static int do_i2c_flags(cmd_tbl_t *cmdtp, int flag, int argc, > > return 0; > } > + > +static int do_i2c_olen(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) > +{ > + struct udevice *dev; > + uint olen; > + int chip; > + int ret; > + > + if (argc < 2) > + return CMD_RET_USAGE; > + > + chip = simple_strtoul(argv[1], NULL, 16); > + ret = i2c_get_cur_bus_chip(chip, &dev); > + if (ret) > + return i2c_report_err(ret, I2C_ERR_READ); > + > + if (argc > 2) { > + olen = simple_strtoul(argv[2], NULL, 16); > + ret = i2c_set_chip_offset_len(dev, olen); > + } else { > + ret = i2c_get_chip_offset_len(dev); > + if (ret >= 0) { > + printf("%x\n", ret); > + ret = 0; > + } > + } > + if (ret) > + return i2c_report_err(ret, I2C_ERR_READ); > + > + return 0; > +} > #endif > > /** > @@ -1903,6 +1934,7 @@ static cmd_tbl_t cmd_i2c_sub[] = { > U_BOOT_CMD_MKENT(write, 6, 0, do_i2c_write, "", ""), > #ifdef CONFIG_DM_I2C > U_BOOT_CMD_MKENT(flags, 2, 1, do_i2c_flags, "", ""), > + U_BOOT_CMD_MKENT(olen, 2, 1, do_i2c_olen, "", ""), > #endif > U_BOOT_CMD_MKENT(reset, 0, 1, do_i2c_reset, "", ""), > #if defined(CONFIG_CMD_SDRAM) > @@ -1971,6 +2003,7 @@ static char i2c_help_text[] = > " to I2C; the -s option selects bulk write in a single transaction\n" > #ifdef CONFIG_DM_I2C > "i2c flags chip [flags] - set or get chip flags\n" > + "i2c olen chip [offset_length] - set or get chip offset length\n" > #endif > "i2c reset - re-init the I2C Controller\n" > #if defined(CONFIG_CMD_SDRAM)
On 24 August 2015 at 14:21, Christophe Ricard <christophe.ricard@gmail.com> wrote: > Hi Simon, > > This one is fine with me. > > Acked-by: Christophe Ricard<christophe-h.ricard@st.com> Applied to u-boot-dm.
diff --git a/common/cmd_i2c.c b/common/cmd_i2c.c index 1bc0db8..864b259 100644 --- a/common/cmd_i2c.c +++ b/common/cmd_i2c.c @@ -453,6 +453,37 @@ static int do_i2c_flags(cmd_tbl_t *cmdtp, int flag, int argc, return 0; } + +static int do_i2c_olen(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) +{ + struct udevice *dev; + uint olen; + int chip; + int ret; + + if (argc < 2) + return CMD_RET_USAGE; + + chip = simple_strtoul(argv[1], NULL, 16); + ret = i2c_get_cur_bus_chip(chip, &dev); + if (ret) + return i2c_report_err(ret, I2C_ERR_READ); + + if (argc > 2) { + olen = simple_strtoul(argv[2], NULL, 16); + ret = i2c_set_chip_offset_len(dev, olen); + } else { + ret = i2c_get_chip_offset_len(dev); + if (ret >= 0) { + printf("%x\n", ret); + ret = 0; + } + } + if (ret) + return i2c_report_err(ret, I2C_ERR_READ); + + return 0; +} #endif /** @@ -1903,6 +1934,7 @@ static cmd_tbl_t cmd_i2c_sub[] = { U_BOOT_CMD_MKENT(write, 6, 0, do_i2c_write, "", ""), #ifdef CONFIG_DM_I2C U_BOOT_CMD_MKENT(flags, 2, 1, do_i2c_flags, "", ""), + U_BOOT_CMD_MKENT(olen, 2, 1, do_i2c_olen, "", ""), #endif U_BOOT_CMD_MKENT(reset, 0, 1, do_i2c_reset, "", ""), #if defined(CONFIG_CMD_SDRAM) @@ -1971,6 +2003,7 @@ static char i2c_help_text[] = " to I2C; the -s option selects bulk write in a single transaction\n" #ifdef CONFIG_DM_I2C "i2c flags chip [flags] - set or get chip flags\n" + "i2c olen chip [offset_length] - set or get chip offset length\n" #endif "i2c reset - re-init the I2C Controller\n" #if defined(CONFIG_CMD_SDRAM)
I2C chips can support a register offset, with registers accessible by sending this offset as the first part of any read or write transaction. Most I2C chips have a single byte offset, thus the offset length is 1. This provides access for up 256 registers. However other offset lengths are supported, including 0. Add a command to provide access to the offset length from the command line. This allows the offset length to be read or written. Signed-off-by: Simon Glass <sjg@chromium.org> --- Changes in v2: None common/cmd_i2c.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)