Lines Matching +full:s +full:- +full:mode

15 #include "hw/qdev-clock.h"
16 #include "hw/timer/stellaris-gptm.h"
18 static void gptm_update_irq(gptm_state *s) in gptm_update_irq() argument
21 level = (s->state & s->mask) != 0; in gptm_update_irq()
22 qemu_set_irq(s->irq, level); in gptm_update_irq()
25 static void gptm_stop(gptm_state *s, int n) in gptm_stop() argument
27 timer_del(s->timer[n]); in gptm_stop()
30 static void gptm_reload(gptm_state *s, int n, int reset) in gptm_reload() argument
36 tick = s->tick[n]; in gptm_reload()
39 if (s->config == 0) { in gptm_reload()
40 /* 32-bit CountDown. */ in gptm_reload()
42 count = s->load[0] | (s->load[1] << 16); in gptm_reload()
43 tick += clock_ticks_to_ns(s->clk, count); in gptm_reload()
44 } else if (s->config == 1) { in gptm_reload()
45 /* 32-bit RTC. 1Hz tick. */ in gptm_reload()
47 } else if (s->mode[n] == 0xa) { in gptm_reload()
48 /* PWM mode. Not implemented. */ in gptm_reload()
51 "GPTM: 16-bit timer mode unimplemented: 0x%x\n", in gptm_reload()
52 s->mode[n]); in gptm_reload()
55 s->tick[n] = tick; in gptm_reload()
56 timer_mod(s->timer[n], tick); in gptm_reload()
62 gptm_state *s; in gptm_tick() local
65 s = *p; in gptm_tick()
66 n = p - s->opaque; in gptm_tick()
67 if (s->config == 0) { in gptm_tick()
68 s->state |= 1; in gptm_tick()
69 if ((s->control & 0x20)) { in gptm_tick()
71 qemu_irq_pulse(s->trigger); in gptm_tick()
73 if (s->mode[0] & 1) { in gptm_tick()
74 /* One-shot. */ in gptm_tick()
75 s->control &= ~1; in gptm_tick()
78 gptm_reload(s, 0, 0); in gptm_tick()
80 } else if (s->config == 1) { in gptm_tick()
83 s->rtc++; in gptm_tick()
84 match = s->match[0] | (s->match[1] << 16); in gptm_tick()
85 if (s->rtc > match) in gptm_tick()
86 s->rtc = 0; in gptm_tick()
87 if (s->rtc == 0) { in gptm_tick()
88 s->state |= 8; in gptm_tick()
90 gptm_reload(s, 0, 0); in gptm_tick()
91 } else if (s->mode[n] == 0xa) { in gptm_tick()
92 /* PWM mode. Not implemented. */ in gptm_tick()
95 "GPTM: 16-bit timer mode unimplemented: 0x%x\n", in gptm_tick()
96 s->mode[n]); in gptm_tick()
98 gptm_update_irq(s); in gptm_tick()
104 gptm_state *s = (gptm_state *)opaque; in gptm_read() local
108 return s->config; in gptm_read()
110 return s->mode[0]; in gptm_read()
112 return s->mode[1]; in gptm_read()
114 return s->control; in gptm_read()
116 return s->mask; in gptm_read()
118 return s->state; in gptm_read()
120 return s->state & s->mask; in gptm_read()
124 return s->load[0] | ((s->config < 4) ? (s->load[1] << 16) : 0); in gptm_read()
126 return s->load[1]; in gptm_read()
128 return s->match[0] | ((s->config < 4) ? (s->match[1] << 16) : 0); in gptm_read()
130 return s->match[1]; in gptm_read()
132 return s->prescale[0]; in gptm_read()
134 return s->prescale[1]; in gptm_read()
136 return s->match_prescale[0]; in gptm_read()
138 return s->match_prescale[1]; in gptm_read()
140 if (s->config == 1) { in gptm_read()
141 return s->rtc; in gptm_read()
161 gptm_state *s = (gptm_state *)opaque; in gptm_write() local
171 s->config = value; in gptm_write()
174 s->mode[0] = value; in gptm_write()
177 s->mode[1] = value; in gptm_write()
180 oldval = s->control; in gptm_write()
181 s->control = value; in gptm_write()
185 gptm_reload(s, 0, 1); in gptm_write()
187 gptm_stop(s, 0); in gptm_write()
190 if (((oldval ^ value) & 0x100) && s->config >= 4) { in gptm_write()
192 gptm_reload(s, 1, 1); in gptm_write()
194 gptm_stop(s, 1); in gptm_write()
199 s->mask = value & 0x77; in gptm_write()
200 gptm_update_irq(s); in gptm_write()
203 s->state &= ~value; in gptm_write()
206 s->load[0] = value & 0xffff; in gptm_write()
207 if (s->config < 4) { in gptm_write()
208 s->load[1] = value >> 16; in gptm_write()
212 s->load[1] = value & 0xffff; in gptm_write()
215 s->match[0] = value & 0xffff; in gptm_write()
216 if (s->config < 4) { in gptm_write()
217 s->match[1] = value >> 16; in gptm_write()
221 s->match[1] = value >> 16; in gptm_write()
224 s->prescale[0] = value; in gptm_write()
227 s->prescale[1] = value; in gptm_write()
230 s->match_prescale[0] = value; in gptm_write()
233 s->match_prescale[0] = value; in gptm_write()
240 gptm_update_irq(s); in gptm_write()
255 VMSTATE_UINT32_ARRAY(mode, gptm_state, 2),
275 gptm_state *s = STELLARIS_GPTM(obj); in stellaris_gptm_init() local
278 sysbus_init_irq(sbd, &s->irq); in stellaris_gptm_init()
279 qdev_init_gpio_out(dev, &s->trigger, 1); in stellaris_gptm_init()
281 memory_region_init_io(&s->iomem, obj, &gptm_ops, s, in stellaris_gptm_init()
283 sysbus_init_mmio(sbd, &s->iomem); in stellaris_gptm_init()
285 s->opaque[0] = s->opaque[1] = s; in stellaris_gptm_init()
291 * ptimer instead of hand-rolling its own timer. This would also in stellaris_gptm_init()
295 s->clk = qdev_init_clock_in(dev, "clk", NULL, NULL, 0); in stellaris_gptm_init()
300 gptm_state *s = STELLARIS_GPTM(dev); in stellaris_gptm_realize() local
302 if (!clock_has_source(s->clk)) { in stellaris_gptm_realize()
303 error_setg(errp, "stellaris-gptm: clk must be connected"); in stellaris_gptm_realize()
307 s->timer[0] = timer_new_ns(QEMU_CLOCK_VIRTUAL, gptm_tick, &s->opaque[0]); in stellaris_gptm_realize()
308 s->timer[1] = timer_new_ns(QEMU_CLOCK_VIRTUAL, gptm_tick, &s->opaque[1]); in stellaris_gptm_realize()
315 dc->vmsd = &vmstate_stellaris_gptm; in stellaris_gptm_class_init()
316 dc->realize = stellaris_gptm_realize; in stellaris_gptm_class_init()