
Hi,
We ran into a problem while implementing NAND flash initialisation.
What happens in U-Boot (correct me if I'm wrong):
In drivers/nand/nand.c the function nand_init() calls nand_init_chip() CFG_MAX_NAND_DEVICE times. the function nand_init_chip() calls board_nand_init() and subsequently nand_scan() if nand_scan() returns something != 0 then it is assumed that there is not really a NAND device there
In boards/prodrive/pbnb3/nand.c (to take an existing example) the function board_nand_init() fills in hardware specific functions and returns (it's a void function)
Our hardware has a special bus controller to which up to 5 devices can be connected. NAND flash is one of the device types that can be connected. Each such device is controlled by a so called "profile". Before we can access a NAND flash connected to such a profile we read from the profile if a NAND flash is connected. If not, we do not touch it.
The problem is that board_nand_init() is a void function and always succeeds. In our case we would like to check the profile in board_nand_init() and return an error if no NAND exists. Subsequently nand_init_chip() would not do a nand_scan() for a failing board_nand_init(). Attached is what a patch would look like.
We looked at nand_scan() but it returns != 0 only after calling a lot board specific functions. In our case this would not do as the board specific functions would seriously fail if no NAND device is connected.
Regards, Hans Zuidam -- Hans Zuidam Sen. Systems Engineer, BL DTS ICE, Philips Semiconductors
Building A410, Room 3.40 High Tech Campus 41, 5656 AE Eindhoven, The Netherlands Tel. +31 (0)40 2746579 E-Mail: hans.zuidam@philips.com