#
# By Chih-Wei Huang <cwhuang@linux.org.tw>
# Last updated 2009/07/18
#
# License: GNU Public License
# We explicitely grant the right to use the scripts
# with Android-x86 project.
#

# An auto detect function provided by kinneko
auto_detect()
{
	tmp=/tmp/dev2mod
	echo 'dev2mod() { while read dev; do case $dev in' > $tmp
	sort -r /lib/modules/`uname -r`/modules.alias | \
		sed -n 's/^alias  *\([^ ]*\)  *\(.*\)/\1)modprobe \2;;/p' >> $tmp
	echo 'esac; done; }' >> $tmp
	source $tmp
	cat /sys/bus/*/devices/*/modalias | dev2mod
}

# FB0DEV: framebuffer driver
# LANDEV: lan driver
# WIFDEV: wifi driver
# SNDDEV: sound driver
# CAMDEV: camera driver
# PREDEV: any module the drivers depend on but can't be loaded automatically

get_asus_info()
{
	# common for all Eee PC models
	[ -c /dev/fb0 ] || FB0DEV=i915
	PREDEV=snd-hda-codec-realtek
	SNDDEV=snd-hda-intel
	CAMDEV=uvcvideo

	board=`cat /sys/class/dmi/id/product_name`
	# assume Eee PC models
	case "$board" in
		700|701|900)
			LANDEV=atl2
			WIFDEV=ath5k
			;;
		701SD|900SD)
			LANDEV=atl1e
			WIFDEV=rtl8187se
			;;
		900A|904HD|1000HD)
			LANDEV=atl1e
			WIFDEV=ath5k
			;;
		901|1000|1000H)
			LANDEV=atl1e
			WIFDEV=rt2860sta
			;;
		ET1602*)
			FB0DEV=
			UVESA_MODE=${UVESA_MODE:-1366x768}
			LANDEV=r8169
			WIFDEV=rt2860sta
			;;
		T91)
			FB0DEV=
			UVESA_MODE=${UVESA_MODE:-1024x600}
			LANDEV=atl1e
			WIFDEV=ath9k
			;;
		*)
			LANDEV=atl1e
			WIFDEV=ath9k
			;;
	esac
}

get_vbox_info()
{
	LANDEV=pcnet32
	SNDDEV="snd-sb16 isapnp=0 irq=5"
}

get_qemu_info()
{
	LANDEV=8139cp
	SNDDEV=snd-ens1370
}

get_vmware_info()
{
	LANDEV=pcnet32
	SNDDEV=snd-ens1371
}

check_product()
{
	grep -q "$1" /sys/class/dmi/id/uevent
}

detect_hardware()
{
	check_product ASUSTeK && get_asus_info && return 0
	check_product Acer.*AO && get_ao_info && return 0
	check_product VirtualBox && get_vbox_info && return 0
	check_product QEMU && get_qemu_info && return 0
	check_product VMware && get_vmware_info && return 0
}

load_modules()
{
	[ -z "$AUTO" ] && detect_hardware
	if [ $? -eq 0 ]; then
		for m in $PREDEV; do
			modprobe $m
		done
		[ -n "$FB0DEV" -a -z "$UVESA_MODE" ] && modprobe $FB0DEV
		[ -n "$LANDEV" ] && modprobe $LANDEV
		[ -n "$WIFDEV" ] && modprobe $WIFDEV
		[ -n "$SNDDEV" ] && modprobe $SNDDEV
		[ -n "$CAMDEV" ] && modprobe $CAMDEV
	else
		auto_detect
	fi

	mdev -s
	[ -d /proc/asound/card0 ] || modprobe snd-dummy
	[ -c /dev/fb0 ] || modprobe uvesafb mode_option=${UVESA_MODE:-800x600}-16 ${UVESA_OPTION:-mtrr=3 scroll=ywrap}
}
