Skip to main content
Sign in
Snippets Groups Projects
Select Git revision
  • fef58dd6628c4b8b9c921fae473874fcda6361bf
  • master default protected
  • iop-ugw-8.4.1.50
  • iop-ugw-8.4.1.30
  • 8.1.1-ga_master
  • fix-1150
  • speedport_smart3
  • sps3
  • 8.1.1_master
  • jh
  • jh-mcast
11 results

led-triggers.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;
    }