45 lines
1.1 KiB
C
45 lines
1.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
|
|
#ifndef __DRV_SPINLOCK_H__
|
|
#define __DRV_SPINLOCK_H__
|
|
|
|
enum SPINLOCK_FIELD {
|
|
SPIN_UART,
|
|
SPIN_LINUX_RTOS = 4, // this spinlock field is used for linux & rtos
|
|
SPIN_MBOX = SPIN_LINUX_RTOS,
|
|
SPIN_MAX = 7,
|
|
};
|
|
|
|
typedef struct hw_raw_spinlock {
|
|
unsigned short locks;
|
|
unsigned short hw_field;
|
|
} hw_raw_spinlock_t;
|
|
|
|
#define MAILBOX_LOCK_SUCCESS 1
|
|
#define MAILBOX_LOCK_FAILED (-1)
|
|
|
|
#define __CVI_ARCH_SPIN_LOCK_UNLOCKED { 0 }
|
|
|
|
#define __CVI_RAW_SPIN_LOCK_INITIALIZER(spinlock_hw_field) \
|
|
{ \
|
|
.locks = __CVI_ARCH_SPIN_LOCK_UNLOCKED, \
|
|
.hw_field = spinlock_hw_field, \
|
|
}
|
|
|
|
#define DEFINE_CVI_SPINLOCK(x, y) hw_raw_spinlock_t x = __CVI_RAW_SPIN_LOCK_INITIALIZER(y)
|
|
|
|
int _hw_raw_spin_lock_irqsave(hw_raw_spinlock_t *lock);
|
|
void _hw_raw_spin_unlock_irqrestore(hw_raw_spinlock_t *lock, int flag);
|
|
|
|
#define drv_spin_lock_irqsave(lock, flags) \
|
|
{ flags = _hw_raw_spin_lock_irqsave(lock); }
|
|
|
|
#define drv_spin_unlock_irqrestore(lock, flags) \
|
|
_hw_raw_spin_unlock_irqrestore(lock, flags)
|
|
|
|
void spinlock_base(unsigned long mb_base);
|
|
void cvi_spinlock_init(void);
|
|
|
|
#endif // end of __DRV_SPINLOCK_H__
|
|
|