/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates

********************************************************************************
Marvell GPL License Option

If you received this File from Marvell, you may opt to use, redistribute and/or 
modify this File in accordance with the terms and conditions of the General 
Public License Version 2, June 1991 (the "GPL License"), a copy of which is 
available along with the File in the license.txt file or by writing to the Free 
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or 
on the worldwide web at http://www.gnu.org/licenses/gpl.txt. 

THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED 
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY 
DISCLAIMED.  The GPL License provides additional details about this warranty 
disclaimer.

*******************************************************************************/
#include <common.h>
#if defined(CONFIG_CMD_SAR)
#include "cpu/mvCpu.h"
#include "ctrlEnv/mvCtrlEnvLib.h"
#include "ctrlEnv/mvCtrlEnvRegs.h"
#include "boardEnv/mvBoardEnvLib.h"

static	MV_CPU_ARM_CLK cpuDdrL2Tbl[] = MV_CPU_DDR_L2_CLCK_TBL;
static	MV_CPU_ARM_CLK cpuDdrTbl[] = MV6601_CPU_DDR_CLCK_TBL;


static int do_sar_list(int argc, char *argv[])
{
	int i = 0;
	const char *cmd;

	if (argc < 1)
		goto usage;
	cmd = argv[0];
	if (MV_6601_DEV_ID == mvCtrlModelGet()){  /* Avanta-MC*/
		if (strcmp(cmd, "freq") == 0) {
			printf("SatR | cpuClk| ddrClk|\n");
			while(cpuDdrTbl[i].satrValue != (MV_U32) -1) {
				printf(" %3d | %5d | %5d |\n",
						cpuDdrTbl[i].satrValue,
						cpuDdrTbl[i].cpuClk/1000000,
						cpuDdrTbl[i].ddrClk/1000000
						);
				i++;
			}
		}
		if (strcmp(cmd, "sscg") == 0) {
			printf("SSCG Mode:\n");
			printf("\t0 - SSCG enable\n");
			printf("\t1 - SSCG bypass (disable)\n");
		}
		if (strcmp(cmd, "tclk") == 0) {
			printf("TCLK Modes:\n");
			printf("\t0 - 166 Mhz\n");
			printf("\t1 - 200 Mhz\n");
		}
	}
	else { /* KW2 */
		if (strcmp(cmd, "freq") == 0) {
			printf("#\tcpuClk\tddrClk\tl2Clk\n");
			while(cpuDdrL2Tbl[i].satrValue != (MV_U32) -1) {
				printf("%d\t%d\t%d\t%d\n",
						cpuDdrL2Tbl[i].satrValue,
						cpuDdrL2Tbl[i].cpuClk/1000000,
						cpuDdrL2Tbl[i].ddrClk/1000000,
						cpuDdrL2Tbl[i].l2Clk/1000000);
				i++;
			}
		}
		if (strcmp(cmd, "sscg") == 0) {
			printf("SSCG Mode:\n");
			printf("\t0 - SSCG enable\n");
			printf("\t1 - SSCG bypass (disable)\n");
		}
		if (strcmp(cmd, "tclk") == 0) {
			printf("TCLK Modes:\n");
			printf("\t0 - 125 Mhz\n");
			printf("\t1 - 166 Mhz\n");
			printf("\t2 - 200 Mhz\n");
			printf("\t3 - 250 Mhz\n");
		}
		if (strcmp(cmd, "pexclk") == 0) {
			printf("PEX Clock Configuration:\n");
			printf("\t0 - PEX_CLK pins are input pins\n");
			printf("\t1 - PEX_CLK pins are output pins\n");
		}
		if (strcmp(cmd, "pon") == 0) {
			printf("Select EPON or GPON operation mode:\n");
			printf("\t0 - GPON Mode\n");
			printf("\t1 - EPON Mode\n");
		}

		if (strcmp(cmd, "l2exist") == 0) {
			printf("Select L2-Exist mode:\n");
			printf("\t0 - L2 is disabled.\n");
			printf("\t1 - L2 is enabled.\n");
		}
	}

	return 0;
usage:
	printf("Usage: sar list [options] (see help) \n");
	return 1;
}
static int do_sar_read(int argc, char *argv[])
{
	MV_U32 satrValue;

	int i = 0;
	const char *cmd;

	if (argc < 1)
		goto usage;
	cmd = argv[0];
	if (MV_6601_DEV_ID == mvCtrlModelGet()){  /* Avanta-MC*/
		if (strcmp(cmd, "freq") == 0) {
			satrValue = mvBoardFreqGet();

			while(cpuDdrTbl[i].satrValue != (MV_U32) -1) {
				if (satrValue == cpuDdrTbl[i].satrValue){
					printf("Current mode is SatR=%d, CPU=%dMHz, DDR=%dMHz\n",
							cpuDdrTbl[i].satrValue,
							cpuDdrTbl[i].cpuClk / 1000000,
							cpuDdrTbl[i].ddrClk / 1000000);
					break;
				}
				i++;
			}
		}
		if (strcmp(cmd, "freqval") == 0) {
			satrValue = mvBoardFreqGet();

			printf("Current mode is 0x%x.\n", satrValue);
		}
		if (strcmp(cmd, "sscg") == 0) {
			printf("Current SSCG mode is %d\n", mvBoardSSCGGet());
		}
		if (strcmp(cmd, "tclk") == 0) {
			printf("Current TCLK mode is %d\n", mvBoardTClkGet());
		}
	}
	else { /* KW2 */
		if (strcmp(cmd, "freq") == 0) {
			satrValue = mvBoardFreqGet();
			while(cpuDdrL2Tbl[i].satrValue != (MV_U32) -1) {
					if (satrValue == cpuDdrL2Tbl[i].satrValue)
						printf("Current mode is SatR=%d, CPU=%d MHz, DDR=%d MHz, L2=%d MHz.\n",
								cpuDdrL2Tbl[i].satrValue,
								cpuDdrL2Tbl[i].cpuClk / 1000000,
								cpuDdrL2Tbl[i].ddrClk / 1000000,
								cpuDdrL2Tbl[i].l2Clk / 1000000);
					i++;
				}
		}
		if (strcmp(cmd, "freqval") == 0) {
			satrValue = mvBoardFreqGet();
			
			printf("Current mode is 0x%x.\n", satrValue);
		}
		if (strcmp(cmd, "sscg") == 0) {
			printf("Current SSCG mode is %d\n", mvBoardSSCGGet());
		}
		if (strcmp(cmd, "pon") == 0) {
			printf("Current Pon mode is %d\n", mvBoardPonGet());
		}
		if (strcmp(cmd, "pexclk") == 0) {
			printf("Current PEX-0 Clock configuration is %d\n", mvBoardPexClkGet(0));
			printf("Current PEX-1 Clock configuration is %d\n", mvBoardPexClkGet(1));
		}
	
		if (strcmp(cmd, "tclk") == 0) {
			printf("Current TCLK mode is %d\n", mvBoardTClkGet());
		}
	
		if (strcmp(cmd, "l2exist") == 0) {
			printf("Current L2 Exist mode is %d.\n", mvBoardSaRL2ExistGet());
		}
	}

	return 0;
usage:
	printf("Usage: sar read [options] (see help) \n");
	return 1;
}
static int do_sar_write(int argc, char *argv[])
{
	MV_U32 satrValue = (MV_U32) -1;
	MV_U32 cpuClk;
	MV_U32 ddrClk;
	MV_U32 l2Clk;
	MV_U32 temp;
	MV_U32 dev;
	int i = 0;
	const char *cmd;

	if (argc < 2)
		goto usage;
	cmd = argv[0];

	if (MV_6601_DEV_ID == mvCtrlModelGet()){  /* Avanta-MC*/
		if (strcmp(cmd, "freq") == 0) {
			if (argc < 3)
				goto usage;

			cpuClk = simple_strtoul(argv[1], NULL, 10) * 1000000;
			ddrClk = simple_strtoul(argv[2], NULL, 10) * 1000000;

			while(cpuDdrTbl[i].satrValue != (MV_U32) -1) {
				if ((cpuClk == cpuDdrTbl[i].cpuClk) && 
					(ddrClk == cpuDdrTbl[i].ddrClk))
				{
					satrValue = cpuDdrTbl[i].satrValue;
					break;
				}
				i++;
			}
			if (satrValue == (MV_U32) -1)
			{
				printf("Mode not supported!\n");
				return 1;
			}
			if (mvBoardFreqSet(satrValue) != MV_OK)
			{
				printf("Write S@R failed!\n");
				return 1;
			}
			if ((0 == satrValue) || (3 == satrValue)) { /* set tclk to 166Mhz */
				if (mvBoardTClkGet() == 1) 	/* if tclk on 200Mhz*/
					mvBoardTClkSet(0);
			} else {
				if (mvBoardTClkGet() == 0) 	/* if tclk on 166Mhz*/
					mvBoardTClkSet(1);		
			}
		}

		if (strcmp(cmd, "freqval") == 0) {
			if (argc < 2)
				goto usage;

			satrValue = simple_strtoul(argv[1], NULL, 16);

			if (satrValue == (MV_U32) -1) {
				printf("Mode not supported!\n");
				return 1;
			}
			if (mvBoardFreqSet(satrValue) != MV_OK) {
				printf("Write S@R failed!\n");
				return 1;
			}
			if ((0 == satrValue) || (3 == satrValue)) { /* set tclk to 166Mhz */
				if (mvBoardTClkGet() == 1) 	/* if tclk on 200Mhz*/
					mvBoardTClkSet(0);
			} else {
				if (mvBoardTClkGet() == 0) 	/* if tclk on 166Mhz*/
					mvBoardTClkSet(1);		
			}

		}

		if (strcmp(cmd, "sscg") == 0) {
			if (argc < 2)
				goto usage;

			temp = simple_strtoul(argv[1], NULL, 10);
			if ((temp != 0) && (temp != 1))
			{
				printf("Mode not supported!\n");
				return 1;
			}
			if (mvBoardSSCGSet(temp) != MV_OK)
			{
				printf("Write S@R failed!\n");
				return 1;
			}
		}
		if (strcmp(cmd, "tclk") == 0) {
			if (argc < 2)
				goto usage;

			temp = simple_strtoul(argv[1], NULL, 10);
			if ((temp != 0) && (temp != 1))
			{
				printf("Mode not supported!\n");
				return 1;
			}
			if (mvBoardTClkSet(temp) != MV_OK)
			{
				printf("Write S@R failed!\n");
				return 1;
			}
		}
	}
	else {
		if (strcmp(cmd, "freq") == 0) {
			if (argc < 4)
				goto usage;

			cpuClk = simple_strtoul(argv[1], NULL, 10) * 1000000;
			ddrClk = simple_strtoul(argv[2], NULL, 10) * 1000000;
			l2Clk = simple_strtoul(argv[3], NULL, 10) * 1000000;

			while(cpuDdrL2Tbl[i].satrValue != (MV_U32) -1) {
				if ((cpuClk == cpuDdrL2Tbl[i].cpuClk) && (l2Clk == cpuDdrL2Tbl[i].l2Clk) && (ddrClk == cpuDdrL2Tbl[i].ddrClk))
				{
					satrValue = cpuDdrL2Tbl[i].satrValue;
					break;
				}
				i++;
			}
			if (satrValue == (MV_U32) -1)
			{
				printf("Mode not supported!\n");
				return 1;
			}
			if (mvBoardFreqSet(satrValue) != MV_OK)
			{
				printf("Write S@R failed!\n");
				return 1;
			}
		}

		if (strcmp(cmd, "freqval") == 0) {
			if (argc < 2)
				goto usage;

			satrValue = simple_strtoul(argv[1], NULL, 16);

			if (satrValue == (MV_U32) -1) {
				printf("Mode not supported!\n");
				return 1;
			}
			if (mvBoardFreqSet(satrValue) != MV_OK) {
				printf("Write S@R failed!\n");
				return 1;
			}
		}

		if (strcmp(cmd, "sscg") == 0) {
			if (argc < 2)
				goto usage;

			temp = simple_strtoul(argv[1], NULL, 10);
			if ((temp != 0) && (temp != 1))
			{
				printf("Mode not supported!\n");
				return 1;
			}
			if (mvBoardSSCGSet(temp) != MV_OK)
			{
				printf("Write S@R failed!\n");
				return 1;
			}
		}
		if (strcmp(cmd, "pexclk") == 0) {
			if (argc < 2)
				goto usage;
			dev = simple_strtoul(argv[1], NULL, 10);

			temp = simple_strtoul(argv[2], NULL, 10);
			if ((temp != 0) && (temp != 1))
			{
				printf("Mode not supported!\n");
				return 1;
			}

			if (mvBoardPexClkSet(dev, temp) != MV_OK)
			{
				printf("Write S@R failed!\n");
				return 1;
			}
		}
		if (strcmp(cmd, "pon") == 0) {
			if (argc < 2)
				goto usage;

			temp = simple_strtoul(argv[1], NULL, 10);
			if ((temp != 0) && (temp != 1))
			{
				printf("Mode not supported!\n");
				return 1;
			}
			if (mvBoardPonSet(temp) != MV_OK)
			{
				printf("Write S@R failed!\n");
				return 1;
			}
		}
		if (strcmp(cmd, "tclk") == 0) {
			if (argc < 2)
				goto usage;

			temp = simple_strtoul(argv[1], NULL, 10);
			if ((temp < 0) || (temp > 3))
			{
				printf("Mode not supported!\n");
				return 1;
			}
			if (mvBoardTClkSet(temp) != MV_OK)
			{
				printf("Write S@R failed!\n");
				return 1;
			}
		}

		if (strcmp(cmd, "l2exist") == 0) {
			if (argc < 2)
				goto usage;
			temp = simple_strtoul(argv[1], NULL, 10);
			if ((temp != 0) && (temp != 1))
			{
				printf("Mode not supported!\n");
				return 1;
			}

			if (mvBoardSaRL2ExistSet(temp) != MV_OK) {
				printf("Write S@R failed.\n");
				return 1;
			}
		}
	}

	return 0;
usage:
	printf("Usage: sar write [options] (see help) \n");
	return 1;
}
int do_sar(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
{
	const char *cmd;

	/* need at least two arguments */
	if (argc < 2)
		goto usage;

	cmd = argv[1];

	if (strcmp(cmd, "list") == 0)
		return do_sar_list(argc - 2, argv + 2);
	if (strcmp(cmd, "write") == 0) {
		if (do_sar_write(argc - 2, argv + 2) == 0)
			do_sar_read(argc - 2, argv + 2);
		return 0;
	}
	if (strcmp(cmd, "read") == 0)
		return do_sar_read(argc - 2, argv + 2);

usage:
	cmd_usage(cmdtp);
	return 1;
}
#ifdef MV88F6601
U_BOOT_CMD(SatR, 6, 1, do_sar,
	"Sample At Reset sub-system\n",

	"list freq     - prints the S@R modes list\n"
	"SatR list sscg     - prints the SSCG modes list\n"
	"SatR list tclk     - prints the TClk modes list\n"

	"SatR read freq     - read and print the CPU / DDR / L2 frequency\n"
	"SatR read freqval  - read and print the frequency value\n"
	"SatR read sscg     - read and print the SSCG value\n"
	"SatR read tclk     - read and print the TCLK value\n"

	"SatR write freq cpu ddr - write the S@R with cpu and ddr values\n"
	"				  cpu: new CPU clock (in MHz)\n"
	"				  ddr: new DDR clock (in MHz(\n"
	"SatR write freqval <frequency value> - Write new value for CPU / DDR frequency.\n"
	"SatR write sscg <0/1>      - write the SSCG value with 1 or 0\n"
	"SatR write tclk <0/1>      - write the TCLK value with 1 or 0\n"
);
#else

U_BOOT_CMD(SatR, 6, 1, do_sar,
	"Sample At Reset sub-system\n",

	"list freq     - prints the S@R modes list\n"
	"SatR list sscg     - prints the SSCG modes list\n"
	"SatR list pexclk   - prints the PEX Clk modes list\n"
	"SatR list tclk     - prints the TClk modes list\n"
	"SatR list pon      - prints the Pon modes list\n"
	"SatR list l2exist  - prints L2-Exist modes list.\n\n"

	"SatR read freq     - read and print the CPU / DDR / L2 frequency\n"
	"SatR read freqval  - read and print the frequency value\n"
	"SatR read sscg     - read and print the SSCG value\n"
	"SatR read pexclk   - read and print the PEX Clk value\n"
	"SatR read tclk     - read and print the TCLK value\n"
	"SatR read pon      - read and print the Pon type\n"
	"SatR read l2exist  - read and print L2-Exist mode.\n\n"

	"SatR write freq cpu ddr l2 - write the S@R with cpu, l2 and ddr values\n"
	"				  cpu: new CPU clock (in MHz)\n"
	"				  ddr: new DDR clock (in MHz(\n"
	"				  l2:  new L2 clock (in MHz)\n"
	"SatR write freqval <frequency value> - Write new value for CPU / DDR / L2 frequency.\n"
	"SatR write sscg <0/1>      - write the SSCG value with 1 or 0\n"
	"SatR write pexclk <unit 0/1> <0/1>    - write the PEX Clk conf\n"
	"SatR write tclk <0/1/2/3>      - write the TCLK value\n"
	"SatR write pon <0/1> - write the Pon type\n"
	"SatR write l2exist <0/1> - Set L2-Exist mode.\n"
	

);
#endif /* MV88F6601 */
#endif /*defined(CONFIG_CMD_SAR)*/

