#!/bin/bash

# Re-probe the IPU7 camera sensor after suspend/hibernate resume.
#
# The OV08X40 sensor connects through a USB-to-I2C bridge (usbio-bridge).
# After resume the ipu_bridge software fwnode graph is gone, leaving the
# sensor driver unable to bind. Removing and rescanning the IPU PCI device
# triggers a fresh probe that recreates the fwnode graph.

IPU_PCI="0000:00:05.0"

case "$1" in
  post)
    (
      # Wait for the USB-I2C bridge to re-enumerate
      for i in $(seq 1 15); do
        if grep -q "OVTI08F4" /sys/bus/i2c/devices/*/name 2>/dev/null; then
          break
        fi
        sleep 1
      done
      sleep 1

      # Unload sensor so the IPU device can be cleanly removed
      modprobe -r ov08x40 2>/dev/null || true

      # Remove and rescan the IPU PCI device to trigger fresh ipu_bridge_init
      echo 1 > "/sys/bus/pci/devices/$IPU_PCI/remove" 2>/dev/null || true
      sleep 1
      echo 1 > /sys/bus/pci/rescan 2>/dev/null || true
      sleep 3

      # Reload sensor driver
      modprobe intel_cvs 2>/dev/null || true
      sleep 2
      modprobe ov08x40 2>/dev/null || true

      # Restart the camera feed service
      for uid_dir in /run/user/*; do
        uid=$(basename "$uid_dir")
        if [[ -S $uid_dir/bus ]]; then
          sudo -u "#$uid" env \
            XDG_RUNTIME_DIR="$uid_dir" \
            DBUS_SESSION_BUS_ADDRESS="unix:path=$uid_dir/bus" \
            systemctl --user restart camera-feed-watch.service 2>/dev/null || true
        fi
      done
    ) &
    disown
    ;;
esac
exit 0
