aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ar71xx/patches-2.6.30/400-mips-multi-machine-update.patch
blob: 02f39eedb305295045e9f63e1b060ffe42686532 (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
129
130
131
132
133
134
--- 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,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 */
-