1 | // SPDX-License-Identifier: GPL-2.0-or-later |
2 | /* |
3 | * Copyright (C) 2016 Socionext Inc. |
4 | * Author: Masahiro Yamada <yamada.masahiro@socionext.com> |
5 | */ |
6 | |
7 | #include <linux/mfd/syscon.h> |
8 | #include <linux/module.h> |
9 | #include <linux/of.h> |
10 | #include <linux/platform_device.h> |
11 | #include <linux/regmap.h> |
12 | #include <linux/reset-controller.h> |
13 | |
14 | struct uniphier_reset_data { |
15 | unsigned int id; |
16 | unsigned int reg; |
17 | unsigned int bit; |
18 | unsigned int flags; |
19 | #define UNIPHIER_RESET_ACTIVE_LOW BIT(0) |
20 | }; |
21 | |
22 | #define UNIPHIER_RESET_ID_END ((unsigned int)(-1)) |
23 | |
24 | #define UNIPHIER_RESET_END \ |
25 | { .id = UNIPHIER_RESET_ID_END } |
26 | |
27 | #define UNIPHIER_RESET(_id, _reg, _bit) \ |
28 | { \ |
29 | .id = (_id), \ |
30 | .reg = (_reg), \ |
31 | .bit = (_bit), \ |
32 | } |
33 | |
34 | #define UNIPHIER_RESETX(_id, _reg, _bit) \ |
35 | { \ |
36 | .id = (_id), \ |
37 | .reg = (_reg), \ |
38 | .bit = (_bit), \ |
39 | .flags = UNIPHIER_RESET_ACTIVE_LOW, \ |
40 | } |
41 | |
42 | /* System reset data */ |
43 | static const struct uniphier_reset_data uniphier_ld4_sys_reset_data[] = { |
44 | UNIPHIER_RESETX(2, 0x2000, 2), /* NAND */ |
45 | UNIPHIER_RESETX(8, 0x2000, 10), /* STDMAC (Ether, HSC, MIO) */ |
46 | UNIPHIER_RESET_END, |
47 | }; |
48 | |
49 | static const struct uniphier_reset_data uniphier_pro4_sys_reset_data[] = { |
50 | UNIPHIER_RESETX(2, 0x2000, 2), /* NAND */ |
51 | UNIPHIER_RESETX(6, 0x2000, 12), /* Ether */ |
52 | UNIPHIER_RESETX(8, 0x2000, 10), /* STDMAC (HSC, MIO, RLE) */ |
53 | UNIPHIER_RESETX(12, 0x2000, 6), /* GIO (Ether, SATA, USB3) */ |
54 | UNIPHIER_RESETX(14, 0x2000, 17), /* USB30 */ |
55 | UNIPHIER_RESETX(15, 0x2004, 17), /* USB31 */ |
56 | UNIPHIER_RESETX(28, 0x2000, 18), /* SATA0 */ |
57 | UNIPHIER_RESETX(29, 0x2004, 18), /* SATA1 */ |
58 | UNIPHIER_RESETX(30, 0x2000, 19), /* SATA-PHY */ |
59 | UNIPHIER_RESETX(40, 0x2000, 13), /* AIO */ |
60 | UNIPHIER_RESET_END, |
61 | }; |
62 | |
63 | static const struct uniphier_reset_data uniphier_pro5_sys_reset_data[] = { |
64 | UNIPHIER_RESETX(2, 0x2000, 2), /* NAND */ |
65 | UNIPHIER_RESETX(8, 0x2000, 10), /* STDMAC (HSC) */ |
66 | UNIPHIER_RESETX(12, 0x2000, 6), /* GIO (PCIe, USB3) */ |
67 | UNIPHIER_RESETX(14, 0x2000, 17), /* USB30 */ |
68 | UNIPHIER_RESETX(15, 0x2004, 17), /* USB31 */ |
69 | UNIPHIER_RESETX(24, 0x2008, 2), /* PCIe */ |
70 | UNIPHIER_RESETX(40, 0x2000, 13), /* AIO */ |
71 | UNIPHIER_RESET_END, |
72 | }; |
73 | |
74 | static const struct uniphier_reset_data uniphier_pxs2_sys_reset_data[] = { |
75 | UNIPHIER_RESETX(2, 0x2000, 2), /* NAND */ |
76 | UNIPHIER_RESETX(6, 0x2000, 12), /* Ether */ |
77 | UNIPHIER_RESETX(8, 0x2000, 10), /* STDMAC (HSC, RLE) */ |
78 | UNIPHIER_RESETX(14, 0x2000, 17), /* USB30 */ |
79 | UNIPHIER_RESETX(15, 0x2004, 17), /* USB31 */ |
80 | UNIPHIER_RESETX(16, 0x2014, 4), /* USB30-PHY0 */ |
81 | UNIPHIER_RESETX(17, 0x2014, 0), /* USB30-PHY1 */ |
82 | UNIPHIER_RESETX(18, 0x2014, 2), /* USB30-PHY2 */ |
83 | UNIPHIER_RESETX(20, 0x2014, 5), /* USB31-PHY0 */ |
84 | UNIPHIER_RESETX(21, 0x2014, 1), /* USB31-PHY1 */ |
85 | UNIPHIER_RESETX(28, 0x2014, 12), /* SATA */ |
86 | UNIPHIER_RESET(30, 0x2014, 8), /* SATA-PHY (active high) */ |
87 | UNIPHIER_RESETX(40, 0x2000, 13), /* AIO */ |
88 | UNIPHIER_RESET_END, |
89 | }; |
90 | |
91 | static const struct uniphier_reset_data uniphier_ld11_sys_reset_data[] = { |
92 | UNIPHIER_RESETX(2, 0x200c, 0), /* NAND */ |
93 | UNIPHIER_RESETX(4, 0x200c, 2), /* eMMC */ |
94 | UNIPHIER_RESETX(6, 0x200c, 6), /* Ether */ |
95 | UNIPHIER_RESETX(8, 0x200c, 8), /* STDMAC (HSC, MIO) */ |
96 | UNIPHIER_RESETX(9, 0x200c, 9), /* HSC */ |
97 | UNIPHIER_RESETX(40, 0x2008, 0), /* AIO */ |
98 | UNIPHIER_RESETX(41, 0x2008, 1), /* EVEA */ |
99 | UNIPHIER_RESETX(42, 0x2010, 2), /* EXIV */ |
100 | UNIPHIER_RESET_END, |
101 | }; |
102 | |
103 | static const struct uniphier_reset_data uniphier_ld20_sys_reset_data[] = { |
104 | UNIPHIER_RESETX(2, 0x200c, 0), /* NAND */ |
105 | UNIPHIER_RESETX(4, 0x200c, 2), /* eMMC */ |
106 | UNIPHIER_RESETX(6, 0x200c, 6), /* Ether */ |
107 | UNIPHIER_RESETX(8, 0x200c, 8), /* STDMAC (HSC) */ |
108 | UNIPHIER_RESETX(9, 0x200c, 9), /* HSC */ |
109 | UNIPHIER_RESETX(14, 0x200c, 5), /* USB30 */ |
110 | UNIPHIER_RESETX(16, 0x200c, 12), /* USB30-PHY0 */ |
111 | UNIPHIER_RESETX(17, 0x200c, 13), /* USB30-PHY1 */ |
112 | UNIPHIER_RESETX(18, 0x200c, 14), /* USB30-PHY2 */ |
113 | UNIPHIER_RESETX(19, 0x200c, 15), /* USB30-PHY3 */ |
114 | UNIPHIER_RESETX(24, 0x200c, 4), /* PCIe */ |
115 | UNIPHIER_RESETX(40, 0x2008, 0), /* AIO */ |
116 | UNIPHIER_RESETX(41, 0x2008, 1), /* EVEA */ |
117 | UNIPHIER_RESETX(42, 0x2010, 2), /* EXIV */ |
118 | UNIPHIER_RESET_END, |
119 | }; |
120 | |
121 | static const struct uniphier_reset_data uniphier_pxs3_sys_reset_data[] = { |
122 | UNIPHIER_RESETX(2, 0x200c, 0), /* NAND */ |
123 | UNIPHIER_RESETX(4, 0x200c, 2), /* eMMC */ |
124 | UNIPHIER_RESETX(6, 0x200c, 9), /* Ether0 */ |
125 | UNIPHIER_RESETX(7, 0x200c, 10), /* Ether1 */ |
126 | UNIPHIER_RESETX(8, 0x200c, 12), /* STDMAC */ |
127 | UNIPHIER_RESETX(12, 0x200c, 4), /* USB30 link */ |
128 | UNIPHIER_RESETX(13, 0x200c, 5), /* USB31 link */ |
129 | UNIPHIER_RESETX(16, 0x200c, 16), /* USB30-PHY0 */ |
130 | UNIPHIER_RESETX(17, 0x200c, 18), /* USB30-PHY1 */ |
131 | UNIPHIER_RESETX(18, 0x200c, 20), /* USB30-PHY2 */ |
132 | UNIPHIER_RESETX(20, 0x200c, 17), /* USB31-PHY0 */ |
133 | UNIPHIER_RESETX(21, 0x200c, 19), /* USB31-PHY1 */ |
134 | UNIPHIER_RESETX(24, 0x200c, 3), /* PCIe */ |
135 | UNIPHIER_RESETX(28, 0x200c, 7), /* SATA0 */ |
136 | UNIPHIER_RESETX(29, 0x200c, 8), /* SATA1 */ |
137 | UNIPHIER_RESETX(30, 0x200c, 21), /* SATA-PHY */ |
138 | UNIPHIER_RESETX(40, 0x2008, 0), /* AIO */ |
139 | UNIPHIER_RESETX(42, 0x2010, 2), /* EXIV */ |
140 | UNIPHIER_RESET_END, |
141 | }; |
142 | |
143 | static const struct uniphier_reset_data uniphier_nx1_sys_reset_data[] = { |
144 | UNIPHIER_RESETX(4, 0x2008, 8), /* eMMC */ |
145 | UNIPHIER_RESETX(6, 0x200c, 0), /* Ether */ |
146 | UNIPHIER_RESETX(12, 0x200c, 16), /* USB30 link */ |
147 | UNIPHIER_RESETX(16, 0x200c, 24), /* USB30-PHY0 */ |
148 | UNIPHIER_RESETX(17, 0x200c, 25), /* USB30-PHY1 */ |
149 | UNIPHIER_RESETX(18, 0x200c, 26), /* USB30-PHY2 */ |
150 | UNIPHIER_RESETX(24, 0x200c, 8), /* PCIe */ |
151 | UNIPHIER_RESETX(52, 0x2010, 0), /* VOC */ |
152 | UNIPHIER_RESETX(58, 0x2010, 8), /* HDMI-Tx */ |
153 | UNIPHIER_RESET_END, |
154 | }; |
155 | |
156 | /* Media I/O reset data */ |
157 | #define UNIPHIER_MIO_RESET_SD(id, ch) \ |
158 | UNIPHIER_RESETX((id), 0x110 + 0x200 * (ch), 0) |
159 | |
160 | #define UNIPHIER_MIO_RESET_SD_BRIDGE(id, ch) \ |
161 | UNIPHIER_RESETX((id), 0x110 + 0x200 * (ch), 26) |
162 | |
163 | #define UNIPHIER_MIO_RESET_EMMC_HW_RESET(id, ch) \ |
164 | UNIPHIER_RESETX((id), 0x80 + 0x200 * (ch), 0) |
165 | |
166 | #define UNIPHIER_MIO_RESET_USB2(id, ch) \ |
167 | UNIPHIER_RESETX((id), 0x114 + 0x200 * (ch), 0) |
168 | |
169 | #define UNIPHIER_MIO_RESET_USB2_BRIDGE(id, ch) \ |
170 | UNIPHIER_RESETX((id), 0x110 + 0x200 * (ch), 24) |
171 | |
172 | #define UNIPHIER_MIO_RESET_DMAC(id) \ |
173 | UNIPHIER_RESETX((id), 0x110, 17) |
174 | |
175 | static const struct uniphier_reset_data uniphier_ld4_mio_reset_data[] = { |
176 | UNIPHIER_MIO_RESET_SD(0, 0), |
177 | UNIPHIER_MIO_RESET_SD(1, 1), |
178 | UNIPHIER_MIO_RESET_SD(2, 2), |
179 | UNIPHIER_MIO_RESET_SD_BRIDGE(3, 0), |
180 | UNIPHIER_MIO_RESET_SD_BRIDGE(4, 1), |
181 | UNIPHIER_MIO_RESET_SD_BRIDGE(5, 2), |
182 | UNIPHIER_MIO_RESET_EMMC_HW_RESET(6, 1), |
183 | UNIPHIER_MIO_RESET_DMAC(7), |
184 | UNIPHIER_MIO_RESET_USB2(8, 0), |
185 | UNIPHIER_MIO_RESET_USB2(9, 1), |
186 | UNIPHIER_MIO_RESET_USB2(10, 2), |
187 | UNIPHIER_MIO_RESET_USB2_BRIDGE(12, 0), |
188 | UNIPHIER_MIO_RESET_USB2_BRIDGE(13, 1), |
189 | UNIPHIER_MIO_RESET_USB2_BRIDGE(14, 2), |
190 | UNIPHIER_RESET_END, |
191 | }; |
192 | |
193 | static const struct uniphier_reset_data uniphier_pro5_sd_reset_data[] = { |
194 | UNIPHIER_MIO_RESET_SD(0, 0), |
195 | UNIPHIER_MIO_RESET_SD(1, 1), |
196 | UNIPHIER_MIO_RESET_EMMC_HW_RESET(6, 1), |
197 | UNIPHIER_RESET_END, |
198 | }; |
199 | |
200 | /* Peripheral reset data */ |
201 | #define UNIPHIER_PERI_RESET_UART(id, ch) \ |
202 | UNIPHIER_RESETX((id), 0x114, 19 + (ch)) |
203 | |
204 | #define UNIPHIER_PERI_RESET_I2C(id, ch) \ |
205 | UNIPHIER_RESETX((id), 0x114, 5 + (ch)) |
206 | |
207 | #define UNIPHIER_PERI_RESET_FI2C(id, ch) \ |
208 | UNIPHIER_RESETX((id), 0x114, 24 + (ch)) |
209 | |
210 | #define UNIPHIER_PERI_RESET_SCSSI(id, ch) \ |
211 | UNIPHIER_RESETX((id), 0x110, 17 + (ch)) |
212 | |
213 | #define UNIPHIER_PERI_RESET_MCSSI(id) \ |
214 | UNIPHIER_RESETX((id), 0x114, 14) |
215 | |
216 | static const struct uniphier_reset_data uniphier_ld4_peri_reset_data[] = { |
217 | UNIPHIER_PERI_RESET_UART(0, 0), |
218 | UNIPHIER_PERI_RESET_UART(1, 1), |
219 | UNIPHIER_PERI_RESET_UART(2, 2), |
220 | UNIPHIER_PERI_RESET_UART(3, 3), |
221 | UNIPHIER_PERI_RESET_I2C(4, 0), |
222 | UNIPHIER_PERI_RESET_I2C(5, 1), |
223 | UNIPHIER_PERI_RESET_I2C(6, 2), |
224 | UNIPHIER_PERI_RESET_I2C(7, 3), |
225 | UNIPHIER_PERI_RESET_I2C(8, 4), |
226 | UNIPHIER_PERI_RESET_SCSSI(11, 0), |
227 | UNIPHIER_RESET_END, |
228 | }; |
229 | |
230 | static const struct uniphier_reset_data uniphier_pro4_peri_reset_data[] = { |
231 | UNIPHIER_PERI_RESET_UART(0, 0), |
232 | UNIPHIER_PERI_RESET_UART(1, 1), |
233 | UNIPHIER_PERI_RESET_UART(2, 2), |
234 | UNIPHIER_PERI_RESET_UART(3, 3), |
235 | UNIPHIER_PERI_RESET_FI2C(4, 0), |
236 | UNIPHIER_PERI_RESET_FI2C(5, 1), |
237 | UNIPHIER_PERI_RESET_FI2C(6, 2), |
238 | UNIPHIER_PERI_RESET_FI2C(7, 3), |
239 | UNIPHIER_PERI_RESET_FI2C(8, 4), |
240 | UNIPHIER_PERI_RESET_FI2C(9, 5), |
241 | UNIPHIER_PERI_RESET_FI2C(10, 6), |
242 | UNIPHIER_PERI_RESET_SCSSI(11, 0), |
243 | UNIPHIER_PERI_RESET_SCSSI(12, 1), |
244 | UNIPHIER_PERI_RESET_SCSSI(13, 2), |
245 | UNIPHIER_PERI_RESET_SCSSI(14, 3), |
246 | UNIPHIER_PERI_RESET_MCSSI(15), |
247 | UNIPHIER_RESET_END, |
248 | }; |
249 | |
250 | /* Analog signal amplifiers reset data */ |
251 | static const struct uniphier_reset_data uniphier_ld11_adamv_reset_data[] = { |
252 | UNIPHIER_RESETX(0, 0x10, 6), /* EVEA */ |
253 | UNIPHIER_RESET_END, |
254 | }; |
255 | |
256 | /* core implementaton */ |
257 | struct uniphier_reset_priv { |
258 | struct reset_controller_dev rcdev; |
259 | struct device *dev; |
260 | struct regmap *regmap; |
261 | const struct uniphier_reset_data *data; |
262 | }; |
263 | |
264 | #define to_uniphier_reset_priv(_rcdev) \ |
265 | container_of(_rcdev, struct uniphier_reset_priv, rcdev) |
266 | |
267 | static int uniphier_reset_update(struct reset_controller_dev *rcdev, |
268 | unsigned long id, int assert) |
269 | { |
270 | struct uniphier_reset_priv *priv = to_uniphier_reset_priv(rcdev); |
271 | const struct uniphier_reset_data *p; |
272 | |
273 | for (p = priv->data; p->id != UNIPHIER_RESET_ID_END; p++) { |
274 | unsigned int mask, val; |
275 | |
276 | if (p->id != id) |
277 | continue; |
278 | |
279 | mask = BIT(p->bit); |
280 | |
281 | if (assert) |
282 | val = mask; |
283 | else |
284 | val = ~mask; |
285 | |
286 | if (p->flags & UNIPHIER_RESET_ACTIVE_LOW) |
287 | val = ~val; |
288 | |
289 | return regmap_write_bits(map: priv->regmap, reg: p->reg, mask, val); |
290 | } |
291 | |
292 | dev_err(priv->dev, "reset_id=%lu was not handled\n" , id); |
293 | return -EINVAL; |
294 | } |
295 | |
296 | static int uniphier_reset_assert(struct reset_controller_dev *rcdev, |
297 | unsigned long id) |
298 | { |
299 | return uniphier_reset_update(rcdev, id, assert: 1); |
300 | } |
301 | |
302 | static int uniphier_reset_deassert(struct reset_controller_dev *rcdev, |
303 | unsigned long id) |
304 | { |
305 | return uniphier_reset_update(rcdev, id, assert: 0); |
306 | } |
307 | |
308 | static int uniphier_reset_status(struct reset_controller_dev *rcdev, |
309 | unsigned long id) |
310 | { |
311 | struct uniphier_reset_priv *priv = to_uniphier_reset_priv(rcdev); |
312 | const struct uniphier_reset_data *p; |
313 | |
314 | for (p = priv->data; p->id != UNIPHIER_RESET_ID_END; p++) { |
315 | unsigned int val; |
316 | int ret, asserted; |
317 | |
318 | if (p->id != id) |
319 | continue; |
320 | |
321 | ret = regmap_read(map: priv->regmap, reg: p->reg, val: &val); |
322 | if (ret) |
323 | return ret; |
324 | |
325 | asserted = !!(val & BIT(p->bit)); |
326 | |
327 | if (p->flags & UNIPHIER_RESET_ACTIVE_LOW) |
328 | asserted = !asserted; |
329 | |
330 | return asserted; |
331 | } |
332 | |
333 | dev_err(priv->dev, "reset_id=%lu was not found\n" , id); |
334 | return -EINVAL; |
335 | } |
336 | |
337 | static const struct reset_control_ops uniphier_reset_ops = { |
338 | .assert = uniphier_reset_assert, |
339 | .deassert = uniphier_reset_deassert, |
340 | .status = uniphier_reset_status, |
341 | }; |
342 | |
343 | static int uniphier_reset_probe(struct platform_device *pdev) |
344 | { |
345 | struct device *dev = &pdev->dev; |
346 | struct uniphier_reset_priv *priv; |
347 | const struct uniphier_reset_data *p, *data; |
348 | struct regmap *regmap; |
349 | struct device_node *parent; |
350 | unsigned int nr_resets = 0; |
351 | |
352 | data = of_device_get_match_data(dev); |
353 | if (WARN_ON(!data)) |
354 | return -EINVAL; |
355 | |
356 | parent = of_get_parent(node: dev->of_node); /* parent should be syscon node */ |
357 | regmap = syscon_node_to_regmap(np: parent); |
358 | of_node_put(node: parent); |
359 | if (IS_ERR(ptr: regmap)) { |
360 | dev_err(dev, "failed to get regmap (error %ld)\n" , |
361 | PTR_ERR(regmap)); |
362 | return PTR_ERR(ptr: regmap); |
363 | } |
364 | |
365 | priv = devm_kzalloc(dev, size: sizeof(*priv), GFP_KERNEL); |
366 | if (!priv) |
367 | return -ENOMEM; |
368 | |
369 | for (p = data; p->id != UNIPHIER_RESET_ID_END; p++) |
370 | nr_resets = max(nr_resets, p->id + 1); |
371 | |
372 | priv->rcdev.ops = &uniphier_reset_ops; |
373 | priv->rcdev.owner = dev->driver->owner; |
374 | priv->rcdev.of_node = dev->of_node; |
375 | priv->rcdev.nr_resets = nr_resets; |
376 | priv->dev = dev; |
377 | priv->regmap = regmap; |
378 | priv->data = data; |
379 | |
380 | return devm_reset_controller_register(dev: &pdev->dev, rcdev: &priv->rcdev); |
381 | } |
382 | |
383 | static const struct of_device_id uniphier_reset_match[] = { |
384 | /* System reset */ |
385 | { |
386 | .compatible = "socionext,uniphier-ld4-reset" , |
387 | .data = uniphier_ld4_sys_reset_data, |
388 | }, |
389 | { |
390 | .compatible = "socionext,uniphier-pro4-reset" , |
391 | .data = uniphier_pro4_sys_reset_data, |
392 | }, |
393 | { |
394 | .compatible = "socionext,uniphier-sld8-reset" , |
395 | .data = uniphier_ld4_sys_reset_data, |
396 | }, |
397 | { |
398 | .compatible = "socionext,uniphier-pro5-reset" , |
399 | .data = uniphier_pro5_sys_reset_data, |
400 | }, |
401 | { |
402 | .compatible = "socionext,uniphier-pxs2-reset" , |
403 | .data = uniphier_pxs2_sys_reset_data, |
404 | }, |
405 | { |
406 | .compatible = "socionext,uniphier-ld11-reset" , |
407 | .data = uniphier_ld11_sys_reset_data, |
408 | }, |
409 | { |
410 | .compatible = "socionext,uniphier-ld20-reset" , |
411 | .data = uniphier_ld20_sys_reset_data, |
412 | }, |
413 | { |
414 | .compatible = "socionext,uniphier-pxs3-reset" , |
415 | .data = uniphier_pxs3_sys_reset_data, |
416 | }, |
417 | { |
418 | .compatible = "socionext,uniphier-nx1-reset" , |
419 | .data = uniphier_nx1_sys_reset_data, |
420 | }, |
421 | /* Media I/O reset, SD reset */ |
422 | { |
423 | .compatible = "socionext,uniphier-ld4-mio-reset" , |
424 | .data = uniphier_ld4_mio_reset_data, |
425 | }, |
426 | { |
427 | .compatible = "socionext,uniphier-pro4-mio-reset" , |
428 | .data = uniphier_ld4_mio_reset_data, |
429 | }, |
430 | { |
431 | .compatible = "socionext,uniphier-sld8-mio-reset" , |
432 | .data = uniphier_ld4_mio_reset_data, |
433 | }, |
434 | { |
435 | .compatible = "socionext,uniphier-pro5-sd-reset" , |
436 | .data = uniphier_pro5_sd_reset_data, |
437 | }, |
438 | { |
439 | .compatible = "socionext,uniphier-pxs2-sd-reset" , |
440 | .data = uniphier_pro5_sd_reset_data, |
441 | }, |
442 | { |
443 | .compatible = "socionext,uniphier-ld11-mio-reset" , |
444 | .data = uniphier_ld4_mio_reset_data, |
445 | }, |
446 | { |
447 | .compatible = "socionext,uniphier-ld11-sd-reset" , |
448 | .data = uniphier_pro5_sd_reset_data, |
449 | }, |
450 | { |
451 | .compatible = "socionext,uniphier-ld20-sd-reset" , |
452 | .data = uniphier_pro5_sd_reset_data, |
453 | }, |
454 | { |
455 | .compatible = "socionext,uniphier-pxs3-sd-reset" , |
456 | .data = uniphier_pro5_sd_reset_data, |
457 | }, |
458 | { |
459 | .compatible = "socionext,uniphier-nx1-sd-reset" , |
460 | .data = uniphier_pro5_sd_reset_data, |
461 | }, |
462 | /* Peripheral reset */ |
463 | { |
464 | .compatible = "socionext,uniphier-ld4-peri-reset" , |
465 | .data = uniphier_ld4_peri_reset_data, |
466 | }, |
467 | { |
468 | .compatible = "socionext,uniphier-pro4-peri-reset" , |
469 | .data = uniphier_pro4_peri_reset_data, |
470 | }, |
471 | { |
472 | .compatible = "socionext,uniphier-sld8-peri-reset" , |
473 | .data = uniphier_ld4_peri_reset_data, |
474 | }, |
475 | { |
476 | .compatible = "socionext,uniphier-pro5-peri-reset" , |
477 | .data = uniphier_pro4_peri_reset_data, |
478 | }, |
479 | { |
480 | .compatible = "socionext,uniphier-pxs2-peri-reset" , |
481 | .data = uniphier_pro4_peri_reset_data, |
482 | }, |
483 | { |
484 | .compatible = "socionext,uniphier-ld11-peri-reset" , |
485 | .data = uniphier_pro4_peri_reset_data, |
486 | }, |
487 | { |
488 | .compatible = "socionext,uniphier-ld20-peri-reset" , |
489 | .data = uniphier_pro4_peri_reset_data, |
490 | }, |
491 | { |
492 | .compatible = "socionext,uniphier-pxs3-peri-reset" , |
493 | .data = uniphier_pro4_peri_reset_data, |
494 | }, |
495 | { |
496 | .compatible = "socionext,uniphier-nx1-peri-reset" , |
497 | .data = uniphier_pro4_peri_reset_data, |
498 | }, |
499 | /* Analog signal amplifiers reset */ |
500 | { |
501 | .compatible = "socionext,uniphier-ld11-adamv-reset" , |
502 | .data = uniphier_ld11_adamv_reset_data, |
503 | }, |
504 | { |
505 | .compatible = "socionext,uniphier-ld20-adamv-reset" , |
506 | .data = uniphier_ld11_adamv_reset_data, |
507 | }, |
508 | { /* sentinel */ } |
509 | }; |
510 | MODULE_DEVICE_TABLE(of, uniphier_reset_match); |
511 | |
512 | static struct platform_driver uniphier_reset_driver = { |
513 | .probe = uniphier_reset_probe, |
514 | .driver = { |
515 | .name = "uniphier-reset" , |
516 | .of_match_table = uniphier_reset_match, |
517 | }, |
518 | }; |
519 | module_platform_driver(uniphier_reset_driver); |
520 | |
521 | MODULE_AUTHOR("Masahiro Yamada <yamada.masahiro@socionext.com>" ); |
522 | MODULE_DESCRIPTION("UniPhier Reset Controller Driver" ); |
523 | MODULE_LICENSE("GPL" ); |
524 | |