From 90f3db27b159237b0597cd6275a1f111cc4bf065 Mon Sep 17 00:00:00 2001
From: Gabor Juhos <juhosg@openwrt.org>
Date: Mon, 25 Jun 2007 11:12:51 +0000
Subject: [PATCH] from now on, the kernel parses parameters passed by our
 lzma-loader

SVN-Revision: 7730
---
 .../files/arch/mips/adm5120/adm5120_info.c    | 201 +++++++++++++++---
 .../files/arch/mips/adm5120/prom.c            |  28 +--
 .../files/arch/mips/pci/fixup-adm5120.c       |  26 +--
 .../adm5120-2.6/patches/001-adm5120.patch     |  29 ++-
 4 files changed, 218 insertions(+), 66 deletions(-)

diff --git a/target/linux/adm5120-2.6/files/arch/mips/adm5120/adm5120_info.c b/target/linux/adm5120-2.6/files/arch/mips/adm5120/adm5120_info.c
index 570244b24d..87e3d865a5 100644
--- a/target/linux/adm5120-2.6/files/arch/mips/adm5120/adm5120_info.c
+++ b/target/linux/adm5120-2.6/files/arch/mips/adm5120/adm5120_info.c
@@ -27,6 +27,7 @@
 #include <asm/mach-adm5120/routerboot.h>
 #include <asm/mach-adm5120/zynos.h>
 
+extern char *prom_getenv(char *envname);
 /*
  * Globals
  */
