I ran into an issue today with a U-CLASS SPI NOR flash device on a NXP FlexSPI controller. U-Boot started correctly from the flash device but using 'sf probe 0:0' would always return 'Invalid bus 0 (err=-19)'. This error message is emitted by spi_get_bus_and_cs() in drivers/spi/spi-uclass.c. I traced the issue to uclass_get_device_by_seq() in drivers/core/uclass.c.
The function first searches the device list for a device that already claimed the sequence number (dev->seq). If not found it would look if a device requested that sequence number (dev->seq_req). That would always fail for my device. The bus had not been probed yet and hence dev->seq was -1 and the device also had dev->req_seq set to -1. The board is using a device tree hence it would only make sense to set the requested sequence number via the device tree. However, there is no such thing and even if there was it might not be specified. Consequently, the device was never probed although the driver was correctly set up via device tree. I worked around it by simply setting dev->req_seq of the first device that had it set to -1 to the sequence number the search function was looking for (see patch below). It solved my problem but I don't know if that is the right way of addressing it. I could not find any other solution for this particular problem anywhere. Rudi From 0f05ab964fcc7d29d8d467e663d7daa72328cf66 Mon Sep 17 00:00:00 2001 From: Rudolf J Streif <rudolf.str...@ibeeto.com> Date: Tue, 17 Mar 2020 17:13:07 -0700 Subject: [PATCH] Fix issue with SPI device sequence number If the requested sequence number for a SPI device was -1 (any) then the device would never be probed. This fix simply assigns the sequence number asked for at probing to the device if it has not been probed yet and the requested sequence number is -1. Signed-off-by: Rudolf J Streif <rudolf.str...@ibeeto.com> --- drivers/core/uclass.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/core/uclass.c b/drivers/core/uclass.c index fc3157de39..e791103153 100644 --- a/drivers/core/uclass.c +++ b/drivers/core/uclass.c @@ -310,6 +310,8 @@ int uclass_find_device_by_seq(enum uclass_id id, int seq_or_req_seq, uclass_foreach_dev(dev, uc) { debug(" - %d %d '%s'\n", dev->req_seq, dev->seq, dev->name); + if (find_req_seq && dev->req_seq == -1) + dev->req_seq = seq_or_req_seq; if ((find_req_seq ? dev->req_seq : dev->seq) == seq_or_req_seq) { *devp = dev; -- 2.23.0
signature.asc
Description: OpenPGP digital signature