0a122b
From 8aa43c6e4e8def26812cb435b9f3c3146488e3bd Mon Sep 17 00:00:00 2001
0a122b
From: Markus Armbruster <armbru@redhat.com>
0a122b
Date: Thu, 16 Jan 2014 15:25:18 -0500
0a122b
Subject: [PATCH 12/14] hw: cannot_instantiate_with_device_add_yet due to
0a122b
 pointer props
0a122b
MIME-Version: 1.0
0a122b
Content-Type: text/plain; charset=UTF-8
0a122b
Content-Transfer-Encoding: 8bit
0a122b
0a122b
Message-id: <1389885919-16158-2-git-send-email-armbru@redhat.com>
0a122b
Patchwork-id: 56750
0a122b
O-Subject: [PATCH 7.0 qemu-kvm 1/2] hw: cannot_instantiate_with_device_add_yet due to pointer props
0a122b
Bugzilla: 1031098
0a122b
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
0a122b
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
0a122b
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
0a122b
0a122b
Pointer properties can be set only by code, not by device_add.  A
0a122b
device with a pointer property can work with device_add only when the
0a122b
property may remain null.
0a122b
0a122b
This is the case for property "interrupt_vector" of device
0a122b
"etraxfs,pic".  Add a comment there.
0a122b
0a122b
Set cannot_instantiate_with_device_add_yet for the other devices with
0a122b
pointer properties, with a comment explaining why.
0a122b
0a122b
Juha Riihimäki and Peter Maydell deserve my thanks for making "pointer
0a122b
property must not remain null" blatantly obvious in the OMAP devices.
0a122b
0a122b
Only device "smbus-eeprom" is actually changed.  The others are all
0a122b
sysbus devices, which get cannot_instantiate_with_device_add_yet set
0a122b
in their abstract base's class init function.  Setting it again in
0a122b
their class init function is technically redundant, but serves as
0a122b
insurance for when sysbus devices become available with device_add,
0a122b
and as documentation.
0a122b
0a122b
Signed-off-by: Markus Armbruster <armbru@redhat.com>
0a122b
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@gmail.com> (for ETRAX)
0a122b
Signed-off-by: Andreas Färber <afaerber@suse.de>
0a122b
(cherry picked from commit 1b111dc1216be2a89770fdc1ab3dfa8025957442)
0a122b
---
0a122b
 hw/audio/marvell_88w8618.c | 2 ++
0a122b
 hw/dma/sparc32_dma.c       | 2 ++
0a122b
 hw/gpio/omap_gpio.c        | 4 ++++
0a122b
 hw/i2c/omap_i2c.c          | 2 ++
0a122b
 hw/i2c/smbus_eeprom.c      | 2 ++
0a122b
 hw/intc/etraxfs_pic.c      | 4 ++++
0a122b
 hw/intc/grlib_irqmp.c      | 2 ++
0a122b
 hw/intc/omap_intc.c        | 4 ++++
0a122b
 hw/net/etraxfs_eth.c       | 2 ++
0a122b
 hw/net/lance.c             | 2 ++
0a122b
 10 files changed, 26 insertions(+)
0a122b
0a122b
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
0a122b
---
0a122b
 hw/audio/marvell_88w8618.c | 2 ++
0a122b
 hw/dma/sparc32_dma.c       | 2 ++
0a122b
 hw/gpio/omap_gpio.c        | 4 ++++
0a122b
 hw/i2c/omap_i2c.c          | 2 ++
0a122b
 hw/i2c/smbus_eeprom.c      | 2 ++
0a122b
 hw/intc/etraxfs_pic.c      | 4 ++++
0a122b
 hw/intc/grlib_irqmp.c      | 2 ++
0a122b
 hw/intc/omap_intc.c        | 4 ++++
0a122b
 hw/net/etraxfs_eth.c       | 2 ++
0a122b
 hw/net/lance.c             | 2 ++
0a122b
 10 files changed, 26 insertions(+)
0a122b
0a122b
diff --git a/hw/audio/marvell_88w8618.c b/hw/audio/marvell_88w8618.c
0a122b
index de06dfd..4f7196a 100644
0a122b
--- a/hw/audio/marvell_88w8618.c
0a122b
+++ b/hw/audio/marvell_88w8618.c
0a122b
@@ -285,6 +285,8 @@ static void mv88w8618_audio_class_init(ObjectClass *klass, void *data)
0a122b
     dc->reset = mv88w8618_audio_reset;
