@ -8,6 +8,7 @@
*/
# include <common.h>
# include <fdtdec.h>
# include <malloc.h>
# include <spi.h>
# include <spi_flash.h>
@ -15,6 +16,8 @@
# include "spi_flash_internal.h"
DECLARE_GLOBAL_DATA_PTR ;
static void spi_flash_addr ( u32 addr , u8 * cmd )
{
/* cmd[0] is actual command */
@ -146,6 +149,10 @@ int spi_flash_cmd_read_fast(struct spi_flash *flash, u32 offset,
{
u8 cmd [ 5 ] ;
/* Handle memory-mapped SPI */
if ( flash - > memory_map )
memcpy ( data , flash - > memory_map + offset , len ) ;
cmd [ 0 ] = CMD_READ_ARRAY_FAST ;
spi_flash_addr ( offset , cmd ) ;
cmd [ 4 ] = 0x00 ;
@ -275,6 +282,34 @@ int spi_flash_cmd_write_status(struct spi_flash *flash, u8 sr)
return 0 ;
}
# ifdef CONFIG_OF_CONTROL
int spi_flash_decode_fdt ( const void * blob , struct spi_flash * flash )
{
fdt_addr_t addr ;
fdt_size_t size ;
int node ;
/* If there is no node, do nothing */
node = fdtdec_next_compatible ( blob , 0 , COMPAT_GENERIC_SPI_FLASH ) ;
if ( node < 0 )
return 0 ;
addr = fdtdec_get_addr_size ( blob , node , " memory-map " , & size ) ;
if ( addr = = FDT_ADDR_T_NONE ) {
debug ( " %s: Cannot decode address \n " , __func__ ) ;
return 0 ;
}
if ( flash - > size ! = size ) {
debug ( " %s: Memory map must cover entire device \n " , __func__ ) ;
return - 1 ;
}
flash - > memory_map = ( void * ) addr ;
return 0 ;
}
# endif /* CONFIG_OF_CONTROL */
/*
* The following table holds all device probe functions
*
@ -391,9 +426,18 @@ struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
goto err_manufacturer_probe ;
}
# ifdef CONFIG_OF_CONTROL
if ( spi_flash_decode_fdt ( gd - > fdt_blob , flash ) ) {
debug ( " SF: FDT decode error \n " ) ;
goto err_manufacturer_probe ;
}
# endif
printf ( " SF: Detected %s with page size " , flash - > name ) ;
print_size ( flash - > sector_size , " , total " ) ;
print_size ( flash - > size , " \n " ) ;
print_size ( flash - > size , " " ) ;
if ( flash - > memory_map )
printf ( " , mapped at %p " , flash - > memory_map ) ;
puts ( " \n " ) ;
spi_release_bus ( spi ) ;