diff --git a/package/kernel/modules/other.mk b/package/kernel/modules/other.mk
index 925f87b9e736fe35d83da14afe4adff8cf1a369f..3b8a3b3146304fb10caeb92d7f30f1842ced9715 100644
--- a/package/kernel/modules/other.mk
+++ b/package/kernel/modules/other.mk
@@ -432,6 +432,22 @@ endef
 $(eval $(call KernelPackage,ledtrig-morse))
 
 
+define KernelPackage/gpio-dev
+  SUBMENU:=$(OTHER_MENU)
+  TITLE:=Generic GPIO char device support
+  DEPENDS:=@GPIO_SUPPORT
+  KCONFIG:=CONFIG_GPIO_DEVICE
+  FILES:=$(LINUX_DIR)/drivers/char/gpio_dev.$(LINUX_KMOD_SUFFIX)
+  AUTOLOAD:=$(call AutoLoad,40,gpio_dev)
+endef
+
+define KernelPackage/gpio-dev/description
+  Kernel module to allows control of GPIO pins using a character device.
+endef
+
+$(eval $(call KernelPackage,gpio-dev))
+
+
 define KernelPackage/nsc-gpio
   SUBMENU:=$(OTHER_MENU)
   TITLE:=Natsemi GPIO support
diff --git a/target/linux/generic-2.6/config-2.6.23 b/target/linux/generic-2.6/config-2.6.23
index 2f479f1ff3ad33401cd954502b886f3e68cff3dd..0d9352b759ce21ba72665dee526acb737e22b447 100644
--- a/target/linux/generic-2.6/config-2.6.23
+++ b/target/linux/generic-2.6/config-2.6.23
@@ -355,6 +355,7 @@ CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_GENERIC_TIME=y
 # CONFIG_GFS2_FS is not set
+CONFIG_GPIO_DEVICE=m
 # CONFIG_HAMACHI is not set
 CONFIG_HAMRADIO=y
 # CONFIG_HAPPYMEAL is not set
@@ -1754,4 +1755,3 @@ CONFIG_ZLIB_DEFLATE=y
 CONFIG_ZLIB_INFLATE=y
 CONFIG_ZONE_DMA=y
 CONFIG_ZONE_DMA_FLAG=1
-# CONFIG_GPIO_DEVICE is not set
diff --git a/target/linux/generic-2.6/config-2.6.24 b/target/linux/generic-2.6/config-2.6.24
index c9036f97e3a0e857c138aa929c54b639498e56cb..f6d0a46c7526f7b6769e1ffe8415baa41b038b6c 100644
--- a/target/linux/generic-2.6/config-2.6.24
+++ b/target/linux/generic-2.6/config-2.6.24
@@ -365,6 +365,7 @@ CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_GENERIC_TIME=y
 # CONFIG_GFS2_FS is not set
+CONFIG_GPIO_DEVICE=m
 # CONFIG_HAMACHI is not set
 CONFIG_HAMRADIO=y
 # CONFIG_HAPPYMEAL is not set
@@ -1806,4 +1807,3 @@ CONFIG_ZLIB_DEFLATE=y
 CONFIG_ZLIB_INFLATE=y
 CONFIG_ZONE_DMA=y
 CONFIG_ZONE_DMA_FLAG=1
-# CONFIG_GPIO_DEVICE is not set
diff --git a/target/linux/generic-2.6/config-2.6.25 b/target/linux/generic-2.6/config-2.6.25
index 097b5a67504577c60b05a0e8e5f57f942709ce08..41836c7d6bee5b9642110924750cc9e6bc400614 100644
--- a/target/linux/generic-2.6/config-2.6.25
+++ b/target/linux/generic-2.6/config-2.6.25
@@ -375,6 +375,7 @@ CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_GENERIC_TIME=y
 # CONFIG_GFS2_FS is not set
+CONFIG_GPIO_DEVICE=m
 # CONFIG_GROUP_SCHED is not set
 # CONFIG_HAMACHI is not set
 CONFIG_HAMRADIO=y
