blob: 49ec2998a33bd36f5b4e416bf35c6f12869844bd [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001/* SPDX-License-Identifier: GPL-2.0+ */
Simon Glass59171122015-06-23 15:38:45 -06002/*
3 * Copyright (c) 2015 Google, Inc
4 * Written by Simon Glass <sjg@chromium.org>
Simon Glass59171122015-06-23 15:38:45 -06005 */
6
7#ifndef __LED_H
8#define __LED_H
9
Tom Rini8877bc52024-07-30 12:36:22 -060010#include <stdbool.h>
11#include <cyclic.h>
Christian Marangi914fd752024-10-01 14:24:36 +020012#include <dm/ofnode.h>
Tom Rini8877bc52024-07-30 12:36:22 -060013
Simon Glass401d1c42020-10-30 21:38:53 -060014struct udevice;
15
Simon Glassddae9fc2017-04-10 11:34:54 -060016enum led_state_t {
17 LEDST_OFF = 0,
18 LEDST_ON = 1,
Simon Glass9413ad42017-04-10 11:34:56 -060019 LEDST_TOGGLE,
Simon Glass53378da2017-04-10 11:34:57 -060020 LEDST_BLINK,
Simon Glassddae9fc2017-04-10 11:34:54 -060021
22 LEDST_COUNT,
23};
24
Michael Polyntsovb557f552024-07-19 13:12:12 +040025enum led_sw_blink_state_t {
26 LED_SW_BLINK_ST_DISABLED,
27 LED_SW_BLINK_ST_NOT_READY,
28 LED_SW_BLINK_ST_OFF,
29 LED_SW_BLINK_ST_ON,
30};
31
32struct led_sw_blink {
33 enum led_sw_blink_state_t state;
34 struct udevice *dev;
35 struct cyclic_info cyclic;
36 const char cyclic_name[0];
37};
38
Marek Vasut72675b02022-04-04 01:23:27 +020039/**
40 * struct led_uc_plat - Platform data the uclass stores about each device
41 *
42 * @label: LED label
43 * @default_state: LED default state
44 */
45struct led_uc_plat {
46 const char *label;
47 enum led_state_t default_state;
Michael Polyntsovb557f552024-07-19 13:12:12 +040048#ifdef CONFIG_LED_SW_BLINK
49 struct led_sw_blink *sw_blink;
50#endif
Marek Vasut72675b02022-04-04 01:23:27 +020051};
52
53/**
54 * struct led_uc_priv - Private data the uclass stores about each device
55 *
Christian Marangi914fd752024-10-01 14:24:36 +020056 * @boot_led_label: Boot LED label
57 * @boot_led_dev: Boot LED dev
58 * @boot_led_period: Boot LED blink period
Marek Vasut72675b02022-04-04 01:23:27 +020059 */
60struct led_uc_priv {
Christian Marangi914fd752024-10-01 14:24:36 +020061#ifdef CONFIG_LED_BOOT
62 const char *boot_led_label;
63 int boot_led_period;
64#endif
Marek Vasut72675b02022-04-04 01:23:27 +020065};
66
Simon Glass59171122015-06-23 15:38:45 -060067struct led_ops {
68 /**
Simon Glassddae9fc2017-04-10 11:34:54 -060069 * set_state() - set the state of an LED
Simon Glass59171122015-06-23 15:38:45 -060070 *
71 * @dev: LED device to change
Simon Glassddae9fc2017-04-10 11:34:54 -060072 * @state: LED state to set
Simon Glass59171122015-06-23 15:38:45 -060073 * @return 0 if OK, -ve on error
74 */
Simon Glassddae9fc2017-04-10 11:34:54 -060075 int (*set_state)(struct udevice *dev, enum led_state_t state);
Simon Glass8f4b6122017-04-10 11:34:55 -060076
77 /**
78 * led_get_state() - get the state of an LED
79 *
80 * @dev: LED device to change
81 * @return LED state led_state_t, or -ve on error
82 */
83 enum led_state_t (*get_state)(struct udevice *dev);
Simon Glass53378da2017-04-10 11:34:57 -060084
85#ifdef CONFIG_LED_BLINK
86 /**
87 * led_set_period() - set the blink period of an LED
88 *
89 * Thie records the period if supported, or returns -ENOSYS if not.
90 * To start the LED blinking, use set_state().
91 *
92 * @dev: LED device to change
93 * @period_ms: LED blink period in milliseconds
94 * @return 0 if OK, -ve on error
95 */
96 int (*set_period)(struct udevice *dev, int period_ms);
97#endif
Simon Glass59171122015-06-23 15:38:45 -060098};
99
100#define led_get_ops(dev) ((struct led_ops *)(dev)->driver->ops)
101
102/**
103 * led_get_by_label() - Find an LED device by label
104 *
105 * @label: LED label to look up
106 * @devp: Returns the associated device, if found
Heinrich Schuchardt185f8122022-01-19 18:05:50 +0100107 * Return: 0 if found, -ENODEV if not found, other -ve on error
Simon Glass59171122015-06-23 15:38:45 -0600108 */
109int led_get_by_label(const char *label, struct udevice **devp);
110
111/**
Simon Glassddae9fc2017-04-10 11:34:54 -0600112 * led_set_state() - set the state of an LED
Simon Glass59171122015-06-23 15:38:45 -0600113 *
114 * @dev: LED device to change
Simon Glassddae9fc2017-04-10 11:34:54 -0600115 * @state: LED state to set
Heinrich Schuchardt185f8122022-01-19 18:05:50 +0100116 * Return: 0 if OK, -ve on error
Simon Glass59171122015-06-23 15:38:45 -0600117 */
Simon Glassddae9fc2017-04-10 11:34:54 -0600118int led_set_state(struct udevice *dev, enum led_state_t state);
Simon Glass59171122015-06-23 15:38:45 -0600119
Simon Glass8f4b6122017-04-10 11:34:55 -0600120/**
121 * led_get_state() - get the state of an LED
122 *
123 * @dev: LED device to change
Heinrich Schuchardt185f8122022-01-19 18:05:50 +0100124 * Return: LED state led_state_t, or -ve on error
Simon Glass8f4b6122017-04-10 11:34:55 -0600125 */
126enum led_state_t led_get_state(struct udevice *dev);
127
Simon Glass53378da2017-04-10 11:34:57 -0600128/**
129 * led_set_period() - set the blink period of an LED
130 *
131 * @dev: LED device to change
132 * @period_ms: LED blink period in milliseconds
Heinrich Schuchardt185f8122022-01-19 18:05:50 +0100133 * Return: 0 if OK, -ve on error
Simon Glass53378da2017-04-10 11:34:57 -0600134 */
135int led_set_period(struct udevice *dev, int period_ms);
136
Rasmus Villemoes3bf05152023-11-17 12:38:08 +0100137/**
138 * led_bind_generic() - bind children of parent to given driver
139 *
140 * @parent: Top-level LED device
141 * @driver_name: Driver for handling individual child nodes
142 */
143int led_bind_generic(struct udevice *parent, const char *driver_name);
144
Michael Polyntsovb557f552024-07-19 13:12:12 +0400145/* Internal functions for software blinking. Do not use them in your code */
146int led_sw_set_period(struct udevice *dev, int period_ms);
147bool led_sw_is_blinking(struct udevice *dev);
148bool led_sw_on_state_change(struct udevice *dev, enum led_state_t state);
149
Christian Marangi914fd752024-10-01 14:24:36 +0200150#ifdef CONFIG_LED_BOOT
151
152/**
153 * led_boot_on() - turn ON the designated LED for booting
154 *
155 * Return: 0 if OK, -ve on error
156 */
157int led_boot_on(void);
158
159/**
160 * led_boot_off() - turn OFF the designated LED for booting
161 *
162 * Return: 0 if OK, -ve on error
163 */
164int led_boot_off(void);
165
166#if defined(CONFIG_LED_BLINK) || defined(CONFIG_LED_SW_BLINK)
167/**
168 * led_boot_blink() - turn ON the designated LED for booting
169 *
170 * Return: 0 if OK, -ve on error
171 */
172int led_boot_blink(void);
173
174#else
175/* If LED BLINK is not supported/enabled, fallback to LED ON */
176#define led_boot_blink led_boot_on
177#endif
178#else
179static inline int led_boot_on(void)
180{
181 return -ENOSYS;
182}
183
184static inline int led_boot_off(void)
185{
186 return -ENOSYS;
187}
188
189static inline int led_boot_blink(void)
190{
191 return -ENOSYS;
192}
193#endif
194
Simon Glass59171122015-06-23 15:38:45 -0600195#endif