First cut of SpaceCast barebox

b/18887617: This is for the Spacecast barebox which uses the Optimus
board option. It shares most of the Optimus barebox code except for the
defconfig and its own environment.

Change-Id: I06d026c3cb5db68494cc8adb3ec998abf1f1635d
diff --git a/arch/arm/boards/optimus/env_spacecast/bin/_update_help b/arch/arm/boards/optimus/env_spacecast/bin/_update_help
new file mode 100644
index 0000000..f25ec05
--- /dev/null
+++ b/arch/arm/boards/optimus/env_spacecast/bin/_update_help
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+echo "Usage: update [-p partition] [-k [kernel image filename]] [-r [rootfs filename]]"
+echo "Update kernel and/or rootfs over tftp"
+echo ""
+echo "Options"
+echo " -p     choose partition. Use 0 or 1. Default is 0"
+echo " -k     Update kernel. Default filename is kernel.img"
+echo " -r     Update kernel. Default filename is rootfs.img"
+echo ""
+echo "Example"
+echo "# Update kernel and rootfs"
+echo "update -k -r"
diff --git a/arch/arm/boards/optimus/env_spacecast/bin/boot b/arch/arm/boards/optimus/env_spacecast/bin/boot
new file mode 100644
index 0000000..ad2a084
--- /dev/null
+++ b/arch/arm/boards/optimus/env_spacecast/bin/boot
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+if [ -f /env/bin/pre-boot ]; then
+	. /env/bin/pre-boot || exit
+fi
+
+. /default/config
+
+mtdparts="${nor_device}:${nor_parts}"
+bootargs="${bootargs} mtdparts=${mtdparts}"
+bootargs="${bootargs} mac_addr=${eth0.ethaddr},${eth1.ethaddr},${eth2.ethaddr}"
+bootargs="${bootargs} root=$rootpart"
+
+printenv
+echo "Copying kernel.img ..."
+cp /dev/nor0.${kernpart} kernel.img
+#bootm /dev/nor0.${kernpart}
+bootm kernel.img
diff --git a/arch/arm/boards/optimus/env_spacecast/bin/init b/arch/arm/boards/optimus/env_spacecast/bin/init
new file mode 100644
index 0000000..96bac1a
--- /dev/null
+++ b/arch/arm/boards/optimus/env_spacecast/bin/init
@@ -0,0 +1,67 @@
+#!/bin/sh
+
+if [ -f /env/bin/pre-init ]; then
+	. /env/bin/pre-init || exit
+fi
+
+PATH=/default/bin
+export PATH
+
+. /default/config
+
+# fan: 22.5 kHz 50%, 50% spinup (quiet)
+i2c_write -a 0x04c -r 0x4b 0f
+i2c_write -a 0x04c -r 0x4d 08
+i2c_write -a 0x04c -r 0x4c 08
+# enable tachometer so /sys/bus/i2c/devices/0-004c/fan1_input works
+i2c_write -a 0x04c -r 0x03 04
+
+addpart /dev/nor0 $nor_parts
+
+hnvram from /dev/nor0.hnvram
+[ $HNV_MAC_ADDR ] && eth0.ethaddr=$HNV_MAC_ADDR
+[ $HNV_MAC_ADDR_WAN ] && eth1.ethaddr=$HNV_MAC_ADDR_WAN
+
+if [ x$arl  = xfailover ]; then
+  echo "Failing over to other image because antirebootloop=$arl"
+fi
+
+if [ x$HNV_ACTIVATED_KERNEL_NAME = xkernel1 -a x$arl != xfailover ] || [ x$HNV_ACTIVATED_KERNEL_NAME = xkernel0 -a x$arl  = xfailover ]; then
+  kernpart=kernel1
+  rootpart=rootfs1
+else
+  kernpart=kernel0
+  rootpart=rootfs0
+fi
+
+export kernpart
+export rootpart
+
+echo
+echo -n "Hit Ctrl-C to stop autoboot: "
+timeout -c $autoboot_timeout
+if [ $? = 0 ]; then
+	boot
+
+	# If we reach here, the kernel has failed to boot. Try the other kernel.
+	if [ x$HNV_ACTIVATED_KERNEL_NAME = xkernel1 ]; then
+		kernpart=kernel0
+		rootpart=rootfs0
+	else
+		kernpart=kernel1
+		rootpart=rootfs1
+	fi
+	echo
+	echo "ERROR: Unable to boot $HNV_ACTIVATED_KERNEL_NAME!
+		Attempting to boot $kernpart instead."
+	echo
+
+	boot
+	echo 'Autoboot failed.'
+fi
+
+echo
+echo 'Run DHCP client by typing "dhcp" or manually set IP address using'
+echo '  eth1.ipaddr=192.168.1.1'
+echo '  eth1.serverip=192.168.1.2'
+echo
diff --git a/arch/arm/boards/optimus/env_spacecast/bin/nfsboot b/arch/arm/boards/optimus/env_spacecast/bin/nfsboot
new file mode 100644
index 0000000..ceb3f77
--- /dev/null
+++ b/arch/arm/boards/optimus/env_spacecast/bin/nfsboot
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+. /default/config
+
+mtdparts="${nor_device}:${nor_parts}"
+bootargs="${bootargs} mtdparts=${mtdparts}"
+bootargs="${bootargs} mac_addr=${eth0.ethaddr},${eth1.ethaddr},${eth2.ethaddr}"
+bootargs="${bootargs} root=${eth1.serverip}:/mr"
+bootargs="${bootargs} ip=${eth1.ipaddr}::${eth1.gateway}::rg:wan0:off"
+
+tftp gfrg200.img
+bootm gfrg200.img
diff --git a/arch/arm/boards/optimus/env_spacecast/bin/update b/arch/arm/boards/optimus/env_spacecast/bin/update
new file mode 100644
index 0000000..c5aba16
--- /dev/null
+++ b/arch/arm/boards/optimus/env_spacecast/bin/update
@@ -0,0 +1,70 @@
+#!/bin/sh
+
+install_kernel=no
+install_rootfs=no
+kernel_image=kernel.img
+rootfs_image=rootfs.img
+partition=0
+
+while getopt "hk::r::p:" Option
+do
+if [ ${Option} = k ]; then
+	install_kernel=yes
+	if [ -n ${OPTARG} ]; then
+		kernel_image=${OPTARG}
+	fi
+elif [ ${Option} = r ]; then
+	install_rootfs=yes
+	if [ -n ${OPTARG} ]; then
+		rootfs_image=${OPTARG}
+	fi
+elif [ ${Option} = p ]; then
+	if [ x${OPTARG} = x0 ] || [ x${OPTARG} = x1 ]; then
+		partition=${OPTARG}
+	else
+		echo "Invalid parameter for -p"
+		exit 1
+	fi
+else
+	. /default/bin/_update_help
+	exit 0
+fi
+done
+
+if [ x${install_kernel} != xyes ] && [ x${install_rootfs} != xyes ]; then
+	echo "Specify at least one of -k and -r"
+	echo ""
+	. /default/bin/_update_help
+	exit 0
+fi
+
+[ -d /tmp ] || mkdir -p /tmp
+
+kernel_dev=/dev/nor0.kernel${partition}
+rootfs_dev=/dev/nor0.rootfs${partition}
+
+if [ x${install_kernel} = xyes ]; then
+	echo "Downloading kernel image"
+	tftp ${kernel_image} /tmp/kernel.img || exit 1
+	echo "Erasing partition"
+	erase ${kernel_dev} || exit 1
+	echo "Copying kernel image into partition ${kernel_dev}"
+	cp /tmp/kernel.img ${kernel_dev} || exit 1
+	echo "Verifying"
+	crc32 -f /tmp/kernel.img -F ${kernel_dev} || exit 1
+	rm /tmp/kernel.img
+fi
+
+if [ x${install_rootfs} = xyes ]; then
+	echo "ubiattach"
+	ubiattach ${rootfs_dev}
+	echo "Deleting UBI volume rootfs in case it already exists"
+	ubirmvol /dev/ubi0 rootfs
+	echo "Deleting UBI volume rootfs-prep in case it exists"
+	ubirmvol /dev/ubi0 rootfs-prep
+	echo "Creating UBI volume rootfs"
+	ubimkvol /dev/ubi0 rootfs 0 || exit 1
+	echo "TFTPing rootfs into UBI volume"
+	tftp ${rootfs_image} /dev/ubi0.rootfs || exit 1
+fi
+
diff --git a/arch/arm/boards/optimus/env_spacecast/config b/arch/arm/boards/optimus/env_spacecast/config
new file mode 100644
index 0000000..3881b2e
--- /dev/null
+++ b/arch/arm/boards/optimus/env_spacecast/config
@@ -0,0 +1,17 @@
+#!/bin/sh
+ethact eth0
+
+if [ -f /env/ethaddrs ]; then
+	. /env/ethaddrs
+fi
+
+nor_parts="128k(uloader)ro,512k(loader0)ro,512k(loader1)ro,128k(env),2M(hnvram),5M(kernel0),5M(kernel1),25M(rootfs0),25M(rootfs1),-(norreserved0)"
+nor_device="comcertoflash.0"
+
+autoboot_timeout=2
+
+bootargs="console=ttyS0,115200n8"
+
+if [ -f /env/config.local ]; then
+	. /env/config.local
+fi
diff --git a/arch/arm/configs/spacecast_defconfig b/arch/arm/configs/spacecast_defconfig
new file mode 100644
index 0000000..d3b375d
--- /dev/null
+++ b/arch/arm/configs/spacecast_defconfig
@@ -0,0 +1,57 @@
+CONFIG_COMCERTO_BOOTLOADER=y
+CONFIG_TEXT_BASE=0x1000000
+CONFIG_MEMORY_LAYOUT_FIXED=y
+CONFIG_STACK_BASE=0x05000000
+CONFIG_MALLOC_BASE=0x05008000
+CONFIG_MALLOC_SIZE=0x0AFF8000
+CONFIG_EXPERIMENTAL=y
+CONFIG_PROMPT="Barebox-SC >"
+CONFIG_LONGHELP=y
+CONFIG_GLOB=y
+CONFIG_HUSH_GETOPT=y
+CONFIG_CMDLINE_EDITING=y
+CONFIG_AUTO_COMPLETE=y
+CONFIG_MEM_SIZE=y
+CONFIG_PARTITION=y
+CONFIG_DEFAULT_ENVIRONMENT_PATH="arch/arm/boards/optimus/env_spacecast"
+CONFIG_CMD_EDIT=y
+CONFIG_CMD_SAVEENV=y
+CONFIG_CMD_LOADENV=y
+CONFIG_CMD_EXPORT=y
+CONFIG_CMD_PRINTENV=y
+CONFIG_CMD_HNVRAM=y
+CONFIG_CMD_READLINE=y
+# CONFIG_CMD_UPDATE_FAST_SPI is not set
+CONFIG_CMD_LOADB=y
+CONFIG_CMD_LOADY=y
+CONFIG_CMD_MEMINFO=y
+CONFIG_CMD_CRC=y
+CONFIG_CMD_CRC_CMP=y
+CONFIG_CMD_FLASH=y
+CONFIG_CMD_BOOTM_SHOW_TYPE=y
+CONFIG_CMD_RESET=y
+CONFIG_CMD_GO=y
+CONFIG_CMD_OTP_KEY=y
+CONFIG_CMD_OTP_STABILITY_TEST=y
+CONFIG_CMD_TIMEOUT=y
+CONFIG_CMD_PARTITION=y
+CONFIG_CMD_I2C=y
+CONFIG_NET=y
+CONFIG_NET_DHCP=y
+CONFIG_NET_PING=y
+CONFIG_NET_TFTP=y
+CONFIG_NET_TFTP_PUSH=y
+CONFIG_NET_COMCERTO=y
+CONFIG_NET_COMCERTO_2000=y
+CONFIG_I2C=y
+CONFIG_I2C_C2K=y
+CONFIG_DRIVER_CFI=y
+CONFIG_CFI_BUFFER_WRITE=y
+CONFIG_MTD=y
+CONFIG_UBI=y
+CONFIG_DRIVER_OTP=y
+CONFIG_FS_CRAMFS=y
+CONFIG_DIGEST=y
+CONFIG_SHA1=y
+CONFIG_AUTH=y
+CONFIG_RSA_VERIFY=y
diff --git a/arch/arm/mach-comcerto/Makefile b/arch/arm/mach-comcerto/Makefile
index 576f515..1339eb5 100644
--- a/arch/arm/mach-comcerto/Makefile
+++ b/arch/arm/mach-comcerto/Makefile
@@ -1,9 +1,10 @@
 # Object file lists.
 
-obj-y := c2k_start.o clocksource.o lowlevel.o reset.o clkcore.o pad_config.o nand.o
+obj-y := c2k_start.o clocksource.o lowlevel.o reset.o clkcore.o pad_config.o
 #ifndef CONFIG_COMCERTO_NAND_ULOADER
 #obj-y += nor.o
 #endif
+obj-$(CONFIG_NAND_COMCERTO) += nand.o
 obj-$(CONFIG_COMCERTO_DDR) += ddr.o
 obj-$(CONFIG_COMCERTO_DDR_ECC) += mdma.o
 obj-$(CONFIG_COMCERTO_SERDES) += serdes.o