1 #include <aw_list.h>
2 #include <stdlib.h>
3 #include <hal_log.h>
4 #include <hal_reset.h>
5
6 static LIST_HEAD(reset_control_list);
7
reset_control_register(struct reset_control_dev * rcdev)8 int reset_control_register(struct reset_control_dev *rcdev) //for reset system
9 {
10 if (rcdev)
11 {
12 list_add_tail(&rcdev->node, &reset_control_list);
13 return 0;
14 }
15 return -1;
16 }
17
reset_control_unregister(struct reset_control * reset)18 int reset_control_unregister(struct reset_control *reset) //for reset system
19 {
20 struct reset_control_dev *rcdev = NULL;
21
22 if (!rcdev)
23 {
24 return 0;
25 }
26
27 list_for_each_entry(rcdev, &reset_control_list, node)
28 {
29 if (rcdev->type != reset->rcdev->type)
30 {
31 continue;
32 }
33 list_del(&rcdev->node);
34 return 0;
35 }
36
37 return 0;
38 }
39
40 #ifdef CONFIG_DRIVERS_SUNXI_CCU
41
hal_reset_control_get(hal_reset_type_t type,hal_reset_id_t id)42 struct reset_control *hal_reset_control_get(hal_reset_type_t type, hal_reset_id_t id)
43 {
44 struct reset_control_dev *rcdev = NULL;
45 struct reset_control *rc = NULL;
46
47 rc = (struct reset_control *)malloc(sizeof(*rc));
48 if (!rc)
49 {
50 return NULL;
51 }
52
53 list_for_each_entry(rcdev, &reset_control_list, node)
54 {
55 if (rcdev->type != type)
56 {
57 continue;
58 }
59 if (rcdev->nr_resets < id)
60 {
61 continue;
62 }
63 rc->rcdev = rcdev;
64 rc->id = id;
65 rc->enable_count = 0;
66 return rc;
67 }
68 return NULL;
69 }
70
hal_reset_control_put(struct reset_control * reset)71 int hal_reset_control_put(struct reset_control *reset)
72 {
73 if (!reset)
74 return 0;
75
76 free(reset);
77 return 0;
78 }
79
80
hal_reset_control_assert(struct reset_control * reset)81 int hal_reset_control_assert(struct reset_control *reset)
82 {
83 struct reset_control_dev *rcdev;
84
85 if (!reset || !reset->rcdev)
86 {
87 return 0;
88 }
89
90 rcdev = reset->rcdev;
91
92 if (rcdev->ops && rcdev->ops->assert)
93 {
94 return rcdev->ops->assert(rcdev, reset->id);
95 }
96
97 return -1;
98 }
99
hal_reset_control_deassert(struct reset_control * reset)100 int hal_reset_control_deassert(struct reset_control *reset)
101 {
102 struct reset_control_dev *rcdev;
103
104 if (!reset || !reset->rcdev)
105 {
106 return 0;
107 }
108
109 rcdev = reset->rcdev;
110
111 if (rcdev->ops && rcdev->ops->deassert)
112 {
113 return rcdev->ops->deassert(rcdev, reset->id);
114 }
115
116 return -1;
117 }
118
hal_reset_control_reset(struct reset_control * reset)119 int hal_reset_control_reset(struct reset_control *reset)
120 {
121 struct reset_control_dev *rcdev;
122
123 if (!reset || !reset->rcdev)
124 {
125 return 0;
126 }
127
128 rcdev = reset->rcdev;
129
130 if (rcdev->ops && rcdev->ops->deassert)
131 {
132 return rcdev->ops->reset(rcdev, reset->id);
133 }
134
135 return -1;
136 }
137
138
hal_reset_control_status(struct reset_control * reset)139 int hal_reset_control_status(struct reset_control *reset)
140 {
141
142 struct reset_control_dev *rcdev;
143
144 if (!reset || !reset->rcdev)
145 {
146 return 0;
147 }
148
149 rcdev = reset->rcdev;
150
151 if (rcdev->ops && rcdev->ops->deassert)
152 {
153 return rcdev->ops->status(rcdev, reset->id);
154 }
155
156 return 0;
157 }
158
159 #else
160
hal_reset_control_get(hal_reset_type_t type_id,u32 reset_id)161 struct reset_control *hal_reset_control_get(hal_reset_type_t type_id, u32 reset_id)
162 {
163 return NULL;
164 }
165
hal_reset_control_put(struct reset_control * reset)166 int hal_reset_control_put(struct reset_control *reset)
167 {
168 return 0;
169 }
170
171
hal_reset_control_assert(struct reset_control * reset)172 int hal_reset_control_assert(struct reset_control *reset)
173 {
174 return 0;
175 }
176
hal_reset_control_deassert(struct reset_control * reset)177 int hal_reset_control_deassert(struct reset_control *reset)
178 {
179 return 0;
180 }
181
hal_reset_control_reset(struct reset_control * reset)182 int hal_reset_control_reset(struct reset_control *reset)
183 {
184 return 0;
185 }
186
hal_reset_control_status(struct reset_control * reset)187 int hal_reset_control_status(struct reset_control *reset)
188 {
189 return 0;
190 }
191 #endif
192