summaryrefslogtreecommitdiff
path: root/target/linux/ar71xx/patches-2.6.30/400-mips-multi-machine-update.patch
blob: 78646210ec46ec0d70640af442b07594f8110dad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
--- 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/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,				\
 };								\