#!/bin/sh
# SPDX-License-Identifier: (GPL-2.0+ OR MIT)
# Copyright (c) 2021 Rockchip Electronics Co., Ltd.

PMUIO2=0
VCCIO1=0
VCCIO3=0
VCCIO4=0
VCCIO5=0
VCCIO6=0
VCCIO7=0

DTS_PMUIO2=0
DTS_VCCIO1=0
DTS_VCCIO3=0
DTS_VCCIO4=0
DTS_VCCIO5=0
DTS_VCCIO6=0
DTS_VCCIO7=0

DTS_NAME=$1.dts.tmp

CheckBckfileRet=0
checklistRst=0
GetVoltageFromDtsVal=0

ShowChecklist()
{
	PMUIO2=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
	"Get the corresponding value from the hardware schematic diagram" 15 60 3 \
	"1800000" "PMUIO2 Supply Power Voltage(uV)" \
	"3000000" "PMUIO2 Supply Power Voltage(uV)" \
	"3300000" "PMUIO2 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
	exitstatus=$?
	if [ $exitstatus != 0 ]; then
		echo "You chose Cancel."
		checklistRst=1
	fi

	VCCIO1=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
	"Get the corresponding value from the hardware schematic diagram" 15 60 3 \
	"1800000" "VCCIO1 Supply Power Voltage(uV)" \
	"3000000" "VCCIO1 Supply Power Voltage(uV)" \
	"3300000" "VCCIO1 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
	exitstatus=$?
	if [ $exitstatus != 0 ]; then
		echo "You chose Cancel."
		checklistRst=1
	fi

	VCCIO3=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
	"Get the corresponding value from the hardware schematic diagram" 15 60 3 \
	"1800000" "VCCIO3 Supply Power Voltage(uV)" \
	"3000000" "VCCIO3 Supply Power Voltage(uV)" \
	"3300000" "VCCIO3 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
	exitstatus=$?
	if [ $exitstatus != 0 ]; then
		echo "You chose Cancel."
		checklistRst=1
	fi

	VCCIO4=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
	"Get the corresponding value from the hardware schematic diagram" 15 60 3 \
	"1800000" "VCCIO4 Supply Power Voltage(uV)" \
	"3000000" "VCCIO4 Supply Power Voltage(uV)" \
	"3300000" "VCCIO4 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
	exitstatus=$?
	if [ $exitstatus != 0 ]; then
		echo "You chose Cancel."
		checklistRst=1
	fi

	VCCIO5=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
	"Get the corresponding value from the hardware schematic diagram" 15 60 3 \
	"1800000" "VCCIO5 Supply Power Voltage(uV)" \
	"3000000" "VCCIO5 Supply Power Voltage(uV)" \
	"3300000" "VCCIO5 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
	exitstatus=$?
	if [ $exitstatus != 0 ]; then
		echo "You chose Cancel."
		checklistRst=1
	fi

	VCCIO6=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
	"Get the corresponding value from the hardware schematic diagram" 15 60 3 \
	"1800000" "VCCIO6 Supply Power Voltage(uV)" \
	"3000000" "VCCIO6 Supply Power Voltage(uV)" \
	"3300000" "VCCIO6 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
	exitstatus=$?
	if [ $exitstatus != 0 ]; then
		echo "You chose Cancel."
		checklistRst=1
	fi

	VCCIO7=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
	"Get the corresponding value from the hardware schematic diagram" 15 60 3 \
	"1800000" "VCCIO7 Supply Power Voltage(uV)" \
	"3000000" "VCCIO7 Supply Power Voltage(uV)" \
	"3300000" "VCCIO7 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
	exitstatus=$?
	if [ $exitstatus != 0 ]; then
		echo "You chose Cancel."
		checklistRst=1
	fi
}

