#!/bin/sh

# ensure VCS ON_OFF_CONFIG set correctly from prior FW drivers
# A side
i2cset -y 4 0x70 0x00 0x01 b
i2cset -y 4 0x70 0x02 0x16 b #respond to ENABLE pin
i2cset -y 4 0x70 0x00 0x00 b
# B side
i2cset -y 5 0x70 0x00 0x01 b
i2cset -y 5 0x70 0x02 0x16 b #respond to ENABLE pin
i2cset -y 5 0x70 0x00 0x00 b

# vddio = 1.0V, mdat/sdat PU enabled
i2cset -y 4 0x12 0xFF 0x00 b # VDD/VCS 0
i2cset -y 4 0x12 0x2E 0x03 b # VDD/VCS 0
i2cset -y 4 0x13 0xFF 0x00 b # VDN 0
i2cset -y 4 0x13 0x2E 0x03 b # VDN 0
i2cset -y 5 0x12 0xFF 0x00 b # VDD/VCS 1
i2cset -y 5 0x12 0x2E 0x03 b # VDD/VCS 1
i2cset -y 5 0x13 0xFF 0x00 b # VDN 1
i2cset -y 5 0x13 0x2E 0x03 b # VDN 1

# A side VDDR - set to 1.23V
i2cset -y 4 0x71 0x00 0x01
i2cset -y 4 0x71 0x21 0x3B 0x01 i
i2cset -y 4 0x71 0x00 0x00

# B side VDDR - set to 1.23V
i2cset -y 5 0x71 0x00 0x01
i2cset -y 5 0x71 0x21 0x3B 0x01 i
i2cset -y 5 0x71 0x00 0x00

# VDN A - PGOOD_ON threshold
i2cset -y 4 0x71 0x00 0x00 b # PAGE
i2cset -y 4 0x71 0x5E 0xCD 0x00 i # set to 0.8V

# VDN B - PGOOD_ON threshold
i2cset -y 5 0x71 0x00 0x00 b # PAGE
i2cset -y 5 0x71 0x5E 0xCD 0x00 i # set to 0.8V

# unbind ucd driver to permit i2cset
ucd_retries=5
ucd=

ucdpath="/sys/bus/i2c/drivers/ucd9000"
if [ -e $ucdpath ]
then
  # shellcheck disable=SC2010
  ucd=$(ls -1 $ucdpath | grep 64)
  if [ -n "$ucd" ]
  then
    echo "$ucd" > $ucdpath/unbind
  fi
fi

# make sure VCS ON_OFF_CONFIG set correctly from old FW releases
i2cset -y 11 0x64 0x00 0x0E i
i2cset -y 11 0x64 0x02 0x16 i
i2cset -y 11 0x64 0x00 0x0F i
i2cset -y 11 0x64 0x02 0x16 i

## move memory enables to align with VDN (VDN to VDDR leakage issue)
#GPO_CONFIG_1 (GPIO15) : mem 0 reg enables
i2cset -y 11 0x64 0xF7 0x00 i
i2cset -y 11 0x64 0xF8 0x15 0x6E 0x80 0x08 0x00 0x00 0x00 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 i
#GPO_CONFIG_2 (GPIO7) : mem 1 reg enables
i2cset -y 11 0x64 0xF7 0x01 i
i2cset -y 11 0x64 0xF8 0x15 0x16 0x80 0x08 0x00 0x00 0x20 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 i

# change VDN delays based on UCD MFR_REVISION setting
REV=$(i2cget -y 11 0x64 0x9B i 2|cut -f2 -d' ')
if [ "$REV" = "0x01" ] || [ "$REV" = "0x02" ] ; then
  # use 20ms delay for VDN
  #TON_DELAY rail 8
  i2cset -y 11 0x64 0x00 0x07 i
  i2cset -y 11 0x64 0x60 0x80 0xDA i
  #TON_DELAY rail 9
  i2cset -y 11 0x64 0x00 0x08 i
  i2cset -y 11 0x64 0x60 0x80 0xDA i
else
  # use 70ms delay for VDN
  #TON_DELAY rail 8
  i2cset -y 11 0x64 0x00 0x07 i
  i2cset -y 11 0x64 0x60 0x30 0xEA i
  #TON_DELAY rail 9
  i2cset -y 11 0x64 0x00 0x08 i
  i2cset -y 11 0x64 0x60 0x30 0xEA i
fi

# Raise AVDD +100mV
i2cset -y 11 0x64 0x00 0x09 i # set PAGE
i2cset -y 11 0x64 0xF5 0x81 i # set margin_config
i2cset -y 11 0x64 0x21 0x85 0x33 i # set VOUT_COMMAND

# Increase over-current settings
#VDD A phase current
i2cset -y 4 0x12 0xFF 0x04 b    # set window register high byte to 4
i2cset -y 4 0x12 0x3C 0x80 b    # Set to 64A
#VDD B phase current
i2cset -y 5 0x12 0xFF 0x04 b    # set window register high byte to 4
i2cset -y 5 0x12 0x3C 0x80 b    # Set to 64A
#VDD A master OC fault to 445A
i2cset -y 4 0x70 0x00 0x00 b    # PAGE
i2cset -y 4 0x70 0x46 0x08DE w
# VDD A master OC warn to 326A
i2cset -y 4 0x70 0x4A 0x08A3 w # A308
#VDD B master OC fault to 445A
i2cset -y 5 0x70 0x00 0x00 b    # PAGE
i2cset -y 5 0x70 0x46 0x08DE w
# VDD B master OC warn to 326A
i2cset -y 5 0x70 0x4A 0x08A3 w
#VCS phase current to 30A C/C
i2cset -y 4 0x12 0xFF 0x08 b    # set window register to 8
i2cset -y 4 0x12 0x3C 0x3C b    # 30A
i2cset -y 5 0x12 0xFF 0x08 b    # set window register to 8
i2cset -y 5 0x12 0x3C 0x3C b    # 30A
#VCS master OC to 43A
i2cset -y 4 0x70 0x00 0x01 # PAGE 1
i2cset -y 4 0x70 0x46 0x0816 w # OC to 43A
i2cset -y 5 0x70 0x00 0x01 # PAGE 1
i2cset -y 5 0x70 0x46 0x0816 w # OC to 43A

# re-bind ucd driver only if we unbound it (i.e. ucd has been set with a value)
if [ -e $ucdpath ] && [ -n "$ucd" ]; then
  j=0
  until [ $j -ge $ucd_retries ] || [ -e "$ucdpath/$ucd" ]; do
    j=$((j+1))
    # shellcheck disable=2320
    echo "$ucd" > $ucdpath/bind || ret=$?
    if [ $j -gt 1 ]; then
      echo "rebinding UCD driver. Retry number $j"
      sleep 1
    fi
  done
  if [ ! -e "$ucdpath/$ucd" ]; then exit "$ret"; fi
fi
