[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: Tony Lindgren <tony@atomide.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
Russell King 2009-03-19 16:20:24 +00:00 committed by Russell King
parent 14b6848bc0
commit be093beb60
50 changed files with 65 additions and 65 deletions

View file

@ -97,8 +97,8 @@ extern void __show_regs(struct pt_regs *);
extern int cpu_architecture(void); extern int cpu_architecture(void);
extern void cpu_init(void); extern void cpu_init(void);
void arm_machine_restart(char mode); void arm_machine_restart(char mode, const char *cmd);
extern void (*arm_pm_restart)(char str); extern void (*arm_pm_restart)(char str, const char *cmd);
#define UDBG_UNDEFINED (1 << 0) #define UDBG_UNDEFINED (1 << 0)
#define UDBG_SYSCALL (1 << 1) #define UDBG_SYSCALL (1 << 1)

View file

@ -83,7 +83,7 @@ static int __init hlt_setup(char *__unused)
__setup("nohlt", nohlt_setup); __setup("nohlt", nohlt_setup);
__setup("hlt", hlt_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 * 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. * Now call the architecture specific reboot code.
*/ */
arch_reset(mode); arch_reset(mode, cmd);
/* /*
* Whoops - the architecture was unable to reboot. * Whoops - the architecture was unable to reboot.
@ -120,7 +120,7 @@ EXPORT_SYMBOL(pm_idle);
void (*pm_power_off)(void); void (*pm_power_off)(void);
EXPORT_SYMBOL(pm_power_off); 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); EXPORT_SYMBOL_GPL(arm_pm_restart);
@ -195,9 +195,9 @@ void machine_power_off(void)
pm_power_off(); 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) void __show_regs(struct pt_regs *regs)

View file

@ -16,7 +16,7 @@ static inline void arch_idle(void)
cpu_do_idle(); cpu_do_idle();
} }
static inline void arch_reset(char mode) static inline void arch_reset(char mode, const char *cmd)
{ {
cpu_reset(0); cpu_reset(0);
} }

View file

@ -43,7 +43,7 @@ static inline void arch_idle(void)
void (*at91_arch_reset)(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 */ /* call the CPU-specific reset function */
if (at91_arch_reset) if (at91_arch_reset)

View file

@ -32,7 +32,7 @@ static inline void arch_idle(void)
mov r0, r0"); mov r0, r0");
} }
static inline void arch_reset(char mode) static inline void arch_reset(char mode, const char *cmd)
{ {
cpu_reset(0); cpu_reset(0);
} }

View file

@ -21,7 +21,7 @@ static void arch_idle(void)
cpu_do_idle(); cpu_do_idle();
} }
static void arch_reset(char mode) static void arch_reset(char mode, const char *cmd)
{ {
davinci_watchdog_reset(); davinci_watchdog_reset();
} }

View file

@ -34,6 +34,6 @@ static inline void arch_idle(void)
asm volatile ("mcr p15, 0, ip, c15, c1, 2" : : : "cc"); 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 #endif

View file

