diff options
author | Axel Heider <axel.heider@hensoldt.net> | 2022-11-19 17:09:59 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2023-01-05 12:14:43 +0000 |
commit | 3d4615812578ca9f120e6e42237c90f56ca6db87 (patch) | |
tree | c4744195130bf2eb8ea5bb0409e1e104bd740514 | |
parent | 2ca267fd36a275c771528bd5ae50ae8406155ad9 (diff) | |
download | qemu-3d4615812578ca9f120e6e42237c90f56ca6db87.zip qemu-3d4615812578ca9f120e6e42237c90f56ca6db87.tar.gz qemu-3d4615812578ca9f120e6e42237c90f56ca6db87.tar.bz2 |
hw/timer/imx_epit: hard reset initializes CR with 0
Signed-off-by: Axel Heider <axel.heider@hensoldt.net>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r-- | hw/timer/imx_epit.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/hw/timer/imx_epit.c b/hw/timer/imx_epit.c index 7af3a8b..39f4722 100644 --- a/hw/timer/imx_epit.c +++ b/hw/timer/imx_epit.c @@ -99,12 +99,14 @@ static void imx_epit_set_freq(IMXEPITState *s) /* * This is called both on hardware (device) reset and software reset. */ -static void imx_epit_reset(DeviceState *dev) +static void imx_epit_reset(IMXEPITState *s, bool is_hard_reset) { - IMXEPITState *s = IMX_EPIT(dev); - /* Soft reset doesn't touch some bits; hard reset clears them */ - s->cr &= (CR_EN|CR_ENMOD|CR_STOPEN|CR_DOZEN|CR_WAITEN|CR_DBGEN); + if (is_hard_reset) { + s->cr = 0; + } else { + s->cr &= (CR_EN|CR_ENMOD|CR_STOPEN|CR_DOZEN|CR_WAITEN|CR_DBGEN); + } s->sr = 0; s->lr = EPIT_TIMER_MAX; s->cmp = 0; @@ -205,7 +207,7 @@ static void imx_epit_write(void *opaque, hwaddr offset, uint64_t value, s->cr = value & 0x03ffffff; if (s->cr & CR_SWR) { /* handle the reset */ - imx_epit_reset(DEVICE(s)); + imx_epit_reset(s, false); } /* @@ -377,12 +379,18 @@ static void imx_epit_realize(DeviceState *dev, Error **errp) s->timer_cmp = ptimer_init(imx_epit_cmp, s, PTIMER_POLICY_LEGACY); } +static void imx_epit_dev_reset(DeviceState *dev) +{ + IMXEPITState *s = IMX_EPIT(dev); + imx_epit_reset(s, true); +} + static void imx_epit_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); dc->realize = imx_epit_realize; - dc->reset = imx_epit_reset; + dc->reset = imx_epit_dev_reset; dc->vmsd = &vmstate_imx_timer_epit; dc->desc = "i.MX periodic timer"; } |