1 /******************************************************************************
5 ** Copyright: 2002 Spreatrum, Incoporated. All Rights Reserved. *
6 ** Description: This file defines the basic information on chip. *
7 ******************************************************************************
9 ******************************************************************************
11 ** ------------------------------------------------------------------------- *
12 ** DATE NAME DESCRIPTION *
13 ** 04/19/2013 Richard.Yang Create. *
14 ******************************************************************************/
16 /**---------------------------------------------------------------------------*
18 **---------------------------------------------------------------------------*/
20 #include <asm/arch/sci_types.h>
24 #include <asm/arch/regs_adi.h>
25 #include <asm/arch/regs_ana.h>
26 #include <asm/arch/adi_hal_internal.h>
27 #include <asm/arch/sc8810_reg_ahb.h>
28 #include <asm/arch/sdram_sc7710g2.h>
29 #include <asm/arch/chip_plf_export.h>
30 #include <asm/arch/emc_config.h>
31 #include <asm/arch/misc_api.h>
32 #include <asm/arch/mfp.h>
34 /**---------------------------------------------------------------------------*
36 **---------------------------------------------------------------------------*/
42 /**---------------------------------------------------------------------------*
44 **---------------------------------------------------------------------------*/
46 /**---------------------------------------------------------------------------*
48 **---------------------------------------------------------------------------*/
50 /**---------------------------------------------------------------------------*
52 **---------------------------------------------------------------------------*/
55 /**---------------------------------------------------------------------------*
56 ** Function Definitions *
57 **---------------------------------------------------------------------------*/
59 unsigned int CHIP_PHY_GetChipID(void)
61 #if defined(CONFIG_SC7710G2)
62 return CHIP_REG_GET(CHIP_ID);
68 unsigned int CHIP_PHY_GetANAChipID(void)
70 #if defined(CONFIG_SC7710G2)
71 return ((ADI_Analogdie_reg_read(ANA_CHIP_ID_HIGH) << 16) |
72 ADI_Analogdie_reg_read(ANA_CHIP_ID_LOW));
78 LOCAL void mcu_clock_select(MCU_CLK_SOURCE_E mcu_clk_sel)
82 i = REG32(AHB_ARM_CLK);
84 i |= ((mcu_clk_sel & 0x3) << 23);
85 REG32(AHB_ARM_CLK) = i;
88 LOCAL void set_arm_bus_clk_div(uint32 arm_drv, uint32 axi_div, uint32 ahb_div, uint32 dbg_div)
95 i |= ((axi_div & 0x3) << 11);
98 i = REG32(AHB_ARM_CLK);
99 i &= (~(0x7 | (0x7 << 4) | (0x7 << 14)));
100 i |= (arm_drv & 0x7) | ((ahb_div & 0x7) << 4) | ((dbg_div & 0x7) << 14);
102 REG32(AHB_ARM_CLK) = i;
104 for(i = 0; i < 50; i++);
107 LOCAL void set_gpu_clock_freq(void)
110 REG32(GR_GEN2) &= ~(0x3);
113 LOCAL void set_mpll_clock_freq(uint32 clk_freq_hz)
118 mpll_clk = (clk_freq_hz / 1000000 / 4);
120 //APB_GEN1_PCLK M_PLL_CTRL_WE
121 REG32(GR_GEN1) |= (1 << 9);
123 i = REG32(GR_MPLL_MN);
126 i |= (mpll_clk & 0x7FF);
128 REG32(GR_MPLL_MN) = i;
129 REG32(GR_GEN1) &= ~(1 << 9);
132 LOCAL void set_chip_clock_freq(void)
139 uint32 mpll_clk_freq = EMC_GetPara()->arm_clk;
141 if (mpll_clk_freq == CHIP_CLK_26MHZ)
143 mcu_clock_select(MCU_CLK_XTL_SOURCE);
146 else if ((mpll_clk_freq >= CHIP_CLK_800MHZ) && (mpll_clk_freq <= CHIP_CLK_1200MHZ))
152 else if ((mpll_clk_freq > CHIP_CLK_1200MHZ) && (mpll_clk_freq <= CHIP_CLK_1500MHZ))
163 mcu_clock_select(MCU_CLK_XTL_SOURCE);
165 set_gpu_clock_freq();
166 set_arm_bus_clk_div(arm_drv, axi_div, ahb_div, dbg_div);
167 set_mpll_clock_freq(mpll_clk_freq);
169 mcu_clock_select(MCU_CLK_MPLL_SOURCE);
172 __inline LOCAL void set_XOSC32K_config(void)
174 #if defined(CONFIG_SC7710G2)
175 // from 13.8uA to 7.8uA
178 reg_read = ADI_Analogdie_reg_read(ANA_RTC_CTRL);
183 ADI_Analogdie_reg_write(ANA_RTC_CTRL, reg_read);
187 __inline LOCAL void set_mem_volt(void)
189 #if defined(CONFIG_SC7710G2)
193 reg_read = ADI_Analogdie_reg_read(ANA_DCDC_MEM_CTL0);
196 reg_read |= 0x6; // dcdc mem 1.8V
198 ADI_Analogdie_reg_write(ANA_DCDC_MEM_CTL0, reg_read);
200 reg_read = ADI_Analogdie_reg_read(ANA_LDO_TRIM9);
204 ADI_Analogdie_reg_write(ANA_LDO_TRIM9, reg_read);
209 __inline LOCAL void Chip_Workaround(void)
211 #if defined(CONFIG_SC7710G2)
212 /* FIXME: disable otp for a-die internal bug */
213 ANA_REG_OR(ANA_MIXED_CTRL, BIT_1/*BIT_OTP_EN_RST*/);
214 ANA_REG_OR(ANA_DCDC_OPT_CTL, BIT_0/*BIT_DCDC_OTP_PD*/);
216 /* FIXME: enable dcdc wpa current limit
217 * in order to prevent vbat drop when high load
219 ANA_REG_OR(ANA_WPA_DCDC_AP_CTL2, BIT_6/*BIT_WPA_DCDC_CL_CTRL_AP*/);
223 PUBLIC void Chip_Init(void)
227 if (CHIP_PHY_GetANAChipID() == ANA_CHIP_ID_AA)
230 set_XOSC32K_config();
233 set_chip_clock_freq();
241 /**---------------------------------------------------------------------------*
243 **---------------------------------------------------------------------------*/