/*
 *  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,				\
};

#define MIPS_MACHINE_NONAME(_type, _id, _setup)		\
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	= NULL,					\
	.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;
#else
static inline int mips_machtype_setup(char *id) { return 1; }
static inline void mips_machine_setup(void) { }
#endif /* CONFIG_MIPS_MACHINE */

#endif /* __ASM_MIPS_MACHINE_H */
