]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
Merge branch 'master' of git://git.denx.de/u-boot-uniphier
authorTom Rini <trini@ti.com>
Thu, 27 Nov 2014 18:10:04 +0000 (13:10 -0500)
committerTom Rini <trini@ti.com>
Thu, 27 Nov 2014 18:10:04 +0000 (13:10 -0500)
19 files changed:
arch/arm/include/asm/arch-s3c24x0/s3c2410.h
arch/arm/include/asm/arch-s3c24x0/s3c2440.h
arch/arm/include/asm/arch-s3c24x0/s3c24x0.h
arch/mips/cpu/mips32/start.S
arch/mips/cpu/mips64/start.S
arch/mips/lib/Makefile
arch/mips/lib/board.c [deleted file]
arch/mips/lib/bootm.c
drivers/mtd/nand/Kconfig
drivers/mtd/nand/denali.c
drivers/mtd/nand/denali.h
drivers/mtd/nand/nand_base.c
drivers/mtd/nand/s3c2410_nand.c
drivers/mtd/nand/vf610_nfc.c
include/configs/dbau1x00.h
include/configs/pb1x00.h
include/configs/qemu-mips.h
include/configs/qemu-mips64.h
include/configs/vct.h

index ce4186fed043d448c411b10d531e87ad2a1e7e97..8773ce30d17241ccb241f0a396af50be901fa577 100644 (file)
@@ -83,9 +83,9 @@ static inline struct s3c24x0_lcd *s3c24x0_get_base_lcd(void)
        return (struct s3c24x0_lcd *)S3C24X0_LCD_BASE;
 }
 
-static inline struct s3c2410_nand *s3c2410_get_base_nand(void)
+static inline struct s3c24x0_nand *s3c24x0_get_base_nand(void)
 {
-       return (struct s3c2410_nand *)S3C2410_NAND_BASE;
+       return (struct s3c24x0_nand *)S3C2410_NAND_BASE;
 }
 
 static inline struct s3c24x0_uart
index 3f44bdc306b5eb29690e88a441fc80496e6d69ff..7a525f281877c2ce808e1bca91dcf8fd642ac6ab 100644 (file)
@@ -81,9 +81,9 @@ static inline struct s3c24x0_lcd *s3c24x0_get_base_lcd(void)
        return (struct s3c24x0_lcd *)S3C24X0_LCD_BASE;
 }
 
-static inline struct s3c2440_nand *s3c2440_get_base_nand(void)
+static inline struct s3c24x0_nand *s3c24x0_get_base_nand(void)
 {
-       return (struct s3c2440_nand *)S3C2440_NAND_BASE;
+       return (struct s3c24x0_nand *)S3C2440_NAND_BASE;
 }
 
 static inline struct s3c24x0_uart
index ed9df34c69082113abaf13ddef8b5027322ac2fe..2dae9fc3d74b0b7bee471a51365ae4bb32230afc 100644 (file)
@@ -135,34 +135,33 @@ struct s3c24x0_lcd {
 };
 
 
