isa: Use realizefn for ISADevice

Drop ISADeviceClass::init and the resulting no-op initfn and let
children implement their own realizefn. Adapt error handling.
Split off an instance_init where sensible.

Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
Andreas Färber 2012-11-25 02:37:14 +01:00
parent a3dcca567a
commit db895a1e6a
34 changed files with 292 additions and 243 deletions

View file

@ -283,21 +283,21 @@ static void Adlib_fini (AdlibState *s)
AUD_remove_card (&s->card);
}
static int Adlib_initfn (ISADevice *dev)
static void adlib_realizefn (DeviceState *dev, Error **errp)
{
AdlibState *s = ADLIB(dev);
struct audsettings as;
if (glob_adlib) {
dolog ("Cannot create more than 1 adlib device\n");
return -1;
error_setg (errp, "Cannot create more than 1 adlib device");
return;
}
glob_adlib = s;
#ifdef HAS_YMF262
if (YMF262Init (1, 14318180, s->freq)) {
dolog ("YMF262Init %d failed\n", s->freq);
return -1;
error_setg (errp, "YMF262Init %d failed", s->freq);
return;
}
else {
YMF262SetTimerHandler (0, timer_handler, 0);
@ -306,8 +306,8 @@ static int Adlib_initfn (ISADevice *dev)
#else
s->opl = OPLCreate (OPL_TYPE_YM3812, 3579545, s->freq);
if (!s->opl) {
dolog ("OPLCreate %d failed\n", s->freq);
return -1;
error_setg (errp, "OPLCreate %d failed", s->freq);
return;
}
else {
OPLSetTimerHandler (s->opl, timer_handler, 0);
@ -332,7 +332,8 @@ static int Adlib_initfn (ISADevice *dev)
);
if (!s->voice) {
Adlib_fini (s);
return -1;
error_setg (errp, "Initializing audio voice failed");
return;
}
s->samples = AUD_get_buffer_size_out (s->voice) >> SHIFT;
@ -346,8 +347,6 @@ static int Adlib_initfn (ISADevice *dev)
register_ioport_read (s->port + 8, 2, 1, adlib_read, s);
register_ioport_write (s->port + 8, 2, 1, adlib_write, s);
return 0;
}
static Property adlib_properties[] = {
@ -359,8 +358,8 @@ static Property adlib_properties[] = {
static void adlib_class_initfn (ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS (klass);
ISADeviceClass *ic = ISA_DEVICE_CLASS (klass);
ic->init = Adlib_initfn;
dc->realize = adlib_realizefn;
dc->desc = ADLIB_DESC;
dc->props = adlib_properties;
}

View file

@ -644,19 +644,25 @@ static const MemoryRegionOps cs_ioport_ops = {
}
};
static int cs4231a_initfn (ISADevice *dev)
static void cs4231a_initfn (Object *obj)
{
CSState *s = CS4231A (dev);
isa_init_irq (dev, &s->pic, s->irq);
CSState *s = CS4231A (obj);
memory_region_init_io (&s->ioports, &cs_ioport_ops, s, "cs4231a", 4);
isa_register_ioport (dev, &s->ioports, s->port);
}
static void cs4231a_realizefn (DeviceState *dev, Error **errp)
{
ISADevice *d = ISA_DEVICE (dev);
CSState *s = CS4231A (dev);
isa_init_irq (d, &s->pic, s->irq);
isa_register_ioport (d, &s->ioports, s->port);
DMA_register_channel (s->dma, cs_dma_read, s);
AUD_register_card ("cs4231a", &s->card);
return 0;
}
static int cs4231a_init (ISABus *bus)
@ -675,8 +681,8 @@ static Property cs4231a_properties[] = {
static void cs4231a_class_initfn (ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS (klass);
ISADeviceClass *ic = ISA_DEVICE_CLASS (klass);
ic->init = cs4231a_initfn;
dc->realize = cs4231a_realizefn;
dc->reset = cs4231a_reset;
dc->desc = "Crystal Semiconductor CS4231A";
dc->vmsd = &vmstate_cs4231a;
@ -687,6 +693,7 @@ static const TypeInfo cs4231a_info = {
.name = TYPE_CS4231A,
.parent = TYPE_ISA_DEVICE,
.instance_size = sizeof (CSState),
.instance_init = cs4231a_initfn,
.class_init = cs4231a_class_initfn,
};

View file

@ -251,8 +251,9 @@ static const MemoryRegionPortio gus_portio_list2[] = {
PORTIO_END_OF_LIST (),
};
static int gus_initfn (ISADevice *dev)
static void gus_realizefn (DeviceState *dev, Error **errp)
{
ISADevice *d = ISA_DEVICE(dev);
GUSState *s = GUS (dev);
struct audsettings as;
@ -274,26 +275,25 @@ static int gus_initfn (ISADevice *dev)
if (!s->voice) {
AUD_remove_card (&s->card);
return -1;
error_setg(errp, "No voice");
return;
}
s->shift = 2;
s->samples = AUD_get_buffer_size_out (s->voice) >> s->shift;
s->mixbuf = g_malloc0 (s->samples << s->shift);
isa_register_portio_list (dev, s->port, gus_portio_list1, s, "gus");
isa_register_portio_list (dev, (s->port + 0x100) & 0xf00,
isa_register_portio_list (d, s->port, gus_portio_list1, s, "gus");
isa_register_portio_list (d, (s->port + 0x100) & 0xf00,
gus_portio_list2, s, "gus");
DMA_register_channel (s->emu.gusdma, GUS_read_DMA, s);
s->emu.himemaddr = s->himem;
s->emu.gusdatapos = s->emu.himemaddr + 1024 * 1024 + 32;
s->emu.opaque = s;
isa_init_irq (dev, &s->pic, s->emu.gusirq);
isa_init_irq (d, &s->pic, s->emu.gusirq);
AUD_set_active_out (s->voice, 1);
return 0;
}
static int GUS_init (ISABus *bus)
@ -313,8 +313,8 @@ static Property gus_properties[] = {
static void gus_class_initfn (ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS (klass);
ISADeviceClass *ic = ISA_DEVICE_CLASS (klass);
ic->init = gus_initfn;
dc->realize = gus_realizefn;
dc->desc = "Gravis Ultrasound GF1";
dc->vmsd = &vmstate_gus;
dc->props = gus_properties;

View file

@ -163,16 +163,21 @@ static const MemoryRegionOps pcspk_io_ops = {
},
};
static int pcspk_initfn(ISADevice *dev)
static void pcspk_initfn(Object *obj)
{
PCSpkState *s = PC_SPEAKER(dev);
PCSpkState *s = PC_SPEAKER(obj);
memory_region_init_io(&s->ioport, &pcspk_io_ops, s, "elcr", 1);
isa_register_ioport(dev, &s->ioport, s->iobase);
}
static void pcspk_realizefn(DeviceState *dev, Error **errp)
{
ISADevice *isadev = ISA_DEVICE(dev);
PCSpkState *s = PC_SPEAKER(dev);
isa_register_ioport(isadev, &s->ioport, s->iobase);
pcspk_state = s;
return 0;
}
static Property pcspk_properties[] = {
@ -184,9 +189,8 @@ static Property pcspk_properties[] = {
static void pcspk_class_initfn(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
ic->init = pcspk_initfn;
dc->realize = pcspk_realizefn;
dc->no_user = 1;
dc->props = pcspk_properties;
}
@ -195,6 +199,7 @@ static const TypeInfo pcspk_info = {
.name = TYPE_PC_SPEAKER,
.parent = TYPE_ISA_DEVICE,
.instance_size = sizeof(PCSpkState),
.instance_init = pcspk_initfn,
.class_init = pcspk_class_initfn,
};

View file

@ -1356,12 +1356,19 @@ static const MemoryRegionPortio sb16_ioport_list[] = {
};
static int sb16_initfn (ISADevice *dev)
static void sb16_initfn (Object *obj)
{
SB16State *s = SB16 (dev);
SB16State *s = SB16 (obj);
s->cmd = -1;
isa_init_irq (dev, &s->pic, s->irq);
}
static void sb16_realizefn (DeviceState *dev, Error **errp)
{
ISADevice *isadev = ISA_DEVICE (dev);
SB16State *s = SB16 (dev);
isa_init_irq (isadev, &s->pic, s->irq);
s->mixer_regs[0x80] = magic_of_irq (s->irq);
s->mixer_regs[0x81] = (1 << s->dma) | (1 << s->hdma);
@ -1376,14 +1383,13 @@ static int sb16_initfn (ISADevice *dev)
dolog ("warning: Could not create auxiliary timer\n");
}
isa_register_portio_list (dev, s->port, sb16_ioport_list, s, "sb16");
isa_register_portio_list (isadev, s->port, sb16_ioport_list, s, "sb16");
DMA_register_channel (s->hdma, SB_read_DMA, s);
DMA_register_channel (s->dma, SB_read_DMA, s);
s->can_write = 1;
AUD_register_card ("sb16", &s->card);
return 0;
}
static int SB16_init (ISABus *bus)
@ -1404,8 +1410,8 @@ static Property sb16_properties[] = {
static void sb16_class_initfn (ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS (klass);
ISADeviceClass *ic = ISA_DEVICE_CLASS (klass);
ic->init = sb16_initfn;
dc->realize = sb16_realizefn;
dc->desc = "Creative Sound Blaster 16";
dc->vmsd = &vmstate_sb16;
dc->props = sb16_properties;
@ -1415,6 +1421,7 @@ static const TypeInfo sb16_info = {
.name = TYPE_SB16,
.parent = TYPE_ISA_DEVICE,
.instance_size = sizeof (SB16State),
.instance_init = sb16_initfn,
.class_init = sb16_class_initfn,
};