
Hello Simon,
On 18.10.23 05:33, Simon Glass wrote:
Hi Philip,
On Tue, 17 Oct 2023 at 06:57, Philip Oberfichtner pro@denx.de wrote:
Hi Simon,
maybe you can give me a hint on how to implement this cleanly in driver model?
To sum it up, I'd like to have a phandle pointing to *any* I2C device, not knowing which UCLASS actually fits. Then the device and the parent bus should be probed/prepared such that dm_i2c_read() can be used.
Any ideas on this?
I suggest a phandle to the i2c device.
Yep!
You can use oftree_get_by_phandle() to get the node and then device_find_global_by_ofnode() to get the device.
This is expensive, although eventually I suspect we will fix that with OF_LIVE. I think it should be implemented as a new function in i2c.h so we can change the impl later easily.
Yes, please.
If you want to be more efficient you could do something like:
int phandle = ??
struct uclass *uc; struct udevice *bus;
uclass_id_foreach_dev(UCLASS_I2C, bus, uc) { struct udevice *dev;
device_foreach_child(dev, bus) { if (!dev_read_u32(dev, "phandle", &val) && val == phandle) return dev; } }
but honestly now I look at it, that is awful. We try to avoid exposing the internals of phandle because it allows us to (one day) maintain a list of them.
Yes, please not ... a list of phandles would be great we can than walk through, yes, may in future...
May Philip can use uclass_get_device_by_phandle and try a list of possible UCLASS candidates, like UCLASS_RTC, UCLASS_I2C_EEPROM, UCLASS_POWER,... and if found, check if parent is UCLASS_I2C...
may not so expensive ...
bye, Heiko