summaryrefslogtreecommitdiff
path: root/drivers/mtd/nand/sunxi_nand_spl.c
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2015-08-15 19:23:08 (GMT)
committerHans de Goede <hdegoede@redhat.com>2015-08-31 06:43:42 (GMT)
commit2b8a01a99d6b1632d4356fa71383069b4a532687 (patch)
treeaea4a84ef69c2541b9d795261b93574363ddef98 /drivers/mtd/nand/sunxi_nand_spl.c
parentf5916d1856cb043f79304a99103a2f910298eecc (diff)
downloadu-boot-fsl-qoriq-2b8a01a99d6b1632d4356fa71383069b4a532687.tar.xz
sunxi_nand_spl: Auto detect nand configuration parameters
Auto detect the nand configuration parameters, like the BROM does. This allows us to get rid of various Kconfig settings, and is necessary to support generic boards like the mk802 which have seen many production runs with different nands. The full blown u-boot/kernel nand driver uses the nand id to determine this info, for the SPL we do as the BROM does and simply try a few standard configs. Note the table only contains configs which are known to actually be used, rather then all the configs the BROM tries. This means that it may need to be updated in the future as we add support for nand on more boards. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Acked-by: Ian Campbell <ijc@hellion.org.uk>
Diffstat (limited to 'drivers/mtd/nand/sunxi_nand_spl.c')
-rw-r--r--drivers/mtd/nand/sunxi_nand_spl.c43
1 files changed, 39 insertions, 4 deletions
diff --git a/drivers/mtd/nand/sunxi_nand_spl.c b/drivers/mtd/nand/sunxi_nand_spl.c
index 3206a50..eee6c7b 100644
--- a/drivers/mtd/nand/sunxi_nand_spl.c
+++ b/drivers/mtd/nand/sunxi_nand_spl.c
@@ -307,10 +307,45 @@ static int nand_read_ecc(int page_size, int ecc_strength, int ecc_page_size,
static int nand_read_buffer(uint32_t offs, unsigned int size, void *dest,
int syndrome)
{
- return nand_read_ecc(CONFIG_NAND_SUNXI_SPL_PAGE_SIZE,
- CONFIG_NAND_SUNXI_SPL_ECC_STRENGTH,
- CONFIG_NAND_SUNXI_SPL_ECC_PAGE_SIZE,
- 5, offs, size, dest, syndrome);
+ const struct {
+ int page_size;
+ int ecc_strength;
+ int ecc_page_size;
+ int addr_cycles;
+ } nand_configs[] = {
+ { 8192, 40, 1024, 5 },
+ { 16384, 56, 1024, 5 },
+ { 8192, 24, 1024, 5 },
+ };
+ static int nand_config = -1;
+ int i;
+
+ if (nand_config == -1) {
+ for (i = 0; i < ARRAY_SIZE(nand_configs); i++) {
+ debug("nand: trying page %d ecc %d / %d addr %d: ",
+ nand_configs[i].page_size,
+ nand_configs[i].ecc_strength,
+ nand_configs[i].ecc_page_size,
+ nand_configs[i].addr_cycles);
+ if (nand_read_ecc(nand_configs[i].page_size,
+ nand_configs[i].ecc_strength,
+ nand_configs[i].ecc_page_size,
+ nand_configs[i].addr_cycles,
+ offs, size, dest, syndrome) == 0) {
+ debug("success\n");
+ nand_config = i;
+ return 0;
+ }
+ debug("failed\n");
+ }
+ return -1;
+ }
+
+ return nand_read_ecc(nand_configs[nand_config].page_size,
+ nand_configs[nand_config].ecc_strength,
+ nand_configs[nand_config].ecc_page_size,
+ nand_configs[nand_config].addr_cycles,
+ offs, size, dest, syndrome);
}
int nand_spl_load_image(uint32_t offs, unsigned int size, void *dest)