ARM: OMAP2+: PRM: provide generic API for system reset
authorTero Kristo <t-kristo@ti.com>
Mon, 27 Oct 2014 15:39:26 +0000 (08:39 -0700)
committerTony Lindgren <tony@atomide.com>
Mon, 27 Oct 2014 15:39:26 +0000 (08:39 -0700)
This patch combines the various prm_warm_reset calls under a common
API prm_reset_system, and adds the SoC specific implementation under
prm_ll_data.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
Acked-by: Paul Walmsley <paul@pwsan.com>
Tested-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
13 files changed:
arch/arm/mach-omap2/am33xx-restart.c
arch/arm/mach-omap2/omap2-restart.c
arch/arm/mach-omap2/omap3-restart.c
arch/arm/mach-omap2/omap4-restart.c
arch/arm/mach-omap2/prm.h
arch/arm/mach-omap2/prm2xxx.c
arch/arm/mach-omap2/prm2xxx.h
arch/arm/mach-omap2/prm33xx.c
arch/arm/mach-omap2/prm33xx.h
arch/arm/mach-omap2/prm3xxx.c
arch/arm/mach-omap2/prm3xxx.h
arch/arm/mach-omap2/prm44xx.c
arch/arm/mach-omap2/prm_common.c

index 728638913cd142d4eb714c25304b0a3c6fbc9d69..5bace6a45ffb3700065013dca4b1cc8211c2134b 100644 (file)
@@ -9,8 +9,7 @@
 #include <linux/reboot.h>
 
 #include "common.h"
-#include "prm-regbits-33xx.h"
-#include "prm33xx.h"
+#include "prm.h"
 
 /**
  * am3xx_restart - trigger a software restart of the SoC
@@ -24,5 +23,5 @@ void am33xx_restart(enum reboot_mode mode, const char *cmd)
 {
        /* TODO: Handle mode and cmd if necessary */
 
-       am33xx_prm_global_warm_sw_reset();
+       omap_prm_reset_system();
 }
index 68423e26399d9ae8e618d506cdbb3c21cbbf0014..d937b2e4040be2dcb45a70ff0ca1e591c0b4c3bc 100644 (file)
@@ -15,7 +15,7 @@
 
 #include "soc.h"
 #include "common.h"
-#include "prm2xxx.h"
+#include "prm.h"
 
 /*
  * reset_virt_prcm_set_ck, reset_sys_ck: pointers to the virt_prcm_set
@@ -40,8 +40,7 @@ void omap2xxx_restart(enum reboot_mode mode, const char *cmd)
 
        /* XXX Should save the cmd argument for use after the reboot */
 
-       omap2xxx_prm_dpll_reset(); /* never returns */
-       while (1);
+       omap_prm_reset_system();
 }
 
 /**
index 5de2a0c2979d228d1da969cceeb986d2bd14ddb4..103a49f68bcb34ee60fc03ed94299df9bc2037d7 100644 (file)
 #include <linux/init.h>
 #include <linux/reboot.h>
 
-#include "iomap.h"
-#include "common.h"
 #include "control.h"
-#include "prm3xxx.h"
+#include "prm.h"
 
 /* Global address base setup code */
 
@@ -32,6 +30,5 @@
 void omap3xxx_restart(enum reboot_mode mode, const char *cmd)
 {
        omap3_ctrl_write_boot_mode((cmd ? (u8)*cmd : 0));
-       omap3xxx_prm_dpll3_reset(); /* never returns */
-       while (1);
+       omap_prm_reset_system();
 }
index 41dfd7da8170952abe0f97a4295f21c97f9dfde6..a99e7f7fb5bec2a44920d3c34c5ea327a08f57f1 100644 (file)
@@ -9,7 +9,7 @@
 
 #include <linux/types.h>
 #include <linux/reboot.h>
-#include "prminst44xx.h"
+#include "prm.h"
 
 /**
  * omap44xx_restart - trigger a software restart of the SoC
@@ -22,7 +22,5 @@
 void omap44xx_restart(enum reboot_mode mode, const char *cmd)
 {
        /* XXX Should save 'cmd' into scratchpad for use after reboot */
