summaryrefslogtreecommitdiff
path: root/drivers/spi
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2019-12-07 07:42:47 +0300
committerBin Meng <bmeng.cn@gmail.com>2019-12-15 06:44:23 +0300
commit92842147c3113e83462fcad00fa5cd343c4b945e (patch)
tree63c6e4f307a3a0b8ae089493d98b278890a8e854 /drivers/spi
parent1facebd18fd7369e7629bce1d4fe78d5432fd773 (diff)
downloadu-boot-92842147c3113e83462fcad00fa5cd343c4b945e.tar.xz
spi: ich: Add support for get_mmap() method
Add this method so that the memory-mapped location of the SPI flash can be queried. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Diffstat (limited to 'drivers/spi')
-rw-r--r--drivers/spi/ich.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/drivers/spi/ich.c b/drivers/spi/ich.c
index db895a396d..160ec370fd 100644
--- a/drivers/spi/ich.c
+++ b/drivers/spi/ich.c
@@ -611,6 +611,37 @@ static int ich_spi_exec_op(struct spi_slave *slave, const struct spi_mem_op *op)
return ret;
}
+static int ich_get_mmap_bus(struct udevice *bus, ulong *map_basep,
+ uint *map_sizep, uint *offsetp)
+{
+ pci_dev_t spi_bdf;
+
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
+ struct pci_child_platdata *pplat = dev_get_parent_platdata(bus);
+
+ spi_bdf = pplat->devfn;
+#else
+ struct ich_spi_platdata *plat = dev_get_platdata(bus);
+
+ /*
+ * We cannot rely on plat->bdf being set up yet since this method can
+ * be called before the device is probed. Use the of-platdata directly
+ * instead.
+ */
+ spi_bdf = pci_ofplat_get_devfn(plat->dtplat.reg[0]);
+#endif
+
+ return fast_spi_get_bios_mmap(spi_bdf, map_basep, map_sizep, offsetp);
+}
+
+static int ich_get_mmap(struct udevice *dev, ulong *map_basep, uint *map_sizep,
+ uint *offsetp)
+{
+ struct udevice *bus = dev_get_parent(dev);
+
+ return ich_get_mmap_bus(bus, map_basep, map_sizep, offsetp);
+}
+
static int ich_spi_adjust_size(struct spi_slave *slave, struct spi_mem_op *op)
{
unsigned int page_offset;
@@ -835,6 +866,7 @@ static const struct dm_spi_ops ich_spi_ops = {
.set_speed = ich_spi_set_speed,
.set_mode = ich_spi_set_mode,
.mem_ops = &ich_controller_mem_ops,
+ .get_mmap = ich_get_mmap,
/*
* cs_info is not needed, since we require all chip selects to be
* in the device tree explicitly