|
@@ -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;
|