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