|
@@ -216,7 +216,7 @@ static inline void serial_putc(char c)
|
|
# define CONFIG_VR_CTL_VAL (CONFIG_VR_CTL_CLKBUF | CONFIG_VR_CTL_VLEV | CONFIG_VR_CTL_FREQ)
|
|
# define CONFIG_VR_CTL_VAL (CONFIG_VR_CTL_CLKBUF | CONFIG_VR_CTL_VLEV | CONFIG_VR_CTL_FREQ)
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-__attribute__((saveall))
|
|
|
|
|
|
+BOOTROM_CALLED_FUNC_ATTR
|
|
void initcode(ADI_BOOT_DATA *bootstruct)
|
|
void initcode(ADI_BOOT_DATA *bootstruct)
|
|
{
|
|
{
|
|
uint32_t old_baud = serial_init();
|
|
uint32_t old_baud = serial_init();
|
|
@@ -267,34 +267,50 @@ void initcode(ADI_BOOT_DATA *bootstruct)
|
|
bfin_write_SIC_IWR(1);
|
|
bfin_write_SIC_IWR(1);
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- serial_putc('L');
|
|
|
|
|
|
+ /* With newer bootroms, we use the helper function to set up
|
|
|
|
+ * the memory controller. Older bootroms lacks such helpers
|
|
|
|
+ * so we do it ourselves.
|
|
|
|
+ */
|
|
|
|
+ if (BOOTROM_CAPS_SYSCONTROL) {
|
|
|
|
+ serial_putc('S');
|
|
|
|
|
|
- bfin_write_PLL_LOCKCNT(CONFIG_PLL_LOCKCNT_VAL);
|
|
|
|
|
|
+ ADI_SYSCTRL_VALUES memory_settings;
|
|
|
|
+ memory_settings.uwVrCtl = CONFIG_VR_CTL_VAL;
|
|
|
|
+ memory_settings.uwPllCtl = CONFIG_PLL_CTL_VAL;
|
|
|
|
+ memory_settings.uwPllDiv = CONFIG_PLL_DIV_VAL;
|
|
|
|
+ memory_settings.uwPllLockCnt = CONFIG_PLL_LOCKCNT_VAL;
|
|
|
|
+ syscontrol(SYSCTRL_WRITE | SYSCTRL_VRCTL | SYSCTRL_PLLCTL | SYSCTRL_PLLDIV | SYSCTRL_LOCKCNT |
|
|
|
|
+ (CONFIG_VR_CTL_VAL & FREQ_MASK ? SYSCTRL_INTVOLTAGE : SYSCTRL_EXTVOLTAGE), &memory_settings, NULL);
|
|
|
|
+ } else {
|
|
|
|
+ serial_putc('L');
|
|
|
|
|
|
- serial_putc('A');
|
|
|
|
|
|
+ bfin_write_PLL_LOCKCNT(CONFIG_PLL_LOCKCNT_VAL);
|
|
|
|
|
|
- /* Only reprogram when needed to avoid triggering unnecessary
|
|
|
|
- * PLL relock sequences.
|
|
|
|
- */
|
|
|
|
- if (bfin_read_VR_CTL() != CONFIG_VR_CTL_VAL) {
|
|
|
|
- serial_putc('!');
|
|
|
|
- bfin_write_VR_CTL(CONFIG_VR_CTL_VAL);
|
|
|
|
- asm("idle;");
|
|
|
|
- }
|
|
|
|
|
|
+ serial_putc('A');
|
|
|
|
|
|
- serial_putc('C');
|
|
|
|
|
|
+ /* Only reprogram when needed to avoid triggering unnecessary
|
|
|
|
+ * PLL relock sequences.
|
|
|
|
+ */
|
|
|
|
+ if (bfin_read_VR_CTL() != CONFIG_VR_CTL_VAL) {
|
|
|
|
+ serial_putc('!');
|
|
|
|
+ bfin_write_VR_CTL(CONFIG_VR_CTL_VAL);
|
|
|
|
+ asm("idle;");
|
|
|
|
+ }
|
|
|
|
|
|
- bfin_write_PLL_DIV(CONFIG_PLL_DIV_VAL);
|
|
|
|
|
|
+ serial_putc('C');
|
|
|
|
|
|
- serial_putc('K');
|
|
|
|
|
|
+ bfin_write_PLL_DIV(CONFIG_PLL_DIV_VAL);
|
|
|
|
|
|
- /* Only reprogram when needed to avoid triggering unnecessary
|
|
|
|
- * PLL relock sequences.
|
|
|
|
- */
|
|
|
|
- if (bfin_read_PLL_CTL() != CONFIG_PLL_CTL_VAL) {
|
|
|
|
- serial_putc('!');
|
|
|
|
- bfin_write_PLL_CTL(CONFIG_PLL_CTL_VAL);
|
|
|
|
- asm("idle;");
|
|
|
|
|
|
+ serial_putc('K');
|
|
|
|
+
|
|
|
|
+ /* Only reprogram when needed to avoid triggering unnecessary
|
|
|
|
+ * PLL relock sequences.
|
|
|
|
+ */
|
|
|
|
+ if (bfin_read_PLL_CTL() != CONFIG_PLL_CTL_VAL) {
|
|
|
|
+ serial_putc('!');
|
|
|
|
+ bfin_write_PLL_CTL(CONFIG_PLL_CTL_VAL);
|
|
|
|
+ asm("idle;");
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/* Since we've changed the SCLK above, we may need to update
|
|
/* Since we've changed the SCLK above, we may need to update
|