/********************************************************************************
 * 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 "Galois_memmap.h"
#include "global.h"
#include "cpu_ca7.h"
#include "MctrlSS.h"
#include "util.h"
#include "lgpl_printf.h"

#define SYSPLL_CTRL_BASE        (MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_sysPll)
#define CPUPLL_CTRL_BASE        (MEMMAP_CA7_REG_BASE + RA_CA7PllReg_PllReg)
#define MEMPLL_CTRL_BASE        (MEMMAP_MCTRLSS_REG_BASE + RA_MctrlSS_memPll)

#define dbg_printf lgpl_printf
#define LIST_ALL_SPEEDS		2

#define PRT_ALL			4

/*const unsigned int memPLL_config[]=
{

	MEMPLL_800_CTL_VAL, 	MEMPLL_800_CTL1_VAL,	MEMPLL_800_CTL2_VAL,	800,
	MEMPLL_1200_CTL_VAL,	MEMPLL_1200_CTL1_VAL,	MEMPLL_1200_CTL2_VAL,	1200,
	MEMPLL_1600_CTL_VAL,	MEMPLL_1600_CTL1_VAL,	MEMPLL_1600_CTL2_VAL,	1600,
	MEMPLL_1800_CTL_VAL,	MEMPLL_1800_CTL1_VAL,	MEMPLL_1800_CTL2_VAL,	1862,

	0xFFFFFFFF

};*/

const float VcoDiv[8] =
{
	1,		/// * 000: 1
	2,		/// * 001: 2
	4,		/// * 010: 4
	8,		/// * 011: 8
	16,		/// * 100: 16
	32,		/// * 101: 32
	64,		/// * 110: 64
	128		/// * 111:128

};
#ifdef PRT_ALL
enum Clocks
{
        CPUFASTREFCLK,
        MEMFASTREFCLK,
        CFGCLK,
        SYSCLK,
        V2GCLK,
        V2GM3CLK,
        G1CORECLK,
        GFX3DCORECLK,
        GFX3DSYSCLK,
        AVIOSYSCLK,
        APPCLK,
        VPPSYSCLK,
        ARCREFCLK,
        HDMIRXCLK,
        PERIFCLK,
        ZSPCLK,
        TSPCLK,
        TSPREFCLK,
        ATBCLK,
        BCMCLK,
        NFCECCCLK,
        SD0CLK,
        USB2TESTCLK,
        SDIO3DLLMSTREFCLK,
        NONCLK,
};

static const char* g_aClocks[] =
{
        "cpufastRefClk",
        "memfastRefClk",
        "cfgClk",
        "sysClk",
        //"v2gClk",
        //"v2gM3Clk",
        "g1CoreClk",
        "gfx3DCoreClk",
        "gfx3DSysClk",
        "avioSysClk",
        //"appClk",
        "vppSysClk",
        "arcRefClk",
        "hdmirxMClk",
        "perifClk",
        //"zspClk",
        "tspClk",
        "tspRefClk",
        "atbClk",
        "bcmClk",
        "nfcEccClk",
        "sd0Clk",
        "usb2TestClk",
        "sdio3DllMstRefClk",
        0
};

static const unsigned int g_aClkOffset[]=
{
        RA_Gbl_cpufastRefClk,
        RA_Gbl_memfastRefClk,
        RA_Gbl_cfgClk,
        RA_Gbl_sysClk,
        //RA_Gbl_v2gClk,
        //RA_Gbl_v2gM3Clk,
        RA_Gbl_g1CoreClk,
        RA_Gbl_gfx3DCoreClk,
        RA_Gbl_gfx3DSysClk,
        RA_Gbl_avioSysClk,
        //RA_Gbl_appClk,
        RA_Gbl_vppSysClk,
        RA_Gbl_arcRefClk,
        RA_Gbl_hdmirxMClk,
        RA_Gbl_perifClk,
        //RA_Gbl_zspClk,
        RA_Gbl_tspClk,
        RA_Gbl_tspRefClk,
        RA_Gbl_atbClk,
        RA_Gbl_bcmClk,
        RA_Gbl_nfcEccClk,
        RA_Gbl_sd0Clk,
        RA_Gbl_usb2TestClk,
        RA_Gbl_sdio3DllMstRefClk
};

const unsigned int clock_divider[] =
{
	1,
	2,
	4,
	6,
	8,
	12,
	1,
	1
};

const char *AVPLL[] =
{
	"AVPllB4",
	"AVPllB5",
	"AVPllB6",
	"AVPllB7",
};
#endif
int speed_cpu = 400;
int mempll_speed;
unsigned int RefClkIn = 25;
unsigned int RefDiv = 2;
float current_freq[2][8];

#ifdef PRT_ALL
unsigned int get_divider(unsigned int D3Switch, unsigned int Switch, unsigned int Select)
{
        unsigned int divider;
        if (D3Switch)
                divider = 3;
        else
        {
                if (!Switch)
                        divider = 1;
                else
                        divider = clock_divider[Select];
        }
        return divider;
}
#endif

