]>
Commit | Line | Data |
---|---|---|
5e993f12 | 1 | From f2501ad7f47f0b912b53e3e2094e9bfe12f2a491 Mon Sep 17 00:00:00 2001 |
2 | From: Mike Frysinger <vapier.adi@gmail.com> | |
3 | Date: Fri, 4 Jan 2008 17:05:28 -0500 | |
4 | Subject: [PATCH] use syscontrol functions where possible | |
5 | ||
6 | this works on my bf548-ezkit 0.1 and should use the bootrom func to | |
7 | program the memory which means the otp fps will be taken into account | |
8 | --- | |
9 | cpu/blackfin/initcode.c | 57 +++++++++++++++++++++++++++++----------------- | |
10 | cpu/blackfin/reset.c | 8 +++++- | |
11 | 2 files changed, 42 insertions(+), 23 deletions(-) | |
12 | ||
13 | diff --git a/cpu/blackfin/initcode.c b/cpu/blackfin/initcode.c | |
14 | index 360caa8..1e39043 100644 | |
15 | --- a/cpu/blackfin/initcode.c | |
16 | +++ b/cpu/blackfin/initcode.c | |
17 | @@ -299,34 +299,49 @@ void initcode(ADI_BOOT_DATA *bootstruct) | |
18 | bfin_write_SIC_IWR(1); | |
19 | #endif | |
20 | ||
21 | - serial_putc('L'); | |
22 | + /* With newer bootroms, we use the helper function to set up | |
23 | + * the memory controller. Older bootroms lacks such helpers | |
24 | + * so we do it ourselves. | |
25 | + */ | |
26 | + if (BOOTROM_CAPS_SYSCONTROL) { | |
27 | + serial_putc('S'); | |
28 | ||
29 | - bfin_write_PLL_LOCKCNT(CONFIG_PLL_LOCKCNT_VAL); | |
30 | + ADI_SYSCTRL_VALUES memory_settings; | |
31 | + memory_settings.uwVrCtl = CONFIG_VR_CTL_VAL; | |
32 | + memory_settings.uwPllCtl = CONFIG_PLL_CTL_VAL; | |
33 | + memory_settings.uwPllDiv = CONFIG_PLL_DIV_VAL; | |
34 | + memory_settings.uwPllLockCnt = CONFIG_PLL_LOCKCNT_VAL; | |
35 | + syscontrol(SYSCTRL_WRITE | SYSCTRL_PLLCTL | SYSCTRL_PLLDIV | SYSCTRL_VRCTL | SYSCTRL_INTVOLTAGE, &memory_settings, NULL); | |
36 | + } else { | |
37 | + serial_putc('L'); | |
38 | ||
39 | - serial_putc('A'); | |
40 | + bfin_write_PLL_LOCKCNT(CONFIG_PLL_LOCKCNT_VAL); | |
41 | ||
42 | - /* Only reprogram when needed to avoid triggering unnecessary | |
43 | - * PLL relock sequences. | |
44 | - */ | |
45 | - if (bfin_read_VR_CTL() != CONFIG_VR_CTL_VAL) { | |
46 | - serial_putc('!'); | |
47 | - bfin_write_VR_CTL(CONFIG_VR_CTL_VAL); | |
48 | - asm("idle;"); | |
49 | - } | |
50 | + serial_putc('A'); | |
51 | ||
52 | - serial_putc('C'); | |
53 | + /* Only reprogram when needed to avoid triggering unnecessary | |
54 | + * PLL relock sequences. | |
55 | + */ | |
56 | + if (bfin_read_VR_CTL() != CONFIG_VR_CTL_VAL) { | |
57 | + serial_putc('!'); | |
58 | + bfin_write_VR_CTL(CONFIG_VR_CTL_VAL); | |
59 | + asm("idle;"); | |
60 | + } | |
61 | ||
62 | - bfin_write_PLL_DIV(CONFIG_PLL_DIV_VAL); | |
63 | + serial_putc('C'); | |
64 | ||
65 | - serial_putc('K'); | |
66 | + bfin_write_PLL_DIV(CONFIG_PLL_DIV_VAL); | |
67 | ||
68 | - /* Only reprogram when needed to avoid triggering unnecessary | |
69 | - * PLL relock sequences. | |
70 | - */ | |
71 | - if (bfin_read_PLL_CTL() != CONFIG_PLL_CTL_VAL) { | |
72 | - serial_putc('!'); | |
73 | - bfin_write_PLL_CTL(CONFIG_PLL_CTL_VAL); | |
74 | - asm("idle;"); | |
75 | + serial_putc('K'); | |
76 | + | |
77 | + /* Only reprogram when needed to avoid triggering unnecessary | |
78 | + * PLL relock sequences. | |
79 | + */ | |
80 | + if (bfin_read_PLL_CTL() != CONFIG_PLL_CTL_VAL) { | |
81 | + serial_putc('!'); | |
82 | + bfin_write_PLL_CTL(CONFIG_PLL_CTL_VAL); | |
83 | + asm("idle;"); | |
84 | + } | |
85 | } | |
86 | ||
87 | /* Since we've changed the SCLK above, we may need to update | |
88 | diff --git a/cpu/blackfin/reset.c b/cpu/blackfin/reset.c | |
89 | index b796740..be08d80 100644 | |
90 | --- a/cpu/blackfin/reset.c | |
91 | +++ b/cpu/blackfin/reset.c | |
92 | @@ -8,6 +8,7 @@ | |
93 | #include <common.h> | |
94 | #include <command.h> | |
95 | #include <asm/blackfin.h> | |
96 | +#include <asm/mach-common/bits/bootrom.h> | |
97 | #include "cpu.h" | |
98 | ||
99 | /* A system soft reset makes external memory unusable so force | |
100 | @@ -19,7 +20,7 @@ | |
101 | * the core reset. | |
102 | */ | |
103 | __attribute__ ((__l1_text__, __noreturn__)) | |
104 | -void bfin_reset(void) | |
105 | +static void bfin_reset(void) | |
106 | { | |
107 | /* Wait for completion of "system" events such as cache line | |
108 | * line fills so that we avoid infinite stalls later on as | |
109 | @@ -75,7 +76,10 @@ static inline void bfin_reset_trampoline(void) | |
110 | if (board_reset) | |
111 | board_reset(); | |
112 | while (1) | |
113 | - asm("jump (%0);" : : "a" (bfin_reset)); | |
114 | + if (0 /*BOOTROM_CAPS_SYSCONTROL -- current silicon is broken*/) | |
115 | + syscontrol(SYSCTRL_SOFTRESET, NULL, NULL); | |
116 | + else | |
117 | + asm("jump (%0);" : : "a" (bfin_reset)); | |
118 | } | |
119 | ||
120 | __attribute__ ((__noreturn__)) | |
121 | -- | |
122 | 1.5.5.3 | |
123 |