Lines Matching +full:default +full:- +full:trigger

1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright 2005-2007 Openedhand Ltd.
23 * Nests outside led_cdev->trigger_lock
33 return !trig->trigger_type || trig->trigger_type == led_cdev->trigger_type; in trigger_relevant()
45 mutex_lock(&led_cdev->led_access); in led_trigger_write()
48 ret = -EBUSY; in led_trigger_write()
57 if (sysfs_streq(buf, "default")) { in led_trigger_write()
64 if (sysfs_streq(buf, trig->name) && trigger_relevant(led_cdev, trig)) { in led_trigger_write()
65 down_write(&led_cdev->trigger_lock); in led_trigger_write()
67 up_write(&led_cdev->trigger_lock); in led_trigger_write()
73 /* we come here only if buf matches no trigger */ in led_trigger_write()
74 ret = -EINVAL; in led_trigger_write()
78 mutex_unlock(&led_cdev->led_access); in led_trigger_write()
104 led_cdev->trigger ? "none" : "[none]"); in led_trigger_format()
106 if (led_cdev->default_trigger) in led_trigger_format()
107 len += led_trigger_snprintf(buf + len, size - len, " default"); in led_trigger_format()
115 hit = led_cdev->trigger && !strcmp(led_cdev->trigger->name, trig->name); in led_trigger_format()
117 len += led_trigger_snprintf(buf + len, size - len, in led_trigger_format()
119 trig->name, hit ? "]" : ""); in led_trigger_format()
122 len += led_trigger_snprintf(buf + len, size - len, "\n"); in led_trigger_format()
143 down_read(&led_cdev->trigger_lock); in led_trigger_read()
148 up_read(&led_cdev->trigger_lock); in led_trigger_read()
150 return -ENOMEM; in led_trigger_read()
154 up_read(&led_cdev->trigger_lock); in led_trigger_read()
165 /* Caller must ensure led_cdev->trigger_lock held */
173 if (!led_cdev->trigger && !trig) in led_trigger_set()
176 name = trig ? trig->name : "none"; in led_trigger_set()
177 event = kasprintf(GFP_KERNEL, "TRIGGER=%s", name); in led_trigger_set()
179 /* Remove any existing trigger */ in led_trigger_set()
180 if (led_cdev->trigger) { in led_trigger_set()
181 spin_lock(&led_cdev->trigger->leddev_list_lock); in led_trigger_set()
182 list_del_rcu(&led_cdev->trig_list); in led_trigger_set()
183 spin_unlock(&led_cdev->trigger->leddev_list_lock); in led_trigger_set()
188 cancel_work_sync(&led_cdev->set_brightness_work); in led_trigger_set()
190 device_remove_groups(led_cdev->dev, led_cdev->trigger->groups); in led_trigger_set()
191 if (led_cdev->trigger->deactivate) in led_trigger_set()
192 led_cdev->trigger->deactivate(led_cdev); in led_trigger_set()
193 led_cdev->trigger = NULL; in led_trigger_set()
194 led_cdev->trigger_data = NULL; in led_trigger_set()
195 led_cdev->activated = false; in led_trigger_set()
196 led_cdev->flags &= ~LED_INIT_DEFAULT_TRIGGER; in led_trigger_set()
200 spin_lock(&trig->leddev_list_lock); in led_trigger_set()
201 list_add_tail_rcu(&led_cdev->trig_list, &trig->led_cdevs); in led_trigger_set()
202 spin_unlock(&trig->leddev_list_lock); in led_trigger_set()
203 led_cdev->trigger = trig; in led_trigger_set()
207 * the brightness of the LED for which the trigger is being set. in led_trigger_set()
208 * Ensure the led_cdev is visible on trig->led_cdevs for this. in led_trigger_set()
214 * we don't want that to be reordered after ->activate() in led_trigger_set()
216 flush_work(&led_cdev->set_brightness_work); in led_trigger_set()
219 if (trig->activate) in led_trigger_set()
220 ret = trig->activate(led_cdev); in led_trigger_set()
222 led_set_brightness(led_cdev, trig->brightness); in led_trigger_set()
226 ret = device_add_groups(led_cdev->dev, trig->groups); in led_trigger_set()
228 dev_err(led_cdev->dev, "Failed to add trigger attributes\n"); in led_trigger_set()
236 if (kobject_uevent_env(&led_cdev->dev->kobj, KOBJ_CHANGE, envp)) in led_trigger_set()
237 dev_err(led_cdev->dev, in led_trigger_set()
246 if (trig->deactivate) in led_trigger_set()
247 trig->deactivate(led_cdev); in led_trigger_set()
250 spin_lock(&led_cdev->trigger->leddev_list_lock); in led_trigger_set()
251 list_del_rcu(&led_cdev->trig_list); in led_trigger_set()
252 spin_unlock(&led_cdev->trigger->leddev_list_lock); in led_trigger_set()
254 led_cdev->trigger = NULL; in led_trigger_set()
255 led_cdev->trigger_data = NULL; in led_trigger_set()
265 down_write(&led_cdev->trigger_lock); in led_trigger_remove()
267 up_write(&led_cdev->trigger_lock); in led_trigger_remove()
274 if (!strcmp(led_cdev->default_trigger, trig->name) && in led_match_default_trigger()
276 led_cdev->flags |= LED_INIT_DEFAULT_TRIGGER; in led_match_default_trigger()
289 if (!led_cdev->default_trigger) in led_trigger_set_default()
292 if (!strcmp(led_cdev->default_trigger, "none")) { in led_trigger_set_default()
298 down_write(&led_cdev->trigger_lock); in led_trigger_set_default()
304 up_write(&led_cdev->trigger_lock); in led_trigger_set_default()
308 * If default trigger wasn't found, maybe trigger module isn't loaded yet. in led_trigger_set_default()
309 * Once loaded it will re-probe with all led_cdev's. in led_trigger_set_default()
312 request_module_nowait("ledtrig:%s", led_cdev->default_trigger); in led_trigger_set_default()
316 /* LED Trigger Interface */
323 spin_lock_init(&trig->leddev_list_lock); in led_trigger_register()
324 INIT_LIST_HEAD(&trig->led_cdevs); in led_trigger_register()
327 /* Make sure the trigger's name isn't already in use */ in led_trigger_register()
329 if (!strcmp(_trig->name, trig->name) && in led_trigger_register()
330 (trig->trigger_type == _trig->trigger_type || in led_trigger_register()
331 !trig->trigger_type || !_trig->trigger_type)) { in led_trigger_register()
333 return -EEXIST; in led_trigger_register()
337 list_add_tail(&trig->next_trig, &trigger_list); in led_trigger_register()
340 /* Register with any LEDs that have this as a default trigger */ in led_trigger_register()
343 down_write(&led_cdev->trigger_lock); in led_trigger_register()
344 if (!led_cdev->trigger && led_cdev->default_trigger) in led_trigger_register()
346 up_write(&led_cdev->trigger_lock); in led_trigger_register()
358 if (list_empty_careful(&trig->next_trig)) in led_trigger_unregister()
363 list_del_init(&trig->next_trig); in led_trigger_unregister()
366 /* Remove anyone actively using this trigger */ in led_trigger_unregister()
369 down_write(&led_cdev->trigger_lock); in led_trigger_unregister()
370 if (led_cdev->trigger == trig) in led_trigger_unregister()
372 up_write(&led_cdev->trigger_lock); in led_trigger_unregister()
392 return -ENOMEM; in devm_led_trigger_register()
406 /* Simple LED Trigger Interface */
416 trig->brightness = brightness; in led_trigger_event()
419 list_for_each_entry_rcu(led_cdev, &trig->led_cdevs, trig_list) in led_trigger_event()
435 list_for_each_entry_rcu(led_cdev, &trig->led_cdevs, trig_list) { in led_mc_trigger_event()
436 if (!(led_cdev->flags & LED_MULTI_COLOR)) in led_mc_trigger_event()
457 list_for_each_entry_rcu(led_cdev, &trig->led_cdevs, trig_list) { in led_trigger_blink_setup()
492 trig->name = name; in led_trigger_register_simple()
497 pr_warn("LED trigger %s failed to register (%d)\n", in led_trigger_register_simple()
501 pr_warn("LED trigger %s failed to register (no memory)\n", in led_trigger_register_simple()