*/
int64_t offset_toy;
int64_t offset_rtc;
- uint64_t save_toy_mon;
- uint64_t save_toy_year;
- uint64_t save_rtc;
int64_t data;
int tidx;
uint32_t toymatch[3];
return val;
}
-static inline uint64_t toy_time_to_val_year(struct tm tm)
-{
- uint64_t year;
-
- year = tm.tm_year;
- return year;
-}
-
static inline void toymatch_val_to_time(LS7ARtcState *s, uint64_t val, struct tm *tm)
{
qemu_get_timedate(tm, s->offset_toy);
static void ls7a_toy_stop(LS7ARtcState *s)
{
int i;
- struct tm tm;
- /*
- * save time when disabled toy,
- * because toy time not add counters.
- */
- qemu_get_timedate(&tm, s->offset_toy);
- s->save_toy_mon = toy_time_to_val_mon(tm);
- s->save_toy_year = toy_time_to_val_year(tm);
/* delete timers, and when re-enabled, recaculate expire time */
for (i = 0; i < TIMER_NUMS; i++) {
static void ls7a_rtc_stop(LS7ARtcState *s)
{
int i;
- uint64_t time;
-
- /* save rtc time */
- time = ls7a_rtc_ticks() + s->offset_rtc;
- s->save_rtc = time;
/* delete timers, and when re-enabled, recaculate expire time */
for (i = 0; i < TIMER_NUMS; i++) {
int i;
uint64_t expire_time, now;
struct tm tm = {};
- /*
- * need to recaculate toy offset
- * and expire time when enable it.
- */
- toy_val_to_time_mon(s->save_toy_mon, &tm);
- toy_val_to_time_year(s->save_toy_year, &tm);
- s->offset_toy = qemu_timedate_diff(&tm);
now = qemu_clock_get_ms(rtc_clock);
/* recaculate expire time and enable timer */
static void ls7a_rtc_start(LS7ARtcState *s)
{
int i;
- uint64_t expire_time, now;
-
- /*
- * need to recaculate rtc offset
- * and expire time when enable it.
- */
- now = ls7a_rtc_ticks();
- s->offset_rtc = s->save_rtc - now;
+ uint64_t expire_time;
/* recaculate expire time and enable timer */
for (i = 0; i < TIMER_NUMS; i++) {
switch (addr) {
case SYS_TOYREAD0:
- /* if toy disabled, read save toy time */
if (toy_enabled(s)) {
qemu_get_timedate(&tm, s->offset_toy);
val = toy_time_to_val_mon(tm);
} else {
- /* read save mon val */
- val = s->save_toy_mon;
+ /* return 0 when toy disabled */
+ val = 0;
}
break;
case SYS_TOYREAD1:
- /* if toy disabled, read save toy time */
if (toy_enabled(s)) {
qemu_get_timedate(&tm, s->offset_toy);
val = tm.tm_year;
} else {
- /* read save year val */
- val = s->save_toy_year;
+ /* return 0 when toy disabled */
+ val = 0;
}
break;
case SYS_TOYMATCH0:
val = s->cntrctl;
break;
case SYS_RTCREAD0:
- /* if rtc disabled, read save rtc time */
if (rtc_enabled(s)) {
val = ls7a_rtc_ticks() + s->offset_rtc;
} else {
- val = s->save_rtc;
+ /* return 0 when rtc disabled */
+ val = 0;
}
break;
case SYS_RTCMATCH0:
}
d->offset_toy = 0;
d->offset_rtc = 0;
- d->save_toy_mon = 0;
- d->save_toy_year = 0;
- d->save_rtc = 0;
}
.fields = (VMStateField[]) {
VMSTATE_INT64(offset_toy, LS7ARtcState),
VMSTATE_INT64(offset_rtc, LS7ARtcState),
- VMSTATE_UINT64(save_toy_mon, LS7ARtcState),
- VMSTATE_UINT64(save_toy_year, LS7ARtcState),
- VMSTATE_UINT64(save_rtc, LS7ARtcState),
VMSTATE_UINT32_ARRAY(toymatch, LS7ARtcState, TIMER_NUMS),
VMSTATE_UINT32_ARRAY(rtcmatch, LS7ARtcState, TIMER_NUMS),
VMSTATE_UINT32(cntrctl, LS7ARtcState),