Hello Simon, On 18.10.23 05:33, Simon Glass wrote: > Hi Philip, > > On Tue, 17 Oct 2023 at 06:57, Philip Oberfichtner <p...@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 -- DENX Software Engineering GmbH, Managing Director: Erika Unter HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-52 Fax: +49-8142-66989-80 Email: h...@denx.de