--- /dev/null
+/******************************************************************************
+*
+* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved.
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy
+* of this software and associated documentation files (the "Software"), to deal
+* in the Software without restriction, including without limitation the rights
+* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+* copies of the Software, and to permit persons to whom the Software is
+* furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in
+* all copies or substantial portions of the Software.
+*
+* Use of the Software is limited solely to applications:
+* (a) running on a Xilinx device, or
+* (b) that interact with a Xilinx device through a bus or interconnect.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+* SOFTWARE.
+*
+* Except as contained in this notice, the name of the Xilinx shall not be used
+* in advertising or otherwise to promote the sale, use or other dealings in
+* this Software without prior written authorization from Xilinx.
+*
+******************************************************************************/
+/******************************************************************************/
+/**
+ *
+ * @file xavbuf.c
+ *
+ * This header file contains PLL configuring functions. These Functions
+ * calculates and configures the PLL depending on desired frequency.
+ *
+ * @note None.
+ *
+ * <pre>
+ * MODIFICATION HISTORY:
+ *
+ * Ver Who Date Changes
+ * ----- ---- -------- -----------------------------------------------
+ * 1.0 mh 06/24/17 Initial release.
+ * 2.1 tu 12/29/17 LPD and FPD offsets adjusted
+ * </pre>
+ *
+*******************************************************************************/
+/******************************* Include Files ********************************/
+#include "xavbuf_clk.h"
+
+/**************************** Constant Definitions ****************************/
+/*Input Frequency for the PLL with precision upto two decimals*/
+#define XAVBUF_INPUT_REF_CLK 3333333333
+
+/*Frequency of VCO before divider to meet jitter requirement*/
+#define XAVBUF_PLL_OUT_FREQ 1450000000
+
+/* Precision of Input Ref Frequency for PLL*/
+#define XAVBUF_INPUT_FREQ_PRECISION 100
+
+/* 16 bit fractional shift to get Integer */
+#define XAVBUF_PRECISION 16
+#define XAVBUF_SHIFT_DECIMAL (1 << XAVBUF_PRECISION)
+#define XAVBUF_DECIMAL (XAVBUF_SHIFT_DECIMAL - 1)
+#define XDPSSU_MAX_VIDEO_FREQ 300000000
+
+#define XAVBUF_AUDIO_SAMPLES 512
+#define XAVBUF_AUDIO_SAMPLE_RATE_44_1 44100
+#define XAVBUF_AUDIO_SAMPLE_RATE_48_0 48000
+#define XAVBUF_EXTERNAL_DIVIDER 2
+
+/* Register offsets for address manipulation */
+#define XAVBUF_REG_OFFSET 4
+#define XAVBUF_FPD_CTRL_OFFSET 12
+#define XAVBUF_LPD_CTRL_OFFSET 16
+#define MOD_3(a) ((a) % (3))
+
+/*************************** Constant Variable Definitions ********************/
+/**
+ * This typedef enumerates capacitor resistor and lock values to be programmed.
+ */
+typedef struct{
+ u16 cp;
+ u16 res;
+ u16 lfhf;
+ u16 lock_dly;
+ u16 lock_cnt;
+}PllConfig;
+
+/* PLL fractional divide programming table*/
+static const PllConfig PllFracDivideTable[] = {
+ {3, 5, 3, 63, 1000},
+ {3, 5, 3, 63, 1000},
+ {3, 9, 3, 63, 1000},
+ {3, 9, 3, 63, 1000},
+ {3, 9, 3, 63, 1000},
+ {3, 9, 3, 63, 1000},
+ {3, 14, 3, 63, 1000},
+ {3, 14, 3, 63, 1000},
+ {3, 14, 3, 63, 1000},
+ {3, 14, 3, 63, 1000},
+ {3, 14, 3, 63, 1000},
+ {3, 14, 3, 63, 1000},
+ {3, 14, 3, 63, 1000},
+ {3, 14, 3, 63, 975},
+ {3, 14, 3, 63, 950},
+ {3, 14, 3, 63, 925},
+ {3, 1, 3, 63, 900},
+ {3, 1, 3, 63, 875},
+ {3, 1, 3, 63, 850},
+ {3, 1, 3, 63, 850},
+ {3, 1, 3, 63, 825},
+ {3, 1, 3, 63, 800},
+ {3, 1, 3, 63, 775},
+ {3, 6, 3, 63, 775},
+ {3, 6, 3, 63, 750},
+ {3, 6, 3, 63, 725},
+ {3, 6, 3, 63, 700},
+ {3, 6, 3, 63, 700},
+ {3, 6, 3, 63, 675},
+ {3, 6, 3, 63, 675},
+ {3, 6, 3, 63, 650},
+ {3, 6, 3, 63, 650},
+ {3, 6, 3, 63, 625},
+ {3, 6, 3, 63, 625},
+ {3, 6, 3, 63, 625},
+ {3, 6, 3, 63, 600},
+ {3, 6, 3, 63, 600},
+ {3, 6, 3, 63, 600},
+ {3, 6, 3, 63, 600},
+ {3, 6, 3, 63, 600},
+ {3, 10, 3, 63, 600},
+ {3, 10, 3, 63, 600},
+ {3, 10, 3, 63, 600},
+ {3, 10, 3, 63, 600},
+ {3, 10, 3, 63, 600},
+ {3, 10, 3, 63, 600},
+ {3, 10, 3, 63, 600},
+ {3, 10, 3, 63, 600},
+ {3, 10, 3, 63, 600},
+ {3, 10, 3, 63, 600},
+ {3, 10, 3, 63, 600},
+ {3, 10, 3, 63, 600},
+ {3, 10, 3, 63, 600},
+ {3, 10, 3, 63, 600},
+ {3, 10, 3, 63, 600},
+ {3, 10, 3, 63, 600},
+ {4, 6, 3, 63, 600},
+ {4, 6, 3, 63, 600},
+ {4, 6, 3, 63, 600},
+ {4, 6, 3, 63, 600},
+ {4, 6, 3, 63, 600},
+ {4, 6, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600},
+ {3, 12, 3, 63, 600}
+};
+
+/******************************************************************************/
+/**
+ * This function initializes the parameters required to configure PLL.
+ *
+ * @param PllInstancePtr is pointer to the XAVBuf_Pll instance.
+ * @param Pll is the PLL chosen to be configured.
+ * @param Pll is the PLL chosen to be configured.
+ * @param CrossDomain is the bool which is used to mention if the PLL
+ * outputs in other domain.
+ * @param ExtDividerCnt is number of external divider out of VCO.
+ *
+ * @return XST_SUCCESS if PLL is configured without an error.
+ * XST_FAILURE otherwise.
+ *
+ * @note In order to avoid floating point usage we have a 16bit
+ * fractional fixed point arithmetic implementation
+ *
+*******************************************************************************/
+static void XAVBuf_PllInitialize(XAVBuf_Pll *PllInstancePtr,
+ u8 Pll, u8 CrossDomain , u8 ExtDividerCnt)
+{
+ /* Instantiate input frequency. */
+ PllInstancePtr->InputRefClk = XAVBUF_Pss_Ref_Clk;
+ PllInstancePtr->RefClkFreqhz = XAVBUF_INPUT_REF_CLK;
+ /* Turn on internal Divider*/
+ PllInstancePtr->Divider = 1;
+ PllInstancePtr->Pll = Pll;
+ PllInstancePtr->ExtDividerCnt = ExtDividerCnt;
+
+ //Check if CrossDomain is requested
+ if(CrossDomain)
+ PllInstancePtr->DomainSwitchDiv = 6;
+ else
+ PllInstancePtr->DomainSwitchDiv = 1;
+ //Check where PLL falls
+ if (Pll>2){
+ PllInstancePtr->Fpd = 0;
+ PllInstancePtr->BaseAddress = XAVBUF_CLK_LPD_BASEADDR;
+ PllInstancePtr->Offset = XAVBUF_LPD_CTRL_OFFSET;
+ }
+ else{
+ PllInstancePtr->Fpd = 1;
+ PllInstancePtr->BaseAddress = XAVBUF_CLK_FPD_BASEADDR;
+ PllInstancePtr->Offset = XAVBUF_FPD_CTRL_OFFSET;
+ }
+
+}
+
+/******************************************************************************/
+/**
+ * This function calculates the parameters which are required to configure PLL
+ * depending upon the requested frequency.
+ *
+ * @param PllInstancePtr is pointer to the XAVBuf_Pll instance
+ * @param FreqHz is the requested frequency to DP in Hz
+ *
+ * @return XST_SUCCESS if parameters are calculated
+ * XST_FAILURE otherwise.
+ *
+ * @note In order to avoid floating point usage we have a 16bit
+ * fractional fixed point arithmetic implementation
+ *
+*******************************************************************************/
+static int XAVBuf_PllCalcParameterValues(XAVBuf_Pll *PllInstancePtr,
+ u64 FreqHz)
+{
+ u64 ExtDivider, Vco, VcoIntFrac;
+
+ /* Instantiate input frequency. */
+ PllInstancePtr->InputRefClk = XAVBUF_Pss_Ref_Clk;
+ PllInstancePtr->RefClkFreqhz = XAVBUF_INPUT_REF_CLK ;
+ /* Turn on internal Divider*/
+ PllInstancePtr->Divider = 1;
+ PllInstancePtr->DomainSwitchDiv = 1;
+
+ /* Estimate the total divider. */
+ ExtDivider = (XAVBUF_PLL_OUT_FREQ / FreqHz) /
+ PllInstancePtr->DomainSwitchDiv;
+ if(ExtDivider > 63 && PllInstancePtr->ExtDividerCnt == 2){
+ PllInstancePtr->ExtDivider0 = 63;
+ PllInstancePtr->ExtDivider1 = ExtDivider / 63;
+ }
+ else if(ExtDivider < 63){
+ PllInstancePtr->ExtDivider0 = ExtDivider;
+ PllInstancePtr->ExtDivider1 = 1;
+ }
+ else
+ return XST_FAILURE;
+
+ Vco = FreqHz *(PllInstancePtr->ExtDivider1 *
+ PllInstancePtr->ExtDivider0 * 2) *
+ PllInstancePtr->DomainSwitchDiv;
+ /* Calculate integer and fractional part. */
+ VcoIntFrac = (Vco * XAVBUF_INPUT_FREQ_PRECISION *
+ XAVBUF_SHIFT_DECIMAL) /
+ PllInstancePtr->RefClkFreqhz ;
+ PllInstancePtr->Fractional = VcoIntFrac & XAVBUF_DECIMAL;
+ PllInstancePtr->FracIntegerFBDIV = VcoIntFrac >> XAVBUF_PRECISION;
+
+ return XST_SUCCESS;
+}
+
+/******************************************************************************/
+/**
+ * This function will Read modify and write into corresponding registers.
+ *
+ * @param BaseAddress is the base address to which the value has to be
+ * written.
+ * @param RegOffset is the relative offset from Base address.
+ * @param Mask is used to select the number of bits to be modified.
+ * @param Shift is the number bits to be shifted from LSB.
+ * @param Data is the Data to be written.
+ *
+ * @return None.
+ *
+ * @note None.
+ *
+*******************************************************************************/
+static void XAVBuf_ReadModifyWriteReg(u32 BaseAddress, u32 RegOffset, u32 Mask,
+ u32 Shift, u32 Data)
+{
+ u32 RegValue;
+
+ RegValue = XAVBuf_ReadReg(BaseAddress, RegOffset);
+ RegValue = (RegValue & ~Mask) | (Data << Shift);
+ XAVBuf_WriteReg(BaseAddress, RegOffset, RegValue);
+}
+
+/******************************************************************************/
+/**
+ * This function configures PLL.
+ *
+ * @param PllInstancePtr is pointer to the XAVBuf_Pll instance.
+ *
+ * @return XST_SUCCESS if PLL is configured without an error.
+ * XST_FAILURE otherwise.
+ *
+ * @note None.
+ *
+*******************************************************************************/
+static int XAVBuf_ConfigurePll(XAVBuf_Pll *PllInstancePtr)
+{
+ u64 BaseAddress = PllInstancePtr->BaseAddress;
+ u64 timer = 0;
+ u32 RegPll = 0;
+ u8 Pll = PllInstancePtr->Pll;
+
+ RegPll |= XAVBUF_ENABLE_BIT << XAVBUF_PLL_CTRL_BYPASS_SHIFT;
+ RegPll |= PllInstancePtr->FracIntegerFBDIV <<
+ XAVBUF_PLL_CTRL_FBDIV_SHIFT;
+ RegPll |= PllInstancePtr->Divider << XAVBUF_PLL_CTRL_DIV2_SHIFT;
+ RegPll |= PllInstancePtr->InputRefClk << XAVBUF_PLL_CTRL_PRE_SRC_SHIFT;
+ XAVBuf_WriteReg(BaseAddress, XAVBUF_PLL_CTRL + (MOD_3(Pll) *
+ PllInstancePtr->Offset), RegPll);
+ RegPll = 0;
+ /* Set the values for lock dly, lock counter, capacitor and resistor. */
+ RegPll |=
+ PllFracDivideTable[PllInstancePtr->FracIntegerFBDIV -25].cp
+ << XAVBUF_PLL_CFG_CP_SHIFT;
+ RegPll |=
+ PllFracDivideTable[PllInstancePtr->FracIntegerFBDIV -25].res
+ << XAVBUF_PLL_CFG_RES_SHIFT;
+ RegPll |=
+ PllFracDivideTable[PllInstancePtr->FracIntegerFBDIV -25].lfhf
+ << XAVBUF_PLL_CFG_LFHF_SHIFT;
+ RegPll |=
+ PllFracDivideTable[PllInstancePtr->FracIntegerFBDIV -25].lock_dly
+ << XAVBUF_PLL_CFG_LOCK_DLY_SHIFT;
+ RegPll |=
+ PllFracDivideTable[PllInstancePtr->FracIntegerFBDIV -25].lock_cnt
+ << XAVBUF_PLL_CFG_LOCK_CNT_SHIFT;
+ XAVBuf_WriteReg(BaseAddress, XAVBUF_PLL_CFG + (MOD_3(Pll) *
+ PllInstancePtr->Offset), RegPll);
+ /* Enable and set Fractional Data. */
+ XAVBuf_WriteReg(BaseAddress, XAVBUF_PLL_FRAC_CFG + (MOD_3(Pll) *
+ PllInstancePtr->Offset), (1 << XAVBUF_PLL_FRAC_CFG_ENABLED_SHIFT) |
+ (PllInstancePtr->Fractional <<
+ XAVBUF_PLL_FRAC_CFG_DATA_SHIFT));
+ /* Assert reset to the PLL. */
+ XAVBuf_ReadModifyWriteReg(BaseAddress, XAVBUF_PLL_CTRL + (MOD_3(Pll) *
+ PllInstancePtr->Offset),
+ XAVBUF_PLL_CTRL_RESET_MASK, XAVBUF_PLL_CTRL_RESET_SHIFT,
+ XAVBUF_ENABLE_BIT);
+
+ /* Deassert reset to the PLL. */
+ XAVBuf_ReadModifyWriteReg(BaseAddress, XAVBUF_PLL_CTRL + (MOD_3(Pll) *
+ PllInstancePtr->Offset),
+ XAVBUF_PLL_CTRL_RESET_MASK, XAVBUF_PLL_CTRL_RESET_SHIFT,
+ XAVBUF_DISABLE_BIT);
+
+ while(!(XAVBuf_ReadReg(BaseAddress, XAVBUF_PLL_STATUS -
+ ((1 - PllInstancePtr->Fpd) * XAVBUF_REG_OFFSET)) &
+ (1 << MOD_3(Pll))))
+ if(++timer > 1000)
+ return XST_FAILURE;
+
+ /* Deassert Bypass. */
+ XAVBuf_ReadModifyWriteReg(BaseAddress, XAVBUF_PLL_CTRL + (MOD_3(Pll) *
+ PllInstancePtr->Offset),
+ XAVBUF_PLL_CTRL_BYPASS_MASK, XAVBUF_PLL_CTRL_BYPASS_SHIFT,
+ XAVBUF_DISABLE_BIT);
+
+ if(PllInstancePtr->DomainSwitchDiv != 1)
+ XAVBuf_ReadModifyWriteReg(BaseAddress, (XAVBUF_DOMAIN_SWITCH_CTRL
+ + (MOD_3(Pll) * XAVBUF_REG_OFFSET) - ((1 - PllInstancePtr->Fpd)
+ * XAVBUF_REG_OFFSET)),
+ XAVBUF_DOMAIN_SWITCH_DIVISOR0_MASK,
+ XAVBUF_DOMAIN_SWITCH_DIVISOR0_SHIFT,
+ PllInstancePtr->DomainSwitchDiv);
+ usleep(1);
+
+ return XST_SUCCESS;
+
+}
+
+/******************************************************************************/
+/**
+ * This function configures Configures external divider.
+ *
+ * @param PllInstancePtr is pointer to the XAVBuf_Pll instance.
+ *
+ * @return None.
+ *
+ * @note None.
+ *
+*******************************************************************************/
+static void XAVBuf_ConfigureExtDivider(XAVBuf_Pll *PllInstancePtr,
+ u64 BaseAddress, u32 Offset)
+{
+ XAVBuf_ReadModifyWriteReg(BaseAddress, Offset,
+ XAVBUF_VIDEO_REF_CTRL_CLKACT_MASK,
+ XAVBUF_VIDEO_REF_CTRL_CLKACT_SHIFT, XAVBUF_DISABLE_BIT);
+ XAVBuf_ReadModifyWriteReg(BaseAddress, Offset,
+ XAVBUF_VIDEO_REF_CTRL_DIVISOR1_MASK,
+ XAVBUF_VIDEO_REF_CTRL_DIVISOR1_SHIFT,
+ PllInstancePtr->ExtDivider1);
+ XAVBuf_ReadModifyWriteReg(BaseAddress, Offset,
+ XAVBUF_VIDEO_REF_CTRL_DIVISOR0_MASK,
+ XAVBUF_VIDEO_REF_CTRL_DIVISOR0_SHIFT,
+ PllInstancePtr->ExtDivider0);
+ XAVBuf_ReadModifyWriteReg(BaseAddress, Offset,
+ XAVBUF_VIDEO_REF_CTRL_CLKACT_MASK,
+ XAVBUF_VIDEO_REF_CTRL_CLKACT_SHIFT, XAVBUF_ENABLE_BIT);
+ XAVBuf_WriteReg(BaseAddress, Offset, 0x1011003);
+}
+
+/******************************************************************************/
+/**
+ * This function calls API to calculate and configure PLL with desired frequency
+ * for Video.
+ *
+ * @param FreqHz is the desired frequency in Hz.
+ *
+ * @return XST_SUCCESS if PLL is configured without an error.
+ * XST_FAILURE otherwise.
+ *
+ * @note The Pll used is design specific.
+ *
+*******************************************************************************/
+int XAVBuf_SetPixelClock(u64 FreqHz)
+{
+ u32 PllAssigned;
+ XAVBuf_Pll PllInstancePtr;
+ u8 Pll, CrossDomain, Flag;
+
+ /*Verify Input Arguments*/
+ Xil_AssertNonvoid(FreqHz < XDPSSU_MAX_VIDEO_FREQ);
+
+ PllAssigned = XAVBuf_ReadReg(XAVBUF_CLK_FPD_BASEADDR,
+ XAVBUF_VIDEO_REF_CTRL) & XAVBUF_VIDEO_REF_CTRL_SRCSEL_MASK;
+
+ switch (PllAssigned) {
+ case XAVBUF_VPLL_SRC_SEL:
+ Pll = VPLL;
+ CrossDomain = 0;
+ break;
+ case XAVBUF_DPLL_SRC_SEL:
+ Pll = DPLL;
+ CrossDomain = 0;
+ break;
+ case XAVBUF_RPLL_TO_FPD_SRC_SEL:
+ Pll = RPLL;
+ CrossDomain = 1;
+ break;
+ default:
+ return XST_FAILURE;
+ }
+
+ /*Calculate configure PLL and External Divider*/
+ XAVBuf_PllInitialize(&PllInstancePtr, Pll, CrossDomain,
+ XAVBUF_EXTERNAL_DIVIDER);
+ Flag = XAVBuf_PllCalcParameterValues(&PllInstancePtr, FreqHz);
+ if(Flag != 0)
+ return XST_FAILURE;
+ Flag = XAVBuf_ConfigurePll(&PllInstancePtr);
+ if(Flag != 0)
+ return XST_FAILURE;
+ XAVBuf_ConfigureExtDivider(&PllInstancePtr, XAVBUF_CLK_FPD_BASEADDR,
+ XAVBUF_VIDEO_REF_CTRL);
+
+ return XST_SUCCESS;
+}
+
+/******************************************************************************/
+/**
+ * This function calls API to calculate and configure PLL with desired
+ * frequency for Audio.
+ *
+ * @param FreqHz is the desired frequency in Hz.
+ *
+ * @return XST_SUCCESS if PLL is configured without an error.
+ * XST_FAILURE otherwise.
+ *
+ * @note The Pll used is design specific.
+ *
+*******************************************************************************/
+int XAVBuf_SetAudioClock(u64 FreqHz)
+{
+ u32 Flag, PllAssigned;
+ u8 Pll, CrossDomain;
+ XAVBuf_Pll XAVBuf_RPllInstancePtr;
+
+ /*Verify Input Arguments*/
+ Flag = (FreqHz == (XAVBUF_AUDIO_SAMPLE_RATE_44_1 *
+ XAVBUF_AUDIO_SAMPLES)) ||
+ (FreqHz == (XAVBUF_AUDIO_SAMPLE_RATE_48_0 *
+ XAVBUF_AUDIO_SAMPLES));
+ Xil_AssertNonvoid(Flag);
+
+ PllAssigned = XAVBuf_ReadReg(XAVBUF_CLK_FPD_BASEADDR,
+ XAVBUF_AUDIO_REF_CTRL) &
+ XAVBUF_AUDIO_REF_CTRL_SRCSEL_MASK;
+
+ switch (PllAssigned) {
+ case XAVBUF_VPLL_SRC_SEL:
+ Pll = VPLL;
+ CrossDomain = 0;
+ break;
+ case XAVBUF_DPLL_SRC_SEL:
+ Pll = DPLL;
+ CrossDomain = 0;
+ break;
+ case XAVBUF_RPLL_TO_FPD_SRC_SEL:
+ Pll = RPLL;
+ CrossDomain = 1;
+ break;
+ default:
+ return XST_FAILURE;
+ }
+
+ /*Calculate configure PLL and External Divider*/
+ XAVBuf_PllInitialize(&XAVBuf_RPllInstancePtr, Pll, CrossDomain,
+ XAVBUF_EXTERNAL_DIVIDER);
+ Flag = XAVBuf_PllCalcParameterValues(&XAVBuf_RPllInstancePtr, FreqHz);
+ if(Flag != 0)
+ return XST_FAILURE;
+ Flag = XAVBuf_ConfigurePll(&XAVBuf_RPllInstancePtr);
+ if(Flag != 0)
+ return XST_FAILURE;
+ XAVBuf_ConfigureExtDivider(&XAVBuf_RPllInstancePtr,
+ XAVBUF_CLK_FPD_BASEADDR, XAVBUF_AUDIO_REF_CTRL);
+
+ return XST_SUCCESS;
+}