/*******************************************************************************
 *                 2017 Synaptics Incorporated. All Rights Reserved            *
 * THIS CODE CONTAINS CONFIDENTIAL INFORMATION OF Synaptics.                   *
 * NO RIGHTS ARE GRANTED HEREIN UNDER ANY PATENT, MASK WORK RIGHT OR COPYRIGHT *
 * OF Synaptics OR ANY THIRD PARTY. Synaptics RESERVES THE RIGHT AT ITS SOLE   *
 * DISCRETION TO REQUEST THAT THIS CODE BE IMMEDIATELY RETURNED TO Synaptics.  *
 * THIS CODE IS PROVIDED "AS IS". Synaptics MAKES NO WARRANTIES, EXPRESSED,    *
 * IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, COMPLETENESS OR PERFORMANCE.  *
 *                                                                             *
 *******************************************************************************/

#include "diag_pll.h"

int get_vco(unsigned int pllbase)
{
	double vco=0;
	Tvsipll_ctrl pllctrl;
	int n_int, n_frac, m;

	PLL_REG_READ(pllbase, 0, pllctrl.u32[0]);
	PLL_REG_READ(pllbase, 1, pllctrl.u32[1]);
	PLL_REG_GET(pllctrl, DN, n_int);
	PLL_REG_GET(pllctrl, DM, m);
	PLL_REG_GET(pllctrl, FRAC, n_frac);

	double nx = n_int + (double)n_frac / (1 << 24);
	vco = FREF * nx / m;

	return (int)vco;
}

CLOCKO_t get_clocko(unsigned int pllbase)
{
	int bypass;
	CLOCKO_t res;
	int pddp, pddp1, dp, dp1;
	Tvsipll_ctrl pllctrl;

	int vco = get_vco(pllbase);

	PLL_REG_READ(pllbase, 4, pllctrl.u32[4]);
	PLL_REG_GET(pllctrl, BYPASS, bypass);

	if (bypass) {
		res.clocko = FREF;
		res.clocko1 = FREF;
	}
	else {
		PLL_REG_READ(pllbase, 3, pllctrl.u32[3]);
		PLL_REG_GET(pllctrl, PDDP, pddp);
		PLL_REG_GET(pllctrl, PDDP1, pddp1);
		PLL_REG_GET(pllctrl, DP, dp);
		PLL_REG_GET(pllctrl, DP1, dp1);

		res.clocko = pddp == 1 ? 0 : vco / dp;
		res.clocko1 = pddp1 == 1 ? 0 : vco / dp1;
	}

	return res;
}

unsigned int get_pll_base(enum E_PLL_SRC pll)
{
	unsigned int pll_base;

	switch (pll) {
	case DIAG_SYSPLL:
		pll_base = MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_sysPll;
		break;
	case DIAG_CPUPLL:
		pll_base = MEMMAP_CA7_REG_BASE + RA_CPU_WRP_PLL_REG;
		break;
	case DIAG_MEMPLL:
		pll_base = MEMMAP_MCTRLSS_REG_BASE + RA_MC6Ctrl_memPll;
		break;
	default:
		assert(0);
		break;
	}

	return pll_base;
}


CLOCKO_t diag_get_cpupll()
{
	unsigned int pllbase = get_pll_base(DIAG_CPUPLL);

	return get_clocko(pllbase);
}
