Revision aa9311d8

b/hw/integratorcp.c
458 458
    ram_addr_t ram_offset;
459 459
    qemu_irq *pic;
460 460
    qemu_irq *cpu_pic;
461
    int sd;
462 461

  
463 462
    if (!cpu_model)
464 463
        cpu_model = "arm926";
......
487 486
    icp_control_init(0xcb000000);
488 487
    sysbus_create_simple("pl050_keyboard", 0x18000000, pic[3]);
489 488
    sysbus_create_simple("pl050_mouse", 0x19000000, pic[4]);
490
    sd = drive_get_index(IF_SD, 0, 0);
491
    if (sd == -1) {
492
        fprintf(stderr, "qemu: missing SecureDigital card\n");
493
        exit(1);
494
    }
495
    pl181_init(0x1c000000, drives_table[sd].bdrv, pic[23], pic[24]);
489
    sysbus_create_varargs("pl181", 0x1c000000, pic[23], pic[24], NULL);
496 490
    if (nd_table[0].vlan)
497 491
        smc91c111_init(&nd_table[0], 0xc8000000, pic[27]);
498 492

  
b/hw/pl181.c
7 7
 * This code is licenced under the GPL.
8 8
 */
9 9

  
10
#include "hw.h"
11
#include "primecell.h"
10
#include "sysbus.h"
12 11
#include "sd.h"
12
#include "sysemu.h"
13 13

  
14 14
//#define DEBUG_PL181 1
15 15

  
......
23 23
#define PL181_FIFO_LEN 16
24 24

  
25 25
typedef struct {
26
    SysBusDevice busdev;
26 27
    SDState *card;
27 28
    uint32_t clock;
28 29
    uint32_t power;
......
444 445
    s->mask[1] = 0;
445 446
}
446 447

  
447
void pl181_init(uint32_t base, BlockDriverState *bd,
448
                qemu_irq irq0, qemu_irq irq1)
448
static void pl181_init(SysBusDevice *dev)
449 449
{
450 450
    int iomemtype;
451
    pl181_state *s;
451
    pl181_state *s = FROM_SYSBUS(pl181_state, dev);
452
    BlockDriverState *bd;
452 453

  
453
    s = (pl181_state *)qemu_mallocz(sizeof(pl181_state));
454 454
    iomemtype = cpu_register_io_memory(0, pl181_readfn,
455 455
                                       pl181_writefn, s);
456
    cpu_register_physical_memory(base, 0x00001000, iomemtype);
456
    sysbus_init_mmio(dev, 0x1000, iomemtype);
457
    sysbus_init_irq(dev, &s->irq[0]);
458
    sysbus_init_irq(dev, &s->irq[1]);
459
    bd = qdev_init_bdrv(&dev->qdev, IF_SD);
457 460
    s->card = sd_init(bd, 0);
458
    s->irq[0] = irq0;
459
    s->irq[1] = irq1;
460 461
    qemu_register_reset(pl181_reset, s);
461 462
    pl181_reset(s);
462 463
    /* ??? Save/restore.  */
463 464
}
465

  
466
static void pl181_register_devices(void)
467
{
468
    sysbus_register_dev("pl181", sizeof(pl181_state), pl181_init);
469
}
470

  
471
device_init(pl181_register_devices)
b/hw/primecell.h
17 17
/* pl080.c */
18 18
void *pl080_init(uint32_t base, qemu_irq irq, int nchannels);
19 19

  
20
/* pl181.c */
21
void pl181_init(uint32_t base, BlockDriverState *bd,
22
                qemu_irq irq0, qemu_irq irq1);
23

  
24 20
/* pl190.c */
25 21
qemu_irq *pl190_init(uint32_t base, qemu_irq irq, qemu_irq fiq);
26 22

  
b/hw/realview.c
38 38
    int done_smc = 0;
39 39
    qemu_irq cpu_irq[4];
40 40
    int ncpu;
41
    int index;
42 41

  
43 42
    if (!cpu_model)
44 43
        cpu_model = "arm926";
......
97 96

  
98 97
    sysbus_create_simple("pl110_versatile", 0x10020000, pic[23]);
99 98

  
100
    index = drive_get_index(IF_SD, 0, 0);
101
    if (index == -1) {
102
        fprintf(stderr, "qemu: missing SecureDigital card\n");
103
        exit(1);
104
    }
105
    pl181_init(0x10005000, drives_table[index].bdrv, pic[17], pic[18]);
99
    sysbus_create_varargs("pl181", 0x10005000, pic[17], pic[18], NULL);
106 100

  
107 101
    sysbus_create_simple("pl031", 0x10017000, pic[10]);
108 102

  
b/hw/versatilepb.c
167 167
    NICInfo *nd;
168 168
    int n;
169 169
    int done_smc = 0;
170
    int index;
171 170

  
172 171
    if (!cpu_model)
173 172
        cpu_model = "arm926";
......
224 223
       that includes hardware cursor support from the PL111.  */
225 224
    sysbus_create_simple("pl110_versatile", 0x10120000, pic[16]);
226 225

  
227
    index = drive_get_index(IF_SD, 0, 0);
228
    if (index == -1) {
229
        fprintf(stderr, "qemu: missing SecureDigital card\n");
230
        exit(1);
231
    }
232

  
233
    pl181_init(0x10005000, drives_table[index].bdrv, sic[22], sic[1]);
234
#if 0
235
    /* Disabled because there's no way of specifying a block device.  */
236
    pl181_init(0x1000b000, NULL, sic, 23, 2);
237
#endif
226
    sysbus_create_varargs("pl181", 0x10005000, sic[22], sic[1], NULL);
227
    sysbus_create_varargs("pl181", 0x1000b000, sic[23], sic[2], NULL);
238 228

  
239 229
    /* Add PL031 Real Time Clock. */
240 230
    sysbus_create_simple("pl031", 0x101e8000, pic[10]);

Also available in: Unified diff