-       omap4_prminst_global_warm_sw_reset(); /* never returns */
-       while (1)
-               ;
+       omap_prm_reset_system();
 }
index dd802eec0deca14f675fcadef50f6c884583be44..77752e49d8d4c666a2f48fb816546ccfbf53b212 100644 (file)
@@ -144,6 +144,7 @@ struct prm_ll_data {
                                  u16 offset, u16 st_offset);
        int (*is_hardreset_asserted)(u8 shift, u8 part, s16 prm_mod,
                                     u16 offset);
+       void (*reset_system)(void);
 };
 
 extern int prm_register(struct prm_ll_data *pld);
@@ -156,6 +157,7 @@ int omap_prm_is_hardreset_asserted(u8 shift, u8 part, s16 prm_mod, u16 offset);
 extern u32 prm_read_reset_sources(void);
 extern bool prm_was_any_context_lost_old(u8 part, s16 inst, u16 idx);
 extern void prm_clear_context_loss_flags_old(u8 part, s16 inst, u16 idx);
+void omap_prm_reset_system(void);
 
 void omap_prm_reconfigure_io_chain(void);
 
index 54ae55520da6f5eb8210f062c7ce28dc2838efe4..af0f15278fc2afc2d7480da370cba6cafac9d2f6 100644 (file)
@@ -106,7 +106,7 @@ static int omap2xxx_pwrst_to_common_pwrst(u8 omap2xxx_pwrst)
  * Set the DPLL reset bit, which should reboot the SoC.  This is the
  * recommended way to restart the SoC.  No return value.
  */