@@ -1856,4 +1857,3 @@ CONFIG_ZLIB_DEFLATE=y
 CONFIG_ZLIB_INFLATE=y
 CONFIG_ZONE_DMA=y
 CONFIG_ZONE_DMA_FLAG=1
-# CONFIG_GPIO_DEVICE is not set
diff --git a/target/linux/generic-2.6/config-2.6.26 b/target/linux/generic-2.6/config-2.6.26
index daffb987b029bf34fedf9a0e7720814e32b5b146..7582e47d188f5b9b2c2e1e2239ffe91ec14bc143 100644
--- a/target/linux/generic-2.6/config-2.6.26
+++ b/target/linux/generic-2.6/config-2.6.26
@@ -387,6 +387,7 @@ CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_GENERIC_TIME=y
 # CONFIG_GFS2_FS is not set
+CONFIG_GPIO_DEVICE=m
 # CONFIG_GROUP_SCHED is not set
 # CONFIG_HAMACHI is not set
 CONFIG_HAMRADIO=y
@@ -1900,4 +1901,3 @@ CONFIG_ZLIB_DEFLATE=y
 CONFIG_ZLIB_INFLATE=y
 CONFIG_ZONE_DMA=y
 CONFIG_ZONE_DMA_FLAG=1
-# CONFIG_GPIO_DEVICE is not set
diff --git a/target/linux/generic-2.6/config-default b/target/linux/generic-2.6/config-default
index eb3e738faf0f75ebb29fcd2f6deb1e408d835f2c..1908e5aade2e7ad474c254391584ba5676cf161c 100644
--- a/target/linux/generic-2.6/config-default
+++ b/target/linux/generic-2.6/config-default
@@ -327,6 +327,7 @@ CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_GENERIC_TIME=y
 # CONFIG_GFS2_FS is not set
+CONFIG_GPIO_DEVICE=m
 # CONFIG_HAMACHI is not set
 CONFIG_HAMRADIO=y
 # CONFIG_HAPPYMEAL is not set