DtsIoDomainVoltageVal=0
DtsIoDomainVoltage()
{
	DtsIoDomainVoltageVal=0
	flags=0
	if [ -f $DTS_NAME ];then
		echo "found $DTS_NAME"
	fi

	supply=$(cat $DTS_NAME \
		| grep $1 \
		| cut -d "&" -f 2 \
		| cut -d ">" -f 1 \
		| tail -n1)

	ldo_str=$(cat $DTS_NAME  \
		| awk 'BEGIN {RS="\n\n+";ORS="\n\n"}/regulator-name/{print $0}' \
		| awk BEGIN{RS=EOF}'{gsub(/\n/," ");print $0}' \
		| grep $supply \
		| awk '{print $2}' \
		| awk -F 'SWITCH_REG' '{print $2}')

	if [ "$ldo_str" != "" ];then
		DtsIoDomainVoltageVal=3300000
	else
		DtsIoDomainVoltageVal=$(cat $DTS_NAME  \
			| awk 'BEGIN {RS="\n\n+";ORS="\n\n"}/regulator-name/{print $0}' \
			| awk BEGIN{RS=EOF}'{gsub(/\n/," ");print $0}' \
			|grep $supply \
			| awk -F 'regulator-max-microvolt' '{print $2}' \
			| cut -d "<" -f 2 \
			| cut -d ">" -f 1)
	fi
}

GetIoDomainVoltageFromDts()
{
	DtsIoDomainVoltage "pmuio2-supply"
	DTS_PMUIO2=$DtsIoDomainVoltageVal
	DtsIoDomainVoltage "vccio1-supply"
	DTS_VCCIO1=$DtsIoDomainVoltageVal
	DtsIoDomainVoltage "vccio3-supply"
	DTS_VCCIO3=$DtsIoDomainVoltageVal
	DtsIoDomainVoltage "vccio4-supply"
	DTS_VCCIO4=$DtsIoDomainVoltageVal
	DtsIoDomainVoltage "vccio5-supply"
	DTS_VCCIO5=$DtsIoDomainVoltageVal
	DtsIoDomainVoltage "vccio6-supply"
	DTS_VCCIO6=$DtsIoDomainVoltageVal
	DtsIoDomainVoltage "vccio7-supply"
	DTS_VCCIO7=$DtsIoDomainVoltageVal
}

CheckVoltageWithBackupfile()
{
	CheckBckfileRet=2
	val=$(cat $DTS_NAME.domain \
			| grep PMUIO2 \
			| cut -d ":" -f 2)
	if [ "$val" != "$DTS_PMUIO2" ];then
		CheckBckfileRet=1
		echo "PMUIO2 Supply Power Voltage has changed!!! please reconfirm!!!"
	fi
	val=$(cat $DTS_NAME.domain \
			| grep VCCIO1 \
			| cut -d ":" -f 2)
	if [ "$val" != "$DTS_VCCIO1" ];then
		CheckBckfileRet=1
		echo "VCCIO1 Supply Power Voltage has changed!!! please reconfirm!!!"
	fi
	val=$(cat $DTS_NAME.domain \
			| grep VCCIO3 \
			| cut -d ":" -f 2)
	if [ "$val" != "$DTS_VCCIO3" ];then
		CheckBckfileRet=1
		echo "VCCIO3 Supply Power Voltage has changed!!! please reconfirm!!!"
	fi
	val=$(cat $DTS_NAME.domain | grep VCCIO4 | cut -d ":" -f 2)
	if [ "$val" != "$DTS_VCCIO4" ];then
		ret=1
		echo "VCCIO4 Supply Power Voltage has changed!!! please reconfirm!!!"
	fi
	val=$(cat $DTS_NAME.domain \
			| grep VCCIO5 \
			| cut -d ":" -f 2)
	if [ "$val" != "$DTS_VCCIO5" ];then
		CheckBckfileRet=1
		echo "VCCIO5 Supply Power Voltage has changed!!! please reconfirm!!!"
	fi
	val=$(cat $DTS_NAME.domain \
			| grep VCCIO6 \
			| cut -d ":" -f 2)
	if [ "$val" != "$DTS_VCCIO6" ];then
		CheckBckfileRet=1
		echo "VCCIO6 Supply Power Voltage has changed!!! please reconfirm!!!"
	fi
	val=$(cat $DTS_NAME.domain \
			| grep VCCIO7 \
			| cut -d ":" -f 2)
	if [ "$val" != "$DTS_VCCIO7" ];then
		CheckBckfileRet=1
		echo "VCCIO7 Supply Power Voltage has changed!!! please reconfirm!!!"
	fi
}

