Commit 4a521089 authored by Robert Marko's avatar Robert Marko Committed by Bjorn Andersson

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: default avatarRobert Marko <robimarko@gmail.com>
Signed-off-by: default avatarBjorn Andersson <andersson@kernel.org>
Link: https://lore.kernel.org/r/20221107132901.489240-1-robimarko@gmail.com
parent e3ad6c3f
...@@ -30,7 +30,7 @@ qcom_reset_assert(struct reset_controller_dev *rcdev, unsigned long id) ...@@ -30,7 +30,7 @@ qcom_reset_assert(struct reset_controller_dev *rcdev, unsigned long id)
rst = to_qcom_reset_controller(rcdev); rst = to_qcom_reset_controller(rcdev);
map = &rst->reset_map[id]; 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); return regmap_update_bits(rst->regmap, map->reg, mask, mask);
} }
...@@ -44,7 +44,7 @@ qcom_reset_deassert(struct reset_controller_dev *rcdev, unsigned long id) ...@@ -44,7 +44,7 @@ qcom_reset_deassert(struct reset_controller_dev *rcdev, unsigned long id)
rst = to_qcom_reset_controller(rcdev); rst = to_qcom_reset_controller(rcdev);
map = &rst->reset_map[id]; 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); return regmap_update_bits(rst->regmap, map->reg, mask, 0);
} }
......
...@@ -12,6 +12,7 @@ struct qcom_reset_map { ...@@ -12,6 +12,7 @@ struct qcom_reset_map {
unsigned int reg; unsigned int reg;
u8 bit; u8 bit;
u8 udelay; u8 udelay;
u32 bitmask;
}; };
struct regmap; struct regmap;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment