diff --git a/board/mousse/flash.c b/board/mousse/flash.c
index 3c4a802..2c32b8f 100644
--- a/board/mousse/flash.c
+++ b/board/mousse/flash.c
@@ -120,140 +120,141 @@
 #define FLASH0_READ(dev, addr) \
 	(*FLASH0_ADDR(dev, addr))
 
-PRIVATE int flashCheck(flash_dev_t *dev)
+PRIVATE int flashCheck (flash_dev_t * dev)
 {
-    if (! flashLibInited) {
-	printf("flashCheck: flashLib not initialized\n");
-	return ERROR;
-    }
+	if (!flashLibInited) {
+		printf ("flashCheck: flashLib not initialized\n");
+		return ERROR;
+	}
 
-    if (dev < &flashDev[0] || dev >= &flashDev[flashDevCount]) {
-	printf("flashCheck: Bad dev parameter\n");
-	return ERROR;
-    }
+	if (dev < &flashDev[0] || dev >= &flashDev[flashDevCount]) {
+		printf ("flashCheck: Bad dev parameter\n");
+		return ERROR;
+	}
 
-    if (! dev->found) {
-	printf("flashCheck: Device %d not available\n", DEV_NO(dev));
-	return ERROR;
-    }
+	if (!dev->found) {
+		printf ("flashCheck: Device %d not available\n", DEV_NO (dev));
+		return ERROR;
+	}
 
-    return OK;
+	return OK;
 }
 
-PRIVATE void flashReset(flash_dev_t *dev)
+PRIVATE void flashReset (flash_dev_t * dev)
 {
-    PRINTF("flashReset: dev=%d\n", DEV_NO(dev));
+	PRINTF ("flashReset: dev=%d\n", DEV_NO (dev));
 
-    if (dev->bank == FLASH0_BANK) {
-	FLASH0_WRITE(dev, 0x555, 0xaa);
-	FLASH0_WRITE(dev, 0xaaa, 0x55);
-	FLASH0_WRITE(dev, 0x555, 0xf0);
-    }
+	if (dev->bank == FLASH0_BANK) {
+		FLASH0_WRITE (dev, 0x555, 0xaa);
+		FLASH0_WRITE (dev, 0xaaa, 0x55);
+		FLASH0_WRITE (dev, 0x555, 0xf0);
+	}
 
-    udelay(SLEEP_DELAY);
+	udelay (SLEEP_DELAY);
 
-    PRINTF("flashReset: done\n");
+	PRINTF ("flashReset: done\n");
 }
 
-PRIVATE int flashProbe(flash_dev_t *dev)
+PRIVATE int flashProbe (flash_dev_t * dev)
 {
-    int			rv, deviceID, vendorID;
+	int rv, deviceID, vendorID;
 
-    PRINTF("flashProbe: dev=%d\n", DEV_NO(dev));
+	PRINTF ("flashProbe: dev=%d\n", DEV_NO (dev));
 
-    if (dev->bank != FLASH0_BANK) {
-    	rv = ERROR;
-	goto DONE;
-    }
+	if (dev->bank != FLASH0_BANK) {
+		rv = ERROR;
+		goto DONE;
+	}
 
-    FLASH0_WRITE(dev, 0xaaa, 0xaa);
-    FLASH0_WRITE(dev, 0x555, 0x55);
-    FLASH0_WRITE(dev, 0xaaa, 0x90);
+	FLASH0_WRITE (dev, 0xaaa, 0xaa);
+	FLASH0_WRITE (dev, 0x555, 0x55);
+	FLASH0_WRITE (dev, 0xaaa, 0x90);
 
-    udelay(SLEEP_DELAY);
+	udelay (SLEEP_DELAY);
 
-    vendorID = FLASH0_READ(dev, 0);
-    deviceID = FLASH0_READ(dev, 2);
+	vendorID = FLASH0_READ (dev, 0);
+	deviceID = FLASH0_READ (dev, 2);
 
-    FLASH0_WRITE(dev, 0, 0xf0);
+	FLASH0_WRITE (dev, 0, 0xf0);
 
-    PRINTF("flashProbe: vendor=0x%x device=0x%x\n", vendorID, deviceID);
+	PRINTF ("flashProbe: vendor=0x%x device=0x%x\n", vendorID, deviceID);
 
-    if (vendorID == dev->vendorID && deviceID == dev->deviceID)
-	rv = OK;
-    else
-	rv = ERROR;
+	if (vendorID == dev->vendorID && deviceID == dev->deviceID)
+		rv = OK;
+	else
+		rv = ERROR;
 
-DONE:
-    PRINTF("flashProbe: rv=%d\n", rv);
+  DONE:
+	PRINTF ("flashProbe: rv=%d\n", rv);
 
-    return rv;
+	return rv;
 }
 
-PRIVATE int flashWait(flash_dev_t *dev, int addr, int expect, int erase)
+PRIVATE int flashWait (flash_dev_t * dev, int addr, int expect, int erase)
 {
-    int			rv = ERROR;
-    int			i, data;
-    int			polls;
+	int rv = ERROR;
+	int i, data;
+	int polls;
+
 #if 0
-    PRINTF("flashWait: dev=%d addr=0x%x expect=0x%x erase=%d\n",
-	   DEV_NO(dev), addr, expect, erase);
+	PRINTF ("flashWait: dev=%d addr=0x%x expect=0x%x erase=%d\n",
+		DEV_NO (dev), addr, expect, erase);
 #endif
 
-    if (dev->bank != FLASH0_BANK) {
-	rv = ERROR;
-	goto done;
-    }
-
-    if (erase)
-	polls = FLASH_ERASE_SECTOR_TIMEOUT;	/* Ticks */
-    else
-	polls = FLASH_PROGRAM_POLLS;		/* Loops */
+	if (dev->bank != FLASH0_BANK) {
+		rv = ERROR;
+		goto done;
+	}
 
-    for (i = 0; i < polls; i++) {
 	if (erase)
-	    udelay(SLEEP_DELAY);
+		polls = FLASH_ERASE_SECTOR_TIMEOUT;	/* Ticks */
+	else
+		polls = FLASH_PROGRAM_POLLS;	/* Loops */
 
-	data = FLASH0_READ(dev, addr);
+	for (i = 0; i < polls; i++) {
+		if (erase)
+			udelay (SLEEP_DELAY);
 
-	if (((data ^ expect) & 0x80) == 0) {
-	    rv = OK;
-	    goto done;
-	}
+		data = FLASH0_READ (dev, addr);
 
-	if (data & 0x20) {
-	    /*
-	     * If the 0x20 bit has come on, it could actually be because
-	     * the operation succeeded, so check the done bit again.
-	     */
+		if (((data ^ expect) & 0x80) == 0) {
+			rv = OK;
+			goto done;
+		}
 
-	    data = FLASH0_READ(dev, addr);
+		if (data & 0x20) {
+			/*
+			 * If the 0x20 bit has come on, it could actually be because
+			 * the operation succeeded, so check the done bit again.
+			 */
 
-	    if (((data ^ expect) & 0x80) == 0) {
-		rv = OK;
-		goto done;
-	    }
+			data = FLASH0_READ (dev, addr);
 
-	    printf("flashWait: Program error (dev: %d, addr: 0x%x)\n",
-		   DEV_NO(dev), addr);
+			if (((data ^ expect) & 0x80) == 0) {
+				rv = OK;
+				goto done;
+			}
 
-	    flashReset(dev);
-	    rv = ERROR;
-	    goto done;
+			printf ("flashWait: Program error (dev: %d, addr: 0x%x)\n",
+					DEV_NO (dev), addr);
+
+			flashReset (dev);
+			rv = ERROR;
+			goto done;
+		}
 	}
-    }
 
-    printf("flashWait: Timeout %s (dev: %d, addr: 0x%x)\n",
-	   erase ? "erasing sector" : "programming byte",
-	   DEV_NO(dev), addr);
+	printf ("flashWait: Timeout %s (dev: %d, addr: 0x%x)\n",
+		erase ? "erasing sector" : "programming byte",
+		DEV_NO (dev), addr);
 
-done:
+  done:
 
 #if 0
-    PRINTF("flashWait: rv=%d\n", rv);
+	PRINTF ("flashWait: rv=%d\n", rv);
 #endif
 
-    return rv;
+	return rv;
 }
 
 /***********************************************************************
@@ -262,77 +263,78 @@
  *
  ***********************************************************************/
 
-STATUS flashLibInit(void)
+STATUS flashLibInit (void)
 {
-    int			i;
+	int i;
 
-    PRINTF("flashLibInit: devices=%d\n", flashDevCount);
+	PRINTF ("flashLibInit: devices=%d\n", flashDevCount);
 
-    for (i = 0; i < flashDevCount; i++) {
-	flash_dev_t	*dev = &flashDev[i];
-	/*
-	 * For bank 1, probe both without and with byte swappage,
-	 * so that this module works on both old and new Mousse boards.
-	 */
+	for (i = 0; i < flashDevCount; i++) {
+		flash_dev_t *dev = &flashDev[i];
 
-	flashReset(dev);
+		/*
+		 * For bank 1, probe both without and with byte swappage,
+		 * so that this module works on both old and new Mousse boards.
+		 */
 
-	if (flashProbe(dev) != ERROR)
-	    dev->found = 1;
+		flashReset (dev);
 
-	    flashReset(dev);
+		if (flashProbe (dev) != ERROR)
+			dev->found = 1;
 
-	    if (flashProbe(dev) != ERROR)
-		dev->found = 1;
+		flashReset (dev);
 
-	    dev->swap = 0;
+		if (flashProbe (dev) != ERROR)
+			dev->found = 1;
 
-	    if(dev->found){
-	      PRINTF("\n  FLASH %s[%d]: iobase=0x%x - %d sectors %d KB",
-		     flashDev[i].name,i,flashDev[i].base, flashDev[i].sectors,
-		     (flashDev[i].sectors * FLASH_SECTOR_SIZE)/1024);
+		dev->swap = 0;
 
-	    }
-    }
+		if (dev->found) {
+			PRINTF ("\n  FLASH %s[%d]: iobase=0x%x - %d sectors %d KB",
+				flashDev[i].name, i, flashDev[i].base,
+				flashDev[i].sectors,
+				(flashDev[i].sectors * FLASH_SECTOR_SIZE) / 1024);
 
-    flashLibInited = 1;
+		}
+	}
+
+	flashLibInited = 1;
 
-    PRINTF("flashLibInit: done\n");
+	PRINTF ("flashLibInit: done\n");
 
-    return OK;
+	return OK;
 }
 
-STATUS flashEraseSector(flash_dev_t *dev, int sector)
+STATUS flashEraseSector (flash_dev_t * dev, int sector)
 {
-    int			pos, addr;
+	int pos, addr;
 
-    PRINTF("flashErasesector: dev=%d sector=%d\n", DEV_NO(dev), sector);
+	PRINTF ("flashErasesector: dev=%d sector=%d\n", DEV_NO (dev), sector);
 
-    if (flashCheck(dev) == ERROR)
-	return ERROR;
+	if (flashCheck (dev) == ERROR)
+		return ERROR;
 
-    if (sector < 0 || sector >= dev->sectors) {
-	printf("flashEraseSector: Sector out of range (dev: %d, sector: %d)\n",
-	       DEV_NO(dev), sector);
-	return ERROR;
-    }
+	if (sector < 0 || sector >= dev->sectors) {
+		printf ("flashEraseSector: Sector out of range (dev: %d, sector: %d)\n", DEV_NO (dev), sector);
+		return ERROR;
+	}
 
-    pos = FLASH_SECTOR_POS(dev, sector);
+	pos = FLASH_SECTOR_POS (dev, sector);
 
-    if (dev->bank != FLASH0_BANK) {
-	return ERROR;
-    }
+	if (dev->bank != FLASH0_BANK) {
+		return ERROR;
+	}
 
-    addr = pos;
+	addr = pos;
 
-    FLASH0_WRITE(dev, 0xaaa, 0xaa);
-    FLASH0_WRITE(dev, 0x555, 0x55);
-    FLASH0_WRITE(dev, 0xaaa, 0x80);
-    FLASH0_WRITE(dev, 0xaaa, 0xaa);
-    FLASH0_WRITE(dev, 0x555, 0x55);
-    FLASH0_WRITE(dev, addr, 0x30);
+	FLASH0_WRITE (dev, 0xaaa, 0xaa);
+	FLASH0_WRITE (dev, 0x555, 0x55);
+	FLASH0_WRITE (dev, 0xaaa, 0x80);
+	FLASH0_WRITE (dev, 0xaaa, 0xaa);
+	FLASH0_WRITE (dev, 0x555, 0x55);
+	FLASH0_WRITE (dev, addr, 0x30);
 
-    return flashWait(dev, addr, 0xff, 1);
+	return flashWait (dev, addr, 0xff, 1);
 }
 
 /*
@@ -342,156 +344,156 @@
  * they were complete devices, we don't use Chip Erase.
  */
 
-STATUS flashErase(flash_dev_t *dev)
+STATUS flashErase (flash_dev_t * dev)
 {
-    int			sector;
+	int sector;
 
-    PRINTF("flashErase: dev=%d sectors=%d\n", DEV_NO(dev), dev->sectors);
+	PRINTF ("flashErase: dev=%d sectors=%d\n", DEV_NO (dev), dev->sectors);
 
-    if (flashCheck(dev) == ERROR)
-	return ERROR;
+	if (flashCheck (dev) == ERROR)
+		return ERROR;
 
-    for (sector = 0; sector < dev->sectors; sector++) {
-      if (flashEraseSector(dev, sector) == ERROR)
-	    return ERROR;
-    }
-    return OK;
+	for (sector = 0; sector < dev->sectors; sector++) {
+		if (flashEraseSector (dev, sector) == ERROR)
+			return ERROR;
+	}
+	return OK;
 }
 
 /*
  * Read and write bytes
  */
 
-STATUS flashRead(flash_dev_t *dev, int pos, char *buf, int len)
+STATUS flashRead (flash_dev_t * dev, int pos, char *buf, int len)
 {
-    int			addr, words;
+	int addr, words;
 
-    PRINTF("flashRead: dev=%d pos=0x%x buf=0x%x len=0x%x\n",
-	   DEV_NO(dev), pos, (int) buf, len);
+	PRINTF ("flashRead: dev=%d pos=0x%x buf=0x%x len=0x%x\n",
+		DEV_NO (dev), pos, (int) buf, len);
 
-    if (flashCheck(dev) == ERROR)
-	return ERROR;
+	if (flashCheck (dev) == ERROR)
+		return ERROR;
 
-    if (pos < 0 || len < 0 || pos + len > FLASH_MAX_POS(dev)) {
-	printf("flashRead: Position out of range "
-	       "(dev: %d, pos: 0x%x, len: 0x%x)\n",
-	       DEV_NO(dev), pos, len);
-	return ERROR;
-    }
+	if (pos < 0 || len < 0 || pos + len > FLASH_MAX_POS (dev)) {
+		printf ("flashRead: Position out of range "
+			"(dev: %d, pos: 0x%x, len: 0x%x)\n",
+			DEV_NO (dev), pos, len);
+		return ERROR;
+	}
 
-    if (len == 0)
-	return OK;
+	if (len == 0)
+		return OK;
 
-    if (dev->bank == FLASH0_BANK) {
-	addr = pos;
-	words = len;
+	if (dev->bank == FLASH0_BANK) {
+		addr = pos;
+		words = len;
 
-	PRINTF("flashRead: memcpy(0x%x, 0x%x, 0x%x)\n",
-	       (int) buf, (int) FLASH0_ADDR(dev, pos), len);
+		PRINTF ("flashRead: memcpy(0x%x, 0x%x, 0x%x)\n",
+			(int) buf, (int) FLASH0_ADDR (dev, pos), len);
 
-	memcpy(buf, FLASH0_ADDR(dev, addr), words);
+		memcpy (buf, FLASH0_ADDR (dev, addr), words);
 
-    }
-    PRINTF("flashRead: rv=OK\n");
+	}
+	PRINTF ("flashRead: rv=OK\n");
 
-    return OK;
+	return OK;
 }
 
-STATUS flashWrite(flash_dev_t *dev, int pos, char *buf, int len)
+STATUS flashWrite (flash_dev_t * dev, int pos, char *buf, int len)
 {
-    int 		addr, words;
+	int addr, words;
 
-    PRINTF("flashWrite: dev=%d pos=0x%x buf=0x%x len=0x%x\n",
-	   DEV_NO(dev), pos, (int) buf, len);
+	PRINTF ("flashWrite: dev=%d pos=0x%x buf=0x%x len=0x%x\n",
+		DEV_NO (dev), pos, (int) buf, len);
 
-    if (flashCheck(dev) == ERROR)
-	return ERROR;
+	if (flashCheck (dev) == ERROR)
+		return ERROR;
 
-    if (pos < 0 || len < 0 || pos + len > FLASH_MAX_POS(dev)) {
-	printf("flashWrite: Position out of range "
-	       "(dev: %d, pos: 0x%x, len: 0x%x)\n",
-	       DEV_NO(dev), pos, len);
-	return ERROR;
-    }
+	if (pos < 0 || len < 0 || pos + len > FLASH_MAX_POS (dev)) {
+		printf ("flashWrite: Position out of range "
+			"(dev: %d, pos: 0x%x, len: 0x%x)\n",
+			DEV_NO (dev), pos, len);
+		return ERROR;
+	}
 
-    if (len == 0)
-	return OK;
+	if (len == 0)
+		return OK;
 
-    if (dev->bank == FLASH0_BANK) {
-	unsigned char tmp;
+	if (dev->bank == FLASH0_BANK) {
+		unsigned char tmp;
 
-	addr = pos;
-	words = len;
+		addr = pos;
+		words = len;
 
-	while (words--) {
-	    tmp = *buf;
-	    if (~FLASH0_READ(dev, addr) & tmp) {
-		printf("flashWrite: Attempt to program 0 to 1 "
-		       "(dev: %d, addr: 0x%x, data: 0x%x)\n",
-		       DEV_NO(dev), addr, tmp);
-		return ERROR;
-	    }
-	    FLASH0_WRITE(dev, 0xaaa, 0xaa);
-	    FLASH0_WRITE(dev, 0x555, 0x55);
-	    FLASH0_WRITE(dev, 0xaaa, 0xa0);
-	    FLASH0_WRITE(dev, addr, tmp);
-	    if (flashWait(dev, addr, tmp, 0) < 0)
-		return ERROR;
-	    buf++;
-	    addr++;
+		while (words--) {
+			tmp = *buf;
+			if (~FLASH0_READ (dev, addr) & tmp) {
+				printf ("flashWrite: Attempt to program 0 to 1 "
+					"(dev: %d, addr: 0x%x, data: 0x%x)\n",
+					DEV_NO (dev), addr, tmp);
+				return ERROR;
+			}
+			FLASH0_WRITE (dev, 0xaaa, 0xaa);
+			FLASH0_WRITE (dev, 0x555, 0x55);
+			FLASH0_WRITE (dev, 0xaaa, 0xa0);
+			FLASH0_WRITE (dev, addr, tmp);
+			if (flashWait (dev, addr, tmp, 0) < 0)
+				return ERROR;
+			buf++;
+			addr++;
+		}
 	}
-    }
 
-    PRINTF("flashWrite: rv=OK\n");
+	PRINTF ("flashWrite: rv=OK\n");
 
-    return OK;
+	return OK;
 }
 
 /*
  * flashWritable returns TRUE if a range contains all F's.
  */
 
-STATUS flashWritable(flash_dev_t *dev, int pos, int len)
+STATUS flashWritable (flash_dev_t * dev, int pos, int len)
 {
-    int 		addr, words;
-    int			rv = ERROR;
+	int addr, words;
+	int rv = ERROR;
 
-    PRINTF("flashWritable: dev=%d pos=0x%x len=0x%x\n",
-	   DEV_NO(dev), pos, len);
+	PRINTF ("flashWritable: dev=%d pos=0x%x len=0x%x\n",
+			DEV_NO (dev), pos, len);
 
-    if (flashCheck(dev) == ERROR)
-	goto done;
+	if (flashCheck (dev) == ERROR)
+		goto done;
 
-    if (pos < 0 || len < 0 || pos + len > FLASH_MAX_POS(dev)) {
-	printf("flashWritable: Position out of range "
-	       "(dev: %d, pos: 0x%x, len: 0x%x)\n",
-	       DEV_NO(dev), pos, len);
-	goto done;
-    }
+	if (pos < 0 || len < 0 || pos + len > FLASH_MAX_POS (dev)) {
+		printf ("flashWritable: Position out of range "
+			"(dev: %d, pos: 0x%x, len: 0x%x)\n",
+			DEV_NO (dev), pos, len);
+		goto done;
+	}
 
-    if (len == 0) {
-	rv = 1;
-	goto done;
-    }
+	if (len == 0) {
+		rv = 1;
+		goto done;
+	}
 
-    if (dev->bank == FLASH0_BANK) {
-	addr = pos;
-	words = len;
+	if (dev->bank == FLASH0_BANK) {
+		addr = pos;
+		words = len;
 
-	while (words--) {
-	    if (FLASH0_READ(dev, addr) != 0xff) {
-		rv = 0;
-		goto done;
-	    }
-	    addr++;
+		while (words--) {
+			if (FLASH0_READ (dev, addr) != 0xff) {
+				rv = 0;
+				goto done;
+			}
+			addr++;
+		}
 	}
-    }
 
-    rv = 1;
+	rv = 1;
 
- done:
-    PRINTF("flashWrite: rv=%d\n", rv);
-    return rv;
+  done:
+	PRINTF ("flashWrite: rv=%d\n", rv);
+	return rv;
 }
 
 
@@ -504,128 +506,126 @@
  *
  ***********************************************************************/
 
-STATUS flashDiag(flash_dev_t *dev)
+STATUS flashDiag (flash_dev_t * dev)
 {
-    unsigned int	*buf = 0;
-    int			i, len, sector;
-    int			rv = ERROR;
+	unsigned int *buf = 0;
+	int i, len, sector;
+	int rv = ERROR;
 
-    if (flashCheck(dev) == ERROR)
-	return ERROR;
+	if (flashCheck (dev) == ERROR)
+		return ERROR;
 
-    printf("flashDiag: Testing device %d, "
-	   "base: 0x%x, %d sectors @ %d kB = %d kB\n",
-	   DEV_NO(dev), dev->base,
-	   dev->sectors,
-	   1 << (dev->lgSectorSize - 10),
-	   dev->sectors << (dev->lgSectorSize - 10));
+	printf ("flashDiag: Testing device %d, "
+		"base: 0x%x, %d sectors @ %d kB = %d kB\n",
+		DEV_NO (dev), dev->base,
+		dev->sectors,
+		1 << (dev->lgSectorSize - 10),
+		dev->sectors << (dev->lgSectorSize - 10));
 
-    len = 1 << dev->lgSectorSize;
+	len = 1 << dev->lgSectorSize;
 
-    printf("flashDiag: Erasing\n");
+	printf ("flashDiag: Erasing\n");
 
-    if (flashErase(dev) == ERROR) {
-	printf("flashDiag: Erase failed\n");
-	goto done;
-    }
-    printf("%d bytes requested ...\n", len);
-    buf = malloc(len);
-    printf("allocated %d bytes ...\n", len);
-    if (buf == 0) {
-	printf("flashDiag: Out of memory\n");
-	goto done;
-    }
+	if (flashErase (dev) == ERROR) {
+		printf ("flashDiag: Erase failed\n");
+		goto done;
+	}
+	printf ("%d bytes requested ...\n", len);
+	buf = malloc (len);
+	printf ("allocated %d bytes ...\n", len);
+	if (buf == 0) {
+		printf ("flashDiag: Out of memory\n");
+		goto done;
+	}
 
-    /*
-     * Write unique counting pattern to each sector
-     */
+	/*
+	 * Write unique counting pattern to each sector
+	 */
 
-    for (sector = 0; sector < dev->sectors; sector++) {
-	printf("flashDiag: Write sector %d\n", sector);
+	for (sector = 0; sector < dev->sectors; sector++) {
+		printf ("flashDiag: Write sector %d\n", sector);
 
-	for (i = 0; i < len / 4; i++)
-	    buf[i] = sector << 24 | i;
+		for (i = 0; i < len / 4; i++)
+			buf[i] = sector << 24 | i;
 
-	if (flashWrite(dev,
-		       sector << dev->lgSectorSize,
-		       (char *) buf,
-		       len) == ERROR) {
-	    printf("flashDiag: Write failed (dev: %d, sector: %d)\n",
-		   DEV_NO(dev), sector);
-	    goto done;
+		if (flashWrite (dev,
+				sector << dev->lgSectorSize,
+				(char *) buf, len) == ERROR) {
+			printf ("flashDiag: Write failed (dev: %d, sector: %d)\n",
+				DEV_NO (dev), sector);
+			goto done;
+		}
 	}
-    }
 
-    /*
-     * Verify
-     */
+	/*
+	 * Verify
+	 */
 
-    for (sector = 0; sector < dev->sectors; sector++) {
-	printf("flashDiag: Verify sector %d\n", sector);
+	for (sector = 0; sector < dev->sectors; sector++) {
+		printf ("flashDiag: Verify sector %d\n", sector);
 
-	if (flashRead(dev,
-		      sector << dev->lgSectorSize,
-		      (char *) buf,
-		      len) == ERROR) {
-	    printf("flashDiag: Read failed (dev: %d, sector: %d)\n",
-		   DEV_NO(dev), sector);
-	    goto done;
-	}
+		if (flashRead (dev,
+				   sector << dev->lgSectorSize,
+				   (char *) buf, len) == ERROR) {
+			printf ("flashDiag: Read failed (dev: %d, sector: %d)\n",
+				DEV_NO (dev), sector);
+			goto done;
+		}
 
-	for (i = 0; i < len / 4; i++) {
-	    if (buf[i] != (sector << 24 | i)) {
-		printf("flashDiag: Verify error "
-		       "(dev: %d, sector: %d, offset: 0x%x)\n",
-		       DEV_NO(dev), sector, i);
-		printf("flashDiag: Expected 0x%08x, got 0x%08x\n",
-		       sector << 24 | i, buf[i]);
+		for (i = 0; i < len / 4; i++) {
+			if (buf[i] != (sector << 24 | i)) {
+				printf ("flashDiag: Verify error "
+					"(dev: %d, sector: %d, offset: 0x%x)\n",
+					DEV_NO (dev), sector, i);
+				printf ("flashDiag: Expected 0x%08x, got 0x%08x\n",
+					sector << 24 | i, buf[i]);
 
-		goto done;
-	    }
+				goto done;
+			}
+		}
 	}
-    }
 
-    printf("flashDiag: Erasing\n");
+	printf ("flashDiag: Erasing\n");
 
-    if (flashErase(dev) == ERROR) {
-	printf("flashDiag: Final erase failed\n");
-	goto done;
-    }
+	if (flashErase (dev) == ERROR) {
+		printf ("flashDiag: Final erase failed\n");
+		goto done;
+	}
 
-    rv = OK;
+	rv = OK;
 
- done:
-    if (buf)
-	free(buf);
+  done:
+	if (buf)
+		free (buf);
 
-    if (rv == OK)
-	printf("flashDiag: Device %d passed\n", DEV_NO(dev));
-    else
-	printf("flashDiag: Device %d failed\n", DEV_NO(dev));
+	if (rv == OK)
+		printf ("flashDiag: Device %d passed\n", DEV_NO (dev));
+	else
+		printf ("flashDiag: Device %d failed\n", DEV_NO (dev));
 
-    return rv;
+	return rv;
 }
 
-STATUS flashDiagAll(void)
+STATUS flashDiagAll (void)
 {
-    int			i;
-    int			rv = OK;
+	int i;
+	int rv = OK;
 
-    PRINTF("flashDiagAll: devices=%d\n", flashDevCount);
+	PRINTF ("flashDiagAll: devices=%d\n", flashDevCount);
 
-    for (i = 0; i < flashDevCount; i++) {
-	flash_dev_t	*dev = &flashDev[i];
+	for (i = 0; i < flashDevCount; i++) {
+		flash_dev_t *dev = &flashDev[i];
 
-	if (dev->found && flashDiag(dev) == ERROR)
-	    rv = ERROR;
-    }
+		if (dev->found && flashDiag (dev) == ERROR)
+			rv = ERROR;
+	}
 
-    if (rv == OK)
-	printf("flashDiagAll: Passed\n");
-    else
-	printf("flashDiagAll: Failed because of earlier errors\n");
+	if (rv == OK)
+		printf ("flashDiagAll: Passed\n");
+	else
+		printf ("flashDiagAll: Failed because of earlier errors\n");
 
-    return OK;
+	return OK;
 }
 
 
@@ -633,198 +633,197 @@
  */
 unsigned long flash_init (void)
 {
-    unsigned long size = 0;
-    flash_dev_t	*dev = NULL;
-    flashLibInit();
+	unsigned long size = 0;
+	flash_dev_t *dev = NULL;
 
-    /*
-     * Provide info for FLASH (up to 960K) of Kernel Image data.
-     */
-    dev = FLASH_DEV_BANK0_LOW;
-    flash_info[FLASH_BANK_KERNEL].flash_id =
-      (dev->vendorID << 16) | dev->deviceID;
-    flash_info[FLASH_BANK_KERNEL].sector_count = dev->sectors;
-    flash_info[FLASH_BANK_KERNEL].size =
-      flash_info[FLASH_BANK_KERNEL].sector_count * FLASH_SECTOR_SIZE;
-    flash_info[FLASH_BANK_KERNEL].start[FIRST_SECTOR] = dev->base;
-    size += flash_info[FLASH_BANK_KERNEL].size;
+	flashLibInit ();
 
-    /*
-     * Provide info for 512K PLCC FLASH ROM (U-Boot)
-     */
-    dev = FLASH_DEV_BANK0_BOOT;
-    flash_info[FLASH_BANK_BOOT].flash_id =
-      (dev->vendorID << 16) | dev->deviceID;
-    flash_info[FLASH_BANK_BOOT].sector_count = dev->sectors;
-    flash_info[FLASH_BANK_BOOT].size =
-      flash_info[FLASH_BANK_BOOT].sector_count * FLASH_SECTOR_SIZE;
-    flash_info[FLASH_BANK_BOOT].start[FIRST_SECTOR] = dev->base;
-    size += flash_info[FLASH_BANK_BOOT].size;
+	/*
+	 * Provide info for FLASH (up to 960K) of Kernel Image data.
+	 */
+	dev = FLASH_DEV_BANK0_LOW;
+	flash_info[FLASH_BANK_KERNEL].flash_id =
+			(dev->vendorID << 16) | dev->deviceID;
+	flash_info[FLASH_BANK_KERNEL].sector_count = dev->sectors;
+	flash_info[FLASH_BANK_KERNEL].size =
+			flash_info[FLASH_BANK_KERNEL].sector_count * FLASH_SECTOR_SIZE;
+	flash_info[FLASH_BANK_KERNEL].start[FIRST_SECTOR] = dev->base;
+	size += flash_info[FLASH_BANK_KERNEL].size;
+
+	/*
+	 * Provide info for 512K PLCC FLASH ROM (U-Boot)
+	 */
+	dev = FLASH_DEV_BANK0_BOOT;
+	flash_info[FLASH_BANK_BOOT].flash_id =
+			(dev->vendorID << 16) | dev->deviceID;
+	flash_info[FLASH_BANK_BOOT].sector_count = dev->sectors;
+	flash_info[FLASH_BANK_BOOT].size =
+			flash_info[FLASH_BANK_BOOT].sector_count * FLASH_SECTOR_SIZE;
+	flash_info[FLASH_BANK_BOOT].start[FIRST_SECTOR] = dev->base;
+	size += flash_info[FLASH_BANK_BOOT].size;
 
 
-    /*
-     * Provide info for 512K FLASH0 segment (U-Boot)
-     */
-    dev = FLASH_DEV_BANK0_HIGH;
-    flash_info[FLASH_BANK_AUX].flash_id =
-      (dev->vendorID << 16) | dev->deviceID;
-    flash_info[FLASH_BANK_AUX].sector_count = dev->sectors;
-    flash_info[FLASH_BANK_AUX].size =
-      flash_info[FLASH_BANK_AUX].sector_count * FLASH_SECTOR_SIZE;
-    flash_info[FLASH_BANK_AUX].start[FIRST_SECTOR] = dev->base;
-    size += flash_info[FLASH_BANK_AUX].size;
+	/*
+	 * Provide info for 512K FLASH0 segment (U-Boot)
+	 */
+	dev = FLASH_DEV_BANK0_HIGH;
+	flash_info[FLASH_BANK_AUX].flash_id =
+			(dev->vendorID << 16) | dev->deviceID;
+	flash_info[FLASH_BANK_AUX].sector_count = dev->sectors;
+	flash_info[FLASH_BANK_AUX].size =
+			flash_info[FLASH_BANK_AUX].sector_count * FLASH_SECTOR_SIZE;
+	flash_info[FLASH_BANK_AUX].start[FIRST_SECTOR] = dev->base;
+	size += flash_info[FLASH_BANK_AUX].size;
 
 
-    return  size;
+	return size;
 }
 
 /*
  * Get flash device from U-Boot flash info.
  */
-flash_dev_t*
-getFlashDevFromInfo(flash_info_t* info)
+flash_dev_t *getFlashDevFromInfo (flash_info_t * info)
 {
-  int i;
+	int i;
 
-  if(!info)
-    return NULL;
+	if (!info)
+		return NULL;
 
-  for (i = 0; i < flashDevCount; i++) {
-    flash_dev_t	*dev = &flashDev[i];
-    if(dev->found && (dev->base == info->start[0]))
-      return dev;
-  }
-  printf("ERROR: notice, no FLASH mapped at address 0x%x\n",
-	 (unsigned int)info->start[0]);
-  return NULL;
+	for (i = 0; i < flashDevCount; i++) {
+		flash_dev_t *dev = &flashDev[i];
+
+		if (dev->found && (dev->base == info->start[0]))
+			return dev;
+	}
+	printf ("ERROR: notice, no FLASH mapped at address 0x%x\n",
+			(unsigned int) info->start[0]);
+	return NULL;
 }
 
-ulong
-flash_get_size (vu_long *addr, flash_info_t *info)
+ulong flash_get_size (vu_long * addr, flash_info_t * info)
 {
-    int i;
-    for(i = 0; i < flashDevCount; i++) {
-      flash_dev_t	*dev = &flashDev[i];
-      if(dev->found){
-	if(dev->base == (unsigned int)addr){
-	  info->flash_id = (dev->vendorID << 16) | dev->deviceID;
-	  info->sector_count = dev->sectors;
-	  info->size = info->sector_count * FLASH_SECTOR_SIZE;
-	  return dev->sectors * FLASH_SECTOR_SIZE;
+	int i;
+
+	for (i = 0; i < flashDevCount; i++) {
+		flash_dev_t *dev = &flashDev[i];
+
+		if (dev->found) {
+			if (dev->base == (unsigned int) addr) {
+				info->flash_id = (dev->vendorID << 16) | dev->deviceID;
+				info->sector_count = dev->sectors;
+				info->size = info->sector_count * FLASH_SECTOR_SIZE;
+				return dev->sectors * FLASH_SECTOR_SIZE;
+			}
+		}
 	}
-      }
-    }
-    return 0;
+	return 0;
 }
 
-void
-flash_print_info  (flash_info_t *info)
+void flash_print_info (flash_info_t * info)
 {
-  int i;
-  unsigned int chip;
+	int i;
+	unsigned int chip;
 
-    if (info->flash_id == FLASH_UNKNOWN) {
-	printf ("missing or unknown FLASH type\n");
-	return;
-    }
+	if (info->flash_id == FLASH_UNKNOWN) {
+		printf ("missing or unknown FLASH type\n");
+		return;
+	}
 
-    switch ((info->flash_id >> 16) & 0xff) {
-    case 0x1:
-	printf ("AMD ");
-	break;
-    default:
-	printf ("Unknown Vendor ");
-	break;
-    }
-    chip = (unsigned int) info->flash_id & 0x000000ff;
+	switch ((info->flash_id >> 16) & 0xff) {
+	case 0x1:
+		printf ("AMD ");
+		break;
+	default:
+		printf ("Unknown Vendor ");
+		break;
+	}
+	chip = (unsigned int) info->flash_id & 0x000000ff;
 
-    switch (chip) {
+	switch (chip) {
 
-    case AMD_ID_F040B:
-	printf ("AM29F040B (4 Mbit)\n");
-	break;
+	case AMD_ID_F040B:
+		printf ("AM29F040B (4 Mbit)\n");
+		break;
 
-    case AMD_ID_LV160B:
-    case FLASH_AM160LV:
-    case 0x49:
-	printf ("AM29LV160B (16 Mbit / 2M x 8bit)\n");
-	break;
+	case AMD_ID_LV160B:
+	case FLASH_AM160LV:
+	case 0x49:
+		printf ("AM29LV160B (16 Mbit / 2M x 8bit)\n");
+		break;
 
-    default:
-      printf ("Unknown Chip Type:0x%x\n", chip);
-	break;
-    }
+	default:
+		printf ("Unknown Chip Type:0x%x\n", chip);
+		break;
+	}
 
-    printf ("  Size: %ld bytes in %d Sectors\n",
-	    info->size, info->sector_count);
+	printf ("  Size: %ld bytes in %d Sectors\n",
+		info->size, info->sector_count);
 
-    printf ("  Sector Start Addresses:");
-    for (i=0; i<info->sector_count; ++i) {
-      if ((i % 5) == 0)
-	  printf ("\n   ");
-	printf (" %08lX%s",
-		info->start[FIRST_SECTOR] + i*FLASH_SECTOR_SIZE,
-		info->protect[i] ? " (RO)" : "     "
-		);
-    }
-    printf ("\n");
+	printf ("  Sector Start Addresses:");
+	for (i = 0; i < info->sector_count; ++i) {
+		if ((i % 5) == 0)
+			printf ("\n   ");
+		printf (" %08lX%s",
+			info->start[FIRST_SECTOR] + i * FLASH_SECTOR_SIZE,
+			info->protect[i] ? " (RO)" : "     ");
+	}
+	printf ("\n");
 }
 
 
 /*
  * Erase a range of flash sectors.
  */
-int flash_erase (flash_info_t *info, int s_first, int s_last)
+int flash_erase (flash_info_t * info, int s_first, int s_last)
 {
-    vu_long *addr = (vu_long*)(info->start[0]);
-    int prot, sect, l_sect;
-    flash_dev_t* dev = NULL;
+	vu_long *addr = (vu_long *) (info->start[0]);
+	int prot, sect, l_sect;
+	flash_dev_t *dev = NULL;
 
-    if ((s_first < 0) || (s_first > s_last)) {
-	if (info->flash_id == FLASH_UNKNOWN) {
-	    printf ("- missing\n");
-	} else {
-	    printf ("- no sectors to erase\n");
+	if ((s_first < 0) || (s_first > s_last)) {
+		if (info->flash_id == FLASH_UNKNOWN) {
+			printf ("- missing\n");
+		} else {
+			printf ("- no sectors to erase\n");
+		}
+		return 1;
 	}
-	return 1;
-    }
 
-    prot = 0;
-    for (sect = s_first; sect <= s_last; sect++) {
-	if (info->protect[sect]) {
-	    prot++;
+	prot = 0;
+	for (sect = s_first; sect <= s_last; sect++) {
+		if (info->protect[sect]) {
+			prot++;
+		}
 	}
-    }
 
-    if (prot) {
-	printf ("- Warning: %d protected sectors will not be erased!\n",
-		prot);
-    } else {
-	printf ("\n");
-    }
+	if (prot) {
+		printf ("- Warning: %d protected sectors will not be erased!\n",
+			prot);
+	} else {
+		printf ("\n");
+	}
 
-    l_sect = -1;
+	l_sect = -1;
 
-    /* Start erase on unprotected sectors */
-    dev = getFlashDevFromInfo(info);
-    if(dev){
-      printf("Erase FLASH[%s] -%d sectors:", dev->name, dev->sectors);
-      for (sect = s_first; sect<=s_last; sect++) {
-	if (info->protect[sect] == 0) {	/* not protected */
-	  addr = (vu_long*)(dev->base);
-	  /*   printf("erase_sector: sector=%d, addr=0x%x\n",
-	       sect, addr); */
-	  printf(".");
-	  if(ERROR == flashEraseSector(dev, sect)){
-	    printf("ERROR: could not erase sector %d on FLASH[%s]\n",
-		   sect, dev->name);
-	    return 1;
-	  }
+	/* Start erase on unprotected sectors */
+	dev = getFlashDevFromInfo (info);
+	if (dev) {
+		printf ("Erase FLASH[%s] -%d sectors:", dev->name, dev->sectors);
+		for (sect = s_first; sect <= s_last; sect++) {
+			if (info->protect[sect] == 0) {	/* not protected */
+				addr = (vu_long *) (dev->base);
+				/*   printf("erase_sector: sector=%d, addr=0x%x\n",
+				   sect, addr); */
+				printf (".");
+				if (ERROR == flashEraseSector (dev, sect)) {
+					printf ("ERROR: could not erase sector %d on FLASH[%s]\n", sect, dev->name);
+					return 1;
+				}
+			}
+		}
 	}
-      }
-    }
-    printf (" done\n");
-    return 0;
+	printf (" done\n");
+	return 0;
 }
 
 /*-----------------------------------------------------------------------
@@ -833,35 +832,31 @@
  * 1 - write timeout
  * 2 - Flash not erased
  */
-static int
-write_word (flash_info_t *info, ulong dest, ulong data)
+static int write_word (flash_info_t * info, ulong dest, ulong data)
 {
 
-  flash_dev_t* dev = getFlashDevFromInfo(info);
-  int addr = dest - info->start[0];
+	flash_dev_t *dev = getFlashDevFromInfo (info);
+	int addr = dest - info->start[0];
 
-  if (! dev)
-    return 1;
+	if (!dev)
+		return 1;
 
-  if(OK != flashWrite(dev, addr, (char*)&data, sizeof(ulong))){
-    printf("ERROR: could not write to addr=0x%x, data=0x%x\n",
-	   (unsigned int)addr, (unsigned)data);
-    return 1;
-  }
-
-  if((addr % FLASH_SECTOR_SIZE) == 0)
-    printf(".");
-
+	if (OK != flashWrite (dev, addr, (char *) &data, sizeof (ulong))) {
+		printf ("ERROR: could not write to addr=0x%x, data=0x%x\n",
+			(unsigned int) addr, (unsigned) data);
+		return 1;
+	}
 
-  PRINTF("write_word:0x%x, base=0x%x, addr=0x%x, data=0x%x\n",
-	 (unsigned)info->start[0],
-	 (unsigned)dest,
-	 (unsigned)(dest - info->start[0]),
-	 (unsigned)data);
+	if ((addr % FLASH_SECTOR_SIZE) == 0)
+		printf (".");
 
 
+	PRINTF ("write_word:0x%x, base=0x%x, addr=0x%x, data=0x%x\n",
+		(unsigned) info->start[0],
+		(unsigned) dest,
+		(unsigned) (dest - info->start[0]), (unsigned) data);
 
-    return (0);
+	return (0);
 }
 
 
@@ -872,72 +867,72 @@
  * 2 - Flash not erased
  */
 
-int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
+int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
 {
-    ulong cp, wp, data;
-    int i, l, rc;
-    flash_dev_t* dev = getFlashDevFromInfo(info);
+	ulong cp, wp, data;
+	int i, l, rc;
+	flash_dev_t *dev = getFlashDevFromInfo (info);
 
-    if( dev ) {
-      printf("FLASH[%s]:", dev->name);
-      wp = (addr & ~3);	/* get lower word aligned address */
+	if (dev) {
+		printf ("FLASH[%s]:", dev->name);
+		wp = (addr & ~3);	/* get lower word aligned address */
 
-      /*
-       * handle unaligned start bytes
-       */
-      if ((l = addr - wp) != 0) {
-	data = 0;
-	for (i=0, cp=wp; i<l; ++i, ++cp) {
-	  data = (data << 8) | (*(uchar *)cp);
-	}
-	for (; i<4 && cnt>0; ++i) {
-	  data = (data << 8) | *src++;
-	  --cnt;
-	  ++cp;
-	}
-	for (; cnt==0 && i<4; ++i, ++cp) {
-	  data = (data << 8) | (*(uchar *)cp);
-	}
-	if ((rc = write_word(info, wp, data)) != 0) {
-	  return (rc);
-	}
-	wp += 4;
-      }
+		/*
+		 * handle unaligned start bytes
+		 */
+		if ((l = addr - wp) != 0) {
+			data = 0;
+			for (i = 0, cp = wp; i < l; ++i, ++cp) {
+				data = (data << 8) | (*(uchar *) cp);
+			}
+			for (; i < 4 && cnt > 0; ++i) {
+				data = (data << 8) | *src++;
+				--cnt;
+				++cp;
+			}
+			for (; cnt == 0 && i < 4; ++i, ++cp) {
+				data = (data << 8) | (*(uchar *) cp);
+			}
+			if ((rc = write_word (info, wp, data)) != 0) {
+				return (rc);
+			}
+			wp += 4;
+		}
 
-      /*
-       * handle word aligned part
-       */
-      while (cnt >= 4) {
-	data = 0;
-	for (i=0; i<4; ++i) {
-	  data = (data << 8) | *src++;
-	}
-	if ((rc = write_word(info, wp, data)) != 0) {
-	  return (rc);
-	}
-	wp  += 4;
-	cnt -= 4;
-      }
+		/*
+		 * handle word aligned part
+		 */
+		while (cnt >= 4) {
+			data = 0;
+			for (i = 0; i < 4; ++i) {
+				data = (data << 8) | *src++;
+			}
+			if ((rc = write_word (info, wp, data)) != 0) {
+				return (rc);
+			}
+			wp += 4;
+			cnt -= 4;
+		}
 
-      if (cnt == 0) {
-	return (0);
-      }
+		if (cnt == 0) {
+			return (0);
+		}
 
-      /*
-       * handle unaligned tail bytes
-       */
-      data = 0;
-      for (i=0, cp=wp; i<4 && cnt>0; ++i, ++cp) {
-	data = (data << 8) | *src++;
-	--cnt;
-      }
-      for (; i<4; ++i, ++cp) {
-	data = (data << 8) | (*(uchar *)cp);
-      }
+		/*
+		 * handle unaligned tail bytes
+		 */
+		data = 0;
+		for (i = 0, cp = wp; i < 4 && cnt > 0; ++i, ++cp) {
+			data = (data << 8) | *src++;
+			--cnt;
+		}
+		for (; i < 4; ++i, ++cp) {
+			data = (data << 8) | (*(uchar *) cp);
+		}
 
-      return (write_word(info, wp, data));
-    }
-    return 1;
+		return (write_word (info, wp, data));
+	}
+	return 1;
 }
 
 /*-----------------------------------------------------------------------
