From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:42429) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QlAEL-00048L-3G for qemu-devel@nongnu.org; Sun, 24 Jul 2011 21:45:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QlAEI-0005Z2-BT for qemu-devel@nongnu.org; Sun, 24 Jul 2011 21:45:12 -0400 Received: from e7.ny.us.ibm.com ([32.97.182.137]:60622) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QlAEH-0005YL-HQ for qemu-devel@nongnu.org; Sun, 24 Jul 2011 21:45:09 -0400 Received: from d01relay03.pok.ibm.com (d01relay03.pok.ibm.com [9.56.227.235]) by e7.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id p6P1JYEq022714 for ; Sun, 24 Jul 2011 21:19:34 -0400 Received: from d01av04.pok.ibm.com (d01av04.pok.ibm.com [9.56.224.64]) by d01relay03.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p6P1j8tS127150 for ; Sun, 24 Jul 2011 21:45:08 -0400 Received: from d01av04.pok.ibm.com (loopback [127.0.0.1]) by d01av04.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p6P1j8cV007994 for ; Sun, 24 Jul 2011 21:45:08 -0400 From: Anthony Liguori Date: Sun, 24 Jul 2011 20:44:48 -0500 Message-Id: <1311558293-5855-17-git-send-email-aliguori@us.ibm.com> In-Reply-To: <1311558293-5855-1-git-send-email-aliguori@us.ibm.com> References: <1311558293-5855-1-git-send-email-aliguori@us.ibm.com> Subject: [Qemu-devel] [PATCH 16/21] qom-devices: add a Pin class List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Anthony Liguori Signed-off-by: Anthony Liguori --- 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 diff --git a/devices/Makefile b/devices/Makefile index fbb0b82..fa52689 100644 --- a/devices/Makefile +++ b/devices/Makefile @@ -1 +1 @@ -devices-obj-$(CONFIG_DEVICE) := device.o +devices-obj-$(CONFIG_DEVICE) := device.o pin.o diff --git a/devices/pin.c b/devices/pin.c new file mode 100644 index 0000000..27812d8 --- /dev/null +++ b/devices/pin.c @@ -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); diff --git a/include/qemu/pin.h b/include/qemu/pin.h new file mode 100644 index 0000000..e8f2582 --- /dev/null +++ b/include/qemu/pin.h @@ -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 -- 1.7.4.1