ARM: EXYNOS: add code for setting/clearing boot flag
authorBartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Thu, 26 Mar 2015 17:32:56 +0000 (02:32 +0900)
committerKukjin Kim <kgene@kernel.org>
Thu, 26 Mar 2015 17:32:56 +0000 (02:32 +0900)
This code is needed for cpuidle (W-)AFTR mode support on Exynos3250.

Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Acked-by: Kyungmin Park <kyungmin.park@samsung.com>
Tested-by: Chanwoo Choi <cw00.choi@samsung.com>
Signed-off-by: Kukjin Kim <kgene@kernel.org>
arch/arm/mach-exynos/common.h
arch/arm/mach-exynos/firmware.c

index f70eca7ee705fd26490d3ce7bbdc1988cbdf8752..acd5b560b72801c6e2e4b51baa5ca4c129f44b2d 100644 (file)
@@ -126,6 +126,12 @@ enum {
 
 void exynos_firmware_init(void);
 
+/* CPU BOOT mode flag for Exynos3250 SoC bootloader */
+#define C2_STATE       (1 << 3)
+
+void exynos_set_boot_flag(unsigned int cpu, unsigned int mode);
+void exynos_clear_boot_flag(unsigned int cpu, unsigned int mode);
+
 extern u32 exynos_get_eint_wake_mask(void);
 
 #ifdef CONFIG_PM_SLEEP
index 4791a3cc00f9d40e71c474d6130c02697ebcd090..27b8ae3e1f894ce1dfff52f81c70e310e5035611 100644 (file)
@@ -206,3 +206,28 @@ void __init exynos_firmware_init(void)
                outer_cache.configure = exynos_l2_configure;
        }
 }
+
+#define REG_CPU_STATE_ADDR     (sysram_ns_base_addr + 0x28)
+#define BOOT_MODE_MASK         0x1f
+
+void exynos_set_boot_flag(unsigned int cpu, unsigned int mode)
+{
+       unsigned int tmp;
+
+       tmp = __raw_readl(REG_CPU_STATE_ADDR + cpu * 4);
+
+       if (mode & BOOT_MODE_MASK)
+               tmp &= ~BOOT_MODE_MASK;
+
+       tmp |= mode;
+       __raw_writel(tmp, REG_CPU_STATE_ADDR + cpu * 4);
+}
+
+void exynos_clear_boot_flag(unsigned int cpu, unsigned int mode)
+{
+       unsigned int tmp;
+
+       tmp = __raw_readl(REG_CPU_STATE_ADDR + cpu * 4);
+       tmp &= ~mode;
+       __raw_writel(tmp, REG_CPU_STATE_ADDR + cpu * 4);
+}