Implemented writing, not working yet.
diff --git a/board/delta/nand.c b/board/delta/nand.c
index da6430d..ef78e30 100644
--- a/board/delta/nand.c
+++ b/board/delta/nand.c
@@ -46,6 +46,48 @@
 	return 0;
 }
 
+/*
+ * Write buf to the DFC Controller Data Buffer
+ */
+static void delta_write_buf(struct mtd_info *mtd, const u_char *buf, int len)
+{
+	unsigned long bytes_multi = len & 0xfffffffc;
+	unsigned long rest = len & 0x3;
+	unsigned long *long_buf;
+	int i;
+
+	if(bytes_multi) {
+		for(i=0; i<bytes_multi; i+=4) {
+			long_buf = (unsigned long*) &buf[i];
+			NDDB = *long_buf;
+		}
+	}
+	if(rest) {
+		printf("delta_write_buf: ERROR, writing non 4-byte aligned data.\n");
+	}
+	return;
+}
+
+
+/* 
+ * These functions are quite problematic for the DFC. Luckily they are
+ * not used in the current nand code, except for nand_command, which
+ * we've defined our own anyway. The problem is, that we always need
+ * to write 4 bytes to the DFC Data Buffer, but in these functions we
+ * don't know if to buffer the bytes/half words until we've gathered 4
+ * bytes or if to send them straight away.
+ *
+ * Solution: Don't use these with Mona's DFC and complain loudly.
+ */
+static void delta_write_word(struct mtd_info *mtd, u16 word)
+{
+	printf("delta_write_word: WARNING, this function does not work with the Monahans DFC!\n");
+}
+static void delta_write_byte(struct mtd_info *mtd, u_char byte)
+{
+	printf("delta_write_byte: WARNING, this function does not work with the Monahans DFC!\n");
+}
+
 /* The original:
  * static void delta_read_buf(struct mtd_info *mtd, const u_char *buf, int len)
  *
@@ -57,14 +99,14 @@
 
 	/* we have to be carefull not to overflow the buffer if len is
 	 * not a multiple of 4 */
-	unsigned long num_words = len & 0xfffffffc;
+	unsigned long bytes_multi = len & 0xfffffffc;
 	unsigned long rest = len & 0x3;
+	unsigned long *long_buf;
 
 	/* if there are any, first copy multiple of 4 bytes */
