aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/au1000/patches
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/au1000/patches')
-rw-r--r--target/linux/au1000/patches/001-au1x00_gpio.patch294
-rw-r--r--target/linux/au1000/patches/005-au1000_eth_link_beat.patch24
-rw-r--r--target/linux/au1000/patches/006-mtx1_system_button.patch241
-rw-r--r--target/linux/au1000/patches/011-mtx1_leds.patch28
-rw-r--r--target/linux/au1000/patches/012-mtx1_cmdline.patch19
-rw-r--r--target/linux/au1000/patches/013-openwrt_rootfs.patch11
-rw-r--r--target/linux/au1000/patches/014-au1000_eth_ioctl.patch15
-rw-r--r--target/linux/au1000/patches/015-pci-resource.patch14
-rw-r--r--target/linux/au1000/patches/016-pci-io_map.patch10
-rw-r--r--target/linux/au1000/patches/017-usb-power.patch11
10 files changed, 667 insertions, 0 deletions
diff --git a/target/linux/au1000/patches/001-au1x00_gpio.patch b/target/linux/au1000/patches/001-au1x00_gpio.patch
new file mode 100644
index 0000000000..d4339aec46
--- /dev/null
+++ b/target/linux/au1000/patches/001-au1x00_gpio.patch
@@ -0,0 +1,294 @@
+diff -urN linux-2.6.21.1/arch/mips/au1000/common/gpio.c linux-2.6.21.1.new/arch/mips/au1000/common/gpio.c
+--- linux-2.6.21.1/arch/mips/au1000/common/gpio.c 2007-04-27 23:49:26.000000000 +0200
++++ linux-2.6.21.1.new/arch/mips/au1000/common/gpio.c 2007-05-22 21:41:55.000000000 +0200
+@@ -1,4 +1,7 @@
+ /*
++ * Copyright (C) 2007, OpenWrt.org, Florian Fainelli <florian@openwrt.org>
++ * Architecture specific GPIO support
++ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+@@ -18,101 +21,133 @@
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ * Notes :
++ * au1000 SoC have only one GPIO line : GPIO1
++ * others have a second one : GPIO2
+ */
++
++#include <linux/autoconf.h>
++#include <linux/init.h>
++#include <linux/types.h>
+ #include <linux/module.h>
+-#include <au1000.h>
+-#include <au1xxx_gpio.h>
++
++#include <asm/addrspace.h>
++#include <asm/io.h>
++
++#include <asm/mach-au1x00/au1000.h>
++#include <asm/gpio.h>
+
+ #define gpio1 sys
+ #if !defined(CONFIG_SOC_AU1000)
+ static AU1X00_GPIO2 * const gpio2 = (AU1X00_GPIO2 *)GPIO2_BASE;
++#define GPIO2_OUTPUT_ENABLE_MASK 0x00010000
+
+-#define GPIO2_OUTPUT_ENABLE_MASK 0x00010000
+-
+-int au1xxx_gpio2_read(int signal)
++static int au1xxx_gpio2_read(unsigned gpio)
+ {
+- signal -= 200;
+-/* gpio2->dir &= ~(0x01 << signal); //Set GPIO to input */
+- return ((gpio2->pinstate >> signal) & 0x01);
++ gpio -= AU1XXX_GPIO_BASE;
++ return ((gpio2->pinstate >> gpio) & 0x01);
+ }
+
+-void au1xxx_gpio2_write(int signal, int value)
++static void au1xxx_gpio2_write(unsigned gpio, int value)
+ {
+- signal -= 200;
++ gpio -= AU1XXX_GPIO_BASE;
+
+- gpio2->output = (GPIO2_OUTPUT_ENABLE_MASK << signal) |
+- (value << signal);
++ gpio2->output = (GPIO2_OUTPUT_ENABLE_MASK << gpio) |
++ (value << gpio);
+ }
+
+-void au1xxx_gpio2_tristate(int signal)
++static int au1xxx_gpio2_direction_input(unsigned gpio)
+ {
+- signal -= 200;
+- gpio2->dir &= ~(0x01 << signal); /* Set GPIO to input */
++ gpio -= AU1XXX_GPIO_BASE;
++ gpio2->dir &= ~(0x01 << gpio);
++ return 0;
+ }
+-#endif
+
+-int au1xxx_gpio1_read(int signal)
++static int au1xxx_gpio2_direction_output(unsigned gpio, int value)
++{
++ gpio -= AU1XXX_GPIO_BASE;
++ gpio2->dir = (0x01 << gpio) | (value << gpio);
++ return 0;
++}
++
++#endif /* !defined(CONFIG_SOC_AU1000) */
++
++static int au1xxx_gpio1_read(unsigned gpio)
+ {
+-/* gpio1->trioutclr |= (0x01 << signal); */
+- return ((gpio1->pinstaterd >> signal) & 0x01);
++ return ((gpio1->pinstaterd >> gpio) & 0x01);
+ }
+
+-void au1xxx_gpio1_write(int signal, int value)
++static void au1xxx_gpio1_write(unsigned gpio, int value)
+ {
+ if(value)
+- gpio1->outputset = (0x01 << signal);
++ gpio1->outputset = (0x01 << gpio);
+ else
+- gpio1->outputclr = (0x01 << signal); /* Output a Zero */
++ /* Output a zero */
++ gpio1->outputclr = (0x01 << gpio);
+ }
+
+-void au1xxx_gpio1_tristate(int signal)
++static int au1xxx_gpio1_direction_input(unsigned gpio)
+ {
+- gpio1->trioutclr = (0x01 << signal); /* Tristate signal */
++ gpio1->pininputen = (0x01 << gpio);
++ return 0;
+ }
+
++static int au1xxx_gpio1_direction_output(unsigned gpio, int value)
++{
++ gpio1->trioutclr = (0x01 & gpio);
++ return 0;
++}
+
+-int au1xxx_gpio_read(int signal)
++int au1xxx_gpio_get_value(unsigned gpio)
+ {
+- if(signal >= 200)
++ if(gpio >= AU1XXX_GPIO_BASE)
+ #if defined(CONFIG_SOC_AU1000)
+ return 0;
+ #else
+- return au1xxx_gpio2_read(signal);
++ return au1xxx_gpio2_read(gpio);
+ #endif
+ else
+- return au1xxx_gpio1_read(signal);
++ return au1xxx_gpio1_read(gpio);
+ }
+
+-void au1xxx_gpio_write(int signal, int value)
++void au1xxx_gpio_set_value(unsigned gpio, int value)
+ {
+- if(signal >= 200)
++ if(gpio >= AU1XXX_GPIO_BASE)
+ #if defined(CONFIG_SOC_AU1000)
+ ;
+ #else
+- au1xxx_gpio2_write(signal, value);
++ au1xxx_gpio2_write(gpio, value);
+ #endif
+ else
+- au1xxx_gpio1_write(signal, value);
++ au1xxx_gpio1_write(gpio, value);
+ }
+
+-void au1xxx_gpio_tristate(int signal)
++int au1xxx_gpio_direction_input(unsigned gpio)
+ {
+- if(signal >= 200)
++ if (gpio >= AU1XXX_GPIO_BASE)
+ #if defined(CONFIG_SOC_AU1000)
+ ;
+ #else
+- au1xxx_gpio2_tristate(signal);
++ return au1xxx_gpio2_direction_input(gpio);
+ #endif
+ else
+- au1xxx_gpio1_tristate(signal);
++ return au1xxx_gpio1_direction_input(gpio);
+ }
+
+-void au1xxx_gpio1_set_inputs(void)
++int au1xxx_gpio_direction_output(unsigned gpio, int value)
+ {
+- gpio1->pininputen = 0;
++ if (gpio >= AU1XXX_GPIO_BASE)
++#if defined(CONFIG_SOC_AU1000)
++ ;
++#else
++ return au1xxx_gpio2_direction_output(gpio, value);
++#endif
++ else
++ return au1xxx_gpio1_direction_output(gpio, value);
+ }
+
+-EXPORT_SYMBOL(au1xxx_gpio1_set_inputs);
+-EXPORT_SYMBOL(au1xxx_gpio_tristate);
+-EXPORT_SYMBOL(au1xxx_gpio_write);
+-EXPORT_SYMBOL(au1xxx_gpio_read);
++EXPORT_SYMBOL(au1xxx_gpio_direction_output);
++EXPORT_SYMBOL(au1xxx_gpio_direction_input);
++EXPORT_SYMBOL(au1xxx_gpio_get_value);
++EXPORT_SYMBOL(au1xxx_gpio_set_value);
+--- linux-2.6.21.1/arch/mips/Kconfig 2007-04-27 23:49:26.000000000 +0200
++++ linux-2.6.21.1.new/arch/mips/Kconfig 2007-05-21 08:04:42.000000000 +0200
+@@ -1044,6 +1044,7 @@
+ select SYS_SUPPORTS_32BIT_KERNEL
+ select SYS_SUPPORTS_APM_EMULATION
+ select SYS_SUPPORTS_KGDB
++ select GENERIC_GPIO
+
+ config PNX8550
+ bool
+diff -urN linux-2.6.21.1/include/asm-mips/mach-au1x00/au1xxx_gpio.h linux-2.6.21.1.new/include/asm-mips/mach-au1x00/au1xxx_gpio.h
+--- linux-2.6.21.1/include/asm-mips/mach-au1x00/au1xxx_gpio.h 2007-04-27 23:49:26.000000000 +0200
++++ linux-2.6.21.1.new/include/asm-mips/mach-au1x00/au1xxx_gpio.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,20 +0,0 @@
+-#ifndef __AU1XXX_GPIO_H
+-#define __AU1XXX_GPIO_H
+-
+-void au1xxx_gpio1_set_inputs(void);
+-void au1xxx_gpio_tristate(int signal);
+-void au1xxx_gpio_write(int signal, int value);
+-int au1xxx_gpio_read(int signal);
+-
+-typedef volatile struct
+-{
+- u32 dir;
+- u32 reserved;
+- u32 output;
+- u32 pinstate;
+- u32 inten;
+- u32 enable;
+-
+-} AU1X00_GPIO2;
+-
+-#endif //__AU1XXX_GPIO_H
+diff -urN linux-2.6.21.1/include/asm-mips/mach-au1x00/gpio.h linux-2.6.21.1.new/include/asm-mips/mach-au1x00/gpio.h
+--- linux-2.6.21.1/include/asm-mips/mach-au1x00/gpio.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.21.1.new/include/asm-mips/mach-au1x00/gpio.h 2007-05-21 01:10:22.000000000 +0200
+@@ -0,0 +1,69 @@
++#ifndef _AU1XXX_GPIO_H_
++#define _AU1XXX_GPIO_H_
++
++#define AU1XXX_GPIO_BASE 200
++
++typedef volatile struct
++{
++ u32 dir;
++ u32 reserved;
++ u32 output;
++ u32 pinstate;
++ u32 inten;
++ u32 enable;
++
++} AU1X00_GPIO2;
++
++extern int au1xxx_gpio_get_value(unsigned gpio);
++extern void au1xxx_gpio_set_value(unsigned gpio, int value);
++extern int au1xxx_gpio_direction_input(unsigned gpio);
++extern int au1xxx_gpio_direction_output(unsigned gpio, int value);
++
++
++/* Wrappers for the arch-neutral GPIO API */
++
++static inline int gpio_request(unsigned gpio, const char *label)
++{
++ /* Not yet implemented */
++ return 0;
++}
++
++static inline void gpio_free(unsigned gpio)
++{
++ /* Not yet implemented */
++}
++
++static inline int gpio_direction_input(unsigned gpio)
++{
++ return au1xxx_gpio_direction_input(gpio);
++}
++
++static inline int gpio_direction_output(unsigned gpio, int value)
++{
++ return au1xxx_gpio_direction_output(gpio, value);
++}
++
++static inline int gpio_get_value(unsigned gpio)
++{
++ return au1xxx_gpio_get_value(gpio);
++}
++
++static inline void gpio_set_value(unsigned gpio, int value)
++{
++ au1xxx_gpio_set_value(gpio, value);
++}
++
++static inline int gpio_to_irq(unsigned gpio)
++{
++ return gpio;
++}
++
++static inline int irq_to_gpio(unsigned irq)
++{
++ return irq;
++}
++
++/* For cansleep */
++#include <asm-generic/gpio.h>
++
++#endif /* _AU1XXX_GPIO_H_ */
diff --git a/target/linux/au1000/patches/005-au1000_eth_link_beat.patch b/target/linux/au1000/patches/005-au1000_eth_link_beat.patch
new file mode 100644
index 0000000000..946bd84540
--- /dev/null
+++ b/target/linux/au1000/patches/005-au1000_eth_link_beat.patch
@@ -0,0 +1,24 @@
+diff -urN linux-2.6.16.7/drivers/net/au1000_eth.c linux-2.6.16.7.new/drivers/net/au1000_eth.c
+--- linux-2.6.16.7/drivers/net/au1000_eth.c 2006-04-17 23:53:25.000000000 +0200
++++ linux-2.6.16.7.new/drivers/net/au1000_eth.c 2006-04-23 01:42:48.000000000 +0200
+@@ -12,6 +12,9 @@
+ * Author: MontaVista Software, Inc.
+ * ppopov@mvista.com or source@mvista.com
+ *
++ * Bjoern Riemer 2004
++ * riemer@fokus.fraunhofer.de or riemer@riemer-nt.de
++ * // fixed the link beat detection with ioctls (SIOCGMIIPHY)
+ * ########################################################################
+ *
+ * This program is free software; you can distribute it and/or modify it
+@@ -1672,6 +1675,10 @@
+ aup->phy_ops->phy_status(dev, aup->phy_addr, &link, &speed);
+ control = MAC_DISABLE_RX_OWN | MAC_RX_ENABLE | MAC_TX_ENABLE;
+ #ifndef CONFIG_CPU_LITTLE_ENDIAN
++ /*riemer: fix for startup without cable */
++ if (!link)
++ dev->flags &= ~IFF_RUNNING;
++
+ control |= MAC_BIG_ENDIAN;
+ #endif
+ if (link && (dev->if_port == IF_PORT_100BASEFX)) {
diff --git a/target/linux/au1000/patches/006-mtx1_system_button.patch b/target/linux/au1000/patches/006-mtx1_system_button.patch
new file mode 100644
index 0000000000..f4d380c729
--- /dev/null
+++ b/target/linux/au1000/patches/006-mtx1_system_button.patch
@@ -0,0 +1,241 @@
+diff -urN linux-2.6.16.7/arch/mips/au1000/mtx-1/irqmap.c linux-2.6.16.7.new/arch/mips/au1000/mtx-1/irqmap.c
+--- linux-2.6.16.7/arch/mips/au1000/mtx-1/irqmap.c 2006-04-17 23:53:25.000000000 +0200
++++ linux-2.6.16.7.new/arch/mips/au1000/mtx-1/irqmap.c 2006-04-23 11:54:31.000000000 +0200
+@@ -64,6 +64,7 @@
+ { AU1500_GPIO_202, INTC_INT_LOW_LEVEL, 0 },
+ { AU1500_GPIO_203, INTC_INT_LOW_LEVEL, 0 },
+ { AU1500_GPIO_205, INTC_INT_LOW_LEVEL, 0 },
++ { AU1500_GPIO_207, INTC_INT_RISE_AND_FALL_EDGE, 0 },
+ };
+
+ int au1xxx_nr_irqs = sizeof(au1xxx_irq_map)/sizeof(au1xxx_irq_map_t);
+diff -urN linux-2.6.16.7/arch/mips/au1000/mtx-1/Makefile linux-2.6.16.7.new/arch/mips/au1000/mtx-1/Makefile
+--- linux-2.6.16.7/arch/mips/au1000/mtx-1/Makefile 2006-04-17 23:53:25.000000000 +0200
++++ linux-2.6.16.7.new/arch/mips/au1000/mtx-1/Makefile 2006-04-23 14:01:36.000000000 +0200
+@@ -8,3 +8,4 @@
+ #
+
+ lib-y := init.o board_setup.o irqmap.o
++obj-y := mtx-1_sysbtn.o
+diff -urN linux-2.6.16.7/arch/mips/au1000/mtx-1/mtx-1_sysbtn.c linux-2.6.16.7.new/arch/mips/au1000/mtx-1/mtx-1_sysbtn.c
+--- linux-2.6.16.7/arch/mips/au1000/mtx-1/mtx-1_sysbtn.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.16.7.new/arch/mips/au1000/mtx-1/mtx-1_sysbtn.c 2006-04-23 14:01:17.000000000 +0200
+@@ -0,0 +1,218 @@
++/*
++ * Driver for the MTX-1 System Button.
++ *
++ * (c) Copyright 2005 4G Systems <info@4g-systems.biz>, All Rights Reserved.
++ * http://www.4g-systems.biz
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version
++ * 2 of the License, or (at your option) any later version.
++ *
++ * Neither Michael Stickel nor 4G Systeme GmbH admit liability nor provide
++ * warranty for any of this software. This material is provided
++ * "AS-IS" and at no charge.
++ *
++ * (c) Copyright 2005 4G Systems <info@4g-systems.biz>
++ *
++ * Release 0.01.
++ *
++ * Author: Michael Stickel michael.stickel@4g-systems.biz
++ *
++ *
++ * After the module is loaded there is a device /dev/misc/btn
++ * that can be read. It returns one char '1' if the button
++ * has been pressed an '0' if it has been released.
++ */
++#include <linux/autoconf.h>
++#include <linux/module.h>
++#include <linux/version.h>
++#include <linux/types.h>
++#include <linux/errno.h>
++#include <linux/kernel.h>
++#include <linux/poll.h>
++#include <linux/sched.h>
++#include <linux/miscdevice.h>
++#include <linux/slab.h>
++#include <linux/init.h>
++#include <linux/irq.h>
++#include <linux/interrupt.h>
++
++#include <asm/uaccess.h>
++
++#include <asm/mach-au1x00/au1000.h>
++
++
++#ifndef FALSE
++# define FALSE (0)
++#endif
++
++#ifndef TRUE
++# define TRUE (!FALSE)
++#endif
++
++
++//---------[ declarations ]-----------------
++
++
++static DECLARE_WAIT_QUEUE_HEAD(mtx1btn_wait_queue);
++static char state_changed;
++static char last_value;
++static char is_inuse;
++
++
++//---------[ Hardware Functions ]-----------------
++
++// The MTX-1 Button is attached to GPIO207.
++#define MTX1_GPIO2_SYSBTN (7)
++#define MTX1_SYSBTN_IRQ (AU1500_GPIO_207)
++
++
++static char mtx1_getbtn (int btnno)
++{
++ if (btnno==0) {
++ return (au_readl(GPIO2_PINSTATE) & (1<<MTX1_GPIO2_SYSBTN)) ? 0 : 1;
++ }
++ return 0;
++}
++
++static void mtx1_initbuttons (void)
++{
++ au_writel (au_readl(GPIO2_DIR) & ~(1<<MTX1_GPIO2_SYSBTN), GPIO2_DIR);
++}
++
++
++//---------[ Interrupt handling ]-----------------
++
++
++static void mtx1_btn_interrupt (int irq, void *private)
++{
++ char value = mtx1_getbtn(0);
++ if (last_value != value)
++ {
++ last_value = value;
++ state_changed = 1;
++ wake_up (&mtx1btn_wait_queue);
++ }
++// kill_fasync(&async_queue, SIGIO, POLL_OUT);
++}
++
++
++static int mtx1_btn_startirq (void)
++{
++ if (!request_irq (MTX1_SYSBTN_IRQ, mtx1_btn_interrupt, 0 /* | SA_INTERRUPT */, "mtx1btn", (void *)&state_changed)) {
++ return 0;
++ }
++ return -1;
++}
++
++static int mtx1_btn_stopirq (void)
++{
++ free_irq(MTX1_SYSBTN_IRQ, (void *)&state_changed);
++ return 0;
++}
++
++
++
++//---------[ File Functions ]-----------------
++
++
++static int mtx1sysbtn_minor = -1;
++
++
++static int mtx1sysbtn_open (struct inode *inode, struct file *file)
++{
++ if (MINOR(inode->i_rdev)!=mtx1sysbtn_minor) return -ENODEV;
++ if (is_inuse) return -EBUSY;
++ is_inuse=1;
++ last_value = mtx1_getbtn(0);
++ state_changed = 0;
++ return 0;
++}
++
++
++static int mtx1sysbtn_release (struct inode *inode, struct file *file) {
++ if (MINOR(inode->i_rdev)==mtx1sysbtn_minor) {
++ is_inuse=0;
++ }
++ return 0;
++}
++
++
++static ssize_t mtx1sysbtn_read (struct file *file, char *buf, size_t count, loff_t *ppos)
++{
++ if (count < 1)
++ return -EINVAL;
++ if (!state_changed)
++ interruptible_sleep_on (&mtx1btn_wait_queue);
++ state_changed = 0;
++ char c = last_value ? '1' : '0'; /* mtx1_getbtn(0) */
++ if(copy_to_user(buf, &c, 1))
++ return -EFAULT;
++ return 1;
++}
++
++
++static unsigned int mtx1sysbtn_poll (struct file *file, poll_table * wait)
++{
++ unsigned int mask = 0;
++
++ poll_wait (file, &mtx1btn_wait_queue, wait);
++
++ if (state_changed) // state changed since last time.
++ mask |= POLLIN | POLLRDNORM;
++
++ return mask;
++}
++
++
++static struct file_operations mtx1sysbtn_fops = {
++ .owner = THIS_MODULE,
++ .read = mtx1sysbtn_read,
++ .poll = mtx1sysbtn_poll,
++ .open = mtx1sysbtn_open,
++ .release = mtx1sysbtn_release
++};
++
++
++static struct miscdevice mtx1sysbtn_miscdev = {
++ MISC_DYNAMIC_MINOR /* SYSBTN_MINOR */ ,
++ "btn",
++ &mtx1sysbtn_fops
++};
++
++
++
++//---------[ Module Functions ]-----------------
++
++
++void __exit exit_mtx1_sysbtn (void)
++{
++ is_inuse = 1;
++ mtx1_btn_stopirq ();
++ misc_deregister(&mtx1sysbtn_miscdev);
++}
++
++
++static int __init init_mtx1_sysbtn (void)
++{
++ printk("MTX-1 System Button driver\n");
++ is_inuse = 1;
++ mtx1_initbuttons ();
++ if (misc_register (&mtx1sysbtn_miscdev) >= 0) {
++ mtx1sysbtn_minor = mtx1sysbtn_miscdev.minor;
++ if (mtx1_btn_startirq () == 0) {
++ is_inuse=0;
++ return 0;
++ }
++ misc_deregister(&mtx1sysbtn_miscdev);
++ }
++ return 1;
++}
++
++module_init(init_mtx1_sysbtn);
++module_exit(exit_mtx1_sysbtn);
++
++MODULE_AUTHOR("Michael Stickel");
++MODULE_DESCRIPTION("Driver for the MTX-1 system button");
++MODULE_LICENSE("GPL");
diff --git a/target/linux/au1000/patches/011-mtx1_leds.patch b/target/linux/au1000/patches/011-mtx1_leds.patch
new file mode 100644
index 0000000000..93c681e964
--- /dev/null
+++ b/target/linux/au1000/patches/011-mtx1_leds.patch
@@ -0,0 +1,28 @@
+diff -urN linux-2.6.19.2/drivers/leds/Kconfig linux-2.6.19.2.new/drivers/leds/Kconfig
+--- linux-2.6.19.2/drivers/leds/Kconfig 2007-01-10 20:10:37.000000000 +0100
++++ linux-2.6.19.2.new/drivers/leds/Kconfig 2007-03-02 13:50:28.000000000 +0100
+@@ -76,6 +76,13 @@
+ This option enables support for the Soekris net4801 and net4826 error
+ LED.
+
++config LEDS_MTX1
++ tristate "LED Support for MTX-1 boards"
++ depends on LEDS_CLASS && MIPS_MTX1
++ help
++ This option enables support for the MTX-1 power and status LED.
++
++
+ comment "LED Triggers"
+
+ config LEDS_TRIGGERS
+diff -urN linux-2.6.21.1/drivers/leds/Makefile linux-2.6.21.1.new/drivers/leds/Makefile
+--- linux-2.6.21.1/drivers/leds/Makefile 2007-04-27 23:49:26.000000000 +0200
++++ linux-2.6.21.1.new/drivers/leds/Makefile 2007-05-24 23:39:18.000000000 +0200
+@@ -16,6 +16,7 @@
+ obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o
+ obj-$(CONFIG_LEDS_H1940) += leds-h1940.o
+ obj-$(CONFIG_LEDS_COBALT) += leds-cobalt.o
++obj-$(CONFIG_LEDS_MTX1) += leds-mtx1.o
+
+ # LED Triggers
+ obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o
diff --git a/target/linux/au1000/patches/012-mtx1_cmdline.patch b/target/linux/au1000/patches/012-mtx1_cmdline.patch
new file mode 100644
index 0000000000..8f078428c4
--- /dev/null
+++ b/target/linux/au1000/patches/012-mtx1_cmdline.patch
@@ -0,0 +1,19 @@
+--- linux-2.6.19.2/arch/mips/au1000/mtx-1/init.c.old 2007-04-06 15:01:13.503777992 +0200
++++ linux-2.6.19.2/arch/mips/au1000/mtx-1/init.c 2007-04-06 15:01:36.296313000 +0200
+@@ -39,7 +39,6 @@
+
+ int prom_argc;
+ char **prom_argv, **prom_envp;
+-extern void __init prom_init_cmdline(void);
+ extern char *prom_getenv(char *envname);
+
+ const char *get_system_type(void)
+@@ -59,7 +58,7 @@
+ mips_machgroup = MACH_GROUP_ALCHEMY;
+ mips_machtype = MACH_MTX1; /* set the platform # */
+
+- prom_init_cmdline();
++ strcpy(arcs_cmdline, CONFIG_CMDLINE);
+
+ memsize_str = prom_getenv("memsize");
+ if (!memsize_str)
diff --git a/target/linux/au1000/patches/013-openwrt_rootfs.patch b/target/linux/au1000/patches/013-openwrt_rootfs.patch
new file mode 100644
index 0000000000..7793161af8
--- /dev/null
+++ b/target/linux/au1000/patches/013-openwrt_rootfs.patch
@@ -0,0 +1,11 @@
+--- linux-2.6.19.2/drivers/mtd/maps/mtx-1_flash.c 2007-07-10 20:56:30.000000000 +0200
++++ linux-2.6.19.2.new/drivers/mtd/maps/mtx-1_flash.c 2007-07-23 12:21:16.000000000 +0200
+@@ -28,7 +28,7 @@
+
+ static struct mtd_partition mtx1_partitions[] = {
+ {
+- .name = "filesystem",
++ .name = "rootfs",
+ .size = 0x01C00000,
+ .offset = 0,
+ },{
diff --git a/target/linux/au1000/patches/014-au1000_eth_ioctl.patch b/target/linux/au1000/patches/014-au1000_eth_ioctl.patch
new file mode 100644
index 0000000000..6187a7d5af
--- /dev/null
+++ b/target/linux/au1000/patches/014-au1000_eth_ioctl.patch
@@ -0,0 +1,15 @@
+--- linux-2.6.22.1.orig/drivers/net/au1000_eth.c 2007-07-24 18:43:25.527583520 +0200
++++ linux-2.6.22.1/drivers/net/au1000_eth.c 2007-07-24 23:07:00.388821102 +0200
+@@ -1320,9 +1320,12 @@
+ }
+ }
+
++#define AU1000_KNOWN_PHY_IOCTLS (SIOCGMIIPHY & 0xfff0)
+ static int au1000_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
+ {
+ struct au1000_private *aup = (struct au1000_private *)dev->priv;
++ if((cmd & AU1000_KNOWN_PHY_IOCTLS) != AU1000_KNOWN_PHY_IOCTLS)
++ return -EINVAL;
+
+ if (!netif_running(dev)) return -EINVAL;
+
diff --git a/target/linux/au1000/patches/015-pci-resource.patch b/target/linux/au1000/patches/015-pci-resource.patch
new file mode 100644
index 0000000000..ddbb7ed8a8
--- /dev/null
+++ b/target/linux/au1000/patches/015-pci-resource.patch
@@ -0,0 +1,14 @@
+--- linux-2.6.22.1.orig/include/asm-mips/mach-au1x00/au1000.h 2007-07-24 18:44:21.598778839 +0200
++++ linux-2.6.22.1/include/asm-mips/mach-au1x00/au1000.h 2007-07-24 22:08:49.761901610 +0200
+@@ -1680,9 +1680,9 @@
+ #define PCI_LAST_DEVFN (19<<3)
+
+ #define IOPORT_RESOURCE_START 0x00001000 /* skip legacy probing */
+-#define IOPORT_RESOURCE_END 0xffffffff
++#define IOPORT_RESOURCE_END 0xfffffffffULL
+ #define IOMEM_RESOURCE_START 0x10000000
+-#define IOMEM_RESOURCE_END 0xffffffff
++#define IOMEM_RESOURCE_END 0xfffffffffULL
+
+ /*
+ * Borrowed from the PPC arch:
diff --git a/target/linux/au1000/patches/016-pci-io_map.patch b/target/linux/au1000/patches/016-pci-io_map.patch
new file mode 100644
index 0000000000..6a80f7cb44
--- /dev/null
+++ b/target/linux/au1000/patches/016-pci-io_map.patch
@@ -0,0 +1,10 @@
+--- linux-2.6.22.1.orig/arch/mips/au1000/common/pci.c 2007-07-24 18:42:21.031908123 +0200
++++ linux-2.6.22.1/arch/mips/au1000/common/pci.c 2007-07-24 22:12:07.373162835 +0200
+@@ -74,6 +74,7 @@
+ printk(KERN_ERR "Unable to ioremap pci space\n");
+ return 1;
+ }
++ au1x_controller.io_map_base = virt_io_addr;
+
+ #ifdef CONFIG_DMA_NONCOHERENT
+ {
diff --git a/target/linux/au1000/patches/017-usb-power.patch b/target/linux/au1000/patches/017-usb-power.patch
new file mode 100644
index 0000000000..7f7fac85bf
--- /dev/null
+++ b/target/linux/au1000/patches/017-usb-power.patch
@@ -0,0 +1,11 @@
+--- linux-2.6.22.1.orig/arch/mips/au1000/mtx-1/board_setup.c 2007-07-29 18:57:35.000000000 +0200
++++ linux-2.6.22.1/arch/mips/au1000/mtx-1/board_setup.c 2007-07-29 18:59:48.000000000 +0200
+@@ -54,7 +54,7 @@
+
+ void __init board_setup(void)
+ {
+-#ifdef CONFIG_USB_OHCI
++#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
+ // enable USB power switch
+ au_writel( au_readl(GPIO2_DIR) | 0x10, GPIO2_DIR );
+ au_writel( 0x100000, GPIO2_OUTPUT );