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