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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
board/neo1973/neo1973.c (board_late_init): moved MMC power-up to separate
function
cpu/arm920t/s3c24x0/mmc.c (mmc_init): call mmc_power_up and return -ENODEV
immediately if there is no card
- Werner Almesberger <werner@openmoko.org>
Index: u-boot/board/neo1973/neo1973.c
===================================================================
--- u-boot.orig/board/neo1973/neo1973.c
+++ u-boot/board/neo1973/neo1973.c
@@ -223,6 +223,19 @@ int board_init (void)
return 0;
}
+int mmc_power_up(void)
+{
+#if defined(CONFIG_ARCH_GTA01B_v4)
+ S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
+
+ /* check if sd card is inserted, and power-up if it is */
+ if (gpio->GPFDAT & (1 << 5))
+ return 0;
+ gpio->GPBDAT &= ~(1 << 2);
+#endif /* !CONFIG_ARCH_GTA01B_v4 */
+ return 1;
+}
+
int board_late_init(void)
{
unsigned char tmp;
@@ -289,14 +302,8 @@ continue_boot:
/* switch on the backlight */
neo1973_backlight(1);
-#if defined(CONFIG_ARCH_GTA01B_v4)
- {
- /* check if sd card is inserted, and power-up if it is */
- S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
- if (!(gpio->GPFDAT & (1 << 5)))
- gpio->GPBDAT &= ~(1 << 2);
- }
-#endif
+ /* check if sd card is inserted, and power-up if it is */
+ mmc_power_up();
return 0;
}
Index: u-boot/cpu/arm920t/s3c24x0/mmc.c
===================================================================
--- u-boot.orig/cpu/arm920t/s3c24x0/mmc.c
+++ u-boot/cpu/arm920t/s3c24x0/mmc.c
@@ -381,6 +381,11 @@ static void print_sd_cid(const struct sd
cid->crc >> 1, cid->crc & 1);
}
+int __attribute__((weak)) mmc_power_up(void)
+{
+ return 1;
+}
+
int mmc_init(int verbose)
{
int retries, rc = -ENODEV;
@@ -393,6 +398,8 @@ int mmc_init(int verbose)
debug("mmc_init(PCLK=%u)\n", get_PCLK());
clk_power->CLKCON |= (1 << 9);
+ if (!mmc_power_up())
+ return -ENODEV;
/* S3C2410 has some bug that prevents reliable operation at higher speed */
//sdi->SDIPRE = 0x3e; /* SDCLK = PCLK/2 / (SDIPRE+1) = 396kHz */
|