xref: /OK3568_Linux_fs/u-boot/drivers/reset/reset-uniphier.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2016 Socionext Inc.
3*4882a593Smuzhiyun  *   Author: Masahiro Yamada <yamada.masahiro@socionext.com>
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <common.h>
9*4882a593Smuzhiyun #include <dm.h>
10*4882a593Smuzhiyun #include <reset-uclass.h>
11*4882a593Smuzhiyun #include <linux/bitops.h>
12*4882a593Smuzhiyun #include <linux/io.h>
13*4882a593Smuzhiyun #include <linux/sizes.h>
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun struct uniphier_reset_data {
16*4882a593Smuzhiyun 	unsigned int id;
17*4882a593Smuzhiyun 	unsigned int reg;
18*4882a593Smuzhiyun 	unsigned int bit;
19*4882a593Smuzhiyun 	unsigned int flags;
20*4882a593Smuzhiyun #define UNIPHIER_RESET_ACTIVE_LOW		BIT(0)
21*4882a593Smuzhiyun };
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define UNIPHIER_RESET_ID_END		(unsigned int)(-1)
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #define UNIPHIER_RESET_END				\
26*4882a593Smuzhiyun 	{ .id = UNIPHIER_RESET_ID_END }
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #define UNIPHIER_RESET(_id, _reg, _bit)			\
29*4882a593Smuzhiyun 	{						\
30*4882a593Smuzhiyun 		.id = (_id),				\
31*4882a593Smuzhiyun 		.reg = (_reg),				\
32*4882a593Smuzhiyun 		.bit = (_bit),				\
33*4882a593Smuzhiyun 	}
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #define UNIPHIER_RESETX(_id, _reg, _bit)		\
36*4882a593Smuzhiyun 	{						\
37*4882a593Smuzhiyun 		.id = (_id),				\
38*4882a593Smuzhiyun 		.reg = (_reg),				\
39*4882a593Smuzhiyun 		.bit = (_bit),				\
40*4882a593Smuzhiyun 		.flags = UNIPHIER_RESET_ACTIVE_LOW,	\
41*4882a593Smuzhiyun 	}
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun /* System reset data */
44*4882a593Smuzhiyun static const struct uniphier_reset_data uniphier_pro4_sys_reset_data[] = {
45*4882a593Smuzhiyun 	UNIPHIER_RESETX(2, 0x2000, 2),		/* NAND */
46*4882a593Smuzhiyun 	UNIPHIER_RESETX(8, 0x2000, 10),		/* STDMAC */
47*4882a593Smuzhiyun 	UNIPHIER_RESETX(12, 0x2000, 6),		/* GIO */
48*4882a593Smuzhiyun 	UNIPHIER_RESETX(14, 0x2000, 17),	/* USB30 */
49*4882a593Smuzhiyun 	UNIPHIER_RESETX(15, 0x2004, 17),	/* USB31 */
50*4882a593Smuzhiyun 	UNIPHIER_RESET_END,
51*4882a593Smuzhiyun };
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun static const struct uniphier_reset_data uniphier_pxs2_sys_reset_data[] = {
54*4882a593Smuzhiyun 	UNIPHIER_RESETX(2, 0x2000, 2),		/* NAND */
55*4882a593Smuzhiyun 	UNIPHIER_RESETX(8, 0x2000, 10),		/* STDMAC */
56*4882a593Smuzhiyun 	UNIPHIER_RESETX(14, 0x2000, 17),	/* USB30 */
57*4882a593Smuzhiyun 	UNIPHIER_RESETX(15, 0x2004, 17),	/* USB31 */
58*4882a593Smuzhiyun 	UNIPHIER_RESETX(16, 0x2014, 4),		/* USB30-PHY0 */
59*4882a593Smuzhiyun 	UNIPHIER_RESETX(17, 0x2014, 0),		/* USB30-PHY1 */
60*4882a593Smuzhiyun 	UNIPHIER_RESETX(18, 0x2014, 2),		/* USB30-PHY2 */
61*4882a593Smuzhiyun 	UNIPHIER_RESETX(20, 0x2014, 5),		/* USB31-PHY0 */
62*4882a593Smuzhiyun 	UNIPHIER_RESETX(21, 0x2014, 1),		/* USB31-PHY1 */
63*4882a593Smuzhiyun 	UNIPHIER_RESETX(28, 0x2014, 12),	/* SATA */
64*4882a593Smuzhiyun 	UNIPHIER_RESET(29, 0x2014, 8),		/* SATA-PHY (active high) */
65*4882a593Smuzhiyun 	UNIPHIER_RESET_END,
66*4882a593Smuzhiyun };
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun static const struct uniphier_reset_data uniphier_ld20_sys_reset_data[] = {
69*4882a593Smuzhiyun 	UNIPHIER_RESETX(2, 0x200c, 0),		/* NAND */
70*4882a593Smuzhiyun 	UNIPHIER_RESETX(4, 0x200c, 2),		/* eMMC */
71*4882a593Smuzhiyun 	UNIPHIER_RESETX(8, 0x200c, 8),		/* STDMAC */
72*4882a593Smuzhiyun 	UNIPHIER_RESETX(12, 0x200c, 5),		/* GIO */
73*4882a593Smuzhiyun 	UNIPHIER_RESETX(16, 0x200c, 12),	/* USB30-PHY0 */
74*4882a593Smuzhiyun 	UNIPHIER_RESETX(17, 0x200c, 13),	/* USB30-PHY1 */
75*4882a593Smuzhiyun 	UNIPHIER_RESETX(18, 0x200c, 14),	/* USB30-PHY2 */
76*4882a593Smuzhiyun 	UNIPHIER_RESETX(19, 0x200c, 15),	/* USB30-PHY3 */
77*4882a593Smuzhiyun 	UNIPHIER_RESET_END,
78*4882a593Smuzhiyun };
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun static const struct uniphier_reset_data uniphier_pxs3_sys_reset_data[] = {
81*4882a593Smuzhiyun 	UNIPHIER_RESETX(2, 0x200c, 0),		/* NAND */
82*4882a593Smuzhiyun 	UNIPHIER_RESETX(4, 0x200c, 2),		/* eMMC */
83*4882a593Smuzhiyun 	UNIPHIER_RESETX(8, 0x200c, 12),		/* STDMAC */
84*4882a593Smuzhiyun 	UNIPHIER_RESETX(12, 0x200c, 5),		/* USB30 (GIO0) */
85*4882a593Smuzhiyun 	UNIPHIER_RESETX(13, 0x200c, 6),		/* USB31 (GIO1) */
86*4882a593Smuzhiyun 	UNIPHIER_RESETX(16, 0x200c, 16),	/* USB30-PHY */
87*4882a593Smuzhiyun 	UNIPHIER_RESETX(20, 0x200c, 17),	/* USB31-PHY */
88*4882a593Smuzhiyun 	UNIPHIER_RESET_END,
89*4882a593Smuzhiyun };
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun /* Media I/O reset data */
92*4882a593Smuzhiyun #define UNIPHIER_MIO_RESET_SD(id, ch)			\
93*4882a593Smuzhiyun 	UNIPHIER_RESETX((id), 0x110 + 0x200 * (ch), 0)
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun #define UNIPHIER_MIO_RESET_SD_BRIDGE(id, ch)		\
96*4882a593Smuzhiyun 	UNIPHIER_RESETX((id), 0x110 + 0x200 * (ch), 26)
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun #define UNIPHIER_MIO_RESET_EMMC_HW_RESET(id, ch)	\
99*4882a593Smuzhiyun 	UNIPHIER_RESETX((id), 0x80 + 0x200 * (ch), 0)
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun #define UNIPHIER_MIO_RESET_USB2(id, ch)			\
102*4882a593Smuzhiyun 	UNIPHIER_RESETX((id), 0x114 + 0x200 * (ch), 0)
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun #define UNIPHIER_MIO_RESET_USB2_BRIDGE(id, ch)		\
105*4882a593Smuzhiyun 	UNIPHIER_RESETX((id), 0x110 + 0x200 * (ch), 24)
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun #define UNIPHIER_MIO_RESET_DMAC(id)			\
108*4882a593Smuzhiyun 	UNIPHIER_RESETX((id), 0x110, 17)
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun static const struct uniphier_reset_data uniphier_mio_reset_data[] = {
111*4882a593Smuzhiyun 	UNIPHIER_MIO_RESET_SD(0, 0),
112*4882a593Smuzhiyun 	UNIPHIER_MIO_RESET_SD(1, 1),
113*4882a593Smuzhiyun 	UNIPHIER_MIO_RESET_SD(2, 2),
114*4882a593Smuzhiyun 	UNIPHIER_MIO_RESET_SD_BRIDGE(3, 0),
115*4882a593Smuzhiyun 	UNIPHIER_MIO_RESET_SD_BRIDGE(4, 1),
116*4882a593Smuzhiyun 	UNIPHIER_MIO_RESET_SD_BRIDGE(5, 2),
117*4882a593Smuzhiyun 	UNIPHIER_MIO_RESET_EMMC_HW_RESET(6, 1),
118*4882a593Smuzhiyun 	UNIPHIER_MIO_RESET_DMAC(7),
119*4882a593Smuzhiyun 	UNIPHIER_MIO_RESET_USB2(8, 0),
120*4882a593Smuzhiyun 	UNIPHIER_MIO_RESET_USB2(9, 1),
121*4882a593Smuzhiyun 	UNIPHIER_MIO_RESET_USB2(10, 2),
122*4882a593Smuzhiyun 	UNIPHIER_MIO_RESET_USB2(11, 3),
123*4882a593Smuzhiyun 	UNIPHIER_MIO_RESET_USB2_BRIDGE(12, 0),
124*4882a593Smuzhiyun 	UNIPHIER_MIO_RESET_USB2_BRIDGE(13, 1),
125*4882a593Smuzhiyun 	UNIPHIER_MIO_RESET_USB2_BRIDGE(14, 2),
126*4882a593Smuzhiyun 	UNIPHIER_MIO_RESET_USB2_BRIDGE(15, 3),
127*4882a593Smuzhiyun 	UNIPHIER_RESET_END,
128*4882a593Smuzhiyun };
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun /* Peripheral reset data */
131*4882a593Smuzhiyun #define UNIPHIER_PERI_RESET_UART(id, ch)		\
132*4882a593Smuzhiyun 	UNIPHIER_RESETX((id), 0x114, 19 + (ch))
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun #define UNIPHIER_PERI_RESET_I2C(id, ch)			\
135*4882a593Smuzhiyun 	UNIPHIER_RESETX((id), 0x114, 5 + (ch))
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun #define UNIPHIER_PERI_RESET_FI2C(id, ch)		\
138*4882a593Smuzhiyun 	UNIPHIER_RESETX((id), 0x114, 24 + (ch))
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun static const struct uniphier_reset_data uniphier_ld4_peri_reset_data[] = {
141*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_UART(0, 0),
142*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_UART(1, 1),
143*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_UART(2, 2),
144*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_UART(3, 3),
145*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_I2C(4, 0),
146*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_I2C(5, 1),
147*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_I2C(6, 2),
148*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_I2C(7, 3),
149*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_I2C(8, 4),
150*4882a593Smuzhiyun 	UNIPHIER_RESET_END,
151*4882a593Smuzhiyun };
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun static const struct uniphier_reset_data uniphier_pro4_peri_reset_data[] = {
154*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_UART(0, 0),
155*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_UART(1, 1),
156*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_UART(2, 2),
157*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_UART(3, 3),
158*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_FI2C(4, 0),
159*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_FI2C(5, 1),
160*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_FI2C(6, 2),
161*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_FI2C(7, 3),
162*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_FI2C(8, 4),
163*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_FI2C(9, 5),
164*4882a593Smuzhiyun 	UNIPHIER_PERI_RESET_FI2C(10, 6),
165*4882a593Smuzhiyun 	UNIPHIER_RESET_END,
166*4882a593Smuzhiyun };
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun /* core implementaton */
169*4882a593Smuzhiyun struct uniphier_reset_priv {
170*4882a593Smuzhiyun 	void __iomem *base;
171*4882a593Smuzhiyun 	const struct uniphier_reset_data *data;
172*4882a593Smuzhiyun };
173*4882a593Smuzhiyun 
uniphier_reset_request(struct reset_ctl * reset_ctl)174*4882a593Smuzhiyun static int uniphier_reset_request(struct reset_ctl *reset_ctl)
175*4882a593Smuzhiyun {
176*4882a593Smuzhiyun 	return 0;
177*4882a593Smuzhiyun }
178*4882a593Smuzhiyun 
uniphier_reset_free(struct reset_ctl * reset_ctl)179*4882a593Smuzhiyun static int uniphier_reset_free(struct reset_ctl *reset_ctl)
180*4882a593Smuzhiyun {
181*4882a593Smuzhiyun 	return 0;
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun 
uniphier_reset_update(struct reset_ctl * reset_ctl,int assert)184*4882a593Smuzhiyun static int uniphier_reset_update(struct reset_ctl *reset_ctl, int assert)
185*4882a593Smuzhiyun {
186*4882a593Smuzhiyun 	struct uniphier_reset_priv *priv = dev_get_priv(reset_ctl->dev);
187*4882a593Smuzhiyun 	unsigned long id = reset_ctl->id;
188*4882a593Smuzhiyun 	const struct uniphier_reset_data *p;
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 	for (p = priv->data; p->id != UNIPHIER_RESET_ID_END; p++) {
191*4882a593Smuzhiyun 		u32 mask, val;
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun 		if (p->id != id)
194*4882a593Smuzhiyun 			continue;
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 		val = readl(priv->base + p->reg);
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun 		if (p->flags & UNIPHIER_RESET_ACTIVE_LOW)
199*4882a593Smuzhiyun 			assert = !assert;
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 		mask = BIT(p->bit);
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun 		if (assert)
204*4882a593Smuzhiyun 			val |= mask;
205*4882a593Smuzhiyun 		else
206*4882a593Smuzhiyun 			val &= ~mask;
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun 		writel(val, priv->base + p->reg);
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 		return 0;
211*4882a593Smuzhiyun 	}
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun 	dev_err(priv->dev, "reset_id=%lu was not handled\n", id);
214*4882a593Smuzhiyun 	return -EINVAL;
215*4882a593Smuzhiyun }
216*4882a593Smuzhiyun 
uniphier_reset_assert(struct reset_ctl * reset_ctl)217*4882a593Smuzhiyun static int uniphier_reset_assert(struct reset_ctl *reset_ctl)
218*4882a593Smuzhiyun {
219*4882a593Smuzhiyun 	return uniphier_reset_update(reset_ctl, 1);
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun 
uniphier_reset_deassert(struct reset_ctl * reset_ctl)222*4882a593Smuzhiyun static int uniphier_reset_deassert(struct reset_ctl *reset_ctl)
223*4882a593Smuzhiyun {
224*4882a593Smuzhiyun 	return uniphier_reset_update(reset_ctl, 0);
225*4882a593Smuzhiyun }
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun static const struct reset_ops uniphier_reset_ops = {
228*4882a593Smuzhiyun 	.request = uniphier_reset_request,
229*4882a593Smuzhiyun 	.free = uniphier_reset_free,
230*4882a593Smuzhiyun 	.rst_assert = uniphier_reset_assert,
231*4882a593Smuzhiyun 	.rst_deassert = uniphier_reset_deassert,
232*4882a593Smuzhiyun };
233*4882a593Smuzhiyun 
uniphier_reset_probe(struct udevice * dev)234*4882a593Smuzhiyun static int uniphier_reset_probe(struct udevice *dev)
235*4882a593Smuzhiyun {
236*4882a593Smuzhiyun 	struct uniphier_reset_priv *priv = dev_get_priv(dev);
237*4882a593Smuzhiyun 	fdt_addr_t addr;
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun 	addr = devfdt_get_addr(dev->parent);
240*4882a593Smuzhiyun 	if (addr == FDT_ADDR_T_NONE)
241*4882a593Smuzhiyun 		return -EINVAL;
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun 	priv->base = devm_ioremap(dev, addr, SZ_4K);
244*4882a593Smuzhiyun 	if (!priv->base)
245*4882a593Smuzhiyun 		return -ENOMEM;
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun 	priv->data = (void *)dev_get_driver_data(dev);
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun 	return 0;
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun static const struct udevice_id uniphier_reset_match[] = {
253*4882a593Smuzhiyun 	/* System reset */
254*4882a593Smuzhiyun 	{
255*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-ld4-reset",
256*4882a593Smuzhiyun 		.data = (ulong)uniphier_pro4_sys_reset_data,
257*4882a593Smuzhiyun 	},
258*4882a593Smuzhiyun 	{
259*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-pro4-reset",
260*4882a593Smuzhiyun 		.data = (ulong)uniphier_pro4_sys_reset_data,
261*4882a593Smuzhiyun 	},
262*4882a593Smuzhiyun 	{
263*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-sld8-reset",
264*4882a593Smuzhiyun 		.data = (ulong)uniphier_pro4_sys_reset_data,
265*4882a593Smuzhiyun 	},
266*4882a593Smuzhiyun 	{
267*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-pro5-reset",
268*4882a593Smuzhiyun 		.data = (ulong)uniphier_pro4_sys_reset_data,
269*4882a593Smuzhiyun 	},
270*4882a593Smuzhiyun 	{
271*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-pxs2-reset",
272*4882a593Smuzhiyun 		.data = (ulong)uniphier_pxs2_sys_reset_data,
273*4882a593Smuzhiyun 	},
274*4882a593Smuzhiyun 	{
275*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-ld11-reset",
276*4882a593Smuzhiyun 		.data = (ulong)uniphier_ld20_sys_reset_data,
277*4882a593Smuzhiyun 	},
278*4882a593Smuzhiyun 	{
279*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-ld20-reset",
280*4882a593Smuzhiyun 		.data = (ulong)uniphier_ld20_sys_reset_data,
281*4882a593Smuzhiyun 	},
282*4882a593Smuzhiyun 	{
283*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-pxs3-reset",
284*4882a593Smuzhiyun 		.data = (ulong)uniphier_pxs3_sys_reset_data,
285*4882a593Smuzhiyun 	},
286*4882a593Smuzhiyun 	/* Media I/O reset */
287*4882a593Smuzhiyun 	{
288*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-ld4-mio-reset",
289*4882a593Smuzhiyun 		.data = (ulong)uniphier_mio_reset_data,
290*4882a593Smuzhiyun 	},
291*4882a593Smuzhiyun 	{
292*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-pro4-mio-reset",
293*4882a593Smuzhiyun 		.data = (ulong)uniphier_mio_reset_data,
294*4882a593Smuzhiyun 	},
295*4882a593Smuzhiyun 	{
296*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-sld8-mio-reset",
297*4882a593Smuzhiyun 		.data = (ulong)uniphier_mio_reset_data,
298*4882a593Smuzhiyun 	},
299*4882a593Smuzhiyun 	{
300*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-pro5-mio-reset",
301*4882a593Smuzhiyun 		.data = (ulong)uniphier_mio_reset_data,
302*4882a593Smuzhiyun 	},
303*4882a593Smuzhiyun 	{
304*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-pxs2-mio-reset",
305*4882a593Smuzhiyun 		.data = (ulong)uniphier_mio_reset_data,
306*4882a593Smuzhiyun 	},
307*4882a593Smuzhiyun 	{
308*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-ld11-mio-reset",
309*4882a593Smuzhiyun 		.data = (ulong)uniphier_mio_reset_data,
310*4882a593Smuzhiyun 	},
311*4882a593Smuzhiyun 	{
312*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-ld11-sd-reset",
313*4882a593Smuzhiyun 		.data = (ulong)uniphier_mio_reset_data,
314*4882a593Smuzhiyun 	},
315*4882a593Smuzhiyun 	{
316*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-ld20-sd-reset",
317*4882a593Smuzhiyun 		.data = (ulong)uniphier_mio_reset_data,
318*4882a593Smuzhiyun 	},
319*4882a593Smuzhiyun 	{
320*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-pxs3-sd-reset",
321*4882a593Smuzhiyun 		.data = (ulong)uniphier_mio_reset_data,
322*4882a593Smuzhiyun 	},
323*4882a593Smuzhiyun 	/* Peripheral reset */
324*4882a593Smuzhiyun 	{
325*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-ld4-peri-reset",
326*4882a593Smuzhiyun 		.data = (ulong)uniphier_ld4_peri_reset_data,
327*4882a593Smuzhiyun 	},
328*4882a593Smuzhiyun 	{
329*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-pro4-peri-reset",
330*4882a593Smuzhiyun 		.data = (ulong)uniphier_pro4_peri_reset_data,
331*4882a593Smuzhiyun 	},
332*4882a593Smuzhiyun 	{
333*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-sld8-peri-reset",
334*4882a593Smuzhiyun 		.data = (ulong)uniphier_ld4_peri_reset_data,
335*4882a593Smuzhiyun 	},
336*4882a593Smuzhiyun 	{
337*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-pro5-peri-reset",
338*4882a593Smuzhiyun 		.data = (ulong)uniphier_pro4_peri_reset_data,
339*4882a593Smuzhiyun 	},
340*4882a593Smuzhiyun 	{
341*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-pxs2-peri-reset",
342*4882a593Smuzhiyun 		.data = (ulong)uniphier_pro4_peri_reset_data,
343*4882a593Smuzhiyun 	},
344*4882a593Smuzhiyun 	{
345*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-ld11-peri-reset",
346*4882a593Smuzhiyun 		.data = (ulong)uniphier_pro4_peri_reset_data,
347*4882a593Smuzhiyun 	},
348*4882a593Smuzhiyun 	{
349*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-ld20-peri-reset",
350*4882a593Smuzhiyun 		.data = (ulong)uniphier_pro4_peri_reset_data,
351*4882a593Smuzhiyun 	},
352*4882a593Smuzhiyun 	{
353*4882a593Smuzhiyun 		.compatible = "socionext,uniphier-pxs3-peri-reset",
354*4882a593Smuzhiyun 		.data = (ulong)uniphier_pro4_peri_reset_data,
355*4882a593Smuzhiyun 	},
356*4882a593Smuzhiyun 	{ /* sentinel */ }
357*4882a593Smuzhiyun };
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun U_BOOT_DRIVER(uniphier_reset) = {
360*4882a593Smuzhiyun 	.name = "uniphier-reset",
361*4882a593Smuzhiyun 	.id = UCLASS_RESET,
362*4882a593Smuzhiyun 	.of_match = uniphier_reset_match,
363*4882a593Smuzhiyun 	.probe = uniphier_reset_probe,
364*4882a593Smuzhiyun 	.priv_auto_alloc_size = sizeof(struct uniphier_reset_priv),
365*4882a593Smuzhiyun 	.ops = &uniphier_reset_ops,
366*4882a593Smuzhiyun };
367