tizen 2.4 release
[kernel/u-boot-tm1.git] / arch / arm / cpu / armv7 / sc8830 / chip_phy_v3.c
1 /******************************************************************************
2  ** File Name:      chip_phy_v3.c                                             *
3  ** Author:         Richard Yang                                              *
4  ** DATE:           08/14/2002                                                *
5  ** Copyright:      2002 Spreatrum, Incoporated. All Rights Reserved.         *
6  ** Description:    This file defines the basic information on chip.          *
7  ******************************************************************************
8
9  ******************************************************************************
10  **                        Edit History                                       *
11  ** ------------------------------------------------------------------------- *
12  ** DATE           NAME             DESCRIPTION                               *
13  ** 08/14/2002     Richard.Yang     Create.                                   *
14  ** 09/16/2003     Xueliang.Wang    Modify CR4013                             *
15  ** 08/23/2004     JImmy.Jia        Modify for SC6600D                        *
16  ******************************************************************************/
17
18 /**---------------------------------------------------------------------------*
19  **                         Dependencies                                      *
20  **---------------------------------------------------------------------------*/
21 #include <asm/io.h>
22 #include "asm/arch/sc_reg.h"
23 #include "asm/arch/adi_hal_internal.h"
24 #include "asm/arch/wdg_drvapi.h"
25 #include "asm/arch/sprd_reg.h"
26 #include "asm/arch/boot_drvapi.h"
27 /**---------------------------------------------------------------------------*
28  **                         Compiler Flag                                     *
29  **---------------------------------------------------------------------------*/
30 #ifdef   __cplusplus
31 extern   "C"
32 {
33 #endif
34
35 /**---------------------------------------------------------------------------*
36  **                         Macro defines.
37  **---------------------------------------------------------------------------*/
38
39
40 /**---------------------------------------------------------------------------*
41  **                         Struct defines.
42  **---------------------------------------------------------------------------*/
43
44 /**---------------------------------------------------------------------------*
45  **                         Global variables                                  *
46  **---------------------------------------------------------------------------*/
47
48 /**---------------------------------------------------------------------------*
49  **                         Function Definitions                              *
50  **---------------------------------------------------------------------------*/
51 /*****************************************************************************/
52 // Description :    This function is used to reset MCU.
53 // Global resource dependence :
54 // Author :         Xueliang.Wang
55 // Note :
56 /*****************************************************************************/
57 void CHIP_ResetMCU (void)  //reset interrupt disable??
58 {
59     // This loop is very important to let the reset process work well on V3 board
60     // @Richard
61     uint32 i = 10000;
62
63         WDG_ClockOn ();
64     WDG_TimerInit ();
65     
66     while (i--);    
67
68     WDG_ResetMCU ();
69     
70     {
71         volatile uint32 tick1 = SCI_GetTickCount();
72         volatile uint32 tick2 = SCI_GetTickCount();
73
74         while ( (tick2 - tick1) < 500)
75         {
76             tick2 = SCI_GetTickCount();
77         }
78     }
79 }
80
81 /*****************************************************************************/
82 //  Description:    Returns the HW_RST register address.
83 //  Author:         Jeff.Li
84 //  Note :          Because there is no register which can restore information
85 //                  when watchdog resets the system, so we choose IRAM.
86 /*****************************************************************************/
87 LOCAL uint32 CHIP_PHY_GetHwRstAddr (void)
88 {
89     // Returns a DWORD of IRAM shared with DCAM
90     return ANA_REG_GLB_WDG_RST_MONITOR;
91 }
92
93 /*****************************************************************************/
94 //  Description:    Returns the reset mode register address.
95 //  Author:         Jeff.Li
96 //  Note:
97 /*****************************************************************************/
98 LOCAL uint32 CHIP_PHY_GetRstModeAddr (void)
99 {
100     return ANA_REG_GLB_POR_RST_MONITOR;
101 }
102
103 /*****************************************************************************/
104 //  Description:    Gets the register in analog die to judge the reset mode. 
105 //  Author:         Jeff.Li
106 //  Note:           !It is called before __main now, so it can not call the adi
107 //                  interface because it contains SCI_DisableIRQ inside, below 
108 //                  writes the adi read interface individually. Because the la-
109 //                  ckless of SCI_DisableIRQ, so this function must be called 
110 //                  before system interrupt is turnned on!
111 /*****************************************************************************/
112 LOCAL uint32 CHIP_PHY_GetANAReg (void)
113 {
114     return ANA_REG_GET(ANA_REG_GLB_POR_RST_MONITOR);
115 }
116
117 /*****************************************************************************/
118 //  Description:    This fuction returns the HW_RST value written before reset.
119 //  Author:         Jeff.Li
120 //  Note:           
121 /*****************************************************************************/
122 LOCAL uint32 CHIP_PHY_GetHWFlag (void)
123 {
124     // Switch IRAM from DCAM to ARM
125     return ANA_REG_GET (CHIP_PHY_GetHwRstAddr ());
126 }
127
128 /*****************************************************************************/
129 //  Description:    PHY layer realization of BOOT_SetRstMode.
130 //  Author:         Jeff.Li
131 //  Note:           The valid bit filed is from bit15 to bit0
132 /*****************************************************************************/
133 PUBLIC void CHIP_PHY_SetRstMode (uint32 val)
134 {
135     ANA_REG_AND (CHIP_PHY_GetRstModeAddr (), ~0xFFFF);
136     ANA_REG_OR (CHIP_PHY_GetRstModeAddr (), (val&0xFFFF));
137 }
138
139 /*****************************************************************************/
140 //  Description:    This fuction returns the reset mode value.
141 //  Author:         Jeff.Li
142 //  Note:
143 /*****************************************************************************/
144 PUBLIC uint32 CHIP_PHY_GetRstMode (void)
145 {
146     return (ANA_REG_GET (CHIP_PHY_GetRstModeAddr ()) & 0xFFFF);
147 }
148
149 /*****************************************************************************/
150 //  Description:    PHY layer realization of BOOT_ResetHWFlag. It resets the HW
151 //                  reset register after system initialization.
152 //  Author:         Jeff.Li
153 //  Note:           The valid bit filed of analog register is from bit11 to bit0.
154 //                  | 11   10   9   8 |  7   6   5   4  |  3   2   1   0   |
155 //                  |ALL_HRST_MONITOR | POR_HRST_MONITOR| WDG_HRST_MONITOR |
156 //
157 //                  The valid bit filed of HW_RST is from bit11 to bit0.
158 /*****************************************************************************/
159 PUBLIC void CHIP_PHY_ResetHWFlag (uint32 val)
160 {
161     // Reset the analog die register
162     ANA_REG_AND(ANA_REG_GLB_POR_RST_MONITOR, ~0xFFF);
163     ANA_REG_OR (ANA_REG_GLB_POR_RST_MONITOR, (val&0xFFF));
164
165     // Reset the HW_RST
166     ANA_REG_AND(CHIP_PHY_GetHwRstAddr (), ~0xFFFF);
167     ANA_REG_OR (CHIP_PHY_GetHwRstAddr (), (val&0xFFFF));
168 }
169
170 /*****************************************************************************/
171 //  Description:    PHY layer realization of BOOT_SetWDGHWFlag. It Writes flag
172 //                  to the register which would not be reset by watchdog reset.
173 //  Author:         Jeff.Li
174 //  Note:           The valid bit filed is from bit15 to bit0
175 /*****************************************************************************/
176 PUBLIC void CHIP_PHY_SetWDGHWFlag (WDG_HW_FLAG_T type, uint32 val)
177 {
178     if(TYPE_RESET == type)
179     {        
180         ANA_REG_AND(CHIP_PHY_GetHwRstAddr (), ~0xFFFF);
181         ANA_REG_OR (CHIP_PHY_GetHwRstAddr (), (val&0xFFFF));
182     }
183     else
184     {
185         //wrong type, TODO
186     }
187 }
188
189
190 /*****************************************************************************/
191 //  Description:    PHY layer realization of __BOOT_IRAM_EN.
192 //  Author:         Jeff.Li
193 //  Note:           Do nothing. There are 32KB internal ram dedicated for ARM.
194 /*****************************************************************************/
195 PUBLIC void CHIP_PHY_BootIramEn ()
196 {
197 }
198
199 /*****************************************************************************/
200 // Description :    This function returns whether the watchdog reset is caused
201 //                  by software reset or system halted.
202 // Author :         Jeff.Li
203 // Note :           The valid bit filed is from bit15 to bit0
204 /*****************************************************************************/
205 PUBLIC BOOLEAN CHIP_PHY_IsWDGRstByMCU (uint32 flag)
206 {
207     // Copy the value of HW_RST register to the register specific to reset mode
208     ANA_REG_SET (CHIP_PHY_GetRstModeAddr (),
209                   (CHIP_PHY_GetHWFlag () & 0xFFFF));
210
211     if ((CHIP_PHY_GetHWFlag () & 0xFFFF) == (flag & 0xFFFF))
212     {
213         return SCI_FALSE;
214     }
215     else
216     {
217         return SCI_TRUE;
218     }
219 }
220
221 /*****************************************************************************/
222 // Description :    This function returns whether the reset is caused by power
223 //                  up.
224 // Author :         Jeff.Li
225 // Note :           | 11   10   9   8 |  7   6   5   4  |  3   2   1   0   |
226 //                  |ALL_HRST_MONITOR | POR_HRST_MONITOR| WDG_HRST_MONITOR |
227 /*****************************************************************************/
228 PUBLIC BOOLEAN CHIP_PHY_IsResetByPowerUp()
229 {
230     if ((CHIP_PHY_GetANAReg () & 0xF0) == 0x0)
231     {
232         return SCI_TRUE;
233     }
234     else
235     {
236         return SCI_FALSE;
237     }
238 }
239
240 /*****************************************************************************/
241 // Description :    This function returns whether the reset is caused by watch-
242 //                  dog reset.
243 // Author :         Jeff.Li
244 // Note :           | 11   10   9   8 |  7   6   5   4  |  3   2   1   0   |
245 //                  |ALL_HRST_MONITOR | POR_HRST_MONITOR| WDG_HRST_MONITOR |
246 /*****************************************************************************/
247 PUBLIC BOOLEAN CHIP_PHY_IsResetByWatchDog()
248 {
249     if ((CHIP_PHY_GetANAReg () & 0xF) == 0x0)
250     {
251         return SCI_TRUE;
252     }
253     else
254     {
255         return SCI_FALSE;
256     }
257 }
258
259 /************************************************************
260 *select TDPLL's reference crystal,
261 *(1)--RF0---------xtlbuf0-----------
262 *                               -?-tdpll_ref_sel-----TDPLL
263 *(2)--RF1---------xtlbuf1-----------
264 1)rf_id = 0,TDPLL will select (1), or select (2)
265 ************************************************************/
266 PUBLIC uint32 TDPllRefConfig(TDPLL_REF_T rf_id)
267 {
268     uint32 pll_reg;
269 /* before switch reference crystal, it must be sure that no module is using TDPLL */
270     pll_reg = readl(REG_AP_CLK_AP_AHB_CFG);
271     pll_reg &= ~AP_AHB_CLK_SEL_MASK;
272     writel(pll_reg, REG_AP_CLK_AP_AHB_CFG);
273
274     pll_reg = readl(REG_AON_CLK_PUB_AHB_CFG);
275     pll_reg &= ~PUB_AHB_CLK_SEL_MASK;
276     writel(pll_reg, REG_AON_CLK_PUB_AHB_CFG);
277
278     pll_reg = readl(REG_AP_CLK_AP_APB_CFG);
279     pll_reg &= ~AP_APB_CLK_SEL_MASK;
280     writel(pll_reg, REG_AP_CLK_AP_APB_CFG);
281
282     pll_reg = readl(REG_AON_CLK_AON_APB_CFG);
283     pll_reg &= ~PUB_APB_CLK_SEL_MASK;
284     writel(pll_reg, REG_AON_CLK_AON_APB_CFG);
285
286     pll_reg = readl(REG_AON_APB_PLL_SOFT_CNT_DONE);
287     pll_reg &= ~(BIT_TDPLL_SOFT_CNT_DONE);
288     writel(pll_reg, REG_AON_APB_PLL_SOFT_CNT_DONE);
289     udelay(1);
290
291 /* switch TDPLL reference crystal */
292     if (rf_id == TDPLL_REF0)
293     {
294         pll_reg = readl(REG_PMU_APB_TDPLL_REL_CFG);
295         pll_reg &= ~(0x1 << 4);
296         writel(pll_reg, REG_PMU_APB_TDPLL_REL_CFG);
297
298         pll_reg = readl(REG_PMU_APB_XTL0_REL_CFG);
299         pll_reg |= BIT_XTL1_AP_SEL;
300         writel(pll_reg, REG_PMU_APB_XTL0_REL_CFG);
301
302         pll_reg = readl(REG_PMU_APB_XTLBUF0_REL_CFG);
303         pll_reg |= BIT_XTLBUF1_AP_SEL;
304         writel(pll_reg, REG_PMU_APB_XTLBUF0_REL_CFG);
305     }
306     else if(rf_id == TDPLL_REF1)
307     {
308         pll_reg = readl(REG_PMU_APB_TDPLL_REL_CFG);
309         pll_reg |= (0x1 << 4);
310         writel(pll_reg, REG_PMU_APB_TDPLL_REL_CFG);
311
312         pll_reg = readl(REG_PMU_APB_XTL1_REL_CFG);
313         pll_reg |= BIT_XTL1_AP_SEL;
314         writel(pll_reg, REG_PMU_APB_XTL1_REL_CFG);
315
316         pll_reg = readl(REG_PMU_APB_XTLBUF1_REL_CFG);
317         pll_reg |= BIT_XTLBUF1_AP_SEL;
318         writel(pll_reg, REG_PMU_APB_XTLBUF1_REL_CFG);
319     }
320     else
321         return 1;
322
323     pll_reg = readl(REG_AON_APB_PLL_SOFT_CNT_DONE);
324     pll_reg |= (BIT_TDPLL_SOFT_CNT_DONE);
325     writel(pll_reg, REG_AON_APB_PLL_SOFT_CNT_DONE);
326
327     udelay(120);
328
329 /* after switch, up ahb clock to 128M, APB to 64M */
330     pll_reg = readl(REG_AP_CLK_AP_AHB_CFG);
331     pll_reg |= 0x3;
332     writel(pll_reg, REG_AP_CLK_AP_AHB_CFG);
333
334     pll_reg = readl(REG_AON_CLK_PUB_AHB_CFG);
335     pll_reg |= 0x3;
336     writel(pll_reg, REG_AON_CLK_PUB_AHB_CFG);
337     
338     pll_reg = readl(REG_AP_CLK_AP_APB_CFG);
339     pll_reg |= 0x1;
340     writel(pll_reg, REG_AP_CLK_AP_APB_CFG);
341
342     pll_reg = readl(REG_AON_CLK_AON_APB_CFG);
343     pll_reg |= 0x3;
344     writel(pll_reg, REG_AON_CLK_AON_APB_CFG);
345     return 0;
346 }
347 /**---------------------------------------------------------------------------*
348  **                         Compiler Flag                                     *
349  **---------------------------------------------------------------------------*/
350 #ifdef __cplusplus
351 }
352 #endif