51 lines
1.1 KiB
C
51 lines
1.1 KiB
C
|
/****************************************************************************
|
||
|
*
|
||
|
* Copyright (c) 2014 - 2016 Samsung Electronics Co., Ltd. All rights reserved
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
#ifndef __SCSC_PETERSON_H
|
||
|
#define __SCSC_PETERSON_H
|
||
|
|
||
|
#include <linux/delay.h>
|
||
|
#include "mif_reg.h"
|
||
|
|
||
|
#define R4_PROCESS 0
|
||
|
#define AP_PROCESS 1
|
||
|
#define DELAY_NS 100 /* delay in ns*/
|
||
|
|
||
|
static inline void peterson_mutex_init(struct peterson_mutex *p_mutex)
|
||
|
{
|
||
|
if (!p_mutex) {
|
||
|
pr_info("Mutex not declared\n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
p_mutex->flag[0] = false;
|
||
|
p_mutex->flag[1] = false;
|
||
|
p_mutex->turn = 0;
|
||
|
}
|
||
|
|
||
|
static inline void peterson_mutex_lock(struct peterson_mutex *p_mutex, unsigned int process)
|
||
|
{
|
||
|
unsigned int other = 1 - process;
|
||
|
|
||
|
p_mutex->flag[process] = true;
|
||
|
/* write barrier */
|
||
|
smp_wmb();
|
||
|
p_mutex->turn = other;
|
||
|
/* write barrier */
|
||
|
smp_wmb();
|
||
|
|
||
|
while ((p_mutex->flag[other]) && (p_mutex->turn == other))
|
||
|
ndelay(DELAY_NS);
|
||
|
}
|
||
|
|
||
|
static inline void peterson_mutex_unlock(struct peterson_mutex *p_mutex, unsigned int process)
|
||
|
{
|
||
|
p_mutex->flag[process] = false;
|
||
|
/* write barrier */
|
||
|
smp_wmb();
|
||
|
}
|
||
|
#endif
|