summaryrefslogtreecommitdiff
path: root/arch/arm
diff options
context:
space:
mode:
authorKyungmin Park <kyungmin.park@samsung.com>2014-07-10 13:41:00 +0900
committerChanho Park <chanho61.park@samsung.com>2014-11-18 12:00:12 +0900
commitc113707c002a995f7392cb3f7730746d7191385e (patch)
tree092b7d801ce70a93f66a4b8da0b35ff714c7b805 /arch/arm
parent923bbdb8b2636969a6ba6ceb29e54251ff40aeed (diff)
downloadlinux-3.10-c113707c002a995f7392cb3f7730746d7191385e.tar.gz
linux-3.10-c113707c002a995f7392cb3f7730746d7191385e.tar.bz2
linux-3.10-c113707c002a995f7392cb3f7730746d7191385e.zip
ARM: EXYNOS: add read/write SFR by smc call
This patch add SMC helper functions to access special SFRs. Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/include/asm/firmware.h5
-rw-r--r--arch/arm/mach-exynos/firmware.c14
2 files changed, 19 insertions, 0 deletions
diff --git a/arch/arm/include/asm/firmware.h b/arch/arm/include/asm/firmware.h
index 4e2879f6053..060c80d068a 100644
--- a/arch/arm/include/asm/firmware.h
+++ b/arch/arm/include/asm/firmware.h
@@ -50,6 +50,11 @@ struct firmware_ops {
*/
int (*resume)(void);
/*
+ * Read/write SFRs
+ */
+ int (*readsfr)(unsigned int addr, unsigned int *value);
+ int (*writesfr)(unsigned int addr, unsigned int value);
+ /*
* Restores coprocessor 15 registers
*/
int (*c15resume)(u32 *regs);
diff --git a/arch/arm/mach-exynos/firmware.c b/arch/arm/mach-exynos/firmware.c
index b93c42eb309..2cdec14e148 100644
--- a/arch/arm/mach-exynos/firmware.c
+++ b/arch/arm/mach-exynos/firmware.c
@@ -119,6 +119,18 @@ static int exynos_c15resume(u32 *regs)
return 0;
}
+static int exynos_readsfr(unsigned int addr, unsigned int *value)
+{
+ *value = exynos_smc2(SMC_CMD_REG, SMC_REG_SFR_R(addr), 0, 0);
+ return 0;
+}
+
+static int exynos_writesfr(unsigned int addr, unsigned int value)
+{
+ exynos_smc(SMC_CMD_REG, SMC_REG_SFR_W(addr), value, 0);
+ return 0;
+}
+
static const struct firmware_ops exynos_firmware_ops = {
.do_idle = exynos_do_idle,
.set_cpu_boot_addr = exynos_set_cpu_boot_addr,
@@ -129,6 +141,8 @@ static const struct firmware_ops exynos_firmware_ops = {
#endif
.suspend = exynos_suspend,
.resume = exynos_resume,
+ .readsfr = exynos_readsfr,
+ .writesfr = exynos_writesfr,
.c15resume = exynos_c15resume,
};