-#ifdef CONFIG_S3C2410
-/* NAND FLASH (see S3C2410 manual chapter 6) */
-struct s3c2410_nand {
-       u32     nfconf;
-       u32     nfcmd;
-       u32     nfaddr;
-       u32     nfdata;
-       u32     nfstat;
-       u32     nfecc;
-};
-#endif
-#ifdef CONFIG_S3C2440
-/* NAND FLASH (see S3C2440 manual chapter 6) */
-struct s3c2440_nand {
+/* NAND FLASH (see manual chapter 6) */
+struct s3c24x0_nand {
        u32     nfconf;
+#ifndef CONFIG_S3C2410
        u32     nfcont;
+#endif
        u32     nfcmd;
        u32     nfaddr;
        u32     nfdata;
+#ifndef CONFIG_S3C2410
        u32     nfeccd0;
        u32     nfeccd1;
        u32     nfeccd;
+#endif
        u32     nfstat;
+#ifdef CONFIG_S3C2410
+       u32     nfecc;
+#else
        u32     nfstat0;
        u32     nfstat1;
-};
+       u32     nfmecc0;
+       u32     nfmecc1;
+       u32     nfsecc;
+       u32     nfsblk;
+       u32     nfeblk;
 #endif
-
+};
 
 /* UART (see manual chapter 11) */
 struct s3c24x0_uart {
index 68e59b596f1146f605a91383c7dd950945fddc2f..384ea26022bcf5b907a8eaf541466bbb56a3612a 100644 (file)
@@ -136,10 +136,11 @@ reset:
 
        /* Set up temporary stack */
        li      sp, CONFIG_SYS_SDRAM_BASE + CONFIG_SYS_INIT_SP_OFFSET
+       move    fp, sp
 
        la      t9, board_init_f
        jr      t9
-        nop
+        move   ra, zero
 
 /*
  * void relocate_code (addr_sp, gd, addr_moni)
@@ -155,6 +156,7 @@ reset:
        .ent    relocate_code
 relocate_code:
        move    sp, a0                  # set new stack pointer
+       move    fp, sp
 
        move    s0, a1                  # save gd in s0
        move    s2, a2                  # save destination address in s2
@@ -260,8 +262,9 @@ in_ram:
         addi   t1, 4
 
        move    a0, s0                  # a0 <-- gd
+       move    a1, s2
        la      t9, board_init_r
        jr      t9
-        move   a1, s2
+        move   ra, zero
 
        .end    relocate_code
index 92954e1c907bf9dddb64aa433aa6374cd324205a..6ff714e8ed4fa2f177ecdc02d9fa8989dd1fe783 100644 (file)
@@ -130,10 +130,11 @@ reset:
 
        /* Set up temporary stack */
        dli     sp, CONFIG_SYS_SDRAM_BASE + CONFIG_SYS_INIT_SP_OFFSET
+       move    fp, sp
 
        dla     t9, board_init_f
        jr      t9
-        nop
+        move   ra, zero
 
 /*
  * void relocate_code (addr_sp, gd, addr_moni)
@@ -149,6 +150,7 @@ reset:
        .ent    relocate_code
 relocate_code:
        move    sp, a0                  # set new stack pointer
+       move    fp, sp
 
        move    s0, a1                  # save gd in s0
        move    s2, a2                  # save destination address in s2
@@ -254,8 +256,9 @@ in_ram:
         daddi  t1, 8
 
        move    a0, s0                  # a0 <-- gd
+       move    a1, s2
        dla     t9, board_init_r
        jr      t9
-        move   a1, s2
+        move   ra, zero
 
        .end    relocate_code
index e483e86f6b471e69e4b38b190c0c14278294a621..7f9b6536afa84ab8e7ff2947bec24518caae95b5 100644 (file)
@@ -5,9 +5,6 @@
 # SPDX-License-Identifier:     GPL-2.0+
 #
 
-ifndef CONFIG_SYS_GENERIC_BOARD
-obj-y  += board.o
-endif
 obj-y  += io.o
 
 obj-$(CONFIG_CMD_BOOTM) += bootm.o
diff --git a/arch/mips/lib/board.c b/arch/mips/lib/board.c
deleted file mode 100644 (file)
index 3feb020..0000000
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * (C) Copyright 2003
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-#include <common.h>
-#include <command.h>
-#include <malloc.h>
-#include <serial.h>
-#include <stdio_dev.h>
-#include <version.h>
-#include <net.h>
-#include <environment.h>
-#include <nand.h>
-#include <onenand_uboot.h>
-#include <spi.h>
-
-#ifdef CONFIG_BITBANGMII
-#include <miiphy.h>
-#endif
-
-DECLARE_GLOBAL_DATA_PTR;
-
-ulong monitor_flash_len;
-
-static char *failed = "*** failed ***\n";
-
-int __board_early_init_f(void)
-{
-       /*
-        * Nothing to do in this dummy implementation
-        */
-       return 0;
-}
-int board_early_init_f(void)
-       __attribute__((weak, alias("__board_early_init_f")));
-
-static int init_func_ram(void)
-{
-#ifdef CONFIG_BOARD_TYPES
-       int board_type = gd->board_type;
-#else
-       int board_type = 0;     /* use dummy arg */
-#endif
-       puts("DRAM:  ");
-
-       gd->ram_size = initdram(board_type);
-       if (gd->ram_size > 0) {
-               print_size(gd->ram_size, "\n");
-               return 0;
-       }
-       puts(failed);
-       return 1;
-}
-
-static int display_banner(void)
-{
-
-       printf("\n\n%s\n\n", version_string);
-       return 0;
-}
-
-#ifndef CONFIG_SYS_NO_FLASH
-static void display_flash_config(ulong size)
-{
-       puts("Flash: ");
-       print_size(size, "\n");
-}
-#endif
-
-static int init_baudrate(void)
-{
-       gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE);
-       return 0;
-}
-
-
-/*
- * Breath some life into the board...
- *
- * The first part of initialization is running from Flash memory;
- * its main purpose is to initialize the RAM so that we
- * can relocate the monitor code to RAM.
- */
-
-/*
- * All attempts to come up with a "common" initialization sequence
- * that works for all boards and architectures failed: some of the
- * requirements are just _too_ different. To get rid of the resulting
- * mess of board dependend #ifdef'ed code we now make the whole
- * initialization sequence configurable to the user.
- *
- * The requirements for any new initalization function is simple: it
- * receives a pointer to the "global data" structure as it's only
- * argument, and returns an integer return code, where 0 means
- * "continue" and != 0 means "fatal error, hang the system".
- */
-typedef int (init_fnc_t)(void);
-
-init_fnc_t *init_sequence[] = {
-       board_early_init_f,
-       timer_init,
-       env_init,               /* initialize environment */
-       init_baudrate,          /* initialize baudrate settings */
-       serial_init,            /* serial communications setup */
-       console_init_f,
-       display_banner,         /* say that we are here */
-       checkboard,
-       init_func_ram,
-       NULL,
-};
-
-
-void board_init_f(ulong bootflag)
-{
-       gd_t gd_data, *id;
-       bd_t *bd;
-       init_fnc_t **init_fnc_ptr;
-       ulong addr, addr_sp, len;
-       ulong *s;
-
-       /* Pointer is writable since we allocated a register for it.
-        */
-       gd = &gd_data;
-       /* compiler optimization barrier needed for GCC >= 3.4 */
-       __asm__ __volatile__("" : : : "memory");
-
-       memset((void *)gd, 0, sizeof(gd_t));
-
-       for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
-               if ((*init_fnc_ptr)() != 0)
-                       hang();
-       }
-
-       /*
-        * Now that we have DRAM mapped and working, we can
-        * relocate the code and continue running from DRAM.
-        */
-       addr = CONFIG_SYS_SDRAM_BASE + gd->ram_size;
-
-       /* We can reserve some RAM "on top" here.
-        */
-
-       /* round down to next 4 kB limit.
-        */
-       addr &= ~(4096 - 1);
-       debug("Top of RAM usable for U-Boot at: %08lx\n", addr);
-
-       /* Reserve memory for U-Boot code, data & bss
-        * round down to next 16 kB limit
-        */
-       len = bss_end() - CONFIG_SYS_MONITOR_BASE;
-       addr -= len;
-       addr &= ~(16 * 1024 - 1);
-
-       debug("Reserving %ldk for U-Boot at: %08lx\n", len >> 10, addr);
-
-        /* Reserve memory for malloc() arena.
-        */
-       addr_sp = addr - TOTAL_MALLOC_LEN;
-       debug("Reserving %dk for malloc() at: %08lx\n",
-                       TOTAL_MALLOC_LEN >> 10, addr_sp);
-
-       /*
-        * (permanently) allocate a Board Info struct
-        * and a permanent copy of the "global" data
-        */
-       addr_sp -= sizeof(bd_t);
-       bd = (bd_t *)addr_sp;
-       gd->bd = bd;
-       debug("Reserving %zu Bytes for Board Info at: %08lx\n",
-                       sizeof(bd_t), addr_sp);
-
-       addr_sp -= sizeof(gd_t);
-       id = (gd_t *)addr_sp;
-       debug("Reserving %zu Bytes for Global Data at: %08lx\n",
-                       sizeof(gd_t), addr_sp);
-
-       /* Reserve memory for boot params.
-        */
-       addr_sp -= CONFIG_SYS_BOOTPARAMS_LEN;
-       bd->bi_boot_params = addr_sp;
-       debug("Reserving %dk for boot params() at: %08lx\n",
-                       CONFIG_SYS_BOOTPARAMS_LEN >> 10, addr_sp);
-
-       /*
-        * Finally, we set up a new (bigger) stack.
-        *
-        * Leave some safety gap for SP, force alignment on 16 byte boundary
-        * Clear initial stack frame
-        */
-       addr_sp -= 16;
-       addr_sp &= ~0xF;
-       s = (ulong *)addr_sp;
-       *s-- = 0;
-       *s-- = 0;
-       addr_sp = (ulong)s;
-       debug("Stack Pointer at: %08lx\n", addr_sp);
-
-       /*
-        * Save local variables to board info struct
-        */
-       bd->bi_memstart = CONFIG_SYS_SDRAM_BASE;        /* start of DRAM */
-       bd->bi_memsize  = gd->ram_size;         /* size of DRAM in bytes */
-
-       memcpy(id, (void *)gd, sizeof(gd_t));
-
-       relocate_code(addr_sp, id, addr);
-
-       /* NOTREACHED - relocate_code() does not return */
-}
-
-/*
- * This is the next part if the initialization sequence: we are now
- * running from RAM and have a "normal" C environment, i. e. global
- * data can be written, BSS has been cleared, the stack size in not
- * that critical any more, etc.
- */
-
-void board_init_r(gd_t *id, ulong dest_addr)
-{
-#ifndef CONFIG_SYS_NO_FLASH
-       ulong size;
-#endif
-       bd_t *bd;
-
-       gd = id;
-       gd->flags |= GD_FLG_RELOC;      /* tell others: relocation done */
-
-       debug("Now running in RAM - U-Boot at: %08lx\n", dest_addr);
-
-       gd->reloc_off = dest_addr - CONFIG_SYS_MONITOR_BASE;
-
-       monitor_flash_len = image_copy_end() - dest_addr;
-
-       serial_initialize();
-
-       bd = gd->bd;
-
-       /* The Malloc area is immediately below the monitor copy in DRAM */
-       mem_malloc_init(CONFIG_SYS_MONITOR_BASE + gd->reloc_off -
-                       TOTAL_MALLOC_LEN, TOTAL_MALLOC_LEN);
-
-#ifndef CONFIG_SYS_NO_FLASH
-       /* configure available FLASH banks */
-       size = flash_init();
-       display_flash_config(size);
-       bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;
-       bd->bi_flashsize = size;
-
-#if CONFIG_SYS_MONITOR_BASE == CONFIG_SYS_FLASH_BASE
-       bd->bi_flashoffset = monitor_flash_len; /* reserved area for U-Boot */
-#else
-       bd->bi_flashoffset = 0;
-#endif
-#else
-       bd->bi_flashstart = 0;
-       bd->bi_flashsize = 0;
-       bd->bi_flashoffset = 0;
-#endif
-
-#ifdef CONFIG_CMD_NAND
-       puts("NAND:  ");
-       nand_init();            /* go init the NAND */
-#endif
-
-#if defined(CONFIG_CMD_ONENAND)
-       onenand_init();
-#endif
-
-       /* relocate environment function pointers etc. */
-       env_relocate();
-
-#if defined(CONFIG_PCI)
-       /*
-        * Do pci configuration
-        */
-       pci_init();
-#endif
-
-/** leave this here (after malloc(), environment and PCI are working) **/
-       /* Initialize stdio devices */
-       stdio_init();
-
-       jumptable_init();
-
-       /* Initialize the console (after the relocation and devices init) */
-       console_init_r();
-/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/
-
-       /* Initialize from environment */
-       load_addr = getenv_ulong("loadaddr", 16, load_addr);
-
-#ifdef CONFIG_CMD_SPI
-       puts("SPI:   ");
-       spi_init();             /* go init the SPI */
-       puts("ready\n");
-#endif
-
-#if defined(CONFIG_MISC_INIT_R)
-       /* miscellaneous platform dependent initialisations */
-       misc_init_r();
-#endif
-
-#ifdef CONFIG_BITBANGMII
-       bb_miiphy_init();
-#endif
-#if defined(CONFIG_CMD_NET)
-       puts("Net:   ");
-       eth_initialize(gd->bd);
-#endif
-
-       /* main_loop() can return to retry autoboot, if so just run it again. */
-       for (;;)
-               main_loop();
-
-       /* NOTREACHED - no way out of command loop except booting */
-}
index 71bb0d2a199b28512828640352ec547b67cf6ff9..e0722d20d1e876122939117163071e4ecd525b26 100644 (file)
@@ -6,10 +6,7 @@
  */
 
 #include <common.h>
