[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 1/2] hw/gpio/npcm7xx: Add GPIO DIN object property
From: |
Joe Komlodi |
Subject: |
[PATCH 1/2] hw/gpio/npcm7xx: Add GPIO DIN object property |
Date: |
Thu, 6 Apr 2023 00:24:46 +0000 |
In cases where the input pin is driven by an entity outside of the
machine, such as a machine the BMC is managing, we need a way to
update the pin state when the external machine drives it.
This allows us to do it via QMP.
For example, to set pin 20 on GPIO controller 0:
{"execute":"qom-set","arguments": {
"path":"/machine/soc/gpio[0]",
"property":"gpio-pins-in",
"value":1048576
}}
1048576 == 0x100000, JSON does not support hex.
Signed-off-by: Joe Komlodi <komlodi@google.com>
---
hw/gpio/npcm7xx_gpio.c | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/hw/gpio/npcm7xx_gpio.c b/hw/gpio/npcm7xx_gpio.c
index 3376901ab1..2a7be60d8d 100644
--- a/hw/gpio/npcm7xx_gpio.c
+++ b/hw/gpio/npcm7xx_gpio.c
@@ -20,6 +20,7 @@
#include "hw/qdev-properties.h"
#include "migration/vmstate.h"
#include "qapi/error.h"
+#include "qapi/visitor.h"
#include "qemu/log.h"
#include "qemu/module.h"
#include "qemu/units.h"
@@ -340,6 +341,29 @@ static void npcm7xx_gpio_set_input(void *opaque, int line,
int level)
npcm7xx_gpio_update_pins(s, BIT(line));
}
+static void npcm7xx_gpio_get_pins_in(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ uint32_t *pins_in = (uint32_t *)opaque;
+
+ visit_type_uint32(v, name, pins_in, errp);
+}
+
+static void npcm7xx_gpio_set_pins_in(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ NPCM7xxGPIOState *s = NPCM7XX_GPIO(obj);
+ uint32_t new_pins_in;
+
+ if (!visit_type_uint32(v, name, &new_pins_in, errp)) {
+ return;
+ }
+
+ s->ext_driven = new_pins_in;
+ s->ext_level = new_pins_in;
+ npcm7xx_gpio_update_pins(s, new_pins_in);
+}
+
static void npcm7xx_gpio_enter_reset(Object *obj, ResetType type)
{
NPCM7xxGPIOState *s = NPCM7XX_GPIO(obj);
@@ -371,6 +395,10 @@ static void npcm7xx_gpio_init(Object *obj)
qdev_init_gpio_in(dev, npcm7xx_gpio_set_input, NPCM7XX_GPIO_NR_PINS);
qdev_init_gpio_out(dev, s->output, NPCM7XX_GPIO_NR_PINS);
+
+ object_property_add(obj, "gpio-pins-in", "uint32",
+ npcm7xx_gpio_get_pins_in, npcm7xx_gpio_set_pins_in,
+ NULL, &s->regs[NPCM7XX_GPIO_DIN]);
}
static const VMStateDescription vmstate_npcm7xx_gpio = {
--
2.40.0.348.gf938b09366-goog