-	if(num_words) {
-		for(i=0; i<num_words; i+=4) {
-			unsigned long *long_buf = &buf[i];
-/* 			((unsigned long *) &buf[i]) = NDDB; */
+	if(bytes_multi) {
+		for(i=0; i<bytes_multi; i+=4) {
+			long_buf = (unsigned long*) &buf[i];
 			*long_buf = NDDB;
 		}
 	}
@@ -72,30 +114,22 @@
 	/* ...then the rest */
 	if(rest) {
 		unsigned long rest_data = NDDB;
-		for(j=0;j<rest;j++)
+		for(j=0;j<rest; j++)
 			buf[i+j] = (u_char) ((rest_data>>j) & 0xff);
 	}
 
 	return;
 }
 
-/* global var, too bad */
+static void delta_read_word(struct mtd_info *mtd, u_char byte)
+{
+	printf("delta_write_byte: UNIMPLEMENTED.\n");
+}
+
+/* global var, too bad: mk@tbd: move to ->priv pointer */
 static unsigned long read_buf = 0;
 static unsigned char bytes_read = 0;
 
-/* wait for read request */
-static void delta_wait_event(unsigned long event)
-{
-	if(!event)
-		return;
-	
-	while(1) {
-		if(NDSR & event) {
-			NDSR |= event;
-			break;
-		}
-	}
-}
 static u_char delta_read_byte(struct mtd_info *mtd)
 {
 /* 	struct nand_chip *this = mtd->priv; */
@@ -113,16 +147,50 @@
 	return byte;
 }
 
+/* delay function */
+static void wait(unsigned long us)
+{
+#define OSCR_CLK_FREQ 3.250 /* kHz */
+
+	unsigned long start = OSCR;
+	unsigned long delta = 0, cur;
+	us *= OSCR_CLK_FREQ;
+
+	while (delta < us) {
+		cur = OSCR;
+		if(cur < start) /* OSCR overflowed */
+			delta = cur + (start^0xffffffff);
+		else
+			delta = cur - start;
+	}
+}
+
+/* poll the NAND Controller Status Register for event */
+static void delta_wait_event(unsigned long event)
+{
+	if(!event)
+		return;
+	
+	while(1) {
+		if(NDSR & event) {
+			NDSR |= event;
+			break;
+		}
+	}
+}
+
 /* this is really monahans, not board specific ... */
 static void delta_cmdfunc(struct mtd_info *mtd, unsigned command, 
 			  int column, int page_addr)
 {
 	/* register struct nand_chip *this = mtd->priv; */
 	unsigned long ndcb0=0, ndcb1=0, ndcb2=0, event=0;
+	unsigned long what_the_hack;
 
 	/* clear the ugly byte read buffer */
 	bytes_read = 0;
 	read_buf = 0;
+
 	
 	/* Clear NDSR */
 	NDSR = 0xFFF;
@@ -160,29 +228,76 @@
 		event = NDSR_RDDREQ;
 		break;
 	case NAND_CMD_PAGEPROG:
+		printk("delta_cmdfunc: NAND_CMD_PAGEPROG.\n");
+		ndcb0 = (NAND_CMD_PAGEPROG | (1 << 21));
 		break;
 	case NAND_CMD_ERASE1:
 	case NAND_CMD_ERASE2:
+		printf("delta_cmdfunc: NAND_CMD_ERASEx unimplemented.\n");
 		break;
 	case NAND_CMD_SEQIN:
-		ndcb0 = (NAND_CMD_SEQIN<<8) | (1<<19) | (4<<16);
-		if(column >= mtd->oobblock) {
-			/* OOB area */
-			column -= mtd->oobblock;
-			ndcb0 |= NAND_CMD_READOOB;
-		} else if (column < 256) {
-			/* First 256 bytes --> READ0 */
-			ndcb0 |= NAND_CMD_READ0;
-		} else {
-			/* Only for 8 bit devices - not delta!!! */
-			column -= 256;
-			ndcb0 |= NAND_CMD_READ1;
-		}
+		/* send PAGE_PROG command(0x80) */
+		printf("delta_cmdfunc: NAND_CMD_SEQIN/PAGE_PROG.\n");
+		ndcb0 = (NAND_CMD_SEQIN | (1<<21) | (3<<16));
+		column >>= 1; /* adjust for 16 bit bus */
+		ndcb1 = (((column>>1) & 0xff) |
+			 ((page_addr<<8) & 0xff00) |
+			 ((page_addr<<8) & 0xff0000) |
+			 ((page_addr<<8) & 0xff000000)); /* make this 0x01000000 ? */
+		event = NDSR_WRDREQ;
 		break;
+/* 	case NAND_CMD_SEQIN_pointer_operation: */
+
+/* 		/\* This is confusing because the command names are */
+/* 		 * different compared to the ones in the K9K12Q0C */
+/* 		 * datasheet. Infact this has nothing to do with */
+/* 		 * reading, as the but with page programming */
+/* 		 * (writing). */
+/* 		 * Here we send the multibyte commands */
+/* 		 * cmd1=0x00, cmd2=0x80 (for programming main area) or */
+/* 		 * cmd1=0x50, cmd2=0x80 (for spare area) */
+/* 		 * */
+/* 		 * When all data is written to the buffer, the page */
+/* 		 * program command (0x10) is sent to actually write */
+/* 		 * the data. */
+/* 		 *\/ */
+
+/* 		printf("delta_cmdfunc: NAND_CMD_SEQIN pointer op called.\n"); */
+
+/* 		ndcb0 = (NAND_CMD_SEQIN<<8) | (1<<21) | (1<<19) | (4<<16); */
+/* 		if(column >= mtd->oobblock) { */
+/* 			/\* OOB area *\/ */
+/* 			column -= mtd->oobblock; */
+/* 			ndcb0 |= NAND_CMD_READOOB; */
+/* 		} else if (column < 256) { */
+/* 			/\* First 256 bytes --> READ0 *\/ */
+/* 			ndcb0 |= NAND_CMD_READ0; */
+/* 		} else { */
+/* 			/\* Only for 8 bit devices - not delta!!! *\/ */
+/* 			column -= 256; */
+/* 			ndcb0 |= NAND_CMD_READ1; */
+/* 		} */
+/* 		event = NDSR_WRDREQ; */
+/* 		break; */
 	case NAND_CMD_STATUS:
-		return;
+		/* oh, this is not nice. for some reason the real
+		 * status byte is in the second read from the data
+		 * buffer. The hack is to read the first byte right
+		 * here, so the next read access by the nand code
+		 * yields the right one.
+		 */
+		ndcb0 = (NAND_CMD_STATUS | (4<<21));
+		event = NDSR_RDDREQ;
+		NDCB0 = ndcb0;
+		NDCB0 = ndcb1;
+		NDCB0 = ndcb2;
+		delta_wait_event(event);
+		what_the_hack = NDDB;
+		goto end;
+		break;
 	case NAND_CMD_RESET:
-		return;
+		printf("delta_cmdfunc: NAND_CMD_RESET unimplemented.\n");
+		break;
 	default:
 		printk("delta_cmdfunc: error, unsupported command.\n");
 		return;
@@ -194,6 +309,8 @@
 
 	/* wait for event */
 	delta_wait_event(event);
+ end:
+	return;
 }
 
 static void delta_dfc_gpio_init()
@@ -251,23 +368,6 @@
  * Members with a "?" were not set in the merged testing-NAND branch,
  * so they are not set here either.
  */
-void wait(unsigned long us)
-{
-#define OSCR_CLK_FREQ 3.250 /* kHz */
-
-	unsigned long start = OSCR;
-	unsigned long delta = 0, cur;
-	us *= OSCR_CLK_FREQ;
-
-	while (delta < us) {
-		cur = OSCR;
-		if(cur < start) /* OSCR overflowed */
-			delta = cur + (start^0xffffffff);
-		else
-			delta = cur - start;
-	}
-}
-
 void board_nand_init(struct nand_chip *nand)
 {
 	unsigned long tCH, tCS, tWH, tWP, tRH, tRP, tRP_high, tR, tWHR, tAR;
@@ -402,13 +502,17 @@
 	nand->eccmode = NAND_ECC_SOFT;
 	nand->chip_delay = NAND_DELAY_US;
 	nand->options = NAND_BUSWIDTH_16;
+
 	nand->read_byte = delta_read_byte;
+	nand->write_byte = delta_write_byte;
+	nand->read_word = delta_read_word;
+	nand->write_word = delta_write_word;
 	nand->read_buf = delta_read_buf;
+	nand->write_buf = delta_write_buf;
 	nand->cmdfunc = delta_cmdfunc;
-	/* 	nand->options = NAND_SAMSUNG_LP_OPTIONS; */
 }
 
 #else
-#error "U-Boot legacy NAND support not available for delta board."
+ #error "U-Boot legacy NAND support not available for delta board."
 #endif
 #endif