summaryrefslogtreecommitdiff
path: root/firmware/target/coldfire
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/coldfire')
-rw-r--r--firmware/target/coldfire/iriver/system-iriver.c156
-rw-r--r--firmware/target/coldfire/system-target.h8
2 files changed, 83 insertions, 81 deletions
diff --git a/firmware/target/coldfire/iriver/system-iriver.c b/firmware/target/coldfire/iriver/system-iriver.c
index 1916eec0cd..aa24f6ecc9 100644
--- a/firmware/target/coldfire/iriver/system-iriver.c
+++ b/firmware/target/coldfire/iriver/system-iriver.c
@@ -50,22 +50,15 @@
50 */ 50 */
51 51
52#if MEM < 32 52#if MEM < 32
53#define MAX_REFRESH_TIMER 59 53#define MAX_REFRESH_TIMER 54
54#define NORMAL_REFRESH_TIMER 21 54#define NORMAL_REFRESH_TIMER 10
55#define DEFAULT_REFRESH_TIMER 4 55#define DEFAULT_REFRESH_TIMER 4
56#else 56#else
57#define MAX_REFRESH_TIMER 29 57#define MAX_REFRESH_TIMER 26
58#define NORMAL_REFRESH_TIMER 10 58#define NORMAL_REFRESH_TIMER 4
59#define DEFAULT_REFRESH_TIMER 1 59#define DEFAULT_REFRESH_TIMER 1
60#endif 60#endif
61 61
62#ifdef IRIVER_H300_SERIES
63#define RECALC_DELAYS(f) \
64 pcf50606_i2c_recalc_delay(f)
65#else
66#define RECALC_DELAYS(f)
67#endif
68
69#ifdef HAVE_SERIAL 62#ifdef HAVE_SERIAL
70#define BAUD_RATE 57600 63#define BAUD_RATE 57600
71#define BAUDRATE_DIV_DEFAULT (CPUFREQ_DEFAULT/(BAUD_RATE*32*2)) 64#define BAUDRATE_DIV_DEFAULT (CPUFREQ_DEFAULT/(BAUD_RATE*32*2))
@@ -73,6 +66,21 @@
73#define BAUDRATE_DIV_MAX (CPUFREQ_MAX/(BAUD_RATE*32*2)) 66#define BAUDRATE_DIV_MAX (CPUFREQ_MAX/(BAUD_RATE*32*2))
74#endif 67#endif
75 68
69static bool pll_initialized = false;
70
71static void init_pll(void)
72{
73 /* Refresh timer for bypass frequency */
74 PLLCR &= ~1; /* Bypass mode */
75 PLLCR = 0x0189e025 | (PLLCR & 0x70400000); /* set 112 MHz */
76
77 /* Wait until the PLL has locked. This may take up to 10ms! */
78 while(!(PLLCR & 0x80000000)) {};
79
80 pll_initialized = true;
81}
82
83
76#ifdef HAVE_ADJUSTABLE_CPU_FREQ 84#ifdef HAVE_ADJUSTABLE_CPU_FREQ
77void set_cpu_frequency (long) __attribute__ ((section (".icode"))); 85void set_cpu_frequency (long) __attribute__ ((section (".icode")));
78void set_cpu_frequency(long frequency) 86void set_cpu_frequency(long frequency)
@@ -81,84 +89,78 @@ void cf_set_cpu_frequency (long) __attribute__ ((section (".icode")));
81void cf_set_cpu_frequency(long frequency) 89void cf_set_cpu_frequency(long frequency)
82#endif 90#endif
83{ 91{
92 if (!pll_initialized)
93 init_pll();
94
84 switch(frequency) 95 switch(frequency)
85 { 96 {
86 case CPUFREQ_MAX: 97 case CPUFREQ_MAX:
87 DCR = (0x8200 | DEFAULT_REFRESH_TIMER); 98 CSCR0 = 0x00001180; /* Flash: 4 wait states */
88 /* Refresh timer for bypass frequency */ 99 CSCR1 = 0x00001580; /* LCD: 5 wait states */
89 PLLCR &= ~1; /* Bypass mode */
90 timers_adjust_prescale(CPUFREQ_DEFAULT_MULT, false);
91 RECALC_DELAYS(CPUFREQ_MAX);
92 PLLCR = 0x018ae025 | (PLLCR & 0x70400000);
93 CSCR0 = 0x00001180; /* Flash: 4 wait states */
94 CSCR1 = 0x00001580; /* LCD: 5 wait states */
95#if CONFIG_USBOTG == USBOTG_ISP1362 100#if CONFIG_USBOTG == USBOTG_ISP1362
96 CSCR3 = 0x00002180; /* USBOTG: 8 wait states */ 101 CSCR3 = 0x00002180; /* USBOTG: 8 wait states */
97#endif 102#endif
98 while(!(PLLCR & 0x80000000)) {}; /* Wait until the PLL has locked. 103#if CONFIG_RTC == RTC_PCF50606
99 This may take up to 10ms! */ 104 pcf50606_i2c_recalc_delay(CPUFREQ_MAX);
100 timers_adjust_prescale(CPUFREQ_MAX_MULT, true);
101 DCR = (0x8200 | MAX_REFRESH_TIMER); /* Refresh timer */
102 cpu_frequency = CPUFREQ_MAX;
103 IDECONFIG1 = 0x10100000 | (1 << 13) | (3 << 10);
104 /* SRE active on write (H300 USBOTG) | BUFEN2 enable | CS2Post | CS2Pre */
105 IDECONFIG2 = 0x40000 | (1 << 8); /* TA enable + CS2wait */
106
107#ifdef HAVE_SERIAL
108 UBG10 = BAUDRATE_DIV_MAX >> 8;
109 UBG20 = BAUDRATE_DIV_MAX & 0xff;
110#endif 105#endif
111 break; 106 timers_adjust_prescale(CPUFREQ_MAX_MULT, true);
112 107 DCR = (0x8200 | MAX_REFRESH_TIMER); /* Refresh timer */
113 case CPUFREQ_NORMAL: 108 IDECONFIG1 = 0x10100000 | (1 << 13) | (3 << 10);
114 DCR = (DCR & ~0x01ff) | DEFAULT_REFRESH_TIMER; 109 /* SRE active on write (H300 USBOTG) | BUFEN2 enable | CS2Post | CS2Pre */
115 /* Refresh timer for bypass frequency */ 110 IDECONFIG2 = 0x40000 | (1 << 8); /* TA enable 2 + CS2wait */
116 PLLCR &= ~1; /* Bypass mode */ 111
117 timers_adjust_prescale(CPUFREQ_DEFAULT_MULT, false); 112 PLLCR = (PLLCR & ~0x07000000) | (1 << 24); /* set CPUDIV */
118 RECALC_DELAYS(CPUFREQ_NORMAL); 113 DCR = (0x8200 | MAX_REFRESH_TIMER); /* DRAM refresh timer */
119 PLLCR = 0x0589e021 | (PLLCR & 0x70400000); 114 cpu_frequency = CPUFREQ_MAX;
120 CSCR0 = 0x00000580; /* Flash: 1 wait state */ 115 break;
121 CSCR1 = 0x00000180; /* LCD: 0 wait states */ 116
117 case CPUFREQ_NORMAL:
118 PLLCR = (PLLCR & ~0x07000000) | (5 << 24); /* set CPUDIV */
119 DCR = (0x8000 | NORMAL_REFRESH_TIMER); /* DRAM refresh timer */
120 cpu_frequency = CPUFREQ_MAX;
121
122 CSCR0 = 0x00000580; /* Flash: 1 wait state */
123 CSCR1 = 0x00000180; /* LCD: 0 wait states */
122#if CONFIG_USBOTG == USBOTG_ISP1362 124#if CONFIG_USBOTG == USBOTG_ISP1362
123 CSCR3 = 0x00000580; /* USBOTG: 1 wait state */ 125 CSCR3 = 0x00000580; /* USBOTG: 1 wait state */
124#endif 126#endif
125 while(!(PLLCR & 0x80000000)) {}; /* Wait until the PLL has locked. 127#if CONFIG_RTC == RTC_PCF50606
126 This may take up to 10ms! */ 128 pcf50606_i2c_recalc_delay(CPUFREQ_NORMAL);
127 timers_adjust_prescale(CPUFREQ_NORMAL_MULT, true); 129#endif
128 DCR = (0x8000 | NORMAL_REFRESH_TIMER); /* Refresh timer */ 130 timers_adjust_prescale(CPUFREQ_NORMAL_MULT, true);
129 cpu_frequency = CPUFREQ_NORMAL;
130 IDECONFIG1 = 0x10100000 | (1 << 13) | (1 << 10);
131 /* SRE active on write (H300 USBOTG) | BUFEN2 enable | CS2Post | CS2Pre */
132 IDECONFIG2 = 0x40000 | (0 << 8); /* TA enable + CS2wait */
133 131
134#ifdef HAVE_SERIAL 132 IDECONFIG1 = 0x10100000 | (1 << 13) | (1 << 10);
135 UBG10 = BAUDRATE_DIV_NORMAL >> 8; 133 /* SRE active on write (H300 USBOTG) | BUFEN2 enable | CS2Post | CS2Pre */
136 UBG20 = BAUDRATE_DIV_NORMAL & 0xff; 134 IDECONFIG2 = 0x40000; /* TA enable 2 */
135 break;
136
137 default:
138 DCR = (DCR & ~0x01ff) | DEFAULT_REFRESH_TIMER;
139 /* Refresh timer for bypass frequency */
140 PLLCR &= ~1; /* Bypass mode */
141 timers_adjust_prescale(CPUFREQ_DEFAULT_MULT, true);
142#if CONFIG_RTC == RTC_PCF50606
143 pcf50606_i2c_recalc_delay(CPUFREQ_DEFAULT_MULT);
137#endif 144#endif
138 break; 145 /* Power down PLL, but keep CRSEL and CLSEL */
139 default: 146 PLLCR = 0x00800200 | (PLLCR & 0x70400000);
140 DCR = (DCR & ~0x01ff) | DEFAULT_REFRESH_TIMER; 147 CSCR0 = 0x00000180; /* Flash: 0 wait states */
141 /* Refresh timer for bypass frequency */ 148 CSCR1 = 0x00000180; /* LCD: 0 wait states */
142 PLLCR &= ~1; /* Bypass mode */
143 timers_adjust_prescale(CPUFREQ_DEFAULT_MULT, true);
144 RECALC_DELAYS(CPUFREQ_DEFAULT);
145 /* Power down PLL, but keep CRSEL and CLSEL */
146 PLLCR = 0x00800200 | (PLLCR & 0x70400000);
147 CSCR0 = 0x00000180; /* Flash: 0 wait states */
148 CSCR1 = 0x00000180; /* LCD: 0 wait states */
149#if CONFIG_USBOTG == USBOTG_ISP1362 149#if CONFIG_USBOTG == USBOTG_ISP1362
150 CSCR3 = 0x00000180; /* USBOTG: 0 wait states */ 150 CSCR3 = 0x00000180; /* USBOTG: 0 wait states */
151#endif 151#endif
152 DCR = (0x8000 | DEFAULT_REFRESH_TIMER); /* Refresh timer */ 152 DCR = (0x8000 | DEFAULT_REFRESH_TIMER); /* Refresh timer */
153 cpu_frequency = CPUFREQ_DEFAULT; 153 cpu_frequency = CPUFREQ_DEFAULT;
154 IDECONFIG1 = 0x10100000 | (1 << 13) | (1 << 10); 154 IDECONFIG1 = 0x10100000 | (1 << 13) | (1 << 10);
155 /* SRE active on write (H300 USBOTG) | BUFEN2 enable | CS2Post | CS2Pre */ 155 /* SRE active on write (H300 USBOTG) | BUFEN2 enable | CS2Post | CS2Pre */
156 IDECONFIG2 = 0x40000 | (0 << 8); /* TA enable + CS2wait */ 156 IDECONFIG2 = 0x40000; /* TA enable 2 */
157
158 pll_initialized = false;
159 break;
160 }
157 161
158#ifdef HAVE_SERIAL 162#ifdef HAVE_SERIAL
159 UBG10 = BAUDRATE_DIV_DEFAULT >> 8; 163 UBG10 = BAUDRATE_DIV_NORMAL >> 8;
160 UBG20 = BAUDRATE_DIV_DEFAULT & 0xff; 164 UBG20 = BAUDRATE_DIV_NORMAL & 0xff;
161#endif 165#endif
162 break;
163 }
164} 166}
diff --git a/firmware/target/coldfire/system-target.h b/firmware/target/coldfire/system-target.h
index 84ec6ed4b0..892cbe89cf 100644
--- a/firmware/target/coldfire/system-target.h
+++ b/firmware/target/coldfire/system-target.h
@@ -215,11 +215,11 @@ extern void cf_set_cpu_frequency(long frequency);
215/* 11.2896 MHz */ 215/* 11.2896 MHz */
216#define CPUFREQ_DEFAULT_MULT 1 216#define CPUFREQ_DEFAULT_MULT 1
217#define CPUFREQ_DEFAULT (CPUFREQ_DEFAULT_MULT * CPU_FREQ) 217#define CPUFREQ_DEFAULT (CPUFREQ_DEFAULT_MULT * CPU_FREQ)
218/* 45.1584 MHz */ 218/* 22.5792 MHz */
219#define CPUFREQ_NORMAL_MULT 4 219#define CPUFREQ_NORMAL_MULT 2
220#define CPUFREQ_NORMAL (CPUFREQ_NORMAL_MULT * CPU_FREQ) 220#define CPUFREQ_NORMAL (CPUFREQ_NORMAL_MULT * CPU_FREQ)
221/* 124.1856 MHz */ 221/* 112.896 MHz */
222#define CPUFREQ_MAX_MULT 11 222#define CPUFREQ_MAX_MULT 10
223#define CPUFREQ_MAX (CPUFREQ_MAX_MULT * CPU_FREQ) 223#define CPUFREQ_MAX (CPUFREQ_MAX_MULT * CPU_FREQ)
224 224
225#endif /* SYSTEM_TARGET_H */ 225#endif /* SYSTEM_TARGET_H */