struct meson_reset_param {
        unsigned int reg_count;
+       unsigned int reset_offset;
        unsigned int level_offset;
+       bool level_low_reset;
 };
 
 struct meson_reset {
        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));
 }
 
        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,
 
 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[] = {