diff --git a/target/linux/generic-2.6/files/drivers/gpio/gpio_dev.c b/target/linux/generic-2.6/files/drivers/char/gpio_dev.c
similarity index 100%
rename from target/linux/generic-2.6/files/drivers/gpio/gpio_dev.c
rename to target/linux/generic-2.6/files/drivers/char/gpio_dev.c
diff --git a/target/linux/generic-2.6/files/drivers/gpio/Kconfig b/target/linux/generic-2.6/files/drivers/gpio/Kconfig
deleted file mode 100644
index d97fc1b4f13279db09d012f705ebc3c6669f60d4..0000000000000000000000000000000000000000
--- a/target/linux/generic-2.6/files/drivers/gpio/Kconfig
+++ /dev/null
@@ -1,15 +0,0 @@
-menuconfig NEW_GPIO
-	bool "GPIO Support"
-	depends on GENERIC_GPIO
-	help
-	  Say Y to enable Linux GPIO device support.  This allows control of 
-	  GPIO pins using a character device 
-
-if NEW_GPIO
-
-config GPIO_DEVICE
-	tristate "GPIO device support"
-	help
-	  This option enables the gpio character device 
-
-endif # NEW_GPIO
diff --git a/target/linux/generic-2.6/files/drivers/gpio/Makefile b/target/linux/generic-2.6/files/drivers/gpio/Makefile
deleted file mode 100644
index 166c5c74341dbb86b22c405b6fd6b977734c799e..0000000000000000000000000000000000000000
--- a/target/linux/generic-2.6/files/drivers/gpio/Makefile
+++ /dev/null
@@ -1 +0,0 @@
-obj-$(CONFIG_GPIO_DEVICE)	+= gpio_dev.o
diff --git a/target/linux/generic-2.6/patches-2.6.23/420-gpiodev.patch b/target/linux/generic-2.6/patches-2.6.23/420-gpiodev.patch
new file mode 100644
index 0000000000000000000000000000000000000000..1508685b65bdd2d11d8f3b6c04cb111bb7d61b59
--- /dev/null
+++ b/target/linux/generic-2.6/patches-2.6.23/420-gpiodev.patch
@@ -0,0 +1,26 @@
+--- a/drivers/char/Kconfig
++++ b/drivers/char/Kconfig
+@@ -970,6 +970,13 @@
+ 
+ 	  If compiled as a module, it will be called cs5535_gpio.
+ 
++config GPIO_DEVICE
++	tristate "GPIO device support"
++	depends on GENERIC_GPIO
++	help
++	  Say Y to enable Linux GPIO device support.  This allows control of
++	  GPIO pins using a character device
++
+ config GPIO_VR41XX
+ 	tristate "NEC VR4100 series General-purpose I/O Unit support"
+ 	depends on CPU_VR41XX
+--- a/drivers/char/Makefile
++++ b/drivers/char/Makefile
+@@ -93,6 +93,7 @@
+ obj-$(CONFIG_PC8736x_GPIO)	+= pc8736x_gpio.o
+ obj-$(CONFIG_NSC_GPIO)		+= nsc_gpio.o
+ obj-$(CONFIG_CS5535_GPIO)	+= cs5535_gpio.o
++obj-$(CONFIG_GPIO_DEVICE)	+= gpio_dev.o
+ obj-$(CONFIG_GPIO_VR41XX)	+= vr41xx_giu.o
+ obj-$(CONFIG_GPIO_TB0219)	+= tb0219.o
+ obj-$(CONFIG_TELCLOCK)		+= tlclk.o
diff --git a/target/linux/generic-2.6/patches-2.6.23/920-gpio_dev.patch b/target/linux/generic-2.6/patches-2.6.23/920-gpio_dev.patch
deleted file mode 100644
index dcbfaf588bd6162ec8895294d87866316f9d5705..0000000000000000000000000000000000000000
--- a/target/linux/generic-2.6/patches-2.6.23/920-gpio_dev.patch
+++ /dev/null
@@ -1,29 +0,0 @@
---- a/arch/arm/Kconfig
-+++ b/arch/arm/Kconfig
-@@ -1039,6 +1039,8 @@
- 
- source "drivers/leds/Kconfig"
- 
-+source "drivers/gpio/Kconfig"
-+
- source "drivers/media/Kconfig"
- 
- source "drivers/video/Kconfig"
---- a/drivers/Kconfig
-+++ b/drivers/Kconfig
-@@ -76,6 +76,8 @@
- 
- source "drivers/leds/Kconfig"
- 
-+source "drivers/gpio/Kconfig"
-+
- source "drivers/infiniband/Kconfig"
- 
- source "drivers/edac/Kconfig"
---- a/drivers/Makefile
-+++ b/drivers/Makefile
-@@ -89,3 +89,4 @@
- obj-$(CONFIG_HID)		+= hid/
- obj-$(CONFIG_PPC_PS3)		+= ps3/
- obj-$(CONFIG_OF)		+= of/
-+obj-$(CONFIG_GPIO_DEVICE)	+= gpio/
diff --git a/target/linux/generic-2.6/patches-2.6.24/420-gpiodev.patch b/target/linux/generic-2.6/patches-2.6.24/420-gpiodev.patch
new file mode 100644
index 0000000000000000000000000000000000000000..98187413b3e333e1c561f23f0efd315e2eef28de
--- /dev/null
+++ b/target/linux/generic-2.6/patches-2.6.24/420-gpiodev.patch
@@ -0,0 +1,26 @@
+--- a/drivers/char/Kconfig
++++ b/drivers/char/Kconfig
+@@ -946,6 +946,13 @@
+ 
+ 	  If compiled as a module, it will be called cs5535_gpio.
+ 
++config GPIO_DEVICE
++	tristate "GPIO device support"
++	depends on GENERIC_GPIO
++	help
++	  Say Y to enable Linux GPIO device support.  This allows control of
++	  GPIO pins using a character device
++
+ config GPIO_VR41XX
+ 	tristate "NEC VR4100 series General-purpose I/O Unit support"
+ 	depends on CPU_VR41XX
+--- a/drivers/char/Makefile
++++ b/drivers/char/Makefile
+@@ -93,6 +93,7 @@
+ obj-$(CONFIG_PC8736x_GPIO)	+= pc8736x_gpio.o
+ obj-$(CONFIG_NSC_GPIO)		+= nsc_gpio.o
+ obj-$(CONFIG_CS5535_GPIO)	+= cs5535_gpio.o
++obj-$(CONFIG_GPIO_DEVICE)	+= gpio_dev.o
+ obj-$(CONFIG_GPIO_VR41XX)	+= vr41xx_giu.o
+ obj-$(CONFIG_GPIO_TB0219)	+= tb0219.o
+ obj-$(CONFIG_TELCLOCK)		+= tlclk.o
diff --git a/target/linux/generic-2.6/patches-2.6.24/920-gpio_dev.patch b/target/linux/generic-2.6/patches-2.6.24/920-gpio_dev.patch
deleted file mode 100644
index e0a8aa3f55c5b12c7228c27d41270c7220eabf93..0000000000000000000000000000000000000000
--- a/target/linux/generic-2.6/patches-2.6.24/920-gpio_dev.patch
+++ /dev/null
@@ -1,29 +0,0 @@
---- a/arch/arm/Kconfig
-+++ b/arch/arm/Kconfig
-@@ -1054,6 +1054,8 @@
- 
- source "drivers/mfd/Kconfig"
- 
-+source "drivers/gpio/Kconfig"
-+
- source "drivers/media/Kconfig"
- 
- source "drivers/video/Kconfig"
---- a/drivers/Kconfig
-+++ b/drivers/Kconfig
-@@ -78,6 +78,8 @@
- 
- source "drivers/leds/Kconfig"
- 
-+source "drivers/gpio/Kconfig"
-+
- source "drivers/infiniband/Kconfig"
- 
- source "drivers/edac/Kconfig"
---- a/drivers/Makefile
-+++ b/drivers/Makefile
-@@ -91,3 +91,4 @@
- obj-$(CONFIG_OF)		+= of/
- obj-$(CONFIG_SSB)		+= ssb/
- obj-$(CONFIG_VIRTIO)		+= virtio/
-+obj-$(CONFIG_GPIO_DEVICE)	+= gpio/
diff --git a/target/linux/generic-2.6/patches/420-gpiodev.patch b/target/linux/generic-2.6/patches/420-gpiodev.patch
new file mode 100644
index 0000000000000000000000000000000000000000..a4f2236f70f6408ba9d86a049afc70c41181d80b
--- /dev/null
+++ b/target/linux/generic-2.6/patches/420-gpiodev.patch
@@ -0,0 +1,26 @@
+--- a/drivers/char/Kconfig
++++ b/drivers/char/Kconfig
+@@ -984,6 +984,13 @@
+ 
+ 	  If compiled as a module, it will be called cs5535_gpio.
+ 
++config GPIO_DEVICE
++	tristate "GPIO device support"
++	depends on GENERIC_GPIO
++	help
++	  Say Y to enable Linux GPIO device support.  This allows control of
++	  GPIO pins using a character device
++
+ config GPIO_VR41XX
+ 	tristate "NEC VR4100 series General-purpose I/O Unit support"
+ 	depends on CPU_VR41XX
+--- a/drivers/char/Makefile
++++ b/drivers/char/Makefile
+@@ -90,6 +90,7 @@
+ obj-$(CONFIG_PC8736x_GPIO)	+= pc8736x_gpio.o
+ obj-$(CONFIG_NSC_GPIO)		+= nsc_gpio.o
+ obj-$(CONFIG_CS5535_GPIO)	+= cs5535_gpio.o
++obj-$(CONFIG_GPIO_DEVICE)	+= gpio_dev.o
+ obj-$(CONFIG_GPIO_VR41XX)	+= vr41xx_giu.o
+ obj-$(CONFIG_TANBAC_TB0219)	+= tb0219.o
+ obj-$(CONFIG_TELCLOCK)		+= tlclk.o
diff --git a/target/linux/pxa/patches-2.6.21/011-proc-gpio.patch b/target/linux/pxa/patches-2.6.21/011-proc-gpio.patch
index 8b4383cd5146573550b0aff13628203d58385259..479a070b55e35e1feb7c84b89e5266f0ec8abc01 100644
--- a/target/linux/pxa/patches-2.6.21/011-proc-gpio.patch
+++ b/target/linux/pxa/patches-2.6.21/011-proc-gpio.patch
@@ -1,8 +1,6 @@
-Index: linux-2.6.21.7/arch/arm/Kconfig
-===================================================================
---- linux-2.6.21.7.orig/arch/arm/Kconfig
-+++ linux-2.6.21.7/arch/arm/Kconfig
-@@ -505,6 +505,8 @@ config PCI_HOST_VIA82C505
+--- a/arch/arm/Kconfig
++++ b/arch/arm/Kconfig
+@@ -505,6 +505,8 @@
  	depends on PCI && ARCH_SHARK
  	default y
  
