[U-Boot] A problem about 'sf probe' using DM_SPI

Simon Glass sjg at chromium.org
Fri Apr 8 21:12:43 CEST 2016


Hi Qianyu,

On 25 March 2016 at 03:34, Qianyu Gong <qianyu.gong at nxp.com> wrote:
> Hi Simon,
>
>
>
> I think I’m not very clear with this code in common/cmd_sf.c:
>
>>
> # ifdef CONFIG_DM_SPI_FLASH
>
>        /* Remove the old device, otherwise probe will just be a nop */
>
>        ret = spi_find_bus_and_cs(bus, cs, &bus_dev, &new);
>
>        if (!ret) {
>
>               device_remove(new);
>
>              device_unbind(new);
>
>      }
>
>>
> I may understand the remove but why need to unbind the device?

This is because otherwise 'sf probe' would be a nop if the device
already existed. The spi_flash_probe_bus_cs() call will simply return
the existing device. If something has changed on the bus, it would be
ignored.

>
> The unbind would cause a series of free operations on the device list,
> correct?

Yes

>
>
>
> Then if I probe a flash twice, at the second time the driver model will
> create
>
> a new flash named ‘spi_flash at xx:xx’ using default settings because it
> doesn’t
>
> find such a device in the device list and never probes it from the board’s
> fdt again.

Yes.

>
>
>
> => dm tree
>
> Class       Probed   Name
>
> ----------------------------------------
>
> root        [ + ]    root_driver
>
> simple_bus  [ + ]    `-- soc
>
> spi         [ + ]           |-- dspi at 2100000
>
> spi_flash   [   ]        |    |-- n25q128a
>
> spi_flash   [ + ]        |   |-- spi_flash at 1:1
>
> spi_flash   [ + ]        |   `-- spi_flash at 1:2
>
>
>
> Fortunately the default SPI mode set by U-Boot is SPI_MODE_3 so it doesn’t
> cause
>
> issues on our boards. But if an SPI flash which only supports SPI_MODE_0 is
> used,
>
> I think it wouldn’t work properly from the second probe.
>
>
>
>
>
> Sorry if there is something wrong with my understandings.
>
> Just because I found my flash’s name was changed to spi-flash at xx:xx in dm
> tree
>
> after several probes, I began to read something about driver model.J

Yes I think removing the unbind would be OK, except that we need a way
to show the messages at the end of spi_flash_scan().

Probably these messages should move out of the uclass and into a
separate call. We could add a function like spi_flash_show(struct
udevice *dev) and call it from do_spi_flash_probe() and perhaps
saveenv().

Regards,
Simon


More information about the U-Boot mailing list