| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431 |
- /*
- *********************************************************************************************************
- * 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__ */
|