[PATCH] sandbox: i2c: Make sure phandle dependency is probed
Heiko Schocher
hs at denx.de
Fri Oct 4 07:04:19 CEST 2024
Hi Marek!
On 03.10.24 22:47, Marek Vasut wrote:
> On 10/3/24 10:37 PM, Marek Vasut wrote:
>> This driver depends on i2c emulator via DT phandle. Make sure the
>> dependency is probed before this driver is probed, not when it is
>> first used during transfer. This fixes the following i2c_emul_find()
>> error:
>>
>> "
>> $ ./u-boot -Dc ""
>> ...
>> i2c_emul_find() No emulators for device 'sandbox_pmic'
>> sandbox_pmic_write() write error to device: 0000000018c568d0 register: 0x0!
>> out_set_value() PMIC write failed: -5
>> i2c_emul_find() No emulators for device 'sandbox_pmic'
>> sandbox_pmic_write() write error to device: 0000000018c568d0 register: 0x0!
>> out_set_value() PMIC write failed: -5
>> ...
>> "
>>
>> Signed-off-by: Marek Vasut <marex at denx.de>
>> ---
>> Cc: Heiko Schocher <hs at denx.de>
>> Cc: Simon Glass <sjg at chromium.org>
>> Cc: Tom Rini <trini at konsulko.com>
>> Cc: u-boot at lists.denx.de
>> ---
>> drivers/i2c/sandbox_i2c.c | 9 +++++++++
>> 1 file changed, 9 insertions(+)
>>
>> diff --git a/drivers/i2c/sandbox_i2c.c b/drivers/i2c/sandbox_i2c.c
>> index 74bb5e93397..9a39ac14fb4 100644
>> --- a/drivers/i2c/sandbox_i2c.c
>> +++ b/drivers/i2c/sandbox_i2c.c
>> @@ -80,6 +80,14 @@ static int sandbox_i2c_xfer(struct udevice *bus, struct i2c_msg *msg,
>> return ops->xfer(emul, msg, nmsgs);
>> }
>> +static int sandbox_i2c_probe(struct udevice *dev)
>> +{
>> + struct udevice *emul;
>> +
>> + return uclass_get_device_by_phandle(UCLASS_I2C_EMUL, dev,
>> + "sandbox,emul", &emul);
>> +}
> Hmmm, no, this does not do it, but it does show what the issue is -- sandbox_i2c_xfer is misused to
> defer access to this emulator until the first I2C transfer, so the emulator can hopefully probe in
> the meantime. This is fragile and now it broke. What I am not quite sure about is why this
> uclass_get_device_by_phandle() returns -2 here instead of probing the emulator ?
Hmm... -2 means it does not find such a device ... why, I don;t know ...
do you have a chance to debug?
Just a fast grep (I must admit, never looked into this parts...))
may it helps if you use
int i2c_emul_find(struct udevice *dev, struct udevice **emulp)
found in file:
./drivers/i2c/i2c-emul-uclass.c
instead?
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: hs at denx.de
More information about the U-Boot
mailing list