xref: /openbmc/qemu/include/hw/misc/led.h (revision b91a0fa7)
1 /*
2  * QEMU single LED device
3  *
4  * Copyright (C) 2020 Philippe Mathieu-Daudé <f4bug@amsat.org>
5  *
6  * SPDX-License-Identifier: GPL-2.0-or-later
7  */
8 #ifndef HW_MISC_LED_H
9 #define HW_MISC_LED_H
10 
11 #include "qom/object.h"
12 #include "hw/qdev-core.h"
13 
14 #define TYPE_LED "led"
15 
16 /**
17  * LEDColor: Color of a LED
18  *
19  * This set is restricted to physically available LED colors.
20  *
21  * LED colors from 'Table 1. Product performance of LUXEON Rebel Color
22  * Line' of the 'DS68 LUXEON Rebel Color Line' datasheet available at:
23  * https://www.lumileds.com/products/color-leds/luxeon-rebel-color/
24  */
25 typedef enum {          /* Coarse wavelength range */
26     LED_COLOR_VIOLET,   /* 425 nm */
27     LED_COLOR_BLUE,     /* 475 nm */
28     LED_COLOR_CYAN,     /* 500 nm */
29     LED_COLOR_GREEN,    /* 535 nm */
30     LED_COLOR_YELLOW,   /* 567 nm */
31     LED_COLOR_AMBER,    /* 590 nm */
32     LED_COLOR_ORANGE,   /* 615 nm */
33     LED_COLOR_RED,      /* 630 nm */
34 } LEDColor;
35 
36 struct LEDState {
37     /* Private */
38     DeviceState parent_obj;
39     /* Public */
40 
41     uint8_t intensity_percent;
42     qemu_irq irq;
43 
44     /* Properties */
45     char *description;
46     char *color;
47     /*
48      * Determines whether a GPIO is using a positive (active-high)
49      * logic (when used with GPIO, the intensity at reset is related
50      * to the GPIO polarity).
51      */
52     bool gpio_active_high;
53 };
54 typedef struct LEDState LEDState;
55 DECLARE_INSTANCE_CHECKER(LEDState, LED, TYPE_LED)
56 
57 /**
58  * led_set_intensity: Set the intensity of a LED device
59  * @s: the LED object
60  * @intensity_percent: intensity as percentage in range 0 to 100.
61  */
62 void led_set_intensity(LEDState *s, unsigned intensity_percent);
63 
64 /**
65  * led_get_intensity:
66  * @s: the LED object
67  *
68  * Returns: The LED intensity as percentage in range 0 to 100.
69  */
70 unsigned led_get_intensity(LEDState *s);
71 
72 /**
73  * led_set_state: Set the state of a LED device
74  * @s: the LED object
75  * @is_emitting: boolean indicating whether the LED is emitting
76  *
77  * This utility is meant for LED connected to GPIO.
78  */
79 void led_set_state(LEDState *s, bool is_emitting);
80 
81 /**
82  * led_create_simple: Create and realize a LED device
83  * @parentobj: the parent object
84  * @gpio_polarity: GPIO polarity
85  * @color: color of the LED
86  * @description: description of the LED (optional)
87  *
88  * Create the device state structure, initialize it, and
89  * drop the reference to it (the device is realized).
90  *
91  * Returns: The newly allocated and instantiated LED object.
92  */
93 LEDState *led_create_simple(Object *parentobj,
94                             GpioPolarity gpio_polarity,
95                             LEDColor color,
96                             const char *description);
97 
98 #endif /* HW_MISC_LED_H */
99