OMAP3: PM: add scratchpad locking function
authorRajendra Nayak <rnayak@ti.com>
Thu, 28 May 2009 12:43:06 +0000 (18:13 +0530)
committerKevin Hilman <khilman@deeprootsystems.com>
Tue, 23 Feb 2010 19:05:05 +0000 (11:05 -0800)
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 <rnayak@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
arch/arm/mach-omap2/sleep34xx.S

index 22fcc14e63be34f65d28c8b7f0c63f916c32da3a..12a8ba0e0a3cbb671c7112ff703a3c17c775de43 100644 (file)
@@ -33,6 +33,8 @@
 #include "prm.h"
 #include "sdrc.h"
 
+#define SDRC_SCRATCHPAD_SEM_V  0xfa00291c
+
 #define PM_PREPWSTST_CORE_V    OMAP34XX_PRM_REGADDR(CORE_MOD, \
                                OMAP3430_PM_PREPWSTST)
 #define PM_PREPWSTST_CORE_P    0x48306AE8
 #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)