@ -105,71 +105,6 @@ static const struct winbond_spi_flash_params winbond_spi_flash_table[] = {
} ,
} ;
static int winbond_write ( struct spi_flash * flash ,
u32 offset , size_t len , const void * buf )
{
struct winbond_spi_flash * stm = to_winbond_spi_flash ( flash ) ;
unsigned long page_addr ;
unsigned long byte_addr ;
unsigned long page_size ;
unsigned int page_shift ;
size_t chunk_len ;
size_t actual ;
int ret ;
u8 cmd [ 4 ] ;
page_shift = stm - > params - > l2_page_size ;
page_size = ( 1 < < page_shift ) ;
page_addr = offset / page_size ;
byte_addr = offset % page_size ;
ret = spi_claim_bus ( flash - > spi ) ;
if ( ret ) {
debug ( " SF: Unable to claim SPI bus \n " ) ;
return ret ;
}
for ( actual = 0 ; actual < len ; actual + = chunk_len ) {
chunk_len = min ( len - actual , page_size - byte_addr ) ;
cmd [ 0 ] = CMD_W25_PP ;
cmd [ 1 ] = page_addr > > ( 16 - page_shift ) ;
cmd [ 2 ] = page_addr < < ( page_shift - 8 ) | ( byte_addr > > 8 ) ;
cmd [ 3 ] = byte_addr ;
debug ( " PP: 0x%p => cmd = { 0x%02x 0x%02x%02x%02x } chunk_len = %d \n " ,
buf + actual ,
cmd [ 0 ] , cmd [ 1 ] , cmd [ 2 ] , cmd [ 3 ] , chunk_len ) ;
ret = spi_flash_cmd_write_enable ( flash ) ;
if ( ret < 0 ) {
debug ( " SF: Enabling Write failed \n " ) ;
goto out ;
}
ret = spi_flash_cmd_write ( flash - > spi , cmd , 4 ,
buf + actual , chunk_len ) ;
if ( ret < 0 ) {
debug ( " SF: Winbond Page Program failed \n " ) ;
goto out ;
}
ret = spi_flash_cmd_wait_ready ( flash , SPI_FLASH_PROG_TIMEOUT ) ;
if ( ret )
goto out ;
page_addr + + ;
byte_addr = 0 ;
}
debug ( " SF: Winbond: Successfully programmed %u bytes @ 0x%x \n " ,
len , offset ) ;
ret = 0 ;
out :
spi_release_bus ( flash - > spi ) ;
return ret ;
}
static int winbond_erase ( struct spi_flash * flash , u32 offset , size_t len )
{
return spi_flash_cmd_erase ( flash , CMD_W25_SE , offset , len ) ;
@ -207,11 +142,11 @@ struct spi_flash *spi_flash_probe_winbond(struct spi_slave *spi, u8 *idcode)
/* Assuming power-of-two page size initially. */
page_size = 1 < < params - > l2_page_size ;
stm - > flash . write = winbond_write ;
stm - > flash . write = spi_flash_cmd_write_multi ;
stm - > flash . erase = winbond_erase ;
stm - > flash . read = spi_flash_cmd_read_fast ;
stm - > flash . sector_size = ( 1 < < stm - > params - > l2_page_size ) *
stm - > params - > pages_per_sector ;
stm - > flash . page_size = page_size ;
stm - > flash . sector_size = page_size * stm - > params - > pages_per_sector ;
stm - > flash . size = page_size * params - > pages_per_sector
* params - > sectors_per_block
* params - > nr_blocks ;