Hi Simon, On Mon, Oct 21, 2019 at 11:40 AM Simon Glass <s...@chromium.org> wrote: > > Change the algorithm to first find the flash device then read the > properties using the livetree API. With this change the device is not > probed so this needs to be done in mrccache_save(). > > Signed-off-by: Simon Glass <s...@chromium.org> > --- > > Changes in v3: > - Update mrccache livetree patch to just convert to livetree > > Changes in v2: None > > arch/x86/lib/mrccache.c | 55 +++++++++++++++++++---------------------- > 1 file changed, 26 insertions(+), 29 deletions(-) > > diff --git a/arch/x86/lib/mrccache.c b/arch/x86/lib/mrccache.c > index 7292d1fe070..b8bc5de602c 100644 > --- a/arch/x86/lib/mrccache.c > +++ b/arch/x86/lib/mrccache.c > @@ -14,6 +14,8 @@ > #include <spi.h> > #include <spi_flash.h> > #include <asm/mrccache.h> > +#include <dm/device-internal.h> > +#include <dm/uclass-internal.h> > > DECLARE_GLOBAL_DATA_PTR; > > @@ -201,45 +203,37 @@ int mrccache_reserve(void) > > int mrccache_get_region(struct udevice **devp, struct mrc_region *entry) > { > - const void *blob = gd->fdt_blob; > - int node, mrc_node; > + struct udevice *dev; > + ofnode mrc_node; > u32 reg[2]; > int ret; > > - /* Find the flash chip within the SPI controller node */ > - node = fdtdec_next_compatible(blob, 0, COMPAT_GENERIC_SPI_FLASH); > - if (node < 0) { > - debug("%s: Cannot find SPI flash\n", __func__); > - return -ENOENT; > - } > - > - if (fdtdec_get_int_array(blob, node, "memory-map", reg, 2)) { > - debug("%s: Cannot find memory map\n", __func__); > - return -EINVAL; > - } > + /* > + * Find the flash chip within the SPI controller node. Avoid probing > + * the device here since it may put it into a strange state where the > + * memory map cannot be read. > + */ > + ret = uclass_find_first_device(UCLASS_SPI_FLASH, &dev);
Adding probe of UCLASS_SPI_FLASH should be in the next patch: [U-Boot,v3,044/108] x86: Adjust mrccache_get_region() to support get_mmap() > + if (ret) > + return log_msg_ret("Cannot find SPI flash\n", ret); > + ret = dev_read_u32_array(dev, "memory-map", reg, 2); > + if (ret) > + return log_msg_ret("Cannot find memory map\n", ret); > entry->base = reg[0]; > > /* Find the place where we put the MRC cache */ > - mrc_node = fdt_subnode_offset(blob, node, "rw-mrc-cache"); > - if (mrc_node < 0) { > - debug("%s: Cannot find node\n", __func__); > - return -EPERM; > - } > + mrc_node = dev_read_subnode(dev, "rw-mrc-cache"); > + if (!ofnode_valid(mrc_node)) > + return log_msg_ret("Cannot find node", -EPERM); > > - if (fdtdec_get_int_array(blob, mrc_node, "reg", reg, 2)) { > - debug("%s: Cannot find address\n", __func__); > - return -EINVAL; > - } > + ret = ofnode_read_u32_array(mrc_node, "reg", reg, 2); > + if (ret) > + return log_msg_ret("Cannot find address", ret); > entry->offset = reg[0]; > entry->length = reg[1]; > > - if (devp) { > - ret = uclass_get_device_by_of_offset(UCLASS_SPI_FLASH, node, > - devp); > - debug("ret = %d\n", ret); > - if (ret) > - return ret; > - } > + if (devp) > + *devp = dev; > > return 0; > } > @@ -257,6 +251,9 @@ int mrccache_save(void) > gd->arch.mrc_output_len); > > ret = mrccache_get_region(&sf, &entry); > + if (ret) > + goto err_entry; > + ret = device_probe(sf); This needs a comment as we discussed in v2, or maybe it should also go into next patch? > if (ret) > goto err_entry; > data = (struct mrc_data_container *)gd->arch.mrc_output; > -- Regards, Bin _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot