add new switch configuration api
[openwrt/staging/wigyori.git] / target / linux / rb532 / files / arch / mips / rb500 / prom.c
index e6ac24344eacad05a5dd1a38301532e129929995..b10172fb5126683e6e0367576c382cfeae554d02 100644 (file)
@@ -1,5 +1,5 @@
 /*
-* prom.c 
+* prom.c
 **********************************************************************
 * P . Sadik Oct 10, 2003
 *
@@ -42,12 +42,9 @@ extern void __init setup_serial_port(void);
 
 unsigned int idt_cpu_freq = 132000000;
 EXPORT_SYMBOL(idt_cpu_freq);
-char *board_type;
-EXPORT_SYMBOL(board_type);
 unsigned int gpio_bootup_state = 0;
 EXPORT_SYMBOL(gpio_bootup_state);
 
-
 char mips_mac_address[18] = "08:00:06:05:40:01";
 EXPORT_SYMBOL(mips_mac_address);
 
@@ -67,9 +64,6 @@ EXPORT_SYMBOL(soft_reboot);
 extern int remote_debug;
 #endif
 
-extern unsigned long mips_machgroup;
-extern unsigned long mips_machtype;
-
 #define FREQ_TAG   "HZ="
 #define GPIO_TAG   "gpio="
 #define KMAC_TAG   "kmac="
@@ -78,6 +72,9 @@ extern unsigned long mips_machtype;
 #define IGNORE_CMDLINE_MEM 1
 #define DEBUG_DDR
 
+#define BOARD_RB532    "500"
+#define BOARD_RB532A   "500r5"
+
 void parse_soft_settings(unsigned *ptr, unsigned size);
 void parse_hard_settings(unsigned *ptr, unsigned size);
 
@@ -87,7 +84,7 @@ void __init prom_init(void)
 {
        DDR_t ddr = (DDR_t) DDR_VirtualAddress; /* define the pointer to the DDR registers */
        phys_t memsize = 0-ddr->ddrmask;
-       
+
        /* this should be the very first message, even before serial is properly initialized */
        prom_setup_cmdline();
        setup_serial_port();
@@ -103,9 +100,20 @@ void __init prom_init(void)
        add_memory_region(ddr->ddrbase + 0x400, memsize - 0x600, BOOT_MEM_RAM);
 }
 
-void prom_free_prom_memory(void)
+void __init prom_free_prom_memory(void)
 {
-       /* FIXME: STUB */
+       /* No prom memory to free */
+}
+
+static inline int match_tag(char *arg, const char *tag)
+{
+       return (strncmp(arg, tag, strlen(tag)) == 0);
+}
+
+static inline unsigned long tag2ul(char *arg, const char *tag)
+{
+       char *num = arg+strlen(tag);
+       return simple_strtoul(num, 0, 10);
 }
 
 extern char _image_cmdline;
@@ -115,31 +123,36 @@ void __init prom_setup_cmdline(void){
        int prom_argc;
        char **prom_argv, **prom_envp;
        int i;
-       
+
        prom_argc = fw_arg0;
        prom_argv = (char **) fw_arg1;
        prom_envp = (char **) fw_arg2;
-       
+
        cp=cmd_line;
                /* Note: it is common that parameters start at argv[1] and not argv[0],
                however, our elf loader starts at [0] */
        for(i=0;i<prom_argc;i++){
-               if (strncmp(prom_argv[i], FREQ_TAG, sizeof(FREQ_TAG) - 1) == 0) {
-                       idt_cpu_freq = simple_strtoul(prom_argv[i] + sizeof(FREQ_TAG) - 1, 0, 10);
+               if (match_tag(prom_argv[i], FREQ_TAG)) {
+                       idt_cpu_freq = tag2ul(prom_argv[i], FREQ_TAG);
                        continue;
                }
 #ifdef IGNORE_CMDLINE_MEM
                /* parses out the "mem=xx" arg */
-               if (strncmp(prom_argv[i], MEM_TAG, sizeof(MEM_TAG) - 1) == 0) {
+               if (match_tag(prom_argv[i], MEM_TAG)) {
                        continue;
                }
 #endif
                if (i>0) *(cp++) = ' ';
-               if (strncmp(prom_argv[i], BOARD_TAG, sizeof(BOARD_TAG) - 1) == 0) {
-                       strcpy(board_type, prom_argv[i] + sizeof(BOARD_TAG) -1);
+               if (match_tag(prom_argv[i], BOARD_TAG)) {
+                       char *board = prom_argv[i] + strlen(BOARD_TAG);
+                       if (match_tag(board, BOARD_RB532A))
+                               mips_machtype = MACH_MIKROTIK_RB532A;
+                       else
+                               mips_machtype = MACH_MIKROTIK_RB532;
                }
-               if (strncmp(prom_argv[i], GPIO_TAG, sizeof(GPIO_TAG) - 1) == 0) {
-                       gpio_bootup_state =  simple_strtoul(prom_argv[i] + sizeof(GPIO_TAG) - 1, 0, 10);
+
+               if (match_tag(prom_argv[i], GPIO_TAG)) {
+                       gpio_bootup_state = tag2ul(prom_argv[i], GPIO_TAG);
                }
                strcpy(cp,prom_argv[i]);
                cp+=strlen(prom_argv[i]);
@@ -147,7 +160,7 @@ void __init prom_setup_cmdline(void){
        *(cp++) = ' ';
        strcpy(cp,(&_image_cmdline + 8));
        cp += strlen(&_image_cmdline);
-       
+
        i=strlen(arcs_cmdline);
        if (i>0){
                *(cp++) = ' ';
@@ -159,7 +172,7 @@ void __init prom_setup_cmdline(void){
        else
                strcpy(cp,GPIO_INIT_BUTTON);
        cmd_line[CL_SIZE-1] = '\0';
-       
+
        strcpy(arcs_cmdline,cmd_line);
 }