Rajendra Nayak <[email protected]> writes:

> 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]>

Applying to PM brach after the clarifications.

Thanks,

Kevin

> ---
>  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
--
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