Support for LinkStation / KuroBox HD and HG PPC models

This patch is based on the port by Mihai Georgian (see linkstation.c for
Copyright information) and implements support for LinkStation / KuroBox HD
and HG PPC models from Buffalo Technology, whereby HD is deactivated at
the moment, pending network driver fixing.

Notice to users: this is pretty much a barebone port. Support for network
on HG models is already in the U-Boot mainline, but you might also want
patches to switch fan / phy modes depending on the negotiated ethernet
parameters. This patch also doesn't support console switching, booting EM
mode, Buffalo specific ext2 magic number. So, if you want to use any of
those, you need additional patches. Otherwise this patche provides a fully
functional u-boot with a network console on your system.

Signed-off-by: Guennadi Liakhovetski <lg@denx.de>
diff --git a/board/linkstation/hwctl.c b/board/linkstation/hwctl.c
new file mode 100644
index 0000000..9db128a
--- /dev/null
+++ b/board/linkstation/hwctl.c
@@ -0,0 +1,135 @@
+/*
+ * hwctl.c
+ *
+ * LinkStation HW Control Driver
+ *
+ * Copyright (C) 2001-2004  BUFFALO INC.
+ *
+ * This software may be used and distributed according to the terms of
+ * the GNU General Public License (GPL), incorporated herein by reference.
+ * Drivers based on or derived from this code fall under the GPL and must
+ * retain the authorship, copyright and license notice.  This file is not
+ * a complete program and may only be used when the entire operating
+ * system is licensed under the GPL.
+ *
+ */
+
+#include <config.h>
+#include <common.h>
+#include <command.h>
+#include <asm/io.h>
+
+#define mdelay(n)	udelay((n)*1000)
+
+#define AVR_PORT CFG_NS16550_COM2
+
+/* 2005.5.10 BUFFALO add */
+/*--------------------------------------------------------------*/
+static inline void miconCntl_SendUart(unsigned char dat)
+{
+	out_8((char *)AVR_PORT, dat);
+	mdelay(1);
+}
+
+/*--------------------------------------------------------------*/
+void miconCntl_SendCmd(unsigned char dat)
+{
+	int i;
+
+	for (i=0; i<4; i++){
+		miconCntl_SendUart(dat);
+	}
+}
+
+/*--------------------------------------------------------------*/
+void miconCntl_FanLow(void)
+{
+#ifdef CONFIG_HTGL
+	miconCntl_SendCmd(0x5C);
+#endif
+}
+
+/*--------------------------------------------------------------*/
+void miconCntl_FanHigh(void)
+{
+#ifdef CONFIG_HTGL
+	miconCntl_SendCmd(0x5D);
+#endif
+}
+
+/*--------------------------------------------------------------*/
+/* 1000Mbps */
+void miconCntl_Eth1000M(int up)
+{
+#ifdef CONFIG_HTGL
+	if (up)
+		miconCntl_SendCmd(0x93);
+	else
+		miconCntl_SendCmd(0x92);
+#else
+	if (up)
+		miconCntl_SendCmd(0x5D);
+	else
+		miconCntl_SendCmd(0x5C);
+#endif
+}
+
+/*--------------------------------------------------------------*/
+/* 100Mbps */
+void miconCntl_Eth100M(int up)
+{
+#ifdef CONFIG_HTGL
+	if (up)
+		miconCntl_SendCmd(0x91);
+	else
+		miconCntl_SendCmd(0x90);
+#else
+	if (up)
+		miconCntl_SendCmd(0x5C);
+#endif
+}
+
+/*--------------------------------------------------------------*/
+/* 10Mbps */
+void miconCntl_Eth10M(int up)
+{
+#ifdef CONFIG_HTGL
+	if (up)
+		miconCntl_SendCmd(0x8F);
+	else
+		miconCntl_SendCmd(0x8E);
+#else
+	if (up)
+		miconCntl_SendCmd(0x5C);
+#endif
+}
+
+/*--------------------------------------------------------------*/
+/*  */
+void miconCntl_5f(void)
+{
+	miconCntl_SendCmd(0x5F);
+	mdelay(100);
+}
+
+/*--------------------------------------------------------------*/
+/* "reboot start" signal */
+void miconCntl_Reboot(void)
+{
+	miconCntl_SendCmd(0x43);
+}
+
+/*--------------------------------------------------------------*/
+/* Disable watchdog timer */
+void miconCntl_DisWDT(void)
+{
+	miconCntl_SendCmd(0x41); /* A */
+	miconCntl_SendCmd(0x46); /* F */
+	miconCntl_SendCmd(0x4A); /* J */
+	miconCntl_SendCmd(0x3E); /* > */
+	miconCntl_SendCmd(0x56); /* V */
+	miconCntl_SendCmd(0x3E); /* > */
+	miconCntl_SendCmd(0x5A); /* Z */
+	miconCntl_SendCmd(0x56); /* V */
+	miconCntl_SendCmd(0x4B); /* K */
+}