/**************************************************************************** * * Copyright (c) 2014 - 2016 Samsung Electronics Co., Ltd. All rights reserved * ****************************************************************************/ #ifndef __SCSC_PETERSON_H #define __SCSC_PETERSON_H #include #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