Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | /* SPDX-License-Identifier: GPL-2.0+ */ /* * Copyright (c) 2015 Google, Inc * Written by Simon Glass <sjg@chromium.org> */ #ifndef __LED_H #define __LED_H #include <stdbool.h> #include <cyclic.h> struct udevice; enum led_state_t { LEDST_OFF = 0, LEDST_ON = 1, LEDST_TOGGLE, LEDST_BLINK, LEDST_COUNT, }; enum led_sw_blink_state_t { LED_SW_BLINK_ST_DISABLED, LED_SW_BLINK_ST_NOT_READY, LED_SW_BLINK_ST_OFF, LED_SW_BLINK_ST_ON, }; struct led_sw_blink { enum led_sw_blink_state_t state; struct udevice *dev; struct cyclic_info cyclic; const char cyclic_name[0]; }; /** * struct led_uc_plat - Platform data the uclass stores about each device * * @label: LED label * @default_state: LED default state */ struct led_uc_plat { const char *label; enum led_state_t default_state; #ifdef CONFIG_LED_SW_BLINK struct led_sw_blink *sw_blink; #endif }; /** * struct led_uc_priv - Private data the uclass stores about each device * * @period_ms: Flash period in milliseconds */ struct led_uc_priv { int period_ms; }; struct led_ops { /** * set_state() - set the state of an LED * * @dev: LED device to change * @state: LED state to set * @return 0 if OK, -ve on error */ int (*set_state)(struct udevice *dev, enum led_state_t state); /** * led_get_state() - get the state of an LED * * @dev: LED device to change * @return LED state led_state_t, or -ve on error */ enum led_state_t (*get_state)(struct udevice *dev); #ifdef CONFIG_LED_BLINK /** * led_set_period() - set the blink period of an LED * * Thie records the period if supported, or returns -ENOSYS if not. * To start the LED blinking, use set_state(). * * @dev: LED device to change * @period_ms: LED blink period in milliseconds * @return 0 if OK, -ve on error */ int (*set_period)(struct udevice *dev, int period_ms); #endif }; #define led_get_ops(dev) ((struct led_ops *)(dev)->driver->ops) /** * led_get_by_label() - Find an LED device by label * * @label: LED label to look up * @devp: Returns the associated device, if found * Return: 0 if found, -ENODEV if not found, other -ve on error */ int led_get_by_label(const char *label, struct udevice **devp); /** * led_set_state() - set the state of an LED * * @dev: LED device to change * @state: LED state to set * Return: 0 if OK, -ve on error */ int led_set_state(struct udevice *dev, enum led_state_t state); /** * led_get_state() - get the state of an LED * * @dev: LED device to change * Return: LED state led_state_t, or -ve on error */ enum led_state_t led_get_state(struct udevice *dev); /** * led_set_period() - set the blink period of an LED * * @dev: LED device to change * @period_ms: LED blink period in milliseconds * Return: 0 if OK, -ve on error */ int led_set_period(struct udevice *dev, int period_ms); /** * led_bind_generic() - bind children of parent to given driver * * @parent: Top-level LED device * @driver_name: Driver for handling individual child nodes */ int led_bind_generic(struct udevice *parent, const char *driver_name); /* Internal functions for software blinking. Do not use them in your code */ int led_sw_set_period(struct udevice *dev, int period_ms); bool led_sw_is_blinking(struct udevice *dev); bool led_sw_on_state_change(struct udevice *dev, enum led_state_t state); #endif |