From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50250) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V5Mir-0000Lw-74 for qemu-devel@nongnu.org; Fri, 02 Aug 2013 17:17:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V5Mik-0007h5-Om for qemu-devel@nongnu.org; Fri, 02 Aug 2013 17:17:17 -0400 Received: from cantor2.suse.de ([195.135.220.15]:33271 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V5Mik-0007gP-CR for qemu-devel@nongnu.org; Fri, 02 Aug 2013 17:17:10 -0400 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Fri, 2 Aug 2013 23:16:56 +0200 Message-Id: <1375478221-22722-2-git-send-email-afaerber@suse.de> In-Reply-To: <1375478221-22722-1-git-send-email-afaerber@suse.de> References: <1375478221-22722-1-git-send-email-afaerber@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH qom-next for-next 1/6] ipack: Convert to QOM realize List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Alberto Garcia , =?UTF-8?q?Andreas=20F=C3=A4rber?= Signed-off-by: Andreas F=C3=A4rber --- hw/char/ipack.c | 40 ++++++++++++++++------------------------ hw/char/ipack.h | 5 ++--- hw/char/ipoctal232.c | 18 +++++++++++++----- 3 files changed, 31 insertions(+), 32 deletions(-) diff --git a/hw/char/ipack.c b/hw/char/ipack.c index f890471..a902fe4 100644 --- a/hw/char/ipack.c +++ b/hw/char/ipack.c @@ -33,37 +33,28 @@ void ipack_bus_new_inplace(IPackBus *bus, DeviceState= *parent, bus->set_irq =3D handler; } =20 -static int ipack_device_dev_init(DeviceState *qdev) +static void ipack_device_realize(DeviceState *dev, Error **errp) { - IPackBus *bus =3D IPACK_BUS(qdev_get_parent_bus(qdev)); - IPackDevice *dev =3D IPACK_DEVICE(qdev); - IPackDeviceClass *k =3D IPACK_DEVICE_GET_CLASS(dev); + IPackDevice *idev =3D IPACK_DEVICE(dev); + IPackBus *bus =3D IPACK_BUS(qdev_get_parent_bus(dev)); =20 - if (dev->slot < 0) { - dev->slot =3D bus->free_slot; + if (idev->slot < 0) { + idev->slot =3D bus->free_slot; } - if (dev->slot >=3D bus->n_slots) { - return -1; + if (idev->slot >=3D bus->n_slots) { + error_setg(errp, "Only %" PRIu8 " slots available.", bus->n_slot= s); + return; } - bus->free_slot =3D dev->slot + 1; + bus->free_slot =3D idev->slot + 1; =20 - dev->irq =3D qemu_allocate_irqs(bus->set_irq, dev, 2); - - return k->init(dev); + idev->irq =3D qemu_allocate_irqs(bus->set_irq, idev, 2); } =20 -static int ipack_device_dev_exit(DeviceState *qdev) +static void ipack_device_unrealize(DeviceState *dev, Error **errp) { - IPackDevice *dev =3D IPACK_DEVICE(qdev); - IPackDeviceClass *k =3D IPACK_DEVICE_GET_CLASS(dev); - - if (k->exit) { - k->exit(dev); - } + IPackDevice *idev =3D IPACK_DEVICE(dev); =20 - qemu_free_irqs(dev->irq); - - return 0; + qemu_free_irqs(idev->irq); } =20 static Property ipack_device_props[] =3D { @@ -74,10 +65,11 @@ static Property ipack_device_props[] =3D { static void ipack_device_class_init(ObjectClass *klass, void *data) { DeviceClass *k =3D DEVICE_CLASS(klass); + set_bit(DEVICE_CATEGORY_INPUT, k->categories); k->bus_type =3D TYPE_IPACK_BUS; - k->init =3D ipack_device_dev_init; - k->exit =3D ipack_device_dev_exit; + k->realize =3D ipack_device_realize; + k->unrealize =3D ipack_device_unrealize; k->props =3D ipack_device_props; } =20 diff --git a/hw/char/ipack.h b/hw/char/ipack.h index f2b7a12..4286fc0 100644 --- a/hw/char/ipack.h +++ b/hw/char/ipack.h @@ -38,10 +38,9 @@ typedef struct IPackDeviceClass IPackDeviceClass; OBJECT_GET_CLASS(IPackDeviceClass, (obj), TYPE_IPACK_DEVICE) =20 struct IPackDeviceClass { + /*< private >*/ DeviceClass parent_class; - - int (*init)(IPackDevice *dev); - int (*exit)(IPackDevice *dev); + /*< public >*/ =20 uint16_t (*io_read)(IPackDevice *dev, uint8_t addr); void (*io_write)(IPackDevice *dev, uint8_t addr, uint16_t val); diff --git a/hw/char/ipoctal232.c b/hw/char/ipoctal232.c index 88e2cca..80ebe7b 100644 --- a/hw/char/ipoctal232.c +++ b/hw/char/ipoctal232.c @@ -118,6 +118,8 @@ struct IPOctalState { =20 #define IPOCTAL(obj) \ OBJECT_CHECK(IPOctalState, (obj), TYPE_IPOCTAL) +#define IPOCTAL_GET_PARENT_CLASS(obj) \ + OBJECT_GET_PARENT_CLASS(obj, TYPE_IPOCTAL) =20 static const VMStateDescription vmstate_scc2698_channel =3D { .name =3D "scc2698_channel", @@ -534,11 +536,19 @@ static void hostdev_event(void *opaque, int event) } } =20 -static int ipoctal_init(IPackDevice *ip) +static void ipoctal_realize(DeviceState *dev, Error **errp) { - IPOctalState *s =3D IPOCTAL(ip); + IPOctalState *s =3D IPOCTAL(dev); + DeviceClass *parent_dc =3D DEVICE_CLASS(IPOCTAL_GET_PARENT_CLASS(dev= )); + Error *err =3D NULL; unsigned i; =20 + parent_dc->realize(dev, &err); + if (err !=3D NULL) { + error_propagate(errp, err); + return; + } + for (i =3D 0; i < N_CHANNELS; i++) { SCC2698Channel *ch =3D &s->ch[i]; ch->ipoctal =3D s; @@ -552,8 +562,6 @@ static int ipoctal_init(IPackDevice *ip) DPRINTF("Could not redirect channel %u, no chardev set\n", i= ); } } - - return 0; } =20 static Property ipoctal_properties[] =3D { @@ -573,7 +581,6 @@ static void ipoctal_class_init(ObjectClass *klass, vo= id *data) DeviceClass *dc =3D DEVICE_CLASS(klass); IPackDeviceClass *ic =3D IPACK_DEVICE_CLASS(klass); =20 - ic->init =3D ipoctal_init; ic->io_read =3D io_read; ic->io_write =3D io_write; ic->id_read =3D id_read; @@ -585,6 +592,7 @@ static void ipoctal_class_init(ObjectClass *klass, vo= id *data) ic->mem_read8 =3D mem_read8; ic->mem_write8 =3D mem_write8; =20 + dc->realize =3D ipoctal_realize; set_bit(DEVICE_CATEGORY_INPUT, dc->categories); dc->desc =3D "GE IP-Octal 232 8-channel RS-232 IndustryPack"; dc->props =3D ipoctal_properties; --=20 1.8.1.4