# Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: lucianm Exp $
#
# Author:
#   Lucian Muresan <lucianm AT users DOT sourceforge DOT net>
#   based upon code from the vdr-plugin.eclass by
#     Matthias Schwarzott <zzam@gentoo.org>
#     Joerg Bornkessel <hd_brummy@gentoo.org>

# orion5x-kernel.eclass
#

inherit kernel-2

IUSE_ORION_NAS_DEVICES="linkstation_pro_duo linkstation_pro_live linkstation_mini kurobox_pro qnap_ts_109_209 qnap_ts_409 dlink_dns_323 hp_mv2120 ts_78xx_sbc wrt350_v2 terastation_pro_v2 netronix_nh233 maxtor_shared_storage_2"

DEPEND="${DEPEND}
	sys-block/devio
	dev-embedded/u-boot-tools"

PROVIDE="virtual/linux-sources"

MY_MACHINE_TYPE=""
nasdevice_count=0

for nasdevice in ${IUSE_ORION_NAS_DEVICES}; do
	IUSE="${IUSE} orion_nas_devices_${nasdevice}"
done

orion5x-kernel_add_nasdevice() {
	#: ${nasdevice_count:=0}
	: $(( nasdevice_count++ ))

	if [[ ${nasdevice_count} -eq 2 ]]; then
		ewarn
		ewarn "Only one machine type can be patched after building the zImage!"
		ewarn "Please select just one of '${IUSE_ORION_NAS_DEVICES}'!"
		die "Multiple machine types selected"
	fi

	local dev="${1}"
	local desc="device ${dev}"
	if [[ -n "${2}" ]]; then
		desc="${2}"
	fi

	einfo "Will patch the zImage for ${desc}"
	MY_MACHINE_TYPE="${MY_MACHINE_TYPE} ${dev}"
}

orion5x-kernel_patch_help() {
	einfo ""
	einfo ""
	einfo ""
	einfo "You may add your own patches like this:"
	einfo ""
	einfo " - Add the following variable to your /etc/make.conf:"
	einfo "   ORION5X_KERNEL_PATCHES_DIR=\"/path/to/my/patches\""
	einfo ""
	einfo " - Create the following subdirectories inside your local patch directory:"
	einfo "   ${PN}/${PV}"
	einfo ""
	einfo " - Place your patches ending on *.diff or *.patch in the created"
	einfo "   \"${PV}\" directory, together with a file called \"0_list\" in which you"
	einfo "   list them in the order you want them applied."
	einfo ""
}

orion5x-kernel_pkg_setup() {
	kernel-2_pkg_setup

	local nasdevice

	for nasdevice in ${IUSE_ORION_NAS_DEVICES}; do
		if use orion_nas_devices_${nasdevice}; then
			orion5x-kernel_add_nasdevice ${nasdevice}
		fi
	done

	if [[ ${nasdevice_count} -eq 0 ]]; then
		ewarn
		ewarn "You did not select a machine type to be patched after building the zImage!"
		ewarn "Please set 'ORION_NAS_DEVICES' to just one of '${IUSE_ORION_NAS_DEVICES}'!"
		die "No Orion machine type selected"
	fi

	if [ -z "${ORION5X_KERNEL_PATCHES_DIR}" ] ; then
		orion5x-kernel_patch_help
	else
		if ! [ -d "${ORION5X_KERNEL_PATCHES_DIR}/${PN}/${PV}" ] ; then
			orion5x-kernel_patch_help
		fi
	fi
}

