This patch implements locking using the semaphore in scratchpad
memory preventing any concurrent access to scratchpad from OMAP
and Baseband/Modem processor.

Signed-off-by: Rajendra Nayak <[email protected]>
---
 arch/arm/mach-omap2/resource34xx.c |    6 +++++-
 arch/arm/mach-omap2/resource34xx.h |    2 ++
 arch/arm/mach-omap2/sleep34xx.S    |   32 ++++++++++++++++++++++++++++++++
 3 files changed, 39 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-omap2/resource34xx.c 
b/arch/arm/mach-omap2/resource34xx.c
index 82405b6..408d3ab 100644
--- a/arch/arm/mach-omap2/resource34xx.c
+++ b/arch/arm/mach-omap2/resource34xx.c
@@ -236,6 +236,7 @@ static int program_opp_freq(int res, int target_level, int 
current_level)
        int ret = 0, l3_div;
        int *curr_opp;
 
+       lock_scratchpad_sem();
        if (res == VDD1_OPP) {
                curr_opp = &curr_vdd1_opp;
                clk_set_rate(dpll1_clk, mpu_opps[target_level].rate);
@@ -253,11 +254,14 @@ static int program_opp_freq(int res, int target_level, 
int current_level)
                ret = clk_set_rate(dpll3_clk,
                                l3_opps[target_level].rate * l3_div);
        }
-       if (ret)
+       if (ret) {
+               unlock_scratchpad_sem();
                return current_level;
+       }
 #ifdef CONFIG_PM
        omap3_save_scratchpad_contents();
 #endif
+       unlock_scratchpad_sem();
 
        *curr_opp = target_level;
        return target_level;
diff --git a/arch/arm/mach-omap2/resource34xx.h 
b/arch/arm/mach-omap2/resource34xx.h
index a160665..5b5618a 100644
--- a/arch/arm/mach-omap2/resource34xx.h
+++ b/arch/arm/mach-omap2/resource34xx.h
@@ -29,6 +29,8 @@
 #include <mach/omap34xx.h>
 
 extern int sr_voltagescale_vcbypass(u32 t_opp, u32 c_opp, u8 t_vsel, u8 
c_vsel);
+extern void lock_scratchpad_sem();
+extern void unlock_scratchpad_sem();
 
 /*
  * mpu_latency/core_latency are used to control the cpuidle C state.
diff --git a/arch/arm/mach-omap2/sleep34xx.S b/arch/arm/mach-omap2/sleep34xx.S
index 38aa3fd..aedcf94 100644
--- a/arch/arm/mach-omap2/sleep34xx.S
+++ b/arch/arm/mach-omap2/sleep34xx.S
@@ -39,6 +39,7 @@
 #define PM_PREPWSTST_MPU_V     OMAP34XX_PRM_REGADDR(MPU_MOD, \
                                OMAP3430_PM_PREPWSTST)
 #define CM_IDLEST1_CORE_V      OMAP34XX_CM_REGADDR(CORE_MOD, CM_IDLEST1)
+#define SDRC_SCRATCHPAD_SEM_V  0xd800291C
 
 /*
  * This is the physical address of the register as specified
@@ -62,6 +63,37 @@
 #define SDRC_DLLA_STATUS_V     OMAP34XX_SDRC_REGADDR(SDRC_DLLA_STATUS)
 #define SDRC_DLLA_CTRL_V       OMAP34XX_SDRC_REGADDR(SDRC_DLLA_CTRL)
 
+        .text
+/* Function to aquire the semaphore in scratchpad */
+ENTRY(lock_scratchpad_sem)
+       stmfd   sp!, {lr}       @ save registers on stack
+wait_sem:
+       mov     r0,#1
+       ldr     r1, sdrc_scratchpad_sem
+wait_loop:
+       ldr     r2, [r1]        @ load the lock value
+       cmp     r2, r0          @ is the lock free ?
+       beq     wait_loop       @ not free...
+       swp     r2, r0, [r1]    @ semaphore free so lock it and proceed
+       cmp     r2, r0          @ did we succeed ?
+       beq     wait_sem        @ no - try again
+       ldmfd   sp!, {pc}       @ restore regs and return
+sdrc_scratchpad_sem:
+        .word SDRC_SCRATCHPAD_SEM_V
+ENTRY(lock_scratchpad_sem_sz)
+        .word   . - lock_scratchpad_sem
+
+        .text
+/* Function to release the scratchpad semaphore */
+ENTRY(unlock_scratchpad_sem)
+       stmfd   sp!, {lr}       @ save registers on stack
+       ldr     r3, sdrc_scratchpad_sem
+       mov     r2,#0
+       str     r2,[r3]
+       ldmfd   sp!, {pc}       @ restore regs and return
+ENTRY(unlock_scratchpad_sem_sz)
+        .word   . - unlock_scratchpad_sem
+
        .text
 /* Function call to get the restore pointer for resume from OFF */
 ENTRY(get_restore_pointer)
-- 
1.5.4.7

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to