#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
+#include <asm/bootinfo.h>
+
#include <asm/rc32434/rc32434.h>
#include <asm/rc32434/dma.h>
#include <asm/rc32434/dma_v.h>
static void __init rb500_nand_setup(void)
{
- if (!strcmp(board_type, "500r5"))
+ switch (mips_machtype) {
+ case MACH_MIKROTIK_RB532A:
changeLatchU5(LO_FOFF | LO_CEX, LO_ULED | LO_ALE | LO_CLE | LO_WPX);
- else
+ break;
+ default:
changeLatchU5(LO_WPX | LO_FOFF | LO_CEX, LO_ULED | LO_ALE | LO_CLE);
+ break;
+ }
/* Setup NAND specific settings */
rb500_nand_data.chip.nr_chips = 1;
/* Read the NAND resources from the device controller */
nand_slot0_res[0].start = readl(CFG_DC_DEV2 + CFG_DC_DEVBASE);
nand_slot0_res[0].end = nand_slot0_res[0].start + 0x1000;
-
+
/* Initialise the NAND device */
rb500_nand_setup();
/*
-* prom.c
+* prom.c
**********************************************************************
* P . Sadik Oct 10, 2003
*
unsigned int idt_cpu_freq = 132000000;
EXPORT_SYMBOL(idt_cpu_freq);
-char board_type[11];
-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);
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="
#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);
{
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();
/* 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;
void __init prom_setup_cmdline(void){
char cmd_line[CL_SIZE];
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]);
*(cp++) = ' ';
strcpy(cp,(&_image_cmdline + 8));
cp += strlen(&_image_cmdline);
-
+
i=strlen(arcs_cmdline);
if (i>0){
*(cp++) = ' ';
else
strcpy(cp,GPIO_INIT_BUTTON);
cmd_line[CL_SIZE-1] = '\0';
-
+
strcpy(arcs_cmdline,cmd_line);
}