#!/bin/bash
#
# GPIO pin based device reset commands.
#
# Copyright (c) 2017-2018 by Cisco Systems, Inc.
# All rights reserved.

function addr_init 
{
	local inst=$1
	local lpin=$2
    gpio_base=$( /opt/cisco/calvados/bin/showipu -d | grep "GPIO_${inst}_." | awk '{ print $1 }' | sed -e "s;PA=;0x;" )
	let "lpin_off  = 0x20 * ${lpin} + 0x40"
	let "pin_base_cfg  = $gpio_base + $lpin_off"
	let "pin_base_set  = $gpio_base + $lpin_off + 4"
	let "pin_base_clr  = $gpio_base + $lpin_off + 8"
	let "pin_base_mem  = $gpio_base + $lpin_off + 16"
}

function usage
{
	echo "pin_cmd [show|set|clr|reset] gpio_instance gpio_logical_pin"
}

function run_cmd
{
	case "$1" in
		show)
		pcimemread  $(printf "%x" $pin_base_cfg) 0x20 | grep -v PCI 
		;;
		set)
		pcimemwrite $(printf "%x" $pin_base_set) 4 0x10
		;;
		clr)
		pcimemwrite $(printf "%x" $pin_base_clr) 4 0x10
		;;
		reset)
		pcimemwrite $(printf "%x" $pin_base_clr) 4 0x10
		sleep 3
		pcimemwrite $(printf "%x" $pin_base_set) 4 0x10
		;;
		*)
		usage
		exit 1
	esac
}

if [[ $# != 3 ]]; then
    usage
	exit 1
fi

addr_init $2 $3
run_cmd $1

exit 0


