aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwdenk <wdenk>2004-09-28 20:34:50 +0000
committerwdenk <wdenk>2004-09-28 20:34:50 +0000
commit64f70bede37f833d2ed31311ff293c759c41a2a6 (patch)
treed4e41ef699babf7f6792d0894b478aae82b75f46
parentcce625e557416d06aeddaab0967b3119748cd21e (diff)
Fix problems with CDROM drive as slave device on Lite5200 IDE bus.
-rw-r--r--CHANGELOG2
-rw-r--r--board/icecube/icecube.c4
-rw-r--r--common/cmd_ide.c52
-rw-r--r--include/configs/IceCube.h5
4 files changed, 37 insertions, 26 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 6c82aa480..4e7e1e4b8 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,8 @@
Changes since U-Boot 1.1.1:
======================================================================
+* Fix problems with CDROM drive as slave device on Lite5200 IDE bus.
+
* Patch by Stephen Williams, 15 July 2004
Set the PCI class code for JSE board as part of PCI interface setup
diff --git a/board/icecube/icecube.c b/board/icecube/icecube.c
index 15def0c61..07c25ed8a 100644
--- a/board/icecube/icecube.c
+++ b/board/icecube/icecube.c
@@ -288,6 +288,8 @@ void init_ide_reset (void)
/* Configure PSC1_4 as GPIO output for ATA reset */
*(vu_long *) MPC5XXX_WU_GPIO_ENABLE |= GPIO_PSC1_4;
*(vu_long *) MPC5XXX_WU_GPIO_DIR |= GPIO_PSC1_4;
+ /* Deassert reset */
+ *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC1_4;
}
void ide_set_reset (int idereset)
@@ -296,6 +298,8 @@ void ide_set_reset (int idereset)
if (idereset) {
*(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_PSC1_4;
+ /* Make a delay. MPC5200 spec says 25 usec min */
+ udelay(500000);
} else {
*(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC1_4;
}
diff --git a/common/cmd_ide.c b/common/cmd_ide.c
index 0c9927be7..9e50599bf 100644
--- a/common/cmd_ide.c
+++ b/common/cmd_ide.c
@@ -1009,8 +1009,10 @@ static void ide_ident (block_dev_desc_t *dev_desc)
#ifdef CONFIG_AMIGAONEG3SE
int max_bus_scan;
- int retries = 0;
char *s;
+#endif
+#ifdef CONFIG_ATAPI
+ int retries = 0;
int do_retry = 0;
#endif
@@ -1041,14 +1043,11 @@ static void ide_ident (block_dev_desc_t *dev_desc)
dev_desc->if_type=IF_TYPE_IDE;
#ifdef CONFIG_ATAPI
-#ifdef CONFIG_AMIGAONEG3SE
do_retry = 0;
retries = 0;
/* Warning: This will be tricky to read */
while (retries <= 1) {
-#endif /* CONFIG_AMIGAONEG3SE */
-
/* check signature */
if ((ide_inb(device,ATA_SECT_CNT) == 0x01) &&
(ide_inb(device,ATA_SECT_NUM) == 0x01) &&
@@ -1079,32 +1078,35 @@ static void ide_ident (block_dev_desc_t *dev_desc)
if (((c & ATA_STAT_DRQ) == 0) ||
((c & (ATA_STAT_FAULT|ATA_STAT_ERR)) != 0) ) {
+#ifdef CONFIG_ATAPI
#ifdef CONFIG_AMIGAONEG3SE
- if (retries == 0) {
- do_retry = 1;
- } else {
- return;
- }
-#else
- return;
-#endif /* CONFIG_AMIGAONEG3SE */
- }
-
-#ifdef CONFIG_AMIGAONEG3SE
- s = getenv("ide_doreset");
- if (s && strcmp(s, "on") == 0 && 1 == do_retry) {
- /* Need to soft reset the device in case it's an ATAPI... */
- PRINTF("Retrying...\n");
+ s = getenv("ide_doreset");
+ if (s && strcmp(s, "on") == 0)
+#endif
+ {
+ /* Need to soft reset the device in case it's an ATAPI... */
+ PRINTF("Retrying...\n");
+ ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
+ udelay(100000);
+ ide_outb (device, ATA_COMMAND, 0x08);
+ udelay (500000); /* 500 ms */
+ }
+ /* Select device
+ */
ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
- udelay(100000);
- ide_outb (device, ATA_COMMAND, 0x08);
- udelay (100000); /* 100 ms */
retries++;
- } else {
- retries = 100;
+#else
+ return;
+#endif
}
+#ifdef CONFIG_ATAPI
+ else
+ break;
} /* see above - ugly to read */
-#endif /* CONFIG_AMIGAONEG3SE */
+
+ if (retries == 2) /* Not found */
+ return;
+#endif
input_swap_data (device, iobuf, ATA_SECTORWORDS);
diff --git a/include/configs/IceCube.h b/include/configs/IceCube.h
index ce6e59173..3c1b2ab59 100644
--- a/include/configs/IceCube.h
+++ b/include/configs/IceCube.h
@@ -84,6 +84,7 @@
/* Partitions */
#define CONFIG_MAC_PARTITION
#define CONFIG_DOS_PARTITION
+#define CONFIG_ISO_PARTITION
/* USB */
#if 1
@@ -324,7 +325,7 @@
#define CONFIG_IDE_PREINIT
#define CFG_IDE_MAXBUS 1 /* max. 1 IDE bus */
-#define CFG_IDE_MAXDEVICE 1 /* max. 1 drive per IDE bus */
+#define CFG_IDE_MAXDEVICE 2 /* max. 1 drive per IDE bus */
#define CFG_ATA_IDE0_OFFSET 0x0000
@@ -342,4 +343,6 @@
/* Interval between registers */
#define CFG_ATA_STRIDE 4
+#define CONFIG_ATAPI 1
+
#endif /* __CONFIG_H */