Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2b0d8c25 authored by Jeremy Kerr's avatar Jeremy Kerr Committed by Russell King
Browse files

ARM: 5880/1: arm: use generic infrastructure for early params



The ARM setup code includes its own parser for early params, there's
also one in the generic init code.

This patch removes __early_init (and related code) from
arch/arm/kernel/setup.c, and changes users to the generic early_init
macro instead.

The generic macro takes a char * argument, rather than char **, so we
need to update the parser functions a little.

Signed-off-by: default avatarJeremy Kerr <jeremy.kerr@canonical.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent e119bfff
Loading
Loading
Loading
Loading
+0 −12
Original line number Diff line number Diff line
@@ -223,18 +223,6 @@ extern struct meminfo meminfo;
#define bank_phys_end(bank)	((bank)->start + (bank)->size)
#define bank_phys_size(bank)	(bank)->size

/*
 * Early command line parameters.
 */
struct early_params {
	const char *arg;
	void (*fn)(char **p);
};

#define __early_param(name,fn)					\
static struct early_params __early_##fn __used			\
__attribute__((__section__(".early_param.init"))) = { name, fn }

#endif  /*  __KERNEL__  */

#endif
+16 −46
Original line number Diff line number Diff line
@@ -418,10 +418,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
@@ -434,52 +435,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)
@@ -740,9 +704,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 command_line too for later use, preserving boot_command_line */
	strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
	*cmdline_p = command_line;

	parse_early_param();

	paging_init(mdesc);
	request_standard_resources(&meminfo, mdesc);

+0 −4
Original line number Diff line number Diff line
@@ -43,10 +43,6 @@ SECTIONS

		INIT_SETUP(16)

		__early_begin = .;
			*(.early_param.init)
		__early_end = .;

		INIT_CALLS
		CON_INITCALL
		SECURITY_INITCALL
+4 −3
Original line number Diff line number Diff line
@@ -32,12 +32,13 @@ unsigned int mem_fclk_21285 = 50000000;

EXPORT_SYMBOL(mem_fclk_21285);

static void __init early_fclk(char **arg)
static int __init early_fclk(char *arg)
{
	mem_fclk_21285 = simple_strtoul(*arg, arg, 0);
	mem_fclk_21285 = simple_strtoul(arg, NULL, 0);
	return 0;
}

__early_param("mem_fclk_21285=", early_fclk);
early_param("mem_fclk_21285", early_fclk);

static int __init parse_tag_memclk(const struct tag *tag)
{
+7 −5
Original line number Diff line number Diff line
@@ -32,19 +32,21 @@
static unsigned long phys_initrd_start __initdata = 0;
static unsigned long phys_initrd_size __initdata = 0;

static void __init early_initrd(char **p)
static int __init early_initrd(char *p)
{
	unsigned long start, size;
	char *endp;

	start = memparse(*p, p);
	if (**p == ',') {
		size = memparse((*p) + 1, p);
	start = memparse(p, &endp);
	if (*endp == ',') {
		size = memparse(endp + 1, NULL);

		phys_initrd_start = start;
		phys_initrd_size = size;
	}
	return 0;
}
__early_param("initrd=", early_initrd);
early_param("initrd", early_initrd);

static int __init parse_tag_initrd(const struct tag *tag)
{
Loading