-void omap2xxx_prm_dpll_reset(void)
+static void omap2xxx_prm_dpll_reset(void)
 {
        omap2_prm_set_mod_reg_bits(OMAP_RST_DPLL3_MASK, WKUP_MOD,
                                   OMAP2_RM_RSTCTRL);
@@ -215,6 +215,7 @@ static struct prm_ll_data omap2xxx_prm_ll_data = {
        .assert_hardreset = &omap2_prm_assert_hardreset,
        .deassert_hardreset = &omap2_prm_deassert_hardreset,
        .is_hardreset_asserted = &omap2_prm_is_hardreset_asserted,
+       .reset_system = &omap2xxx_prm_dpll_reset,
 };
 
 int __init omap2xxx_prm_init(void)
index d73414139292478a99b3f35aaadb1bad0fdab0b7..1d51643062f7957dec8b9be7a66fcbf11d3e5de9 100644 (file)
 extern int omap2xxx_clkdm_sleep(struct clockdomain *clkdm);
 extern int omap2xxx_clkdm_wakeup(struct clockdomain *clkdm);
 
-extern void omap2xxx_prm_dpll_reset(void);
 void omap2xxx_prm_clear_mod_irqs(s16 module, u8 regs, u32 wkst_mask);
 
 extern int __init omap2xxx_prm_init(void);
index 4a843f7cac02b639dcd5e5b1c7e7b38a27285ca3..02f628601b098799e2b73354215ac33a411abe3b 100644 (file)
@@ -341,7 +341,7 @@ static int am33xx_check_vcvp(void)
  *
  * Immediately reboots the device through warm reset.
  */
-void am33xx_prm_global_warm_sw_reset(void)
+static void am33xx_prm_global_warm_sw_reset(void)
 {
        am33xx_prm_rmw_reg_bits(AM33XX_RST_GLOBAL_WARM_SW_MASK,
                                AM33XX_RST_GLOBAL_WARM_SW_MASK,
@@ -375,6 +375,7 @@ static struct prm_ll_data am33xx_prm_ll_data = {
        .assert_hardreset               = am33xx_prm_assert_hardreset,
        .deassert_hardreset             = am33xx_prm_deassert_hardreset,
        .is_hardreset_asserted          = am33xx_prm_is_hardreset_asserted,
+       .reset_system                   = am33xx_prm_global_warm_sw_reset,
 };
 
 int __init am33xx_prm_init(void)
index 937d56e70b3eb8db0a96638d260dd5abbc7236ab..98ac41f271da3460378a11a44468504f11ed0f32 100644 (file)
 #define AM33XX_PM_CEFUSE_PWRSTST               AM33XX_PRM_REGADDR(AM33XX_PRM_CEFUSE_MOD, 0x0004)
 
 #ifndef __ASSEMBLER__
-extern void am33xx_prm_global_warm_sw_reset(void);
 int am33xx_prm_init(void);
 
 #endif /* ASSEMBLER */
index 9da15e9db6d2ae6ad3dfe9d47d3885b17fde5383..c5e00c6714b1d99fc5afaabe3f41985e1fce4bad 100644 (file)
@@ -136,7 +136,7 @@ u32 omap3_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset)
  * recommended way to restart the SoC, considering Errata i520.  No
  * return value.
  */
-void omap3xxx_prm_dpll3_reset(void)
+static void omap3xxx_prm_dpll3_reset(void)
 {
        omap2_prm_set_mod_reg_bits(OMAP_RST_DPLL3_MASK, OMAP3430_GR_MOD,
                                   OMAP2_RM_RSTCTRL);
@@ -663,6 +663,7 @@ static struct prm_ll_data omap3xxx_prm_ll_data = {
        .assert_hardreset = &omap2_prm_assert_hardreset,
        .deassert_hardreset = &omap2_prm_deassert_hardreset,
        .is_hardreset_asserted = &omap2_prm_is_hardreset_asserted,
+       .reset_system = &omap3xxx_prm_dpll3_reset,
 };
 
 int __init omap3xxx_prm_init(void)
index 321568bc0847a61f5d8b28a5d1a1145c8a600ef8..cfde3f4a03ccda96ce7dabac3630a04963940f21 100644 (file)
@@ -144,8 +144,6 @@ extern u32 omap3_prm_vcvp_read(u8 offset);
 extern void omap3_prm_vcvp_write(u32 val, u8 offset);
 extern u32 omap3_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset);
 
-extern void omap3xxx_prm_dpll3_reset(void);
-
 extern int __init omap3xxx_prm_init(void);
 extern u32 omap3xxx_prm_get_reset_sources(void);
 int omap3xxx_prm_clear_mod_irqs(s16 module, u8 regs, u32 ignore_bits);
index e7ac7e209edcb4a6198a6097b98fe785ceb02bda..cc170fb81ff76dc018ad6eee2c0e9931ab575f08 100644 (file)
@@ -697,6 +697,7 @@ static struct prm_ll_data omap44xx_prm_ll_data = {
        .assert_hardreset       = omap4_prminst_assert_hardreset,
        .deassert_hardreset     = omap4_prminst_deassert_hardreset,
        .is_hardreset_asserted  = omap4_prminst_is_hardreset_asserted,
+       .reset_system           = omap4_prminst_global_warm_sw_reset,
 };
 
 int __init omap44xx_prm_init(void)
index be40824acf5f2eb4f37f74007b62c65a10b4ce0b..779940cb6e5651d4d5c486878b5cbbef060af1dc 100644 (file)
@@ -502,6 +502,25 @@ void omap_prm_reconfigure_io_chain(void)
        prcm_irq_setup->reconfigure_io_chain();
 }
 
+/**
+ * omap_prm_reset_system - trigger global SW reset
+ *
+ * Triggers SoC specific global warm reset to reboot the device.
+ */
+void omap_prm_reset_system(void)
+{
+       if (!prm_ll_data->reset_system) {
+               WARN_ONCE(1, "prm: %s: no mapping function defined\n",
+                         __func__);
+               return;
+       }
+
+       prm_ll_data->reset_system();
+
+       while (1)
+               cpu_relax();
+}
+
 /**
  * prm_register - register per-SoC low-level data with the PRM
  * @pld: low-level per-SoC OMAP PRM data & function pointers to register