From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53891) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xilzj-0004KZ-RS for qemu-devel@nongnu.org; Mon, 27 Oct 2014 11:14:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xilzi-0001dt-UJ for qemu-devel@nongnu.org; Mon, 27 Oct 2014 11:14:07 -0400 Received: from mx1.redhat.com ([209.132.183.28]:41658) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xilzi-0001dj-Lv for qemu-devel@nongnu.org; Mon, 27 Oct 2014 11:14:06 -0400 From: Paolo Bonzini Date: Mon, 27 Oct 2014 16:13:25 +0100 Message-Id: <1414422825-6166-9-git-send-email-pbonzini@redhat.com> In-Reply-To: <1414422825-6166-1-git-send-email-pbonzini@redhat.com> References: <1414422825-6166-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PULL 08/28] qdev: gpio: Add API for intercepting a GPIO List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Crosthwaite From: Peter Crosthwaite To replace the old qemu_irq intercept API (which had users reaching into qdev private state for GPIOs). Reviewed-by: Alexander Graf Signed-off-by: Peter Crosthwaite Signed-off-by: Paolo Bonzini --- hw/core/qdev.c | 25 +++++++++++++++++++++++++ include/hw/qdev-core.h | 2 ++ 2 files changed, 27 insertions(+) diff --git a/hw/core/qdev.c b/hw/core/qdev.c index fc7860f..92f88f6 100644 --- a/hw/core/qdev.c +++ b/hw/core/qdev.c @@ -455,6 +455,31 @@ void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n, g_free(propname); } +/* disconnect a GPIO ouput, returning the disconnected input (if any) */ + +static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev, + const char *name, int n) +{ + char *propname = g_strdup_printf("%s[%d]", + name ? name : "unnamed-gpio-out", n); + + qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname, + NULL); + if (ret) { + object_property_set_link(OBJECT(dev), NULL, propname, NULL); + } + g_free(propname); + return ret; +} + +qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt, + const char *name, int n) +{ + qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n); + qdev_connect_gpio_out_named(dev, name, n, icpt); + return disconnected; +} + void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin) { qdev_connect_gpio_out_named(dev, NULL, n, pin); diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h index 1fca75c..cf27e65 100644 --- a/include/hw/qdev-core.h +++ b/include/hw/qdev-core.h @@ -273,6 +273,8 @@ qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n); void qdev_connect_gpio_out(DeviceState *dev, int n, qemu_irq pin); void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n, qemu_irq pin); +qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt, + const char *name, int n); BusState *qdev_get_child_bus(DeviceState *dev, const char *name); -- 1.8.3.1