* Patches by Thomas Lange, 09 Oct 2003:
  - fix cmd_ide.c for non ppc boards (read/write functions did not
    add ATA base address)
  - fix for shannon board
  - #ifdef CONFIG_IDE_8xx_DIRECT some otherwise unused code

* Patch by Sangmoon Kim, 07 Oct 2003:
  add support for debris board
diff --git a/common/cmd_ide.c b/common/cmd_ide.c
index dacec2a..ae5602b 100644
--- a/common/cmd_ide.c
+++ b/common/cmd_ide.c
@@ -42,8 +42,12 @@
 #ifdef CONFIG_STATUS_LED
 # include <status_led.h>
 #endif
-#ifdef __I386__
+#ifndef __PPC__
 #include <asm/io.h>
+#ifdef __MIPS__
+/* Macros depend on this variable */
+static unsigned long mips_io_port_base = 0;
+#endif
 #endif
 
 #ifdef CONFIG_SHOW_BOOT_PROGRESS
@@ -65,6 +69,7 @@
 
 #if (CONFIG_COMMANDS & CFG_CMD_IDE)
 
+#ifdef CONFIG_IDE_8xx_DIRECT
 /* Timings for IDE Interface
  *
  * SETUP / LENGTH / HOLD - cycles valid for 50 MHz clk
@@ -101,6 +106,8 @@
 
 #define PCMCIA_MK_CLKS( t, T ) (( (t) * (T) + 999U ) / 1000U )
 
+#endif /* CONFIG_IDE_8xx_DIRECT */
+
 /* ------------------------------------------------------------------------- */
 
 /* Current I/O Device	*/
@@ -116,9 +123,8 @@
 #endif
 };
 
-#ifdef __PPC__
+
 #define	ATA_CURR_BASE(dev)	(CFG_ATA_BASE_ADDR+ide_bus_offset[IDE_BUS(dev)])
-#endif
 
 #ifndef CONFIG_AMIGAONEG3SE
 static int	    ide_bus_ok[CFG_IDE_MAXBUS];
@@ -180,8 +186,6 @@
 
 #ifdef CONFIG_IDE_8xx_DIRECT
 static void set_pcmcia_timing (int pmode);
-#else
-#define set_pcmcia_timing(a)	/* dummy */
 #endif
 
 /* ------------------------------------------------------------------------- */
@@ -472,9 +476,9 @@
 
 void ide_init (void)
 {
-	DECLARE_GLOBAL_DATA_PTR;
 
 #ifdef CONFIG_IDE_8xx_DIRECT
+	DECLARE_GLOBAL_DATA_PTR;
 	volatile immap_t *immr = (immap_t *)CFG_IMMR;
 	volatile pcmconf8xx_t *pcmp = &(immr->im_pcmcia);
 #endif
@@ -502,6 +506,7 @@
 
 	WATCHDOG_RESET();
 
+#ifdef CONFIG_IDE_8xx_DIRECT
 	/* Initialize PIO timing tables */
 	for (i=0; i <= IDE_MAX_PIO_MODE; ++i) {
 	    pio_config_clk[i].t_setup  = PCMCIA_MK_CLKS(pio_config_ns[i].t_setup,
@@ -518,6 +523,7 @@
 		    pio_config_ns[i].t_length, pio_config_clk[i].t_length,
 		    pio_config_ns[i].t_hold,   pio_config_clk[i].t_hold);
 	}
+#endif /* CONFIG_IDE_8xx_DIRECT */
 
 	/* Reset the IDE just to be sure.
 	 * Light LED's to show
@@ -528,11 +534,11 @@
 #ifdef CONFIG_IDE_8xx_DIRECT
 	/* PCMCIA / IDE initialization for common mem space */
 	pcmp->pcmc_pgcrb = 0;
-#endif
 
 	/* start in PIO mode 0 - most relaxed timings */
 	pio_mode = 0;
 	set_pcmcia_timing (pio_mode);
+#endif /* CONFIG_IDE_8xx_DIRECT */
 
 	/*
 	 * Wait for IDE to get ready.
@@ -763,7 +769,7 @@
 static void __inline__
 ide_outb(int dev, int port, unsigned char val)
 {
-	outb(val, port);
+	outb(val, ATA_CURR_BASE(dev)+port);
 }
 #endif	/* __PPC__ */
 
@@ -785,7 +791,7 @@
 static unsigned char __inline__
 ide_inb(int dev, int port)
 {
-	return inb(port);
+  return inb(ATA_CURR_BASE(dev)+port);
 }
 #endif	/* __PPC__ */
 
@@ -846,7 +852,7 @@
 static void
 output_data(int dev, ulong *sect_buf, int words)
 {
-	outsw(ATA_DATA_REG, sect_buf, words<<1);
+	outsw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, words<<1);
 }
 #endif	/* __PPC__ */
 
@@ -870,7 +876,7 @@
 static void
 input_data(int dev, ulong *sect_buf, int words)
 {
-	insw(ATA_DATA_REG, sect_buf, words << 1);
+	insw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, words << 1);
 }
 
 #endif	/* __PPC__ */
@@ -1420,14 +1426,14 @@
 static void
 output_data_shorts(int dev, ushort *sect_buf, int shorts)
 {
-	outsw(ATA_DATA_REG, sect_buf, shorts);
+	outsw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, shorts);
 }
 
 
 static void
 input_data_shorts(int dev, ushort *sect_buf, int shorts)
 {
-	insw(ATA_DATA_REG, sect_buf, shorts);
+	insw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, shorts);
 }
 
 #endif	/* __PPC__ */