[adm5120] calling of prom_detect_board is needed only when we still don't know the...
[openwrt/svn-archive/archive.git] / target / linux / adm5120-2.6 / files / arch / mips / adm5120 / prom.c
index 4c207655962514f4d0d4a3069898c410aa409d17..c2e1dcbae1e43d8804db939f187a7ca46f598b1f 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
  * Copyright (C) 2003 ADMtek Incorporated.
  *     daniell@admtek.com.tw
+ * Copyright (C) 2007 OpenWrt.org
  *
  *  This program is free software; you can distribute it and/or modify it
  *  under the terms of the GNU General Public License (Version 2) as
 #include <asm/bootinfo.h>
 #include <asm/addrspace.h>
 
-/* boot loaders specific definitions */
-#define CFE_EPTSEAL 0x43464531 /* CFE1 is the magic number to recognize CFE from other bootloaders */
-#define CFE 1
-#define UBOOT 2
-#define MYLOADER 3
-#define UNKNOWN 0
+#include <asm/mach-adm5120/adm5120_info.h>
+
+static char **prom_envp = NULL;
 
 void setup_prom_printf(int);
 void prom_printf(char *, ...);
 void prom_meminit(void);
 
-/* we assume we don't know the boot loader by default */
-int boot_loader_type = UNKNOWN;
-
-#define ADM5120_ENVC           1
-
-char *adm5120_envp[2*ADM5120_ENVC] = {"memsize","0x001000000"};
 
 #define READCSR(r)      *(volatile unsigned long *)(0xB2600000+(r))
 #define WRITECSR(r,v)   *(volatile unsigned long *)(0xB2600000+(r)) = v
@@ -88,60 +80,46 @@ void prom_printf(char *fmt, ...)
 
 char *prom_getenv(char *envname)
 {
-       int i, index=0;
+       char **env;
+       char *ret;
 
-       i = strlen(envname);
+       ret = NULL;
 
-       printk(KERN_INFO "GETENV: envname is %s\n", envname);
+       if (prom_envp== NULL)
+               return NULL;
 
-       while(index < (2*ADM5120_ENVC)) {
-               if(strncmp(envname, adm5120_envp[index], i) == 0) {
-                       printk(KERN_INFO "GETENV: returning %s\n", adm5120_envp[index+1]);
-                       return(adm5120_envp[index+1]);
+       for (env = prom_envp; *env != NULL; env++) {
+               if (strcmp(envname, *env++) == 0) {
+                       ret = *env;
+                       break;
                }
-               index += 2;
        }
 
-       printk(KERN_INFO "GETENV: not found.\n");
-       return(NULL);
+       return ret;
 }
-       
+
+extern char _image_cmdline;
 /*
  * initialize the prom module.
  */
 void __init prom_init(void)
 {
+       char *cmd;
+
+       if ((fw_arg2 & 3) == 0) {
+               prom_envp = (char **)fw_arg2;
+       }
+
+       adm5120_info_init();
+
        /* you should these macros defined in include/asm/bootinfo.h */
-       mips_machgroup = MACH_GROUP_ADM_GW;
-       mips_machtype = MACH_ADM_GW_5120;
+       mips_machgroup = MACH_GROUP_ADM5120;
+       mips_machtype = adm5120_board.mach_type;
 
        /* init command line, register a default kernel command line */
-       strcpy(&(arcs_cmdline[0]), "console=ttyS0,115200 rootfstype=squashfs,jffs2 init=/etc/preinit");
-
-       /* check for CFE by finding the CFE magic number */
-       int *prom_vec = (int *) fw_arg3;
-       int argc = fw_arg0;
-       unsigned int cfe_eptseal;
-
-       if (argc < 0)
-               cfe_eptseal = (uint32_t)(unsigned long)prom_vec;
-       else {
-               if ((int32_t)(long)prom_vec < 0)
-                        /*
-                         * Old loaders all it gives us is the handle,
-                         * so assume the seal.
-                         */
-                       cfe_eptseal = CFE_EPTSEAL;
-               else
-                       /*
-                        * Newer loaders bundle the handle/ept/eptseal
-                        */
-                       cfe_eptseal = (unsigned int)((uint32_t *)prom_vec)[3];
-       }
-       if (cfe_eptseal == CFE_EPTSEAL) {
-               boot_loader_type = CFE;
-               printk("adm5120 : CFE boot loader\n");
-       }
+       cmd = &_image_cmdline + 8;
+       if( strlen(cmd) > 0) strcpy( &(arcs_cmdline[0]), cmd);
+               else strcpy(&(arcs_cmdline[0]), CONFIG_CMDLINE);
 
        /* init memory map */
        prom_meminit();