87 lines
2.0 KiB
C
87 lines
2.0 KiB
C
|
/*
|
||
|
* Copyright (C) 2014-2015 Freescale Semiconductor, Inc.
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License version 2 as
|
||
|
* published by the Free Software Foundation.
|
||
|
*/
|
||
|
|
||
|
#ifndef __LINUX_IMX_SEMA4_H__
|
||
|
#define __LINUX_IMX_SEMA4_H__
|
||
|
|
||
|
#define SEMA4_NUM_DEVICES 1
|
||
|
#define SEMA4_NUM_GATES 16
|
||
|
|
||
|
#define SEMA4_UNLOCK 0x00
|
||
|
#define SEMA4_A9_LOCK 0x01
|
||
|
#define SEMA4_GATE_MASK 0x03
|
||
|
|
||
|
#define CORE_MUTEX_VALID (('c'<<24)|('m'<<24)|('t'<<24)|'x')
|
||
|
|
||
|
/*
|
||
|
* The enumerates
|
||
|
*/
|
||
|
enum {
|
||
|
/* sema4 registers offset */
|
||
|
SEMA4_CP0INE = 0x40,
|
||
|
SEMA4_CP1INE = 0x48,
|
||
|
SEMA4_CP0NTF = 0x80,
|
||
|
SEMA4_CP1NTF = 0x88,
|
||
|
};
|
||
|
|
||
|
static const unsigned int idx_sema4[16] = {
|
||
|
1 << 7, 1 << 6, 1 << 5, 1 << 4,
|
||
|
1 << 3, 1 << 2, 1 << 1, 1 << 0,
|
||
|
1 << 15, 1 << 14, 1 << 13, 1 << 12,
|
||
|
1 << 11, 1 << 10, 1 << 9, 1 << 8,
|
||
|
};
|
||
|
|
||
|
struct imx_sema4_mutex {
|
||
|
unsigned int valid;
|
||
|
unsigned int gate_num;
|
||
|
unsigned char gate_val;
|
||
|
wait_queue_head_t wait_q;
|
||
|
};
|
||
|
|
||
|
struct imx_sema4_mutex_device {
|
||
|
struct device *dev;
|
||
|
unsigned short cpntf_val;
|
||
|
unsigned short cpine_val;
|
||
|
void __iomem *ioaddr; /* Mapped address */
|
||
|
spinlock_t lock; /* Mutex */
|
||
|
int irq;
|
||
|
struct clk *clk;
|
||
|
|
||
|
unsigned short alloced;
|
||
|
struct imx_sema4_mutex *mutex_ptr[16];
|
||
|
};
|
||
|
|
||
|
extern struct imx_sema4_mutex *mcc_shm_ptr;
|
||
|
|
||
|
struct imx_sema4_mutex *
|
||
|
imx_sema4_mutex_create(u32 dev_num, u32 mutex_num);
|
||
|
#ifdef CONFIG_IMX_SEMA4
|
||
|
int imx_sema4_mutex_destroy(struct imx_sema4_mutex *mutex_ptr);
|
||
|
int imx_sema4_mutex_trylock(struct imx_sema4_mutex *mutex_ptr);
|
||
|
int imx_sema4_mutex_lock(struct imx_sema4_mutex *mutex_ptr);
|
||
|
int imx_sema4_mutex_unlock(struct imx_sema4_mutex *mutex_ptr);
|
||
|
#else
|
||
|
static inline int imx_sema4_mutex_destroy(struct imx_sema4_mutex *mutex_ptr)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
static inline int imx_sema4_mutex_trylock(struct imx_sema4_mutex *mutex_ptr)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
static inline int imx_sema4_mutex_lock(struct imx_sema4_mutex *mutex_ptr)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
static inline int imx_sema4_mutex_unlock(struct imx_sema4_mutex *mutex_ptr)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
#endif
|
||
|
#endif /* __LINUX_IMX_SEMA4_H__ */
|