Lines Matching +full:lock +full:- +full:offset
13 * This is a model of the "APB watchdog" which is part of the Cortex-M
14 * System Design Kit (CMSDK) and documented in the Cortex-M System
31 #include "hw/qdev-properties.h"
33 #include "hw/qdev-clock.h"
34 #include "hw/watchdog/cmsdk-apb-watchdog.h"
88 return s->intstatus && (s->control & R_WDOGCONTROL_INTEN_MASK); in cmsdk_apb_watchdog_intstatus()
94 return s->resetstatus && (s->control & R_WDOGCONTROL_RESEN_MASK); in cmsdk_apb_watchdog_resetstatus()
102 if (s->itcr) { in cmsdk_apb_watchdog_update()
104 * Not checking that !s->is_luminary since s->itcr can't be written in cmsdk_apb_watchdog_update()
105 * when s->is_luminary in the first place. in cmsdk_apb_watchdog_update()
107 wdogint = s->itop & R_WDOGITOP_WDOGINT_MASK; in cmsdk_apb_watchdog_update()
108 wdogres = s->itop & R_WDOGITOP_WDOGRES_MASK; in cmsdk_apb_watchdog_update()
114 qemu_set_irq(s->wdogint, wdogint); in cmsdk_apb_watchdog_update()
120 static uint64_t cmsdk_apb_watchdog_read(void *opaque, hwaddr offset, in cmsdk_apb_watchdog_read() argument
126 switch (offset) { in cmsdk_apb_watchdog_read()
128 r = ptimer_get_limit(s->timer); in cmsdk_apb_watchdog_read()
131 r = ptimer_get_count(s->timer); in cmsdk_apb_watchdog_read()
134 r = s->control; in cmsdk_apb_watchdog_read()
137 r = s->intstatus; in cmsdk_apb_watchdog_read()
143 r = s->lock; in cmsdk_apb_watchdog_read()
146 if (s->is_luminary) { in cmsdk_apb_watchdog_read()
149 r = s->itcr; in cmsdk_apb_watchdog_read()
152 r = s->id[(offset - A_PID4) / 4]; in cmsdk_apb_watchdog_read()
156 if (s->is_luminary) { in cmsdk_apb_watchdog_read()
160 "CMSDK APB watchdog read: read of WO offset %x\n", in cmsdk_apb_watchdog_read()
161 (int)offset); in cmsdk_apb_watchdog_read()
165 if (!s->is_luminary) { in cmsdk_apb_watchdog_read()
175 "CMSDK APB watchdog read: bad offset %x\n", (int)offset); in cmsdk_apb_watchdog_read()
179 trace_cmsdk_apb_watchdog_read(offset, r, size); in cmsdk_apb_watchdog_read()
183 static void cmsdk_apb_watchdog_write(void *opaque, hwaddr offset, in cmsdk_apb_watchdog_write() argument
188 trace_cmsdk_apb_watchdog_write(offset, value, size); in cmsdk_apb_watchdog_write()
190 if (s->lock && offset != A_WDOGLOCK) { in cmsdk_apb_watchdog_write()
197 switch (offset) { in cmsdk_apb_watchdog_write()
200 ptimer_transaction_begin(s->timer); in cmsdk_apb_watchdog_write()
201 ptimer_set_limit(s->timer, value, 1); in cmsdk_apb_watchdog_write()
202 ptimer_transaction_commit(s->timer); in cmsdk_apb_watchdog_write()
205 uint32_t prev_control = s->control; in cmsdk_apb_watchdog_write()
206 if (s->is_luminary && 0 != (R_WDOGCONTROL_INTEN_MASK & s->control)) { in cmsdk_apb_watchdog_write()
214 s->control = value & R_WDOGCONTROL_VALID_MASK; in cmsdk_apb_watchdog_write()
215 if (R_WDOGCONTROL_INTEN_MASK & (s->control ^ prev_control)) { in cmsdk_apb_watchdog_write()
216 ptimer_transaction_begin(s->timer); in cmsdk_apb_watchdog_write()
217 if (R_WDOGCONTROL_INTEN_MASK & s->control) { in cmsdk_apb_watchdog_write()
223 ptimer_set_count(s->timer, ptimer_get_limit(s->timer)); in cmsdk_apb_watchdog_write()
224 ptimer_run(s->timer, 0); in cmsdk_apb_watchdog_write()
227 ptimer_stop(s->timer); in cmsdk_apb_watchdog_write()
229 ptimer_transaction_commit(s->timer); in cmsdk_apb_watchdog_write()
235 s->intstatus = 0; in cmsdk_apb_watchdog_write()
236 ptimer_transaction_begin(s->timer); in cmsdk_apb_watchdog_write()
237 ptimer_set_count(s->timer, ptimer_get_limit(s->timer)); in cmsdk_apb_watchdog_write()
238 ptimer_transaction_commit(s->timer); in cmsdk_apb_watchdog_write()
242 s->lock = (value != WDOG_UNLOCK_VALUE); in cmsdk_apb_watchdog_write()
243 trace_cmsdk_apb_watchdog_lock(s->lock); in cmsdk_apb_watchdog_write()
246 if (s->is_luminary) { in cmsdk_apb_watchdog_write()
249 s->itcr = value & R_WDOGITCR_VALID_MASK; in cmsdk_apb_watchdog_write()
253 if (s->is_luminary) { in cmsdk_apb_watchdog_write()
256 s->itop = value & R_WDOGITOP_VALID_MASK; in cmsdk_apb_watchdog_write()
264 "CMSDK APB watchdog write: write to RO offset 0x%x\n", in cmsdk_apb_watchdog_write()
265 (int)offset); in cmsdk_apb_watchdog_write()
268 if (!s->is_luminary) { in cmsdk_apb_watchdog_write()
277 "CMSDK APB watchdog write: bad offset 0x%x\n", in cmsdk_apb_watchdog_write()
278 (int)offset); in cmsdk_apb_watchdog_write()
287 /* byte/halfword accesses are just zero-padded on reads and writes */
298 if (!s->intstatus) { in cmsdk_apb_watchdog_tick()
300 s->intstatus = R_WDOGRIS_INT_MASK; in cmsdk_apb_watchdog_tick()
303 s->resetstatus = 1; in cmsdk_apb_watchdog_tick()
304 ptimer_stop(s->timer); in cmsdk_apb_watchdog_tick()
314 s->control = 0; in cmsdk_apb_watchdog_reset()
315 s->intstatus = 0; in cmsdk_apb_watchdog_reset()
316 s->lock = 0; in cmsdk_apb_watchdog_reset()
317 s->itcr = 0; in cmsdk_apb_watchdog_reset()
318 s->itop = 0; in cmsdk_apb_watchdog_reset()
319 s->resetstatus = 0; in cmsdk_apb_watchdog_reset()
321 ptimer_transaction_begin(s->timer); in cmsdk_apb_watchdog_reset()
328 ptimer_stop(s->timer); in cmsdk_apb_watchdog_reset()
329 ptimer_set_limit(s->timer, 0xffffffff, 1); in cmsdk_apb_watchdog_reset()
330 ptimer_transaction_commit(s->timer); in cmsdk_apb_watchdog_reset()
337 ptimer_transaction_begin(s->timer); in cmsdk_apb_watchdog_clk_update()
338 ptimer_set_period_from_clock(s->timer, s->wdogclk, 1); in cmsdk_apb_watchdog_clk_update()
339 ptimer_transaction_commit(s->timer); in cmsdk_apb_watchdog_clk_update()
347 memory_region_init_io(&s->iomem, obj, &cmsdk_apb_watchdog_ops, in cmsdk_apb_watchdog_init()
348 s, "cmsdk-apb-watchdog", 0x1000); in cmsdk_apb_watchdog_init()
349 sysbus_init_mmio(sbd, &s->iomem); in cmsdk_apb_watchdog_init()
350 sysbus_init_irq(sbd, &s->wdogint); in cmsdk_apb_watchdog_init()
351 s->wdogclk = qdev_init_clock_in(DEVICE(s), "WDOGCLK", in cmsdk_apb_watchdog_init()
355 s->is_luminary = false; in cmsdk_apb_watchdog_init()
356 s->id = cmsdk_apb_watchdog_id; in cmsdk_apb_watchdog_init()
363 if (!clock_has_source(s->wdogclk)) { in cmsdk_apb_watchdog_realize()
369 s->timer = ptimer_init(cmsdk_apb_watchdog_tick, s, in cmsdk_apb_watchdog_realize()
375 ptimer_transaction_begin(s->timer); in cmsdk_apb_watchdog_realize()
376 ptimer_set_period_from_clock(s->timer, s->wdogclk, 1); in cmsdk_apb_watchdog_realize()
377 ptimer_transaction_commit(s->timer); in cmsdk_apb_watchdog_realize()
381 .name = "cmsdk-apb-watchdog",
389 VMSTATE_UINT32(lock, CMSDKAPBWatchdog),
401 dc->realize = cmsdk_apb_watchdog_realize; in cmsdk_apb_watchdog_class_init()
402 dc->vmsd = &cmsdk_apb_watchdog_vmstate; in cmsdk_apb_watchdog_class_init()
418 s->is_luminary = true; in luminary_watchdog_init()
419 s->id = luminary_watchdog_id; in luminary_watchdog_init()