Clipv2/Clip+: lower DEFAULT/NORMAL frequency from 60MHz to 24MHz
[kugel-rb.git] / firmware / target / arm / as3525 / clock-target.h
blob282f6adda0982f11ec4a89dc91acd560d24c93ab
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright © 2008 Rafaël Carré
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
21 #ifndef CLOCK_TARGET_H
22 #define CLOCK_TARGET_H
24 #include "config.h"
25 #include "cpu.h"
27 /* returns clock divider, given maximal target frequency and clock reference */
28 #define CLK_DIV(ref, target) ((ref + target - 1) / target)
31 /* Frequency and Bus Settings
32 * These bus settings work on the assumption that unboosted performance will be
33 * based on fastbus mode(FCLK == PCLK) at a frequency configured with this file.
34 * Boosted performance defaults to synchronous bus but will be changed to
35 * asynchronous bus if FCLK is not an integer multiple of PCLK.
36 * The player starts up in fastbus mode and synchronous or asynchronous mode is
37 * implemented in the set_cpu_frequency() function in system-as3525.c. There
38 * are limitations on both frequencies and frequency relationships listed in 7.3.14
39 * of the as3525 datasheet that need to be observed. If you are determined to
40 * use a frequency that is not "legal" you can do that. There are no checks for
41 * legal frequency values, only some validity checks to make sure the divider
42 * value fits into the number of bits allotted to it.
44 * The CLOCK_DIV macro does a pretty good job at selecting divider values but
45 * you can always override it by choosing your own value and commenting out the
46 * macro. AS3525_FCLK_PREDIV values other than 0 allow you to choose frequencies
47 * from lines below the main PLL frequency lines. AS3525_FCLK_POSTDIV
48 * will be calculated automagically depending on the value you have selected
49 * for AS3525_FCLK_FREQ. You may add more PLL frequencies by simply commenting
50 * out the current #defines for AS3525_PLLA_FREQ & AS3525_PLLA_SETTING and
51 * adding a #define for FREQ and divider setting to produce that frequency.I
52 * have included USB & PLLB for future use but commented them out for now.
55 /* Clock Sources */
56 #define AS3525_CLK_MAIN 0
57 #define AS3525_CLK_PLLA 1
58 #define AS3525_CLK_PLLB 2
59 #define AS3525_CLK_FCLK 3 /* Available as PCLK input only */
61 /** ************ Change these to reconfigure clocking scheme *******************/
62 #if CONFIG_CPU == AS3525v2
64 /* PLLA & PLLB registers differ from AS3525(v1)
65 * so we use a setting with a known frequency */
66 #define AS3525_PLLA_FREQ 240000000
67 #define AS3525_PLLA_SETTING 0x113B
69 #define AS3525_FCLK_PREDIV 0
70 #define AS3525_FCLK_FREQ AS3525_PLLA_FREQ
72 /* XXX: CGU_PERI might also be different (i.e. no PCLK_DIV1_SEL), but if we use
73 * the same frequency for DRAM & PCLK it's not a problem as the bit is unset
75 * Note that setting bits 1:0 have no effect and they always read back as 0
76 * Perhaps it means CGU_PERI defaults to PLLA as source ?
78 #define AS3525_DRAM_FREQ 60000000 /* Initial DRAM frequency */
79 #define AS3525_PCLK_FREQ AS3525_DRAM_FREQ/1
81 #else /* AS3525v1 */
83 /* PLL frequencies and settings*/
84 #define AS3525_PLLA_FREQ 248000000 /*124,82.7,62,49.6,41.3,35.4 */
85 /* FCLK_PREDIV-> *7/8 = 217MHz 108.5 ,72.3, 54.25, 43.4, 36.17 */
86 /* *6/8 = 186MHz 93, 62, 46.5, 37.2 */
87 /* *5/8 = 155MHz 77.5, 51.67, 38.75 */
88 #define AS3525_PLLA_SETTING 0x261F
90 /* PLLB frequencies and settings (audio and USB) */
91 #define AS3525_PLLB_FREQ 384000000 /* allows 44.1kHz with 0.04% error*/
92 #define AS3525_PLLB_SETTING 0x2630
94 //#define AS3525_PLLA_FREQ 384000000 /*192,128,96,76.8,64,54.9,48,42.7,38.4*/
95 /* FCLK_PREDIV-> *7/8 = 336MHz 168, 112, 84, 67.2, 56, 48, 42, 37.3*/
96 /* *6/8 = 288MHz 144, 96, 72, 57.6, 48, 41.1, */
97 /* *5/8 = 240MHz 120, 80, 60, 48, 40 */
98 //#define AS3525_PLLA_SETTING 0x2630
100 #define AS3525_FCLK_PREDIV 0 /* div = (8-n)/8 Enter manually & postdiv will be calculated*/
101 /* 0 gives you the PLLA 1st line choices, 1 the 2nd line etc. */
103 #define AS3525_FCLK_FREQ 248000000 /* Boosted FCLK frequency */
104 #define AS3525_DRAM_FREQ 62000000 /* Initial DRAM frequency */
105 /* AS3525_PCLK_FREQ != AS3525_DRAM_FREQ/1 will boot to white lcd screen */
106 #define AS3525_PCLK_FREQ AS3525_DRAM_FREQ/1 /* PCLK divided from DRAM freq */
108 #endif /* CONFIG_CPU == AS3525v2 */
110 #define AS3525_DBOP_FREQ AS3525_PCLK_FREQ/1 /* DBOP divided from PCLK freq */
112 /** ****************************************************************************/
114 /* Figure out if we need to use asynchronous bus */
115 #if (AS3525_FCLK_FREQ % AS3525_PCLK_FREQ)
116 #define ASYNCHRONOUS_BUS /* Boosted mode asynchronous */
117 #endif
119 /* Tell the software what frequencies we're running */
120 #define CPUFREQ_MAX AS3525_FCLK_FREQ
122 #if CONFIG_CPU == AS3525
123 #define CPUFREQ_DEFAULT AS3525_PCLK_FREQ
124 #define CPUFREQ_NORMAL AS3525_PCLK_FREQ
125 #else
126 /* On as3525v2, pclk & fclk are not bound */
127 #ifdef SANSA_FUZEV2
128 /* scrollwheel is much less responsive under 60MHz */
129 #define CPUFREQ_DEFAULT 60000000
130 #define CPUFREQ_NORMAL 60000000
131 #else
132 #define CPUFREQ_DEFAULT 24000000
133 #define CPUFREQ_NORMAL 24000000
134 #endif /* SANSA_FUZEV2 */
135 #endif /* CONFIG_CPU == AS3525 */
137 /* FCLK */
138 #define AS3525_FCLK_SEL AS3525_CLK_PLLA
139 #define AS3525_FCLK_POSTDIV (CLK_DIV((AS3525_PLLA_FREQ*(8-AS3525_FCLK_PREDIV)/8), AS3525_FCLK_FREQ) - 1) /*div=1/(n+1)*/
140 #define AS3525_FCLK_POSTDIV_UNBOOSTED (CLK_DIV((AS3525_PLLA_FREQ*(8-AS3525_FCLK_PREDIV)/8), CPUFREQ_NORMAL) - 1) /*div=1/(n+1) : needed for as3525v2 */
142 /* MCLK */
143 #define AS3525_MCLK_SEL AS3525_CLK_PLLA
144 #if (AS3525_MCLK_SEL==AS3525_CLK_PLLA)
145 #define AS3525_MCLK_FREQ AS3525_PLLA_FREQ
146 #elif (AS3525_MCLK_SEL==AS3525_CLK_PLLB)
147 #define AS3525_MCLK_FREQ AS3525_PLLB_FREQ
148 #else
149 #error Choose either PLLA or PLLB for MCLK!
150 #endif
152 /* PCLK */
153 #ifdef ASYNCHRONOUS_BUS
154 #define AS3525_PCLK_SEL AS3525_CLK_PLLA /* PLLA input for asynchronous */
155 #define AS3525_PCLK_DIV0 (CLK_DIV(AS3525_PLLA_FREQ, AS3525_DRAM_FREQ) - 1)/*div=1/(n+1)*/
156 #else
157 #define AS3525_PCLK_SEL AS3525_CLK_FCLK /* Fclk input for synchronous */
158 #define AS3525_PCLK_DIV0 (CLK_DIV(AS3525_FCLK_FREQ, AS3525_DRAM_FREQ) - 1) /*div=1/(n+1)*/
159 #endif
160 /*unable to use AS3525_PCLK_DIV1 != 0 successfuly so far*/
161 #define AS3525_PCLK_DIV1 (CLK_DIV(AS3525_DRAM_FREQ, AS3525_PCLK_FREQ) - 1)/* div = 1/(n+1)*/
163 /* PCLK as Source */
164 #define AS3525_DBOP_DIV (CLK_DIV(AS3525_PCLK_FREQ, AS3525_DBOP_FREQ) - 1) /*div=1/(n+1)*/
165 #define AS3525_I2C_PRESCALER CLK_DIV(AS3525_PCLK_FREQ, AS3525_I2C_FREQ)
166 #define AS3525_I2C_FREQ 400000
167 #define AS3525_SD_IDENT_DIV ((CLK_DIV(AS3525_PCLK_FREQ, AS3525_SD_IDENT_FREQ) / 2) - 1)
168 #define AS3525_SD_IDENT_FREQ 400000 /* must be between 100 & 400 kHz */
169 #define AS3525_SSP_PRESCALER ((CLK_DIV(AS3525_PCLK_FREQ, AS3525_SSP_FREQ) + 1) & ~1) /* must be an even number */
170 #define AS3525_SSP_FREQ 12000000
172 #define AS3525_IDE_SEL AS3525_CLK_PLLA /* Input Source */
173 #define AS3525_IDE_DIV (CLK_DIV(AS3525_PLLA_FREQ, AS3525_IDE_FREQ) - 1)/*div=1/(n+1)*/
175 #if CONFIG_CPU == AS3525v2
176 #define AS3525_MS_FREQ 120000000
177 #define AS3525_MS_DIV (CLK_DIV(AS3525_PLLA_FREQ, AS3525_MS_FREQ) -1)
178 #define AS3525_SDSLOT_FREQ 24000000
179 #define AS3525_SDSLOT_DIV (CLK_DIV(AS3525_PLLA_FREQ, AS3525_SDSLOT_FREQ) -1)
180 #define AS3525_IDE_FREQ 80000000
181 #else
182 #define AS3525_IDE_FREQ 50000000 /* The OF uses 66MHz maximal freq */
183 #endif /* CONFIG_CPU == AS3525v2 */
186 //#define AS3525_USB_SEL AS3525_CLK_PLLA /* Input Source */
187 //#define AS3525_USB_DIV /* div = 1/(n=0?1:2n)*/
190 /* Validity Checks */
192 /* AS3525_PCLK_FREQ */
193 #if (CLK_DIV(AS3525_PLLA_FREQ, AS3525_PCLK_FREQ) - 1) >= (1<<4) /* 4 bits */
194 #error PCLK frequency is too low : clock divider will not fit !
195 #endif
197 /* AS3525_DBOP_FREQ */
198 #if (CLK_DIV(AS3525_PCLK_FREQ, AS3525_DBOP_FREQ) - 1) >= (1<<3) /* 3 bits */
199 #error DBOP frequency is too low : clock divider will not fit !
200 #endif
202 /* AS3525_IDE_FREQ */
203 #if (CLK_DIV(AS3525_PLLA_FREQ, AS3525_IDE_FREQ) - 1) >= (1<<4) /* 4 bits */
204 #error IDE frequency is too low : clock divider will not fit !
205 #endif
207 /* AS3525_I2C_FREQ */
208 #if (CLK_DIV(AS3525_PCLK_FREQ, AS3525_I2C_FREQ)) >= (1<<10) /* 2+8 bits */
209 #error I2C frequency is too low : clock divider will not fit !
210 #endif
212 /* AS3525_SSP_FREQ */
213 #if (((CLK_DIV(AS3525_PCLK_FREQ, AS3525_SSP_FREQ)) + 1 ) & ~1) >= (1<<8) /* 8 bits */
214 #error SSP frequency is too low : clock divider will not fit !
215 #endif
217 /* AS3525_SD_IDENT_FREQ */
218 #if ((CLK_DIV(AS3525_PCLK_FREQ, AS3525_SD_IDENT_FREQ) / 2) - 1) >= (1<<8) /* 8 bits */
219 #error SD IDENTIFICATION frequency is too low : clock divider will not fit !
220 #endif
222 /* I2SIN / I2SOUT frequencies */
223 /* low samplerate */
224 #if ((AS3525_MCLK_FREQ/(128*8000))) > 512 /* 8kHz = lowest frequency */
225 #error AS3525_MCLK_FREQ is too high for 8kHz samplerate !
226 #endif
227 /* high samplerate */
228 #if ((AS3525_MCLK_FREQ/(128*96000))) < 1 /* 96kHz = highest frequency */
229 #error AS3525_MCLK_FREQ is too low for 96kHz samplerate !
230 #endif
232 #endif /* CLOCK_TARGET_H */