#!/bin/sh

source /etc/sysconfig/config
source /etc/sysconfig/helpers/functions

SEED_FILE="/etc/random-seed";
RAND_DEV="/dev/urandom";
MOD_FILE="/etc/modules";
EXTRA_MODULES=/lib/modules/`uname -r`/extra

# this is a list of modules which we load via /etc/modules and
# that can be controlled via the chkconfig utility.  
WATCHDOG_MODULE="dw_wdt"
USB_MODULE="dwc_otg"
SDCARD_MODULE="dwc_msh"

IS_ON=/bin/chkconfig
CONFIG=/var/config

do_modules()
{
	ERR=0
	cat ${MOD_FILE} | \
	while read module
	do
		case ${module} in
			$WATCHDOG_MODULE) 
				CHKDEV="watchdog"
				;;
			$USB_MODULE) 
				CHKDEV="usb"
				;;
			$SDCARD_MODULE) 
				CHKDEV="sdcard"
				;;
			*)
				CHKDEV=
				;;
		esac
		if [ "X$CHKDEV" == "X" ]
		then
			load_module ${module};
			if [ "X$?" != "X0" ]
			then 
				ERR=1
			fi
		else
			if $IS_ON $CHKDEV
			then
				# this will be overwritten if it exist in options file
				MODPARAMS=
				if [ -e ${CONFIG}/${CHKDEV}.options ]
				then
					source ${CONFIG}/${CHKDEV}.options
				fi
				load_module ${module} ${MODPARAMS}
				if [ "X$?" != "X0" ]
				then 
					echo "Error loading module $module"
					ERR=1
				fi
			fi
		fi
	done
}

# a way to at least start/load a module for a device supported by this script
start_device()
{
	ERR=0
	module=
	device=$1
	case ${device} in
		"watchdog") 
			module=$WATCHDOG_MODULE
			;;
		"usb") 
			module=$USB_MODULE
			;;
		"sdcard") 
			module=$SDCARD_MODULE
			;;
		*)
			module=
			;;
	esac
	if [ "X$module" == "X" ]
	then
		echo "ERROR: Unrecognized device: $device"
		ERR=1
	else
		# for now, lets assume device names and chkconfig names match
		CHKDEV=$device
		if $IS_ON $CHKDEV
		then
			# this will be overwritten if it exist in options file
			MODPARAMS=
			if [ -e ${CONFIG}/${CHKDEV}.options ]
			then
				source ${CONFIG}/${CHKDEV}.options
			fi
			load_module ${module} ${MODPARAMS}
			if [ "X$?" != "X0" ]
			then 
				echo "Error loading module $module"
				ERR=1
			fi
		fi
	fi
}

stop_device()
{
	ERR=0
	module=
	device=$1
	maybe_mounted=0
	case ${device} in
		"watchdog") 
			module=$WATCHDOG_MODULE
			;;
		"usb") 
			module=$USB_MODULE
			mount |grep -sq '/dev/sda' 
			if [ $? -eq 0 ]
			then
				maybe_mounted=1
			fi
			;;
		"sdcard") 
			module=$SDCARD_MODULE
			mount |grep -sq '/dev/sda' 
			if [ $? -eq 0 ]
			then
				maybe_mounted=1
			fi
			;;
		*)
			module=
			;;
	esac
	if [ "X$module" == "X" ]
	then
		echo "ERROR: Urecognized device: $device"
		ERR=1
	else
		lsmod | grep -sq ^`echo "$module" |tr '-' '_'`
		if [ $? -eq 0 ]
		then	
			if [ $maybe_mounted -eq 1 ]
			then
				echo "WARNING:  Attempting to unload module for device $device that may have mounted filesystems"
			fi
			rmmod $module
			ERR=$?
		fi
	fi
}

ERR=0;
case "$1" in
    "start")
		if [ $# -eq 2 ]
		then
			start_device $2
		else
			echo -ne "Starting board driver ... ";
			if [ "X${CONFIG_BOARD_TYPE_NAME}" == "X" ]; then
				ERR=7
			else
				load_module board_${CONFIG_BOARD_TYPE_NAME}
				ERR=$?;
			fi
			if [ $((ERR)) -ne 0 ]; then
				echo "ERROR: Failed to load board driver: board_${CONFIG_BOARD_TYPE_NAME}";
				exit 1;
			fi
			echo "done";

			echo -ne "Starting modules in ${MOD_FILE} ... ";
			# going to ignore return code here
			do_modules
			echo "done"
			
			echo -ne "Initializing random generator ... ";
			if [ -f ${SEED_FILE} ]; then
				cat ${SEED_FILE} > ${RAND_DEV};
			fi
			/bin/dd if=${RAND_DEV} of=${SEED_FILE} count=1;
			if [ "X$?" != "X0" ]; then
				echo "failed";
				ERR=2;
			else 
				echo "done"
			fi
		fi
        ;;
    "stop")
		if [ $# -eq 2 ]
		then
			stop_device $2
		else
			echo -ne "Saving random seed ... ";
			/bin/dd if=${RAND_DEV} of=${SEED_FILE} count=1;
			if [ "X$?" != "X0" ]; then
				echo "failed";
				ERR=3;
			else 
				echo "done"
			fi
		fi
        ;;
    *)
        echo "Syntax is $0 start | stop"
        exit 255;
        ;;
esac

exit ${ERR};