0a122b
     dc->vmsd = &mv88w8618_audio_vmsd;
0a122b
     dc->props = mv88w8618_audio_properties;
0a122b
+    /* Reason: pointer property "wm8750" */
0a122b
+    dc->cannot_instantiate_with_device_add_yet = true;
0a122b
 }
0a122b
 
0a122b
 static const TypeInfo mv88w8618_audio_info = {
0a122b
diff --git a/hw/dma/sparc32_dma.c b/hw/dma/sparc32_dma.c
0a122b
index fd21533..c866da7 100644
0a122b
--- a/hw/dma/sparc32_dma.c
0a122b
+++ b/hw/dma/sparc32_dma.c
0a122b
@@ -298,6 +298,8 @@ static void sparc32_dma_class_init(ObjectClass *klass, void *data)
0a122b
     dc->reset = dma_reset;
0a122b
     dc->vmsd = &vmstate_dma;
0a122b
     dc->props = sparc32_dma_properties;
0a122b
+    /* Reason: pointer property "iommu_opaque" */
0a122b
+    dc->cannot_instantiate_with_device_add_yet = true;
0a122b
 }
0a122b
 
0a122b
 static const TypeInfo sparc32_dma_info = {
0a122b
diff --git a/hw/gpio/omap_gpio.c b/hw/gpio/omap_gpio.c
0a122b
index f5eeaea..3f423dd 100644
0a122b
--- a/hw/gpio/omap_gpio.c
0a122b
+++ b/hw/gpio/omap_gpio.c
0a122b
@@ -745,6 +745,8 @@ static void omap_gpio_class_init(ObjectClass *klass, void *data)
0a122b
     k->init = omap_gpio_init;
0a122b
     dc->reset = omap_gpif_reset;
0a122b
     dc->props = omap_gpio_properties;
0a122b
+    /* Reason: pointer property "clk" */
0a122b
+    dc->cannot_instantiate_with_device_add_yet = true;
0a122b
 }
0a122b
 
0a122b
 static const TypeInfo omap_gpio_info = {
0a122b
@@ -774,6 +776,8 @@ static void omap2_gpio_class_init(ObjectClass *klass, void *data)
0a122b
     k->init = omap2_gpio_init;
0a122b
     dc->reset = omap2_gpif_reset;
0a122b
     dc->props = omap2_gpio_properties;
0a122b
+    /* Reason: pointer properties "iclk", "fclk0", ..., "fclk5" */
0a122b
+    dc->cannot_instantiate_with_device_add_yet = true;
0a122b
 }
0a122b
 
0a122b
 static const TypeInfo omap2_gpio_info = {
0a122b
diff --git a/hw/i2c/omap_i2c.c b/hw/i2c/omap_i2c.c
0a122b
index efb2254..464308e 100644
0a122b
--- a/hw/i2c/omap_i2c.c
0a122b
+++ b/hw/i2c/omap_i2c.c
0a122b
@@ -469,6 +469,8 @@ static void omap_i2c_class_init(ObjectClass *klass, void *data)
0a122b
     k->init = omap_i2c_init;
0a122b
     dc->props = omap_i2c_properties;
0a122b
     dc->reset = omap_i2c_reset;
0a122b
+    /* Reason: pointer properties "iclk", "fclk" */
0a122b
+    dc->cannot_instantiate_with_device_add_yet = true;
0a122b
 }
0a122b
 
0a122b
 static const TypeInfo omap_i2c_info = {
0a122b
diff --git a/hw/i2c/smbus_eeprom.c b/hw/i2c/smbus_eeprom.c
0a122b
index 0154283..0218f8a 100644
0a122b
--- a/hw/i2c/smbus_eeprom.c
0a122b
+++ b/hw/i2c/smbus_eeprom.c
0a122b
@@ -121,6 +121,8 @@ static void smbus_eeprom_class_initfn(ObjectClass *klass, void *data)
0a122b
     sc->write_data = eeprom_write_data;
0a122b
     sc->read_data = eeprom_read_data;
0a122b
     dc->props = smbus_eeprom_properties;
0a122b
+    /* Reason: pointer property "data" */
0a122b
+    dc->cannot_instantiate_with_device_add_yet = true;
0a122b
 }
0a122b
 
