1 // SPDX-License-Identifier: GPL-2.0
3 * Amlogic Meson Reset Controller driver
5 * Copyright (c) 2018 BayLibre, SAS.
6 * Author: Neil Armstrong <narmstrong@baylibre.com>
13 #include <reset-uclass.h>
15 #include <linux/bitops.h>
18 #define BITS_PER_REG 32
19 #define LEVEL_OFFSET 0x7c
21 struct meson_reset_priv {
22 struct regmap *regmap;
25 static int meson_reset_request(struct reset_ctl *reset_ctl)
27 if (reset_ctl->id > (REG_COUNT * BITS_PER_REG))
33 static int meson_reset_level(struct reset_ctl *reset_ctl, bool assert)
35 struct meson_reset_priv *priv = dev_get_priv(reset_ctl->dev);
36 uint bank = reset_ctl->id / BITS_PER_REG;
37 uint offset = reset_ctl->id % BITS_PER_REG;
38 uint reg_offset = LEVEL_OFFSET + (bank << 2);
41 regmap_read(priv->regmap, reg_offset, &val);
46 regmap_write(priv->regmap, reg_offset, val);
51 static int meson_reset_assert(struct reset_ctl *reset_ctl)
53 return meson_reset_level(reset_ctl, true);
56 static int meson_reset_deassert(struct reset_ctl *reset_ctl)
58 return meson_reset_level(reset_ctl, false);
61 struct reset_ops meson_reset_ops = {
62 .request = meson_reset_request,
63 .rst_assert = meson_reset_assert,
64 .rst_deassert = meson_reset_deassert,
67 static const struct udevice_id meson_reset_ids[] = {
68 { .compatible = "amlogic,meson-gxbb-reset" },
69 { .compatible = "amlogic,meson-axg-reset" },
73 static int meson_reset_probe(struct udevice *dev)
75 struct meson_reset_priv *priv = dev_get_priv(dev);
77 return regmap_init_mem(dev_ofnode(dev), &priv->regmap);
80 U_BOOT_DRIVER(meson_reset) = {
81 .name = "meson_reset",
83 .of_match = meson_reset_ids,
84 .probe = meson_reset_probe,
85 .ops = &meson_reset_ops,
86 .priv_auto = sizeof(struct meson_reset_priv),