#!/bin/bash
set -euo pipefail

CARD_ID="toesaudio"
CARD_NAME="toesaudio"
I2C_BUS="${I2C_BUS:-1}"
CODEC_ADDR="${CODEC_ADDR:-0x18}"
MIC_THSEL_LEVEL="${MIC_THSEL_LEVEL:-high}"
DAC=${1:-127}
DRIVER=${2:-0}
ANALOG=${3:-50}

find_card() {
	awk -v id="$CARD_ID" -v name="$CARD_NAME" '
    index($0, "[" id "]") || index($0, name) { print $1; exit }
  ' /proc/asound/cards
}

codec_ready() {
	i2cget -y -f "$I2C_BUS" "$CODEC_ADDR" 0 >/dev/null 2>&1
}

set_mixer() {
	amixer -q -c "$CARD" "$@" >/dev/null 2>&1 || true
}

set_mic_pins() {
	if ! command -v pinctrl >/dev/null 2>&1; then
		return 0
	fi

	case "$MIC_THSEL_LEVEL" in
	low)
		pinctrl set 8 op pn dl >/dev/null 2>&1 || true
		;;
	*)
		pinctrl set 8 op pn dh >/dev/null 2>&1 || true
		;;
	esac

	pinctrl set 13 ip pn >/dev/null 2>&1 || true
}

CARD=""
for _ in $(seq 1 20); do
	CARD="$(find_card || true)"
	if [ -n "$CARD" ]; then
		break
	fi
	sleep 1
done

if [ -z "$CARD" ]; then
	echo "toesaudio card not present; skipping restore."
	exit 0
fi

for _ in $(seq 1 20); do
	if codec_ready; then
		break
	fi
	sleep 1
done

if ! codec_ready; then
	echo "TLV320 codec not responding on i2c-${I2C_BUS} addr ${CODEC_ADDR}; skipping restore."
	exit 0
fi

set_mic_pins
set_mixer sset 'DAC Left Input' 'Left Data'
set_mixer sset 'DAC Right Input' 'Right Data'
set_mixer sset 'Output Left From Left DAC' on
set_mixer sset 'Output Right From Right DAC' on
set_mixer sset 'Speaker' on
set_mixer sset 'Speaker Driver' "$DRIVER"
set_mixer sset 'Speaker Driver' on
set_mixer sset 'Speaker Analog' "$ANALOG"
set_mixer sset 'DAC' "${DAC},${DAC}"
set_mixer sset 'HP Left' off
set_mixer sset 'HP Right' off
set_mixer sset 'HP Driver' '0,0'
set_mixer sset 'HP Driver' off
