
preinit_set_gpio() {
	# ref package/base-files/files/etc/init.d/gpio_switch
	local gpio_pin="$1"
	local value="$2"

	[ -z "$gpio_pin" ] &&  return 1

	local gpio_path
	if [ -n "$(echo "$gpio_pin" | grep -E "^[0-9]+$")" ]; then
		gpio_path="/sys/class/gpio/gpio${gpio_pin}"

		# export GPIO pin for access
		[ -d "$gpio_path" ] || {
			echo "$gpio_pin" >/sys/class/gpio/export
			# we need to wait a bit until the GPIO appears
			[ -d "$gpio_path" ] || sleep 1
		}

		# direction attribute only exists if the kernel supports changing the
		# direction of a GPIO
		if [ -e "${gpio_path}/direction" ]; then
			# set the pin to output with high or low pin value
			{ [ "$value" = "0" ] && echo "low" || echo "high"; } \
				>"$gpio_path/direction"
		else
			{ [ "$value" = "0" ] && echo "0" || echo "1"; } \
				>"$gpio_path/value"
		fi
	fi
}

preinit_gpio() {
	case $(board_name) in
	easepi,ars4|\
	hinlink,hnas)
		# set GPIO4_A7 to high, deassert SATA PM chip
		preinit_set_gpio 135
	;;
	esac
}

preinit_rebind_drivers() {
	case $(board_name) in
	radxa,e24c)
		# rebind e24c hym8563 if previously bound failed
		[ -e /sys/bus/i2c/drivers/rtc-hym8563/3-0051 ] || { echo "3-0051" > /sys/bus/i2c/drivers/rtc-hym8563/bind; }
	;;
	radxa,e54c)
		# rebind e54c hym8563 if previously bound failed
		[ -e /sys/bus/i2c/drivers/rtc-hym8563/4-0051 ] || { echo "4-0051" > /sys/bus/i2c/drivers/rtc-hym8563/bind; }
	;;
	radxa,e52c)
		# rebind e52c hym8563 if previously bound failed
		[ -e /sys/bus/i2c/drivers/rtc-hym8563/5-0051 ] || { echo "5-0051" > /sys/bus/i2c/drivers/rtc-hym8563/bind; }
	;;
	esac
}

boot_hook_add preinit_main preinit_gpio
boot_hook_add preinit_main preinit_rebind_drivers
