
On 31. 01. 19 11:04, Simon Glass wrote:
Hi Michal,
On Fri, 18 Jan 2019 at 08:13, Michal Simek michal.simek@xilinx.com wrote:
There is a need to find out the first free i2c ID which can be used for i2s buses (including i2c buses connected to i2c mux). Do it early in init and share this variable with other i2c classes for uniq bus identification.
Signed-off-by: Michal Simek michal.simek@xilinx.com
drivers/i2c/i2c-uclass.c | 19 +++++++++++++++++++ include/i2c.h | 3 +++ 2 files changed, 22 insertions(+)
diff --git a/drivers/i2c/i2c-uclass.c b/drivers/i2c/i2c-uclass.c index 975318e5f254..aaece115f02f 100644 --- a/drivers/i2c/i2c-uclass.c +++ b/drivers/i2c/i2c-uclass.c @@ -23,6 +23,8 @@ enum { PIN_COUNT, };
+int i2c_highest_id = -1;
/* Useful debugging function */ void i2c_dump_msgs(struct i2c_msg *msg, int nmsgs) { @@ -619,10 +621,27 @@ static int i2c_child_post_bind(struct udevice *dev) #endif }
+int i2c_uclass_init(struct uclass *class) +{ +#ifdef CONFIG_OF_LIVE
int ret;
ret = of_alias_get_highest_id("i2c");
if (ret >= 0)
i2c_highest_id = ret;
+#else
i2c_highest_id = fdtdec_get_alias_highest_id(gd->fdt_blob, "i2c");
+#endif
This should call dev_read_alias_highest_id() or similar, which does the logic you have here.
not a problem with this.
debug("%s: i2c highest_id %d\n", __func__, i2c_highest_id);
return 0;
+}
UCLASS_DRIVER(i2c) = { .id = UCLASS_I2C, .name = "i2c", .flags = DM_UC_FLAG_SEQ_ALIAS,
.init = i2c_uclass_init,
#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA) .post_bind = dm_scan_fdt_dev, #endif diff --git a/include/i2c.h b/include/i2c.h index ccffc1955275..c69e26deaeed 100644 --- a/include/i2c.h +++ b/include/i2c.h @@ -16,6 +16,9 @@ #ifndef _I2C_H_ #define _I2C_H_
+/* Stores maximum highest i2c alias number */ +extern int i2c_highest_id;
This should be in uclass-private data, not a global.
In this case there are two uclasses. UCLASS_I2C and UCLASS_I2C_MUX which has to share the same numbers. I would expect that private data will be private just for one not for both. Reading
But also I feel that the behaviour needs to be consistent for all U-Boot buses, not just I2C. So can we modify the existing core DM code instead? I think a change to uclass_resolve_seq() might be enough.
I need to check calling sequence to see if this is properly timed or not.
Thanks, Michal