Lines Matching +full:led +full:- +full:s
1 // SPDX-License-Identifier: GPL-2.0-only
3 * LED Class Core
6 * Copyright (C) 2005-2007 Richard Purdie <rpurdie@openedhand.com>
36 mutex_lock(&led_cdev->led_access); in brightness_show()
38 brightness = led_cdev->brightness; in brightness_show()
39 mutex_unlock(&led_cdev->led_access); in brightness_show()
51 mutex_lock(&led_cdev->led_access); in brightness_store()
54 ret = -EBUSY; in brightness_store()
68 mutex_unlock(&led_cdev->led_access); in brightness_store()
79 mutex_lock(&led_cdev->led_access); in max_brightness_show()
80 max_brightness = led_cdev->max_brightness; in max_brightness_show()
81 mutex_unlock(&led_cdev->led_access); in max_brightness_show()
122 if (led_cdev->brightness_hw_changed == -1) in brightness_hw_changed_show()
123 return -ENODATA; in brightness_hw_changed_show()
125 return sprintf(buf, "%u\n", led_cdev->brightness_hw_changed); in brightness_hw_changed_show()
132 struct device *dev = led_cdev->dev; in led_add_brightness_hw_changed()
141 led_cdev->brightness_hw_changed_kn = in led_add_brightness_hw_changed()
142 sysfs_get_dirent(dev->kobj.sd, "brightness_hw_changed"); in led_add_brightness_hw_changed()
143 if (!led_cdev->brightness_hw_changed_kn) { in led_add_brightness_hw_changed()
146 return -ENXIO; in led_add_brightness_hw_changed()
154 sysfs_put(led_cdev->brightness_hw_changed_kn); in led_remove_brightness_hw_changed()
155 device_remove_file(led_cdev->dev, &dev_attr_brightness_hw_changed); in led_remove_brightness_hw_changed()
160 if (WARN_ON(!led_cdev->brightness_hw_changed_kn)) in led_classdev_notify_brightness_hw_changed()
163 led_cdev->brightness_hw_changed = brightness; in led_classdev_notify_brightness_hw_changed()
164 sysfs_notify_dirent(led_cdev->brightness_hw_changed_kn); in led_classdev_notify_brightness_hw_changed()
178 * led_classdev_suspend - suspend an led_classdev.
183 led_cdev->flags |= LED_SUSPENDED; in led_classdev_suspend()
185 flush_work(&led_cdev->set_brightness_work); in led_classdev_suspend()
190 * led_classdev_resume - resume an led_classdev.
195 led_set_brightness_nopm(led_cdev, led_cdev->brightness); in led_classdev_resume()
197 if (led_cdev->flash_resume) in led_classdev_resume()
198 led_cdev->flash_resume(led_cdev); in led_classdev_resume()
200 led_cdev->flags &= ~LED_SUSPENDED; in led_classdev_resume()
209 if (led_cdev->flags & LED_CORE_SUSPENDRESUME) in led_suspend()
219 if (led_cdev->flags & LED_CORE_SUSPENDRESUME) in led_resume()
233 return ERR_PTR(-EPROBE_DEFER); in led_module_get()
237 if (!try_module_get(led_cdev->dev->parent->driver->owner)) { in led_module_get()
238 put_device(led_cdev->dev); in led_module_get()
239 return ERR_PTR(-ENODEV); in led_module_get()
252 * of_led_get() - request a LED device via the LED framework
253 * @np: device node to get the LED device from
254 * @index: the index of the LED
256 * Returns the LED device parsed from the phandle specified in the "leds"
257 * property of a device tree node or a negative error-code on failure.
266 return ERR_PTR(-ENOENT); in of_led_get()
276 * led_put() - release a LED device
277 * @led_cdev: LED device
281 module_put(led_cdev->dev->parent->driver->owner); in led_put()
282 put_device(led_cdev->dev); in led_put()
293 static struct led_classdev *__devm_led_get(struct device *dev, struct led_classdev *led) in __devm_led_get() argument
299 led_put(led); in __devm_led_get()
300 return ERR_PTR(-ENOMEM); in __devm_led_get()
303 *dr = led; in __devm_led_get()
306 return led; in __devm_led_get()
310 * devm_of_led_get - Resource-managed request of a LED device
311 * @dev: LED consumer
312 * @index: index of the LED to obtain in the consumer
314 * The device node of the device is parse to find the request LED device.
315 * The LED device returned from this function is automatically released
318 * @return a pointer to a LED device or ERR_PTR(errno) on failure.
323 struct led_classdev *led; in devm_of_led_get() local
326 return ERR_PTR(-EINVAL); in devm_of_led_get()
328 led = of_led_get(dev->of_node, index); in devm_of_led_get()
329 if (IS_ERR(led)) in devm_of_led_get()
330 return led; in devm_of_led_get()
332 return __devm_led_get(dev, led); in devm_of_led_get()
337 * led_get() - request a LED device via the LED framework
338 * @dev: device for which to get the LED device
339 * @con_id: name of the LED from the device's point of view
341 * @return a pointer to a LED device or ERR_PTR(errno) on failure.
351 if (!strcmp(lookup->dev_id, dev_name(dev)) && in led_get()
352 !strcmp(lookup->con_id, con_id)) { in led_get()
353 provider = kstrdup_const(lookup->provider, GFP_KERNEL); in led_get()
360 return ERR_PTR(-ENOENT); in led_get()
370 * devm_led_get() - request a LED device via the LED framework
371 * @dev: device for which to get the LED device
372 * @con_id: name of the LED from the device's point of view
374 * The LED device returned from this function is automatically released
377 * @return a pointer to a LED device or ERR_PTR(errno) on failure.
381 struct led_classdev *led; in devm_led_get() local
383 led = led_get(dev, con_id); in devm_led_get()
384 if (IS_ERR(led)) in devm_led_get()
385 return led; in devm_led_get()
387 return __devm_led_get(dev, led); in devm_led_get()
392 * led_add_lookup() - Add a LED lookup table entry
395 * Add a LED lookup table entry. On systems without devicetree the lookup table
401 list_add_tail(&led_lookup->list, &leds_lookup_list); in led_add_lookup()
407 * led_remove_lookup() - Remove a LED lookup table entry
413 list_del(&led_lookup->list); in led_remove_lookup()
419 * devm_of_led_get_optional - Resource-managed request of an optional LED device
420 * @dev: LED consumer
421 * @index: index of the LED to obtain in the consumer
423 * The device node of the device is parsed to find the requested LED device.
424 * The LED device returned from this function is automatically released
427 * @return a pointer to a LED device, ERR_PTR(errno) on failure and NULL if the
428 * led was not found.
433 struct led_classdev *led; in devm_of_led_get_optional() local
435 led = devm_of_led_get(dev, index); in devm_of_led_get_optional()
436 if (IS_ERR(led) && PTR_ERR(led) == -ENOENT) in devm_of_led_get_optional()
439 return led; in devm_of_led_get_optional()
459 return -ENOMEM; in led_classdev_next_name()
465 * led_classdev_register_ext - register a new object of led_classdev class
468 * @parent: parent of LED device
470 * @init_data: LED class device initialization data
482 if (init_data->devname_mandatory && !init_data->devicename) { in led_classdev_register_ext()
484 return -EINVAL; in led_classdev_register_ext()
490 if (init_data->fwnode) { in led_classdev_register_ext()
491 fwnode_property_read_string(init_data->fwnode, in led_classdev_register_ext()
492 "linux,default-trigger", in led_classdev_register_ext()
493 &led_cdev->default_trigger); in led_classdev_register_ext()
495 if (fwnode_property_present(init_data->fwnode, in led_classdev_register_ext()
496 "retain-state-shutdown")) in led_classdev_register_ext()
497 led_cdev->flags |= LED_RETAIN_AT_SHUTDOWN; in led_classdev_register_ext()
499 fwnode_property_read_u32(init_data->fwnode, in led_classdev_register_ext()
500 "max-brightness", in led_classdev_register_ext()
501 &led_cdev->max_brightness); in led_classdev_register_ext()
503 if (fwnode_property_present(init_data->fwnode, "color")) in led_classdev_register_ext()
504 fwnode_property_read_u32(init_data->fwnode, "color", in led_classdev_register_ext()
505 &led_cdev->color); in led_classdev_register_ext()
508 proposed_name = led_cdev->name; in led_classdev_register_ext()
514 else if (ret && led_cdev->flags & LED_REJECT_NAME_CONFLICT) in led_classdev_register_ext()
515 return -EEXIST; in led_classdev_register_ext()
517 dev_warn(parent, "Led %s renamed to %s due to name collision\n", in led_classdev_register_ext()
520 if (led_cdev->color >= LED_COLOR_ID_MAX) in led_classdev_register_ext()
521 dev_warn(parent, "LED %s color identifier out of range\n", final_name); in led_classdev_register_ext()
523 mutex_init(&led_cdev->led_access); in led_classdev_register_ext()
524 mutex_lock(&led_cdev->led_access); in led_classdev_register_ext()
525 led_cdev->dev = device_create_with_groups(&leds_class, parent, 0, in led_classdev_register_ext()
526 led_cdev, led_cdev->groups, "%s", final_name); in led_classdev_register_ext()
527 if (IS_ERR(led_cdev->dev)) { in led_classdev_register_ext()
528 mutex_unlock(&led_cdev->led_access); in led_classdev_register_ext()
529 return PTR_ERR(led_cdev->dev); in led_classdev_register_ext()
531 if (init_data && init_data->fwnode) in led_classdev_register_ext()
532 device_set_node(led_cdev->dev, init_data->fwnode); in led_classdev_register_ext()
534 if (led_cdev->flags & LED_BRIGHT_HW_CHANGED) { in led_classdev_register_ext()
537 device_unregister(led_cdev->dev); in led_classdev_register_ext()
538 led_cdev->dev = NULL; in led_classdev_register_ext()
539 mutex_unlock(&led_cdev->led_access); in led_classdev_register_ext()
544 led_cdev->work_flags = 0; in led_classdev_register_ext()
546 init_rwsem(&led_cdev->trigger_lock); in led_classdev_register_ext()
549 led_cdev->brightness_hw_changed = -1; in led_classdev_register_ext()
553 list_add_tail(&led_cdev->node, &leds_list); in led_classdev_register_ext()
556 if (!led_cdev->max_brightness) in led_classdev_register_ext()
557 led_cdev->max_brightness = LED_FULL; in led_classdev_register_ext()
561 led_cdev->wq = leds_wq; in led_classdev_register_ext()
569 mutex_unlock(&led_cdev->led_access); in led_classdev_register_ext()
571 dev_dbg(parent, "Registered led device: %s\n", in led_classdev_register_ext()
572 led_cdev->name); in led_classdev_register_ext()
579 * led_classdev_unregister - unregisters a object of led_properties class.
580 * @led_cdev: the led device to unregister
586 if (IS_ERR_OR_NULL(led_cdev->dev)) in led_classdev_unregister()
590 down_write(&led_cdev->trigger_lock); in led_classdev_unregister()
591 if (led_cdev->trigger) in led_classdev_unregister()
593 up_write(&led_cdev->trigger_lock); in led_classdev_unregister()
596 led_cdev->flags |= LED_UNREGISTERING; in led_classdev_unregister()
601 if (!(led_cdev->flags & LED_RETAIN_AT_SHUTDOWN)) in led_classdev_unregister()
604 flush_work(&led_cdev->set_brightness_work); in led_classdev_unregister()
606 if (led_cdev->flags & LED_BRIGHT_HW_CHANGED) in led_classdev_unregister()
609 device_unregister(led_cdev->dev); in led_classdev_unregister()
612 list_del(&led_cdev->node); in led_classdev_unregister()
615 mutex_destroy(&led_cdev->led_access); in led_classdev_unregister()
625 * devm_led_classdev_register_ext - resource managed led_classdev_register_ext()
627 * @parent: parent of LED device
629 * @init_data: LED class device initialization data
640 return -ENOMEM; in devm_led_classdev_register_ext()
666 * devm_led_classdev_unregister() - resource managed led_classdev_unregister()
684 return -ENOMEM; in leds_init()
701 MODULE_DESCRIPTION("LED Class Interface");