mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-27 17:18:59 +00:00
60 lines
2.0 KiB
Diff
60 lines
2.0 KiB
Diff
|
From 813ba3e427671ba3ff35c825087b03f0ad91cf02 Mon Sep 17 00:00:00 2001
|
||
|
From: Robert Marko <robimarko@gmail.com>
|
||
|
Date: Mon, 7 Nov 2022 14:28:59 +0100
|
||
|
Subject: [PATCH] clk: qcom: reset: support resetting multiple bits
|
||
|
|
||
|
This patch adds the support for giving the complete bitmask
|
||
|
in reset structure and reset operation will use this bitmask
|
||
|
for all reset operations.
|
||
|
|
||
|
Currently, reset structure only takes a single bit for each reset
|
||
|
and then calculates the bitmask by using the BIT() macro.
|
||
|
|
||
|
However, this is not sufficient anymore for newer SoC-s like IPQ8074,
|
||
|
IPQ6018 and more, since their networking resets require multiple bits
|
||
|
to be asserted in order to properly reset the HW block completely.
|
||
|
|
||
|
So, in order to allow asserting multiple bits add "bitmask" field to
|
||
|
qcom_reset_map, and then use that bitmask value if its populated in the
|
||
|
driver, if its not populated, then we just default to existing behaviour
|
||
|
and calculate the bitmask on the fly.
|
||
|
|
||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||
|
Link: https://lore.kernel.org/r/20221107132901.489240-1-robimarko@gmail.com
|
||
|
---
|
||
|
drivers/clk/qcom/reset.c | 4 ++--
|
||
|
drivers/clk/qcom/reset.h | 1 +
|
||
|
2 files changed, 3 insertions(+), 2 deletions(-)
|
||
|
|
||
|
--- a/drivers/clk/qcom/reset.c
|
||
|
+++ b/drivers/clk/qcom/reset.c
|
||
|
@@ -30,7 +30,7 @@ qcom_reset_assert(struct reset_controlle
|
||
|
|
||
|
rst = to_qcom_reset_controller(rcdev);
|
||
|
map = &rst->reset_map[id];
|
||
|
- mask = BIT(map->bit);
|
||
|
+ mask = map->bitmask ? map->bitmask : BIT(map->bit);
|
||
|
|
||
|
return regmap_update_bits(rst->regmap, map->reg, mask, mask);
|
||
|
}
|
||
|
@@ -44,7 +44,7 @@ qcom_reset_deassert(struct reset_control
|
||
|
|
||
|
rst = to_qcom_reset_controller(rcdev);
|
||
|
map = &rst->reset_map[id];
|
||
|
- mask = BIT(map->bit);
|
||
|
+ mask = map->bitmask ? map->bitmask : BIT(map->bit);
|
||
|
|
||
|
return regmap_update_bits(rst->regmap, map->reg, mask, 0);
|
||
|
}
|
||
|
--- a/drivers/clk/qcom/reset.h
|
||
|
+++ b/drivers/clk/qcom/reset.h
|
||
|
@@ -12,6 +12,7 @@ struct qcom_reset_map {
|
||
|
unsigned int reg;
|
||
|
u8 bit;
|
||
|
u8 udelay;
|
||
|
+ u32 bitmask;
|
||
|
};
|
||
|
|
||
|
struct regmap;
|