@ -9,7 +9,7 @@ static inline void arch_idle(void)
cpu_do_idle(); cpu_do_idle();
} }
static inline void arch_reset(char mode) static inline void arch_reset(char mode, const char *cmd)
{ {
u32 devicecfg; u32 devicecfg;

View file

@ -18,7 +18,7 @@ static inline void arch_idle(void)
cpu_do_idle(); cpu_do_idle();
} }
static inline void arch_reset(char mode) static inline void arch_reset(char mode, const char *cmd)
{ {
if (mode == 's') { if (mode == 's') {
/* /*

View file

@ -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; CPU_REG (PMU_BASE, PMU_STAT) |= PMU_WARMRESET;
} }

View file

@ -32,7 +32,7 @@ arch_idle(void)
} }
static inline void static inline void
arch_reset(char mode) arch_reset(char mode, const char *cmd)
{ {
cpu_reset(0); cpu_reset(0);
} }

View file

@ -32,7 +32,7 @@ static inline void arch_idle(void)
cpu_do_idle(); 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 * To reset, we hit the on-board reset register

View file

@ -13,7 +13,7 @@ static inline void arch_idle(void)
cpu_do_idle(); 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) * Reset the internal bus (warning both cores are reset)

View file

@ -16,7 +16,7 @@ static inline void arch_idle(void)
cpu_do_idle(); cpu_do_idle();
} }
static inline void arch_reset(char mode) static inline void arch_reset(char mode, const char *cmd)
{ {
local_irq_disable(); local_irq_disable();

View file

@ -14,7 +14,7 @@ static inline void arch_idle(void)
cpu_do_idle(); cpu_do_idle();
} }
static inline void arch_reset(char mode) static inline void arch_reset(char mode, const char *cmd)
{ {
*IOP3XX_PCSR = 0x30; *IOP3XX_PCSR = 0x30;

View file

@ -17,7 +17,7 @@ static inline void arch_idle(void)
cpu_do_idle(); cpu_do_idle();
} }
static inline void arch_reset(char mode) static inline void arch_reset(char mode, const char *cmd)
{ {
local_irq_disable(); local_irq_disable();

View file

@ -19,7 +19,7 @@ static inline void arch_idle(void)
#endif #endif
} }
static inline void arch_reset(char mode) static inline void arch_reset(char mode, const char *cmd)
{ {
/* First try machine specific support */ /* First try machine specific support */
if (machine_is_ixdp2351()) { if (machine_is_ixdp2351()) {

View file

@ -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') { if ( 1 && mode == 's') {
/* Jump into ROM at address 0 */ /* Jump into ROM at address 0 */

View file

@ -17,7 +17,7 @@ static inline void arch_idle(void)
cpu_do_idle(); 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. * Enable soft reset to assert RSTOUTn.

View file

@ -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; unsigned int reg;

View file

@ -19,7 +19,7 @@ static inline void arch_idle(void)
*(unsigned long *)(IO_BASE + 0x50004) = 1; /* idle mode */ *(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') { if (mode == 's') {
cpu_reset(0); cpu_reset(0);

View file

@ -13,7 +13,7 @@ static inline void arch_idle(void)
cpu_do_idle (); cpu_do_idle ();
} }
static inline void arch_reset(char mode) static inline void arch_reset(char mode, const char *cmd)
{ {
cpu_reset (0); cpu_reset (0);
} }

View file

@ -17,7 +17,7 @@ static inline void arch_idle(void)
cpu_do_idle(); 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. * Enable soft reset to assert RSTOUTn.

View file

@ -17,7 +17,7 @@
void arch_idle(void); 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 */ for (;;) ; /* depends on IPC w/ other core */
} }

View file

@ -17,7 +17,7 @@ static inline void arch_idle(void)
cpu_do_idle(); 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. * Enable soft reset to assert RSTOUTn.

View file

@ -46,7 +46,7 @@ void arch_idle(void)
/* /*
* Reset the system. It is called by machine_restart(). * 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; struct clk *clk;

View file

@ -28,7 +28,7 @@ static inline void arch_idle(void)
cpu_do_idle(); 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, writel(NETX_SYSTEM_RES_CR_FIRMW_RES_EN | NETX_SYSTEM_RES_CR_FIRMW_RES,
NETX_SYSTEM_RES_CR); NETX_SYSTEM_RES_CR);

View file

@ -20,7 +20,7 @@ static inline void arch_idle(void)
cpu_do_idle(); cpu_do_idle();
} }
static inline void arch_reset(char mode) static inline void arch_reset(char mode, const char *cmd)
{ {
#ifdef CONFIG_PROCESSOR_NS9360 #ifdef CONFIG_PROCESSOR_NS9360
if (processor_is_ns9360()) if (processor_is_ns9360())

View file

@ -19,7 +19,7 @@ static inline void arch_idle(void)
cpu_do_idle(); 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 * Enable and issue soft reset

View file

@ -186,7 +186,7 @@ static struct mv_sata_platform_data lsmini_sata_data = {
static void lsmini_power_off(void) static void lsmini_power_off(void)
{ {
arch_reset(0); arch_reset(0, NULL);
} }

View file

@ -30,7 +30,7 @@ static void arch_idle(void)
cpu_do_idle(); cpu_do_idle();
} }
static inline void arch_reset(char mode) static inline void arch_reset(char mode, const char *cmd)
{ {
cpu_reset(0); cpu_reset(0);
} }

View file

@ -635,16 +635,16 @@ static void corgi_poweroff(void)
/* Green LED off tells the bootloader to halt */ /* Green LED off tells the bootloader to halt */
gpio_set_value(CORGI_GPIO_LED_GREEN, 0); 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()) if (!machine_is_corgi())
/* Green LED on tells the bootloader to reboot */ /* Green LED on tells the bootloader to reboot */
gpio_set_value(CORGI_GPIO_LED_GREEN, 1); gpio_set_value(CORGI_GPIO_LED_GREEN, 1);
arm_machine_restart('h'); arm_machine_restart('h', cmd);
} }
static void __init corgi_init(void) static void __init corgi_init(void)

View file

@ -20,4 +20,4 @@ static inline void arch_idle(void)
} }
void arch_reset(char mode); void arch_reset(char mode, const char *cmd);

View file

