ar71xx: update mips multi-machine stuff
[openwrt-10.03/.git] / target / linux / ar71xx / patches-2.6.30 / 400-mips-multi-machine-update.patch
diff --git a/target/linux/ar71xx/patches-2.6.30/400-mips-multi-machine-update.patch b/target/linux/ar71xx/patches-2.6.30/400-mips-multi-machine-update.patch
new file mode 100644 (file)
index 0000000..62903c8
--- /dev/null
@@ -0,0 +1,127 @@
+--- a/arch/mips/kernel/mips_machine.c
++++ b/arch/mips/kernel/mips_machine.c
+@@ -7,12 +7,13 @@
+  *
+  */
+ #include <linux/mm.h>
++#include <linux/string.h>
+ #include <asm/mips_machine.h>
+-#include <asm/bootinfo.h>
+ static struct list_head mips_machines __initdata =
+               LIST_HEAD_INIT(mips_machines);
++static char *mips_machid __initdata;
+ char *mips_machine_name = "Unknown";
+@@ -55,20 +56,64 @@ void __init mips_machine_set_name(char *
+       }
+ }
+-void __init mips_machine_setup(unsigned long machtype)
++void __init mips_machine_setup(void)
+ {
+       struct mips_machine *mach;
+-      mach = mips_machine_find(machtype);
++      mach = mips_machine_find(mips_machtype);
+       if (!mach) {
+-              printk(KERN_ALERT "MIPS: no machine registered for "
+-                      "machtype %lu\n", machtype);
++              printk(KERN_WARNING "MIPS: no machine registered for "
++                      "machtype %lu\n", mips_machtype);
+               return;
+       }
+       mips_machine_set_name(mach->mach_name);
+-      printk(KERN_INFO "MIPS: machine is %s\n", mips_machine_name);
++      printk(KERN_NOTICE "MIPS: machine is %s\n", mips_machine_name);
+       if (mach->mach_setup)
+               mach->mach_setup();
+ }
++
++int __init mips_machtype_setup(char *id)
++{
++      if (mips_machid == NULL)
++              mips_machid = id;
++
++      return 1;
++}
++
++__setup("machtype=", mips_machtype_setup);
++
++static int __init mips_machtype_init(void)
++{
++      struct list_head *this;
++      struct mips_machine *mach;
++
++      if (mips_machid == NULL)
++              return 0;
++
++      list_for_each(this, &mips_machines) {
++              mach = list_entry(this, struct mips_machine, list);
++              if (strncmp(mach->mach_id, mips_machid,
++                          strlen(mips_machid)) == 0
++              ) {
++                      mips_machtype = mach->mach_type;
++                      return 0;
++              }
++      }
++
++      printk(KERN_WARNING
++             "MIPS: no machine found for id: '%s', registered machines:\n",
++             mips_machid);
++      printk(KERN_WARNING "%32s %s\n", "id", "name");
++
++      list_for_each(this, &mips_machines) {
++              mach = list_entry(this, struct mips_machine, list);
++              printk(KERN_WARNING "%32s %s\n",
++                     mach->mach_id, mach->mach_name);
++      }
++
++      return 0;
++}
++
++core_initcall(mips_machtype_init);
+--- a/include/asm-mips/mips_machine.h
++++ b/include/asm-mips/mips_machine.h
+@@ -13,24 +13,32 @@
+ #include <linux/init.h>
+ #include <linux/list.h>
++#include <asm/bootinfo.h>
++
+ struct mips_machine {
+       unsigned long           mach_type;
+-      void                    (*mach_setup)(void);
++      char                    *mach_id;
+       char                    *mach_name;
++      void                    (*mach_setup)(void);
+       struct list_head        list;
+ };
+ void mips_machine_register(struct mips_machine *) __init;
+-void mips_machine_setup(unsigned long machtype) __init;
++void mips_machine_setup(void) __init;
++int  mips_machtype_setup(char *id) __init;
+ void mips_machine_set_name(char *name) __init;
+ extern char *mips_machine_name;
+-#define MIPS_MACHINE(_type, _name, _setup)                    \
+-static char machine_name_##_type[] __initdata = _name;                \
+-static struct mips_machine machine_##_type __initdata =               \
++#define MIPS_MACHINE(_type, _id, _name, _setup)               \
++static char machine_name_##_type[] __initconst                        \
++                      __aligned(1) = _name;                   \
++static char machine_id_##_type[] __initconst                  \
++                      __aligned(1) = _id;                     \
++static struct mips_machine machine_##_type __initconst =      \
+ {                                                             \
+       .mach_type      = _type,                                \
++      .mach_id        = machine_id_##_type,                   \
+       .mach_name      = machine_name_##_type,                 \
+       .mach_setup     = _setup,                               \
+ };                                                            \