#ifndef SUNXI_HAL_COMMON_H #define SUNXI_HAL_COMMON_H #ifdef __cplusplus extern "C" { #endif #include #include #include #include #ifdef CONFIG_DEBUG_BACKTRACE #include #endif #include #ifndef min #define min(a, b) ((a) < (b) ? (a) : (b)) #endif #ifndef max #define max(a,b) ((a) < (b) ? (b) : (a)) #endif #ifndef MIN #define MIN(a, b) ((a) < (b) ? (a) : (b)) #endif #ifndef MAX #define MAX(a,b) ((a) < (b) ? (b) : (a)) #endif #ifndef ARRAY_SIZE #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #endif #define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1) #define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask)) #ifndef ALIGN_UP #define ALIGN_UP(x, a) __ALIGN_KERNEL((x), (a)) #endif #ifndef ALIGN_DOWN #define ALIGN_DOWN(x, a) __ALIGN_KERNEL((x) - ((a) - 1), (a)) #endif #ifndef BIT #define BIT(x) (1 << x) #endif #define get_bvalue(addr) (*((volatile unsigned char *)(addr))) #define put_bvalue(addr, v) (*((volatile unsigned char *)(addr)) = (unsigned char)(v)) #define get_hvalue(addr) (*((volatile unsigned short *)(addr))) #define put_hvalue(addr, v) (*((volatile unsigned short *)(addr)) = (unsigned short)(v)) #define get_wvalue(addr) (*((volatile unsigned int *)(addr))) #define put_wvalue(addr, v) (*((volatile unsigned int *)(addr)) = (unsigned int)(v)) #define set_bit(addr, v) (*((volatile unsigned char *)(addr)) |= (unsigned char)(v)) #define clr_bit(addr, v) (*((volatile unsigned char *)(addr)) &= ~(unsigned char)(v)) #define set_bbit(addr, v) (*((volatile unsigned char *)(addr)) |= (unsigned char)(v)) #define clr_bbit(addr, v) (*((volatile unsigned char *)(addr)) &= ~(unsigned char)(v)) #define set_hbit(addr, v) (*((volatile unsigned short *)(addr)) |= (unsigned short)(v)) #define clr_hbit(addr, v) (*((volatile unsigned short *)(addr)) &= ~(unsigned short)(v)) #define set_wbit(addr, v) (*((volatile unsigned int *)(addr)) |= (unsigned int)(v)) #define clr_wbit(addr, v) (*((volatile unsigned int *)(addr)) &= ~(unsigned int)(v)) #ifndef readb #define readb(addr) (*((volatile unsigned char *)(addr))) #endif #ifndef readw #define readw(addr) (*((volatile unsigned short *)(addr))) #endif #ifndef readl #define readl(addr) (*((volatile unsigned int *)(unsigned long)(addr))) #endif #ifndef writeb #define writeb(v, addr) (*((volatile unsigned char *)(addr)) = (unsigned char)(v)) #endif #ifndef writew #define writew(v, addr) (*((volatile unsigned short *)(addr)) = (unsigned short)(v)) #endif #ifndef writel #define writel(v, addr) (*((volatile unsigned int *)(unsigned long)(addr)) = (unsigned int)(v)) #endif #define cmp_wvalue(addr, v) (v == (*((volatile unsigned int *) (addr)))) /* common register access operation. */ #define hal_readb(reg) (*(volatile uint8_t *)(long)(reg)) #define hal_readw(reg) (*(volatile uint16_t *)(reg)) #define hal_readl(reg) (*(volatile uint32_t *)(reg)) #define hal_writeb(value,reg) (*(volatile uint8_t *)(long)(reg) = (value)) #define hal_writew(value,reg) (*(volatile uint16_t *)(reg) = (value)) #define hal_writel(value,reg) (*(volatile uint32_t *)(reg) = (value)) #define OK (0) #define FAIL (-1) #define TRUE (1) #define FALSE (0) #define true 1 #define false 0 #ifndef NULL #define NULL 0 #endif #define CACHELINE_LEN (64) typedef uint64_t u64; typedef uint32_t u32; typedef uint16_t u16; typedef uint8_t u8; typedef int64_t s64; typedef int32_t s32; typedef int16_t s16; typedef int8_t s8; #define HAL_ARG_UNUSED(NAME) (void)(NAME) /* general function pointer defines */ typedef s32 (*__pCBK_t) (void *p_arg); /* call-back */ typedef s32 (*__pISR_hdle_t) (void *p_arg); /* ISR */ typedef s32(*__pNotifier_t) (u32 message, u32 aux); /* notifer call-back */ typedef s32(*__pCPUExceptionHandler) (void); /* cpu exception handler pointer */ #define BUG() do { \ printf("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ backtrace(NULL, NULL, 0, 0, printf); \ while(1); \ } while (0) #ifndef BUG_ON #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0) #define WARN_ON(condition) ({ \ int __ret_warn_on = !!(condition); \ unlikely(__ret_warn_on); \ }) #endif #ifndef WARN #define WARN(condition, format...) ({ \ int __ret_warn_on = !!(condition); \ if(__ret_warn_on) \ printf(format); \ unlikely(__ret_warn_on); \ }) #endif #ifdef CONFIG_DEBUG_BACKTRACE #define hal_assert(ex) \ if (!(ex)) { \ printf("%s line %d, fatal error.\n", __func__, __LINE__); \ backtrace(NULL, NULL, 0, 0, printf); \ while(1); \ } #else #define hal_assert(ex) \ if (!(ex)) { \ printf("%s line %d, fatal error.\n", __func__, __LINE__); \ while(1); \ } #endif // version combine. #define SUNXI_HAL_VERSION_MAJOR_MINOR(major, minor) (((major) << 8) | (minor)) typedef struct sunxi_hal_version { // API version NO. uint16_t api; // Driver version NO. uint16_t drv; } sunxi_hal_version_t; // General return code of hal driver. #define SUNXI_HAL_OK 0UL // Unspecified error. #define SUNXI_HAL_ERROR -1UL // Hal is busy. #define SUNXI_HAL_ERROR_BUSY -2UL // Timout occured. #define SUNXI_HAL_ERROR_TIMEOUT -3UL // Operaion not supported. #define SUNXI_HAL_ERROR_UNSUPOT -4UL // Parameter error. #define SUNXI_HAL_ERROR_PARAERR -5UL // Start of driver specific errors. #define SUNXI_HAL_ERROR_DRVSPECIFIC -6UL typedef enum sunxi_hal_power_state { ///< Power off: no operation possible SUSNXI_HAL_POWER_OFF, ///< Low Power mode: retain state, detect and signal wake-up events SUSNXI_HAL_POWER_LOW, ///< Power on: full operation at maximum performance SUSNXI_HAL_POWER_FULL } sunxi_hal_power_state_e; typedef int32_t (*poll_wakeup_func)(int32_t dev_id, short key); typedef struct _sunxi_hal_poll_ops { int32_t (* check_poll_state) (int32_t dev, short key); int32_t (* hal_poll_wakeup) (int32_t dev, short key); int32_t (* register_poll_wakeup) (poll_wakeup_func poll_wakeup); } sunxi_hal_poll_ops; /* bitops */ extern int fls(int x); void dma_free_coherent(void *addr); void *dma_alloc_coherent(size_t size); #ifdef CONFIG_COMPONENTS_AMP void *amp_align_malloc(int size); void amp_align_free(void *ptr); #endif #ifdef __cplusplus } #endif #endif /*SUNXI_HAL_COMMON_H*/