提交 be093beb 编写于 作者: R Russell King 提交者: Russell King

[ARM] pass reboot command line to arch_reset()

OMAP wishes to pass state to the boot loader upon reboot in order to
instruct it whether to wait for USB-based reflashing or not.  There is
already a facility to do this via the reboot() syscall, except we ignore
the string passed to machine_restart().

This patch fixes things to pass this string to arch_reset().  This means
that we keep the reboot mode limited to telling the kernel _how_ to
perform the reboot which should be independent of what we request the
boot loader to do.
Acked-by: NTony Lindgren <tony@atomide.com>
Signed-off-by: NRussell King <rmk+kernel@arm.linux.org.uk>
上级 14b6848b
......@@ -97,8 +97,8 @@ extern void __show_regs(struct pt_regs *);
extern int cpu_architecture(void);
extern void cpu_init(void);
void arm_machine_restart(char mode);
extern void (*arm_pm_restart)(char str);
void arm_machine_restart(char mode, const char *cmd);
extern void (*arm_pm_restart)(char str, const char *cmd);
#define UDBG_UNDEFINED (1 << 0)
#define UDBG_SYSCALL (1 << 1)
......
......@@ -83,7 +83,7 @@ static int __init hlt_setup(char *__unused)
__setup("nohlt", nohlt_setup);
__setup("hlt", hlt_setup);
void arm_machine_restart(char mode)
void arm_machine_restart(char mode, const char *cmd)
{
/*
* Clean and disable cache, and turn off interrupts
......@@ -100,7 +100,7 @@ void arm_machine_restart(char mode)
/*
* Now call the architecture specific reboot code.
*/
arch_reset(mode);
arch_reset(mode, cmd);
/*
* Whoops - the architecture was unable to reboot.
......@@ -120,7 +120,7 @@ EXPORT_SYMBOL(pm_idle);
void (*pm_power_off)(void);
EXPORT_SYMBOL(pm_power_off);
void (*arm_pm_restart)(char str) = arm_machine_restart;
void (*arm_pm_restart)(char str, const char *cmd) = arm_machine_restart;
EXPORT_SYMBOL_GPL(arm_pm_restart);
......@@ -195,9 +195,9 @@ void machine_power_off(void)
pm_power_off();
}
void machine_restart(char * __unused)
void machine_restart(char *cmd)
{
arm_pm_restart(reboot_mode);
arm_pm_restart(reboot_mode, cmd);
}
void __show_regs(struct pt_regs *regs)
......
......@@ -16,7 +16,7 @@ static inline void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
cpu_reset(0);
}
......
......@@ -43,7 +43,7 @@ static inline void arch_idle(void)
void (*at91_arch_reset)(void);
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
/* call the CPU-specific reset function */
if (at91_arch_reset)
......
......@@ -32,7 +32,7 @@ static inline void arch_idle(void)
mov r0, r0");
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
cpu_reset(0);
}
......
......@@ -21,7 +21,7 @@ static void arch_idle(void)
cpu_do_idle();
}
static void arch_reset(char mode)
static void arch_reset(char mode, const char *cmd)
{
davinci_watchdog_reset();
}
......
......@@ -34,6 +34,6 @@ static inline void arch_idle(void)
asm volatile ("mcr p15, 0, ip, c15, c1, 2" : : : "cc");
}
#define arch_reset(mode) cpu_reset(0x80000000)
#define arch_reset(mode, cmd) cpu_reset(0x80000000)
#endif
......@@ -9,7 +9,7 @@ static inline void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
u32 devicecfg;
......
......@@ -18,7 +18,7 @@ static inline void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
if (mode == 's') {
/*
......
......@@ -25,7 +25,7 @@ static void arch_idle(void)
}
static __inline__ void arch_reset(char mode)
static __inline__ void arch_reset(char mode, const char *cmd)
{
CPU_REG (PMU_BASE, PMU_STAT) |= PMU_WARMRESET;
}
......
......@@ -32,7 +32,7 @@ arch_idle(void)
}
static inline void
arch_reset(char mode)
arch_reset(char mode, const char *cmd)
{
cpu_reset(0);
}
......
......@@ -32,7 +32,7 @@ static inline void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
/*
* To reset, we hit the on-board reset register
......
......@@ -13,7 +13,7 @@ static inline void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
/*
* Reset the internal bus (warning both cores are reset)
......
......@@ -16,7 +16,7 @@ static inline void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
local_irq_disable();
......
......@@ -14,7 +14,7 @@ static inline void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
*IOP3XX_PCSR = 0x30;
......
......@@ -17,7 +17,7 @@ static inline void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
local_irq_disable();
......
......@@ -19,7 +19,7 @@ static inline void arch_idle(void)
#endif
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
/* First try machine specific support */
if (machine_is_ixdp2351()) {
......
......@@ -20,7 +20,7 @@ static inline void arch_idle(void)
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
if ( 1 && mode == 's') {
/* Jump into ROM at address 0 */
......
......@@ -17,7 +17,7 @@ static inline void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
/*
* Enable soft reset to assert RSTOUTn.
......
......@@ -27,7 +27,7 @@ static void arch_idle(void)
}
static void arch_reset(char mode)
static void arch_reset(char mode, const char *cmd)
{
unsigned int reg;
......
......@@ -19,7 +19,7 @@ static inline void arch_idle(void)
*(unsigned long *)(IO_BASE + 0x50004) = 1; /* idle mode */
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
if (mode == 's') {
cpu_reset(0);
......
......@@ -13,7 +13,7 @@ static inline void arch_idle(void)
cpu_do_idle ();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
cpu_reset (0);
}
......@@ -17,7 +17,7 @@ static inline void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
/*
* Enable soft reset to assert RSTOUTn.
......
......@@ -17,7 +17,7 @@
void arch_idle(void);
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
for (;;) ; /* depends on IPC w/ other core */
}
......@@ -17,7 +17,7 @@ static inline void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
/*
* Enable soft reset to assert RSTOUTn.
......
......@@ -46,7 +46,7 @@ void arch_idle(void)
/*
* Reset the system. It is called by machine_restart().
*/
void arch_reset(char mode)
void arch_reset(char mode, const char *cmd)
{
struct clk *clk;
......
......@@ -28,7 +28,7 @@ static inline void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
writel(NETX_SYSTEM_RES_CR_FIRMW_RES_EN | NETX_SYSTEM_RES_CR_FIRMW_RES,
NETX_SYSTEM_RES_CR);
......
......@@ -20,7 +20,7 @@ static inline void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
#ifdef CONFIG_PROCESSOR_NS9360
if (processor_is_ns9360())
......
......@@ -19,7 +19,7 @@ static inline void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
/*
* Enable and issue soft reset
......
......@@ -186,7 +186,7 @@ static struct mv_sata_platform_data lsmini_sata_data = {
static void lsmini_power_off(void)
{
arch_reset(0);
arch_reset(0, NULL);
}
......
......@@ -30,7 +30,7 @@ static void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
cpu_reset(0);
}
......
......@@ -635,16 +635,16 @@ static void corgi_poweroff(void)
/* Green LED off tells the bootloader to halt */
gpio_set_value(CORGI_GPIO_LED_GREEN, 0);
arm_machine_restart('h');
arm_machine_restart('h', NULL);
}
static void corgi_restart(char mode)
static void corgi_restart(char mode, const char *cmd)
{
if (!machine_is_corgi())
/* Green LED on tells the bootloader to reboot */
gpio_set_value(CORGI_GPIO_LED_GREEN, 1);
arm_machine_restart('h');
arm_machine_restart('h', cmd);
}
static void __init corgi_init(void)
......
......@@ -20,4 +20,4 @@ static inline void arch_idle(void)
}
void arch_reset(char mode);
void arch_reset(char mode, const char *cmd);
......@@ -788,13 +788,13 @@ static void mioa701_machine_exit(void);
static void mioa701_poweroff(void)
{
mioa701_machine_exit();
arm_machine_restart('s');
arm_machine_restart('s', NULL);
}
static void mioa701_restart(char c)
static void mioa701_restart(char c, const char *cmd)
{
mioa701_machine_exit();
arm_machine_restart('s');
arm_machine_restart('s', cmd);
}
struct gpio_ress global_gpios[] = {
......
......@@ -501,12 +501,12 @@ static struct platform_device *devices[] __initdata = {
static void poodle_poweroff(void)
{
arm_machine_restart('h');
arm_machine_restart('h', NULL);
}
static void poodle_restart(char mode)
static void poodle_restart(char mode, const char *cmd)
{
arm_machine_restart('h');
arm_machine_restart('h', cmd);
}
static void __init poodle_init(void)
......
......@@ -81,7 +81,7 @@ static void do_hw_reset(void)
OSMR3 = OSCR + 368640; /* ... in 100 ms */
}
void arch_reset(char mode)
void arch_reset(char mode, const char *cmd)
{
clear_reset_status(RESET_STATUS_ALL);
......
......@@ -701,10 +701,10 @@ static struct platform_device *devices[] __initdata = {
static void spitz_poweroff(void)
{
arm_machine_restart('g');
arm_machine_restart('g', NULL);
}
static void spitz_restart(char mode)
static void spitz_restart(char mode, const char *cmd)
{
/* Bootloader magic for a reboot */
if((MSC0 & 0xffff0000) == 0x7ff00000)
......
......@@ -876,10 +876,10 @@ static struct platform_device *devices[] __initdata = {
static void tosa_poweroff(void)
{
arm_machine_restart('g');
arm_machine_restart('g', NULL);
}
static void tosa_restart(char mode)
static void tosa_restart(char mode, const char *cmd)
{
/* Bootloader magic for a reboot */
if((MSC0 & 0xffff0000) == 0x7ff00000)
......
......@@ -34,7 +34,7 @@ static inline void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
void __iomem *hdr_ctrl = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_RESETCTL_OFFSET;
unsigned int val;
......
......@@ -16,7 +16,7 @@ static inline void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
iomd_writeb(0, IOMD_ROMCR0);
......
......@@ -22,7 +22,7 @@
extern void (*s3c24xx_reset_hook)(void);
static void
arch_reset(char mode)
arch_reset(char mode, const char *cmd)
{
struct clk *wdtclk;
......
......@@ -16,7 +16,7 @@ static void arch_idle(void)
/* nothing here yet */
}
static void arch_reset(char mode)
static void arch_reset(char mode, const char *cmd)
{
/* nothing here yet */
}
......
......@@ -10,7 +10,7 @@ static inline void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
if (mode == 's') {
/* Jump into ROM at address 0 */
......
......@@ -26,7 +26,7 @@
#define ROMCARD_SIZE 0x08000000
#define ROMCARD_START 0x10000000
void arch_reset(char mode)
void arch_reset(char mode, const char *cmd)
{
short temp;
local_irq_disable();
......
......@@ -7,7 +7,7 @@
#define __ASM_ARCH_SYSTEM_H
/* Found in arch/mach-shark/core.c */
extern void arch_reset(char mode);
extern void arch_reset(char mode, const char *cmd);
static inline void arch_idle(void)
{
......
......@@ -34,7 +34,7 @@ static inline void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
u32 val;
......
......@@ -21,7 +21,7 @@ static void arch_idle(void)
{
}
static void arch_reset(char mode)
static void arch_reset(char mode, const char *cmd)
{
cpu_reset(0);
}
......
......@@ -26,7 +26,7 @@ static inline void arch_idle(void)
cpu_do_idle();
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
cpu_reset(0);
}
......
......@@ -38,7 +38,7 @@ static inline void omap1_arch_reset(char mode)
omap_writew(1, ARM_RSTCT1);
}
static inline void arch_reset(char mode)
static inline void arch_reset(char mode, const char *cmd)
{
if (!cpu_class_is_omap2())
omap1_arch_reset(mode);
......
......@@ -182,7 +182,7 @@ static unsigned long s3c24xx_read_idcode_v4(void)
* with the caches enabled. It seems at least the S3C2440 has a problem
* resetting if there is bus activity interrupted by the reset.
*/
static void s3c24xx_pm_restart(char mode)
static void s3c24xx_pm_restart(char mode, const char *cmd)
{
if (mode != 's') {
unsigned long flags;
......@@ -191,12 +191,12 @@ static void s3c24xx_pm_restart(char mode)
__cpuc_flush_kern_all();
__cpuc_flush_user_all();
arch_reset(mode);
arch_reset(mode, cmd);
local_irq_restore(flags);
}
/* fallback, or unhandled */
arm_machine_restart(mode);
arm_machine_restart(mode, cmd);
}
void __init s3c24xx_init_io(struct map_desc *mach_desc, int size)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册