xref: /OK3568_Linux_fs/kernel/arch/arm/mach-rockchip/rkpm_helpers.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
2 /*
3  * Copyright (c) 2023 Rockchip Electronics Co., Ltd.
4  */
5 
6 #ifndef RKPM_HELPERS_H
7 #define RKPM_HELPERS_H
8 
9 #define REG_MSK_SHIFT	16
10 
11 #ifndef BIT
12 #define BIT(nr)			(1U << (nr))
13 #endif
14 
15 #ifndef WMSK_BIT
16 #define WMSK_BIT(nr)		BIT((nr) + REG_MSK_SHIFT)
17 #endif
18 
19 /* set one bit with write mask */
20 #ifndef BIT_WITH_WMSK
21 #define BIT_WITH_WMSK(nr)	(BIT(nr) | WMSK_BIT(nr))
22 #endif
23 
24 #ifndef BITS_SHIFT
25 #define BITS_SHIFT(bits, shift) ((bits) << (shift))
26 #endif
27 
28 #ifndef BITS_WMSK
29 #define BITS_WMSK(msk, shift) \
30 		((msk) << ((shift) + REG_MSK_SHIFT))
31 #endif
32 
33 #ifndef BITS_WITH_WMASK
34 #define BITS_WITH_WMASK(bits, msk, shift) \
35 	(BITS_SHIFT(bits, shift) | BITS_SHIFT(msk, ((shift) + REG_MSK_SHIFT)))
36 #endif
37 
38 #ifndef BIT_SET_WMSK
39 #define BIT_SET_WMSK(nr)		BIT_WITH_WMSK(nr)
40 #endif
41 
42 #ifndef BIT_CLR_WMSK
43 #define BIT_CLR_WMSK(nr)		WMSK_BIT(nr)
44 #endif
45 
46 #ifndef WITH_16BITS_WMSK
47 #define WITH_16BITS_WMSK(bits)		(0xffff0000 | (bits))
48 #endif
49 
50 #define REG_REGION(_start, _end, _stride, _base, _wmsk) \
51 	.start = (_start),				\
52 	.end = (_end),					\
53 	.stride = (_stride),				\
54 	.wmsk = (_wmsk),				\
55 	.base = (_base),
56 
57 struct reg_region {
58 	void __iomem **base;
59 	u32 start;
60 	u32 end;
61 	u32 stride;
62 	u32 wmsk;
63 	u32 *buf;
64 };
65 
66 void rkpm_alloc_region_mem(struct reg_region *rgns, u32 rgn_num);
67 void rkpm_region_mem_init(u32 size);
68 void rkpm_reg_rgn_save(struct reg_region *rgns, u32 rgn_num);
69 void rkpm_reg_rgn_restore(struct reg_region *rgns, u32 rgn_num);
70 void rkpm_reg_rgn_restore_reverse(struct reg_region *rgns, u32 rgn_num);
71 void rkpm_dump_reg_rgns(struct reg_region *rgns, u32 rgn_num);
72 
73 void rkpm_printch(int c);
74 void rkpm_printstr(const char *s);
75 void rkpm_printhex(u32 hex);
76 void rkpm_printdec(int dec);
77 void rkpm_regs_dump(void __iomem *base,
78 		    u32 start_offset,
79 		    u32 end_offset,
80 		    u32 stride);
81 
82 void rkpm_raw_udelay(int us);
83 #endif
84