1
2
3
4
5
6
7
8
9
10
11
12
13
14#include <linux/kernel.h>
15#include <linux/errno.h>
16#include <linux/err.h>
17#include <linux/io.h>
18
19#include <plat/common.h>
20#include <plat/cpu.h>
21#include <plat/prcm.h>
22
23#include "prm2xxx_3xxx.h"
24#include "cm2xxx_3xxx.h"
25#include "prm-regbits-24xx.h"
26#include "prm-regbits-34xx.h"
27
28u32 omap2_prm_read_mod_reg(s16 module, u16 idx)
29{
30 return __raw_readl(prm_base + module + idx);
31}
32
33void omap2_prm_write_mod_reg(u32 val, s16 module, u16 idx)
34{
35 __raw_writel(val, prm_base + module + idx);
36}
37
38
39u32 omap2_prm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx)
40{
41 u32 v;
42
43 v = omap2_prm_read_mod_reg(module, idx);
44 v &= ~mask;
45 v |= bits;
46 omap2_prm_write_mod_reg(v, module, idx);
47
48 return v;
49}
50
51
52u32 omap2_prm_read_mod_bits_shift(s16 domain, s16 idx, u32 mask)
53{
54 u32 v;
55
56 v = omap2_prm_read_mod_reg(domain, idx);
57 v &= mask;
58 v >>= __ffs(mask);
59
60 return v;
61}
62
63u32 omap2_prm_set_mod_reg_bits(u32 bits, s16 module, s16 idx)
64{
65 return omap2_prm_rmw_mod_reg_bits(bits, bits, module, idx);
66}
67
68u32 omap2_prm_clear_mod_reg_bits(u32 bits, s16 module, s16 idx)
69{
70 return omap2_prm_rmw_mod_reg_bits(bits, 0x0, module, idx);
71}
72
73
74
75
76
77
78
79
80
81
82
83
84int omap2_prm_is_hardreset_asserted(s16 prm_mod, u8 shift)
85{
86 if (!(cpu_is_omap24xx() || cpu_is_omap34xx()))
87 return -EINVAL;
88
89 return omap2_prm_read_mod_bits_shift(prm_mod, OMAP2_RM_RSTCTRL,
90 (1 << shift));
91}
92
93
94
95
96
97
98
99
100
101
102
103
104
105int omap2_prm_assert_hardreset(s16 prm_mod, u8 shift)
106{
107 u32 mask;
108
109 if (!(cpu_is_omap24xx() || cpu_is_omap34xx()))
110 return -EINVAL;
111
112 mask = 1 << shift;
113 omap2_prm_rmw_mod_reg_bits(mask, mask, prm_mod, OMAP2_RM_RSTCTRL);
114
115 return 0;
116}
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132int omap2_prm_deassert_hardreset(s16 prm_mod, u8 shift)
133{
134 u32 mask;
135 int c;
136
137 if (!(cpu_is_omap24xx() || cpu_is_omap34xx()))
138 return -EINVAL;
139
140 mask = 1 << shift;
141
142
143 if (omap2_prm_read_mod_bits_shift(prm_mod, OMAP2_RM_RSTCTRL, mask) == 0)
144 return -EEXIST;
145
146
147 omap2_prm_rmw_mod_reg_bits(0xffffffff, mask, prm_mod, OMAP2_RM_RSTST);
148
149 omap2_prm_rmw_mod_reg_bits(mask, 0, prm_mod, OMAP2_RM_RSTCTRL);
150
151 omap_test_timeout(omap2_prm_read_mod_bits_shift(prm_mod, OMAP2_RM_RSTST,
152 mask),
153 MAX_MODULE_HARDRESET_WAIT, c);
154
155 return (c == MAX_MODULE_HARDRESET_WAIT) ? -EBUSY : 0;
156}
157