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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
|
--- a/arch/mips/bcm47xx/board.c
+++ b/arch/mips/bcm47xx/board.c
@@ -26,27 +26,36 @@ struct bcm47xx_board_type_list3 {
const char *value3;
};
+struct bcm47xx_board_store {
+ enum bcm47xx_board board;
+ char name[BCM47XX_BOARD_MAX_NAME];
+};
+
/* model_name */
-static const struct bcm47xx_board_type_list1 bcm47xx_board_list_model_name[] = {
+static const
+struct bcm47xx_board_type_list1 bcm47xx_board_list_model_name[] __initconst = {
{{BCM47XX_BOARD_DLINK_DIR130, "D-Link DIR-130"}, "DIR-130"},
{{BCM47XX_BOARD_DLINK_DIR330, "D-Link DIR-330"}, "DIR-330"},
{ {0}, 0},
};
/* model_no */
-static const struct bcm47xx_board_type_list1 bcm47xx_board_list_model_no[] = {
+static const
+struct bcm47xx_board_type_list1 bcm47xx_board_list_model_no[] __initconst = {
{{BCM47XX_BOARD_ASUS_WL700GE, "Asus WL700"}, "WL700"},
{ {0}, 0},
};
/* machine_name */
-static const struct bcm47xx_board_type_list1 bcm47xx_board_list_machine_name[] = {
+static const
+struct bcm47xx_board_type_list1 bcm47xx_board_list_machine_name[] __initconst = {
{{BCM47XX_BOARD_LINKSYS_WRTSL54GS, "Linksys WRTSL54GS"}, "WRTSL54GS"},
{ {0}, 0},
};
/* hardware_version */
-static const struct bcm47xx_board_type_list1 bcm47xx_board_list_hardware_version[] = {
+static const
+struct bcm47xx_board_type_list1 bcm47xx_board_list_hardware_version[] __initconst = {
{{BCM47XX_BOARD_ASUS_RTN16, "Asus RT-N16"}, "RT-N16-"},
{{BCM47XX_BOARD_ASUS_WL320GE, "Asus WL320GE"}, "WL320G-"},
{{BCM47XX_BOARD_ASUS_WL330GE, "Asus WL330GE"}, "WL330GE-"},
@@ -61,7 +70,8 @@ static const struct bcm47xx_board_type_l
};
/* productid */
-static const struct bcm47xx_board_type_list1 bcm47xx_board_list_productid[] = {
+static const
+struct bcm47xx_board_type_list1 bcm47xx_board_list_productid[] __initconst = {
{{BCM47XX_BOARD_ASUS_RTAC66U, "Asus RT-AC66U"}, "RT-AC66U"},
{{BCM47XX_BOARD_ASUS_RTN10, "Asus RT-N10"}, "RT-N10"},
{{BCM47XX_BOARD_ASUS_RTN10D, "Asus RT-N10D"}, "RT-N10D"},
@@ -81,7 +91,8 @@ static const struct bcm47xx_board_type_l
};
/* ModelId */
-static const struct bcm47xx_board_type_list1 bcm47xx_board_list_ModelId[] = {
+static const
+struct bcm47xx_board_type_list1 bcm47xx_board_list_ModelId[] __initconst = {
{{BCM47XX_BOARD_DELL_TM2300, "Dell WX-5565"}, "WX-5565"},
{{BCM47XX_BOARD_MOTOROLA_WE800G, "Motorola WE800G"}, "WE800G"},
{{BCM47XX_BOARD_MOTOROLA_WR850GP, "Motorola WR850GP"}, "WR850GP"},
@@ -90,7 +101,8 @@ static const struct bcm47xx_board_type_l
};
/* melco_id or buf1falo_id */
-static const struct bcm47xx_board_type_list1 bcm47xx_board_list_melco_id[] = {
+static const
+struct bcm47xx_board_type_list1 bcm47xx_board_list_melco_id[] __initconst = {
{{BCM47XX_BOARD_BUFFALO_WBR2_G54, "Buffalo WBR2-G54"}, "29bb0332"},
{{BCM47XX_BOARD_BUFFALO_WHR2_A54G54, "Buffalo WHR2-A54G54"}, "290441dd"},
{{BCM47XX_BOARD_BUFFALO_WHR_G125, "Buffalo WHR-G125"}, "32093"},
@@ -104,7 +116,8 @@ static const struct bcm47xx_board_type_l
};
/* boot_hw_model, boot_hw_ver */
-static const struct bcm47xx_board_type_list2 bcm47xx_board_list_boot_hw[] = {
+static const
+struct bcm47xx_board_type_list2 bcm47xx_board_list_boot_hw[] __initconst = {
/* like WRT160N v3.0 */
{{BCM47XX_BOARD_CISCO_M10V1, "Cisco M10"}, "M10", "1.0"},
/* like WRT310N v2.0 */
@@ -134,7 +147,8 @@ static const struct bcm47xx_board_type_l
};
/* board_id */
-static const struct bcm47xx_board_type_list1 bcm47xx_board_list_board_id[] = {
+static const
+struct bcm47xx_board_type_list1 bcm47xx_board_list_board_id[] __initconst = {
{{BCM47XX_BOARD_NETGEAR_WGR614V8, "Netgear WGR614 V8"}, "U12H072T00_NETGEAR"},
{{BCM47XX_BOARD_NETGEAR_WGR614V9, "Netgear WGR614 V9"}, "U12H094T00_NETGEAR"},
{{BCM47XX_BOARD_NETGEAR_WNDR3300, "Netgear WNDR3300"}, "U12H093T00_NETGEAR"},
@@ -155,24 +169,22 @@ static const struct bcm47xx_board_type_l
};
/* boardtype, boardnum, boardrev */
-static const struct bcm47xx_board_type_list3 bcm47xx_board_list_board[] = {
+static const
+struct bcm47xx_board_type_list3 bcm47xx_board_list_board[] __initconst = {
{{BCM47XX_BOARD_HUAWEI_E970, "Huawei E970"}, "0x048e", "0x5347", "0x11"},
{{BCM47XX_BOARD_PHICOMM_M1, "Phicomm M1"}, "0x0590", "80", "0x1104"},
{{BCM47XX_BOARD_ZTE_H218N, "ZTE H218N"}, "0x053d", "1234", "0x1305"},
{ {0}, 0},
};
-static const struct bcm47xx_board_type bcm47xx_board_unknown[] = {
+static const
+struct bcm47xx_board_type bcm47xx_board_unknown[] __initconst = {
{BCM47XX_BOARD_UNKNOWN, "Unknown Board"},
};
-static const struct bcm47xx_board_type bcm47xx_board_no[] = {
- {BCM47XX_BOARD_NO, "No Board"},
-};
-
-static const struct bcm47xx_board_type *bcm47xx_board = bcm47xx_board_no;
+static struct bcm47xx_board_store bcm47xx_board = {BCM47XX_BOARD_NO, "Unknown Board"};
-static const struct bcm47xx_board_type *bcm47xx_board_get_nvram(void)
+static __init const struct bcm47xx_board_type *bcm47xx_board_get_nvram(void)
{
char buf1[30];
char buf2[30];
@@ -261,12 +273,13 @@ static const struct bcm47xx_board_type *
return bcm47xx_board_unknown;
}
-static void bcm47xx_board_detect(void)
+void __init bcm47xx_board_detect(void)
{
int err;
char buf[10];
+ const struct bcm47xx_board_type *board_detected;
- if (bcm47xx_board != bcm47xx_board_no)
+ if (bcm47xx_board.board != BCM47XX_BOARD_NO)
return;
/* check if the nvram is available */
@@ -277,20 +290,20 @@ static void bcm47xx_board_detect(void)
return;
}
- bcm47xx_board = bcm47xx_board_get_nvram();
- pr_debug("Found board: \"%s\"\n", bcm47xx_board->name);
+ board_detected = bcm47xx_board_get_nvram();
+ bcm47xx_board.board = board_detected->board;
+ strncpy(bcm47xx_board.name, board_detected->name, BCM47XX_BOARD_MAX_NAME);
+ bcm47xx_board.name[BCM47XX_BOARD_MAX_NAME - 1] = 0;
}
enum bcm47xx_board bcm47xx_board_get(void)
{
- bcm47xx_board_detect();
- return bcm47xx_board->board;
+ return bcm47xx_board.board;
}
EXPORT_SYMBOL(bcm47xx_board_get);
const char *bcm47xx_board_get_name(void)
{
- bcm47xx_board_detect();
- return bcm47xx_board->name;
+ return bcm47xx_board.name;
}
EXPORT_SYMBOL(bcm47xx_board_get_name);
--- a/arch/mips/bcm47xx/setup.c
+++ b/arch/mips/bcm47xx/setup.c
@@ -252,6 +252,7 @@ void __init plat_mem_setup(void)
_machine_restart = bcm47xx_machine_restart;
_machine_halt = bcm47xx_machine_halt;
pm_power_off = bcm47xx_machine_halt;
+ bcm47xx_board_detect();
}
static int __init bcm47xx_register_bus_complete(void)
--- a/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
+++ b/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
@@ -101,6 +101,9 @@ enum bcm47xx_board {
BCM47XX_BOARD_NO,
};
+#define BCM47XX_BOARD_MAX_NAME 30
+
+void bcm47xx_board_detect(void);
enum bcm47xx_board bcm47xx_board_get(void);
const char *bcm47xx_board_get_name(void);
|