@ -115,20 +115,20 @@ free_dat:
static int set_dev ( int dev )
{
if ( dev < 0 | | dev > = CONFIG_SYS_MAX_NAND_DEVICE | | ! nand_info [ dev ] ) {
puts ( " No such device \n " ) ;
return - 1 ;
}
struct mtd_info * mtd = get_nand_dev_by_index ( dev ) ;
if ( ! mtd )
return - ENODEV ;
if ( nand_curr_device = = dev )
return 0 ;
printf ( " Device %d: %s " , dev , nand_info [ dev ] - > name ) ;
printf ( " Device %d: %s " , dev , mtd - > name ) ;
puts ( " ... is now current device \n " ) ;
nand_curr_device = dev ;
# ifdef CONFIG_SYS_NAND_SELECT_DEVICE
board_nand_select_device ( nand_info [ dev ] - > priv , dev ) ;
board_nand_select_device ( mtd - > priv , dev ) ;
# endif
return 0 ;
@ -188,7 +188,7 @@ int do_nand_env_oob(cmd_tbl_t *cmdtp, int argc, char *const argv[])
{
int ret ;
uint32_t oob_buf [ ENV_OFFSET_SIZE / sizeof ( uint32_t ) ] ;
struct mtd_info * mtd = nand_info [ 0 ] ;
struct mtd_info * mtd = get_nand_dev_by_index ( 0 ) ;
char * cmd = argv [ 1 ] ;
if ( CONFIG_SYS_MAX_NAND_DEVICE = = 0 | | ! mtd ) {
@ -213,9 +213,10 @@ int do_nand_env_oob(cmd_tbl_t *cmdtp, int argc, char *const argv[])
if ( argc < 3 )
goto usage ;
mtd = get_nand_dev_by_index ( idx ) ;
/* We don't care about size, or maxsize. */
if ( mtd_arg_off ( argv [ 2 ] , & idx , & addr , & maxsize , & maxsize ,
MTD_DEV_TYPE_NAND , nand_info [ idx ] - > size ) ) {
MTD_DEV_TYPE_NAND , mtd - > size ) ) {
puts ( " Offset or partition name expected \n " ) ;
return 1 ;
}
@ -283,9 +284,14 @@ usage:
static void nand_print_and_set_info ( int idx )
{
struct mtd_info * mtd = nand_info [ idx ] ;
struct nand_chip * chip = mtd_to_nand ( mtd ) ;
struct mtd_info * mtd ;
struct nand_chip * chip ;
mtd = get_nand_dev_by_index ( idx ) ;
if ( ! mtd )
return ;
chip = mtd_to_nand ( mtd ) ;
printf ( " Device %d: " , idx ) ;
if ( chip - > numchips > 1 )
printf ( " %dx " , chip - > numchips ) ;
@ -348,7 +354,7 @@ static void adjust_size_for_badblocks(loff_t *size, loff_t offset, int dev)
/* We grab the nand info object here fresh because this is usually
* called after arg_off_size ( ) which can change the value of dev .
*/
struct mtd_info * mtd = nand_info [ dev ] ;
struct mtd_info * mtd = get_nand_dev_by_index ( dev ) ;
loff_t maxoffset = offset + * size ;
int badblocks = 0 ;
@ -397,10 +403,8 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
if ( strcmp ( cmd , " info " ) = = 0 ) {
putc ( ' \n ' ) ;
for ( i = 0 ; i < CONFIG_SYS_MAX_NAND_DEVICE ; i + + ) {
if ( nand_info [ i ] )
nand_print_and_set_info ( i ) ;
}
for ( i = 0 ; i < CONFIG_SYS_MAX_NAND_DEVICE ; i + + )
nand_print_and_set_info ( i ) ;
return 0 ;
}
@ -432,12 +436,11 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
* one before these commands can run , even if a partition specifier
* for another device is to be used .
*/
if ( dev < 0 | | dev > = CONFIG_SYS_MAX_NAND_DEVICE | |
! nand_info [ dev ] ) {
mtd = get_nand_dev_by_index ( dev ) ;
if ( ! mtd ) {
puts ( " \n no devices available \n " ) ;
return 1 ;
}
mtd = nand_info [ dev ] ;
if ( strcmp ( cmd , " bad " ) = = 0 ) {
printf ( " \n Device %d bad blocks: \n " , dev ) ;
@ -496,13 +499,13 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
/* skip first two or three arguments, look for offset and size */
if ( mtd_arg_off_size ( argc - o , argv + o , & dev , & off , & size ,
& maxsize , MTD_DEV_TYPE_NAND ,
nand_info [ dev ] - > size ) ! = 0 )
mtd - > size ) ! = 0 )
return 1 ;
if ( set_dev ( dev ) )
return 1 ;
mtd = nand_info [ dev ] ;
mtd = get_nand_dev_by_index ( dev ) ;
memset ( & opts , 0 , sizeof ( opts ) ) ;
opts . offset = off ;
@ -565,13 +568,13 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
if ( mtd_arg_off ( argv [ 3 ] , & dev , & off , & size , & maxsize ,
MTD_DEV_TYPE_NAND ,
nand_info [ dev ] - > size ) )
mtd - > size ) )
return 1 ;
if ( set_dev ( dev ) )
return 1 ;
mtd = nand_info [ dev ] ;
mtd = get_nand_dev_by_index ( dev ) ;
if ( argc > 4 & & ! str2long ( argv [ 4 ] , & pagecount ) ) {
printf ( " '%s' is not a number \n " , argv [ 4 ] ) ;
@ -588,7 +591,7 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
if ( mtd_arg_off_size ( argc - 3 , argv + 3 , & dev , & off ,
& size , & maxsize ,
MTD_DEV_TYPE_NAND ,
nand_info [ dev ] - > size ) ! = 0 )
mtd - > size ) ! = 0 )
return 1 ;
if ( set_dev ( dev ) )
@ -600,7 +603,7 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
rwsize = size ;
}
mtd = nand_info [ dev ] ;
mtd = get_nand_dev_by_index ( dev ) ;
if ( ! s | | ! strcmp ( s , " .jffs2 " ) | |
! strcmp ( s , " .e " ) | | ! strcmp ( s , " .i " ) ) {
@ -760,13 +763,15 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
if ( mtd_arg_off_size ( argc - 2 , argv + 2 , & dev , & off , & size ,
& maxsize , MTD_DEV_TYPE_NAND ,
nand_info [ dev ] - > size ) < 0 )
mtd - > size ) < 0 )
return 1 ;
if ( set_dev ( dev ) )
return 1 ;
if ( ! nand_unlock ( nand_info [ dev ] , off , size , allexcept ) ) {
mtd = get_nand_dev_by_index ( dev ) ;
if ( ! nand_unlock ( mtd , off , size , allexcept ) ) {
puts ( " NAND flash successfully unlocked \n " ) ;
} else {
puts ( " Error unlocking NAND flash, "
@ -929,6 +934,7 @@ static int do_nandboot(cmd_tbl_t *cmdtp, int flag, int argc,
char * boot_device = NULL ;
int idx ;
ulong addr , offset = 0 ;
struct mtd_info * mtd ;
# if defined(CONFIG_CMD_MTDPARTS)
struct mtd_device * dev ;
struct part_info * part ;
@ -948,8 +954,10 @@ static int do_nandboot(cmd_tbl_t *cmdtp, int flag, int argc,
addr = simple_strtoul ( argv [ 1 ] , NULL , 16 ) ;
else
addr = CONFIG_SYS_LOAD_ADDR ;
return nand_load_image ( cmdtp , nand_info [ dev - > id - > num ] ,
part - > offset , addr , argv [ 0 ] ) ;
mtd = get_nand_dev_by_index ( dev - > id - > num ) ;
return nand_load_image ( cmdtp , mtd , part - > offset ,
addr , argv [ 0 ] ) ;
}
}
# endif
@ -991,14 +999,15 @@ usage:
idx = simple_strtoul ( boot_device , NULL , 16 ) ;
if ( idx < 0 | | idx > = CONFIG_SYS_MAX_NAND_DEVICE | | ! nand_info [ idx ] ) {
mtd = get_nand_dev_by_index ( idx ) ;
if ( ! mtd ) {
printf ( " \n ** Device %d not available \n " , idx ) ;
bootstage_error ( BOOTSTAGE_ID_NAND_AVAILABLE ) ;
return 1 ;
}
bootstage_mark ( BOOTSTAGE_ID_NAND_AVAILABLE ) ;
return nand_load_image ( cmdtp , nand_info [ idx ] , offset , addr , argv [ 0 ] ) ;
return nand_load_image ( cmdtp , mtd , offset , addr , argv [ 0 ] ) ;
}
U_BOOT_CMD ( nboot , 4 , 1 , do_nandboot ,