@@ -1 +1 @@
-devices-obj-$(CONFIG_DEVICE) := device.o
+devices-obj-$(CONFIG_DEVICE) := device.o pin.o
new file mode 100644
@@ -0,0 +1,69 @@
+#include "qemu/pin.h"
+
+void pin_initialize(Pin *pin, const char *id)
+{
+ type_initialize(pin, TYPE_PIN, id);
+}
+
+void pin_finalize(Pin *pin)
+{
+ type_finalize(pin);
+}
+
+void pin_visit(Pin *obj, Visitor *v, const char *name, Error **errp)
+{
+ visit_start_struct(v, (void **)&obj, "Pin", name, sizeof(Pin), errp);
+ device_visit(DEVICE(obj), v, "super", errp);
+ visit_type_bool(v, &obj->level, "level", errp);
+ visit_end_struct(v, errp);
+}
+
+void pin_set_level(Pin *pin, bool value, Error **errp)
+{
+ bool old_level = pin->level;
+
+ pin->level = value;
+
+ if (old_level != value) {
+ notifier_list_notify(&pin->level_changed, NULL);
+ }
+}
+
+bool pin_get_level(Pin *pin, Error **errp)
+{
+ return pin->level;
+}
+
+static void pin_initfn(TypeInstance *inst)
+{
+ Pin *obj = PIN(inst);
+
+ notifier_list_init(&obj->level_changed);
+
+ plug_add_property_bool(PLUG(obj), "level",
+ (PlugPropertyGetterBool *)pin_get_level,
+ (PlugPropertySetterBool *)pin_set_level,
+ PROP_F_READWRITE);
+}
+
+static void pin_class_initfn(TypeClass *class)
+{
+ DeviceClass *device_class = DEVICE_CLASS(class);
+
+ device_class->visit = (DeviceVisitor *)pin_visit;
+}
+
+static const TypeInfo pin_type_info = {
+ .name = TYPE_PIN,
+ .parent = TYPE_DEVICE,
+ .instance_size = sizeof(Pin),
+ .instance_init = pin_initfn,
+ .class_init = pin_class_initfn,
+};
+
+static void register_devices(void)
+{
+ type_register_static(&pin_type_info);
+}
+
+device_init(register_devices);
new file mode 100644
@@ -0,0 +1,28 @@
+#ifndef PIN_H
+#define PIN_H
+
+#include "qemu/device.h"
+#include "notify.h"
+
+typedef struct Pin
+{
+ Device parent;
+
+ /* private */
+ bool level;
+
+ /* FIXME */
+ NotifierList level_changed;
+} Pin;
+
+#define TYPE_PIN "pin"
+#define PIN(obj) TYPE_CHECK(Pin, obj, TYPE_PIN)
+
+void pin_initialize(Pin *pin, const char *id);
+void pin_finalize(Pin *pin);
+void pin_visit(Pin *pin, Visitor *v, const char *name, Error **errp);
+
+void pin_set_level(Pin *pin, bool value, Error **errp);
+bool pin_get_level(Pin *pin, Error **errp);
+
+#endif
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> --- devices/Makefile | 2 +- devices/pin.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++ include/qemu/pin.h | 28 +++++++++++++++++++++ 3 files changed, 98 insertions(+), 1 deletions(-) create mode 100644 devices/pin.c create mode 100644 include/qemu/pin.h