1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Index: firmware/target/arm/s5l8700/system-target.h
===================================================================
--- firmware/target/arm/s5l8700/system-target.h  (revision 28604)
+++ firmware/target/arm/s5l8700/system-target.h  (working copy)
@@ -38,4 +38,10 @@
 #define inw(a) (*(volatile unsigned short *) (a))
 #define outw(a,b) (*(volatile unsigned short *) (b) = (a))

+static inline void udelay(unsigned usecs)
+{
+    unsigned stop = USEC_TIMER + usecs;
+    while (TIME_BEFORE(USEC_TIMER, stop));
+}
+
 #endif /* SYSTEM_TARGET_H */
Index: firmware/target/arm/s5l8700/system-s5l8700.c
===================================================================
--- firmware/target/arm/s5l8700/system-s5l8700.c  (revision 28604)
+++ firmware/target/arm/s5l8700/system-s5l8700.c  (working copy)
@@ -22,6 +22,7 @@
 #include "kernel.h"
 #include "system.h"
 #include "panic.h"
+#include "system-target.h"
 #ifdef IPOD_NANO2G
 #include "storage.h"
 #include "pmu-target.h"
@@ -205,10 +206,10 @@

     if (frequency == CPUFREQ_MAX)
     {
        /* Vcore = 1.000V */
        pmu_write(0x1e, 0xf);
         /* Allow for voltage to stabilize */
-        sleep(HZ / 100);
+        udelay(20);
         /* FCLK_CPU = PLL0, HCLK = PLL0 / 2 */
         CLKCON = (CLKCON & ~0xFF00FF00) | 0x20003100;
         /* PCLK = HCLK / 2 */