Message ID | 1431517116-15381-9-git-send-email-p.marczak@samsung.com |
---|---|
State | Accepted |
Delegated to: | Simon Glass |
Headers | show |
On 13 May 2015 at 05:38, Przemyslaw Marczak <p.marczak@samsung.com> wrote: > The function get_emul() in sandbox i2c bus driver, always returns > first child as i2c emul device. This may only work for i2c devices > with a single child, which is an only i2c emul device. > > In case when i2c device has more than one child (e.g. PMIC), and > one is i2c emul, then the function should search it by check uclass > id for each child. This patch add this change to the get_emul(). > > Signed-off-by: Przemyslaw Marczak <p.marczak@samsung.com> > Cc: Simon Glass <sjg@chromium.org> > Acked-by: Simon Glass <sjg@chromium.org> > Tested on sandbox: > Tested-by: Simon Glass <sjg@chromium.org> > --- > Changes V2: > - none > > --- > drivers/i2c/sandbox_i2c.c | 20 +++++++++++++++++--- > 1 file changed, 17 insertions(+), 3 deletions(-) Applied to u-boot-dm, thanks!
diff --git a/drivers/i2c/sandbox_i2c.c b/drivers/i2c/sandbox_i2c.c index d6adc0f..d4b543d 100644 --- a/drivers/i2c/sandbox_i2c.c +++ b/drivers/i2c/sandbox_i2c.c @@ -26,6 +26,7 @@ static int get_emul(struct udevice *dev, struct udevice **devp, struct dm_i2c_ops **opsp) { struct dm_i2c_chip *plat; + struct udevice *child; int ret; *devp = NULL; @@ -37,9 +38,22 @@ static int get_emul(struct udevice *dev, struct udevice **devp, if (ret) return ret; - ret = device_get_child(dev, 0, &plat->emul); - if (ret) - return ret; + for (device_find_first_child(dev, &child); child; + device_find_next_child(&child)) { + if (device_get_uclass_id(child) != UCLASS_I2C_EMUL) + continue; + + ret = device_probe(child); + if (ret) + return ret; + + break; + } + + if (child) + plat->emul = child; + else + return -ENODEV; } *devp = plat->emul; *opsp = i2c_get_ops(plat->emul);