@ -788,13 +788,13 @@ static void mioa701_machine_exit(void);
static void mioa701_poweroff(void) static void mioa701_poweroff(void)
{ {
mioa701_machine_exit(); 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(); mioa701_machine_exit();
arm_machine_restart('s'); arm_machine_restart('s', cmd);
} }
struct gpio_ress global_gpios[] = { struct gpio_ress global_gpios[] = {

View file

@ -501,12 +501,12 @@ static struct platform_device *devices[] __initdata = {
static void poodle_poweroff(void) 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) static void __init poodle_init(void)

View file

@ -81,7 +81,7 @@ static void do_hw_reset(void)
OSMR3 = OSCR + 368640; /* ... in 100 ms */ 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); clear_reset_status(RESET_STATUS_ALL);

View file

@ -701,10 +701,10 @@ static struct platform_device *devices[] __initdata = {
static void spitz_poweroff(void) 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 */ /* Bootloader magic for a reboot */
if((MSC0 & 0xffff0000) == 0x7ff00000) if((MSC0 & 0xffff0000) == 0x7ff00000)

View file

@ -876,10 +876,10 @@ static struct platform_device *devices[] __initdata = {
static void tosa_poweroff(void) 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 */ /* Bootloader magic for a reboot */
if((MSC0 & 0xffff0000) == 0x7ff00000) if((MSC0 & 0xffff0000) == 0x7ff00000)

View file

@ -34,7 +34,7 @@ static inline void arch_idle(void)
cpu_do_idle(); 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; void __iomem *hdr_ctrl = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_RESETCTL_OFFSET;
unsigned int val; unsigned int val;

View file

@ -16,7 +16,7 @@ static inline void arch_idle(void)
cpu_do_idle(); 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); iomd_writeb(0, IOMD_ROMCR0);

View file

@ -22,7 +22,7 @@
extern void (*s3c24xx_reset_hook)(void); extern void (*s3c24xx_reset_hook)(void);
static void static void
arch_reset(char mode) arch_reset(char mode, const char *cmd)
{ {
struct clk *wdtclk; struct clk *wdtclk;

View file

@ -16,7 +16,7 @@ static void arch_idle(void)
/* nothing here yet */ /* nothing here yet */
} }
static void arch_reset(char mode) static void arch_reset(char mode, const char *cmd)
{ {
/* nothing here yet */ /* nothing here yet */
} }

View file

@ -10,7 +10,7 @@ static inline void arch_idle(void)
cpu_do_idle(); cpu_do_idle();
} }
static inline void arch_reset(char mode) static inline void arch_reset(char mode, const char *cmd)
{ {
if (mode == 's') { if (mode == 's') {
/* Jump into ROM at address 0 */ /* Jump into ROM at address 0 */

View file

@ -26,7 +26,7 @@
#define ROMCARD_SIZE 0x08000000 #define ROMCARD_SIZE 0x08000000
#define ROMCARD_START 0x10000000 #define ROMCARD_START 0x10000000
void arch_reset(char mode) void arch_reset(char mode, const char *cmd)
{ {
short temp; short temp;
local_irq_disable(); local_irq_disable();

View file

@ -7,7 +7,7 @@
#define __ASM_ARCH_SYSTEM_H #define __ASM_ARCH_SYSTEM_H
/* Found in arch/mach-shark/core.c */ /* 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) static inline void arch_idle(void)
{ {

View file

@ -34,7 +34,7 @@ static inline void arch_idle(void)
cpu_do_idle(); cpu_do_idle();
} }
static inline void arch_reset(char mode) static inline void arch_reset(char mode, const char *cmd)
{ {
u32 val; u32 val;

View file

@ -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); cpu_reset(0);
} }

View file

@ -26,7 +26,7 @@ static inline void arch_idle(void)
cpu_do_idle(); cpu_do_idle();
} }
static inline void arch_reset(char mode) static inline void arch_reset(char mode, const char *cmd)
{ {
cpu_reset(0); cpu_reset(0);
} }

View file

@ -38,7 +38,7 @@ static inline void omap1_arch_reset(char mode)
omap_writew(1, ARM_RSTCT1); 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()) if (!cpu_class_is_omap2())
omap1_arch_reset(mode); omap1_arch_reset(mode);

View file

@ -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 * with the caches enabled. It seems at least the S3C2440 has a problem
* resetting if there is bus activity interrupted by the reset. * 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') { if (mode != 's') {
unsigned long flags; unsigned long flags;
@ -191,12 +191,12 @@ static void s3c24xx_pm_restart(char mode)
__cpuc_flush_kern_all(); __cpuc_flush_kern_all();
__cpuc_flush_user_all(); __cpuc_flush_user_all();
arch_reset(mode); arch_reset(mode, cmd);
local_irq_restore(flags); local_irq_restore(flags);
} }
/* fallback, or unhandled */ /* fallback, or unhandled */
arm_machine_restart(mode); arm_machine_restart(mode, cmd);
} }
void __init s3c24xx_init_io(struct map_desc *mach_desc, int size) void __init s3c24xx_init_io(struct map_desc *mach_desc, int size)