2 * Amlogic Meson Reset Controller driver
4 * Copyright (c) 2018 BayLibre, SAS.
5 * Author: Neil Armstrong <narmstrong@baylibre.com>
7 * SPDX-License-Identifier: GPL-2.0
12 #include <reset-uclass.h>
16 #define BITS_PER_REG 32
17 #define LEVEL_OFFSET 0x7c
19 struct meson_reset_priv {
20 struct regmap *regmap;
23 static int meson_reset_request(struct reset_ctl *reset_ctl)
25 if (reset_ctl->id > (REG_COUNT * BITS_PER_REG))
31 static int meson_reset_free(struct reset_ctl *reset_ctl)
36 static int meson_reset_level(struct reset_ctl *reset_ctl, bool assert)
38 struct meson_reset_priv *priv = dev_get_priv(reset_ctl->dev);
39 uint bank = reset_ctl->id / BITS_PER_REG;
40 uint offset = reset_ctl->id % BITS_PER_REG;
41 uint reg_offset = LEVEL_OFFSET + (bank << 2);
44 regmap_read(priv->regmap, reg_offset, &val);
49 regmap_write(priv->regmap, reg_offset, val);
54 static int meson_reset_assert(struct reset_ctl *reset_ctl)
56 return meson_reset_level(reset_ctl, true);
59 static int meson_reset_deassert(struct reset_ctl *reset_ctl)
61 return meson_reset_level(reset_ctl, false);
64 struct reset_ops meson_reset_ops = {
65 .request = meson_reset_request,
66 .free = meson_reset_free,
67 .rst_assert = meson_reset_assert,
68 .rst_deassert = meson_reset_deassert,
71 static const struct udevice_id meson_reset_ids[] = {
72 { .compatible = "amlogic,meson-gxbb-reset" },
76 static int meson_reset_probe(struct udevice *dev)
78 struct meson_reset_priv *priv = dev_get_priv(dev);
80 return regmap_init_mem(dev, &priv->regmap);
83 U_BOOT_DRIVER(meson_reset) = {
84 .name = "meson_reset",
86 .of_match = meson_reset_ids,
87 .probe = meson_reset_probe,
88 .ops = &meson_reset_ops,
89 .priv_auto_alloc_size = sizeof(struct meson_reset_priv),