diff options
author | Michal Simek <michal.simek@xilinx.com> | 2015-10-27 13:52:47 +0100 |
---|---|---|
committer | Michal Simek <michal.simek@xilinx.com> | 2015-11-19 13:10:32 +0100 |
commit | 2588f2ddfd60ac617c05def14e9a92fd329721fe (patch) | |
tree | b4d72e490a70eaea010ce41f202304f8b2a5d6aa /drivers | |
parent | 31e1029a8ee13ab4b4a73e72ec7a730eb9c661b9 (diff) | |
download | u-boot-imx-2588f2ddfd60ac617c05def14e9a92fd329721fe.zip u-boot-imx-2588f2ddfd60ac617c05def14e9a92fd329721fe.tar.gz u-boot-imx-2588f2ddfd60ac617c05def14e9a92fd329721fe.tar.bz2 |
dm: sf: Add support for all targets which requires MANUAL_RELOC
It is follow up patch based on
"dm: Add support for all targets which requires MANUAL_RELOC"
(sha1: 484fdf5ba058b07be5ca82763aa2b72063540ef3)
to update function pointers for DM.
Using post_bind is not ideal but it is one on current option what can be
used. Variable reloc_done has to be used do not call relocation after
every bind. Maybe new core functions should be introduced for this case.
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mtd/spi/sf-uclass.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/mtd/spi/sf-uclass.c b/drivers/mtd/spi/sf-uclass.c index 350e21a..72e0f6b 100644 --- a/drivers/mtd/spi/sf-uclass.c +++ b/drivers/mtd/spi/sf-uclass.c @@ -11,6 +11,8 @@ #include <dm/device-internal.h> #include "sf_internal.h" +DECLARE_GLOBAL_DATA_PTR; + int spi_flash_read_dm(struct udevice *dev, u32 offset, size_t len, void *buf) { return sf_get_ops(dev)->read(dev, offset, len, buf); @@ -72,8 +74,29 @@ int spi_flash_remove(struct udevice *dev) return device_remove(dev); } +static int spi_flash_post_bind(struct udevice *dev) +{ +#if defined(CONFIG_NEEDS_MANUAL_RELOC) + struct dm_spi_flash_ops *ops = sf_get_ops(dev); + static int reloc_done; + + if (!reloc_done) { + if (ops->read) + ops->read += gd->reloc_off; + if (ops->write) + ops->write += gd->reloc_off; + if (ops->erase) + ops->erase += gd->reloc_off; + + reloc_done++; + } +#endif + return 0; +} + UCLASS_DRIVER(spi_flash) = { .id = UCLASS_SPI_FLASH, .name = "spi_flash", + .post_bind = spi_flash_post_bind, .per_device_auto_alloc_size = sizeof(struct spi_flash), }; |