1
2
3
4
5
6#include <linux/export.h>
7#include <linux/jiffies.h>
8#include <linux/regmap.h>
9#include <linux/soc/mediatek/infracfg.h>
10#include <asm/processor.h>
11
12#define MTK_POLL_DELAY_US 10
13#define MTK_POLL_TIMEOUT (jiffies_to_usecs(HZ))
14
15
16
17
18
19
20
21
22
23
24
25
26
27int mtk_infracfg_set_bus_protection(struct regmap *infracfg, u32 mask,
28 bool reg_update)
29{
30 u32 val;
31 int ret;
32
33 if (reg_update)
34 regmap_update_bits(infracfg, INFRA_TOPAXI_PROTECTEN, mask,
35 mask);
36 else
37 regmap_write(infracfg, INFRA_TOPAXI_PROTECTEN_SET, mask);
38
39 ret = regmap_read_poll_timeout(infracfg, INFRA_TOPAXI_PROTECTSTA1,
40 val, (val & mask) == mask,
41 MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
42
43 return ret;
44}
45
46
47
48
49
50
51
52
53
54
55
56
57
58int mtk_infracfg_clear_bus_protection(struct regmap *infracfg, u32 mask,
59 bool reg_update)
60{
61 int ret;
62 u32 val;
63
64 if (reg_update)
65 regmap_update_bits(infracfg, INFRA_TOPAXI_PROTECTEN, mask, 0);
66 else
67 regmap_write(infracfg, INFRA_TOPAXI_PROTECTEN_CLR, mask);
68
69 ret = regmap_read_poll_timeout(infracfg, INFRA_TOPAXI_PROTECTSTA1,
70 val, !(val & mask),
71 MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
72
73 return ret;
74}
75