summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/reset/reset-meson.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/reset/reset-meson.c b/drivers/reset/reset-meson.c
index 50bd2241ef2f..6a90613c8095 100644
--- a/drivers/reset/reset-meson.c
+++ b/drivers/reset/reset-meson.c
@@ -18,7 +18,9 @@
struct meson_reset_param {
unsigned int reg_count;
+ unsigned int reset_offset;
unsigned int level_offset;
+ bool level_low_reset;
};
struct meson_reset {
@@ -46,6 +48,7 @@ static int meson_reset_reset(struct reset_controller_dev *rcdev,
unsigned int offset, bit;
meson_reset_offset_and_bit(data, id, &offset, &bit);
+ offset += data->param->reset_offset;
return regmap_write(data->map, offset, BIT(bit));
}
@@ -59,9 +62,10 @@ static int meson_reset_level(struct reset_controller_dev *rcdev,
meson_reset_offset_and_bit(data, id, &offset, &bit);
offset += data->param->level_offset;
+ assert ^= data->param->level_low_reset;
return regmap_update_bits(data->map, offset,
- BIT(bit), assert ? 0 : BIT(bit));
+ BIT(bit), assert ? BIT(bit) : 0);
}
static int meson_reset_assert(struct reset_controller_dev *rcdev,
@@ -84,22 +88,30 @@ static const struct reset_control_ops meson_reset_ops = {
static const struct meson_reset_param meson8b_param = {
.reg_count = 8,
+ .reset_offset = 0x0,
.level_offset = 0x7c,
+ .level_low_reset = true,
};
static const struct meson_reset_param meson_a1_param = {
.reg_count = 3,
+ .reset_offset = 0x0,
.level_offset = 0x40,
+ .level_low_reset = true,
};
static const struct meson_reset_param meson_s4_param = {
.reg_count = 6,
+ .reset_offset = 0x0,
.level_offset = 0x40,
+ .level_low_reset = true,
};
static const struct meson_reset_param t7_param = {
.reg_count = 7,
+ .reset_offset = 0x0,
.level_offset = 0x40,
+ .level_low_reset = true,
};
static const struct of_device_id meson_reset_dt_ids[] = {