MIPS: Add generic support for multiple machines within a single kernel
This patch adds a generic solution to support multiple machines based on a given SoC within a single kernel image. It is implemented already for several other architectures but MIPS has no generic support for that yet. [Ralf: This competes with DT but DT is a much more complex solution and this code has been used by OpenWRT for a long time so for now DT is a bad reason to stop the merge but longer term this should be migrated to DT.] Signed-off-by: Gabor Juhos <juhosg@openwrt.org> Cc: linux-mips@linux-mips.org Cc: kaloz@openwrt.org Cc: Luis R. Rodriguez <lrodriguez@atheros.com> Cc: Cliff Holden <Cliff.Holden@Atheros.com> Patchwork: https://patchwork.linux-mips.org/patch/1814/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:

committed by
Ralf Baechle

parent
0bec405e8e
commit
487d70d0b8
54
arch/mips/include/asm/mips_machine.h
Normal file
54
arch/mips/include/asm/mips_machine.h
Normal file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published
|
||||
* by the Free Software Foundation.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ASM_MIPS_MACHINE_H
|
||||
#define __ASM_MIPS_MACHINE_H
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/stddef.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
|
||||
struct mips_machine {
|
||||
unsigned long mach_type;
|
||||
const char *mach_id;
|
||||
const char *mach_name;
|
||||
void (*mach_setup)(void);
|
||||
};
|
||||
|
||||
#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 \
|
||||
__used __section(.mips.machines.init) = \
|
||||
{ \
|
||||
.mach_type = _type, \
|
||||
.mach_id = machine_id_##_type, \
|
||||
.mach_name = machine_name_##_type, \
|
||||
.mach_setup = _setup, \
|
||||
};
|
||||
|
||||
extern long __mips_machines_start;
|
||||
extern long __mips_machines_end;
|
||||
|
||||
#ifdef CONFIG_MIPS_MACHINE
|
||||
int mips_machtype_setup(char *id) __init;
|
||||
void mips_machine_setup(void) __init;
|
||||
void mips_set_machine_name(const char *name) __init;
|
||||
char *mips_get_machine_name(void);
|
||||
#else
|
||||
static inline int mips_machtype_setup(char *id) { return 1; }
|
||||
static inline void mips_machine_setup(void) { }
|
||||
static inline void mips_set_machine_name(const char *name) { }
|
||||
static inline char *mips_get_machine_name(void) { return NULL; }
|
||||
#endif /* CONFIG_MIPS_MACHINE */
|
||||
|
||||
#endif /* __ASM_MIPS_MACHINE_H */
|
Reference in New Issue
Block a user