#!/bin/sh
#===============================================================================
#
#  suspend
#
#  Copyright (C) 2009-2014 by Digi International Inc.
#  All rights reserved.
#
#  This program is free software; you can redistribute it and/or modify it
#  under the terms of the GNU General Public License version 2 as published by
#  the Free Software Foundation.
#
#
#  !Description: suspend system to RAM
#
#===============================================================================

scriptname="$(basename ${0})"
syspower="/sys/power/state"

usage() {
	printf "\nSuspend system to RAM memory\n"
	printf "\nUsage: ${scriptname} [OPTIONS]\n
	-h      Show this help
	\n"
}

suspend_system_time() {
	if [ "$(echo /sys/class/rtc/rtc*)" != "/sys/class/rtc/rtc*" ]; then
		hwclock -w
	fi
}

suspend_interfaces() {
	# 'wlan0' interface on some platforms (ccwmx5xjs, cwme9210, ccardwmx28js)
	# has problems on suspend-resume, so we workaround it by bringing the
	# interface down before suspend and bring it up again after resume.
	# (#35777, #40082)
	if grep -qs '^wlan0' /var/run/ifstate; then
		ifdown wlan0 && up_wlan_on_resume="1"
	fi
}

resume_interfaces() {
	# 'wlan0' interface on some platforms (ccwmx5xjs, cwme9210, ccardwmx28js)
	# has problems on suspend-resume, so we workaround it by bringing the
	# interface down before suspend and bring it up again after resume.
	# (#35777, #40082)
	if ! grep -qs '^wlan0' /var/run/ifstate; then
		[ -n "${up_wlan_on_resume}" ] && ifup wlan0
	fi
}

resume_system_time() {
	if [ "$(echo /sys/class/rtc/rtc*)" != "/sys/class/rtc/rtc*" ]; then
		hwclock -s
	fi
}

while getopts "h" c; do
	case "${c}" in
		h) usage; exit;;
	esac
done

if [ -f "${syspower}" ]; then
	# Pre-suspend actions
	suspend_system_time
	suspend_interfaces

	# Suspend the device
	printf "mem" > ${syspower}
	sleep .5

	# Post-resume actions
	resume_interfaces
	resume_system_time
else
	printf "\n[ERROR] File ${syspower} not found\n\n"
fi
