This adds support for hotplugging in I3C. Conceptually this can be thought of as an I3C target being physically socketed onto a board. It is then the target's responsibility to go through the hot-join and DAA process so it can participate on the bus.
Signed-off-by: Joe Komlodi <[email protected]> Reviewed-by: Patrick Venture <[email protected]> Signed-off-by: Jamin Lin <[email protected]> --- hw/i3c/core.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/hw/i3c/core.c b/hw/i3c/core.c index fb4bfe5aec..1ab95c4866 100644 --- a/hw/i3c/core.c +++ b/hw/i3c/core.c @@ -11,6 +11,7 @@ #include "qapi/error.h" #include "trace.h" #include "hw/i3c/i3c.h" +#include "hw/core/hotplug.h" #include "hw/core/qdev-properties.h" /* @@ -26,11 +27,27 @@ static const Property i3c_props[] = { DEFINE_PROP_UINT64("pid", struct I3CTarget, pid, 0), }; +static void i3c_realize(BusState *bus, Error **errp) +{ + qbus_set_bus_hotplug_handler(bus); +} + +static void i3c_class_init(ObjectClass *klass, const void *data) +{ + BusClass *k = BUS_CLASS(klass); + k->realize = i3c_realize; +} + static const TypeInfo i3c_bus_info = { .name = TYPE_I3C_BUS, .parent = TYPE_BUS, .instance_size = sizeof(I3CBus), .class_size = sizeof(I3CBusClass), + .class_init = i3c_class_init, + .interfaces = (InterfaceInfo[]) { + { TYPE_HOTPLUG_HANDLER }, + { } + } }; I3CBus *i3c_init_bus(DeviceState *parent, const char *name) -- 2.43.0