orion5x-kernel_apply_local_patches() {
	cd ${S}
	if test -d "${ORION5X_KERNEL_PATCHES_DIR}/${PN}"; then
		echo
		local PATCH_LIST=$(cat ${ORION5X_KERNEL_PATCHES_DIR}/${PN}/${PV}/0_list) 
		einfo "Applying local patches found in"
		einfo "${ORION5X_KERNEL_PATCHES_DIR}:"
#		for LOCALPATCH in ${ORION5X_KERNEL_PATCHES_DIR}/${PN}/${PV}/*.{diff,patch}; do
#			test -f "${LOCALPATCH}" && epatch "${LOCALPATCH}"
#		done
		for LOCALPATCH in ${PATCH_LIST}; do
			cd ${S}
			test -f "${ORION5X_KERNEL_PATCHES_DIR}/${PN}/${PV}/${LOCALPATCH}" && patch -p 1 < "${ORION5X_KERNEL_PATCHES_DIR}/${PN}/${PV}/${LOCALPATCH}"
			#test -f "${ORION5X_KERNEL_PATCHES_DIR}/${PN}/${PV}/${LOCALPATCH}" && epatch "${ORION5X_KERNEL_PATCHES_DIR}/${PN}/${PV}/${LOCALPATCH}"
		done		
	fi
}

orion5x-kernel_generate_mach-type_patch(){
echo "diff --git a/arch/arm/boot/Makefile b/arch/arm/boot/Makefile
index 25f1230..789190e 100644
--- a/arch/arm/boot/Makefile
+++ b/arch/arm/boot/Makefile
@@ -55,6 +55,10 @@ \$(obj)/compressed/vmlinux: \$(obj)/Image FORCE
 
 \$(obj)/zImage:	\$(obj)/compressed/vmlinux FORCE
 	\$(call if_changed,objcopy)
+	devio > foo 'wl 0xe3a01c05,4' 'wl 0xe38110e5,4'
+	cat foo \$(obj)/zImage > zImage.new
+	mv zImage.new \$(obj)/zImage
+	rm foo
 	@echo '  Kernel: \$@ is ready'
 
 endif" > ${WORKDIR}/force_mach-type.patch
}

