/** * of_led_get() - request a LED device via the LED framework * @np: device node to get the LED device from * @index: the index of the LED * * Returns the LED device parsed from the phandle specified in the "leds" * property of a device tree node or a negative error-code on failure.
*/ staticstruct led_classdev *of_led_get(struct device_node *np, int index)
{ struct device *led_dev; struct device_node *led_node;
led_node = of_parse_phandle(np, "leds", index); if (!led_node) return ERR_PTR(-ENOENT);
dr = devres_alloc(devm_led_release, sizeof(struct led_classdev *), GFP_KERNEL); if (!dr) {
led_put(led); return ERR_PTR(-ENOMEM);
}
*dr = led;
devres_add(dev, dr);
return led;
}
/** * devm_of_led_get - Resource-managed request of a LED device * @dev: LED consumer * @index: index of the LED to obtain in the consumer * * The device node of the device is parse to find the request LED device. * The LED device returned from this function is automatically released * on driver detach. * * @return a pointer to a LED device or ERR_PTR(errno) on failure.
*/ struct led_classdev *__must_check devm_of_led_get(struct device *dev, int index)
{ struct led_classdev *led;
if (!dev) return ERR_PTR(-EINVAL);
led = of_led_get(dev->of_node, index); if (IS_ERR(led)) return led;
/** * led_get() - request a LED device via the LED framework * @dev: device for which to get the LED device * @con_id: name of the LED from the device's point of view * * @return a pointer to a LED device or ERR_PTR(errno) on failure.
*/ struct led_classdev *led_get(struct device *dev, char *con_id)
{ struct led_lookup_data *lookup; constchar *provider = NULL; struct device *led_dev;
/** * devm_led_get() - request a LED device via the LED framework * @dev: device for which to get the LED device * @con_id: name of the LED from the device's point of view * * The LED device returned from this function is automatically released * on driver detach. * * @return a pointer to a LED device or ERR_PTR(errno) on failure.
*/ struct led_classdev *devm_led_get(struct device *dev, char *con_id)
{ struct led_classdev *led;
led = led_get(dev, con_id); if (IS_ERR(led)) return led;
/** * led_add_lookup() - Add a LED lookup table entry * @led_lookup: the lookup table entry to add * * Add a LED lookup table entry. On systems without devicetree the lookup table * is used by led_get() to find LEDs.
*/ void led_add_lookup(struct led_lookup_data *led_lookup)
{
mutex_lock(&leds_lookup_lock);
list_add_tail(&led_lookup->list, &leds_lookup_list);
mutex_unlock(&leds_lookup_lock);
}
EXPORT_SYMBOL_GPL(led_add_lookup);
/** * led_remove_lookup() - Remove a LED lookup table entry * @led_lookup: the lookup table entry to remove
*/ void led_remove_lookup(struct led_lookup_data *led_lookup)
{
mutex_lock(&leds_lookup_lock);
list_del(&led_lookup->list);
mutex_unlock(&leds_lookup_lock);
}
EXPORT_SYMBOL_GPL(led_remove_lookup);
/** * devm_of_led_get_optional - Resource-managed request of an optional LED device * @dev: LED consumer * @index: index of the LED to obtain in the consumer * * The device node of the device is parsed to find the requested LED device. * The LED device returned from this function is automatically released * on driver detach. * * @return a pointer to a LED device, ERR_PTR(errno) on failure and NULL if the * led was not found.
*/ struct led_classdev *__must_check devm_of_led_get_optional(struct device *dev, int index)
{ struct led_classdev *led;
led = devm_of_led_get(dev, index); if (IS_ERR(led) && PTR_ERR(led) == -ENOENT) return NULL;
staticint led_classdev_next_name(constchar *init_name, char *name,
size_t len)
{ unsignedint i = 0; int ret = 0; struct device *dev;
strscpy(name, init_name, len);
while ((ret < len) &&
(dev = class_find_device_by_name(&leds_class, name))) {
put_device(dev);
ret = snprintf(name, len, "%s_%u", init_name, ++i);
}
if (ret >= len) return -ENOMEM;
return i;
}
/** * led_classdev_register_ext - register a new object of led_classdev class * with init data. * * @parent: parent of LED device * @led_cdev: the led_classdev structure for this device. * @init_data: LED class device initialization data
*/ int led_classdev_register_ext(struct device *parent, struct led_classdev *led_cdev, struct led_init_data *init_data)
{ char composed_name[LED_MAX_NAME_SIZE]; char final_name[LED_MAX_NAME_SIZE]; constchar *proposed_name = composed_name; int ret;
if (init_data) { if (init_data->devname_mandatory && !init_data->devicename) {
dev_err(parent, "Mandatory device name is missing"); return -EINVAL;
}
ret = led_compose_name(parent, init_data, composed_name); if (ret < 0) return ret;
if (init_data->fwnode) {
fwnode_property_read_string(init_data->fwnode, "linux,default-trigger",
&led_cdev->default_trigger);
if (fwnode_property_present(init_data->fwnode, "retain-state-shutdown"))
led_cdev->flags |= LED_RETAIN_AT_SHUTDOWN;
/** * led_classdev_unregister - unregisters a object of led_properties class. * @led_cdev: the led device to unregister * * Unregisters a previously registered via led_classdev_register object.
*/ void led_classdev_unregister(struct led_classdev *led_cdev)
{ if (IS_ERR_OR_NULL(led_cdev->dev)) return;
#ifdef CONFIG_LEDS_TRIGGERS
down_write(&led_cdev->trigger_lock); if (led_cdev->trigger)
led_trigger_set(led_cdev, NULL);
up_write(&led_cdev->trigger_lock); #endif
/** * devm_led_classdev_register_ext - resource managed led_classdev_register_ext() * * @parent: parent of LED device * @led_cdev: the led_classdev structure for this device. * @init_data: LED class device initialization data
*/ int devm_led_classdev_register_ext(struct device *parent, struct led_classdev *led_cdev, struct led_init_data *init_data)
{ struct led_classdev **dr; int rc;
dr = devres_alloc(devm_led_classdev_release, sizeof(*dr), GFP_KERNEL); if (!dr) return -ENOMEM;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.