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 "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), | ||||
| }; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue