Lines Matching +full:- +full:- +full:local
4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
31 * | <-------------------------------------------------------------- |
32 * | --------------------------------------------frc---------------> |
37 * | -------------> |
47 * local timer contains two counters: TCNT and ICNT. TCNT == 0 -> ICNT--.
121 #define GET_G_COMP_IDX(offset) (((offset) - G_COMP0_L) / 0x10)
122 #define GET_G_COMP_ADD_INCR_IDX(offset) (((offset) - G_COMP0_ADD_INCR) / 0x10)
145 #define GET_L_TIMER_IDX(offset) ((((offset) & 0xF00) - L0_TCNTB) / 0x100)
147 (((offset) - (L0_TCNTB + 0x100 * (lt_i))) >> 2)
208 /* local timer */
211 qemu_irq irq; /* local timer irq */
368 s->count = count; in exynos4210_gfrc_set_count()
370 ptimer_set_count(s->ptimer_frc, count); in exynos4210_gfrc_set_count()
379 count = ptimer_get_count(s->ptimer_frc); in exynos4210_gfrc_get_count()
380 count = s->count - count; in exynos4210_gfrc_get_count()
381 return s->reg.cnt + count; in exynos4210_gfrc_get_count()
392 ptimer_stop(s->ptimer_frc); in exynos4210_gfrc_stop()
403 ptimer_run(s->ptimer_frc, 1); in exynos4210_gfrc_start()
412 ptimer_transaction_begin(s->ptimer_frc); in exynos4210_gfrc_tx_begin()
418 ptimer_transaction_commit(s->ptimer_frc); in exynos4210_gfrc_tx_commit()
438 gfrc = exynos4210_gfrc_get_count(&s->g_timer); in exynos4210_gcomp_find()
449 if (s->g_timer.reg.tcon & G_TCON_COMP_ENABLE(i)) { in exynos4210_gcomp_find()
453 if (s->g_timer.reg.comp[i] > gfrc) { in exynos4210_gcomp_find()
455 distance = s->g_timer.reg.comp[i] - gfrc; in exynos4210_gcomp_find()
464 if (s->g_timer.reg.comp[i] <= min) { in exynos4210_gcomp_find()
465 min = s->g_timer.reg.comp[i]; in exynos4210_gcomp_find()
474 res = -1; in exynos4210_gcomp_find()
487 s->g_timer.reg.comp[res], in exynos4210_gcomp_find()
500 if (id == -1) { in exynos4210_gcomp_get_distance()
504 if (s->g_timer.reg.comp[id] - s->g_timer.reg.cnt < MCT_GT_COUNTER_STEP) { in exynos4210_gcomp_get_distance()
505 return s->g_timer.reg.comp[id] - s->g_timer.reg.cnt; in exynos4210_gcomp_get_distance()
519 exynos4210_gfrc_stop(&s->g_timer); in exynos4210_gfrc_restart()
521 s->g_timer.curr_comp = exynos4210_gcomp_find(s); in exynos4210_gfrc_restart()
523 distance = exynos4210_gcomp_get_distance(s, s->g_timer.curr_comp); in exynos4210_gfrc_restart()
529 exynos4210_gfrc_set_count(&s->g_timer, distance); in exynos4210_gfrc_restart()
530 exynos4210_gfrc_start(&s->g_timer); in exynos4210_gfrc_restart()
541 if ((s->reg.int_cstat & G_INT_CSTAT_COMP(id)) && in exynos4210_gcomp_raise_irq()
542 (s->reg.int_enb & G_INT_ENABLE(id))) { in exynos4210_gcomp_raise_irq()
544 qemu_irq_raise(s->irq[id]); in exynos4210_gcomp_raise_irq()
554 qemu_irq_lower(s->irq[id]); in exynos4210_gcomp_lower_irq()
570 s->g_timer.reg.cnt += s->g_timer.count; in exynos4210_gfrc_event()
575 if (s->g_timer.reg.cnt == s->g_timer.reg.comp[i]) { in exynos4210_gfrc_event()
578 s->g_timer.reg.int_cstat |= G_INT_CSTAT_COMP(i); in exynos4210_gfrc_event()
581 if (s->g_timer.reg.tcon & G_TCON_AUTO_ICREMENT(i)) { in exynos4210_gfrc_event()
582 s->g_timer.reg.comp[i] += s->g_timer.reg.comp_add_incr[i]; in exynos4210_gfrc_event()
586 exynos4210_gcomp_raise_irq(&s->g_timer, i); in exynos4210_gfrc_event()
591 s->g_timer.curr_comp = exynos4210_gcomp_find(s); in exynos4210_gfrc_event()
592 distance = exynos4210_gcomp_get_distance(s, s->g_timer.curr_comp); in exynos4210_gfrc_event()
596 exynos4210_gfrc_set_count(&s->g_timer, distance); in exynos4210_gfrc_event()
598 exynos4210_gfrc_start(&s->g_timer); in exynos4210_gfrc_event()
602 * Get counter of FRC local timer.
606 return ptimer_get_count(s->ptimer_frc); in exynos4210_lfrc_get_count()
610 * Set counter of FRC local timer.
615 if (!s->reg.cnt[L_REG_CNT_FRCCNTB]) { in exynos4210_lfrc_update_count()
616 ptimer_set_count(s->ptimer_frc, MCT_LT_COUNTER_STEP); in exynos4210_lfrc_update_count()
618 ptimer_set_count(s->ptimer_frc, s->reg.cnt[L_REG_CNT_FRCCNTB]); in exynos4210_lfrc_update_count()
623 * Start local FRC timer
628 ptimer_run(s->ptimer_frc, 1); in exynos4210_lfrc_start()
632 * Stop local FRC timer
637 ptimer_stop(s->ptimer_frc); in exynos4210_lfrc_stop()
640 /* Start ptimer transaction for local FRC timer */
643 ptimer_transaction_begin(s->ptimer_frc); in exynos4210_lfrc_tx_begin()
646 /* Commit ptimer transaction for local FRC timer */
649 ptimer_transaction_commit(s->ptimer_frc); in exynos4210_lfrc_tx_commit()
653 * Local timer free running counter tick handler
659 /* local frc expired */ in exynos4210_lfrc_event()
663 s->reg.int_cstat |= L_INT_CSTAT_FRCCNT; in exynos4210_lfrc_event()
669 if (s->reg.int_enb & L_INT_INTENB_FRCEIE) { in exynos4210_lfrc_event()
670 qemu_irq_raise(s->irq); in exynos4210_lfrc_event()
682 * Action on enabling local tick int timer
686 if (!s->int_run) { in exynos4210_ltick_int_start()
687 s->int_run = 1; in exynos4210_ltick_int_start()
692 * Action on disabling local tick int timer
696 if (s->int_run) { in exynos4210_ltick_int_stop()
697 s->last_icnto = exynos4210_ltick_int_get_cnto(s); in exynos4210_ltick_int_stop()
698 s->int_run = 0; in exynos4210_ltick_int_stop()
713 count = ptimer_get_count(s->ptimer_tick); in exynos4210_ltick_int_get_cnto()
716 counted = s->count - ptimer_get_count(s->ptimer_tick); in exynos4210_ltick_int_get_cnto()
717 cur_progress = s->progress + counted; in exynos4210_ltick_int_get_cnto()
720 cur_progress = s->progress; in exynos4210_ltick_int_get_cnto()
723 remain = s->distance - cur_progress; in exynos4210_ltick_int_get_cnto()
725 if (!s->int_run) { in exynos4210_ltick_int_get_cnto()
727 icnto = s->last_icnto; in exynos4210_ltick_int_get_cnto()
730 icnto = remain / s->tcntb; in exynos4210_ltick_int_get_cnto()
737 * Start local tick cnt timer.
742 if (!s->cnt_run) { in exynos4210_ltick_cnt_start()
745 ptimer_set_count(s->ptimer_tick, s->count); in exynos4210_ltick_cnt_start()
746 ptimer_run(s->ptimer_tick, 1); in exynos4210_ltick_cnt_start()
748 s->cnt_run = 1; in exynos4210_ltick_cnt_start()
753 * Stop local tick cnt timer.
758 if (s->cnt_run) { in exynos4210_ltick_cnt_stop()
760 s->last_tcnto = exynos4210_ltick_cnt_get_cnto(s); in exynos4210_ltick_cnt_stop()
762 if (s->int_run) { in exynos4210_ltick_cnt_stop()
766 ptimer_stop(s->ptimer_tick); in exynos4210_ltick_cnt_stop()
768 s->cnt_run = 0; in exynos4210_ltick_cnt_stop()
772 /* Start ptimer transaction for local tick timer */
775 ptimer_transaction_begin(s->ptimer_tick); in exynos4210_ltick_tx_begin()
778 /* Commit ptimer transaction for local tick timer */
781 ptimer_transaction_commit(s->ptimer_tick); in exynos4210_ltick_tx_commit()
796 count = ptimer_get_count(s->ptimer_tick); in exynos4210_ltick_cnt_get_cnto()
799 counted = s->count - ptimer_get_count(s->ptimer_tick); in exynos4210_ltick_cnt_get_cnto()
800 cur_progress = s->progress + counted; in exynos4210_ltick_cnt_get_cnto()
803 cur_progress = s->progress; in exynos4210_ltick_cnt_get_cnto()
806 remain = s->distance - cur_progress; in exynos4210_ltick_cnt_get_cnto()
808 if (!s->cnt_run) { in exynos4210_ltick_cnt_get_cnto()
810 tcnto = s->last_tcnto; in exynos4210_ltick_cnt_get_cnto()
811 } else if (!s->int_run) { in exynos4210_ltick_cnt_get_cnto()
813 tcnto = remain % s->tcntb; in exynos4210_ltick_cnt_get_cnto()
816 icnto = remain / s->tcntb; in exynos4210_ltick_cnt_get_cnto()
818 tcnto = remain % ((uint64_t)icnto * s->tcntb); in exynos4210_ltick_cnt_get_cnto()
820 tcnto = remain % s->tcntb; in exynos4210_ltick_cnt_get_cnto()
837 if (s->cnt_run) { in exynos4210_ltick_set_cntb()
842 if (s->int_run) { in exynos4210_ltick_set_cntb()
847 s->tcntb = new_cnt + 1; in exynos4210_ltick_set_cntb()
848 s->icntb = new_int + 1; in exynos4210_ltick_set_cntb()
866 if ((s->cnt_run && s->last_tcnto) || (s->int_run && s->last_icnto)) { in exynos4210_ltick_recalc_count()
872 if (s->last_tcnto) { in exynos4210_ltick_recalc_count()
873 to_count = (uint64_t)s->last_tcnto * s->last_icnto; in exynos4210_ltick_recalc_count()
875 to_count = s->last_icnto; in exynos4210_ltick_recalc_count()
879 if (s->icntb) { in exynos4210_ltick_recalc_count()
880 s->distance = (uint64_t)s->tcntb * s->icntb; in exynos4210_ltick_recalc_count()
882 s->distance = s->tcntb; in exynos4210_ltick_recalc_count()
885 to_count = s->distance; in exynos4210_ltick_recalc_count()
886 s->progress = 0; in exynos4210_ltick_recalc_count()
891 s->count = MCT_LT_COUNTER_STEP; in exynos4210_ltick_recalc_count()
893 s->count = to_count; in exynos4210_ltick_recalc_count()
907 s->count = 0; in exynos4210_ltick_timer_init()
908 s->distance = 0; in exynos4210_ltick_timer_init()
909 s->progress = 0; in exynos4210_ltick_timer_init()
910 s->icntb = 0; in exynos4210_ltick_timer_init()
911 s->tcntb = 0; in exynos4210_ltick_timer_init()
920 s->progress += s->count; in exynos4210_ltick_timer_event()
924 * Local timer tick counter handler.
940 exynos4210_ltick_timer_event(&s->tick_timer); in exynos4210_ltick_event()
943 tcnto = exynos4210_ltick_cnt_get_cnto(&s->tick_timer); in exynos4210_ltick_event()
946 icnto = exynos4210_ltick_int_get_cnto(&s->tick_timer); in exynos4210_ltick_event()
949 if (!icnto && s->reg.tcon & L_TCON_INT_START) { in exynos4210_ltick_event()
952 s->reg.int_cstat |= L_INT_CSTAT_INTCNT; in exynos4210_ltick_event()
955 if (s->reg.int_enb & L_INT_INTENB_ICNTEIE) { in exynos4210_ltick_event()
957 time2[s->id] = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); in exynos4210_ltick_event()
958 DPRINTF("local timer[%d] IRQ: %llx\n", s->id, in exynos4210_ltick_event()
959 time2[s->id] - time1[s->id]); in exynos4210_ltick_event()
960 time1[s->id] = time2[s->id]; in exynos4210_ltick_event()
962 qemu_irq_raise(s->irq); in exynos4210_ltick_event()
966 if (s->reg.tcon & L_TCON_INTERVAL_MODE) { in exynos4210_ltick_event()
967 exynos4210_ltick_set_cntb(&s->tick_timer, in exynos4210_ltick_event()
968 s->reg.cnt[L_REG_CNT_TCNTB], in exynos4210_ltick_event()
969 s->reg.cnt[L_REG_CNT_ICNTB]); in exynos4210_ltick_event()
974 exynos4210_ltick_set_cntb(&s->tick_timer, in exynos4210_ltick_event()
975 s->reg.cnt[L_REG_CNT_TCNTB], in exynos4210_ltick_event()
981 exynos4210_ltick_cnt_start(&s->tick_timer); in exynos4210_ltick_event()
984 exynos4210_ltick_int_start(&s->tick_timer); in exynos4210_ltick_event()
1003 uint32_t freq = s->freq; in exynos4210_mct_update_freq()
1004 s->freq = 24000000 / in exynos4210_mct_update_freq()
1005 ((MCT_CFG_GET_PRESCALER(s->reg_mct_cfg) + 1) * in exynos4210_mct_update_freq()
1006 MCT_CFG_GET_DIVIDER(s->reg_mct_cfg)); in exynos4210_mct_update_freq()
1008 if (freq != s->freq) { in exynos4210_mct_update_freq()
1009 DPRINTF("freq=%uHz\n", s->freq); in exynos4210_mct_update_freq()
1012 tx_ptimer_set_freq(s->g_timer.ptimer_frc, s->freq); in exynos4210_mct_update_freq()
1014 /* local timer */ in exynos4210_mct_update_freq()
1015 tx_ptimer_set_freq(s->l_timer[0].tick_timer.ptimer_tick, s->freq); in exynos4210_mct_update_freq()
1016 tx_ptimer_set_freq(s->l_timer[0].ptimer_frc, s->freq); in exynos4210_mct_update_freq()
1017 tx_ptimer_set_freq(s->l_timer[1].tick_timer.ptimer_tick, s->freq); in exynos4210_mct_update_freq()
1018 tx_ptimer_set_freq(s->l_timer[1].ptimer_frc, s->freq); in exynos4210_mct_update_freq()
1028 s->reg_mct_cfg = 0; in exynos4210_mct_reset()
1031 memset(&s->g_timer.reg, 0, sizeof(s->g_timer.reg)); in exynos4210_mct_reset()
1032 exynos4210_gfrc_tx_begin(&s->g_timer); in exynos4210_mct_reset()
1033 exynos4210_gfrc_stop(&s->g_timer); in exynos4210_mct_reset()
1034 exynos4210_gfrc_tx_commit(&s->g_timer); in exynos4210_mct_reset()
1036 /* local timer */ in exynos4210_mct_reset()
1037 memset(s->l_timer[0].reg.cnt, 0, sizeof(s->l_timer[0].reg.cnt)); in exynos4210_mct_reset()
1038 memset(s->l_timer[1].reg.cnt, 0, sizeof(s->l_timer[1].reg.cnt)); in exynos4210_mct_reset()
1040 s->l_timer[i].reg.int_cstat = 0; in exynos4210_mct_reset()
1041 s->l_timer[i].reg.int_enb = 0; in exynos4210_mct_reset()
1042 s->l_timer[i].reg.tcon = 0; in exynos4210_mct_reset()
1043 s->l_timer[i].reg.wstat = 0; in exynos4210_mct_reset()
1044 s->l_timer[i].tick_timer.count = 0; in exynos4210_mct_reset()
1045 s->l_timer[i].tick_timer.distance = 0; in exynos4210_mct_reset()
1046 s->l_timer[i].tick_timer.progress = 0; in exynos4210_mct_reset()
1047 exynos4210_lfrc_tx_begin(&s->l_timer[i]); in exynos4210_mct_reset()
1048 ptimer_stop(s->l_timer[i].ptimer_frc); in exynos4210_mct_reset()
1049 exynos4210_lfrc_tx_commit(&s->l_timer[i]); in exynos4210_mct_reset()
1051 exynos4210_ltick_timer_init(&s->l_timer[i].tick_timer); in exynos4210_mct_reset()
1072 value = s->reg_mct_cfg; in exynos4210_mct_read()
1077 count = exynos4210_gfrc_get_count(&s->g_timer); in exynos4210_mct_read()
1083 value = s->g_timer.reg.cnt_wstat; in exynos4210_mct_read()
1090 value = UINT32_MAX & (s->g_timer.reg.comp[index] >> shift); in exynos4210_mct_read()
1094 value = s->g_timer.reg.tcon; in exynos4210_mct_read()
1098 value = s->g_timer.reg.int_cstat; in exynos4210_mct_read()
1102 value = s->g_timer.reg.int_enb; in exynos4210_mct_read()
1105 value = s->g_timer.reg.wstat; in exynos4210_mct_read()
1110 value = s->g_timer.reg.comp_add_incr[GET_G_COMP_ADD_INCR_IDX(offset)]; in exynos4210_mct_read()
1113 /* Local timers */ in exynos4210_mct_read()
1118 value = s->l_timer[lt_i].reg.cnt[index]; in exynos4210_mct_read()
1124 value = exynos4210_ltick_cnt_get_cnto(&s->l_timer[lt_i].tick_timer); in exynos4210_mct_read()
1125 DPRINTF("local timer[%d] read TCNTO %x\n", lt_i, value); in exynos4210_mct_read()
1131 value = exynos4210_ltick_int_get_cnto(&s->l_timer[lt_i].tick_timer); in exynos4210_mct_read()
1132 DPRINTF("local timer[%d] read ICNTO %x\n", lt_i, value); in exynos4210_mct_read()
1138 value = exynos4210_lfrc_get_count(&s->l_timer[lt_i]); in exynos4210_mct_read()
1142 lt_i = ((offset & 0xF00) - L0_TCNTB) / 0x100; in exynos4210_mct_read()
1143 value = s->l_timer[lt_i].reg.tcon; in exynos4210_mct_read()
1147 lt_i = ((offset & 0xF00) - L0_TCNTB) / 0x100; in exynos4210_mct_read()
1148 value = s->l_timer[lt_i].reg.int_cstat; in exynos4210_mct_read()
1152 lt_i = ((offset & 0xF00) - L0_TCNTB) / 0x100; in exynos4210_mct_read()
1153 value = s->l_timer[lt_i].reg.int_enb; in exynos4210_mct_read()
1157 lt_i = ((offset & 0xF00) - L0_TCNTB) / 0x100; in exynos4210_mct_read()
1158 value = s->l_timer[lt_i].reg.wstat; in exynos4210_mct_read()
1187 new_frc = s->g_timer.reg.cnt; in exynos4210_mct_write()
1192 s->reg_mct_cfg = value; in exynos4210_mct_write()
1202 new_frc = (s->g_timer.reg.cnt & (uint64_t)UINT32_MAX << 32) + value; in exynos4210_mct_write()
1203 s->g_timer.reg.cnt_wstat |= G_CNT_WSTAT_L; in exynos4210_mct_write()
1209 new_frc = (s->g_timer.reg.cnt & UINT32_MAX) + in exynos4210_mct_write()
1211 s->g_timer.reg.cnt_wstat |= G_CNT_WSTAT_U; in exynos4210_mct_write()
1214 s->g_timer.reg.cnt = new_frc; in exynos4210_mct_write()
1215 exynos4210_gfrc_tx_begin(&s->g_timer); in exynos4210_mct_write()
1217 exynos4210_gfrc_tx_commit(&s->g_timer); in exynos4210_mct_write()
1221 s->g_timer.reg.cnt_wstat &= ~(value); in exynos4210_mct_write()
1228 s->g_timer.reg.comp[index] = in exynos4210_mct_write()
1229 (s->g_timer.reg.comp[index] & in exynos4210_mct_write()
1236 s->g_timer.reg.wstat |= G_WSTAT_COMP_U(index); in exynos4210_mct_write()
1238 s->g_timer.reg.wstat |= G_WSTAT_COMP_L(index); in exynos4210_mct_write()
1241 exynos4210_gfrc_tx_begin(&s->g_timer); in exynos4210_mct_write()
1243 exynos4210_gfrc_tx_commit(&s->g_timer); in exynos4210_mct_write()
1247 old_val = s->g_timer.reg.tcon; in exynos4210_mct_write()
1248 s->g_timer.reg.tcon = value; in exynos4210_mct_write()
1249 s->g_timer.reg.wstat |= G_WSTAT_TCON_WRITE; in exynos4210_mct_write()
1253 exynos4210_gfrc_tx_begin(&s->g_timer); in exynos4210_mct_write()
1262 exynos4210_gfrc_stop(&s->g_timer); in exynos4210_mct_write()
1273 exynos4210_gfrc_tx_commit(&s->g_timer); in exynos4210_mct_write()
1277 s->g_timer.reg.int_cstat &= ~(value); in exynos4210_mct_write()
1280 exynos4210_gcomp_lower_irq(&s->g_timer, i); in exynos4210_mct_write()
1288 if ((value & G_INT_ENABLE(i)) > (s->g_timer.reg.tcon & in exynos4210_mct_write()
1290 if (s->g_timer.reg.int_cstat & G_INT_CSTAT_COMP(i)) { in exynos4210_mct_write()
1291 exynos4210_gcomp_raise_irq(&s->g_timer, i); in exynos4210_mct_write()
1295 if ((value & G_INT_ENABLE(i)) < (s->g_timer.reg.tcon & in exynos4210_mct_write()
1297 exynos4210_gcomp_lower_irq(&s->g_timer, i); in exynos4210_mct_write()
1302 s->g_timer.reg.int_enb = value; in exynos4210_mct_write()
1306 s->g_timer.reg.wstat &= ~(value); in exynos4210_mct_write()
1312 s->g_timer.reg.comp_add_incr[index] = value; in exynos4210_mct_write()
1313 s->g_timer.reg.wstat |= G_WSTAT_COMP_ADDINCR(index); in exynos4210_mct_write()
1316 /* Local timers */ in exynos4210_mct_write()
1319 old_val = s->l_timer[lt_i].reg.tcon; in exynos4210_mct_write()
1321 s->l_timer[lt_i].reg.wstat |= L_WSTAT_TCON_WRITE; in exynos4210_mct_write()
1322 s->l_timer[lt_i].reg.tcon = value; in exynos4210_mct_write()
1324 exynos4210_ltick_tx_begin(&s->l_timer[lt_i].tick_timer); in exynos4210_mct_write()
1325 /* Stop local CNT */ in exynos4210_mct_write()
1328 DPRINTF("local timer[%d] stop cnt\n", lt_i); in exynos4210_mct_write()
1329 exynos4210_ltick_cnt_stop(&s->l_timer[lt_i].tick_timer); in exynos4210_mct_write()
1332 /* Stop local INT */ in exynos4210_mct_write()
1335 DPRINTF("local timer[%d] stop int\n", lt_i); in exynos4210_mct_write()
1336 exynos4210_ltick_int_stop(&s->l_timer[lt_i].tick_timer); in exynos4210_mct_write()
1339 /* Start local CNT */ in exynos4210_mct_write()
1342 DPRINTF("local timer[%d] start cnt\n", lt_i); in exynos4210_mct_write()
1343 exynos4210_ltick_cnt_start(&s->l_timer[lt_i].tick_timer); in exynos4210_mct_write()
1346 /* Start local INT */ in exynos4210_mct_write()
1349 DPRINTF("local timer[%d] start int\n", lt_i); in exynos4210_mct_write()
1350 exynos4210_ltick_int_start(&s->l_timer[lt_i].tick_timer); in exynos4210_mct_write()
1352 exynos4210_ltick_tx_commit(&s->l_timer[lt_i].tick_timer); in exynos4210_mct_write()
1354 /* Start or Stop local FRC if TCON changed */ in exynos4210_mct_write()
1355 exynos4210_lfrc_tx_begin(&s->l_timer[lt_i]); in exynos4210_mct_write()
1357 (s->l_timer[lt_i].reg.tcon & L_TCON_FRC_START)) { in exynos4210_mct_write()
1358 DPRINTF("local timer[%d] start frc\n", lt_i); in exynos4210_mct_write()
1359 exynos4210_lfrc_start(&s->l_timer[lt_i]); in exynos4210_mct_write()
1362 (s->l_timer[lt_i].reg.tcon & L_TCON_FRC_START)) { in exynos4210_mct_write()
1363 DPRINTF("local timer[%d] stop frc\n", lt_i); in exynos4210_mct_write()
1364 exynos4210_lfrc_stop(&s->l_timer[lt_i]); in exynos4210_mct_write()
1366 exynos4210_lfrc_tx_commit(&s->l_timer[lt_i]); in exynos4210_mct_write()
1377 exynos4210_ltick_tx_begin(&s->l_timer[lt_i].tick_timer); in exynos4210_mct_write()
1378 exynos4210_ltick_set_cntb(&s->l_timer[lt_i].tick_timer, value, in exynos4210_mct_write()
1379 s->l_timer[lt_i].tick_timer.icntb); in exynos4210_mct_write()
1380 exynos4210_ltick_tx_commit(&s->l_timer[lt_i].tick_timer); in exynos4210_mct_write()
1382 s->l_timer[lt_i].reg.wstat |= L_WSTAT_TCNTB_WRITE; in exynos4210_mct_write()
1383 s->l_timer[lt_i].reg.cnt[L_REG_CNT_TCNTB] = value; in exynos4210_mct_write()
1392 DPRINTF("local timer[%d] TCNTB write %llx; max=%x, min=%x\n", in exynos4210_mct_write()
1400 s->l_timer[lt_i].reg.wstat |= L_WSTAT_ICNTB_WRITE; in exynos4210_mct_write()
1401 s->l_timer[lt_i].reg.cnt[L_REG_CNT_ICNTB] = value & in exynos4210_mct_write()
1408 if (s->l_timer[lt_i].reg.cnt[L_REG_CNT_ICNTB] * in exynos4210_mct_write()
1409 s->l_timer[lt_i].reg.cnt[L_REG_CNT_TCNTB] < MCT_LT_CNT_LOW_LIMIT) { in exynos4210_mct_write()
1410 if (!s->l_timer[lt_i].reg.cnt[L_REG_CNT_TCNTB]) { in exynos4210_mct_write()
1411 s->l_timer[lt_i].reg.cnt[L_REG_CNT_ICNTB] = in exynos4210_mct_write()
1414 s->l_timer[lt_i].reg.cnt[L_REG_CNT_ICNTB] = in exynos4210_mct_write()
1416 s->l_timer[lt_i].reg.cnt[L_REG_CNT_TCNTB]; in exynos4210_mct_write()
1421 exynos4210_ltick_set_cntb(&s->l_timer[lt_i].tick_timer, in exynos4210_mct_write()
1422 s->l_timer[lt_i].tick_timer.tcntb, in exynos4210_mct_write()
1423 s->l_timer[lt_i].reg.cnt[L_REG_CNT_ICNTB]); in exynos4210_mct_write()
1433 DPRINTF("local timer[%d] ICNTB write %llx; max=%x, min=%x\n\n", in exynos4210_mct_write()
1440 DPRINTF("local timer[%d] FRCNTB write %llx\n", lt_i, value); in exynos4210_mct_write()
1442 s->l_timer[lt_i].reg.wstat |= L_WSTAT_FRCCNTB_WRITE; in exynos4210_mct_write()
1443 s->l_timer[lt_i].reg.cnt[L_REG_CNT_FRCCNTB] = value; in exynos4210_mct_write()
1458 DPRINTF("local timer[%d] CSTAT write %llx\n", lt_i, value); in exynos4210_mct_write()
1460 s->l_timer[lt_i].reg.int_cstat &= ~value; in exynos4210_mct_write()
1461 if (!s->l_timer[lt_i].reg.int_cstat) { in exynos4210_mct_write()
1462 qemu_irq_lower(s->l_timer[lt_i].irq); in exynos4210_mct_write()
1468 old_val = s->l_timer[lt_i].reg.int_enb; in exynos4210_mct_write()
1470 /* Raise Local timer IRQ if cstat is pending */ in exynos4210_mct_write()
1472 if (s->l_timer[lt_i].reg.int_cstat & L_INT_CSTAT_INTCNT) { in exynos4210_mct_write()
1473 qemu_irq_raise(s->l_timer[lt_i].irq); in exynos4210_mct_write()
1477 s->l_timer[lt_i].reg.int_enb = value; in exynos4210_mct_write()
1484 s->l_timer[lt_i].reg.wstat &= ~value; in exynos4210_mct_write()
1508 s->g_timer.ptimer_frc = ptimer_init(exynos4210_gfrc_event, s, in exynos4210_mct_init()
1510 memset(&s->g_timer.reg, 0, sizeof(struct gregs)); in exynos4210_mct_init()
1512 /* Local timers */ in exynos4210_mct_init()
1514 s->l_timer[i].tick_timer.ptimer_tick = in exynos4210_mct_init()
1515 ptimer_init(exynos4210_ltick_event, &s->l_timer[i], in exynos4210_mct_init()
1517 s->l_timer[i].ptimer_frc = in exynos4210_mct_init()
1518 ptimer_init(exynos4210_lfrc_event, &s->l_timer[i], in exynos4210_mct_init()
1520 s->l_timer[i].id = i; in exynos4210_mct_init()
1525 sysbus_init_irq(dev, &s->g_timer.irq[i]); in exynos4210_mct_init()
1528 sysbus_init_irq(dev, &s->l_timer[i].irq); in exynos4210_mct_init()
1531 memory_region_init_io(&s->iomem, obj, &exynos4210_mct_ops, s, in exynos4210_mct_init()
1532 "exynos4210-mct", MCT_SFR_SIZE); in exynos4210_mct_init()
1533 sysbus_init_mmio(dev, &s->iomem); in exynos4210_mct_init()
1541 ptimer_free(s->g_timer.ptimer_frc); in exynos4210_mct_finalize()
1544 ptimer_free(s->l_timer[i].tick_timer.ptimer_tick); in exynos4210_mct_finalize()
1545 ptimer_free(s->l_timer[i].ptimer_frc); in exynos4210_mct_finalize()
1554 dc->vmsd = &vmstate_exynos4210_mct_state; in exynos4210_mct_class_init()