Files
luban-lite-t3e-pro/bsp/common/include/aic_io.h

140 lines
3.7 KiB
C
Raw Normal View History

2023-08-30 16:21:18 +08:00
/*
* Copyright (c) 2022, Artinchip Technology Co., Ltd
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef __AIC_IO_H__
#define __AIC_IO_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "aic_common.h"
#ifndef BIT
#define BIT(s) (1U << (s))
#define BIT_UL(s) (1UL << (s))
#endif
#define GENMASK(h, l) (((~(0U)) - ((1U) << (l)) + 1) & \
(~(0U) >> (BITS_PER_LONG - 1 - (h))))
#define GENMASK_UL(h, l) (((~(0UL)) - ((1UL) << (l)) + 1) & \
(~(0UL) >> (BITS_PER_LONG - 1 - (h))))
static inline void __raw_writeb(u8 val, volatile void *addr)
{
asm volatile("sb %0, 0(%1)" : : "r" (val), "r" (addr));
}
static inline u8 __raw_readb(const volatile void *addr)
{
u8 val;
asm volatile("lb %0, 0(%1)" : "=r" (val) : "r" (addr));
return val;
}
static inline void __raw_writel(u32 val, volatile void *addr)
{
asm volatile("sw %0, 0(%1)" : : "r"(val), "r"(addr));
}
static inline u32 __raw_readl(const volatile void *addr)
{
u32 val;
asm volatile("lw %0, 0(%1)" : "=r"(val) : "r"(addr));
return val;
}
#define mmiowb_set_pending() \
do { \
} while (0)
#define cpu_to_le32(val) (val)
#define le32_to_cpu(val) (val)
#define readb_cpu(c) ({ u8 __r = __raw_readb(c); __r; })
#define readl_cpu(c) ({ u32 __r = le32_to_cpu(__raw_readl(c)); __r; })
#define writeb_cpu(v, c) ((void)__raw_writeb((v), (c)))
#define writel_cpu(v, c) ((void)__raw_writel((u32)cpu_to_le32(v), (c)))
#define __io_br() do { } while (0)
#define __io_ar(v) __asm__ __volatile__("fence i,r" : : : "memory");
#define __io_bw() __asm__ __volatile__("fence w,o" : : : "memory");
#define __io_aw() mmiowb_set_pending()
#define readb(c) \
({ \
u8 __v; \
__io_br(); \
__v = readb_cpu((volatile void *)c); \
__io_ar(__v); __v; \
})
#define readl(c) \
({ \
u32 __v; \
__io_br(); \
__v = readl_cpu((volatile void *)c); \
__io_ar(__v); \
__v; \
})
#define writeb(v, c) \
({ \
__io_bw(); \
writeb_cpu((v), (volatile void *)(c)); \
__io_aw(); \
})
#define writel(v, c) \
({ \
__io_bw(); \
writel_cpu((v), ((volatile void *)c)); \
__io_aw(); \
})
/* Some common bit operation of a (long type) register */
#define writel_clrbits(mask, addr) writel(readl(addr) & ~(mask), addr)
#define writel_clrbit(bit, addr) writel_clrbits(bit, addr)
#define writel_bits(val, mask, shift, addr) \
({ \
if (val) \
writel((readl(addr) & ~(mask)) | ((val) << (shift)), addr); \
else \
writel_clrbits(mask, addr); \
})
#define writel_bit(bit, addr) writel(readl(addr) | bit, addr)
#define readl_bits(mask, shift, addr) ((readl(addr) & (mask)) >> (shift))
#define readl_bit(bit, addr) ((readl(addr) & bit) ? 1 : 0)
/* Some common bit operation of a variable */
#define clrbits(mask, cur) (cur &= ~(mask))
#define clrbit(bit, cur) clrbits(bit, cur)
#define setbits(val, mask, shift, cur) \
({ \
if (val) \
(cur = (cur & ~(mask)) | ((val) << (shift))); \
else \
clrbits(mask, cur); \
})
#define setbit(bit, cur) (cur |= bit)
#define getbits(mask, shift, cur) ((cur & (mask)) >> (shift))
#define getbit(bit, cur) (cur & bit ? 1 : 0)
#define bitrev8(x) \
({ \
u8 ___x = x; \
___x = (___x >> 4) | (___x << 4); \
___x = ((___x & (u8)0xCCU) >> 2) | ((___x & (u8)0x33U) << 2); \
___x = ((___x & (u8)0xAAU) >> 1) | ((___x & (u8)0x55U) << 1); \
___x; \
})
#ifdef __cplusplus
}
#endif
#endif /* __AIC_IO_H__ */