@@ -53,6 +54,63 @@ static char *boot_loader_names[BOOT_LOADER_LAST+1] = {
 };
 
 static struct adm5120_board __initdata adm5120_boards[] = {
+	/* FIXME: some boards have invalid fields */
+	{
+		.name		= "Cellvision CAS-630/630W",
+		.mach_type	= MACH_ADM5120_CAS630,
+		.has_usb	= 0,
+		.iface_num	= 1,
+		.flash0_size	= 4*1024*1024,
+	},
+	{
+		.name		= "Cellvision CAS-670/670W",
+		.mach_type	= MACH_ADM5120_CAS670,
+		.has_usb	= 0,
+		.iface_num	= 1,
+		.flash0_size	= 4*1024*1024,
+	},
+	{
+		.name		= "Cellvision CAS-700/700W",
+		.mach_type	= MACH_ADM5120_CAS700,
+		.has_usb	= 0,
+		.iface_num	= 1,
+		.flash0_size	= 4*1024*1024,
+	},
+	{
+		.name		= "Cellvision CAS-771/771W",
+		.mach_type	= MACH_ADM5120_CAS771,
+		.has_usb	= 0,
+		.iface_num	= 5,
+		.flash0_size	= 4*1024*1024,
+	},
+	{
+		.name		= "Cellvision CAS-790",
+		.mach_type	= MACH_ADM5120_CAS790,
+		.has_usb	= 0,
+		.iface_num	= 1,
+		.flash0_size	= 4*1024*1024,
+	},
+	{
+		.name		= "Cellvision CAS-861/861W",
+		.mach_type	= MACH_ADM5120_CAS861,
+		.has_usb	= 0,
+		.iface_num	= 1,
+		.flash0_size	= 4*1024*1024,
+	},
+	{
+		.name		= "Cellvision NFS-101U/101WU",
+		.mach_type	= MACH_ADM5120_NFS101U,
+		.has_usb	= 0,
+		.iface_num	= 1,
+		.flash0_size	= 4*1024*1024,
+	},
+	{
+		.name		= "Cellvision NFS-202U/202WU",
+		.mach_type	= MACH_ADM5120_NFS202U,
+		.has_usb	= 0,
+		.iface_num	= 1,
+		.flash0_size	= 4*1024*1024,
+	},
 	{
 		.name		= "Compex NetPassage 27G",
 		.mach_type	= MACH_ADM5120_NP27G,
@@ -116,6 +174,41 @@ static struct adm5120_board __initdata adm5120_boards[] = {
 		.iface_num	= 2,
 		.flash0_size	= 4*1024*1024,
 	},
+	{
+		.name		= "Edimax BR-6104K",
+		.mach_type	= MACH_ADM5120_BR6104K,
+		.has_usb	= 0,
+		.iface_num	= 5,
+		.flash0_size	= 2*1024*1024,
+	},
+	{
+		.name		= "Infineon EASY 5120",
+		.mach_type	= MACH_ADM5120_EASY5120,
+		.has_usb	= 0,
+		.iface_num	= 0,
+		.flash0_size	= 2*1024*1024,
+	},
+	{
+		.name		= "Infineon EASY 5120-RT",
+		.mach_type	= MACH_ADM5120_EASY5120RT,
+		.has_usb	= 0,
+		.iface_num	= 0,
+		.flash0_size	= 2*1024*1024,
+	},
+	{
+		.name		= "Infineon EASY 5120P-ATA",
+		.mach_type	= MACH_ADM5120_EASY5120PATA,
+		.has_usb	= 0,
+		.iface_num	= 0,
+		.flash0_size	= 2*1024*1024,
+	},
+	{
+		.name		= "Infineon EASY 83000",
+		.mach_type	= MACH_ADM5120_EASY83000,
+		.has_usb	= 0,
+		.iface_num	= 0,
+		.flash0_size	= 4*1024*1024,
+	},
 	{
 		.name		= "RouterBOARD 111",
 		.mach_type	= MACH_ADM5120_RB_111,
@@ -158,6 +251,20 @@ static struct adm5120_board __initdata adm5120_boards[] = {
 		.iface_num	= 5,
 		.flash0_size	= 128*1024,
 	},
+	{
+		.name		= "ZyXEL ES-2024A",
+		.mach_type	= MACH_ADM5120_ES2024A,
+		.has_usb	= 0,
+		.iface_num	= 0,
+		.flash0_size	= 4*1024*1024,
+	},
+	{
+		.name		= "ZyXEL ES-2024PWR",
+		.mach_type	= MACH_ADM5120_ES2024PWR,
+		.has_usb	= 0,
+		.iface_num	= 0,
+		.flash0_size	= 4*1024*1024,
+	},
 	{
 		.name		= "ZyXEL ES-2108",
 		.mach_type	= MACH_ADM5120_ES2108,
@@ -187,7 +294,7 @@ static struct adm5120_board __initdata adm5120_boards[] = {
 		.flash0_size	= 4*1024*1024,
 	},
 	{
-		.name		= "ZyXEL ES-2108PWR",
+		.name		= "ZyXEL ES-2108-PWR",
 		.mach_type	= MACH_ADM5120_ES2108PWR,
 		.has_usb	= 0,
 		.iface_num	= 0,
@@ -288,7 +395,7 @@ struct mylo_board {
 
 #define COMPEX_BOARD(d,mt) MYLO_BOARD(VENID_COMPEX,(d),VENID_COMPEX,(d),(mt))
 
-static struct mylo_board  __initdata mylo_boards[] = {
+static struct mylo_board mylo_boards[] __initdata = {
 	COMPEX_BOARD(DEVID_COMPEX_NP27G, MACH_ADM5120_NP27G),
 	COMPEX_BOARD(DEVID_COMPEX_NP28G, MACH_ADM5120_NP28G),
 	COMPEX_BOARD(DEVID_COMPEX_NP28GHS, MACH_ADM5120_NP28GHS),
@@ -308,7 +415,7 @@ struct routerboard {
 };
 
 #define ROUTERBOARD(n, mt) { .name = (n), .mach_type = (mt) }
-static struct routerboard  __initdata routerboards[] = {
+static struct routerboard routerboards[] __initdata = {
 	ROUTERBOARD("111", MACH_ADM5120_RB_111),
 	ROUTERBOARD("112", MACH_ADM5120_RB_112),
 	ROUTERBOARD("133", MACH_ADM5120_RB_133),
@@ -331,7 +438,7 @@ struct zynos_board {
 #define DLINK_BOARD(bi, mt) ZYNOS_BOARD(ZYNOS_VENDOR_ID_DLINK, bi, mt)
 #define LUCENT_BOARD(bi, mt) ZYNOS_BOARD(ZYNOS_VENDOR_ID_LUCENT, bi, mt)
 
-static struct zynos_board __initdata zynos_boards[] = {
+static struct zynos_board zynos_boards[] __initdata = {
 	ZYXEL_BOARD(ZYNOS_BOARD_HS100, MACH_ADM5120_HS100),
 	ZYXEL_BOARD(ZYNOS_BOARD_P334, MACH_ADM5120_P334),
 	ZYXEL_BOARD(ZYNOS_BOARD_P334U, MACH_ADM5120_P334U),
@@ -345,6 +452,31 @@ static struct zynos_board __initdata zynos_boards[] = {
 	DUMMY_BOARD()
 };
 
+struct common_board {
+	char *name;
+	unsigned long	mach_type;
+};
+
+#define DEFBOARD(n, mt) { .name = (n), .mach_type = (mt) }
+static struct common_board common_boards[] __initdata = {
+	DEFBOARD("CAS-630",		MACH_ADM5120_CAS630),
+	DEFBOARD("CAS-670",		MACH_ADM5120_CAS670),
+	DEFBOARD("CAS-700",		MACH_ADM5120_CAS700),
+	DEFBOARD("CAS-771",		MACH_ADM5120_CAS771),
+	DEFBOARD("CAS-790",		MACH_ADM5120_CAS790),
+	DEFBOARD("CAS-861",		MACH_ADM5120_CAS861),
+	DEFBOARD("NFS-101U",		MACH_ADM5120_NFS101U),
+	DEFBOARD("NFS-202U",		MACH_ADM5120_NFS202U),
+	DEFBOARD("EASY 5120",		MACH_ADM5120_EASY5120),
+	DEFBOARD("EASY 5120-RT",	MACH_ADM5120_EASY5120RT),
+	DEFBOARD("EASY 5120P-ATA",	MACH_ADM5120_EASY5120PATA),
+	DEFBOARD("EASY 83000",		MACH_ADM5120_EASY83000),
+	DEFBOARD("BR-6104K",		MACH_ADM5120_BR6104K),
+	DEFBOARD("WP54G-WRT",		MACH_ADM5120_WP54G_WRT),
+	DEFBOARD("P-334WT",		MACH_ADM5120_P334WT),
+	DEFBOARD("P-335",		MACH_ADM5120_P335),
+};
+
 /*
  * Helper routines
  */
@@ -694,6 +826,34 @@ static unsigned long __init uboot_detect_board(void)
 	return MACH_ADM5120_UNKNOWN;
 }
 
+/*
+ * Misc boards
+ */
+static unsigned long __init prom_detect_board(void)
+{
+	char *name;
+	unsigned long ret;
+	int i;
+
+	ret = MACH_ADM5120_UNKNOWN;
+	name = prom_getenv("board_name");
+	if (name == NULL)
+		goto out;
+
+	if (*name == '\0')
+		goto out;
+
+	for (i=0; i<ARRAY_SIZE(common_boards); i++) {
+		if (strcmp(common_boards[i].name, name) == 0) {
+			ret = common_boards[i].mach_type;
+			break;
+		}
+	}
+
+out:
+	return ret;
+}
+
 static void __init adm5120_detect_board(void)
 {
 	struct adm5120_board *board;
@@ -719,6 +879,8 @@ static void __init adm5120_detect_board(void)
 		adm5120_boot_loader = BOOT_LOADER_UBOOT;
 		if (t == MACH_ADM5120_UNKNOWN)
 			t = uboot_detect_board();
+	} else {
+		t = prom_detect_board();
 	}
 
 	for (board = adm5120_boards; board->mach_type != MACH_ADM5120_UNKNOWN;
@@ -793,7 +955,7 @@ static void __init adm5120_detect_memsize(void)
 		break;
 	}
 
-	/* FIXME: need to disable buffers for both SDRAM bank? */
+	/* FIXME: need to disable buffers for both SDRAM banks? */
 
 	mem_dbg("checking for %ldMB chip\n",maxsize >> 20);
 
@@ -887,33 +1049,15 @@ out:
 void __init adm5120_info_show(void)
 {
 	/* FIXME: move this somewhere else */
-	printk("ADM%04X%s revision %d, running at %ldMHz\n",
+	printk(KERN_INFO "ADM%04X%s revision %d, running at %ldMHz\n",
 		adm5120_product_code,
 		(adm5120_package == ADM5120_PACKAGE_BGA) ? "" : "P",
 		adm5120_revision, (adm5120_speed / 1000000)
 		);
-	printk("Boot loader is: %s\n", boot_loader_names[adm5120_boot_loader]);
-	printk("Booted from   : %s flash\n", adm5120_nand_boot ? "NAND":"NOR");
-	printk("Board is      : %s\n", adm5120_board_name());
-	printk("Memory size   : %ldMB\n", adm5120_memsize >> 20);
-}
-
-void __init adm5120_swab_test(void)
-{
-#if CONFIG_ADM5120_HARDWARE_SWAB
-	u32	t1,t2;
-
-	t1 = 0x1234;
-	t2 = __arch__swab16(t1);
-	printk("hardware swab16 test %s, data:0x%04X, result:0x%04X\n",
-		(t2 == 0x3412) ? "passed" :"failed", t1, t2);
-
-	t1 = 0x12345678;
-	t2 = __arch__swab32(t1);
-	printk("hardware swab32 test %s, data:0x%08X, result:0x%08X\n",
-		(t2 == 0x78563412) ? "passed" :"failed", t1, t2);
-
-#endif /* CONFIG_ADM5120_HARDWARE_SWAB */
+	printk(KERN_INFO "Boot loader is: %s\n", boot_loader_names[adm5120_boot_loader]);
+	printk(KERN_INFO "Booted from   : %s flash\n", adm5120_nand_boot ? "NAND":"NOR");
+	printk(KERN_INFO "Board is      : %s\n", adm5120_board_name());
+	printk(KERN_INFO "Memory size   : %ldMB\n", adm5120_memsize >> 20);
 }
 
 void __init adm5120_info_init(void)
@@ -924,5 +1068,4 @@ void __init adm5120_info_init(void)
 	adm5120_detect_board();
 
 	adm5120_info_show();
-	adm5120_swab_test();
 }
diff --git a/target/linux/adm5120-2.6/files/arch/mips/adm5120/prom.c b/target/linux/adm5120-2.6/files/arch/mips/adm5120/prom.c
index 1cbbbc2de5..a288b073ca 100644
--- a/target/linux/adm5120-2.6/files/arch/mips/adm5120/prom.c
+++ b/target/linux/adm5120-2.6/files/arch/mips/adm5120/prom.c
@@ -32,13 +32,12 @@
 
 #include <asm/mach-adm5120/adm5120_info.h>
 
+static char **prom_envp;
+
 void setup_prom_printf(int);
 void prom_printf(char *, ...);
 void prom_meminit(void);
 
-#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
@@ -81,25 +80,24 @@ 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.
@@ -108,6 +106,8 @@ void __init prom_init(void)
 {
 	char *cmd;
 
+	prom_envp = (char **)fw_arg2;
+
 	adm5120_info_init();
 
 	/* you should these macros defined in include/asm/bootinfo.h */
diff --git a/target/linux/adm5120-2.6/files/arch/mips/pci/fixup-adm5120.c b/target/linux/adm5120-2.6/files/arch/mips/pci/fixup-adm5120.c
index e8389152b5..9326077caf 100644
--- a/target/linux/adm5120-2.6/files/arch/mips/pci/fixup-adm5120.c
+++ b/target/linux/adm5120-2.6/files/arch/mips/pci/fixup-adm5120.c
@@ -88,13 +88,13 @@ int __init pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
 	int nr_irqs;
 	int i;
 	int irq;
-	
+
 	irq = -1;
 	if (slot < 1 || slot > 3) {
 		printk("PCI: slot number %u is not supported\n", slot);
 		goto out;
 	}
-	
+
 	GETMAP(default);
 
 	switch (mips_machtype) {
@@ -112,16 +112,10 @@ int __init pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
 	case MACH_ADM5120_P334WT:
 		/* using default mapping */
 		break;
-#if 0
 	case MACH_ADM5120_CAS771:
-		GETMAP(cas771)
+		GETMAP(cas771);
 		break;
-	case MACH_ADM5120_CAS630:
-	case MACH_ADM5120_CAS670:
-	case MACH_ADM5120_CAS700:
-	case MACH_ADM5120_CAS790:
-	case MACH_ADM5120_CAS861:
-#endif
+
 	case MACH_ADM5120_NP27G:
 	case MACH_ADM5120_NP28GHS:
 	case MACH_ADM5120_WP54AG:
@@ -134,21 +128,21 @@ int __init pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
 			adm5120_board_name());
 		break;
 	}
-	
+
 	for (i=0; i<nr_irqs; i++, p++) {
-		if ((p->slot == slot) && (PCI_FUNC(dev->devfn) == p->func) && 
+		if ((p->slot == slot) && (PCI_FUNC(dev->devfn) == p->func) &&
 		    (p->pin == pin)) {
 			irq = p->irq;
 			break;
 		}
 	}
-	
+
 	if (irq < 0) {
 		printk(KERN_INFO "PCI: no irq found for %s pin:%u\n",
 			pci_name(dev), pin);
 	} else {
 		printk(KERN_INFO "PCI: mapping irq for %s pin:%u, irq:%d\n",
-			pci_name(dev), pin, irq);		
+			pci_name(dev), pin, irq);
 	}
 
 out:
@@ -161,7 +155,7 @@ static void adm5120_pci_fixup(struct pci_dev *dev)
 		return;
 
 	/* setup COMMAND register */
-	pci_write_config_word(dev, PCI_COMMAND, 
+	pci_write_config_word(dev, PCI_COMMAND,
 		(PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER));
 
 	/* setup CACHE_LINE_SIZE register */
@@ -172,7 +166,7 @@ static void adm5120_pci_fixup(struct pci_dev *dev)
 	pci_write_config_dword(dev, PCI_BASE_ADDRESS_1, 0);
 }
 
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ADMTEK, PCI_DEVICE_ID_ADMTEK_ADM5120, 
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ADMTEK, PCI_DEVICE_ID_ADMTEK_ADM5120,
 	adm5120_pci_fixup);
 
 int pcibios_plat_dev_init(struct pci_dev *dev)
diff --git a/target/linux/adm5120-2.6/patches/001-adm5120.patch b/target/linux/adm5120-2.6/patches/001-adm5120.patch
index c14dde345a..c1b2688d5a 100644
--- a/target/linux/adm5120-2.6/patches/001-adm5120.patch
+++ b/target/linux/adm5120-2.6/patches/001-adm5120.patch
@@ -5,7 +5,7 @@ Index: linux-2.6.21.1/arch/mips/Kconfig
 @@ -16,6 +16,17 @@ choice
  	prompt "System type"
  	default SGI_IP22
- 
+
 +config MIPS_ADM5120
 +	bool "Support for ADM5120 SoC"
 +	select SYS_HAS_CPU_MIPS32_R1
@@ -21,9 +21,9 @@ Index: linux-2.6.21.1/arch/mips/Kconfig
  	bool "4G Systems MTX-1 board"
  	select DMA_NONCOHERENT
 @@ -766,6 +775,7 @@
- 
+
  endchoice
- 
+
 +source "arch/mips/adm5120/Kconfig"
  source "arch/mips/ddb5xxx/Kconfig"
  source "arch/mips/gt64120/ev64120/Kconfig"
@@ -34,7 +34,7 @@ Index: linux-2.6.21.1/arch/mips/Makefile
 +++ linux-2.6.21.1/arch/mips/Makefile
 @@ -165,6 +165,14 @@ cflags-$(CONFIG_MACH_JAZZ)	+= -Iinclude/
  load-$(CONFIG_MACH_JAZZ)	+= 0xffffffff80080000
- 
+
  #
 +# ADMtek 5120
 +#
@@ -51,10 +51,10 @@ Index: linux-2.6.21.1/include/asm-mips/bootinfo.h
 ===================================================================
 --- linux-2.6.21.1.orig/include/asm-mips/bootinfo.h
 +++ linux-2.6.21.1/include/asm-mips/bootinfo.h
-@@ -213,6 +213,42 @@
+@@ -213,6 +213,57 @@
  #define MACH_GROUP_NEC_EMMA2RH 25	/* NEC EMMA2RH (was 23)		*/
  #define  MACH_NEC_MARKEINS	0	/* NEC EMMA2RH Mark-eins	*/
- 
+
 +/*
 + * Valid machtype for group ADMtek ADM5120
 + */
@@ -90,7 +90,22 @@ Index: linux-2.6.21.1/include/asm-mips/bootinfo.h
 +#define MACH_ADM5120_ES2108G	28	/* ZyXEL Ethernet Switch 2108-G */
 +#define MACH_ADM5120_ES2108LC	29	/* ZyXEL Ethernet Switch 2108-LC */
 +#define MACH_ADM5120_ES2108PWR	30	/* ZyXEL Ethernet Switch 2108-PWR */
++#define MACH_ADM5120_ES2024A	31	/* ZyXEL Ethernet Switch 2024A */
++#define MACH_ADM5120_ES2024PWR	32	/* ZyXEL Ethernet Switch 2024PWR */
++#define MACH_ADM5120_CAS630	33	/* Cellvision CAS-630/630W */
++#define MACH_ADM5120_CAS670	34	/* Cellvision CAS-670/670W */
++#define MACH_ADM5120_CAS700	36	/* Cellvision CAS-700/700W */
++#define MACH_ADM5120_CAS771	37	/* Cellvision CAS-771/771W */
++#define MACH_ADM5120_CAS790	38	/* Cellvision CAS-790 */
++#define MACH_ADM5120_CAS861	39	/* Cellvision CAS-861/861W */
++#define MACH_ADM5120_NFS101U	40	/* Cellvision NFS-101U/101WU */
++#define MACH_ADM5120_NFS202U	41	/* Cellvision NFS-202U/202WU */
++#define MACH_ADM5120_EASY5120	43	/* Infineon EASY 5120 */
++#define MACH_ADM5120_EASY5120RT 44	/* Infineon EASY 5120-RT */
++#define MACH_ADM5120_EASY5120PATA 45	/* Infineon EASY 5120P-ATA */
++#define MACH_ADM5120_EASY83000	46	/* Infineon EASY-83000 */
++#define MACH_ADM5120_BR6104K	47	/* Edimax BR-6104K */
 +
  #define CL_SIZE			COMMAND_LINE_SIZE
- 
+
  const char *get_system_type(void);
-- 
2.30.2