orion5x-kernel_src_unpack(){

	kernel-2_src_unpack
	orion5x-kernel_apply_local_patches

	# create mach-type patch in the working dir, to modify it according to the
	# set orion nas device
	orion5x-kernel_generate_mach-type_patch

	if use orion_nas_devices_linkstation_pro_live; then
		#devio > foo 'wl 0xe3a01c06,4' 'wl 0xe3811031,4' # Linkstation Pro/Live
		sed -i -e "s:0xe3a01c05,4:0xe3a01c06,4:" ${WORKDIR}/force_mach-type.patch
		sed -i -e "s:0xe38110e5,4:0xe3811031,4:" ${WORKDIR}/force_mach-type.patch
	fi

	#if use orion_nas_devices_kurobox_pro; then
	#nothing to replace for the Kurobox Pro
	#fi

	if use orion_nas_devices_qnap_ts_109_209; then
		#devio > foo 'wl 0xe3a01c06,4' 'wl 0xe381101d,4' # QNAP TS-109/TS-209
		sed -i -e "s:0xe3a01c05,4:0xe3a01c06,4:" ${WORKDIR}/force_mach-type.patch
		sed -i -e "s:0xe38110e5,4:0xe381101d,4:" ${WORKDIR}/force_mach-type.patch
	fi

	if use orion_nas_devices_qnap_ts_409; then
		#devio > foo 'wl 0xe3a01c06,4' 'wl 0xe3811041,4' # QNAP TS-409
		sed -i -e "s:0xe3a01c05,4:0xe3a01c06,4:" ${WORKDIR}/force_mach-type.patch
		sed -i -e "s:0xe38110e5,4:0xe3811041,4:" ${WORKDIR}/force_mach-type.patch
	fi

	if use orion_nas_devices_dlink_dns_323; then
		#devio > foo 'wl 0xe3a01c06,4' 'wl 0xe3811006,4' # D-Link DNS-323
		sed -i -e "s:0xe3a01c05,4:0xe3a01c06,4:" ${WORKDIR}/force_mach-type.patch
		sed -i -e "s:0xe38110e5,4:0xe3811006,4:" ${WORKDIR}/force_mach-type.patch
	fi

	if use orion_nas_devices_hp_mv2120; then
		#devio > foo 'wl 0xe3a01c06,4' 'wl 0xe381109d,4' # HP Media Vault MV2120
		sed -i -e "s:0xe3a01c05,4:0xe3a01c06,4:" ${WORKDIR}/force_mach-type.patch
		sed -i -e "s:0xe38110e5,4:0xe381109d,4:" ${WORKDIR}/force_mach-type.patch
	fi

	if use orion_nas_devices_ts_78xx_sbc; then
		#devio > foo 'wl 0xe3a01c06,4' 'wl 0xe3811074,4' # Technologic Systems TS-78xx SBC
		sed -i -e "s:0xe3a01c05,4:0xe3a01c06,4:" ${WORKDIR}/force_mach-type.patch
		sed -i -e "s:0xe38110e5,4:0xe3811074,4:" ${WORKDIR}/force_mach-type.patch
	fi

	if use orion_nas_devices_maxtor_shared_storage_2; then
		#devio > foo 'wl 0xe3a01c06,4' 'wl 0xe38110e6,4' # Maxtor Shared Storage II (2.6.27)
		sed -i -e "s:0xe3a01c05,4:0xe3a01c06,4:" ${WORKDIR}/force_mach-type.patch
		sed -i -e "s:0xe38110e5,4:0xe38110e6,4:" ${WORKDIR}/force_mach-type.patch
	fi

	if use orion_nas_devices_wrt350_v2; then
		#devio > foo 'wl 0xe3a01c06,4' 'wl 0xe3811061,4' # Linksys WRT350N v2
		sed -i -e "s:0xe3a01c05,4:0xe3a01c06,4:" ${WORKDIR}/force_mach-type.patch
		sed -i -e "s:0xe38110e5,4:0xe3811061,4:" ${WORKDIR}/force_mach-type.patch
	fi

	if use orion_nas_devices_linkstation_pro_duo; then
		#devio > foo 'wl 0xe3a01c07,4' 'wl 0xe3811027,4' # Buffalo Linkstation Pro Duo (Is this right?)
		sed -i -e "s:0xe3a01c05,4:0xe3a01c07,4:" ${WORKDIR}/force_mach-type.patch
		sed -i -e "s:0xe38110e5,4:0xe3811027,4:" ${WORKDIR}/force_mach-type.patch
	fi

	if use orion_nas_devices_linkstation_mini; then
		#devio > foo 'wl 0xe3a01c07,4' 'wl 0xe3811042,4' # Buffalo Linkstation Mini (Is this right?)
		sed -i -e "s:0xe3a01c05,4:0xe3a01c07,4:" ${WORKDIR}/force_mach-type.patch
		sed -i -e "s:0xe38110e5,4:0xe3811042,4:" ${WORKDIR}/force_mach-type.patch
	fi

	if use orion_nas_devices_terastation_pro_v2; then
		#devio > foo 'wl 0xe3a01c06,4' 'wl 0xe3811030,4' # Buffalo TS Pro V2 (not yet supported in Vanilla 2.6.26 as of Aug. 10th, 2008)
		sed -i -e "s:0xe3a01c05,4:0xe3a01c06,4:" ${WORKDIR}/force_mach-type.patch
		sed -i -e "s:0xe38110e5,4:0xe3811030,4:" ${WORKDIR}/force_mach-type.patch
	fi

	if use orion_nas_devices_netronix_nh233; then
		#devio > foo 'wl 0xe3a01c07,4' 'wl 0xe3811065,4' # Netronix NH-233
		sed -i -e "s:0xe3a01c05,4:0xe3a01c07,4:" ${WORKDIR}/force_mach-type.patch
		sed -i -e "s:0xe38110e5,4:0xe3811065,4:" ${WORKDIR}/force_mach-type.patch
	fi

	# finally patch with the correct orion nas device
	epatch ${WORKDIR}/force_mach-type.patch
}

orion5x-kernel_pkg_postinst(){
	postinst_sources
}

EXPORT_FUNCTIONS pkg_setup src_unpack pkg_postinst