0a122b
 static const TypeInfo smbus_eeprom_info = {
0a122b
diff --git a/hw/intc/etraxfs_pic.c b/hw/intc/etraxfs_pic.c
0a122b
index 635103c..57650c4 100644
0a122b
--- a/hw/intc/etraxfs_pic.c
0a122b
+++ b/hw/intc/etraxfs_pic.c
0a122b
@@ -163,6 +163,10 @@ static void etraxfs_pic_class_init(ObjectClass *klass, void *data)
0a122b
 
0a122b
     k->init = etraxfs_pic_init;
0a122b
     dc->props = etraxfs_pic_properties;
0a122b
+    /*
0a122b
+     * Note: pointer property "interrupt_vector" may remain null, thus
0a122b
+     * no need for dc->cannot_instantiate_with_device_add_yet = true;
0a122b
+     */
0a122b
 }
0a122b
 
0a122b
 static const TypeInfo etraxfs_pic_info = {
0a122b
diff --git a/hw/intc/grlib_irqmp.c b/hw/intc/grlib_irqmp.c
0a122b
index 68dfe6a..1cfa960 100644
0a122b
--- a/hw/intc/grlib_irqmp.c
0a122b
+++ b/hw/intc/grlib_irqmp.c
0a122b
@@ -368,6 +368,8 @@ static void grlib_irqmp_class_init(ObjectClass *klass, void *data)
0a122b
     k->init = grlib_irqmp_init;
0a122b
     dc->reset = grlib_irqmp_reset;
0a122b
     dc->props = grlib_irqmp_properties;
0a122b
+    /* Reason: pointer properties "set_pil_in", "set_pil_in_opaque" */
0a122b
+    dc->cannot_instantiate_with_device_add_yet = true;
0a122b
 }
0a122b
 
0a122b
 static const TypeInfo grlib_irqmp_info = {
0a122b
diff --git a/hw/intc/omap_intc.c b/hw/intc/omap_intc.c
0a122b
index 875eba4..e846fd6 100644
0a122b
--- a/hw/intc/omap_intc.c
0a122b
+++ b/hw/intc/omap_intc.c
0a122b
@@ -387,6 +387,8 @@ static void omap_intc_class_init(ObjectClass *klass, void *data)
0a122b
     k->init = omap_intc_init;
0a122b
     dc->reset = omap_inth_reset;
0a122b
     dc->props = omap_intc_properties;
0a122b
+    /* Reason: pointer property "clk" */
0a122b
+    dc->cannot_instantiate_with_device_add_yet = true;
0a122b
 }
0a122b
 
0a122b
 static const TypeInfo omap_intc_info = {
0a122b
@@ -631,6 +633,8 @@ static void omap2_intc_class_init(ObjectClass *klass, void *data)
0a122b
     k->init = omap2_intc_init;
0a122b
     dc->reset = omap_inth_reset;
0a122b
     dc->props = omap2_intc_properties;
0a122b
+    /* Reason: pointer property "iclk", "fclk" */
0a122b
+    dc->cannot_instantiate_with_device_add_yet = true;
0a122b
 }
0a122b
 
0a122b
 static const TypeInfo omap2_intc_info = {
0a122b
diff --git a/hw/net/etraxfs_eth.c b/hw/net/etraxfs_eth.c
0a122b
index 1039913..374eb5a 100644
0a122b
--- a/hw/net/etraxfs_eth.c
0a122b
+++ b/hw/net/etraxfs_eth.c
0a122b
@@ -639,6 +639,8 @@ static void etraxfs_eth_class_init(ObjectClass *klass, void *data)
0a122b
 
0a122b
     k->init = fs_eth_init;
0a122b
     dc->props = etraxfs_eth_properties;
0a122b
+    /* Reason: pointer properties "dma_out", "dma_in" */
0a122b
+    dc->cannot_instantiate_with_device_add_yet = true;
0a122b
 }
0a122b
 
0a122b
 static const TypeInfo etraxfs_eth_info = {
0a122b
diff --git a/hw/net/lance.c b/hw/net/lance.c
0a122b
index 90641e7..df62dcb 100644
0a122b
--- a/hw/net/lance.c
0a122b
+++ b/hw/net/lance.c
0a122b
@@ -154,6 +154,8 @@ static void lance_class_init(ObjectClass *klass, void *data)
0a122b
     dc->reset = lance_reset;
0a122b
     dc->vmsd = &vmstate_lance;
0a122b
     dc->props = lance_properties;
0a122b
+    /* Reason: pointer property "dma" */
0a122b
+    dc->cannot_instantiate_with_device_add_yet = true;
0a122b
 }
0a122b
 
0a122b
 static const TypeInfo lance_info = {
0a122b
-- 
0a122b
1.8.3.1
0a122b