Commit 3b1fd90ed13ce9674de80cc1d1e1d7241d0f0796
1 parent
84ceea57
ETRAX-TIMER: qdevify.
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
Showing
4 changed files
with
38 additions
and
39 deletions
hw/axis_dev88.c
... | ... | @@ -316,12 +316,12 @@ void axisdev88_init (ram_addr_t ram_size, |
316 | 316 | } |
317 | 317 | |
318 | 318 | /* 2 timers. */ |
319 | - etraxfs_timer_init(env, irq + 0x1b, nmi + 1, 0x3001e000); | |
320 | - etraxfs_timer_init(env, irq + 0x1b, nmi + 1, 0x3005e000); | |
319 | + sysbus_create_varargs("etraxfs,timer", 0x3001e000, irq[0x1b], nmi[1], NULL); | |
320 | + sysbus_create_varargs("etraxfs,timer", 0x3005e000, irq[0x1b], nmi[1], NULL); | |
321 | 321 | |
322 | 322 | for (i = 0; i < 4; i++) { |
323 | 323 | sysbus_create_simple("etraxfs,serial", 0x30026000 + i * 0x2000, |
324 | - irq[0x14 + i]); | |
324 | + irq[0x14 + i]); | |
325 | 325 | } |
326 | 326 | |
327 | 327 | if (kernel_filename) { | ... | ... |
hw/etraxfs.c
... | ... | @@ -26,6 +26,7 @@ |
26 | 26 | #include "boards.h" |
27 | 27 | #include "sysemu.h" |
28 | 28 | #include "net.h" |
29 | +#include "flash.h" | |
29 | 30 | #include "etraxfs.h" |
30 | 31 | |
31 | 32 | #define FLASH_SIZE 0x2000000 |
... | ... | @@ -106,8 +107,8 @@ void bareetraxfs_init (ram_addr_t ram_size, |
106 | 107 | } |
107 | 108 | |
108 | 109 | /* 2 timers. */ |
109 | - etraxfs_timer_init(env, irq + 0x1b, nmi + 1, 0x3001e000); | |
110 | - etraxfs_timer_init(env, irq + 0x1b, nmi + 1, 0x3005e000); | |
110 | + sysbus_create_varargs("etraxfs,timer", 0x3001e000, irq[0x1b], nmi[1], NULL); | |
111 | + sysbus_create_varargs("etraxfs,timer", 0x3005e000, irq[0x1b], nmi[1], NULL); | |
111 | 112 | |
112 | 113 | for (i = 0; i < 4; i++) { |
113 | 114 | sysbus_create_simple("etraxfs,serial", 0x30026000 + i * 0x2000, | ... | ... |
hw/etraxfs.h
... | ... | @@ -25,9 +25,5 @@ |
25 | 25 | #include "etraxfs_dma.h" |
26 | 26 | |
27 | 27 | qemu_irq *etraxfs_pic_init(CPUState *env, target_phys_addr_t base); |
28 | -void etraxfs_timer_init(CPUState *env, qemu_irq *irqs, qemu_irq *nmi, | |
29 | - target_phys_addr_t base); | |
30 | 28 | void *etraxfs_eth_init(NICInfo *nd, CPUState *env, |
31 | 29 | qemu_irq *irq, target_phys_addr_t base, int phyaddr); |
32 | -//void etraxfs_ser_init(CPUState *env, qemu_irq *irq, CharDriverState *chr, | |
33 | -// target_phys_addr_t base); | ... | ... |
hw/etraxfs_timer.c
... | ... | @@ -21,12 +21,9 @@ |
21 | 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
22 | 22 | * THE SOFTWARE. |
23 | 23 | */ |
24 | -#include <stdio.h> | |
25 | -#include <sys/time.h> | |
26 | -#include "hw.h" | |
24 | +#include "sysbus.h" | |
27 | 25 | #include "sysemu.h" |
28 | 26 | #include "qemu-timer.h" |
29 | -#include "etraxfs.h" | |
30 | 27 | |
31 | 28 | #define D(x) |
32 | 29 | |
... | ... | @@ -44,10 +41,10 @@ |
44 | 41 | #define R_INTR 0x50 |
45 | 42 | #define R_MASKED_INTR 0x54 |
46 | 43 | |
47 | -struct fs_timer_t { | |
48 | - CPUState *env; | |
49 | - qemu_irq *irq; | |
50 | - qemu_irq *nmi; | |
44 | +struct etrax_timer { | |
45 | + SysBusDevice busdev; | |
46 | + qemu_irq irq; | |
47 | + qemu_irq nmi; | |
51 | 48 | |
52 | 49 | QEMUBH *bh_t0; |
53 | 50 | QEMUBH *bh_t1; |
... | ... | @@ -78,7 +75,7 @@ struct fs_timer_t { |
78 | 75 | |
79 | 76 | static uint32_t timer_readl (void *opaque, target_phys_addr_t addr) |
80 | 77 | { |
81 | - struct fs_timer_t *t = opaque; | |
78 | + struct etrax_timer *t = opaque; | |
82 | 79 | uint32_t r = 0; |
83 | 80 | |
84 | 81 | switch (addr) { |
... | ... | @@ -105,7 +102,7 @@ static uint32_t timer_readl (void *opaque, target_phys_addr_t addr) |
105 | 102 | } |
106 | 103 | |
107 | 104 | #define TIMER_SLOWDOWN 1 |
108 | -static void update_ctrl(struct fs_timer_t *t, int tnum) | |
105 | +static void update_ctrl(struct etrax_timer *t, int tnum) | |
109 | 106 | { |
110 | 107 | unsigned int op; |
111 | 108 | unsigned int freq; |
... | ... | @@ -172,38 +169,38 @@ static void update_ctrl(struct fs_timer_t *t, int tnum) |
172 | 169 | } |
173 | 170 | } |
174 | 171 | |
175 | -static void timer_update_irq(struct fs_timer_t *t) | |
172 | +static void timer_update_irq(struct etrax_timer *t) | |
176 | 173 | { |
177 | 174 | t->r_intr &= ~(t->rw_ack_intr); |
178 | 175 | t->r_masked_intr = t->r_intr & t->rw_intr_mask; |
179 | 176 | |
180 | 177 | D(printf("%s: masked_intr=%x\n", __func__, t->r_masked_intr)); |
181 | - qemu_set_irq(t->irq[0], !!t->r_masked_intr); | |
178 | + qemu_set_irq(t->irq, !!t->r_masked_intr); | |
182 | 179 | } |
183 | 180 | |
184 | 181 | static void timer0_hit(void *opaque) |
185 | 182 | { |
186 | - struct fs_timer_t *t = opaque; | |
183 | + struct etrax_timer *t = opaque; | |
187 | 184 | t->r_intr |= 1; |
188 | 185 | timer_update_irq(t); |
189 | 186 | } |
190 | 187 | |
191 | 188 | static void timer1_hit(void *opaque) |
192 | 189 | { |
193 | - struct fs_timer_t *t = opaque; | |
190 | + struct etrax_timer *t = opaque; | |
194 | 191 | t->r_intr |= 2; |
195 | 192 | timer_update_irq(t); |
196 | 193 | } |
197 | 194 | |
198 | 195 | static void watchdog_hit(void *opaque) |
199 | 196 | { |
200 | - struct fs_timer_t *t = opaque; | |
197 | + struct etrax_timer *t = opaque; | |
201 | 198 | if (t->wd_hits == 0) { |
202 | 199 | /* real hw gives a single tick before reseting but we are |
203 | 200 | a bit friendlier to compensate for our slower execution. */ |
204 | 201 | ptimer_set_count(t->ptimer_wd, 10); |
205 | 202 | ptimer_run(t->ptimer_wd, 1); |
206 | - qemu_irq_raise(t->nmi[0]); | |
203 | + qemu_irq_raise(t->nmi); | |
207 | 204 | } |
208 | 205 | else |
209 | 206 | qemu_system_reset_request(); |
... | ... | @@ -211,7 +208,7 @@ static void watchdog_hit(void *opaque) |
211 | 208 | t->wd_hits++; |
212 | 209 | } |
213 | 210 | |
214 | -static inline void timer_watchdog_update(struct fs_timer_t *t, uint32_t value) | |
211 | +static inline void timer_watchdog_update(struct etrax_timer *t, uint32_t value) | |
215 | 212 | { |
216 | 213 | unsigned int wd_en = t->rw_wd_ctrl & (1 << 8); |
217 | 214 | unsigned int wd_key = t->rw_wd_ctrl >> 9; |
... | ... | @@ -230,7 +227,7 @@ static inline void timer_watchdog_update(struct fs_timer_t *t, uint32_t value) |
230 | 227 | wd_en, new_key, wd_key, new_cmd, wd_cnt)); |
231 | 228 | |
232 | 229 | if (t->wd_hits) |
233 | - qemu_irq_lower(t->nmi[0]); | |
230 | + qemu_irq_lower(t->nmi); | |
234 | 231 | |
235 | 232 | t->wd_hits = 0; |
236 | 233 | |
... | ... | @@ -249,7 +246,7 @@ static inline void timer_watchdog_update(struct fs_timer_t *t, uint32_t value) |
249 | 246 | static void |
250 | 247 | timer_writel (void *opaque, target_phys_addr_t addr, uint32_t value) |
251 | 248 | { |
252 | - struct fs_timer_t *t = opaque; | |
249 | + struct etrax_timer *t = opaque; | |
253 | 250 | |
254 | 251 | switch (addr) |
255 | 252 | { |
... | ... | @@ -301,7 +298,7 @@ static CPUWriteMemoryFunc *timer_write[] = { |
301 | 298 | |
302 | 299 | static void etraxfs_timer_reset(void *opaque) |
303 | 300 | { |
304 | - struct fs_timer_t *t = opaque; | |
301 | + struct etrax_timer *t = opaque; | |
305 | 302 | |
306 | 303 | ptimer_stop(t->ptimer_t0); |
307 | 304 | ptimer_stop(t->ptimer_t1); |
... | ... | @@ -309,29 +306,34 @@ static void etraxfs_timer_reset(void *opaque) |
309 | 306 | t->rw_wd_ctrl = 0; |
310 | 307 | t->r_intr = 0; |
311 | 308 | t->rw_intr_mask = 0; |
312 | - qemu_irq_lower(t->irq[0]); | |
309 | + qemu_irq_lower(t->irq); | |
313 | 310 | } |
314 | 311 | |
315 | -void etraxfs_timer_init(CPUState *env, qemu_irq *irqs, qemu_irq *nmi, | |
316 | - target_phys_addr_t base) | |
312 | +static void etraxfs_timer_init(SysBusDevice *dev) | |
317 | 313 | { |
318 | - static struct fs_timer_t *t; | |
314 | + struct etrax_timer *t = FROM_SYSBUS(typeof (*t), dev); | |
319 | 315 | int timer_regs; |
320 | 316 | |
321 | - t = qemu_mallocz(sizeof *t); | |
322 | - | |
323 | 317 | t->bh_t0 = qemu_bh_new(timer0_hit, t); |
324 | 318 | t->bh_t1 = qemu_bh_new(timer1_hit, t); |
325 | 319 | t->bh_wd = qemu_bh_new(watchdog_hit, t); |
326 | 320 | t->ptimer_t0 = ptimer_init(t->bh_t0); |
327 | 321 | t->ptimer_t1 = ptimer_init(t->bh_t1); |
328 | 322 | t->ptimer_wd = ptimer_init(t->bh_wd); |
329 | - t->irq = irqs; | |
330 | - t->nmi = nmi; | |
331 | - t->env = env; | |
323 | + | |
324 | + sysbus_init_irq(dev, &t->irq); | |
325 | + sysbus_init_irq(dev, &t->nmi); | |
332 | 326 | |
333 | 327 | timer_regs = cpu_register_io_memory(0, timer_read, timer_write, t); |
334 | - cpu_register_physical_memory (base, 0x5c, timer_regs); | |
328 | + sysbus_init_mmio(dev, 0x5c, timer_regs); | |
335 | 329 | |
336 | 330 | qemu_register_reset(etraxfs_timer_reset, t); |
337 | 331 | } |
332 | + | |
333 | +static void etraxfs_timer_register(void) | |
334 | +{ | |
335 | + sysbus_register_dev("etraxfs,timer", sizeof (struct etrax_timer), | |
336 | + etraxfs_timer_init); | |
337 | +} | |
338 | + | |
339 | +device_init(etraxfs_timer_register) | ... | ... |