openwrt-owl/target/linux/ar71xx/patches-2.6.34/400-mips-multi-machine-upda...

135 lines
3.4 KiB
Diff

--- 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,65 @@ 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 (mach->mach_id == NULL)
+ continue;
+
+ if (strcmp(mach->mach_id, 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_id : "", mach->mach_name);
+ }
+
+ return 0;
+}
+
+core_initcall(mips_machtype_init);
--- a/arch/mips/include/asm/mips_machine.h
+++ b/arch/mips/include/asm/mips_machine.h
@@ -13,25 +13,33 @@
#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; \
+#define MIPS_MACHINE(_type, _id, _name, _setup) \
+static const char machine_name_##_type[] __initconst \
+ __aligned(1) = _name; \
+static const char machine_id_##_type[] __initconst \
+ __aligned(1) = _id; \
static struct mips_machine machine_##_type __initdata = \
{ \
.mach_type = _type, \
- .mach_name = machine_name_##_type, \
+ .mach_id = (char *) machine_id_##_type, \
+ .mach_name = (char *) machine_name_##_type, \
.mach_setup = _setup, \
}; \
\
@@ -44,4 +52,3 @@ static int __init register_machine_##_ty
pure_initcall(register_machine_##_type)
#endif /* __ASM_MIPS_MACHINE_H */
-