| #!/bin/bash |
| # |
| # PSU hard reset (power cycle) script. |
| # |
| # Power cycle the entire tray by setting the PSU hotswap reset (GPIO218) to high |
| # |
| # Global variable: PSU_HARDRESET_DELAY specifies the number of seconds to wait |
| # before pulling the trigger. If not specified or zero, the script power cycles |
| # immediately. |
| |
| ################################################## |
| # Stop the phosphor-hwmon daemon |
| # Return: |
| # 0 if success, non-zero if error |
| ################################################## |
| stop_phosphor_hwmon() { |
| if (( $# != 0 )); then |
| echo 'Usage: stop_phosphor_hwmon' >&2 |
| return 1 |
| fi |
| |
| echo "Stopping phosphor-hwmon" >&2 |
| local srv='system-xyz.openbmc_project.Hwmon.slice' |
| systemctl stop "${srv}" |
| } |
| |
| main() { |
| # Sleep PSU_HARDRESET_DELAY seconds |
| local psu_delay=$((PSU_HARDRESET_DELAY)) |
| if ((psu_delay > 0)); then |
| echo "Sleeping ${psu_delay} seconds before PSU hard reset!" |
| sleep "${psu_delay}" |
| fi |
| |
| # Stop phosphor-hwmon so that ADM1272 powercycle doesn't happen |
| # in the middle of an i2c transaction and stuck the bus low |
| stop_phosphor_hwmon |
| |
| gpioset gpiochip6 26=1 |
| } |
| |
| # Exit without running main() if sourced |
| return 0 2>/dev/null |
| |
| main "$@" |