diff options
| author | juhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2007-06-25 11:12:51 +0000 | 
|---|---|---|
| committer | juhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2007-06-25 11:12:51 +0000 | 
| commit | bc03d2d1845271b9732a1add2955946a95d48d61 (patch) | |
| tree | 03b97b89749f77099b8c2cda13ff38cf32aaf4db /target/linux/adm5120-2.6/files/arch | |
| parent | 90dc2376551b65223e2b7a69bf1d4a12dc3a9924 (diff) | |
[adm5120]: from now on, the kernel parses parameters passed by our lzma-loader
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@7730 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/adm5120-2.6/files/arch')
3 files changed, 196 insertions, 59 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 570244b24..87e3d865a 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, @@ -117,6 +175,41 @@ static struct adm5120_board __initdata adm5120_boards[] = {  		.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,  		.has_usb	= 0, @@ -159,6 +252,20 @@ static struct adm5120_board __initdata adm5120_boards[] = {  		.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,  		.has_usb	= 0, @@ -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 1cbbbc2de..a288b073c 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 e8389152b..9326077ca 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) | 
