From: Heiko Schocher <hs@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [RFC PATCH 04/12] dm: i2c: Implement driver model support in the i2c command
Date: Mon, 10 Nov 2014 08:01:16 +0100 [thread overview]
Message-ID: <546062BC.1070809@denx.de> (raw)
In-Reply-To: <1413178778-30846-5-git-send-email-sjg@chromium.org>
Hello Simon,
Am 13.10.2014 07:39, schrieb Simon Glass:
> The concept of a 'current bus' is now implemented in the command line
> rather than in the uclass. Also the address length does not need to
> be specified with each command - really we should consider dropping
> this from most commands but it works OK for now.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
> common/cmd_i2c.c | 312 +++++++++++++++++++++++++++++++++++++++++++++++--------
> 1 file changed, 267 insertions(+), 45 deletions(-)
>
> diff --git a/common/cmd_i2c.c b/common/cmd_i2c.c
> index c266b88..6766856 100644
> --- a/common/cmd_i2c.c
> +++ b/common/cmd_i2c.c
> @@ -69,8 +69,10 @@
> #include <bootretry.h>
> #include <cli.h>
> #include <command.h>
> +#include <dm.h>
> #include <edid.h>
> #include <environment.h>
> +#include <errno.h>
> #include <i2c.h>
> #include <malloc.h>
> #include <asm/byteorder.h>
> @@ -117,6 +119,60 @@ static uchar i2c_no_probes[] = CONFIG_SYS_I2C_NOPROBES;
>
> #define DISP_LINE_LEN 16
>
> +/*
> + * Default for driver model is to use the chip's existing address length.
> + * For legacy code, this is not stored, so we need to use a suitable
> + * default.
> + */
> +#ifdef CONFIG_DM_I2C
> +#define DEFAULT_ADDR_LEN (-1)
> +#else
> +#define DEFAULT_ADDR_LEN 1
> +#endif
> +
> +#ifdef CONFIG_DM_I2C
> +static struct udevice *i2c_cur_bus;
> +
> +static int i2c_set_bus_num(unsigned int busnum)
> +{
> + struct udevice *bus;
> + int ret;
> +
> + ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &bus);
> + if (ret) {
> + debug("%s: No bus %d\n", __func__, busnum);
> + return ret;
> + }
> + i2c_cur_bus = bus;
> +
> + return 0;
> +}
> +
> +static int i2c_get_cur_bus(struct udevice **busp)
> +{
> + if (!i2c_cur_bus) {
> + puts("No I2C bus selected\n");
> + return -ENODEV;
> + }
> + *busp = i2c_cur_bus;
> +
> + return 0;
> +}
> +
> +static int i2c_get_cur_bus_chip(uint chip_addr, struct udevice **devp)
> +{
> + struct udevice *bus;
> + int ret;
> +
> + ret = i2c_get_cur_bus(&bus);
> + if (ret)
> + return ret;
> +
> + return i2c_get_chip(bus, chip_addr, devp);
> +}
> +
> +#endif
> +
> /**
> * i2c_init_board() - Board-specific I2C bus init
> *
> @@ -143,7 +199,7 @@ void i2c_init_board(void)
> *
> * Returns I2C bus speed in Hz.
> */
> -#if !defined(CONFIG_SYS_I2C)
> +#if !defined(CONFIG_SYS_I2C) && !defined(CONFIG_DM_I2C)
> /*
> * TODO: Implement architecture-specific get/set functions
> * Should go away, if we switched completely to new multibus support
> @@ -182,12 +238,12 @@ int i2c_set_bus_speed(unsigned int speed)
> *
> * Returns the address length.
> */
> -static uint get_alen(char *arg)
> +static uint get_alen(char *arg, int default_len)
> {
> int j;
> int alen;
>
> - alen = 1;
> + alen = default_len;
> for (j = 0; j < 8; j++) {
> if (arg[j] == '.') {
> alen = arg[j+1] - '0';
> @@ -229,6 +285,10 @@ static int do_i2c_read ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv
> u_char chip;
> uint devaddr, alen, length;
> u_char *memaddr;
> + int ret;
> +#ifdef CONFIG_DM_I2C
> + struct udevice *dev;
> +#endif
>
> if (argc != 5)
> return CMD_RET_USAGE;
> @@ -243,7 +303,7 @@ static int do_i2c_read ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv
> * 2 bytes long. Some day it might be 3 bytes long :-).
> */
> devaddr = simple_strtoul(argv[2], NULL, 16);
> - alen = get_alen(argv[2]);
> + alen = get_alen(argv[2], DEFAULT_ADDR_LEN);
> if (alen > 3)
> return CMD_RET_USAGE;
>
> @@ -257,10 +317,18 @@ static int do_i2c_read ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv
> */
> memaddr = (u_char *)simple_strtoul(argv[4], NULL, 16);
>
> - if (i2c_read(chip, devaddr, alen, memaddr, length) != 0) {
> - i2c_report_err(-1, I2C_ERR_READ);
> - return 1;
> - }
> +#ifdef CONFIG_DM_I2C
> + ret = i2c_get_cur_bus_chip(chip, &dev);
> + if (!ret && alen != -1)
> + ret = i2c_set_addr_len(dev, alen);
> + if (!ret)
> + ret = i2c_read(dev, devaddr, memaddr, length);
> +#else
> + ret = i2c_read(chip, devaddr, alen, memaddr, length);
> +#endif
> + if (ret)
> + return i2c_report_err(ret, I2C_ERR_READ);
> +
> return 0;
> }
>
> @@ -269,6 +337,10 @@ static int do_i2c_write(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
> u_char chip;
> uint devaddr, alen, length;
> u_char *memaddr;
> + int ret;
> +#ifdef CONFIG_DM_I2C
> + struct udevice *dev;
> +#endif
>
> if (argc != 5)
> return cmd_usage(cmdtp);
> @@ -288,7 +360,7 @@ static int do_i2c_write(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
> * 2 bytes long. Some day it might be 3 bytes long :-).
> */
> devaddr = simple_strtoul(argv[3], NULL, 16);
> - alen = get_alen(argv[3]);
> + alen = get_alen(argv[3], DEFAULT_ADDR_LEN);
> if (alen > 3)
> return cmd_usage(cmdtp);
>
> @@ -297,10 +369,22 @@ static int do_i2c_write(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
> */
> length = simple_strtoul(argv[4], NULL, 16);
>
> +#ifdef CONFIG_DM_I2C
> + ret = i2c_get_cur_bus_chip(chip, &dev);
> + if (!ret && alen != -1)
> + ret = i2c_set_addr_len(dev, alen);
> + if (ret)
> + return i2c_report_err(ret, I2C_ERR_WRITE);
> +#endif
> +
> while (length-- > 0) {
> - if (i2c_write(chip, devaddr++, alen, memaddr++, 1) != 0) {
> - return i2c_report_err(-1, I2C_ERR_WRITE);
> - }
> +#ifdef CONFIG_DM_I2C
> + ret = i2c_write(dev, devaddr++, memaddr++, 1);
> +#else
> + ret = i2c_write(chip, devaddr++, alen, memaddr++, 1);
> +#endif
> + if (ret)
> + return i2c_report_err(ret, I2C_ERR_WRITE);
> /*
> * No write delay with FRAM devices.
> */
> @@ -329,6 +413,10 @@ static int do_i2c_md ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
> u_char chip;
> uint addr, alen, length;
> int j, nbytes, linebytes;
> + int ret;
> +#ifdef CONFIG_DM_I2C
> + struct udevice *dev;
> +#endif
>
> /* We use the last specified parameters, unless new ones are
> * entered.
> @@ -356,7 +444,7 @@ static int do_i2c_md ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
> * 2 bytes long. Some day it might be 3 bytes long :-).
> */
> addr = simple_strtoul(argv[2], NULL, 16);
> - alen = get_alen(argv[2]);
> + alen = get_alen(argv[2], DEFAULT_ADDR_LEN);
> if (alen > 3)
> return CMD_RET_USAGE;
>
> @@ -368,6 +456,14 @@ static int do_i2c_md ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
> length = simple_strtoul(argv[3], NULL, 16);
> }
>
> +#ifdef CONFIG_DM_I2C
> + ret = i2c_get_cur_bus_chip(chip, &dev);
> + if (!ret && alen != -1)
> + ret = i2c_set_addr_len(dev, alen);
> + if (ret)
> + return i2c_report_err(ret, I2C_ERR_READ);
> +#endif
> +
> /*
> * Print the lines.
> *
> @@ -381,8 +477,13 @@ static int do_i2c_md ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
>
> linebytes = (nbytes > DISP_LINE_LEN) ? DISP_LINE_LEN : nbytes;
>
> - if (i2c_read(chip, addr, alen, linebuf, linebytes) != 0)
> - i2c_report_err(-1, I2C_ERR_READ);
> +#ifdef CONFIG_DM_I2C
> + ret = i2c_read(dev, addr, linebuf, linebytes);
> +#else
> + ret = i2c_read(chip, addr, alen, linebuf, linebytes);
> +#endif
> + if (ret)
> + i2c_report_err(ret, I2C_ERR_READ);
> else {
> printf("%04x:", addr);
> cp = linebuf;
> @@ -432,6 +533,10 @@ static int do_i2c_mw ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
> uint alen;
> uchar byte;
> int count;
> + int ret;
> +#ifdef CONFIG_DM_I2C
> + struct udevice *dev;
> +#endif
>
> if ((argc < 4) || (argc > 5))
> return CMD_RET_USAGE;
> @@ -445,10 +550,17 @@ static int do_i2c_mw ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
> * Address is always specified.
> */
> addr = simple_strtoul(argv[2], NULL, 16);
> - alen = get_alen(argv[2]);
> + alen = get_alen(argv[2], DEFAULT_ADDR_LEN);
> if (alen > 3)
> return CMD_RET_USAGE;
>
> +#ifdef CONFIG_DM_I2C
> + ret = i2c_get_cur_bus_chip(chip, &dev);
> + if (!ret && alen != -1)
> + ret = i2c_set_addr_len(dev, alen);
> + if (ret)
> + return i2c_report_err(ret, I2C_ERR_WRITE);
> +#endif
> /*
> * Value to write is always specified.
> */
> @@ -463,8 +575,13 @@ static int do_i2c_mw ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
> count = 1;
>
> while (count-- > 0) {
> - if (i2c_write(chip, addr++, alen, &byte, 1) != 0)
> - i2c_report_err(-1, I2C_ERR_WRITE);
> +#ifdef CONFIG_DM_I2C
> + ret = i2c_write(dev, addr++, &byte, 1);
> +#else
> + ret = i2c_write(chip, addr++, alen, &byte, 1);
> +#endif
> + if (ret)
> + i2c_report_err(ret, I2C_ERR_WRITE);
> /*
> * Wait for the write to complete. The write can take
> * up to 10mSec (we allow a little more time).
> @@ -504,6 +621,10 @@ static int do_i2c_crc (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
> uchar byte;
> ulong crc;
> ulong err;
> + int ret;
> +#ifdef CONFIG_DM_I2C
> + struct udevice *dev;
> +#endif
>
> if (argc < 4)
> return CMD_RET_USAGE;
> @@ -517,10 +638,17 @@ static int do_i2c_crc (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
> * Address is always specified.
> */
> addr = simple_strtoul(argv[2], NULL, 16);
> - alen = get_alen(argv[2]);
> + alen = get_alen(argv[2], DEFAULT_ADDR_LEN);
> if (alen > 3)
> return CMD_RET_USAGE;
>
> +#ifdef CONFIG_DM_I2C
> + ret = i2c_get_cur_bus_chip(chip, &dev);
> + if (!ret && alen != -1)
> + ret = i2c_set_addr_len(dev, alen);
> + if (ret)
> + return i2c_report_err(ret, I2C_ERR_READ);
> +#endif
> /*
> * Count is always specified
> */
> @@ -534,13 +662,18 @@ static int do_i2c_crc (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
> crc = 0;
> err = 0;
> while (count-- > 0) {
> - if (i2c_read(chip, addr, alen, &byte, 1) != 0)
> +#ifdef CONFIG_DM_I2C
> + ret = i2c_read(dev, addr, &byte, 1);
> +#else
> + ret = i2c_read(chip, addr, alen, &byte, 1);
> +#endif
> + if (ret)
> err++;
> crc = crc32 (crc, &byte, 1);
> addr++;
> }
> if (err > 0)
> - i2c_report_err(-1, I2C_ERR_READ);
> + i2c_report_err(ret, I2C_ERR_READ);
> else
> printf ("%08lx\n", crc);
>
> @@ -572,6 +705,10 @@ mod_i2c_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const arg
> ulong data;
> int size = 1;
> int nbytes;
> + int ret;
> +#ifdef CONFIG_DM_I2C
> + struct udevice *dev;
> +#endif
>
> if (argc != 3)
> return CMD_RET_USAGE;
> @@ -601,19 +738,32 @@ mod_i2c_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const arg
> * Address is always specified.
> */
> addr = simple_strtoul(argv[2], NULL, 16);
> - alen = get_alen(argv[2]);
> + alen = get_alen(argv[2], DEFAULT_ADDR_LEN);
> if (alen > 3)
> return CMD_RET_USAGE;
> }
>
> +#ifdef CONFIG_DM_I2C
> + ret = i2c_get_cur_bus_chip(chip, &dev);
> + if (!ret && alen != -1)
> + ret = i2c_set_addr_len(dev, alen);
> + if (ret)
> + return i2c_report_err(ret, I2C_ERR_WRITE);
> +#endif
> +
> /*
> * Print the address, followed by value. Then accept input for
> * the next value. A non-converted value exits.
> */
> do {
> printf("%08lx:", addr);
> - if (i2c_read(chip, addr, alen, (uchar *)&data, size) != 0)
> - i2c_report_err(-1, I2C_ERR_READ);
> +#ifdef CONFIG_DM_I2C
> + ret = i2c_read(dev, addr, (uchar *)&data, size);
> +#else
> + ret = i2c_read(chip, addr, alen, (uchar *)&data, size);
> +#endif
> + if (ret)
> + i2c_report_err(ret, I2C_ERR_READ);
> else {
> data = cpu_to_be32(data);
> if (size == 1)
> @@ -655,8 +805,15 @@ mod_i2c_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const arg
> * good enough to not time out
> */
> bootretry_reset_cmd_timeout();
> - if (i2c_write(chip, addr, alen, (uchar *)&data, size) != 0)
> - i2c_report_err(-1, I2C_ERR_WRITE);
> +#ifdef CONFIG_DM_I2C
> + ret = i2c_write(dev, addr, (uchar *)&data,
> + size);
> +#else
> + ret = i2c_write(chip, addr, alen,
> + (uchar *)&data, size);
> +#endif
> + if (ret)
> + i2c_report_err(ret, I2C_ERR_WRITE);
> #ifdef CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS
> udelay(CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS * 1000);
> #endif
> @@ -697,6 +854,13 @@ static int do_i2c_probe (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv
> int k, skip;
> unsigned int bus = GET_BUS_NUM;
> #endif /* NOPROBES */
> + int ret;
> +#ifdef CONFIG_DM_I2C
> + struct udevice *bus;
> +
> + if (i2c_get_cur_bus(&bus))
> + return CMD_RET_FAILURE;
> +#endif
>
> if (argc == 2)
> addr = simple_strtol(argv[1], 0, 16);
> @@ -717,7 +881,12 @@ static int do_i2c_probe (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv
> if (skip)
> continue;
> #endif
> - if (i2c_probe(j) == 0) {
> +#ifdef CONFIG_DM_I2C
> + ret = i2c_probe(bus, j);
> +#else
> + ret = i2c_probe(j);
> +#endif
> + if (ret == 0) {
> printf(" %02X", j);
> found++;
> }
> @@ -759,6 +928,10 @@ static int do_i2c_loop(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
> uint length;
> u_char bytes[16];
> int delay;
> + int ret;
> +#ifdef CONFIG_DM_I2C
> + struct udevice *dev;
> +#endif
>
> if (argc < 3)
> return CMD_RET_USAGE;
> @@ -772,9 +945,16 @@ static int do_i2c_loop(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
> * Address is always specified.
> */
> addr = simple_strtoul(argv[2], NULL, 16);
> - alen = get_alen(argv[2]);
> + alen = get_alen(argv[2], DEFAULT_ADDR_LEN);
> if (alen > 3)
> return CMD_RET_USAGE;
> +#ifdef CONFIG_DM_I2C
> + ret = i2c_get_cur_bus_chip(chip, &dev);
> + if (!ret && alen != -1)
> + ret = i2c_set_addr_len(dev, alen);
> + if (ret)
> + return i2c_report_err(ret, I2C_ERR_WRITE);
> +#endif
>
> /*
> * Length is the number of objects, not number of bytes.
> @@ -794,8 +974,13 @@ static int do_i2c_loop(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
> * Run the loop...
> */
> while (1) {
> - if (i2c_read(chip, addr, alen, bytes, length) != 0)
> - i2c_report_err(-1, I2C_ERR_READ);
> +#ifdef CONFIG_DM_I2C
> + ret = i2c_read(dev, addr, bytes, length);
> +#else
> + ret = i2c_read(chip, addr, alen, bytes, length);
> +#endif
> + if (ret)
> + i2c_report_err(ret, I2C_ERR_READ);
> udelay(delay);
> }
>
> @@ -1345,6 +1530,10 @@ int do_edid(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
> {
> u_char chip;
> struct edid1_info edid;
> + int ret;
> +#ifdef CONFIG_DM_I2C
> + struct udevice *dev;
> +#endif
>
> if (argc < 2) {
> cmd_usage(cmdtp);
> @@ -1352,10 +1541,15 @@ int do_edid(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
> }
>
> chip = simple_strtoul(argv[1], NULL, 16);
> - if (i2c_read(chip, 0, 1, (uchar *)&edid, sizeof(edid)) != 0) {
> - i2c_report_err(-1, I2C_ERR_READ);
> - return 1;
> - }
> +#ifdef CONFIG_DM_I2C
> + ret = i2c_get_cur_bus_chip(chip, &dev);
> + if (!ret)
> + ret = i2c_read(dev, 0, (uchar *)&edid, sizeof(edid));
> +#else
> + ret = i2c_read(chip, 0, 1, (uchar *)&edid, sizeof(edid));
> +#endif
> + if (ret)
> + return i2c_report_err(ret, I2C_ERR_READ);
>
> if (edid_check_info(&edid)) {
> puts("Content isn't valid EDID.\n");
> @@ -1437,17 +1631,28 @@ static int do_i2c_show_bus(cmd_tbl_t *cmdtp, int flag, int argc,
> * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
> * on error.
> */
> -#if defined(CONFIG_SYS_I2C) || defined(CONFIG_I2C_MULTI_BUS)
> +#if defined(CONFIG_SYS_I2C) || defined(CONFIG_I2C_MULTI_BUS) || \
> + defined(CONFIG_DM_I2C)
> static int do_i2c_bus_num(cmd_tbl_t *cmdtp, int flag, int argc,
> char * const argv[])
> {
> int ret = 0;
> - unsigned int bus_no;
> + int bus_no;
>
> - if (argc == 1)
> + if (argc == 1) {
> /* querying current setting */
> - printf("Current bus is %d\n", i2c_get_bus_num());
> - else {
> +#ifdef CONFIG_DM_I2C
> + struct udevice *bus;
> +
> + if (!i2c_get_cur_bus(&bus))
> + bus_no = bus->seq;
> + else
> + bus_no = -1;
> +#else
> + bus_no = i2c_get_bus_num();
> +#endif
> + printf("Current bus is %d\n", bus_no);
> + } else {
> bus_no = simple_strtoul(argv[1], NULL, 10);
> #if defined(CONFIG_SYS_I2C)
> if (bus_no >= CONFIG_SYS_NUM_I2C_BUSES) {
> @@ -1478,13 +1683,28 @@ static int do_i2c_bus_speed(cmd_tbl_t * cmdtp, int flag, int argc, char * const
> {
> int speed, ret=0;
>
> - if (argc == 1)
> +#ifdef CONFIG_DM_I2C
> + struct udevice *bus;
> +
> + if (i2c_get_cur_bus(&bus))
> + return 1;
> +#endif
> + if (argc == 1) {
> +#ifdef CONFIG_DM_I2C
> + speed = i2c_get_bus_speed(bus);
> +#else
> + speed = i2c_get_bus_speed();
> +#endif
> /* querying current speed */
> - printf("Current bus speed=%d\n", i2c_get_bus_speed());
> - else {
> + printf("Current bus speed=%d\n", speed);
> + } else {
> speed = simple_strtoul(argv[1], NULL, 10);
> printf("Setting bus speed to %d Hz\n", speed);
> +#ifdef CONFIG_DM_I2C
> + ret = i2c_set_bus_speed(bus, speed);
> +#else
> ret = i2c_set_bus_speed(speed);
> +#endif
> if (ret)
> printf("Failure changing bus speed (%d)\n", ret);
> }
> @@ -1532,7 +1752,9 @@ static int do_i2c_nm(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
> */
> static int do_i2c_reset(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
> {
> -#if defined(CONFIG_SYS_I2C)
> +#if defined(CONFIG_DM_I2C)
> + /* TODO(sjg at chromium.org): What should we do here? */
This is a good question. I wanted to add in the CONFIG_SYS_I2C case,
a possibility to add a i2c deblock function for drivers and call them
from here ... Currently the i2c_init_board() is abused (see
u-boot:doc/I2C_Edge_Conditions) for this ...
This gets interesting as a lot of SoCs can switch the i2c pins
into gpio mode and do then a bitbang deblock of the bus, and
if this is finished switch back the pins to i2c mode ...
So maybe we add the following in include/i2c.h for the DM case:
+struct dm_i2c_ops {
+ /**
+ * deblock() - deblock an i2c bus
+ *
+ * @bus: Bus to deblock
+ */
+ int (*deblock)(struct udevice *bus);
and this deblock() gets called here (if defined for an driver).
So we can provide a default soft bitbang deblock function (a good one is in
./board/keymile/common/common.c i2c_make_abort())
which should call a board specific i2c_switch_pin(struct udevice *bus, int mode)
with mode = PIN_TO_GPIO_MODE or PIN_TO_I2C_MODE
rough fast proposal:
int i2c_soft_deblock(struct udevice *bus)
{
int ret;
ret = i2c_switch_pin(bus, PIN_TO_GPIO_MODE);
/* boards which could not do softbitbang return here -EPERM */
if (ret)
return ret;
/* call soft bitbang ... */
ret = i2c_soft_deblock()
if (ret)
return ret;
ret = i2c_switch_pin(bus, PIN_TO_GPIO_MODE);
return ret;
}
bye,
Heiko
> +#elif defined(CONFIG_SYS_I2C)
> i2c_init(I2C_ADAP->speed, I2C_ADAP->slaveaddr);
> #else
> i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
> @@ -1546,7 +1768,7 @@ static cmd_tbl_t cmd_i2c_sub[] = {
> #endif
> U_BOOT_CMD_MKENT(crc32, 3, 1, do_i2c_crc, "", ""),
> #if defined(CONFIG_SYS_I2C) || \
> - defined(CONFIG_I2C_MULTI_BUS)
> + defined(CONFIG_I2C_MULTI_BUS) || defined(CONFIG_DM_I2C)
> U_BOOT_CMD_MKENT(dev, 1, 1, do_i2c_bus_num, "", ""),
> #endif /* CONFIG_I2C_MULTI_BUS */
> #if defined(CONFIG_I2C_EDID)
> @@ -1610,7 +1832,7 @@ static char i2c_help_text[] =
> #endif
> "crc32 chip address[.0, .1, .2] count - compute CRC32 checksum\n"
> #if defined(CONFIG_SYS_I2C) || \
> - defined(CONFIG_I2C_MULTI_BUS)
> + defined(CONFIG_I2C_MULTI_BUS) || defined(CONFIG_DM_I2C)
> "i2c dev [dev] - show or set current I2C bus\n"
> #endif /* CONFIG_I2C_MULTI_BUS */
> #if defined(CONFIG_I2C_EDID)
>
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
next prev parent reply other threads:[~2014-11-10 7:01 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-13 5:39 [U-Boot] [RFC PATCH 0/12] RFC: dm: Add I2C support Simon Glass
2014-10-13 5:39 ` [U-Boot] [RFC PATCH 01/12] dm: core: Allow access to the device's driver_id data Simon Glass
2014-10-13 5:39 ` [U-Boot] [RFC PATCH 02/12] dm: core: Add functions to find parent and OF data Simon Glass
2014-10-13 5:39 ` [U-Boot] [RFC PATCH 03/12] dm: i2c: Add a uclass for I2C Simon Glass
2014-11-10 6:33 ` Heiko Schocher
2014-10-13 5:39 ` [U-Boot] [RFC PATCH 04/12] dm: i2c: Implement driver model support in the i2c command Simon Glass
2014-11-10 7:01 ` Heiko Schocher [this message]
2014-10-13 5:39 ` [U-Boot] [RFC PATCH 05/12] dm: i2c: Add I2C emulation driver for sandbox Simon Glass
2014-10-13 5:39 ` [U-Boot] [RFC PATCH 06/12] dm: i2c: Add a sandbox I2C driver Simon Glass
2014-10-13 5:39 ` [U-Boot] [RFC PATCH 07/12] dm: i2c: Add an I2C EEPROM simulator Simon Glass
2014-10-13 5:39 ` [U-Boot] [RFC PATCH 08/12] dm: i2c: config: Enable I2C for sandbox using driver model Simon Glass
2014-10-13 5:39 ` [U-Boot] [RFC PATCH 09/12] dm: i2c: dts: Add an I2C bus for sandbox Simon Glass
2014-10-13 5:39 ` [U-Boot] [RFC PATCH 10/12] dm: WIP: EEPROM driver Simon Glass
2014-10-13 5:39 ` [U-Boot] [RFC PATCH 11/12] dm: i2c: Add tests for I2C Simon Glass
2014-10-13 5:39 ` [U-Boot] [RFC PATCH 12/12] dm: i2c: tegra: Convert to driver model for I2C for seaboard Simon Glass
2014-10-24 15:03 ` [U-Boot] [RFC PATCH 0/12] RFC: dm: Add I2C support Tom Rini
2014-10-29 7:31 ` Heiko Schocher
2014-11-10 7:16 ` Heiko Schocher
2014-11-11 15:44 ` Simon Glass
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=546062BC.1070809@denx.de \
--to=hs@denx.de \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.