ramips: update mips multi-machine stuff

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19400 3c298f89-4303-0410-b956-a3cf2f4a3e73
master
Gabor Juhos 2010-01-30 15:25:03 +00:00
parent e201d1990d
commit 9f3818d5e0
11 changed files with 285 additions and 59 deletions

View File

@ -9,6 +9,8 @@
* by the Free Software Foundation. * by the Free Software Foundation.
*/ */
#include <asm/mips_machine.h>
enum ramips_mach_type { enum ramips_mach_type {
RAMIPS_MACH_GENERIC, RAMIPS_MACH_GENERIC,
/* RT2880 based machines */ /* RT2880 based machines */
@ -23,5 +25,3 @@ enum ramips_mach_type {
RAMIPS_MACH_WHR_G300N, /* Buffalo WHR-G300N */ RAMIPS_MACH_WHR_G300N, /* Buffalo WHR-G300N */
RAMIPS_MACH_FONERA20N, /* La Fonera 2.0N */ RAMIPS_MACH_FONERA20N, /* La Fonera 2.0N */
}; };
extern enum ramips_mach_type ramips_mach;

View File

@ -20,33 +20,6 @@
#include <asm/mach-ralink/machine.h> #include <asm/mach-ralink/machine.h>
#include <ralink_soc.h> #include <ralink_soc.h>
struct board_rec {
char *name;
enum ramips_mach_type mach_type;
};
static struct board_rec boards[] __initdata = {
{
.name = "RT-N15",
.mach_type = RAMIPS_MACH_RT_N15,
}, {
.name = "WZR-AGL300NH",
.mach_type = RAMIPS_MACH_WZR_AGL300NH,
}, {
.name = "DIR-300-revB",
.mach_type = RAMIPS_MACH_DIR_300_REVB,
}, {
.name = "V22RW-2X2",
.mach_type = RAMIPS_MACH_V22RW_2X2,
}, {
.name = "WHR-G300N",
.mach_type = RAMIPS_MACH_WHR_G300N,
}, {
.name = "FONERA20N",
.mach_type = RAMIPS_MACH_FONERA20N,
}
};
static inline void *to_ram_addr(void *addr) static inline void *to_ram_addr(void *addr)
{ {
u32 base; u32 base;
@ -164,20 +137,6 @@ static __init char *prom_append_env(char **env, const char *envname)
#undef PROM_MAX_ENVS #undef PROM_MAX_ENVS
} }
static __init int ramips_board_setup(char *name)
{
int i;
for (i = 0; i < ARRAY_SIZE(boards); i++)
if (strcmp(name, boards[i].name) == 0) {
ramips_mach = boards[i].mach_type;
break;
}
return 1;
}
__setup("board=", ramips_board_setup);
void __init prom_init(void) void __init prom_init(void)
{ {
int argc; int argc;

View File

@ -16,14 +16,12 @@
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
#include <asm/addrspace.h> #include <asm/addrspace.h>
#include <asm/mips_machine.h>
#include <asm/mach-ralink/common.h> #include <asm/mach-ralink/common.h>
#include <asm/mach-ralink/machine.h> #include <asm/mach-ralink/machine.h>
#include <ralink_soc.h> #include <ralink_soc.h>
unsigned char ramips_sys_type[RAMIPS_SYS_TYPE_LEN]; unsigned char ramips_sys_type[RAMIPS_SYS_TYPE_LEN];
enum ramips_mach_type ramips_mach = RAMIPS_MACH_GENERIC;
const char *get_system_type(void) const char *get_system_type(void)
{ {
@ -76,9 +74,11 @@ void __init plat_mem_setup(void)
ramips_soc_setup(); ramips_soc_setup();
} }
__setup("board=", mips_machtype_setup);
static int __init ramips_machine_setup(void) static int __init ramips_machine_setup(void)
{ {
mips_machine_setup(ramips_mach); mips_machine_setup();
return 0; return 0;
} }
@ -88,4 +88,5 @@ static void __init ramips_generic_init(void)
{ {
} }
MIPS_MACHINE(RAMIPS_MACH_GENERIC, "Generic Ralink board", ramips_generic_init); MIPS_MACHINE(RAMIPS_MACH_GENERIC, "Generic", "Generic Ralink board",
ramips_generic_init);

View File

@ -15,7 +15,6 @@
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <linux/leds.h> #include <linux/leds.h>
#include <asm/mips_machine.h>
#include <asm/mach-ralink/machine.h> #include <asm/mach-ralink/machine.h>
#include <asm/mach-ralink/dev_gpio_leds.h> #include <asm/mach-ralink/dev_gpio_leds.h>
#include <asm/mach-ralink/rt288x.h> #include <asm/mach-ralink/rt288x.h>
@ -85,4 +84,4 @@ static void __init rt_n15_init(void)
rt_n15_leds_gpio); rt_n15_leds_gpio);
} }
MIPS_MACHINE(RAMIPS_MACH_RT_N15, "Asus RT-N15", rt_n15_init); MIPS_MACHINE(RAMIPS_MACH_RT_N15, "RT-N15", "Asus RT-N15", rt_n15_init);

