mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-28 00:11:32 +00:00

Kernel stores information to the RTC_SCRATCH0 and RTC_SCRATCH1 registers for wakeup from RTC-only mode with DDR in self-refresh. Parse these registers during SPL boot and jump to the kernel resume vector if the device is waking up from RTC-only modewith DDR in Self-refresh. The RTC scratch register layout used is: SCRATCH0 : bits00-31 : kernel resume address SCRATCH1 : bits00-15 : RTC magic value used to detect valid config SCRATCH1 : bits16-31 : board type information populated by bootloader During the normal boot path the SCRATCH1 : bits16-31 are updated with the eeprom read board type data. In the rtc_only boot path the rtc scratchpad register is read and the board type is determined and correspondingly ddr dpll parameters are set. This is done so as to avoid costly i2c read to eeprom. RTC-only +DRR in self-refresh mode support is currently only enabled for am43xx_evm_rtconly_config. This is not to be used with epos evm builds. Signed-off-by: Tero Kristo <t-kristo@ti.com> [j-keerthy@ti.com Rebased to latest u-boot master branch] Signed-off-by: Keerthy <j-keerthy@ti.com> Reviewed-by: Tom Rini <trini@konsulko.com>
135 lines
3.9 KiB
C
135 lines
3.9 KiB
C
/*
|
|
* clock.h
|
|
*
|
|
* clock header
|
|
*
|
|
* Copyright (C) 2011, Texas Instruments Incorporated - http://www.ti.com/
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
|
|
#ifndef _CLOCKS_H_
|
|
#define _CLOCKS_H_
|
|
|
|
#include <asm/arch/clocks_am33xx.h>
|
|
#include <asm/arch/hardware.h>
|
|
|
|
#if defined(CONFIG_TI816X) || defined(CONFIG_TI814X)
|
|
#include <asm/arch/clock_ti81xx.h>
|
|
#endif
|
|
|
|
#define LDELAY 1000000
|
|
|
|
/*CM_<clock_domain>__CLKCTRL */
|
|
#define CD_CLKCTRL_CLKTRCTRL_SHIFT 0
|
|
#define CD_CLKCTRL_CLKTRCTRL_MASK 3
|
|
|
|
#define CD_CLKCTRL_CLKTRCTRL_NO_SLEEP 0
|
|
#define CD_CLKCTRL_CLKTRCTRL_SW_SLEEP 1
|
|
#define CD_CLKCTRL_CLKTRCTRL_SW_WKUP 2
|
|
|
|
/* CM_<clock_domain>_<module>_CLKCTRL */
|
|
#define MODULE_CLKCTRL_MODULEMODE_SHIFT 0
|
|
#define MODULE_CLKCTRL_MODULEMODE_MASK 3
|
|
#define MODULE_CLKCTRL_IDLEST_SHIFT 16
|
|
#define MODULE_CLKCTRL_IDLEST_MASK (3 << 16)
|
|
|
|
#define MODULE_CLKCTRL_MODULEMODE_SW_DISABLE 0
|
|
#define MODULE_CLKCTRL_MODULEMODE_SW_EXPLICIT_EN 2
|
|
|
|
#define MODULE_CLKCTRL_IDLEST_FULLY_FUNCTIONAL 0
|
|
#define MODULE_CLKCTRL_IDLEST_TRANSITIONING 1
|
|
#define MODULE_CLKCTRL_IDLEST_IDLE 2
|
|
#define MODULE_CLKCTRL_IDLEST_DISABLED 3
|
|
|
|
/* CM_CLKMODE_DPLL */
|
|
#define CM_CLKMODE_DPLL_SSC_EN_SHIFT 12
|
|
#define CM_CLKMODE_DPLL_SSC_EN_MASK (1 << 12)
|
|
#define CM_CLKMODE_DPLL_SSC_ACK_MASK (1 << 13)
|
|
#define CM_CLKMODE_DPLL_SSC_DOWNSPREAD_MASK (1 << 14)
|
|
#define CM_CLKMODE_DPLL_SSC_TYPE_MASK (1 << 15)
|
|
#define CM_CLKMODE_DPLL_REGM4XEN_SHIFT 11
|
|
#define CM_CLKMODE_DPLL_REGM4XEN_MASK (1 << 11)
|
|
#define CM_CLKMODE_DPLL_LPMODE_EN_SHIFT 10
|
|
#define CM_CLKMODE_DPLL_LPMODE_EN_MASK (1 << 10)
|
|
#define CM_CLKMODE_DPLL_RELOCK_RAMP_EN_SHIFT 9
|
|
#define CM_CLKMODE_DPLL_RELOCK_RAMP_EN_MASK (1 << 9)
|
|
#define CM_CLKMODE_DPLL_DRIFTGUARD_EN_SHIFT 8
|
|
#define CM_CLKMODE_DPLL_DRIFTGUARD_EN_MASK (1 << 8)
|
|
#define CM_CLKMODE_DPLL_RAMP_RATE_SHIFT 5
|
|
#define CM_CLKMODE_DPLL_RAMP_RATE_MASK (0x7 << 5)
|
|
#define CM_CLKMODE_DPLL_EN_SHIFT 0
|
|
#define CM_CLKMODE_DPLL_EN_MASK (0x7 << 0)
|
|
|
|
#define CM_CLKMODE_DPLL_DPLL_EN_SHIFT 0
|
|
#define CM_CLKMODE_DPLL_DPLL_EN_MASK 7
|
|
|
|
#define DPLL_EN_STOP 1
|
|
#define DPLL_EN_MN_BYPASS 4
|
|
#define DPLL_EN_LOW_POWER_BYPASS 5
|
|
#define DPLL_EN_LOCK 7
|
|
|
|
/* CM_IDLEST_DPLL fields */
|
|
#define ST_DPLL_CLK_MASK 1
|
|
|
|
/* CM_CLKSEL_DPLL */
|
|
#define CM_CLKSEL_DPLL_M_SHIFT 8
|
|
#define CM_CLKSEL_DPLL_M_MASK (0x7FF << 8)
|
|
#define CM_CLKSEL_DPLL_N_SHIFT 0
|
|
#define CM_CLKSEL_DPLL_N_MASK 0x7F
|
|
|
|
struct dpll_params {
|
|
u32 m;
|
|
u32 n;
|
|
s8 m2;
|
|
s8 m3;
|
|
s8 m4;
|
|
s8 m5;
|
|
s8 m6;
|
|
};
|
|
|
|
struct dpll_regs {
|
|
u32 cm_clkmode_dpll;
|
|
u32 cm_idlest_dpll;
|
|
u32 cm_autoidle_dpll;
|
|
u32 cm_clksel_dpll;
|
|
u32 cm_div_m2_dpll;
|
|
u32 cm_div_m3_dpll;
|
|
u32 cm_div_m4_dpll;
|
|
u32 cm_div_m5_dpll;
|
|
u32 cm_div_m6_dpll;
|
|
};
|
|
|
|
extern const struct dpll_regs dpll_mpu_regs;
|
|
extern const struct dpll_regs dpll_core_regs;
|
|
extern const struct dpll_regs dpll_per_regs;
|
|
extern const struct dpll_regs dpll_ddr_regs;
|
|
extern const struct dpll_regs dpll_disp_regs;
|
|
extern const struct dpll_params dpll_mpu_opp[NUM_CRYSTAL_FREQ][NUM_OPPS];
|
|
extern const struct dpll_params dpll_core_1000MHz[NUM_CRYSTAL_FREQ];
|
|
extern const struct dpll_params dpll_per_192MHz[NUM_CRYSTAL_FREQ];
|
|
extern const struct dpll_params dpll_ddr2_266MHz[NUM_CRYSTAL_FREQ];
|
|
extern const struct dpll_params dpll_ddr3_303MHz[NUM_CRYSTAL_FREQ];
|
|
extern const struct dpll_params dpll_ddr3_400MHz[NUM_CRYSTAL_FREQ];
|
|
|
|
extern struct cm_wkuppll *const cmwkup;
|
|
|
|
const struct dpll_params *get_dpll_mpu_params(void);
|
|
const struct dpll_params *get_dpll_core_params(void);
|
|
const struct dpll_params *get_dpll_per_params(void);
|
|
const struct dpll_params *get_dpll_ddr_params(void);
|
|
void scale_vcores(void);
|
|
void do_setup_dpll(const struct dpll_regs *, const struct dpll_params *);
|
|
void prcm_init(void);
|
|
void enable_basic_clocks(void);
|
|
|
|
void rtc_only_update_board_type(u32 btype);
|
|
u32 rtc_only_get_board_type(void);
|
|
void rtc_only_prcm_init(void);
|
|
void rtc_only_enable_basic_clocks(void);
|
|
|
|
void do_enable_clocks(u32 *const *, u32 *const *, u8);
|
|
void do_disable_clocks(u32 *const *, u32 *const *, u8);
|
|
|
|
void set_mpu_spreadspectrum(int permille);
|
|
#endif
|