@@ -11,38 +9,16 @@ Index: linux-2.6.21.7/arch/arm/Kconfig
  source "drivers/pci/Kconfig"
  
  source "drivers/pcmcia/Kconfig"
-Index: linux-2.6.21.7/drivers/Makefile
-===================================================================
---- linux-2.6.21.7.orig/drivers/Makefile
-+++ linux-2.6.21.7/drivers/Makefile
-@@ -81,3 +81,4 @@ obj-$(CONFIG_GENERIC_TIME)	+= clocksourc
+--- a/drivers/Makefile
++++ b/drivers/Makefile
+@@ -81,3 +81,4 @@
  obj-$(CONFIG_DMA_ENGINE)	+= dma/
  obj-$(CONFIG_HID)		+= hid/
  obj-$(CONFIG_PPC_PS3)		+= ps3/
 +obj-$(CONFIG_PROC_GPIO)		+= gpio/
-Index: linux-2.6.21.7/drivers/gpio/Kconfig
-===================================================================
---- linux-2.6.21.7.orig/drivers/gpio/Kconfig
-+++ linux-2.6.21.7/drivers/gpio/Kconfig
-@@ -2,14 +2,27 @@ menuconfig NEW_GPIO
- 	bool "GPIO Support"
- 	depends on GENERIC_GPIO
- 	help
--	  Say Y to enable Linux GPIO device support.  This allows control of 
--	  GPIO pins using a character device 
-+	  Say Y to enable Linux GPIO device support.  This allows control of
-+	  GPIO pins using a character device
- 
- if NEW_GPIO
- 
- config GPIO_DEVICE
- 	tristate "GPIO device support"
- 	help
--	  This option enables the gpio character device 
-+	  This option enables the gpio character device
- 
- endif # NEW_GPIO
-+
+--- /dev/null
++++ b/drivers/gpio/Kconfig
+@@ -0,0 +1,13 @@
 +config PROC_GPIO
 +	tristate "GPIO /proc interface"
 +	depends on PXA25x || PXA27x
@@ -55,19 +31,14 @@ Index: linux-2.6.21.7/drivers/gpio/Kconfig
 +	depends on PROC_GPIO
 +	help
 +	  This enables printk logging of activity done through /proc/gpio
-Index: linux-2.6.21.7/drivers/gpio/Makefile
-===================================================================
---- linux-2.6.21.7.orig/drivers/gpio/Makefile
-+++ linux-2.6.21.7/drivers/gpio/Makefile
-@@ -1 +1,4 @@
- obj-$(CONFIG_GPIO_DEVICE)	+= gpio_dev.o
 +
+--- /dev/null
++++ b/drivers/gpio/Makefile
+@@ -0,0 +1,2 @@
 +# Expose GPIOs under /proc
 +obj-$(CONFIG_PROC_GPIO)		+= proc_gpio.o
-Index: linux-2.6.21.7/drivers/gpio/proc_gpio.c
-===================================================================
 --- /dev/null
-+++ linux-2.6.21.7/drivers/gpio/proc_gpio.c
++++ b/drivers/gpio/proc_gpio.c
 @@ -0,0 +1,276 @@
 +/*
 + *