mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-28 15:41:40 +00:00
sun6i: Add clock functions needed for SPL / DRAM init
Add clock_init_safe and clockset_pll5 functions, as these are needed for SPL support resp. DRAM init (which is needed for SPL too). Also add some extra clock register constant defines. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Acked-by: Ian Campbell <ijc@hellion.org.uk>
This commit is contained in:
parent
5c7f10fda3
commit
62c87ef2e9
5 changed files with 106 additions and 1 deletions
|
@ -16,6 +16,33 @@
|
|||
#include <asm/arch/prcm.h>
|
||||
#include <asm/arch/sys_proto.h>
|
||||
|
||||
#ifdef CONFIG_SPL_BUILD
|
||||
void clock_init_safe(void)
|
||||
{
|
||||
struct sunxi_ccm_reg * const ccm =
|
||||
(struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
|
||||
struct sunxi_prcm_reg * const prcm =
|
||||
(struct sunxi_prcm_reg *)SUNXI_PRCM_BASE;
|
||||
|
||||
/* Set PLL ldo voltage without this PLL6 does not work properly */
|
||||
clrsetbits_le32(&prcm->pll_ctrl1, PRCM_PLL_CTRL_LDO_KEY_MASK,
|
||||
PRCM_PLL_CTRL_LDO_KEY);
|
||||
clrsetbits_le32(&prcm->pll_ctrl1, ~PRCM_PLL_CTRL_LDO_KEY_MASK,
|
||||
PRCM_PLL_CTRL_LDO_DIGITAL_EN | PRCM_PLL_CTRL_LDO_ANALOG_EN |
|
||||
PRCM_PLL_CTRL_EXT_OSC_EN | PRCM_PLL_CTRL_LDO_OUT_L(1140));
|
||||
clrbits_le32(&prcm->pll_ctrl1, PRCM_PLL_CTRL_LDO_KEY_MASK);
|
||||
|
||||
clock_set_pll1(408000000);
|
||||
|
||||
writel(AHB1_ABP1_DIV_DEFAULT, &ccm->ahb1_apb1_div);
|
||||
|
||||
writel(PLL6_CFG_DEFAULT, &ccm->pll6_cfg);
|
||||
|
||||
writel(MBUS_CLK_DEFAULT, &ccm->mbus0_clk_cfg);
|
||||
writel(MBUS_CLK_DEFAULT, &ccm->mbus1_clk_cfg);
|
||||
}
|
||||
#endif
|
||||
|
||||
void clock_init_uart(void)
|
||||
{
|
||||
struct sunxi_ccm_reg *const ccm =
|
||||
|
@ -65,6 +92,56 @@ int clock_twi_onoff(int port, int state)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPL_BUILD
|
||||
void clock_set_pll1(unsigned int clk)
|
||||
{
|
||||
struct sunxi_ccm_reg * const ccm =
|
||||
(struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
|
||||
int k = 1;
|
||||
int m = 1;
|
||||
|
||||
if (clk > 1152000000) {
|
||||
k = 2;
|
||||
} else if (clk > 768000000) {
|
||||
k = 3;
|
||||
m = 2;
|
||||
}
|
||||
|
||||
/* Switch to 24MHz clock while changing PLL1 */
|
||||
writel(AXI_DIV_3 << AXI_DIV_SHIFT |
|
||||
ATB_DIV_2 << ATB_DIV_SHIFT |
|
||||
CPU_CLK_SRC_OSC24M << CPU_CLK_SRC_SHIFT,
|
||||
&ccm->cpu_axi_cfg);
|
||||
|
||||
/* PLL1 rate = 24000000 * n * k / m */
|
||||
writel(CCM_PLL1_CTRL_EN | CCM_PLL1_CTRL_MAGIC |
|
||||
CCM_PLL1_CTRL_N(clk / (24000000 * k / m)) |
|
||||
CCM_PLL1_CTRL_K(k) | CCM_PLL1_CTRL_M(m), &ccm->pll1_cfg);
|
||||
sdelay(200);
|
||||
|
||||
/* Switch CPU to PLL1 */
|
||||
writel(AXI_DIV_3 << AXI_DIV_SHIFT |
|
||||
ATB_DIV_2 << ATB_DIV_SHIFT |
|
||||
CPU_CLK_SRC_PLL1 << CPU_CLK_SRC_SHIFT,
|
||||
&ccm->cpu_axi_cfg);
|
||||
}
|
||||
#endif
|
||||
|
||||
void clock_set_pll5(unsigned int clk)
|
||||
{
|
||||
struct sunxi_ccm_reg * const ccm =
|
||||
(struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
|
||||
const int k = 2;
|
||||
const int m = 1;
|
||||
|
||||
/* PLL5 rate = 24000000 * n * k / m */
|
||||
writel(CCM_PLL5_CTRL_EN | CCM_PLL5_CTRL_UPD |
|
||||
CCM_PLL5_CTRL_N(clk / (24000000 * k / m)) |
|
||||
CCM_PLL5_CTRL_K(k) | CCM_PLL5_CTRL_M(m), &ccm->pll5_cfg);
|
||||
|
||||
udelay(5500);
|
||||
}
|
||||
|
||||
unsigned int clock_get_pll6(void)
|
||||
{
|
||||
struct sunxi_ccm_reg *const ccm =
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
int clock_init(void);
|
||||
int clock_twi_onoff(int port, int state);
|
||||
void clock_set_pll1(unsigned int hz);
|
||||
void clock_set_pll5(unsigned int hz);
|
||||
unsigned int clock_get_pll5p(void);
|
||||
unsigned int clock_get_pll6(void);
|
||||
void clock_init_safe(void);
|
||||
|
|
|
@ -170,7 +170,17 @@ struct sunxi_ccm_reg {
|
|||
#define CPU_CLK_SRC_OSC24M 1
|
||||
#define CPU_CLK_SRC_PLL1 2
|
||||
|
||||
#define PLL1_CFG_DEFAULT 0x90011b21
|
||||
#define CCM_PLL1_CTRL_M(n) ((((n) - 1) & 0x3) << 0)
|
||||
#define CCM_PLL1_CTRL_K(n) ((((n) - 1) & 0x3) << 4)
|
||||
#define CCM_PLL1_CTRL_N(n) ((((n) - 1) & 0x1f) << 8)
|
||||
#define CCM_PLL1_CTRL_MAGIC (0x1 << 16)
|
||||
#define CCM_PLL1_CTRL_EN (0x1 << 31)
|
||||
|
||||
#define CCM_PLL5_CTRL_M(n) ((((n) - 1) & 0x3) << 0)
|
||||
#define CCM_PLL5_CTRL_K(n) ((((n) - 1) & 0x3) << 4)
|
||||
#define CCM_PLL5_CTRL_N(n) ((((n) - 1) & 0x1f) << 8)
|
||||
#define CCM_PLL5_CTRL_UPD (0x1 << 20)
|
||||
#define CCM_PLL5_CTRL_EN (0x1 << 31)
|
||||
|
||||
#define PLL6_CFG_DEFAULT 0x90041811
|
||||
|
||||
|
@ -179,6 +189,11 @@ struct sunxi_ccm_reg {
|
|||
#define CCM_PLL6_CTRL_K_SHIFT 4
|
||||
#define CCM_PLL6_CTRL_K_MASK (0x3 << CCM_PLL6_CTRL_K_SHIFT)
|
||||
|
||||
#define AHB1_ABP1_DIV_DEFAULT 0x00002020
|
||||
|
||||
#define AXI_GATE_OFFSET_DRAM 0
|
||||
|
||||
#define AHB_GATE_OFFSET_MCTL 14
|
||||
#define AHB_GATE_OFFSET_MMC3 11
|
||||
#define AHB_GATE_OFFSET_MMC2 10
|
||||
#define AHB_GATE_OFFSET_MMC1 9
|
||||
|
@ -190,6 +205,16 @@ struct sunxi_ccm_reg {
|
|||
|
||||
#define CCM_MMC_CTRL_ENABLE (0x1 << 31)
|
||||
|
||||
#define MDFS_CLK_DEFAULT 0x81000002 /* PLL6 / 3 */
|
||||
|
||||
#define CCM_DRAMCLK_CFG_DIV0(x) ((x - 1) << 8)
|
||||
#define CCM_DRAMCLK_CFG_DIV0_MASK (0xf << 8)
|
||||
#define CCM_DRAMCLK_CFG_UPD (0x1 << 16)
|
||||
#define CCM_DRAMCLK_CFG_RST (0x1 << 31)
|
||||
|
||||
#define MBUS_CLK_DEFAULT 0x81000001 /* PLL6 / 2 */
|
||||
|
||||
#define AHB_RESET_OFFSET_MCTL 14
|
||||
#define AHB_RESET_OFFSET_MMC3 11
|
||||
#define AHB_RESET_OFFSET_MMC2 10
|
||||
#define AHB_RESET_OFFSET_MMC1 9
|
||||
|
|
|
@ -119,6 +119,7 @@
|
|||
#define PRCM_PLL_CTRL_LDO_OUT_HV(n) \
|
||||
__PRCM_PLL_CTRL_VDD_LDO_OUT((((n) & 0x7) * 30) + 1160)
|
||||
#define PRCM_PLL_CTRL_LDO_KEY (0xa7 << 24)
|
||||
#define PRCM_PLL_CTRL_LDO_KEY_MASK (0xff << 24)
|
||||
|
||||
#define PRCM_CLK_1WIRE_GATE (0x1 << 31)
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
/*
|
||||
* A31 specific configuration
|
||||
*/
|
||||
#define CONFIG_CLK_FULL_SPEED 1008000000
|
||||
|
||||
#define CONFIG_SYS_PROMPT "sun6i# "
|
||||
|
||||
|
|
Loading…
Reference in a new issue