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>
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 .rfree
= 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" },
73 { .compatible
= "amlogic,meson-axg-reset" },
77 static int meson_reset_probe(struct udevice
*dev
)
79 struct meson_reset_priv
*priv
= dev_get_priv(dev
);
81 return regmap_init_mem(dev_ofnode(dev
), &priv
->regmap
);
84 U_BOOT_DRIVER(meson_reset
) = {
85 .name
= "meson_reset",
87 .of_match
= meson_reset_ids
,
88 .probe
= meson_reset_probe
,
89 .ops
= &meson_reset_ops
,
90 .priv_auto_alloc_size
= sizeof(struct meson_reset_priv
),