Revision f8b9fe24
b/hw/xilinx_spips.c | ||
---|---|---|
154 | 154 |
hwaddr lqspi_cached_addr; |
155 | 155 |
} XilinxSPIPS; |
156 | 156 |
|
157 |
#define TYPE_XILINX_SPIPS "xilinx,spips" |
|
158 |
|
|
159 |
#define XILINX_SPIPS(obj) \ |
|
160 |
OBJECT_CHECK(XilinxSPIPS, (obj), TYPE_XILINX_SPIPS) |
|
161 |
|
|
157 | 162 |
static inline int num_effective_busses(XilinxSPIPS *s) |
158 | 163 |
{ |
159 | 164 |
return (s->regs[R_LQSPI_CFG] & LQSPI_CFG_SEP_BUS && |
... | ... | |
210 | 215 |
|
211 | 216 |
static void xilinx_spips_reset(DeviceState *d) |
212 | 217 |
{ |
213 |
XilinxSPIPS *s = DO_UPCAST(XilinxSPIPS, busdev.qdev, d);
|
|
218 |
XilinxSPIPS *s = XILINX_SPIPS(d);
|
|
214 | 219 |
|
215 | 220 |
int i; |
216 | 221 |
for (i = 0; i < R_MAX; i++) { |
... | ... | |
500 | 505 |
} |
501 | 506 |
}; |
502 | 507 |
|
503 |
static int xilinx_spips_init(SysBusDevice *dev)
|
|
508 |
static void xilinx_spips_realize(DeviceState *dev, Error **errp)
|
|
504 | 509 |
{ |
505 |
XilinxSPIPS *s = FROM_SYSBUS(typeof(*s), dev); |
|
510 |
XilinxSPIPS *s = XILINX_SPIPS(dev); |
|
511 |
SysBusDevice *sbd = SYS_BUS_DEVICE(dev); |
|
506 | 512 |
int i; |
507 | 513 |
|
508 | 514 |
DB_PRINT("inited device model\n"); |
... | ... | |
511 | 517 |
for (i = 0; i < s->num_busses; ++i) { |
512 | 518 |
char bus_name[16]; |
513 | 519 |
snprintf(bus_name, 16, "spi%d", i); |
514 |
s->spi[i] = ssi_create_bus(&dev->qdev, bus_name);
|
|
520 |
s->spi[i] = ssi_create_bus(dev, bus_name); |
|
515 | 521 |
} |
516 | 522 |
|
517 | 523 |
s->cs_lines = g_new0(qemu_irq, s->num_cs * s->num_busses); |
518 | 524 |
ssi_auto_connect_slaves(DEVICE(s), s->cs_lines, s->spi[0]); |
519 | 525 |
ssi_auto_connect_slaves(DEVICE(s), s->cs_lines, s->spi[1]); |
520 |
sysbus_init_irq(dev, &s->irq);
|
|
526 |
sysbus_init_irq(sbd, &s->irq);
|
|
521 | 527 |
for (i = 0; i < s->num_cs * s->num_busses; ++i) { |
522 |
sysbus_init_irq(dev, &s->cs_lines[i]);
|
|
528 |
sysbus_init_irq(sbd, &s->cs_lines[i]);
|
|
523 | 529 |
} |
524 | 530 |
|
525 | 531 |
memory_region_init_io(&s->iomem, &spips_ops, s, "spi", R_MAX*4); |
526 |
sysbus_init_mmio(dev, &s->iomem);
|
|
532 |
sysbus_init_mmio(sbd, &s->iomem);
|
|
527 | 533 |
|
528 | 534 |
memory_region_init_io(&s->mmlqspi, &lqspi_ops, s, "lqspi", |
529 | 535 |
(1 << LQSPI_ADDRESS_BITS) * 2); |
530 |
sysbus_init_mmio(dev, &s->mmlqspi);
|
|
536 |
sysbus_init_mmio(sbd, &s->mmlqspi);
|
|
531 | 537 |
|
532 | 538 |
s->irqline = -1; |
533 | 539 |
s->lqspi_cached_addr = ~0ULL; |
534 | 540 |
|
535 | 541 |
fifo8_create(&s->rx_fifo, RXFF_A); |
536 | 542 |
fifo8_create(&s->tx_fifo, TXFF_A); |
537 |
|
|
538 |
return 0; |
|
539 | 543 |
} |
540 | 544 |
|
541 | 545 |
static int xilinx_spips_post_load(void *opaque, int version_id) |
... | ... | |
569 | 573 |
static void xilinx_spips_class_init(ObjectClass *klass, void *data) |
570 | 574 |
{ |
571 | 575 |
DeviceClass *dc = DEVICE_CLASS(klass); |
572 |
SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass); |
|
573 | 576 |
|
574 |
sdc->init = xilinx_spips_init;
|
|
577 |
dc->realize = xilinx_spips_realize;
|
|
575 | 578 |
dc->reset = xilinx_spips_reset; |
576 | 579 |
dc->props = xilinx_spips_properties; |
577 | 580 |
dc->vmsd = &vmstate_xilinx_spips; |
578 | 581 |
} |
579 | 582 |
|
580 | 583 |
static const TypeInfo xilinx_spips_info = { |
581 |
.name = "xilinx,spips",
|
|
584 |
.name = TYPE_XILINX_SPIPS,
|
|
582 | 585 |
.parent = TYPE_SYS_BUS_DEVICE, |
583 | 586 |
.instance_size = sizeof(XilinxSPIPS), |
584 | 587 |
.class_init = xilinx_spips_class_init, |
Also available in: Unified diff