+diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
+index 2f18a15..7a4f34b 100644
+--- a/arch/x86/Kconfig
++++ b/arch/x86/Kconfig
+@@ -2174,6 +2174,12 @@ config GEOS
+ ---help---
+ This option enables system support for the Traverse Technologies GEOS.
+
++config NET5501
++ bool "Soekris Engineering net5501 System Support (LEDS, GPIO, etc)"
++ select GPIOLIB
++ ---help---
++ This option enables system support for the Soekris Engineering net5501.
++
+ endif # X86_32
+
+ config AMD_NB
+diff --git a/arch/x86/platform/geode/Makefile b/arch/x86/platform/geode/Makefile
+index d8ba564..5b51194 100644
+--- a/arch/x86/platform/geode/Makefile
++++ b/arch/x86/platform/geode/Makefile
+@@ -1,2 +1,3 @@
+ obj-$(CONFIG_ALIX) += alix.o
++obj-$(CONFIG_NET5501) += net5501.o
+ obj-$(CONFIG_GEOS) += geos.o
+diff --git a/arch/x86/platform/geode/net5501.c b/arch/x86/platform/geode/net5501.c
+new file mode 100644
+index 0000000..66d377e
+--- /dev/null
++++ b/arch/x86/platform/geode/net5501.c
+@@ -0,0 +1,154 @@
++/*
++ * System Specific setup for Soekris net5501
++ * At the moment this means setup of GPIO control of LEDs and buttons
++ * on net5501 boards.
++ *
++ *
++ * Copyright (C) 2008-2009 Tower Technologies
++ * Written by Alessandro Zummo <a.zummo@towertech.it>
++ *
++ * Copyright (C) 2008 Constantin Baranov <const@mimas.ru>
++ * Copyright (C) 2011 Ed Wildgoose <kernel@wildgooses.com>
++ * and Philip Prindeville <philipp@redfish-solutions.com>
++ *
++ * 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/io.h>
++#include <linux/string.h>
++#include <linux/module.h>
++#include <linux/leds.h>
++#include <linux/platform_device.h>
++#include <linux/gpio.h>
++#include <linux/input.h>
++#include <linux/gpio_keys.h>
++
++#include <asm/geode.h>
++
++#define BIOS_REGION_BASE 0xffff0000
++#define BIOS_REGION_SIZE 0x00010000
++
++static struct gpio_keys_button net5501_gpio_buttons[] = {
++ {
++ .code = KEY_RESTART,
++ .gpio = 24,
++ .active_low = 1,
++ .desc = "Reset button",
++ .type = EV_KEY,
++ .wakeup = 0,
++ .debounce_interval = 100,
++ .can_disable = 0,
++ }
++};
++static struct gpio_keys_platform_data net5501_buttons_data = {
++ .buttons = net5501_gpio_buttons,
++ .nbuttons = ARRAY_SIZE(net5501_gpio_buttons),
++ .poll_interval = 20,
++};
++
++static struct platform_device net5501_buttons_dev = {
++ .name = "gpio-keys-polled",
++ .id = 1,
++ .dev = {
++ .platform_data = &net5501_buttons_data,
++ }
++};
++
++static struct gpio_led net5501_leds[] = {
++ {
++ .name = "net5501:1",
++ .gpio = 6,
++ .default_trigger = "default-on",
++ .active_low = 1,
++ },
++};
++
++static struct gpio_led_platform_data net5501_leds_data = {
++ .num_leds = ARRAY_SIZE(net5501_leds),
++ .leds = net5501_leds,
++};
++
++static struct platform_device net5501_leds_dev = {
++ .name = "leds-gpio",
++ .id = -1,
++ .dev.platform_data = &net5501_leds_data,
++};
++
++static struct __initdata platform_device *net5501_devs[] = {
++ &net5501_buttons_dev,
++ &net5501_leds_dev,
++};
++
++static void __init register_net5501(void)
++{
++ /* Setup LED control through leds-gpio driver */
++ platform_add_devices(net5501_devs, ARRAY_SIZE(net5501_devs));
++}
++
++struct net5501_board {
++ u16 offset;
++ u16 len;
++ char *sig;
++};
++
++static struct net5501_board __initdata boards[] = {
++ { 0xb7b, 7, "net5501" }, /* net5501 v1.33/1.33c */
++ { 0xb1f, 7, "net5501" }, /* net5501 v1.32i */
++};
++
++static bool __init net5501_present(void)
++{
++ int i;
++ unsigned char *rombase, *bios;
++ bool found = false;
++
++ rombase = ioremap(BIOS_REGION_BASE, BIOS_REGION_SIZE - 1);
++ if (!rombase) {
++ printk(KERN_ERR "%s: failed to get rombase\n", KBUILD_MODNAME);
++ return found;
++ }
++
++ bios = rombase + 0x20; /* null terminated */
++
++ if (memcmp(bios, "comBIOS", 7))
++ goto unmap;
++
++ for (i = 0; i < ARRAY_SIZE(boards); i++) {
++ unsigned char *model = rombase + boards[i].offset;
++
++ if (!memcmp(model, boards[i].sig, boards[i].len)) {
++ printk(KERN_INFO "%s: system is recognized as \"%s\"\n",
++ KBUILD_MODNAME, model);
++
++ found = true;
++ break;
++ }
++ }
++
++unmap:
++ iounmap(rombase);
++ return found;
++}
++
++static int __init net5501_init(void)
++{
++ if (!is_geode())
++ return 0;
++
++ if (!net5501_present())
++ return 0;
++
++ register_net5501();
++
++ return 0;
++}
++
++module_init(net5501_init);
++
++MODULE_AUTHOR("Philip Prindeville <philipp@redfish-solutions.com>");
++MODULE_DESCRIPTION("Soekris net5501 System Setup");
++MODULE_LICENSE("GPL");
+diff --git a/drivers/leds/leds-net5501.c b/drivers/leds/leds-net5501.c
+deleted file mode 100644
+index 0555d47..0000000
+--- a/drivers/leds/leds-net5501.c
++++ /dev/null
+@@ -1,97 +0,0 @@
+-/*
+- * Soekris board support code
+- *
+- * Copyright (C) 2008-2009 Tower Technologies
+- * Written by Alessandro Zummo <a.zummo@towertech.it>
+- *
+- * 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/io.h>
+-#include <linux/string.h>
+-#include <linux/leds.h>
+-#include <linux/platform_device.h>
+-#include <linux/gpio.h>
+-#include <linux/module.h>
+-
+-#include <asm/geode.h>
+-
+-static const struct gpio_led net5501_leds[] = {
+- {
+- .name = "error",
+- .gpio = 6,
+- .default_trigger = "default-on",
+- },
+-};
+-
+-static struct gpio_led_platform_data net5501_leds_data = {
+- .num_leds = ARRAY_SIZE(net5501_leds),
+- .leds = net5501_leds,
+-};
+-
+-static struct platform_device net5501_leds_dev = {
+- .name = "leds-gpio",
+- .id = -1,
+- .dev.platform_data = &net5501_leds_data,
+-};
+-
+-static void __init init_net5501(void)
+-{
+- platform_device_register(&net5501_leds_dev);
+-}
+-
+-struct soekris_board {
+- u16 offset;
+- char *sig;
+- u8 len;
+- void (*init)(void);
+-};
+-
+-static struct soekris_board __initdata boards[] = {
+- { 0xb7b, "net5501", 7, init_net5501 }, /* net5501 v1.33/1.33c */
+- { 0xb1f, "net5501", 7, init_net5501 }, /* net5501 v1.32i */
+-};
+-
+-static int __init soekris_init(void)
+-{
+- int i;
+- unsigned char *rombase, *bios;
+-
+- if (!is_geode())
+- return 0;
+-
+- rombase = ioremap(0xffff0000, 0xffff);
+- if (!rombase) {
+- printk(KERN_INFO "Soekris net5501 LED driver failed to get rombase");
+- return 0;
+- }
+-
+- bios = rombase + 0x20; /* null terminated */
+-
+- if (strncmp(bios, "comBIOS", 7))
+- goto unmap;
+-
+- for (i = 0; i < ARRAY_SIZE(boards); i++) {
+- unsigned char *model = rombase + boards[i].offset;
+-
+- if (strncmp(model, boards[i].sig, boards[i].len) == 0) {
+- printk(KERN_INFO "Soekris %s: %s\n", model, bios);
+-
+- if (boards[i].init)
+- boards[i].init();
+- break;
+- }
+- }
+-
+-unmap:
+- iounmap(rombase);
+- return 0;
+-}
+-
+-arch_initcall(soekris_init);
+-
+-MODULE_LICENSE("GPL");
+--- a/drivers/leds/Kconfig 2012-01-29 23:22:59.487891522 -0700
++++ b/drivers/leds/Kconfig 2012-02-03 10:33:39.650202054 -0700
+@@ -89,16 +89,6 @@ config LEDS_NET48XX
+ This option enables support for the Soekris net4801 and net4826 error
+ LED.
+
+-config LEDS_NET5501
+- tristate "LED Support for Soekris net5501 series Error LED"
+- depends on LEDS_TRIGGERS
+- depends on X86 && GPIO_CS5535
+- select LEDS_TRIGGER_DEFAULT_ON
+- default n
+- help
+- Add support for the Soekris net5501 board (detection, error led
+- and GPIO).
+-
+ config LEDS_FSG
+ tristate "LED Support for the Freecom FSG-3"
+ depends on LEDS_CLASS
+--- a/drivers/leds/Makefile 2012-01-29 23:22:59.487891522 -0700
++++ b/drivers/leds/Makefile 2012-02-03 10:33:24.468430696 -0700
+@@ -14,7 +14,6 @@ obj-$(CONFIG_LEDS_MIKROTIK_RB532) += led
+ obj-$(CONFIG_LEDS_S3C24XX) += leds-s3c24xx.o
+ obj-$(CONFIG_LEDS_AMS_DELTA) += leds-ams-delta.o
+ obj-$(CONFIG_LEDS_NET48XX) += leds-net48xx.o
+-obj-$(CONFIG_LEDS_NET5501) += leds-net5501.o
+ obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o
+ obj-$(CONFIG_LEDS_COBALT_QUBE) += leds-cobalt-qube.o
+ obj-$(CONFIG_LEDS_COBALT_RAQ) += leds-cobalt-raq.o