cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

reset-uniphier.c (15370B)


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