
so, 2. úno 2019 7:09 odesílatel Simon Glass sjg@chromium.org napsal:
Hi Michal,
On Thu, 31 Jan 2019 at 04:03, Michal Simek michal.simek@xilinx.com wrote:
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
Hmm I hadn't realised that. Perhaps you can wrap it in a function which looks up the I2C uclass and the private data. We should try to avoid using BSS so that I2C can be used before relocation, etc.
I was wrong on this one. Také a look at v2.
M
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.
OK.
Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot