Skip to main content
Sign in
Snippets Groups Projects
Select Git revision
  • 268609aa680df23f80e0d9c9ff97a385217c0cb7
  • devel default protected
  • attended-transfer-redesign
  • stop_tls_when_transport_disabled
  • asterisk_rdkb
  • lk_asterisk_service
  • wenpeng-testing-secur
  • fix_transport_config
  • wenpeng-1021
  • fix_crash_at_transport
  • transport-destroy-crash_pjproject
  • fix_transports_init
  • lk_debug_dialogs
  • lk_forking_revert
  • wenpeng-jul8
  • wenpeng-jul9
  • asterisk_rdkb_ipv6
  • 16916_rdkb_merge
  • lk_disable_registrar
  • wenpeng-100rel-ippbx
  • fix_multiple_dns_lookup
  • 22.0.0-pre1
  • 21.4.2
  • 20.9.2
  • 18.24.2
  • certified-20.7-cert2
  • certified-18.9-cert11
  • 21.4.1
  • 20.9.1
  • 18.24.1
  • 21.4.0
  • 20.9.0
  • 18.24.0
  • certified-20.7-cert1
  • certified-18.9-cert10
  • 21.4.0-rc1
  • 20.9.0-rc1
  • 18.24.0-rc1
  • 21.3.1
  • 20.8.1
  • 18.23.1
41 results

enum.c

Blame
  • led-triggers.c 8.97 KiB
    /*
     * LED Triggers Core
     *
     * Copyright 2005-2007 Openedhand Ltd.
     *
     * Author: Richard Purdie <rpurdie@openedhand.com>
     *
     * This program is free software; you can redistribute it and/or modify
     * it under the terms of the GNU General Public License version 2 as
     * published by the Free Software Foundation.
     *
     */
    
    #include <linux/export.h>
    #include <linux/kernel.h>
    #include <linux/list.h>
    #include <linux/spinlock.h>
    #include <linux/device.h>
    #include <linux/timer.h>
    #include <linux/rwsem.h>
    #include <linux/leds.h>
    #include <linux/slab.h>
    #include "leds.h"
    
    /*
     * Nests outside led_cdev->trigger_lock
     */
    static DECLARE_RWSEM(triggers_list_lock);
    LIST_HEAD(trigger_list);
    
     /* Used by LED Class */
    
    ssize_t led_trigger_store(struct device *dev, struct device_attribute *attr,
    		const char *buf, size_t count)
    {
    	struct led_classdev *led_cdev = dev_get_drvdata(dev);
    	struct led_trigger *trig;
    	int ret = count;
    
    	mutex_lock(&led_cdev->led_access);
    
    	if (led_sysfs_is_disabled(led_cdev)) {
    		ret = -EBUSY;
    		goto unlock;
    	}
    
    	if (sysfs_streq(buf, "none")) {
    		led_trigger_remove(led_cdev);
    		goto unlock;
    	}
    
    	down_read(&triggers_list_lock);
    	list_for_each_entry(trig, &trigger_list, next_trig) {
    		if (sysfs_streq(buf, trig->name)) {
    			down_write(&led_cdev->trigger_lock);
    			led_trigger_set(led_cdev, trig);
    			up_write(&led_cdev->trigger_lock);
    
    			up_read(&triggers_list_lock);
    			goto unlock;
    		}
    	}
    	/* we come here only if buf matches no trigger */
    	ret = -EINVAL;
    	up_read(&triggers_list_lock);
    
    unlock:
    	mutex_unlock(&led_cdev->led_access);
    	return ret;
    }