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[] = {