Skip to content
Snippets Groups Projects
Commit ed80584f authored by Chen-Yu Tsai's avatar Chen-Yu Tsai Committed by Hans de Goede
Browse files

sunxi: Support H3 CCU security switches


H3's CCU includes some switches which disable non-secure access to some
of the more critical clock controls, such as MBUS, PLLs, and main
platform busses.

Configure them to enable non-secure access.

For now the only SoC that has this feature is the H3. For other
platforms just use a default (weak) empty function so things do
not break.

Signed-off-by: default avatarChen-Yu Tsai <wens@csie.org>
Acked-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent 5823664f
No related branches found
No related tags found
No related merge requests found
...@@ -14,12 +14,17 @@ ...@@ -14,12 +14,17 @@
#include <asm/arch/gpio.h> #include <asm/arch/gpio.h>
#include <asm/arch/sys_proto.h> #include <asm/arch/sys_proto.h>
__weak void clock_init_sec(void)
{
}
int clock_init(void) int clock_init(void)
{ {
#ifdef CONFIG_SPL_BUILD #ifdef CONFIG_SPL_BUILD
clock_init_safe(); clock_init_safe();
#endif #endif
clock_init_uart(); clock_init_uart();
clock_init_sec();
return 0; return 0;
} }
...@@ -45,6 +45,19 @@ void clock_init_safe(void) ...@@ -45,6 +45,19 @@ void clock_init_safe(void)
} }
#endif #endif
void clock_init_sec(void)
{
#ifdef CONFIG_MACH_SUN8I_H3
struct sunxi_ccm_reg * const ccm =
(struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
setbits_le32(&ccm->ccu_sec_switch,
CCM_SEC_SWITCH_MBUS_NONSEC |
CCM_SEC_SWITCH_BUS_NONSEC |
CCM_SEC_SWITCH_PLL_NONSEC);
#endif
}
void clock_init_uart(void) void clock_init_uart(void)
{ {
#if CONFIG_CONS_INDEX < 5 #if CONFIG_CONS_INDEX < 5
......
...@@ -30,6 +30,7 @@ int clock_init(void); ...@@ -30,6 +30,7 @@ int clock_init(void);
int clock_twi_onoff(int port, int state); int clock_twi_onoff(int port, int state);
void clock_set_de_mod_clock(u32 *clk_cfg, unsigned int hz); void clock_set_de_mod_clock(u32 *clk_cfg, unsigned int hz);
void clock_init_safe(void); void clock_init_safe(void);
void clock_init_sec(void);
void clock_init_uart(void); void clock_init_uart(void);
#endif #endif
......
...@@ -137,6 +137,8 @@ struct sunxi_ccm_reg { ...@@ -137,6 +137,8 @@ struct sunxi_ccm_reg {
u32 apb1_reset_cfg; /* 0x2d0 APB1 Reset config */ u32 apb1_reset_cfg; /* 0x2d0 APB1 Reset config */
u32 reserved24; u32 reserved24;
u32 apb2_reset_cfg; /* 0x2d8 APB2 Reset config */ u32 apb2_reset_cfg; /* 0x2d8 APB2 Reset config */
u32 reserved25[5];
u32 ccu_sec_switch; /* 0x2f0 CCU Security Switch, H3 only */
}; };
/* apb2 bit field */ /* apb2 bit field */
...@@ -375,6 +377,11 @@ struct sunxi_ccm_reg { ...@@ -375,6 +377,11 @@ struct sunxi_ccm_reg {
#define CCM_DE_CTRL_PLL10 (5 << 24) #define CCM_DE_CTRL_PLL10 (5 << 24)
#define CCM_DE_CTRL_GATE (1 << 31) #define CCM_DE_CTRL_GATE (1 << 31)
/* CCU security switch, H3 only */
#define CCM_SEC_SWITCH_MBUS_NONSEC (1 << 2)
#define CCM_SEC_SWITCH_BUS_NONSEC (1 << 1)
#define CCM_SEC_SWITCH_PLL_NONSEC (1 << 0)
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
void clock_set_pll1(unsigned int hz); void clock_set_pll1(unsigned int hz);
void clock_set_pll3(unsigned int hz); void clock_set_pll3(unsigned int hz);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment