432 lines
14 KiB
C
432 lines
14 KiB
C
|
/*
|
||
|
*********************************************************************************************************
|
||
|
* AR100 SYSTEM
|
||
|
* AR100 Software System Develop Kits
|
||
|
* clock control unit module
|
||
|
*
|
||
|
* (c) Copyright 2012-2016, Sunny China
|
||
|
* All Rights Reserved
|
||
|
*
|
||
|
* File : prcm.h
|
||
|
* By : Sunny
|
||
|
* Version : v1.0
|
||
|
* Date : 2012-4-28
|
||
|
* Descript: clock control unit public header.
|
||
|
* Update : date auther ver notes
|
||
|
* 2012-4-28 14:48:38 Sunny 1.0 Create this file.
|
||
|
*********************************************************************************************************
|
||
|
*/
|
||
|
|
||
|
#ifndef __PRCM_H__
|
||
|
#define __PRCM_H__
|
||
|
|
||
|
#include <sunxi_hal_rtc.h>
|
||
|
#include <sunxi_hal_common.h>
|
||
|
|
||
|
/* the clock status of on-off */
|
||
|
typedef enum ccu_clk_onoff {
|
||
|
CCU_CLK_OFF = 0x0, /* clock off status */
|
||
|
CCU_CLK_ON = 0x1, /* clock on status */
|
||
|
} ccu_clk_onff_e;
|
||
|
|
||
|
/* the clock status of reset */
|
||
|
typedef enum ccu_clk_reset {
|
||
|
CCU_CLK_RESET = 0x0, /* reset valid status */
|
||
|
CCU_CLK_NRESET = 0x1, /* reset invalid status */
|
||
|
} ccu_clk_reset_e;
|
||
|
|
||
|
/* command for call-back function of clock change */
|
||
|
typedef enum ccu_clk_cmd {
|
||
|
CCU_CLK_CLKCHG_REQ = 0x0, /* command for notify that clock will change */
|
||
|
CCU_CLK_CLKCHG_DONE, /* command for notify that clock change finish */
|
||
|
} ccu_clk_cmd_e;
|
||
|
|
||
|
/* command for call-back function of 24M hosc on-off */
|
||
|
typedef enum ccu_hosc_cmd {
|
||
|
CCU_HOSC_ON_READY_NOTIFY = 0x0, /* command for notify that 24mhosc power-on already */
|
||
|
CCU_HOSC_WILL_OFF_NOTIFY, /* command for notify that 24mhosc will off */
|
||
|
} ccu_hosc_cmd_e;
|
||
|
|
||
|
/* the state of power-off gating */
|
||
|
typedef enum poweroff_gating_state {
|
||
|
CCU_POWEROFF_GATING_INVALID = 0x0,
|
||
|
CCU_POWEROFF_GATING_VALID = 0x1,
|
||
|
} poweroff_gating_state_e;
|
||
|
|
||
|
/* source clocks ID */
|
||
|
typedef enum ccu_src_clk {
|
||
|
CCU_SYS_CLK_NONE = 0x0, /* invalid source clock id */
|
||
|
|
||
|
CCU_SYS_CLK_LOSC, /* LOSC, 33/50/67:32768Hz, 73:16MHz/512=31250 */
|
||
|
CCU_SYS_CLK_IOSC, /* InternalOSC, 33/50/67:700KHZ, 73:16MHz */
|
||
|
CCU_SYS_CLK_HOSC, /* HOSC, 24MHZ clock */
|
||
|
CCU_SYS_CLK_AXI, /* AXI clock */
|
||
|
CCU_SYS_CLK_16M, /* 16M for the backdoor */
|
||
|
|
||
|
CCU_SYS_CLK_PLL1, /* PLL1 clock */
|
||
|
CCU_SYS_CLK_PLL2, /* PLL2 clock */
|
||
|
CCU_SYS_CLK_PLL3, /* PLL3 clock */
|
||
|
CCU_SYS_CLK_PLL4, /* PLL4 clock */
|
||
|
CCU_SYS_CLK_PLL5, /* PLL5 clock */
|
||
|
CCU_SYS_CLK_PLL6, /* PLL6 clock */
|
||
|
CCU_SYS_CLK_PLL7, /* PLL7 clock */
|
||
|
CCU_SYS_CLK_PLL8, /* PLL8 clock */
|
||
|
CCU_SYS_CLK_PLL9, /* PLL9 clock */
|
||
|
CCU_SYS_CLK_PLL10, /* PLL10 clock */
|
||
|
CCU_SYS_CLK_PLL11, /* PLL10 clock */
|
||
|
|
||
|
CCU_SYS_CLK_AUDIO0, /* AUDIO0 clock */
|
||
|
CCU_SYS_CLK_AUDIO1, /* AUDIO1 clock */
|
||
|
|
||
|
CCU_SYS_CLK_CPUS, /* cpus clock */
|
||
|
CCU_SYS_CLK_C0, /* cluster0 clock */
|
||
|
CCU_SYS_CLK_C1, /* cluster1 clock */
|
||
|
CCU_SYS_CLK_DDR0, /* ddr0 clock */
|
||
|
CCU_SYS_CLK_DDR1, /* ddr1 clock */
|
||
|
CCU_SYS_CLK_PERI0, /* peri0 clock */
|
||
|
CCU_SYS_CLK_PERI1, /* peri1 clock */
|
||
|
CCU_SYS_CLK_AXI0, /* AXI0 clock */
|
||
|
CCU_SYS_CLK_AXI1, /* AXI0 clock */
|
||
|
CCU_SYS_CLK_AHB0, /* AHB0 clock */
|
||
|
CCU_SYS_CLK_AHB1, /* AHB1 clock */
|
||
|
CCU_SYS_CLK_AHB2, /* AHB2 clock */
|
||
|
CCU_SYS_CLK_APB0, /* APB0 clock */
|
||
|
CCU_SYS_CLK_APB1, /* APB1 clock */
|
||
|
CCU_SYS_CLK_APB2, /* APB2 clock */
|
||
|
CCU_SYS_CLK_AHB3, /* AHB3 clock */
|
||
|
CCU_SYS_CLK_PSI, /* PSI clock */
|
||
|
CCU_SYS_CLK_AHBS, /* AHBS clock */
|
||
|
CCU_SYS_CLK_APBS1, /* APBS1 clock */
|
||
|
CCU_SYS_CLK_APBS2, /* APBS2 clock */
|
||
|
} ccu_sys_clk_e;
|
||
|
|
||
|
/* module clocks ID */
|
||
|
typedef enum ccu_mod_clk {
|
||
|
CCU_MOD_CLK_NONE,
|
||
|
|
||
|
CCU_MOD_CLK_CPUS,
|
||
|
CCU_MOD_CLK_AHB0,
|
||
|
CCU_MOD_CLK_APB0,
|
||
|
|
||
|
CCU_MOD_CLK_C0,
|
||
|
CCU_MOD_CLK_C1,
|
||
|
CCU_MOD_CLK_CPU0,
|
||
|
CCU_MOD_CLK_CPU1,
|
||
|
CCU_MOD_CLK_CPU2,
|
||
|
CCU_MOD_CLK_CPU3,
|
||
|
CCU_MOD_CLK_AHB1,
|
||
|
CCU_MOD_CLK_AHB2,
|
||
|
CCU_MOD_CLK_APB1,
|
||
|
CCU_MOD_CLK_APB2,
|
||
|
CCU_MOD_CLK_DMA,
|
||
|
CCU_MOD_CLK_SDRAM,
|
||
|
CCU_MOD_CLK_SPINLOCK,
|
||
|
CCU_MOD_CLK_MSGBOX,
|
||
|
CCU_MOD_CLK_MSGBOX0,
|
||
|
CCU_MOD_CLK_MSGBOX1,
|
||
|
CCU_MOD_CLK_MSGBOXR,
|
||
|
CCU_MOD_CLK_AHB1_SS,
|
||
|
CCU_MOD_CLK_AXI,
|
||
|
CCU_MOD_CLK_AXI0,
|
||
|
CCU_MOD_CLK_AXI1,
|
||
|
CCU_MOD_CLK_R_DMA,
|
||
|
CCU_MOD_CLK_R_DMA_MCLK,
|
||
|
CCU_MOD_CLK_R_ONEWIRE_SP,
|
||
|
CCU_MOD_CLK_R_CIR_SP,
|
||
|
CCU_MOD_CLK_R_TH,
|
||
|
CCU_MOD_CLK_R_ONEWIRE,
|
||
|
CCU_MOD_CLK_R_UART,
|
||
|
CCU_MOD_CLK_R_UART1,
|
||
|
CCU_MOD_CLK_R_UART2,
|
||
|
CCU_MOD_CLK_R_UART3,
|
||
|
CCU_MOD_CLK_R_UART4,
|
||
|
CCU_MOD_CLK_R_TIMER0_1,
|
||
|
CCU_MOD_CLK_R_P2WI,
|
||
|
CCU_MOD_CLK_R_RSB,
|
||
|
CCU_MOD_CLK_R_TWI,
|
||
|
CCU_MOD_CLK_R_TWI0,
|
||
|
CCU_MOD_CLK_R_TWI1,
|
||
|
CCU_MOD_CLK_R_TWI2,
|
||
|
CCU_MOD_CLK_R_CIR,
|
||
|
CCU_MOD_CLK_R_PIO,
|
||
|
CCU_MOD_CLK_R_VM,
|
||
|
CCU_MOD_CLK_R_THS,
|
||
|
CCU_MOD_CLK_R_LRADC,
|
||
|
CCU_MOD_CLK_R_CAN,
|
||
|
|
||
|
CCU_MOD_CLK_R_LPSD,
|
||
|
CCU_MOD_CLK_R_MAD,
|
||
|
CCU_MOD_CLK_R_MAD_SRAM,
|
||
|
CCU_MOD_CLK_R_MAD_CFG,
|
||
|
|
||
|
CCU_MOD_CLK_R_AC_ADC,
|
||
|
CCU_MOD_CLK_R_AC_DAC,
|
||
|
CCU_MOD_CLK_R_AUDIO_CODEC,
|
||
|
CCU_MOD_CLK_R_DMIC,
|
||
|
CCU_MOD_CLK_R_I2S0,
|
||
|
CCU_MOD_CLK_R_I2S0_ASRC,
|
||
|
CCU_MOD_CLK_R_I2S1,
|
||
|
|
||
|
CCU_MOD_CLK_VDD_SYS,
|
||
|
CCU_MOD_CLK_CCI400,
|
||
|
CCU_MOD_CLK_PSI,
|
||
|
CCU_MOD_CLK_AHB3,
|
||
|
CCU_MOD_CLK_AHBS,
|
||
|
CCU_MOD_CLK_APBS1,
|
||
|
CCU_MOD_CLK_APBS2,
|
||
|
CCU_MOD_CLK_R_RTC,
|
||
|
CCU_MOD_CLK_R_CPUSCFG,
|
||
|
CCU_MOD_CLK_R_PRCM,
|
||
|
CCU_MOD_CLK_R_WDG,
|
||
|
CCU_MOD_CLK_R_TWD,
|
||
|
CCU_MOD_CLK_R_PWM,
|
||
|
CCU_MOD_CLK_R_SPI,
|
||
|
CCU_MOD_CLK_R_INTC,
|
||
|
CCU_MOD_CLK_CPU_APB,
|
||
|
} ccu_mod_clk_e;
|
||
|
|
||
|
/* the power control modules */
|
||
|
typedef enum power_control_module {
|
||
|
/* cpux power controls */
|
||
|
PWRCTL_C0CPUX,
|
||
|
PWRCTL_C0CPU0,
|
||
|
PWRCTL_C0CPU1,
|
||
|
PWRCTL_C0CPU2,
|
||
|
PWRCTL_C0CPU3,
|
||
|
|
||
|
PWRCTL_C1CPUX,
|
||
|
PWRCTL_C1CPU0,
|
||
|
PWRCTL_C1CPU1,
|
||
|
PWRCTL_C1CPU2,
|
||
|
PWRCTL_C1CPU3,
|
||
|
|
||
|
/* vdd-sys power controls */
|
||
|
PWRCTL_VDD_CPUX_GPIO_PAD_HOLD,
|
||
|
PWRCTL_VDD_CPUS,
|
||
|
PWRCTL_VDD_AVCC_A,
|
||
|
PWRCTL_VCC_PLL,
|
||
|
PWRCTL_VCC_PLL_LOW_VOLT,
|
||
|
|
||
|
/* gpu power control */
|
||
|
PWRCTL_GPU,
|
||
|
PWRCTL_SYS2VDD_USB3,
|
||
|
PWRCTL_SYS2VDD_USB0,
|
||
|
} power_control_module_e;
|
||
|
|
||
|
/*
|
||
|
*********************************************************************************************************
|
||
|
* INITIALIZE CCU
|
||
|
*
|
||
|
* Description: initialize clock control unit.
|
||
|
*
|
||
|
* Arguments : none.
|
||
|
*
|
||
|
* Returns : OK if initialize ccu succeeded, others if failed.
|
||
|
*********************************************************************************************************
|
||
|
*/
|
||
|
s32 ccu_init(void);
|
||
|
|
||
|
/*
|
||
|
*********************************************************************************************************
|
||
|
* EXIT CCU
|
||
|
*
|
||
|
* Description: exit clock control unit.
|
||
|
*
|
||
|
* Arguments : none.
|
||
|
*
|
||
|
* Returns : OK if exit ccu succeeded, others if failed.
|
||
|
*********************************************************************************************************
|
||
|
*/
|
||
|
s32 ccu_exit(void);
|
||
|
|
||
|
|
||
|
void ccu_iosc_freq_update(void);
|
||
|
/*
|
||
|
*********************************************************************************************************
|
||
|
* SET SOURCE FREQUENCY
|
||
|
*
|
||
|
* Description: set the frequency of a specific source clock.
|
||
|
*
|
||
|
* Arguments : sclk : the source clock ID which we want to set frequency.
|
||
|
* freq : the frequency which we want to set.
|
||
|
*
|
||
|
* Returns : OK if set source frequency succeeded, others if failed.
|
||
|
*********************************************************************************************************
|
||
|
*/
|
||
|
s32 ccu_set_sclk_freq(u32 sclk, u32 freq);
|
||
|
|
||
|
/*
|
||
|
*********************************************************************************************************
|
||
|
* GET SOURCE FREQUENCY
|
||
|
*
|
||
|
* Description: get the frequency of a specific source clock.
|
||
|
*
|
||
|
* Arguments : sclk : the source clock ID which we want to get frequency.
|
||
|
*
|
||
|
* Returns : frequency of the specific source clock.
|
||
|
*********************************************************************************************************
|
||
|
*/
|
||
|
u32 ccu_get_sclk_freq(u32 sclk);
|
||
|
|
||
|
s32 ccu_set_sclk_onoff(u32 sclk, s32 onoff);
|
||
|
|
||
|
/*
|
||
|
*********************************************************************************************************
|
||
|
* REGISTER MODULE CB
|
||
|
*
|
||
|
* Description: register call-back for module clock, when the source frequency
|
||
|
* of the module clock changed, it will use this call-back to notify
|
||
|
* module driver.
|
||
|
*
|
||
|
* Arguments : mclk : the module clock ID which we want to register call-back.
|
||
|
* pcb : the call-back which we want to register.
|
||
|
*
|
||
|
* Returns : OK if register call-back succeeded, others if failed.
|
||
|
*********************************************************************************************************
|
||
|
*/
|
||
|
s32 ccu_reg_mclk_cb(u32 mclk, __pNotifier_t pcb);
|
||
|
|
||
|
/*
|
||
|
*********************************************************************************************************
|
||
|
* UNREGISTER MODULE CB
|
||
|
*
|
||
|
* Description: unregister call-back for module clock.
|
||
|
*
|
||
|
* Arguments : mclk : the module clock ID which we want to unregister call-back.
|
||
|
* pcb : the call-back which we want to unregister.
|
||
|
*
|
||
|
* Returns : OK if unregister call-back succeeded, others if failed.
|
||
|
*********************************************************************************************************
|
||
|
*/
|
||
|
s32 ccu_unreg_mclk_cb(u32 mclk, __pNotifier_t pcb);
|
||
|
|
||
|
/*
|
||
|
*********************************************************************************************************
|
||
|
* SET SOURCE OF MODULE CLOCK
|
||
|
*
|
||
|
* Description: set the source of a specific module clock.
|
||
|
*
|
||
|
* Arguments : mclk : the module clock ID which we want to set source.
|
||
|
* sclk : the source clock ID whick we want to set as source.
|
||
|
*
|
||
|
* Returns : OK if set source succeeded, others if failed.
|
||
|
*********************************************************************************************************
|
||
|
*/
|
||
|
s32 ccu_set_mclk_src(u32 mclk, u32 sclk);
|
||
|
|
||
|
/*
|
||
|
*********************************************************************************************************
|
||
|
* GET SOURCE OF MODULE CLOCK
|
||
|
*
|
||
|
* Description: get the source of a specific module clock.
|
||
|
*
|
||
|
* Arguments : mclk : the module clock ID which we want to get source.
|
||
|
*
|
||
|
* Returns : the source clock ID of source clock.
|
||
|
*********************************************************************************************************
|
||
|
*/
|
||
|
s32 ccu_get_mclk_src(u32 mclk);
|
||
|
|
||
|
/*
|
||
|
*********************************************************************************************************
|
||
|
* SET DIVIDER OF MODULE CLOCK
|
||
|
*
|
||
|
* Description: set the divider of a specific module clock.
|
||
|
*
|
||
|
* Arguments : mclk : the module clock ID which we want to set divider.
|
||
|
* div : the divider whick we want to set as source.
|
||
|
*
|
||
|
* Returns : OK if set divider succeeded, others if failed.
|
||
|
*********************************************************************************************************
|
||
|
*/
|
||
|
s32 ccu_set_mclk_div(u32 mclk, u32 div);
|
||
|
|
||
|
/*
|
||
|
*********************************************************************************************************
|
||
|
* GET DIVIDER OF MODULE CLOCK
|
||
|
*
|
||
|
* Description: get the divider of a specific module clock.
|
||
|
*
|
||
|
* Arguments : mclk : the module clock ID which we want to get divider.
|
||
|
*
|
||
|
* Returns : the divider of the specific module clock.
|
||
|
*********************************************************************************************************
|
||
|
*/
|
||
|
s32 ccu_get_mclk_div(u32 mclk);
|
||
|
|
||
|
/*
|
||
|
*********************************************************************************************************
|
||
|
* SET ON-OFF STATUS OF MODULE CLOCK
|
||
|
*
|
||
|
* Description: set the on-off status of a specific module clock.
|
||
|
*
|
||
|
* Arguments : mclk : the module clock ID which we want to set on-off status.
|
||
|
* onoff : the on-off status which we want to set, the detail please
|
||
|
* refer to the clock status of on-off.
|
||
|
*
|
||
|
* Returns : OK if set module clock on-off status succeeded, others if failed.
|
||
|
*********************************************************************************************************
|
||
|
*/
|
||
|
s32 ccu_set_mclk_onoff(u32 mclk, s32 onoff);
|
||
|
|
||
|
/*
|
||
|
*********************************************************************************************************
|
||
|
* SET RESET STATUS OF MODULE CLOCK
|
||
|
*
|
||
|
* Description: set the reset status of a specific module clock.
|
||
|
*
|
||
|
* Arguments : mclk : the module clock ID which we want to set reset status.
|
||
|
* reset : the reset status which we want to set, the detail please
|
||
|
* refer to the clock status of reset.
|
||
|
*
|
||
|
* Returns : OK if set module clock reset status succeeded, others if failed.
|
||
|
*********************************************************************************************************
|
||
|
*/
|
||
|
s32 ccu_set_mclk_reset(u32 mclk, s32 reset);
|
||
|
|
||
|
/*
|
||
|
*********************************************************************************************************
|
||
|
* SET POWER OFF STATUS OF HWMODULE
|
||
|
*
|
||
|
* Description: set the power off gating status of a specific module.
|
||
|
*
|
||
|
* Arguments : module : the module ID which we want to set power off gating status.
|
||
|
* status : the power off status which we want to set, the detail please
|
||
|
* refer to the status of power-off gating.
|
||
|
*
|
||
|
* Returns : OK if set module power off gating status succeeded, others if failed.
|
||
|
*********************************************************************************************************
|
||
|
*/
|
||
|
s32 ccu_set_poweroff_gating_state(s32 module, s32 state);
|
||
|
|
||
|
/*
|
||
|
*********************************************************************************************************
|
||
|
* RESET MODULE
|
||
|
*
|
||
|
* Description: reset a specific module.
|
||
|
*
|
||
|
* Arguments : module : the module clock ID which we want to reset.
|
||
|
*
|
||
|
* Returns : OK if reset module succeeded, others if failed.
|
||
|
*********************************************************************************************************
|
||
|
*/
|
||
|
s32 ccu_reset_module(u32 mclk);
|
||
|
|
||
|
s32 ccu_24mhosc_disable(void);
|
||
|
s32 ccu_24mhosc_enable(void);
|
||
|
s32 ccu_24mhosc_reg_cb(__pNotifier_t pcb);
|
||
|
s32 is_hosc_lock(void);
|
||
|
|
||
|
static inline void save_state_flag(u32 value)
|
||
|
{
|
||
|
// hal_writel(value, RTC_RECORD_REG);
|
||
|
}
|
||
|
|
||
|
extern u32 iosc_freq;
|
||
|
extern u32 losc_freq;
|
||
|
void osc_freq_init(void);
|
||
|
void osc_freq_filter(void);
|
||
|
|
||
|
#endif /* __PRCM_H__ */
|
||
|
|