diff options
Diffstat (limited to 'arch/arm/kernel/setup.c')
| -rw-r--r-- | arch/arm/kernel/setup.c | 80 | 
1 files changed, 32 insertions, 48 deletions
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index c6c57b640b6..c91c77b54de 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -24,6 +24,7 @@  #include <linux/interrupt.h>  #include <linux/smp.h>  #include <linux/fs.h> +#include <linux/proc_fs.h>  #include <asm/unified.h>  #include <asm/cpu.h> @@ -102,6 +103,7 @@ struct cpu_cache_fns cpu_cache;  #endif  #ifdef CONFIG_OUTER_CACHE  struct outer_cache_fns outer_cache; +EXPORT_SYMBOL(outer_cache);  #endif  struct stack { @@ -117,7 +119,7 @@ EXPORT_SYMBOL(elf_platform);  static const char *cpu_name;  static const char *machine_name; -static char __initdata command_line[COMMAND_LINE_SIZE]; +static char __initdata cmd_line[COMMAND_LINE_SIZE];  static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;  static union { char c[4]; unsigned long l; } endian_test __initdata = { { 'l', '?', '?', 'b' } }; @@ -417,10 +419,11 @@ static int __init arm_add_memory(unsigned long start, unsigned long size)   * Pick out the memory size.  We look for mem=size@start,   * where start and size are "size[KkMm]"   */ -static void __init early_mem(char **p) +static int __init early_mem(char *p)  {  	static int usermem __initdata = 0;  	unsigned long size, start; +	char *endp;  	/*  	 * If the user specifies memory size, we @@ -433,52 +436,15 @@ static void __init early_mem(char **p)  	}  	start = PHYS_OFFSET; -	size  = memparse(*p, p); -	if (**p == '@') -		start = memparse(*p + 1, p); +	size  = memparse(p, &endp); +	if (*endp == '@') +		start = memparse(endp + 1, NULL);  	arm_add_memory(start, size); -} -__early_param("mem=", early_mem); - -/* - * Initial parsing of the command line. - */ -static void __init parse_cmdline(char **cmdline_p, char *from) -{ -	char c = ' ', *to = command_line; -	int len = 0; - -	for (;;) { -		if (c == ' ') { -			extern struct early_params __early_begin, __early_end; -			struct early_params *p; -			for (p = &__early_begin; p < &__early_end; p++) { -				int arglen = strlen(p->arg); - -				if (memcmp(from, p->arg, arglen) == 0) { -					if (to != command_line) -						to -= 1; -					from += arglen; -					p->fn(&from); - -					while (*from != ' ' && *from != '\0') -						from++; -					break; -				} -			} -		} -		c = *from++; -		if (!c) -			break; -		if (COMMAND_LINE_SIZE <= ++len) -			break; -		*to++ = c; -	} -	*to = '\0'; -	*cmdline_p = command_line; +	return 0;  } +early_param("mem", early_mem);  static void __init  setup_ramdisk(int doload, int prompt, int image_start, unsigned int rd_sz) @@ -739,9 +705,15 @@ void __init setup_arch(char **cmdline_p)  	init_mm.end_data   = (unsigned long) _edata;  	init_mm.brk	   = (unsigned long) _end; -	memcpy(boot_command_line, from, COMMAND_LINE_SIZE); -	boot_command_line[COMMAND_LINE_SIZE-1] = '\0'; -	parse_cmdline(cmdline_p, from); +	/* parse_early_param needs a boot_command_line */ +	strlcpy(boot_command_line, from, COMMAND_LINE_SIZE); + +	/* populate cmd_line too for later use, preserving boot_command_line */ +	strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE); +	*cmdline_p = cmd_line; + +	parse_early_param(); +  	paging_init(mdesc);  	request_standard_resources(&meminfo, mdesc); @@ -782,9 +754,21 @@ static int __init topology_init(void)  	return 0;  } -  subsys_initcall(topology_init); +#ifdef CONFIG_HAVE_PROC_CPU +static int __init proc_cpu_init(void) +{ +	struct proc_dir_entry *res; + +	res = proc_mkdir("cpu", NULL); +	if (!res) +		return -ENOMEM; +	return 0; +} +fs_initcall(proc_cpu_init); +#endif +  static const char *hwcap_str[] = {  	"swp",  	"half",  |