summaryrefslogtreecommitdiff
path: root/platform/drivers/src/ccm_analog_imx7d.c
diff options
context:
space:
mode:
Diffstat (limited to 'platform/drivers/src/ccm_analog_imx7d.c')
-rw-r--r--platform/drivers/src/ccm_analog_imx7d.c201
1 files changed, 198 insertions, 3 deletions
diff --git a/platform/drivers/src/ccm_analog_imx7d.c b/platform/drivers/src/ccm_analog_imx7d.c
index 3493690..0264202 100644
--- a/platform/drivers/src/ccm_analog_imx7d.c
+++ b/platform/drivers/src/ccm_analog_imx7d.c
@@ -36,6 +36,20 @@
/*FUNCTION**********************************************************************
*
+ * Function Name : CCM_ANALOG_GetArmPllFreq
+ * Description : Get ARM PLL frequency
+ *
+ *END**************************************************************************/
+uint32_t CCM_ANALOG_GetArmPllFreq(CCM_ANALOG_Type * base)
+{
+ if (CCM_ANALOG_IsPllBypassed(base, ccmAnalogPllArmControl))
+ return 24000000ul;
+
+ return 12000000ul * (CCM_ANALOG_PLL_ARM & CCM_ANALOG_PLL_ARM_DIV_SELECT_MASK);
+}
+
+/*FUNCTION**********************************************************************
+ *
* Function Name : CCM_ANALOG_GetSysPllFreq
* Description : Get system PLL frequency
*
@@ -43,12 +57,193 @@
uint32_t CCM_ANALOG_GetSysPllFreq(CCM_ANALOG_Type * base)
{
if (CCM_ANALOG_IsPllBypassed(base, ccmAnalogPll480Control))
- return 24000000;
+ return 24000000ul;
if (CCM_ANALOG_PLL_480 & CCM_ANALOG_PLL_480_DIV_SELECT_MASK)
- return 528000000;
+ return 528000000ul;
+ else
+ return 480000000ul;
+}
+
+/*FUNCTION**********************************************************************
+ *
+ * Function Name : CCM_ANALOG_GetDdrPllFreq
+ * Description : Get DDR PLL frequency
+ *
+ *END**************************************************************************/
+uint32_t CCM_ANALOG_GetDdrPllFreq(CCM_ANALOG_Type * base)
+{
+ uint8_t divSelect, divTestSelect;
+ float factor;
+
+ if (CCM_ANALOG_IsPllBypassed(base, ccmAnalogPllDdrControl))
+ return 24000000ul;
+
+ divSelect = CCM_ANALOG_PLL_DDR_REG(CCM_ANALOG) & CCM_ANALOG_PLL_DDR_DIV_SELECT_MASK;
+ divTestSelect = (CCM_ANALOG_PLL_DDR_REG(CCM_ANALOG) & CCM_ANALOG_PLL_DDR_TEST_DIV_SELECT_MASK) >>
+ CCM_ANALOG_PLL_DDR_TEST_DIV_SELECT_SHIFT;
+
+ switch (divTestSelect)
+ {
+ case 0x0:
+ divTestSelect = 2;
+ break;
+ case 0x1:
+ divTestSelect = 1;
+ break;
+ case 0x2:
+ case 0x3:
+ divTestSelect = 0;
+ break;
+ }
+
+ if (CCM_ANALOG_PLL_DDR_SS_REG(base) & CCM_ANALOG_PLL_DDR_SS_ENABLE_MASK)
+ {
+ factor = ((float)(CCM_ANALOG_PLL_DDR_SS_REG(base) & CCM_ANALOG_PLL_DDR_SS_STEP_MASK)) /
+ ((float)(CCM_ANALOG_PLL_DDR_DENOM_REG(base) & CCM_ANALOG_PLL_DDR_DENOM_B_MASK)) *
+ ((float)(CCM_ANALOG_PLL_DDR_NUM_REG(base) & CCM_ANALOG_PLL_DDR_NUM_A_MASK));
+ return (uint32_t)((24000000ul >> divTestSelect) * (divSelect + factor));
+ }
+ else
+ {
+ return (24000000ul >> divTestSelect) * divSelect;
+ }
+}
+
+/*FUNCTION**********************************************************************
+ *
+ * Function Name : CCM_ANALOG_GetEnetPllFreq
+ * Description : Get Ethernet PLL frequency
+ *
+ *END**************************************************************************/
+uint32_t CCM_ANALOG_GetEnetPllFreq(CCM_ANALOG_Type * base)
+{
+ if (CCM_ANALOG_IsPllBypassed(base, ccmAnalogPllEnetControl))
+ return 24000000ul;
+
+ return 1000000000ul;
+}
+
+/*FUNCTION**********************************************************************
+ *
+ * Function Name : CCM_ANALOG_GetAudioPllFreq
+ * Description : Get Ethernet PLL frequency
+ *
+ *END**************************************************************************/
+uint32_t CCM_ANALOG_GetAudioPllFreq(CCM_ANALOG_Type * base)
+{
+ uint8_t divSelect, divPostSelect, divTestSelect;
+ float factor;
+
+ if (CCM_ANALOG_IsPllBypassed(base, ccmAnalogPllAudioControl))
+ return 24000000ul;
+
+ divSelect = CCM_ANALOG_PLL_AUDIO_REG(CCM_ANALOG) & CCM_ANALOG_PLL_AUDIO_DIV_SELECT_MASK;
+ divPostSelect = (CCM_ANALOG_PLL_AUDIO_REG(CCM_ANALOG) & CCM_ANALOG_PLL_AUDIO_POST_DIV_SEL_MASK) >>
+ CCM_ANALOG_PLL_AUDIO_POST_DIV_SEL_SHIFT;
+ divTestSelect = (CCM_ANALOG_PLL_AUDIO_REG(CCM_ANALOG) & CCM_ANALOG_PLL_AUDIO_TEST_DIV_SELECT_MASK) >>
+ CCM_ANALOG_PLL_AUDIO_TEST_DIV_SELECT_SHIFT;
+
+ switch (divPostSelect)
+ {
+ case 0x0:
+ case 0x2:
+ divPostSelect = 0;
+ break;
+ case 0x1:
+ divPostSelect = 1;
+ break;
+ case 0x3:
+ divPostSelect = 2;
+ break;
+ }
+
+ switch (divTestSelect)
+ {
+ case 0x0:
+ divTestSelect = 2;
+ break;
+ case 0x1:
+ divTestSelect = 1;
+ break;
+ case 0x2:
+ case 0x3:
+ divTestSelect = 0;
+ break;
+ }
+
+ if (CCM_ANALOG_PLL_AUDIO_SS_REG(base) & CCM_ANALOG_PLL_AUDIO_SS_ENABLE_MASK)
+ {
+ factor = ((float)(CCM_ANALOG_PLL_AUDIO_SS_REG(base) & CCM_ANALOG_PLL_AUDIO_SS_STEP_MASK)) /
+ ((float)(CCM_ANALOG_PLL_AUDIO_DENOM_REG(base) & CCM_ANALOG_PLL_AUDIO_DENOM_B_MASK)) *
+ ((float)(CCM_ANALOG_PLL_AUDIO_NUM_REG(base) & CCM_ANALOG_PLL_AUDIO_NUM_A_MASK));
+ return (uint32_t)(((24000000ul >> divTestSelect) >> divPostSelect) * (divSelect + factor));
+ }
+ else
+ {
+ return ((24000000ul >> divTestSelect) >> divPostSelect) * divSelect;
+ }
+}
+
+/*FUNCTION**********************************************************************
+ *
+ * Function Name : CCM_ANALOG_GetVideoPllFreq
+ * Description : Get Ethernet PLL frequency
+ *
+ *END**************************************************************************/
+uint32_t CCM_ANALOG_GetVideoPllFreq(CCM_ANALOG_Type * base)
+{
+ uint8_t divSelect, divPostSelect, divTestSelect;
+ float factor;
+
+ if (CCM_ANALOG_IsPllBypassed(base, ccmAnalogPllVideoControl))
+ return 24000000ul;
+
+ divSelect = CCM_ANALOG_PLL_VIDEO_REG(CCM_ANALOG) & CCM_ANALOG_PLL_VIDEO_DIV_SELECT_MASK;
+ divPostSelect = (CCM_ANALOG_PLL_VIDEO_REG(CCM_ANALOG) & CCM_ANALOG_PLL_VIDEO_POST_DIV_SEL_MASK) >>
+ CCM_ANALOG_PLL_VIDEO_POST_DIV_SEL_SHIFT;
+ divTestSelect = (CCM_ANALOG_PLL_VIDEO_REG(CCM_ANALOG) & CCM_ANALOG_PLL_VIDEO_TEST_DIV_SELECT_MASK) >>
+ CCM_ANALOG_PLL_VIDEO_TEST_DIV_SELECT_SHIFT;
+
+ switch (divPostSelect)
+ {
+ case 0x0:
+ case 0x2:
+ divPostSelect = 0;
+ break;
+ case 0x1:
+ divPostSelect = 1;
+ break;
+ case 0x3:
+ divPostSelect = 2;
+ break;
+ }
+
+ switch (divTestSelect)
+ {
+ case 0x0:
+ divTestSelect = 2;
+ break;
+ case 0x1:
+ divTestSelect = 1;
+ break;
+ case 0x2:
+ case 0x3:
+ divTestSelect = 0;
+ break;
+ }
+
+ if (CCM_ANALOG_PLL_VIDEO_SS_REG(base) & CCM_ANALOG_PLL_VIDEO_SS_ENABLE_MASK)
+ {
+ factor = ((float)(CCM_ANALOG_PLL_VIDEO_SS_REG(base) & CCM_ANALOG_PLL_VIDEO_SS_STEP_MASK)) /
+ ((float)(CCM_ANALOG_PLL_VIDEO_DENOM_REG(base) & CCM_ANALOG_PLL_VIDEO_DENOM_B_MASK)) *
+ ((float)(CCM_ANALOG_PLL_VIDEO_NUM_REG(base) & CCM_ANALOG_PLL_VIDEO_NUM_A_MASK));
+ return (uint32_t)(((24000000ul >> divTestSelect) >> divPostSelect) * (divSelect + factor));
+ }
else
- return 480000000;
+ {
+ return ((24000000ul >> divTestSelect) >> divPostSelect) * divSelect;
+ }
}
/*FUNCTION**********************************************************************