On 2012-01-31 15:47, Anthony Liguori wrote: > On 01/31/2012 08:34 AM, Jan Kiszka wrote: >> On 2012-01-26 20:00, Anthony Liguori wrote: >>> @@ -548,6 +550,13 @@ static int piix3_realize(PCIDevice *dev) >>> /* Setup the RTC IRQ */ >>> s->rtc.irq = rtc_irq; >>> >>> + /* Realize the PIT */ >>> + qdev_set_parent_bus(DEVICE(&s->pit), BUS(s->bus)); >>> + qdev_init_nofail(DEVICE(&s->pit)); >>> + >>> + /* FIXME this should be refactored */ >>> + pcspk_init(ISA_DEVICE(&s->pit)); >> >> Fixing ATM, ie. converting to qdev/QOM. >> >> Q: How do I use qdev_property_add_link& Co. to establish the relation >> from the speaker port device to the PIT? > > In the state structure, have: > > struct PCSpkState { > ... > PITState *pit; > }; > > In the pcspk instance_init, do: > > object_property_add_link(obj, "pit", TYPE_PIT, (Object **)&s->pit, NULL); > > In the pcspk realize function (DeviceClass::init), do: > > assert(s->pit != NULL); // make sure the pit link is set > > And that's it. > > You can set the s->pit field directly. You are not required to use any > special > QOM function to interact with link properties. > > BTW, this is yet another benefit of making structures public. You can take > the > address of a child and set link fields directly without accessors.
Well, that has two sides. We introduced properties to avoid this direct messing. Does linking also work without exposing internals? Jan -- Siemens AG, Corporate Technology, CT T DE IT 1 Corporate Competence Center Embedded Linux