CheckVoltageWithEnter()
{
	checklistRst=0
	if [ $PMUIO2 -ne $DTS_PMUIO2 ];then
		checklistRst=1
		echo "PMUIO2 Supply Power Voltage has changed!!! please reconfirm!!!"
	fi
	if [ $VCCIO1 -ne $DTS_VCCIO1 ];then
		checklistRst=1
		echo "VCCIO1 Supply Power Voltage has changed!!! please reconfirm!!!"
	fi
	if [ $VCCIO3 -ne $DTS_VCCIO3 ];then
		checklistRst=1
		echo "VCCIO3 Supply Power Voltage has changed!!! please reconfirm!!!"
	fi
	if [ $VCCIO4 -ne $DTS_VCCIO4 ];then
		checklistRst=1
		echo "VCCIO4 Supply Power Voltage has changed!!! please reconfirm!!!"
	fi
	if [ $VCCIO5 -ne $DTS_VCCIO5 ];then
		checklistRst=1
		echo "VCCIO5 Supply Power Voltage has changed!!! please reconfirm!!!"
	fi
	if [ $VCCIO6 -ne $DTS_VCCIO6 ];then
		checklistRst=1
		echo "VCCIO6 Supply Power Voltage has changed!!! please reconfirm!!!"
	fi
	if [ $VCCIO7 -ne $DTS_VCCIO7 ];then
		checklistRst=1
		echo "VCCIO7 Supply Power Voltage has changed!!! please reconfirm!!!"
	fi
}

IsRK356x=$(cat $DTS_NAME | grep sdhci@fe310000)
if [ "$IsRK356x" = "" ];then
	echo "is not rk356x"
	exit 0
fi

GetIoDomainVoltageFromDts
if [ -f $DTS_NAME.domain ];then
	CheckVoltageWithBackupfile
fi

if [ "$CheckBckfileRet" != "2" ];then
	ShowChecklist
	CheckVoltageWithEnter
	if [ $checklistRst -eq 0 ]; then
		if [ -f $DTS_NAME.domain ];then
			rm -rf $DTS_NAME.domain
		fi

		echo "PMUIO2 Supply Power Voltage1:$PMUIO2" >> $DTS_NAME.domain
		echo "VCCIO1 Supply Power Voltage1:$VCCIO1" >> $DTS_NAME.domain
		echo "VCCIO3 Supply Power Voltage1:$VCCIO3" >> $DTS_NAME.domain
		echo "VCCIO4 Supply Power Voltage1:$VCCIO4" >> $DTS_NAME.domain
		echo "VCCIO5 Supply Power Voltage1:$VCCIO5" >> $DTS_NAME.domain
		echo "VCCIO6 Supply Power Voltage1:$VCCIO6" >> $DTS_NAME.domain
		echo "VCCIO7 Supply Power Voltage1:$VCCIO7" >> $DTS_NAME.domain
		echo 0
	else
		echo "io-domian  default as:
		    	&pmu_io_domains {
				status = "okay";
				pmuio1-supply = <&vcc3v3_pmu>;
				pmuio2-supply = <&vcc3v3_pmu>;
				vccio1-supply = <&vccio_acodec>;
				vccio3-supply = <&vccio_sd>;
				vccio4-supply = <&vcc_3v3>;
				vccio5-supply = <&vcc_3v3>;
				vccio6-supply = <&vcc_3v3>;
				vccio7-supply = <&vcc_3v3>;
			};
			TODO:
			Need to be modified according to the actual hardware
			for example rk3568-evb:
			&pmu_io_domains {
				status = "okay";
				pmuio1-supply = <&vcc3v3_pmu>;
				pmuio2-supply = <&vcc3v3_pmu>;
				vccio1-supply = <&vccio_acodec>;
				vccio3-supply = <&vccio_sd>;
				vccio4-supply = <&vcc_1v8>;
				vccio5-supply = <&vcc_3v3>;
				vccio6-supply = <&vcc_1v8>;
				vccio7-supply = <&vcc_3v3>;
			};

		io-domain docs:

		Android11 SDK:
		RKDocs/android/Rockchip_Developer_Guide_Android11_SDK_V1.1.2_CN.pdf or newer.

		RK356X Linux SDK:
		docs/RK356X/Rockchip_RK356X_Introduction_IO_Power_Domains_Configuration.pdf
		docs/Common/IO-DOMAIN/Rockchip_Developer_Guide_Linux_IO_DOMAIN_CN.pdf

		"

		exit 1
	fi
fi
