Revision e1f8c729 hw/pxa2xx_pic.c

b/hw/pxa2xx_pic.c
10 10

  
11 11
#include "hw.h"
12 12
#include "pxa.h"
13
#include "sysbus.h"
13 14

  
14 15
#define ICIP	0x00	/* Interrupt Controller IRQ Pending register */
15 16
#define ICMR	0x04	/* Interrupt Controller Mask register */
......
31 32
#define PXA2XX_PIC_SRCS	40
32 33

  
33 34
typedef struct {
35
    SysBusDevice busdev;
34 36
    CPUState *cpu_env;
35 37
    uint32_t int_enabled[2];
36 38
    uint32_t int_pending[2];
......
241 243
    pxa2xx_pic_mem_write,
242 244
};
243 245

  
244
static void pxa2xx_pic_save(QEMUFile *f, void *opaque)
246
static int pxa2xx_pic_post_load(void *opaque, int version_id)
245 247
{
246
    PXA2xxPICState *s = (PXA2xxPICState *) opaque;
247
    int i;
248

  
249
    for (i = 0; i < 2; i ++)
250
        qemu_put_be32s(f, &s->int_enabled[i]);
251
    for (i = 0; i < 2; i ++)
252
        qemu_put_be32s(f, &s->int_pending[i]);
253
    for (i = 0; i < 2; i ++)
254
        qemu_put_be32s(f, &s->is_fiq[i]);
255
    qemu_put_be32s(f, &s->int_idle);
256
    for (i = 0; i < PXA2XX_PIC_SRCS; i ++)
257
        qemu_put_be32s(f, &s->priority[i]);
258
}
259

  
260
static int pxa2xx_pic_load(QEMUFile *f, void *opaque, int version_id)
261
{
262
    PXA2xxPICState *s = (PXA2xxPICState *) opaque;
263
    int i;
264

  
265
    for (i = 0; i < 2; i ++)
266
        qemu_get_be32s(f, &s->int_enabled[i]);
267
    for (i = 0; i < 2; i ++)
268
        qemu_get_be32s(f, &s->int_pending[i]);
269
    for (i = 0; i < 2; i ++)
270
        qemu_get_be32s(f, &s->is_fiq[i]);
271
    qemu_get_be32s(f, &s->int_idle);
272
    for (i = 0; i < PXA2XX_PIC_SRCS; i ++)
273
        qemu_get_be32s(f, &s->priority[i]);
274

  
275 248
    pxa2xx_pic_update(opaque);
276 249
    return 0;
277 250
}
278 251

  
279
qemu_irq *pxa2xx_pic_init(target_phys_addr_t base, CPUState *env)
252
DeviceState *pxa2xx_pic_init(target_phys_addr_t base, CPUState *env)
280 253
{
281
    PXA2xxPICState *s;
254
    DeviceState *dev = qdev_create(NULL, "pxa2xx_pic");
282 255
    int iomemtype;
283
    qemu_irq *qi;
284

  
285
    s = (PXA2xxPICState *)
286
            qemu_mallocz(sizeof(PXA2xxPICState));
287
    if (!s)
288
        return NULL;
256
    PXA2xxPICState *s = FROM_SYSBUS(PXA2xxPICState, sysbus_from_qdev(dev));
289 257

  
290 258
    s->cpu_env = env;
291 259

  
......
296 264
    s->is_fiq[0] = 0;
297 265
    s->is_fiq[1] = 0;
298 266

  
299
    qi = qemu_allocate_irqs(pxa2xx_pic_set_irq, s, PXA2XX_PIC_SRCS);
267
    qdev_init_nofail(dev);
268

  
269
    qdev_init_gpio_in(dev, pxa2xx_pic_set_irq, PXA2XX_PIC_SRCS);
300 270

  
301 271
    /* Enable IC memory-mapped registers access.  */
302 272
    iomemtype = cpu_register_io_memory(pxa2xx_pic_readfn,
303 273
                    pxa2xx_pic_writefn, s, DEVICE_NATIVE_ENDIAN);
304
    cpu_register_physical_memory(base, 0x00100000, iomemtype);
274
    sysbus_init_mmio(sysbus_from_qdev(dev), 0x00100000, iomemtype);
305 275

  
306 276
    /* Enable IC coprocessor access.  */
307 277
    cpu_arm_set_cp_io(env, 6, pxa2xx_pic_cp_read, pxa2xx_pic_cp_write, s);
308 278

  
309
    register_savevm(NULL, "pxa2xx_pic", 0, 0, pxa2xx_pic_save,
310
                    pxa2xx_pic_load, s);
279
    return dev;
280
}
281

  
282
static VMStateDescription vmstate_pxa2xx_pic_regs = {
283
    .name = "pxa2xx_pic",
284
    .version_id = 0,
285
    .minimum_version_id = 0,
286
    .minimum_version_id_old = 0,
287
    .post_load = pxa2xx_pic_post_load,
288
    .fields = (VMStateField[]) {
289
        VMSTATE_UINT32_ARRAY(int_enabled, PXA2xxPICState, 2),
290
        VMSTATE_UINT32_ARRAY(int_pending, PXA2xxPICState, 2),
291
        VMSTATE_UINT32_ARRAY(is_fiq, PXA2xxPICState, 2),
292
        VMSTATE_UINT32(int_idle, PXA2xxPICState),
293
        VMSTATE_UINT32_ARRAY(priority, PXA2xxPICState, PXA2XX_PIC_SRCS),
294
        VMSTATE_END_OF_LIST(),
295
    },
296
};
311 297

  
312
    return qi;
298
static int pxa2xx_pic_initfn(SysBusDevice *dev)
299
{
300
    return 0;
301
}
302

  
303
static SysBusDeviceInfo pxa2xx_pic_info = {
304
    .init       = pxa2xx_pic_initfn,
305
    .qdev.name  = "pxa2xx_pic",
306
    .qdev.desc  = "PXA2xx PIC",
307
    .qdev.size  = sizeof(PXA2xxPICState),
308
    .qdev.vmsd  = &vmstate_pxa2xx_pic_regs,
309
};
310

  
311
static void pxa2xx_pic_register(void)
312
{
313
    sysbus_register_withprop(&pxa2xx_pic_info);
313 314
}
315
device_init(pxa2xx_pic_register);

Also available in: Unified diff