summaryrefslogtreecommitdiff
path: root/drivers/reset/reset-ast2500.c
diff options
context:
space:
mode:
authorJoel Stanley <joel@jms.id.au>2022-06-23 14:40:37 +0930
committerTom Rini <trini@konsulko.com>2022-07-06 14:30:51 -0400
commit0a8bd97f883c554a4137b4f3a88d0d638c4d1b31 (patch)
treefc32a1e14a9a0c1f437ec9b075b522a2fa02a7b0 /drivers/reset/reset-ast2500.c
parentb45768ebfe11109b995adc65ea7b5dc7228b7ed4 (diff)
reset/aspeed: Implement status callback
The I2C driver shares a reset line between buses, so allow it to test the state of the reset line before resetting it. Signed-off-by: Joel Stanley <joel@jms.id.au> Reviewed-by: Ryan Chen <ryan_chen@aspeedtech.com>
Diffstat (limited to 'drivers/reset/reset-ast2500.c')
-rw-r--r--drivers/reset/reset-ast2500.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/reset/reset-ast2500.c b/drivers/reset/reset-ast2500.c
index 0a1dd236aff..d9cecf3a72e 100644
--- a/drivers/reset/reset-ast2500.c
+++ b/drivers/reset/reset-ast2500.c
@@ -48,6 +48,24 @@ static int ast2500_reset_deassert(struct reset_ctl *reset_ctl)
return 0;
}
+static int ast2500_reset_status(struct reset_ctl *reset_ctl)
+{
+ struct ast2500_reset_priv *priv = dev_get_priv(reset_ctl->dev);
+ struct ast2500_scu *scu = priv->scu;
+ int status;
+
+ debug("%s: reset_ctl->id: %lu\n", __func__, reset_ctl->id);
+
+ if (reset_ctl->id < 32)
+ status = BIT(reset_ctl->id) & readl(&scu->sysreset_ctrl1);
+ else
+ status = BIT(reset_ctl->id - 32) & readl(&scu->sysreset_ctrl2);
+
+ return !!status;
+}
+
+
+
static int ast2500_reset_probe(struct udevice *dev)
{
int rc;
@@ -79,6 +97,7 @@ static const struct udevice_id ast2500_reset_ids[] = {
struct reset_ops ast2500_reset_ops = {
.rst_assert = ast2500_reset_assert,
.rst_deassert = ast2500_reset_deassert,
+ .rst_status = ast2500_reset_status,
};
U_BOOT_DRIVER(ast2500_reset) = {