diff --git a/arch/mips/lib/bootm.c b/arch/mips/lib/bootm.c
index 9930abf..608c1a7 100644
--- a/arch/mips/lib/bootm.c
+++ b/arch/mips/lib/bootm.c
@@ -33,22 +33,23 @@
 #define	LINUX_MAX_ENVS		256
 #define	LINUX_MAX_ARGS		256
 
-static int	linux_argc;
-static char **	linux_argv;
+static int linux_argc;
+static char **linux_argv;
 
-static char **	linux_env;
-static char *	linux_env_p;
-static int	linux_env_idx;
+static char **linux_env;
+static char *linux_env_p;
+static int linux_env_idx;
 
-static void linux_params_init (ulong start, char * commandline);
-static void linux_env_set (char * env_name, char * env_val);
+static void linux_params_init(ulong start, char *commandline);
+static void linux_env_set(char *env_name, char *env_val);
 
-int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *images)
+int do_bootm_linux(int flag, int argc, char * const argv[],
+			bootm_headers_t *images)
 {
-	void	(*theKernel) (int, char **, char **, int *);
-	char	*commandline = getenv ("bootargs");
-	char	env_buf[12];
-	char	*cp;
+	void (*theKernel) (int, char **, char **, int *);
+	char *commandline = getenv("bootargs");
+	char env_buf[12];
+	char *cp;
 
 	if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
 		return 1;
@@ -59,53 +60,53 @@
 	bootstage_mark(BOOTSTAGE_ID_RUN_OS);
 
 #ifdef DEBUG
-	printf ("## Transferring control to Linux (at address %08lx) ...\n",
+	printf("## Transferring control to Linux (at address %08lx) ...\n",
 		(ulong) theKernel);
 #endif
 
-	linux_params_init (UNCACHED_SDRAM (gd->bd->bi_boot_params), commandline);
+	linux_params_init(UNCACHED_SDRAM(gd->bd->bi_boot_params), commandline);
 
 #ifdef CONFIG_MEMSIZE_IN_BYTES
-	sprintf (env_buf, "%lu", (ulong)gd->ram_size);
-	debug ("## Giving linux memsize in bytes, %lu\n", (ulong)gd->ram_size);
+	sprintf(env_buf, "%lu", (ulong)gd->ram_size);
+	debug("## Giving linux memsize in bytes, %lu\n", (ulong)gd->ram_size);
 #else
-	sprintf (env_buf, "%lu", (ulong)(gd->ram_size >> 20));
-	debug ("## Giving linux memsize in MB, %lu\n", (ulong)(gd->ram_size >> 20));
+	sprintf(env_buf, "%lu", (ulong)(gd->ram_size >> 20));
+	debug("## Giving linux memsize in MB, %lu\n",
+		(ulong)(gd->ram_size >> 20));
 #endif /* CONFIG_MEMSIZE_IN_BYTES */
 
-	linux_env_set ("memsize", env_buf);
+	linux_env_set("memsize", env_buf);
 
-	sprintf (env_buf, "0x%08X", (uint) UNCACHED_SDRAM (images->rd_start));
-	linux_env_set ("initrd_start", env_buf);
+	sprintf(env_buf, "0x%08X", (uint) UNCACHED_SDRAM(images->rd_start));
+	linux_env_set("initrd_start", env_buf);
 
-	sprintf (env_buf, "0x%X", (uint) (images->rd_end - images->rd_start));
-	linux_env_set ("initrd_size", env_buf);
+	sprintf(env_buf, "0x%X", (uint) (images->rd_end - images->rd_start));
+	linux_env_set("initrd_size", env_buf);
 
-	sprintf (env_buf, "0x%08X", (uint) (gd->bd->bi_flashstart));
-	linux_env_set ("flash_start", env_buf);
+	sprintf(env_buf, "0x%08X", (uint) (gd->bd->bi_flashstart));
+	linux_env_set("flash_start", env_buf);
 
-	sprintf (env_buf, "0x%X", (uint) (gd->bd->bi_flashsize));
-	linux_env_set ("flash_size", env_buf);
+	sprintf(env_buf, "0x%X", (uint) (gd->bd->bi_flashsize));
+	linux_env_set("flash_size", env_buf);
 
 	cp = getenv("ethaddr");
-	if (cp != NULL) {
+	if (cp)
 		linux_env_set("ethaddr", cp);
-	}
 
 	cp = getenv("eth1addr");
-	if (cp != NULL) {
+	if (cp)
 		linux_env_set("eth1addr", cp);
-	}
 
 	/* we assume that the kernel is in place */
-	printf ("\nStarting kernel ...\n\n");
+	printf("\nStarting kernel ...\n\n");
 
-	theKernel (linux_argc, linux_argv, linux_env, 0);
+	theKernel(linux_argc, linux_argv, linux_env, 0);
+
 	/* does not return */
 	return 1;
 }
 
-static void linux_params_init (ulong start, char *line)
+static void linux_params_init(ulong start, char *line)
 {
 	char *next, *quote, *argp;
 
@@ -117,26 +118,25 @@
 	next = line;
 
 	while (line && *line && linux_argc < LINUX_MAX_ARGS) {
-		quote = strchr (line, '"');
-		next = strchr (line, ' ');
+		quote = strchr(line, '"');
+		next = strchr(line, ' ');
 
-		while (next != NULL && quote != NULL && quote < next) {
+		while (next && quote && quote < next) {
 			/* we found a left quote before the next blank
 			 * now we have to find the matching right quote
 			 */
-			next = strchr (quote + 1, '"');
-			if (next != NULL) {
-				quote = strchr (next + 1, '"');
-				next = strchr (next + 1, ' ');
+			next = strchr(quote + 1, '"');
+			if (next) {
+				quote = strchr(next + 1, '"');
+				next = strchr(next + 1, ' ');
 			}
 		}
 
-		if (next == NULL) {
-			next = line + strlen (line);
-		}
+		if (!next)
+			next = line + strlen(line);
 
 		linux_argv[linux_argc] = argp;
-		memcpy (argp, line, next - line);
+		memcpy(argp, line, next - line);
 		argp[next - line] = 0;
 
 		argp += next - line + 1;
@@ -154,19 +154,19 @@
 	linux_env_idx = 0;
 }
 
-static void linux_env_set (char *env_name, char *env_val)
+static void linux_env_set(char *env_name, char *env_val)
 {
 	if (linux_env_idx < LINUX_MAX_ENVS - 1) {
 		linux_env[linux_env_idx] = linux_env_p;
 
-		strcpy (linux_env_p, env_name);
-		linux_env_p += strlen (env_name);
+		strcpy(linux_env_p, env_name);
+		linux_env_p += strlen(env_name);
 
-		strcpy (linux_env_p, "=");
+		strcpy(linux_env_p, "=");
 		linux_env_p += 1;
 
-		strcpy (linux_env_p, env_val);
-		linux_env_p += strlen (env_val);
+		strcpy(linux_env_p, env_val);
+		linux_env_p += strlen(env_val);
 
 		linux_env_p++;
 		linux_env[++linux_env_idx] = 0;
