@ -22,6 +22,7 @@
# include <common.h>
# include <malloc.h>
# include <nand.h>
# include <linux/mtd/mtd.h>
# include <linux/mtd/nand.h>
@ -57,7 +58,6 @@ struct fsl_elbc_ctrl;
/* mtd information per set */
struct fsl_elbc_mtd {
struct mtd_info mtd ;
struct nand_chip chip ;
struct fsl_elbc_ctrl * ctrl ;
@ -686,10 +686,13 @@ static void fsl_elbc_ctrl_init(void)
elbc_ctrl - > addr = NULL ;
}
int board_nand_init ( struct nand_chip * nand )
static int fsl_elbc_chip_init ( int devnum , u8 * addr )
{
struct mtd_info * mtd = & nand_info [ devnum ] ;
struct nand_chip * nand ;
struct fsl_elbc_mtd * priv ;
uint32_t br = 0 , or = 0 ;
int ret ;
if ( ! elbc_ctrl ) {
fsl_elbc_ctrl_init ( ) ;
@ -702,19 +705,19 @@ int board_nand_init(struct nand_chip *nand)
return - ENOMEM ;
priv - > ctrl = elbc_ctrl ;
priv - > vbase = nand - > IO_ADDR_R ;
priv - > vbase = addr ;
/* Find which chip select it is connected to. It'd be nice
* if we could pass more than one datum to the NAND driver . . .
*/
for ( priv - > bank = 0 ; priv - > bank < MAX_BANKS ; priv - > bank + + ) {
phys_addr_t base _addr = virt_to_phys ( nand - > IO_ADDR_R ) ;
phys_addr_t phys _addr = virt_to_phys ( addr ) ;
br = in_be32 ( & elbc_ctrl - > regs - > bank [ priv - > bank ] . br ) ;
or = in_be32 ( & elbc_ctrl - > regs - > bank [ priv - > bank ] . or ) ;
if ( ( br & BR_V ) & & ( br & BR_MSEL ) = = BR_MS_FCM & &
( br & or & BR_BA ) = = BR_PHYS_ADDR ( base _addr) )
( br & or & BR_BA ) = = BR_PHYS_ADDR ( phys _addr) )
break ;
}
@ -724,6 +727,9 @@ int board_nand_init(struct nand_chip *nand)
return - ENODEV ;
}
nand = & priv - > chip ;
mtd - > priv = nand ;
elbc_ctrl - > chips [ priv - > bank ] = priv ;
/* fill in nand_chip structure */
@ -794,5 +800,32 @@ int board_nand_init(struct nand_chip *nand)
}
}
ret = nand_scan_ident ( mtd , 1 , NULL ) ;
if ( ret )
return ret ;
ret = nand_scan_tail ( mtd ) ;
if ( ret )
return ret ;
ret = nand_register ( devnum ) ;
if ( ret )
return ret ;
return 0 ;
}
# ifndef CONFIG_SYS_NAND_BASE_LIST
# define CONFIG_SYS_NAND_BASE_LIST { CONFIG_SYS_NAND_BASE }
# endif
static unsigned long base_address [ CONFIG_SYS_MAX_NAND_DEVICE ] =
CONFIG_SYS_NAND_BASE_LIST ;
void board_nand_init ( void )
{
int i ;
for ( i = 0 ; i < CONFIG_SYS_MAX_NAND_DEVICE ; i + + )
fsl_elbc_chip_init ( i , ( u8 * ) base_address [ i ] ) ;
}