[ARM] pass reboot command line to arch_reset()
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Thu, 19 Mar 2009 16:20:24 +0000 (16:20 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 19 Mar 2009 16:20:24 +0000 (16:20 +0000)
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>
50 files changed:
arch/arm/include/asm/system.h
arch/arm/kernel/process.c
arch/arm/mach-aaec2000/include/mach/system.h
arch/arm/mach-at91/include/mach/system.h
arch/arm/mach-clps711x/include/mach/system.h
arch/arm/mach-davinci/include/mach/system.h
arch/arm/mach-ebsa110/include/mach/system.h
arch/arm/mach-ep93xx/include/mach/system.h
arch/arm/mach-footbridge/include/mach/system.h
arch/arm/mach-h720x/include/mach/system.h
arch/arm/mach-imx/include/mach/system.h
arch/arm/mach-integrator/include/mach/system.h
arch/arm/mach-iop13xx/include/mach/system.h
arch/arm/mach-iop32x/include/mach/system.h
arch/arm/mach-iop33x/include/mach/system.h
arch/arm/mach-ixp2000/include/mach/system.h
arch/arm/mach-ixp23xx/include/mach/system.h
arch/arm/mach-ixp4xx/include/mach/system.h
arch/arm/mach-kirkwood/include/mach/system.h
arch/arm/mach-ks8695/include/mach/system.h
arch/arm/mach-l7200/include/mach/system.h
arch/arm/mach-lh7a40x/include/mach/system.h
arch/arm/mach-loki/include/mach/system.h
arch/arm/mach-msm/include/mach/system.h
arch/arm/mach-mv78xx0/include/mach/system.h
arch/arm/mach-mx2/system.c
arch/arm/mach-netx/include/mach/system.h
arch/arm/mach-ns9xxx/include/mach/system.h
arch/arm/mach-orion5x/include/mach/system.h
arch/arm/mach-orion5x/lsmini-setup.c
arch/arm/mach-pnx4008/include/mach/system.h
arch/arm/mach-pxa/corgi.c
arch/arm/mach-pxa/include/mach/system.h
arch/arm/mach-pxa/mioa701.c
arch/arm/mach-pxa/poodle.c
arch/arm/mach-pxa/reset.c
arch/arm/mach-pxa/spitz.c
arch/arm/mach-pxa/tosa.c
arch/arm/mach-realview/include/mach/system.h
arch/arm/mach-rpc/include/mach/system.h
arch/arm/mach-s3c2410/include/mach/system-reset.h
arch/arm/mach-s3c6400/include/mach/system.h
arch/arm/mach-sa1100/include/mach/system.h
arch/arm/mach-shark/core.c
arch/arm/mach-shark/include/mach/system.h
arch/arm/mach-versatile/include/mach/system.h
arch/arm/mach-w90x900/include/mach/system.h
arch/arm/plat-mxc/include/mach/system.h
arch/arm/plat-omap/include/mach/system.h
arch/arm/plat-s3c24xx/cpu.c

index 811be55..0a0d49a 100644 (file)
@@ -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)
index af377c7..2de14e2 100644 (file)
@@ -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)
index 8f4115d..fe08ca1 100644 (file)
@@ -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);
 }
index e712658..5268af3 100644 (file)
@@ -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)
index 24e9615..f916cd7 100644 (file)
@@ -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);
 }
index 17ca41d..b7e7036 100644 (file)
@@ -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();
 }
index 350a028..9a26245 100644 (file)
@@ -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
index 67789d0..ed8f35e 100644 (file)
@@ -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;
 
index 2db7f36..0b29315 100644 (file)
@@ -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') {
                /*
index e4a7c76..a708d24 100644 (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;
 }
index adee7e5..46d4ca9 100644 (file)
@@ -32,7 +32,7 @@ arch_idle(void)
 }
 
 static inline void
-arch_reset(char mode)
+arch_reset(char mode, const char *cmd)
 {
        cpu_reset(0);
 }
index c485345..e1551b8 100644 (file)
@@ -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
index c7127f4..d0c66ef 100644 (file)
@@ -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)
index 32d9e5b..a4b808f 100644 (file)
@@ -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();
 
index 0cb3ad8..f192a34 100644 (file)
@@ -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;
 
index 2e9c68f..de37099 100644 (file)
@@ -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();
 
index d57c3fc..8920ff2 100644 (file)
@@ -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()) {
index 92a7e8d..d2aa26f 100644 (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') {
                /* Jump into ROM at address 0 */
index 8510f6c..23a1914 100644 (file)
@@ -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.
index 5a9b032..fb1dda9 100644 (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;
 
index 5272abe..e0dd3b6 100644 (file)
@@ -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);
index fa46bb1..45a56d3 100644 (file)
@@ -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);
 }
index 8db1147..c1de36f 100644 (file)
@@ -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.
index f05ad2e..574ccc4 100644 (file)
@@ -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 */
 }
index 7d51794..1d6350b 100644 (file)
@@ -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.
index 7b82697..92c79d4 100644 (file)
@@ -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;
 
index 6c1023b..dc7b4bc 100644 (file)
@@ -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);
index e2068c5..1561588 100644 (file)
@@ -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())
index 08e4307..9b8db1d 100644 (file)
@@ -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
index e0c43b8..c9bf6b8 100644 (file)
@@ -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);
 }
 
 
index e12e7ab..5dda2bb 100644 (file)
@@ -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);
 }
index 3b89e50..cdf21dd 100644 (file)
@@ -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)
index 0a587c4..d1fce8b 100644 (file)
@@ -20,4 +20,4 @@ static inline void arch_idle(void)
 }
 
 
-void arch_reset(char mode);
+void arch_reset(char mode, const char *cmd);
index 0257727..97c93a7 100644 (file)
@@ -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[] = {
index 572ddec..036bbde 100644 (file)
@@ -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)
index 867c95c..df29d45 100644 (file)
@@ -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);
 
index f697c49..7a0a430 100644 (file)
@@ -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)
index 66b1380..4f6f502 100644 (file)
@@ -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)
index a2f61c7..1a15a44 100644 (file)
@@ -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;
index bd7268b..45c7b93 100644 (file)
@@ -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);
 
index 7613d0a..b8687f7 100644 (file)
@@ -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;
 
index 652bbc4..090cfd9 100644 (file)
@@ -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 */
 }
index 63755ca..942b153 100644 (file)
@@ -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 */
index 4f3a265..358d875 100644 (file)
@@ -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();
index 0752ca2..21c373b 100644 (file)
@@ -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)
 {
index c59e610..8ffc12a 100644 (file)
@@ -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;
 
index 93753f9..9406400 100644 (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);
 }
index bbfc374..cd03eba 100644 (file)
@@ -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);
 }
index e9b9563..cb8c0ef 100644 (file)
@@ -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);
index 542062f..1932b7e 100644 (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
  * 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)