-#include <command.h>
 #include <image.h>
-#include <u-boot/zlib.h>
-#include <asm/byteorder.h>
 #include <asm/addrspace.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -52,6 +49,20 @@ void arch_lmb_reserve(struct lmb *lmb)
        lmb_reserve(lmb, sp, CONFIG_SYS_SDRAM_BASE + gd->ram_size - sp);
 }
 
+static int boot_setup_linux(bootm_headers_t *images)
+{
+       int ret;
+       ulong rd_len;
+
+       rd_len = images->rd_end - images->rd_start;
+       ret = boot_ramdisk_high(&images->lmb, images->rd_start,
+               rd_len, &images->initrd_start, &images->initrd_end);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
 static void linux_cmdline_init(void)
 {
        linux_argc = 1;
@@ -224,6 +235,8 @@ static void boot_jump_linux(bootm_headers_t *images)
 int do_bootm_linux(int flag, int argc, char * const argv[],
                        bootm_headers_t *images)
 {
+       int ret;
+
        /* No need for those on MIPS */
        if (flag & BOOTM_STATE_OS_BD_T)
                return -1;
@@ -243,6 +256,10 @@ int do_bootm_linux(int flag, int argc, char * const argv[],
                return 0;
        }
 
+       ret = boot_setup_linux(images);
+       if (ret)
+               return ret;
+
        boot_cmdline_linux(images);
        boot_prep_linux(images);
        boot_jump_linux(images);
index 75c2c065c891e42028d0ce6fea80785f6e28b6d4..c24221499bfb6cd47f272cd5e71839d7296cf4ea 100644 (file)
@@ -1,9 +1,16 @@
 menu "NAND Device Support"
 
+config SYS_NAND_SELF_INIT
+       bool
+       help
+         This option, if enabled, provides more flexible and linux-like
+         NAND initialization process.
+
 if !SPL_BUILD
 
 config NAND_DENALI
        bool "Support Denali NAND controller"
+       select SYS_NAND_SELF_INIT
        help
          Enable support for the Denali NAND controller.
 
index 308b7845f122e49b47ba46bc178824a746a9abfd..9e0429aa198949903a6ddc0dbb32fa4e2125a247 100644 (file)
@@ -44,7 +44,7 @@ static int onfi_timing_mode = NAND_DEFAULT_TIMINGS;
  * this macro allows us to convert from an MTD structure to our own
  * device context (denali) structure.
  */
-#define mtd_to_denali(m) (((struct nand_chip *)mtd->priv)->priv)
+#define mtd_to_denali(m) container_of(m->priv, struct denali_nand_info, nand)
 
 /* These constants are defined by the driver to enable common driver
  * configuration options. */
@@ -1144,70 +1144,128 @@ static void denali_hw_init(struct denali_nand_info *denali)
 
 static struct nand_ecclayout nand_oob;
 
-static int denali_nand_init(struct nand_chip *nand)
+static int denali_init(struct denali_nand_info *denali)
 {
-       struct denali_nand_info *denali;
+       int ret;
 
-       denali = malloc(sizeof(*denali));
-       if (!denali)
-               return -ENOMEM;
+       denali_hw_init(denali);
 
-       nand->priv = denali;
+       denali->mtd->name = "denali-nand";
+       denali->mtd->owner = THIS_MODULE;
+       denali->mtd->priv = &denali->nand;
 
-       denali->flash_reg = (void  __iomem *)CONFIG_SYS_NAND_REGS_BASE;
-       denali->flash_mem = (void  __iomem *)CONFIG_SYS_NAND_DATA_BASE;
+       /* register the driver with the NAND core subsystem */
+       denali->nand.select_chip = denali_select_chip;
+       denali->nand.cmdfunc = denali_cmdfunc;
+       denali->nand.read_byte = denali_read_byte;
+       denali->nand.read_buf = denali_read_buf;
+       denali->nand.waitfunc = denali_waitfunc;
+
+       /*
+        * scan for NAND devices attached to the controller
+        * this is the first stage in a two step process to register
+        * with the nand subsystem
+        */
+       if (nand_scan_ident(denali->mtd, denali->max_banks, NULL)) {
+               ret = -ENXIO;
+               goto fail;
+       }
 
 #ifdef CONFIG_SYS_NAND_USE_FLASH_BBT
        /* check whether flash got BBT table (located at end of flash). As we
         * use NAND_BBT_NO_OOB, the BBT page will start with
         * bbt_pattern. We will have mirror pattern too */
-       nand->bbt_options |= NAND_BBT_USE_FLASH;
+       denali->nand.bbt_options |= NAND_BBT_USE_FLASH;
        /*
         * We are using main + spare with ECC support. As BBT need ECC support,
         * we need to ensure BBT code don't write to OOB for the BBT pattern.
         * All BBT info will be stored into data area with ECC support.
         */
-       nand->bbt_options |= NAND_BBT_NO_OOB;
+       denali->nand.bbt_options |= NAND_BBT_NO_OOB;
 #endif
 
-       nand->ecc.mode = NAND_ECC_HW;
-       nand->ecc.size = CONFIG_NAND_DENALI_ECC_SIZE;
-       nand->ecc.read_oob = denali_read_oob;
-       nand->ecc.write_oob = denali_write_oob;
-       nand->ecc.read_page = denali_read_page;
-       nand->ecc.read_page_raw = denali_read_page_raw;
-       nand->ecc.write_page = denali_write_page;
-       nand->ecc.write_page_raw = denali_write_page_raw;
+       denali->nand.ecc.mode = NAND_ECC_HW;
+       denali->nand.ecc.size = CONFIG_NAND_DENALI_ECC_SIZE;
+
        /*
         * Tell driver the ecc strength. This register may be already set
         * correctly. So we read this value out.
         */
-       nand->ecc.strength = readl(denali->flash_reg + ECC_CORRECTION);
-       switch (nand->ecc.size) {
+       denali->nand.ecc.strength = readl(denali->flash_reg + ECC_CORRECTION);
+       switch (denali->nand.ecc.size) {
        case 512:
-               nand->ecc.bytes = (nand->ecc.strength * 13 + 15) / 16 * 2;
+               denali->nand.ecc.bytes =
+                       (denali->nand.ecc.strength * 13 + 15) / 16 * 2;
                break;
        case 1024:
-               nand->ecc.bytes = (nand->ecc.strength * 14 + 15) / 16 * 2;
+               denali->nand.ecc.bytes =
+                       (denali->nand.ecc.strength * 14 + 15) / 16 * 2;
                break;
        default:
                pr_err("Unsupported ECC size\n");
-               return -EINVAL;
+               ret = -EINVAL;
+               goto fail;
        }
-       nand_oob.eccbytes = nand->ecc.bytes;
-       nand->ecc.layout = &nand_oob;
-
-       /* Set address of hardware control function */
-       nand->cmdfunc = denali_cmdfunc;
-       nand->read_byte = denali_read_byte;
-       nand->read_buf = denali_read_buf;
-       nand->select_chip = denali_select_chip;
-       nand->waitfunc = denali_waitfunc;
-       denali_hw_init(denali);
-       return 0;
+       nand_oob.eccbytes = denali->nand.ecc.bytes;
+       denali->nand.ecc.layout = &nand_oob;
+
+       writel(denali->mtd->erasesize / denali->mtd->writesize,
+              denali->flash_reg + PAGES_PER_BLOCK);
+       writel(denali->nand.options & NAND_BUSWIDTH_16 ? 1 : 0,
+              denali->flash_reg + DEVICE_WIDTH);
+       writel(denali->mtd->writesize,
+              denali->flash_reg + DEVICE_MAIN_AREA_SIZE);
+       writel(denali->mtd->oobsize,
+              denali->flash_reg + DEVICE_SPARE_AREA_SIZE);
+       if (readl(denali->flash_reg + DEVICES_CONNECTED) == 0)
+               writel(1, denali->flash_reg + DEVICES_CONNECTED);
+
+       /* override the default operations */
+       denali->nand.ecc.read_page = denali_read_page;
+       denali->nand.ecc.read_page_raw = denali_read_page_raw;
+       denali->nand.ecc.write_page = denali_write_page;
+       denali->nand.ecc.write_page_raw = denali_write_page_raw;
+       denali->nand.ecc.read_oob = denali_read_oob;
+       denali->nand.ecc.write_oob = denali_write_oob;
+
+       if (nand_scan_tail(denali->mtd)) {
+               ret = -ENXIO;
+               goto fail;
+       }
+
+       ret = nand_register(0);
+
+fail:
+       return ret;
+}
+
+static int __board_nand_init(void)
+{
+       struct denali_nand_info *denali;
+
+       denali = kzalloc(sizeof(*denali), GFP_KERNEL);
+       if (!denali)
+               return -ENOMEM;
+
+       /*
+        * If CONFIG_SYS_NAND_SELF_INIT is defined, each driver is responsible
+        * for instantiating struct nand_chip, while drivers/mtd/nand/nand.c
+        * still provides a "struct mtd_info nand_info" instance.
+        */
+       denali->mtd = &nand_info[0];
+
+       /*
+        * In the future, these base addresses should be taken from
+        * Device Tree or platform data.
+        */
+       denali->flash_reg = (void  __iomem *)CONFIG_SYS_NAND_REGS_BASE;
+       denali->flash_mem = (void  __iomem *)CONFIG_SYS_NAND_DATA_BASE;
+
+       return denali_init(denali);
 }
 
-int board_nand_init(struct nand_chip *chip)
+void board_nand_init(void)
 {
-       return denali_nand_init(chip);
+       if (__board_nand_init() < 0)
+               pr_warn("Failed to initialize Denali NAND controller.\n");
 }
index 3277da71e1bb0645fde46c9488a07ec9b8bdaec2..a258df00fda2d0f4a5126adbfbcadc9987a4048a 100644 (file)
@@ -434,9 +434,8 @@ struct nand_buf {
 #define DT             3
 
 struct denali_nand_info {
-       struct mtd_info mtd;
-       struct nand_chip *nand;
-
+       struct mtd_info *mtd;
+       struct nand_chip nand;
        int flash_bank; /* currently selected chip */
        int status;
        int platform;
index 0b6e7ee385c8da9bc5e5ad1f08c5e274e73edd15..70e780c3113a6049cfd5fac686bbfdd140b4050a 100644 (file)
@@ -634,6 +634,11 @@ static int nand_block_checkbad(struct mtd_info *mtd, loff_t ofs, int getchip,
 {
        struct nand_chip *chip = mtd->priv;
 
+       if (!(chip->options & NAND_BBT_SCANNED)) {
+               chip->scan_bbt(mtd);
+               chip->options |= NAND_BBT_SCANNED;
+       }
+
        if (!chip->bbt)
                return chip->block_bad(mtd, ofs, getchip);
 
@@ -4322,10 +4327,9 @@ int nand_scan_tail(struct mtd_info *mtd)
 
        /* Check, if we should skip the bad block table scan */
        if (chip->options & NAND_SKIP_BBTSCAN)
-               return 0;
+               chip->options |= NAND_BBT_SCANNED;
 
-       /* Build bad block table */
-       return chip->scan_bbt(mtd);
+       return 0;
 }
 EXPORT_SYMBOL(nand_scan_tail);
 
index db87d07269b0bbe46911144f03edb101e95aded1..b3a2a60bb268f26740b60fc968af6870405e2ceb 100644 (file)
@@ -38,10 +38,10 @@ static void nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
 }
 #endif
 
-static void s3c2410_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
+static void s3c24x0_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
 {
        struct nand_chip *chip = mtd->priv;
-       struct s3c2410_nand *nand = s3c2410_get_base_nand();
+       struct s3c24x0_nand *nand = s3c24x0_get_base_nand();
 
        debug("hwcontrol(): 0x%02x 0x%02x\n", cmd, ctrl);
 
@@ -67,35 +67,35 @@ static void s3c2410_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
                writeb(cmd, chip->IO_ADDR_W);
 }
 
-static int s3c2410_dev_ready(struct mtd_info *mtd)
+static int s3c24x0_dev_ready(struct mtd_info *mtd)
 {
-       struct s3c2410_nand *nand = s3c2410_get_base_nand();
+       struct s3c24x0_nand *nand = s3c24x0_get_base_nand();
        debug("dev_ready\n");
        return readl(&nand->nfstat) & 0x01;
 }
 
 #ifdef CONFIG_S3C2410_NAND_HWECC
-void s3c2410_nand_enable_hwecc(struct mtd_info *mtd, int mode)
+void s3c24x0_nand_enable_hwecc(struct mtd_info *mtd, int mode)
 {
-       struct s3c2410_nand *nand = s3c2410_get_base_nand();
-       debug("s3c2410_nand_enable_hwecc(%p, %d)\n", mtd, mode);
+       struct s3c24x0_nand *nand = s3c24x0_get_base_nand();
+       debug("s3c24x0_nand_enable_hwecc(%p, %d)\n", mtd, mode);
        writel(readl(&nand->nfconf) | S3C2410_NFCONF_INITECC, &nand->nfconf);
 }
 
-static int s3c2410_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
+static int s3c24x0_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
                                      u_char *ecc_code)
 {
-       struct s3c2410_nand *nand = s3c2410_get_base_nand();
+       struct s3c24x0_nand *nand = s3c24x0_get_base_nand();
        ecc_code[0] = readb(&nand->nfecc);
        ecc_code[1] = readb(&nand->nfecc + 1);
        ecc_code[2] = readb(&nand->nfecc + 2);
-       debug("s3c2410_nand_calculate_hwecc(%p,): 0x%02x 0x%02x 0x%02x\n",
-              mtd , ecc_code[0], ecc_code[1], ecc_code[2]);
+       debug("s3c24x0_nand_calculate_hwecc(%p,): 0x%02x 0x%02x 0x%02x\n",
+             mtd , ecc_code[0], ecc_code[1], ecc_code[2]);
 
        return 0;
 }
 
-static int s3c2410_nand_correct_data(struct mtd_info *mtd, u_char *dat,
+static int s3c24x0_nand_correct_data(struct mtd_info *mtd, u_char *dat,
                                     u_char *read_ecc, u_char *calc_ecc)
 {
        if (read_ecc[0] == calc_ecc[0] &&
@@ -103,7 +103,7 @@ static int s3c2410_nand_correct_data(struct mtd_info *mtd, u_char *dat,
            read_ecc[2] == calc_ecc[2])
                return 0;
 
-       printf("s3c2410_nand_correct_data: not implemented\n");
+       printf("s3c24x0_nand_correct_data: not implemented\n");
        return -1;
 }
 #endif
@@ -113,7 +113,7 @@ int board_nand_init(struct nand_chip *nand)
        u_int32_t cfg;
        u_int8_t tacls, twrph0, twrph1;
        struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
-       struct s3c2410_nand *nand_reg = s3c2410_get_base_nand();
+       struct s3c24x0_nand *nand_reg = s3c24x0_get_base_nand();
 
        debug("board_nand_init()\n");
 
@@ -149,14 +149,14 @@ int board_nand_init(struct nand_chip *nand)
 #endif
 
        /* hwcontrol always must be implemented */
-       nand->cmd_ctrl = s3c2410_hwcontrol;
+       nand->cmd_ctrl = s3c24x0_hwcontrol;
 
-       nand->dev_ready = s3c2410_dev_ready;
+       nand->dev_ready = s3c24x0_dev_ready;
 
 #ifdef CONFIG_S3C2410_NAND_HWECC
-       nand->ecc.hwctl = s3c2410_nand_enable_hwecc;
-       nand->ecc.calculate = s3c2410_nand_calculate_ecc;
-       nand->ecc.correct = s3c2410_nand_correct_data;
+       nand->ecc.hwctl = s3c24x0_nand_enable_hwecc;
+       nand->ecc.calculate = s3c24x0_nand_calculate_ecc;
+       nand->ecc.correct = s3c24x0_nand_correct_data;
        nand->ecc.mode = NAND_ECC_HW;
        nand->ecc.size = CONFIG_SYS_NAND_ECCSIZE;
        nand->ecc.bytes = CONFIG_SYS_NAND_ECCBYTES;
index 7feb3a7b1e78c30251c3df480fbaf164ba9732e8..928d58b3a732894bcf7fe143da3ef821d6caf0bb 100644 (file)
@@ -611,6 +611,9 @@ static int vf610_nfc_nand_init(int devnum, void __iomem *addr)
                vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_16BIT);
        }
 
+       /* Disable subpage writes as we do not provide ecc->hwctl */
+       chip->options |= NAND_NO_SUBPAGE_WRITE;
+
        chip->dev_ready = vf610_nfc_dev_ready;
        chip->cmdfunc = vf610_nfc_command;
        chip->read_byte = vf610_nfc_read_byte;
index e0bf3dc61e6c0260e61a9cf01132f9e92decee05..8a7447dcd3d73d773b86921b691a76a18b540c32 100644 (file)
@@ -15,6 +15,9 @@
 #define CONFIG_DBAU1X00                1
 #define CONFIG_SOC_AU1X00      1  /* alchemy series cpu */
 
+#define CONFIG_SYS_GENERIC_BOARD
+#define CONFIG_DISPLAY_BOARDINFO
+
 #ifdef CONFIG_DBAU1000
 /* Also known as Merlot */
 #define CONFIG_SOC_AU1000      1
index 1c04a58e9fed7428afaa517c89dc5d68c4c39c08..61e6af384d4b21d5a957aa668d0bceed05566eef 100644 (file)
@@ -15,6 +15,9 @@
 #define CONFIG_PB1X00          1
 #define CONFIG_SOC_AU1X00      1  /* alchemy series cpu */
 
+#define CONFIG_SYS_GENERIC_BOARD
+#define CONFIG_DISPLAY_BOARDINFO
+
 #ifdef CONFIG_PB1000
 #define CONFIG_SOC_AU1000      1
 #else
index 98ed8bc97f12c30ef146ee2895ff3503e7e0a324..1548d3e682d99bdb64a59d3b2475468e7ef69a0e 100644 (file)
@@ -13,6 +13,9 @@
 #define __CONFIG_H
 
 #define CONFIG_QEMU_MIPS
+
+#define CONFIG_SYS_GENERIC_BOARD
+#define CONFIG_DISPLAY_BOARDINFO
 #define CONFIG_MISC_INIT_R
 
 #define CONFIG_BOOTDELAY       10      /* autoboot after 10 seconds */
index e8f5a4c9e8bdb21c48df7e7c0828b881ef81e87e..61cafadd7cf47872cbdc026c861109ff43a6d558 100644 (file)
@@ -13,6 +13,9 @@
 #define __CONFIG_H
 
 #define CONFIG_QEMU_MIPS
+
+#define CONFIG_SYS_GENERIC_BOARD
+#define CONFIG_DISPLAY_BOARDINFO
 #define CONFIG_MISC_INIT_R
 
 #define CONFIG_BOOTDELAY       10      /* autoboot after 10 seconds */
index 217ba2fbd9b22bfb68433fce18578b959ad7d246..83e4163e3f897e802443416ed8e9b155dd101178 100644 (file)
@@ -25,6 +25,9 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
+#define CONFIG_SYS_GENERIC_BOARD
+#define CONFIG_DISPLAY_BOARDINFO
+
 #define CPU_CLOCK_RATE                 324000000 /* Clock for the MIPS core */
 #define CONFIG_SYS_MIPS_TIMER_FREQ     (CPU_CLOCK_RATE / 2)