blob: e4bf4c9dcbfe9250f419b84d6fe3c39fa94641ae [file] [log] [blame]
Xiaohu.Huang83a0b702021-12-28 11:06:24 +08001/*
yang.li5bef2f62022-01-11 14:08:06 +08002 * Copyright (c) 2021-2022 Amlogic, Inc. All rights reserved.
Xiaohu.Huang83a0b702021-12-28 11:06:24 +08003 *
yang.li5bef2f62022-01-11 14:08:06 +08004 * SPDX-License-Identifier: MIT
Xiaohu.Huang83a0b702021-12-28 11:06:24 +08005 */
6
Xiaohu.Huang83a0b702021-12-28 11:06:24 +08007#ifndef __COMMON_H
8#define __COMMON_H
9
10#ifdef __cplusplus
11extern "C" {
12#endif
13#include <stdint.h>
14#include <errno.h>
15
16
17/* Macros to access registers */
18#define REG32_ADDR(addr) ((volatile uint32_t *)(uintptr_t)(addr))
19#define REG16_ADDR(addr) ((volatile uint16_t *)(uintptr_t)(addr))
20#define REG8_ADDR(addr) ((volatile uint8_t *)(uintptr_t)(addr))
21
22#define REG32(addr) (*REG32_ADDR(addr))
23#define REG16(addr) (*REG16_ADDR(addr))
24#define REG8(addr) (*REG8_ADDR(addr))
25
26#define BIT(nr) (1UL << (nr))
27#define REG32_UPDATE_BITS(addr, mask, val) \
28do { \
29 uint32_t _v = REG32((unsigned long)addr); \
30 _v &= (~(mask)); \
31 _v |= ((val) & (mask)); \
32 REG32((unsigned long)addr) = _v; \
33} while(0)
34
35#ifndef FIELD_PREP
36#define FIELD_PREP(_mask, _val) \
37 (((typeof(_mask))(_val) << (ffs(_mask) - 1)) & (_mask))
38#endif
39
40#ifndef FIELD_GET
41#define FIELD_GET(_mask, _reg) \
42 ((typeof(_mask))(((_reg) & (_mask)) >> (ffs(_mask) - 1)))
43#endif
44
45#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
46
47#define BITS_PER_LONG (sizeof(unsigned long) == 8 ? 64 : 32)
48#define GENMASK(h, l) \
49 (((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h))))
50#define IS_ALIGNED(x, a) (((unsigned long)(x) & ((unsigned long)(a) - 1)) == 0)
51#define _RET_IP_ (unsigned long)__builtin_return_address(0)
52#define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })
53#define __round_mask(x, y) ((__typeof__(x))((y)-1))
54#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
55#define round_down(x, y) ((x) & ~__round_mask(x, y))
56
57typedef uint64_t u64;
58typedef uint32_t u32;
59typedef uint16_t u16;
60typedef uint8_t u8;
61typedef int64_t s64;
62typedef int32_t s32;
63typedef int16_t s16;
64typedef int8_t s8;
65
66#ifndef BIT
67#define BIT(x) (1 << (x))
68#endif
69
70#ifdef __cplusplus
71}
72#endif
73#endif