config MACH_OMAP_H4
        bool "OMAP 2420 H4 board"
        depends on ARCH_OMAP2 && ARCH_OMAP24XX
-       select OMAP_DEBUG_LEDS if LEDS || LEDS_OMAP_DEBUG
+       select OMAP_DEBUG_DEVICES
 
 config MACH_OMAP_APOLLON
        bool "OMAP 2420 Apollon board"
 
        .resource       = &h4_flash_resource,
 };
 
-static struct resource h4_smc91x_resources[] = {
-       [0] = {
-               .start  = OMAP24XX_ETHR_START,          /* Physical */
-               .end    = OMAP24XX_ETHR_START + 0xf,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = OMAP_GPIO_IRQ(OMAP24XX_ETHR_GPIO_IRQ),
-               .end    = OMAP_GPIO_IRQ(OMAP24XX_ETHR_GPIO_IRQ),
-               .flags  = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device h4_smc91x_device = {
-       .name           = "smc91x",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(h4_smc91x_resources),
-       .resource       = h4_smc91x_resources,
-};
-
 /* Select between the IrDA and aGPS module
  */
 static int h4_select_irda(struct device *dev, int state)
        .id             = -1,
 };
 
-static struct resource h4_led_resources[] = {
-       [0] = {
-               .flags  = IORESOURCE_MEM,
-       },
-};
-
-static struct platform_device h4_led_device = {
-       .name           = "omap_dbg_led",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(h4_led_resources),
-       .resource       = h4_led_resources,
-};
-
 static struct platform_device *h4_devices[] __initdata = {
-       &h4_smc91x_device,
        &h4_flash_device,
        &h4_irda_device,
        &h4_kp_device,
        &h4_lcd_device,
-       &h4_led_device,
 };
 
-static inline void __init h4_init_smc91x(void)
+static inline void __init h4_init_debug(void)
 {
        /* Make sure CS1 timings are correct */
        GPMC_CONFIG1_1 = 0x00011200;
        udelay(100);
 
        omap_cfg_reg(M15_24XX_GPIO92);
-       if (omap_request_gpio(OMAP24XX_ETHR_GPIO_IRQ) < 0) {
-               printk(KERN_ERR "Failed to request GPIO%d for smc91x IRQ\n",
-                       OMAP24XX_ETHR_GPIO_IRQ);
-               return;
-       }
-       omap_set_gpio_direction(OMAP24XX_ETHR_GPIO_IRQ, 1);
+       if (debug_card_init(cs_mem_base, OMAP24XX_ETHR_GPIO_IRQ) < 0)
+               gpmc_cs_free(eth_cs);
 }
 
 static void __init omap_h4_init_irq(void)
        omap2_init_common_hw();
        omap_init_irq();
        omap_gpio_init();
-       h4_init_smc91x();
 }
 
 static struct omap_uart_config h4_uart_config __initdata = {
 
 
 comment "OMAP Feature Selections"
 
-config OMAP_DEBUG_LEDS
+config OMAP_DEBUG_DEVICES
        bool
        help
-         For debug card leds on TI reference boards.
+         For debug cards on TI reference boards.
+
+config OMAP_DEBUG_LEDS
+       bool
+       depends on OMAP_DEBUG_DEVICES
+       default y if LEDS || LEDS_OMAP_DEBUG
 
 config OMAP_RESET_CLOCKS
        bool "Reset unused clocks during boot"
 
 
 obj-$(CONFIG_CPU_FREQ) += cpu-omap.o
 obj-$(CONFIG_OMAP_DM_TIMER) += dmtimer.o
+obj-$(CONFIG_OMAP_DEBUG_DEVICES) += debug-devices.o
 obj-$(CONFIG_OMAP_DEBUG_LEDS) += debug-leds.o
 
--- /dev/null
+/*
+ * linux/arch/arm/plat-omap/debug-devices.c
+ *
+ * Copyright (C) 2005 Nokia Corporation
+ * Modified from mach-omap2/board-h4.c
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+
+#include <asm/arch/board.h>
+#include <asm/arch/gpio.h>
+
+
+/* Many OMAP development platforms reuse the same "debug board"; these
+ * platforms include H2, H3, H4, and Perseus2.
+ */
+
+static struct resource smc91x_resources[] = {
+       [0] = {
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device smc91x_device = {
+       .name           = "smc91x",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(smc91x_resources),
+       .resource       = smc91x_resources,
+};
+
+static struct resource led_resources[] = {
+       [0] = {
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device led_device = {
+       .name           = "omap_dbg_led",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(led_resources),
+       .resource       = led_resources,
+};
+
+static struct platform_device *debug_devices[] __initdata = {
+       &smc91x_device,
+       &led_device,
+       /* ps2 kbd + mouse ports */
+       /* 4 extra uarts */
+       /* 6 input dip switches */
+       /* 8 output pins */
+};
+
+int __init debug_card_init(u32 addr, unsigned gpio)
+{
+       int     status;
+
+       smc91x_resources[0].start = addr + 0x300;
+       smc91x_resources[0].end   = addr + 0x30f;
+
+       smc91x_resources[1].start = OMAP_GPIO_IRQ(gpio);
+       smc91x_resources[1].end   = OMAP_GPIO_IRQ(gpio);
+
+       status = omap_request_gpio(gpio);
+       if (status < 0) {
+               printk(KERN_ERR "GPIO%d unavailable for smc91x IRQ\n", gpio);
+               return status;
+       }
+       omap_set_gpio_direction(gpio, 1);
+
+       led_resources[0].start = addr;
+       led_resources[0].end   = addr + SZ_4K - 1;
+
+       return platform_add_devices(debug_devices, ARRAY_SIZE(debug_devices));
+}
 
 extern struct omap_board_config_kernel *omap_board_config;
 extern int omap_board_config_size;
 
+
+/* for TI reference platforms sharing the same debug card */
+extern int debug_card_init(u32 addr, unsigned gpio);
+
 #endif