summaryrefslogtreecommitdiffstats
path: root/hw
diff options
context:
space:
mode:
Diffstat (limited to 'hw')
-rw-r--r--hw/misc/led.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/hw/misc/led.c b/hw/misc/led.c
index 1e2f49c571..c5fa09a613 100644
--- a/hw/misc/led.c
+++ b/hw/misc/led.c
@@ -10,6 +10,7 @@
#include "migration/vmstate.h"
#include "hw/qdev-properties.h"
#include "hw/misc/led.h"
+#include "hw/irq.h"
#include "trace.h"
#define LED_INTENSITY_PERCENT_MAX 100
@@ -53,11 +54,19 @@ void led_set_state(LEDState *s, bool is_emitting)
led_set_intensity(s, is_emitting ? LED_INTENSITY_PERCENT_MAX : 0);
}
+static void led_set_state_gpio_handler(void *opaque, int line, int new_state)
+{
+ LEDState *s = LED(opaque);
+
+ assert(line == 0);
+ led_set_state(s, !!new_state != s->gpio_active_high);
+}
+
static void led_reset(DeviceState *dev)
{
LEDState *s = LED(dev);
- led_set_state(s, false);
+ led_set_state(s, s->gpio_active_high);
}
static const VMStateDescription vmstate_led = {
@@ -84,11 +93,14 @@ static void led_realize(DeviceState *dev, Error **errp)
if (s->description == NULL) {
s->description = g_strdup("n/a");
}
+
+ qdev_init_gpio_in(DEVICE(s), led_set_state_gpio_handler, 1);
}
static Property led_properties[] = {
DEFINE_PROP_STRING("color", LEDState, color),
DEFINE_PROP_STRING("description", LEDState, description),
+ DEFINE_PROP_BOOL("gpio-active-high", LEDState, gpio_active_high, true),
DEFINE_PROP_END_OF_LIST(),
};
@@ -119,6 +131,7 @@ static void led_register_types(void)
type_init(led_register_types)
LEDState *led_create_simple(Object *parentobj,
+ GpioPolarity gpio_polarity,
LEDColor color,
const char *description)
{
@@ -126,6 +139,8 @@ LEDState *led_create_simple(Object *parentobj,
DeviceState *dev;
dev = qdev_new(TYPE_LED);
+ qdev_prop_set_bit(dev, "gpio-active-high",
+ gpio_polarity == GPIO_POLARITY_ACTIVE_HIGH);
qdev_prop_set_string(dev, "color", led_color_name[color]);
if (!description) {
static unsigned undescribed_led_id;