#!/bin/sh

# Copyright (C) 2010 - 2022 Xilinx, Inc.  All rights reserved.
# Copyright (C) 2022 Advanced Micro Devices, Inc.  All Rights Reserved
# SPDX-License-Identifier: MIT

error(){ echo "ERROR: $*" >&2 && exit 1; }

usage(){ echo "Usage: $0 {--on|--off|--status}" && exit; }

[ $# -ne 1 ] && usage

command -v i2ctransfer > /dev/null || error "Command not found: i2ctransfer"

i2c_name="Cadence I2C at ff030000"

for device in /sys/bus/i2c/devices/*; do 
    if [ "$(cat "${device}/name")" = "${i2c_name}" ]; then
        i2c_bus_num=${device#/sys/bus/i2c/devices/i2c-}
    fi
done
[ -z "${i2c_bus_num}" ] && error "Unable to get i2c bus number" 

case $1 in
    --on ) # Write '0x3E' to PL sequencer power register for PL switch on
        i2ctransfer -y -f "${i2c_bus_num}" w2@0x68 0x08 0x3E
	# PMU call for PL node request
        time echo pm_request_node 69 > /sys/kernel/debug/zynqmp-firmware/pm ;;
        
    --off ) # PMU call for PL node release
        time echo pm_release_node 69 > /sys/kernel/debug/zynqmp-firmware/pm
	# Write '0x00' to PL sequencer power register for PL switch off
        i2ctransfer -y -f "${i2c_bus_num}" w2@0x68 0x08 0x00 ;;

    --status ) # Read PL sequencer power register
        state=$(i2ctransfer -y -f "${i2c_bus_num}" w1@0x68 0xF5 r1@0x68)
        case ${state} in
            0x04 ) echo "PL is off" ;;
            0x9a ) echo "PL is on" ;;
            *) error "Unknown state: ${state}"
        esac ;;

    *) usage
esac
