#!/bin/sh

# Powers on the cellular modem of the board when it is not on the USB bus yet.

BOARDS=${LIBERUX_MODEM_BOARDS:-/usr/share/liberux-modem-power/boards}
COMPATIBLE=${LIBERUX_MODEM_COMPATIBLE:-/proc/device-tree/compatible}
USBROOT=${LIBERUX_MODEM_USBROOT:-/sys/bus/usb/devices}

find_board()
{
	[ -r "${COMPATIBLE}" ] || return 1
	for name in $(tr '\0' ' ' < "${COMPATIBLE}")
	do
		if [ -f "${BOARDS}/${name}" ]
		then
			echo "${BOARDS}/${name}"
			return 0
		fi
	done
	return 1
}

modem_present()
{
	for d in ${USBROOT}/*
	do
		[ -r "${d}/idVendor" ] || continue
		if [ "$(cat "${d}/idVendor"):$(cat "${d}/idProduct")" = "${USB_ID}" ]
		then
			return 0
		fi
	done
	return 1
}

find_chip()
{
	gpiodetect | sed -n "s/^\(gpiochip[0-9]*\) \[${GPIO_BANK}\].*/\1/p" | head -n 1
}

wait_for_modem()
{
	left=${WAIT_SECONDS}
	while [ "${left}" -gt 0 ]
	do
		modem_present && return 0
		sleep 1
		left=$((left - 1))
	done
	return 1
}

BOARD=$(find_board) || exit 0
. "${BOARD}"

if modem_present
then
	exit 0
fi

CHIP=$(find_chip)
if [ -z "${CHIP}" ]
then
	echo "liberux-modem-power: GPIO bank ${GPIO_BANK} not found" >&2
	exit 0
fi

timeout "${PULSE_SECONDS}" gpioset --chip "${CHIP}" "${GPIO_LINE}=0" > /dev/null 2>&1

if wait_for_modem
then
	echo "liberux-modem-power: modem ${USB_ID} is on the USB bus"
else
	echo "liberux-modem-power: modem ${USB_ID} did not appear in ${WAIT_SECONDS} s" >&2
fi

exit 0
