led-triggers.c (0cce284537fb42d9c28b9b31038ffc9b464555f5) | led-triggers.c (2282e125a406e09331c5a785e3df29035c99a607) |
---|---|
1/* 2 * LED Triggers Core 3 * 4 * Copyright 2005-2007 Openedhand Ltd. 5 * 6 * Author: Richard Purdie <rpurdie@openedhand.com> 7 * 8 * This program is free software; you can redistribute it and/or modify --- 89 unchanged lines hidden (view full) --- 98 up_read(&triggers_list_lock); 99 100 len += scnprintf(len+buf, PAGE_SIZE - len, "\n"); 101 return len; 102} 103EXPORT_SYMBOL_GPL(led_trigger_show); 104 105/* Caller must ensure led_cdev->trigger_lock held */ | 1/* 2 * LED Triggers Core 3 * 4 * Copyright 2005-2007 Openedhand Ltd. 5 * 6 * Author: Richard Purdie <rpurdie@openedhand.com> 7 * 8 * This program is free software; you can redistribute it and/or modify --- 89 unchanged lines hidden (view full) --- 98 up_read(&triggers_list_lock); 99 100 len += scnprintf(len+buf, PAGE_SIZE - len, "\n"); 101 return len; 102} 103EXPORT_SYMBOL_GPL(led_trigger_show); 104 105/* Caller must ensure led_cdev->trigger_lock held */ |
106void led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trig) | 106int led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trig) |
107{ 108 unsigned long flags; 109 char *event = NULL; 110 char *envp[2]; 111 const char *name; | 107{ 108 unsigned long flags; 109 char *event = NULL; 110 char *envp[2]; 111 const char *name; |
112 int ret; |
|
112 113 if (!led_cdev->trigger && !trig) | 113 114 if (!led_cdev->trigger && !trig) |
114 return; | 115 return 0; |
115 116 name = trig ? trig->name : "none"; 117 event = kasprintf(GFP_KERNEL, "TRIGGER=%s", name); 118 119 /* Remove any existing trigger */ 120 if (led_cdev->trigger) { 121 write_lock_irqsave(&led_cdev->trigger->leddev_list_lock, flags); 122 list_del(&led_cdev->trig_list); --- 6 unchanged lines hidden (view full) --- 129 led_cdev->trigger = NULL; 130 led_set_brightness(led_cdev, LED_OFF); 131 } 132 if (trig) { 133 write_lock_irqsave(&trig->leddev_list_lock, flags); 134 list_add_tail(&led_cdev->trig_list, &trig->led_cdevs); 135 write_unlock_irqrestore(&trig->leddev_list_lock, flags); 136 led_cdev->trigger = trig; | 116 117 name = trig ? trig->name : "none"; 118 event = kasprintf(GFP_KERNEL, "TRIGGER=%s", name); 119 120 /* Remove any existing trigger */ 121 if (led_cdev->trigger) { 122 write_lock_irqsave(&led_cdev->trigger->leddev_list_lock, flags); 123 list_del(&led_cdev->trig_list); --- 6 unchanged lines hidden (view full) --- 130 led_cdev->trigger = NULL; 131 led_set_brightness(led_cdev, LED_OFF); 132 } 133 if (trig) { 134 write_lock_irqsave(&trig->leddev_list_lock, flags); 135 list_add_tail(&led_cdev->trig_list, &trig->led_cdevs); 136 write_unlock_irqrestore(&trig->leddev_list_lock, flags); 137 led_cdev->trigger = trig; |
138 |
|
137 if (trig->activate) | 139 if (trig->activate) |
138 trig->activate(led_cdev); | 140 ret = trig->activate(led_cdev); 141 else 142 ret = 0; 143 144 if (ret) 145 goto err_activate; |
139 } 140 141 if (event) { 142 envp[0] = event; 143 envp[1] = NULL; 144 if (kobject_uevent_env(&led_cdev->dev->kobj, KOBJ_CHANGE, envp)) 145 dev_err(led_cdev->dev, 146 "%s: Error sending uevent\n", __func__); 147 kfree(event); 148 } | 146 } 147 148 if (event) { 149 envp[0] = event; 150 envp[1] = NULL; 151 if (kobject_uevent_env(&led_cdev->dev->kobj, KOBJ_CHANGE, envp)) 152 dev_err(led_cdev->dev, 153 "%s: Error sending uevent\n", __func__); 154 kfree(event); 155 } |
156 157 return 0; 158 159err_activate: 160 led_cdev->trigger = NULL; 161 write_lock_irqsave(&led_cdev->trigger->leddev_list_lock, flags); 162 list_del(&led_cdev->trig_list); 163 write_unlock_irqrestore(&led_cdev->trigger->leddev_list_lock, flags); 164 led_set_brightness(led_cdev, LED_OFF); 165 166 return ret; |
|
149} 150EXPORT_SYMBOL_GPL(led_trigger_set); 151 152void led_trigger_remove(struct led_classdev *led_cdev) 153{ 154 down_write(&led_cdev->trigger_lock); 155 led_trigger_set(led_cdev, NULL); 156 up_write(&led_cdev->trigger_lock); --- 210 unchanged lines hidden --- | 167} 168EXPORT_SYMBOL_GPL(led_trigger_set); 169 170void led_trigger_remove(struct led_classdev *led_cdev) 171{ 172 down_write(&led_cdev->trigger_lock); 173 led_trigger_set(led_cdev, NULL); 174 up_write(&led_cdev->trigger_lock); --- 210 unchanged lines hidden --- |