#!/bin/bash # Reinitialize the TLV320DAC3100 codec without a full reboot. # Tears down the ALSA driver, resets the codec via i2c, then re-binds # the driver so ALSA comes back fresh. # # Usage: sudo ./reinit-codec.sh set -euo pipefail BUS=1 ADDR=0x18 DRIVER_PATH="/sys/bus/i2c/drivers/tlv320aic31xx-codec" DEVICE="1-0018" w() { i2cset -y $BUS $ADDR "$@"; } echo "=== Reinitializing TLV320DAC3100 ===" # 1. Stop anything using the sound card echo "[1/5] Stopping audio consumers..." if command -v pulseaudio &>/dev/null; then pulseaudio --kill 2>/dev/null || true fi if command -v pipewire &>/dev/null; then systemctl --user stop pipewire pipewire-pulse 2>/dev/null || true fi fuser -k /dev/snd/* 2>/dev/null || true sleep 0.2 # 2. Unbind the kernel driver so it releases the codec echo "[2/5] Unbinding kernel driver..." if [ -e "$DRIVER_PATH/$DEVICE" ]; then echo "$DEVICE" > "$DRIVER_PATH/unbind" sleep 0.3 echo " Driver unbound." else echo " Device not bound, skipping." fi # 3. Software-reset the codec over i2c echo "[3/5] Resetting codec via i2c..." # Select page 0 w 0x00 0x00 # Software reset w 0x01 0x01 sleep 0.5 echo " Codec reset." # 4. Re-bind the kernel driver (it will re-probe and init the codec) echo "[4/5] Re-binding kernel driver..." echo "$DEVICE" > "$DRIVER_PATH/bind" sleep 1 echo " Driver bound." # 5. Restore mixer defaults echo "[5/5] Restoring mixer settings..." sleep 0.5 # Unmute and set sensible defaults via amixer amixer -c0 sset 'DAC' 127 127 2>/dev/null || true amixer -c0 sset 'Speaker Driver' 0 2>/dev/null || true amixer -c0 sset 'Speaker Analog' 100 2>/dev/null || true amixer -c0 sset 'HP Analog' 100 100 2>/dev/null || true amixer -c0 sset 'HP Driver' 0 0 2>/dev/null || true # Restart audio daemons if they were running if command -v pipewire &>/dev/null; then systemctl --user start pipewire pipewire-pulse 2>/dev/null || true fi echo "" echo "=== Codec reinitialized ===" aplay -l 2>/dev/null | grep -A1 "barepiaudio" || echo "(warning: card not visible yet)"