@ -604,13 +604,14 @@ static int omap_read_page_bch(struct mtd_info *mtd, struct nand_chip *chip,
# ifndef CONFIG_SPL_BUILD
/*
* omap_nand_switch_ecc - switch the ECC operation b / w h / w ecc and s / w ecc .
* The default is to come up on s / w ecc
*
* @ hardware - 1 - switch to h / w ecc , 0 - s / w ecc
* omap_nand_switch_ecc - switch the ECC operation between different engines
* ( h / w and s / w ) and different algorithms ( hamming and BCHx )
*
* @ hardware - true if one of the HW engines should be used
* @ eccstrength - the number of bits that could be corrected
* ( 1 - hamming , 4 - BCH4 , 8 - BCH8 , 16 - BCH16 )
*/
void omap_nand_switch_ecc ( int32_t hardware )
void omap_nand_switch_ecc ( u int32_t hardware , uint32_t eccstrength )
{
struct nand_chip * nand ;
struct mtd_info * mtd ;
@ -628,6 +629,7 @@ void omap_nand_switch_ecc(int32_t hardware)
nand - > options | = NAND_OWN_BUFFERS ;
/* Reset ecc interface */
nand - > ecc . mode = NAND_ECC_NONE ;
nand - > ecc . read_page = NULL ;
nand - > ecc . write_page = NULL ;
nand - > ecc . read_oob = NULL ;
@ -637,28 +639,31 @@ void omap_nand_switch_ecc(int32_t hardware)
nand - > ecc . calculate = NULL ;
/* Setup the ecc configurations again */
if ( hardware = = 1 ) {
nand - > ecc . mode = NAND_ECC_HW ;
nand - > ecc . layout = & hw_nand_oob ;
nand - > ecc . size = 512 ;
nand - > ecc . bytes = 3 ;
nand - > ecc . hwctl = omap_enable_hwecc ;
nand - > ecc . correct = omap_correct_data ;
nand - > ecc . calculate = omap_calculate_ecc ;
omap_hwecc_init ( nand ) ;
printf ( " HW ECC selected \n " ) ;
if ( hardware ) {
if ( eccstrength = = 1 ) {
nand - > ecc . mode = NAND_ECC_HW ;
nand - > ecc . layout = & hw_nand_oob ;
nand - > ecc . size = 512 ;
nand - > ecc . bytes = 3 ;
nand - > ecc . hwctl = omap_enable_hwecc ;
nand - > ecc . correct = omap_correct_data ;
nand - > ecc . calculate = omap_calculate_ecc ;
omap_hwecc_init ( nand ) ;
printf ( " 1-bit hamming HW ECC selected \n " ) ;
}
# ifdef CONFIG_AM33XX
} else if ( hardware = = 2 ) {
nand - > ecc . mode = NAND_ECC_HW ;
nand - > ecc . layout = & hw_bch8_nand_oob ;
nand - > ecc . size = 512 ;
nand - > ecc . bytes = 14 ;
nand - > ecc . read_page = omap_read_page_bch ;
nand - > ecc . hwctl = omap_enable_ecc_bch ;
nand - > ecc . correct = omap_correct_data_bch ;
nand - > ecc . calculate = omap_calculate_ecc_bch ;
omap_hwecc_init_bch ( nand , NAND_ECC_READ ) ;
printf ( " HW BCH8 selected \n " ) ;
else if ( eccstrength = = 8 ) {
nand - > ecc . mode = NAND_ECC_HW ;
nand - > ecc . layout = & hw_bch8_nand_oob ;
nand - > ecc . size = 512 ;
nand - > ecc . bytes = 14 ;
nand - > ecc . read_page = omap_read_page_bch ;
nand - > ecc . hwctl = omap_enable_ecc_bch ;
nand - > ecc . correct = omap_correct_data_bch ;
nand - > ecc . calculate = omap_calculate_ecc_bch ;
omap_hwecc_init_bch ( nand , NAND_ECC_READ ) ;
printf ( " 8-bit BCH HW ECC selected \n " ) ;
}
# endif
} else {
nand - > ecc . mode = NAND_ECC_SOFT ;