View File

@ -15,7 +15,6 @@
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <linux/leds.h> #include <linux/leds.h>
#include <asm/mips_machine.h>
#include <asm/mach-ralink/machine.h> #include <asm/mach-ralink/machine.h>
#include <asm/mach-ralink/dev_gpio_leds.h> #include <asm/mach-ralink/dev_gpio_leds.h>
#include <asm/mach-ralink/rt288x.h> #include <asm/mach-ralink/rt288x.h>
@ -102,4 +101,5 @@ static void __init wzr_agl300nh_init(void)
*/ */
} }
MIPS_MACHINE(RAMIPS_MACH_WZR_AGL300NH, "Buffalo WZR-AGL300NH", wzr_agl300nh_init); MIPS_MACHINE(RAMIPS_MACH_WZR_AGL300NH, "WZR-AGL300NH",
"Buffalo WZR-AGL300NH", wzr_agl300nh_init);

View File

@ -15,7 +15,6 @@
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <linux/leds.h> #include <linux/leds.h>
#include <asm/mips_machine.h>
#include <asm/mach-ralink/machine.h> #include <asm/mach-ralink/machine.h>
#include <asm/mach-ralink/dev_gpio_leds.h> #include <asm/mach-ralink/dev_gpio_leds.h>
#include <asm/mach-ralink/rt305x.h> #include <asm/mach-ralink/rt305x.h>
@ -96,4 +95,5 @@ static void __init dir_300b_init(void)
dir_300b_leds_gpio); dir_300b_leds_gpio);
} }
MIPS_MACHINE(RAMIPS_MACH_DIR_300_REVB, "D-Link DIR-300 revB", dir_300b_init); MIPS_MACHINE(RAMIPS_MACH_DIR_300_REVB, "DIR-300-revB", "D-Link DIR-300 revB",
dir_300b_init);

View File

@ -15,7 +15,6 @@
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <linux/leds.h> #include <linux/leds.h>
#include <asm/mips_machine.h>
#include <asm/mach-ralink/machine.h> #include <asm/mach-ralink/machine.h>
#include <asm/mach-ralink/dev_gpio_leds.h> #include <asm/mach-ralink/dev_gpio_leds.h>
#include <asm/mach-ralink/rt305x.h> #include <asm/mach-ralink/rt305x.h>
@ -97,4 +96,5 @@ static void __init fonera20n_init(void)
rt305x_register_ethernet(); rt305x_register_ethernet();
} }
MIPS_MACHINE(RAMIPS_MACH_FONERA20N, "La Fonera 2.0N", fonera20n_init); MIPS_MACHINE(RAMIPS_MACH_FONERA20N, "FONERA20N", "La Fonera 2.0N",
fonera20n_init);

View File

@ -15,7 +15,6 @@
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <linux/leds.h> #include <linux/leds.h>
#include <asm/mips_machine.h>
#include <asm/mach-ralink/machine.h> #include <asm/mach-ralink/machine.h>
#include <asm/mach-ralink/dev_gpio_leds.h> #include <asm/mach-ralink/dev_gpio_leds.h>
#include <asm/mach-ralink/rt305x.h> #include <asm/mach-ralink/rt305x.h>
@ -90,5 +89,5 @@ static void __init v22rw_2x2_init(void)
v22rw_2x2_leds_gpio); v22rw_2x2_leds_gpio);
} }
MIPS_MACHINE(RAMIPS_MACH_V22RW_2X2, "Ralink AP-RT3052-V22RW-2X2", MIPS_MACHINE(RAMIPS_MACH_V22RW_2X2, "V22RW-2X2", "Ralink AP-RT3052-V22RW-2X2",
v22rw_2x2_init); v22rw_2x2_init);

View File

@ -15,7 +15,6 @@
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <linux/leds.h> #include <linux/leds.h>
#include <asm/mips_machine.h>
#include <asm/mach-ralink/machine.h> #include <asm/mach-ralink/machine.h>
#include <asm/mach-ralink/dev_gpio_leds.h> #include <asm/mach-ralink/dev_gpio_leds.h>
#include <asm/mach-ralink/rt305x.h> #include <asm/mach-ralink/rt305x.h>
@ -97,4 +96,5 @@ static void __init whr_g300n_init(void)
whr_g300n_leds_gpio); whr_g300n_leds_gpio);
} }
MIPS_MACHINE(RAMIPS_MACH_WHR_G300N, "Buffalo WHR-G300N", whr_g300n_init); MIPS_MACHINE(RAMIPS_MACH_WHR_G300N, "WHR-G300N", "Buffalo WHR-G300N",
whr_g300n_init);

View File

@ -0,0 +1,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/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 */
-

View File

@ -0,0 +1,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/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 */
-