Renamed C661x to C66x
[keystone-rtos/ibl.git] / src / device / c66x / c66xutil.c
1 /**
2  * @file c66xutil.c
3  *
4  * @brief
5  *        c66x functions used by both the ibl and utility programs
6  */
8 #include "device.h"
9 #include "pllapi.h"
12 /**
13  *  @brief
14  *     Configure the predivider for the main PLL, which resides outside the PLL controller
15  */
16 SINT16 chipPllSetExternalPrediv(UINT16 pllNum, UINT32 predivRegVal)
17 {
18     UINT32 reg;
20     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_0);
21     reg = BOOT_SET_BITFIELD(reg, predivRegVal, 5, 0);
22     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_0, reg);
25     return (0);
27 } /* chipPllSetExternalPrediv */
30 /**
31  *  @brief
32  *      Configure the bandwidth adjustment for the main PLL, which resides outside the PLL controller
33  */
34 SINT16 chipPllExternalBwAdj (UINT16 pllNum, UINT16 mult)
35 {
36     UINT32 reg;
37     UINT32 bwAdj;
39     bwAdj = (mult >> 1) - 1;
41     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_0);
42     reg = BOOT_SET_BITFIELD(reg, bwAdj & 0x00ff, 31, 24);
43     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_0, reg);
45     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_1);
46     reg = BOOT_SET_BITFIELD(reg, bwAdj >> 8, 3, 0);
47     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_1, reg);
49     return (0);
51 } /* chipPllExternalBwAdj */
54 /**
55  *  @brief
56  *      Configure the multiplier fields for the main PLL which reside outside the PLL controller
57  */
58 UINT32 chipPllExternalMult (UINT16 pllNum, UINT16 mult)
59 {
60     UINT32 pmult;
61     UINT32 reg;
62     UINT32 v;
65     pmult = mult-1; 
67     v = BOOT_READ_BITFIELD(pmult, 12, 6);
68    
70     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_0);
71     reg = BOOT_SET_BITFIELD(reg, v, 18, 12);
72     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_0, reg);
75     v = BOOT_READ_BITFIELD(pmult, 5, 0);
77     return (v);
79 } /* chipPllExternalMult */
81 /**
82  *  @brief return the PSC module number for SPI
83  */
84 int32 deviceSpiPscNum (void)
85 {
86     uint32 v;
88     /* SPI is module number 3 only on the c6678. On the c6670 the SPI is in the
89      * always on domain */
90     v = *((Uint32 *)DEVICE_JTAG_ID_REG);
91     v &= DEVICE_JTAG_ID_MASK;
92     if (v == DEVICE_C6678_JTAG_ID_VAL)
93         return (3);
95     return (-1);  /* A negative number indicates the always on domain */
96 }
98 /**
99  *  @brief Power up a peripheral
100  *
101  *  @details
102  *    Boot peripherals are powered up
103  */
104 int32 devicePowerPeriph (int32 modNum)
106     int32 ret;
108     /* If the input value is < 0 there is nothing to power up */
109     if (modNum < 0)
110         return (0);
113     if (modNum >= TARGET_PWR_MAX_MOD)
114         return (-1);
117     /* Note that if the sgmii power enable is requested the PA must be
118      * powered up first */
119     if (modNum == TARGET_PWR_ETH(x))  {
120         ret = (int32)pscEnableModule (TARGET_PWR_PA);
121         if (ret != 0)
122             return (ret);
123     }
125     return ((int32)pscEnableModule(modNum));
126