void list_speed(int level)
{
 //YH: this needs to be updated for new PLL IP
	unsigned int FbDiv;
	unsigned int vcoDiv_sel_setting;
	Tpll_ctrl	pllCtl;
	unsigned int memPll;
	unsigned int sysPll;
	unsigned int cpuPll;
#ifdef PRT_ALL
        unsigned int sysPll_diff_p;
        unsigned int divider;
        unsigned int D3Switch, Switch, Select;
        unsigned int PllSel;
        TclkD1_ctrl     clkDx;
#endif

	// memPll
	BFM_HOST_Bus_Read32((MEMPLL_CTRL_BASE + RA_pll_ctrl), &pllCtl.u32[0]);
	BFM_HOST_Bus_Read32((MEMPLL_CTRL_BASE + RA_pll_ctrl1), &pllCtl.u32[1]);
	FbDiv = pllCtl.uctrl_FBDIV;
	RefDiv = pllCtl.uctrl_REFDIV;
	vcoDiv_sel_setting = pllCtl.uctrl_CLKOUT_DIFF_DIV_SEL;
	memPll = FbDiv * 4 * RefClkIn / RefDiv;
	memPll = (float)memPll / VcoDiv[vcoDiv_sel_setting];
	mempll_speed=memPll;
	dbg_printf("%20s%20s\t%d\n", "memPll", "frequency", memPll);

	// sysPll
	BFM_HOST_Bus_Read32((SYSPLL_CTRL_BASE + RA_pll_ctrl), &pllCtl.u32[0]);
	BFM_HOST_Bus_Read32((SYSPLL_CTRL_BASE + RA_pll_ctrl1), &pllCtl.u32[1]);
	FbDiv = pllCtl.uctrl_FBDIV;
	RefDiv = pllCtl.uctrl_REFDIV;
	vcoDiv_sel_setting = pllCtl.uctrl_CLKOUT_SE_DIV_SEL;
	sysPll = FbDiv * 4 * RefClkIn / RefDiv;
	sysPll = (float)sysPll / VcoDiv[vcoDiv_sel_setting];
	dbg_printf("%20s%20s\t%d\n", "sysPll", "frequency", sysPll);

	// cpuPll
	BFM_HOST_Bus_Read32((CPUPLL_CTRL_BASE + RA_pll_ctrl), &pllCtl.u32[0]);
	BFM_HOST_Bus_Read32((CPUPLL_CTRL_BASE + RA_pll_ctrl1), &pllCtl.u32[1]);
	FbDiv = pllCtl.uctrl_FBDIV;
	RefDiv = pllCtl.uctrl_REFDIV;
	vcoDiv_sel_setting = pllCtl.uctrl_CLKOUT_SE_DIV_SEL;
	cpuPll = FbDiv * 4 * RefClkIn / RefDiv;
	cpuPll = (float)cpuPll / VcoDiv[vcoDiv_sel_setting];
	dbg_printf("%20s%20s\t%d\n", "cpuPll", "frequency", cpuPll);

#ifdef PRT_ALL
		// DDR
	BFM_HOST_Bus_Read32((MEMMAP_MCTRLSS_REG_BASE + RA_MctrlSS_MC5_4TO1), &cpuPll);
	if (cpuPll & 1)		// 4 to 1
		dbg_printf("%20s%20s\t%d\n", "dClk", "frequency", memPll / 4);
	else				// 2 to 1
		dbg_printf("%20s%20s\t%d\n", "dClk", "frequency", memPll / 2);

		// CPU
	speed_cpu = cpuPll ;

        if (level >= LIST_ALL_SPEEDS)
        {
                int i;
                for (i = 0; g_aClocks[i] != 0 ; i++)
                {
                        BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + g_aClkOffset[i]), &clkDx.u32[0]);
                        D3Switch = clkDx.uctrl_ClkD3Switch;
                        Switch = clkDx.uctrl_ClkSwitch;
                        Select = clkDx.uctrl_ClkSel;
                        divider = get_divider(D3Switch, Switch, Select);
                        PllSel = clkDx.uctrl_ClkPllSel;

                        if (clkDx.uctrl_ClkPllSwitch)
                                if (PllSel < 4)         // AVPLL
                                        dbg_printf("%20s%20s\t%20.0f [%s]\n",
                                                        g_aClocks[i], "frequency", current_freq[1][PllSel + 4] / divider, AVPLL[PllSel]);
                                else                            // sysPll P (differential output)
                                        dbg_printf("%20s%20s\t%d\n", g_aClocks[i], "frequency", sysPll_diff_p / divider);
                        else    // sysPll (single ended output)
                                dbg_printf("%20s%20s\t%d\n", g_aClocks[i], "frequency", sysPll / divider);
                }
        }
#endif
}

