1 /* 2 * Copyright (c) 2015 Google, Inc 3 * Written by Simon Glass <sjg@chromium.org> 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 8 #include <common.h> 9 #include <dm.h> 10 #include <errno.h> 11 #include <led.h> 12 #include <dm/root.h> 13 #include <dm/uclass-internal.h> 14 15 int led_get_by_label(const char *label, struct udevice **devp) 16 { 17 struct udevice *dev; 18 struct uclass *uc; 19 int ret; 20 21 ret = uclass_get(UCLASS_LED, &uc); 22 if (ret) 23 return ret; 24 uclass_foreach_dev(dev, uc) { 25 struct led_uc_plat *uc_plat = dev_get_uclass_platdata(dev); 26 27 /* Ignore the top-level LED node */ 28 if (uc_plat->label && !strcmp(label, uc_plat->label)) 29 return uclass_get_device_tail(dev, 0, devp); 30 } 31 32 return -ENODEV; 33 } 34 35 int led_set_state(struct udevice *dev, enum led_state_t state) 36 { 37 struct led_ops *ops = led_get_ops(dev); 38 39 if (!ops->set_state) 40 return -ENOSYS; 41 42 return ops->set_state(dev, state); 43 } 44 45 enum led_state_t led_get_state(struct udevice *dev) 46 { 47 struct led_ops *ops = led_get_ops(dev); 48 49 if (!ops->get_state) 50 return -ENOSYS; 51 52 return ops->get_state(dev); 53 } 54 55 #ifdef CONFIG_LED_BLINK 56 int led_set_period(struct udevice *dev, int period_ms) 57 { 58 struct led_ops *ops = led_get_ops(dev); 59 60 if (!ops->set_period) 61 return -ENOSYS; 62 63 return ops->set_period(dev, period_ms); 64 } 65 #endif 66 67 UCLASS_DRIVER(led) = { 68 .id = UCLASS_LED, 69 .name = "led", 70 .per_device_platdata_auto_alloc_size = sizeof(struct led_uc_plat), 71 }; 72