diff options
| author | Jeff Garzik <jeff@garzik.org> | 2006-10-17 03:10:20 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-17 11:18:46 -0400 |
| commit | 12fda16814bba05a84a49a1da25a069d6c249758 (patch) | |
| tree | 05cb63f14784190d75e98d6ac3f9b2e5949a5539 /drivers/leds | |
| parent | 58ff407bee5a55f9c1188a3f9d70ffc79485183c (diff) | |
[PATCH] drivers/led: handle sysfs errors
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Cc: Richard Purdie <rpurdie@rpsys.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/leds')
| -rw-r--r-- | drivers/leds/led-class.c | 26 | ||||
| -rw-r--r-- | drivers/leds/ledtrig-timer.c | 16 |
2 files changed, 35 insertions, 7 deletions
diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c index aecbbe2e89..3c1711210e 100644 --- a/drivers/leds/led-class.c +++ b/drivers/leds/led-class.c | |||
| @@ -91,6 +91,8 @@ EXPORT_SYMBOL_GPL(led_classdev_resume); | |||
| 91 | */ | 91 | */ |
| 92 | int led_classdev_register(struct device *parent, struct led_classdev *led_cdev) | 92 | int led_classdev_register(struct device *parent, struct led_classdev *led_cdev) |
| 93 | { | 93 | { |
| 94 | int rc; | ||
| 95 | |||
| 94 | led_cdev->class_dev = class_device_create(leds_class, NULL, 0, | 96 | led_cdev->class_dev = class_device_create(leds_class, NULL, 0, |
| 95 | parent, "%s", led_cdev->name); | 97 | parent, "%s", led_cdev->name); |
| 96 | if (unlikely(IS_ERR(led_cdev->class_dev))) | 98 | if (unlikely(IS_ERR(led_cdev->class_dev))) |
| @@ -99,8 +101,10 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev) | |||
| 99 | class_set_devdata(led_cdev->class_dev, led_cdev); | 101 | class_set_devdata(led_cdev->class_dev, led_cdev); |
| 100 | 102 | ||
| 101 | /* register the attributes */ | 103 | /* register the attributes */ |
| 102 | class_device_create_file(led_cdev->class_dev, | 104 | rc = class_device_create_file(led_cdev->class_dev, |
| 103 | &class_device_attr_brightness); | 105 | &class_device_attr_brightness); |
| 106 | if (rc) | ||
| 107 | goto err_out; | ||
| 104 | 108 | ||
| 105 | /* add to the list of leds */ | 109 | /* add to the list of leds */ |
| 106 | write_lock(&leds_list_lock); | 110 | write_lock(&leds_list_lock); |
| @@ -110,16 +114,28 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev) | |||
| 110 | #ifdef CONFIG_LEDS_TRIGGERS | 114 | #ifdef CONFIG_LEDS_TRIGGERS |
| 111 | rwlock_init(&led_cdev->trigger_lock); | 115 | rwlock_init(&led_cdev->trigger_lock); |
| 112 | 116 | ||
| 113 | led_trigger_set_default(led_cdev); | 117 | rc = class_device_create_file(led_cdev->class_dev, |
| 118 | &class_device_attr_trigger); | ||
| 119 | if (rc) | ||
| 120 | goto err_out_led_list; | ||
| 114 | 121 | ||
| 115 | class_device_create_file(led_cdev->class_dev, | 122 | led_trigger_set_default(led_cdev); |
| 116 | &class_device_attr_trigger); | ||
| 117 | #endif | 123 | #endif |
| 118 | 124 | ||
| 119 | printk(KERN_INFO "Registered led device: %s\n", | 125 | printk(KERN_INFO "Registered led device: %s\n", |
| 120 | led_cdev->class_dev->class_id); | 126 | led_cdev->class_dev->class_id); |
| 121 | 127 | ||
| 122 | return 0; | 128 | return 0; |
| 129 | |||
| 130 | #ifdef CONFIG_LEDS_TRIGGERS | ||
| 131 | err_out_led_list: | ||
| 132 | class_device_remove_file(led_cdev->class_dev, | ||
| 133 | &class_device_attr_brightness); | ||
| 134 | list_del(&led_cdev->node); | ||
| 135 | #endif | ||
| 136 | err_out: | ||
| 137 | class_device_unregister(led_cdev->class_dev); | ||
| 138 | return rc; | ||
| 123 | } | 139 | } |
| 124 | EXPORT_SYMBOL_GPL(led_classdev_register); | 140 | EXPORT_SYMBOL_GPL(led_classdev_register); |
| 125 | 141 | ||
diff --git a/drivers/leds/ledtrig-timer.c b/drivers/leds/ledtrig-timer.c index 179c2876b5..29a8818a32 100644 --- a/drivers/leds/ledtrig-timer.c +++ b/drivers/leds/ledtrig-timer.c | |||
| @@ -123,6 +123,7 @@ static CLASS_DEVICE_ATTR(delay_off, 0644, led_delay_off_show, | |||
| 123 | static void timer_trig_activate(struct led_classdev *led_cdev) | 123 | static void timer_trig_activate(struct led_classdev *led_cdev) |
| 124 | { | 124 | { |
| 125 | struct timer_trig_data *timer_data; | 125 | struct timer_trig_data *timer_data; |
| 126 | int rc; | ||
| 126 | 127 | ||
| 127 | timer_data = kzalloc(sizeof(struct timer_trig_data), GFP_KERNEL); | 128 | timer_data = kzalloc(sizeof(struct timer_trig_data), GFP_KERNEL); |
| 128 | if (!timer_data) | 129 | if (!timer_data) |
| @@ -134,10 +135,21 @@ static void timer_trig_activate(struct led_classdev *led_cdev) | |||
| 134 | timer_data->timer.function = led_timer_function; | 135 | timer_data->timer.function = led_timer_function; |
| 135 | timer_data->timer.data = (unsigned long) led_cdev; | 136 | timer_data->timer.data = (unsigned long) led_cdev; |
| 136 | 137 | ||
| 137 | class_device_create_file(led_cdev->class_dev, | 138 | rc = class_device_create_file(led_cdev->class_dev, |
| 138 | &class_device_attr_delay_on); | 139 | &class_device_attr_delay_on); |
| 139 | class_device_create_file(led_cdev->class_dev, | 140 | if (rc) goto err_out; |
| 141 | rc = class_device_create_file(led_cdev->class_dev, | ||
| 140 | &class_device_attr_delay_off); | 142 | &class_device_attr_delay_off); |
| 143 | if (rc) goto err_out_delayon; | ||
| 144 | |||
| 145 | return; | ||
| 146 | |||
| 147 | err_out_delayon: | ||
| 148 | class_device_remove_file(led_cdev->class_dev, | ||
| 149 | &class_device_attr_delay_on); | ||
| 150 | err_out: | ||
| 151 | led_cdev->trigger_data = NULL; | ||
| 152 | kfree(timer_data); | ||
| 141 | } | 153 | } |
| 142 | 154 | ||
| 143 | static void timer_trig_deactivate(struct led_classdev *led_cdev) | 155 | static void timer_trig_deactivate(struct led_classdev *led_cdev) |
