diff --git a/common/cmd_fpga.c b/common/cmd_fpga.c
index 41ed459..e674ef4 100644
--- a/common/cmd_fpga.c
+++ b/common/cmd_fpga.c
@@ -45,8 +45,8 @@
 #if defined (CONFIG_FPGA) && ( CONFIG_COMMANDS & CFG_CMD_FPGA )
 
 /* Local functions */
-static void fpga_usage ( cmd_tbl_t *cmdtp );
-static int fpga_get_op( char *opstr );
+static void fpga_usage (cmd_tbl_t * cmdtp);
+static int fpga_get_op (char *opstr);
 
 /* Local defines */
 #define FPGA_NONE   -1
@@ -62,106 +62,106 @@
  * If there is no data addr field, the fpgadata environment variable is used.
  * The info command requires no data address field.
  */
-int
-do_fpga (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+int do_fpga (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 {
-    int op, dev = FPGA_INVALID_DEVICE;
-    size_t data_size = 0;
-    void *fpga_data = NULL;
-    char *devstr = getenv("fpga");
-    char *datastr = getenv("fpgadata");
-    int rc = FPGA_FAIL;
+	int op, dev = FPGA_INVALID_DEVICE;
+	size_t data_size = 0;
+	void *fpga_data = NULL;
+	char *devstr = getenv ("fpga");
+	char *datastr = getenv ("fpgadata");
+	int rc = FPGA_FAIL;
 
-	if ( devstr ) dev = (int)simple_strtoul( devstr, NULL, 16 );
-	if ( datastr ) fpga_data = (void *)simple_strtoul( datastr, NULL, 16 );
+	if (devstr)
+		dev = (int) simple_strtoul (devstr, NULL, 16);
+	if (datastr)
+		fpga_data = (void *) simple_strtoul (datastr, NULL, 16);
 
-    switch ( argc )
-    {
-	    case 5: /* fpga <op> <dev> <data> <datasize> */
-		    data_size = simple_strtoul( argv[4], NULL, 16 );
-	    case 4: /* fpga <op> <dev> <data> */
-		    fpga_data = (void *)simple_strtoul( argv[3], NULL, 16 );
-			PRINTF(__FUNCTION__": fpga_data = 0x%x\n", (uint)fpga_data );
-	    case 3: /* fpga <op> <dev | data addr> */
-		    dev = (int)simple_strtoul( argv[2], NULL, 16 );
-			PRINTF(__FUNCTION__": device = %d\n", dev );
-			/* FIXME - this is a really weak test */
-		    if (( argc == 3 ) && ( dev > fpga_count() )) { /* must be buffer ptr */
-				PRINTF(__FUNCTION__": Assuming buffer pointer in arg 3\n");
-			    fpga_data = (void *)dev;
-				PRINTF(__FUNCTION__": fpga_data = 0x%x\n", (uint)fpga_data );
-			    dev = FPGA_INVALID_DEVICE;  /* reset device num */
-		    }
-	    case 2: /* fpga <op> */
-		    op = (int)fpga_get_op( argv[1] );
-		    break;
-	    default:
-			PRINTF(__FUNCTION__": Too many or too few args (%d)\n", argc );
-		    op = FPGA_NONE;    /* force usage display */
-		    break;
-    }
+	switch (argc) {
+	case 5:		/* fpga <op> <dev> <data> <datasize> */
+		data_size = simple_strtoul (argv[4], NULL, 16);
+	case 4:		/* fpga <op> <dev> <data> */
+		fpga_data = (void *) simple_strtoul (argv[3], NULL, 16);
+		PRINTF (__FUNCTION__ ": fpga_data = 0x%x\n",
+			(uint) fpga_data);
+	case 3:		/* fpga <op> <dev | data addr> */
+		dev = (int) simple_strtoul (argv[2], NULL, 16);
+		PRINTF (__FUNCTION__ ": device = %d\n", dev);
+		/* FIXME - this is a really weak test */
+		if ((argc == 3) && (dev > fpga_count ())) {	/* must be buffer ptr */
+			PRINTF (__FUNCTION__
+				": Assuming buffer pointer in arg 3\n");
+			fpga_data = (void *) dev;
+			PRINTF (__FUNCTION__ ": fpga_data = 0x%x\n",
+				(uint) fpga_data);
+			dev = FPGA_INVALID_DEVICE;	/* reset device num */
+		}
+	case 2:		/* fpga <op> */
+		op = (int) fpga_get_op (argv[1]);
+		break;
+	default:
+		PRINTF (__FUNCTION__ ": Too many or too few args (%d)\n",
+			argc);
+		op = FPGA_NONE;	/* force usage display */
+		break;
+	}
 
-    switch ( op ) {
-	    case FPGA_NONE:
-		    fpga_usage( cmdtp );
-		    break;
+	switch (op) {
+	case FPGA_NONE:
+		fpga_usage (cmdtp);
+		break;
 
-	    case FPGA_INFO:
-		    rc = fpga_info( dev );
-		    break;
+	case FPGA_INFO:
+		rc = fpga_info (dev);
+		break;
 
-	    case FPGA_LOAD:
-                    rc = fpga_load( dev, fpga_data, data_size );
-		    break;
+	case FPGA_LOAD:
+		rc = fpga_load (dev, fpga_data, data_size);
+		break;
 
-	    case FPGA_DUMP:
-                    rc = fpga_dump( dev, fpga_data, data_size );
-		    break;
+	case FPGA_DUMP:
+		rc = fpga_dump (dev, fpga_data, data_size);
+		break;
 
-	    default:
-		    printf( "Unknown operation.\n" );
-		    fpga_usage( cmdtp );
-		    break;
-    }
-    return (rc);
+	default:
+		printf ("Unknown operation.\n");
+		fpga_usage (cmdtp);
+		break;
+	}
+	return (rc);
 }
 
-static void fpga_usage ( cmd_tbl_t *cmdtp )
+static void fpga_usage (cmd_tbl_t * cmdtp)
 {
-	printf( "Usage:\n%s\n", cmdtp->usage );
+	printf ("Usage:\n%s\n", cmdtp->usage);
 }
 
 /*
  * Map op to supported operations.  We don't use a table since we
  * would just have to relocate it from flash anyway.
  */
-static int fpga_get_op( char *opstr )
+static int fpga_get_op (char *opstr)
 {
 	int op = FPGA_NONE;
 
 	if (!strcmp ("info", opstr)) {
 		op = FPGA_INFO;
-	}
-	else if (!strcmp ("load", opstr)) {
+	} else if (!strcmp ("load", opstr)) {
 		op = FPGA_LOAD;
-	}
-	else if (!strcmp ("dump", opstr)) {
+	} else if (!strcmp ("dump", opstr)) {
 		op = FPGA_DUMP;
 	}
 
-	if ( op == FPGA_NONE ) {
+	if (op == FPGA_NONE) {
 		printf ("Unknown fpga operation \"%s\"\n", opstr);
 	}
 	return op;
 }
 
-U_BOOT_CMD(
-	fpga,    6,     1,     do_fpga,
-	"fpga   - loadable FPGA image support\n",
-	"fpga [operation type] [device number] [image address] [image size]\n"
-	"fpga operations:\n"
-	"\tinfo\tlist known device information.\n"
-	"\tload\tLoad device from memory buffer.\n"
-	"\tdump\tLoad device to memory buffer.\n"
-);
-#endif	/* CONFIG_FPGA && CONFIG_COMMANDS & CFG_CMD_FPGA */
+U_BOOT_CMD (fpga, 6, 1, do_fpga,
+	    "fpga   - loadable FPGA image support\n",
+	    "fpga [operation type] [device number] [image address] [image size]\n"
+	    "fpga operations:\n"
+	    "\tinfo\tlist known device information.\n"
+	    "\tload\tLoad device from memory buffer.\n"
+	    "\tdump\tLoad device to memory buffer.\n");
+#endif /* CONFIG_FPGA && CONFIG_COMMANDS & CFG_CMD_FPGA */
