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(priv->regmap, 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, 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, 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(priv->regmap, p->reg, &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(dev->of_node); /* parent should be syscon node */ 357 regmap = syscon_node_to_regmap(parent); 358 of_node_put(parent); 359 if (IS_ERR(regmap)) { 360 dev_err(dev, "failed to get regmap (error %ld)\n", 361 PTR_ERR(regmap)); 362 return PTR_ERR(regmap); 363 } 364 365 priv = devm_kzalloc(dev, 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(&pdev->dev, &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