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: 484fdf5ba0)
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>
			
			
This commit is contained in:
		
							parent
							
								
									31e1029a8e
								
							
						
					
					
						commit
						2588f2ddfd
					
				|  | @ -11,6 +11,8 @@ | ||||||
| #include <dm/device-internal.h> | #include <dm/device-internal.h> | ||||||
| #include "sf_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) | 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); | 	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); | 	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) = { | UCLASS_DRIVER(spi_flash) = { | ||||||
| 	.id		= UCLASS_SPI_FLASH, | 	.id		= UCLASS_SPI_FLASH, | ||||||
| 	.name		= "spi_flash", | 	.name		= "spi_flash", | ||||||
|  | 	.post_bind	= spi_flash_post_bind, | ||||||
| 	.per_device_auto_alloc_size = sizeof(struct spi_flash), | 	.per_device_auto_alloc_size = sizeof(struct spi_flash), | ||||||
| }; | }; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue