Blackfin: bf533-stamp: split and cleanup CF/IDE code

Give the CF/IDE code its own file to keep things cleanly separated.  While
we're here, clean up the code to use common functions.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
diff --git a/board/bf533-stamp/Makefile b/board/bf533-stamp/Makefile
index dbba12b..832037b 100644
--- a/board/bf533-stamp/Makefile
+++ b/board/bf533-stamp/Makefile
@@ -30,6 +30,7 @@
 LIB	= $(obj)lib$(BOARD).a
 
 COBJS-y	:= $(BOARD).o
+COBJS-$(CONFIG_STAMP_CF) += ide-cf.o
 COBJS-$(CONFIG_VIDEO) += video.o
 
 SRCS	:= $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
diff --git a/board/bf533-stamp/bf533-stamp.c b/board/bf533-stamp/bf533-stamp.c
index 7a63c52..4abad08 100644
--- a/board/bf533-stamp/bf533-stamp.c
+++ b/board/bf533-stamp/bf533-stamp.c
@@ -62,118 +62,11 @@
 /* miscellaneous platform dependent initialisations */
 int misc_init_r(void)
 {
-	int i;
-	int cf_stat = 0;
-
-	/* Check whether CF card is inserted */
-	*pFIO_EDGE = FIO_EDGE_CF_BITS;
-	*pFIO_POLAR = FIO_POLAR_CF_BITS;
-	for (i = 0; i < 0x300; i++)
-		asm("nop;");
-
-	if ((*pFIO_FLAG_S) & CF_STAT_BITS) {
-		cf_stat = 0;
-	} else {
-		cf_stat = 1;
-	}
-
-	*pFIO_EDGE = FIO_EDGE_BITS;
-	*pFIO_POLAR = FIO_POLAR_BITS;
-
-	if (cf_stat) {
-		printf("Booting from COMPACT flash\n");
-
-		for (i = 0; i < 0x1000; i++)
-			asm("nop;");
-		for (i = 0; i < 0x1000; i++)
-			asm("nop;");
-		for (i = 0; i < 0x1000; i++)
-			asm("nop;");
-
-		serial_setbrg();
-		ide_init();
-
-		setenv("bootargs", "");
-		setenv("bootcmd",
-		       "fatload ide 0:1 0x1000000 uImage-stamp;bootm 0x1000000;bootm 0x20100000");
-	} else {
-		printf("Booting from FLASH\n");
-	}
-
-	return 0;
-}
-#endif
-
 #ifdef CONFIG_STAMP_CF
-
-void cf_outb(unsigned char val, volatile unsigned char *addr)
-{
-	/*
-	 * Set PF1 PF0 respectively to 0 1 to divert address
-	 * to the expansion memory banks
-	 */
-	*pFIO_FLAG_S = CF_PF0;
-	*pFIO_FLAG_C = CF_PF1;
-	SSYNC();
-
-	*(addr) = val;
-	SSYNC();
-
-	/* Setback PF1 PF0 to 0 0 to address external
-	 * memory banks  */
-	*(volatile unsigned short *)pFIO_FLAG_C = CF_PF1_PF0;
-	SSYNC();
-}
-
-unsigned char cf_inb(volatile unsigned char *addr)
-{
-	volatile unsigned char c;
-
-	*pFIO_FLAG_S = CF_PF0;
-	*pFIO_FLAG_C = CF_PF1;
-	SSYNC();
-
-	c = *(addr);
-	SSYNC();
-
-	*pFIO_FLAG_C = CF_PF1_PF0;
-	SSYNC();
-
-	return c;
-}
-
-void cf_insw(unsigned short *sect_buf, unsigned short *addr, int words)
-{
-	int i;
-
-	*pFIO_FLAG_S = CF_PF0;
-	*pFIO_FLAG_C = CF_PF1;
-	SSYNC();
-
-	for (i = 0; i < words; i++) {
-		*(sect_buf + i) = *(addr);
-		SSYNC();
-	}
-
-	*pFIO_FLAG_C = CF_PF1_PF0;
-	SSYNC();
-}
-
-void cf_outsw(unsigned short *addr, unsigned short *sect_buf, int words)
-{
-	int i;
-
-	*pFIO_FLAG_S = CF_PF0;
-	*pFIO_FLAG_C = CF_PF1;
-	SSYNC();
-
-	for (i = 0; i < words; i++) {
-		*(addr) = *(sect_buf + i);
-		SSYNC();
-	}
+	cf_ide_init();
+#endif
 
-	*pFIO_FLAG_C = CF_PF1_PF0;
-	SSYNC();
+	return 0;
 }
 #endif
 
diff --git a/board/bf533-stamp/ide-cf.c b/board/bf533-stamp/ide-cf.c
new file mode 100644
index 0000000..23e786b
--- /dev/null
+++ b/board/bf533-stamp/ide-cf.c
@@ -0,0 +1,90 @@
+/*
+ * CF IDE addon card code
+ *
+ * Enter bugs at http://blackfin.uclinux.org/
+ *
+ * Copyright (c) 2005-2009 Analog Devices Inc.
+ *
+ * Licensed under the GPL-2 or later.
+ */
+
+#include <common.h>
+#include <config.h>
+#include <asm/blackfin.h>
+#include "bf533-stamp.h"
+
+void cf_outb(unsigned char val, volatile unsigned char *addr)
+{
+	/* "ETHERNET" means the expansion memory banks */
+	swap_to(ETHERNET);
+
+	*addr = val;
+	SSYNC();
+
+	swap_to(FLASH);
+}
+
+unsigned char cf_inb(volatile unsigned char *addr)
+{
+	unsigned char c;
+
+	swap_to(ETHERNET);
+
+	c = *addr;
+	SSYNC();
+
+	swap_to(FLASH);
+
+	return c;
+}
+
+void cf_insw(unsigned short *sect_buf, unsigned short *addr, int words)
+{
+	int i;
+
+	swap_to(ETHERNET);
+
+	for (i = 0; i < words; i++) {
+		*(sect_buf + i) = *addr;
+		SSYNC();
+	}
+
+	swap_to(FLASH);
+}
+
+void cf_outsw(unsigned short *addr, unsigned short *sect_buf, int words)
+{
+	int i;
+
+	swap_to(ETHERNET);
+
+	for (i = 0; i < words; i++) {
+		*addr = *(sect_buf + i);
+		SSYNC();
+	}
+
+	swap_to(FLASH);
+}
+
+void cf_ide_init(void)
+{
+	int i, cf_stat;
+
+	/* Check whether CF card is inserted */
+	bfin_write_FIO_EDGE(FIO_EDGE_CF_BITS);
+	bfin_write_FIO_POLAR(FIO_POLAR_CF_BITS);
+	for (i = 0; i < 0x300; i++)
+		asm volatile("nop;");
+
+	cf_stat = bfin_read_FIO_FLAG_S() & CF_STAT_BITS;
+
+	bfin_write_FIO_EDGE(FIO_EDGE_BITS);
+	bfin_write_FIO_POLAR(FIO_POLAR_BITS);
+
+	if (!cf_stat) {
+		for (i = 0; i < 0x3000; i++)
+			asm volatile("nop;");
+
+		ide_init();
+	}
+}