libceph: move r_reply_op_{len,result} into struct ceph_osd_req_op
[linux-2.6-block.git] / drivers / leds / led-core.c
index 19e1e60dfaa354585ca01e2ffdc2a47f29c49c3b..3495d5d6547f65a6fe507f063dce397bc424496f 100644 (file)
@@ -25,6 +25,26 @@ EXPORT_SYMBOL_GPL(leds_list_lock);
 LIST_HEAD(leds_list);
 EXPORT_SYMBOL_GPL(leds_list);
 
+static int __led_set_brightness(struct led_classdev *led_cdev,
+                               enum led_brightness value)
+{
+       if (!led_cdev->brightness_set)
+               return -ENOTSUPP;
+
+       led_cdev->brightness_set(led_cdev, value);
+
+       return 0;
+}
+
+static int __led_set_brightness_blocking(struct led_classdev *led_cdev,
+                                        enum led_brightness value)
+{
+       if (!led_cdev->brightness_set_blocking)
+               return -ENOTSUPP;
+
+       return led_cdev->brightness_set_blocking(led_cdev, value);
+}
+
 static void led_timer_function(unsigned long data)
 {
        struct led_classdev *led_cdev = (void *)data;
@@ -91,14 +111,14 @@ static void set_brightness_delayed(struct work_struct *ws)
                led_cdev->flags &= ~LED_BLINK_DISABLE;
        }
 
-       if (led_cdev->brightness_set)
-               led_cdev->brightness_set(led_cdev, led_cdev->delayed_set_value);
-       else if (led_cdev->brightness_set_blocking)
-               ret = led_cdev->brightness_set_blocking(led_cdev,
-                                               led_cdev->delayed_set_value);
-       else
-               ret = -ENOTSUPP;
-       if (ret < 0)
+       ret = __led_set_brightness(led_cdev, led_cdev->delayed_set_value);
+       if (ret == -ENOTSUPP)
+               ret = __led_set_brightness_blocking(led_cdev,
+                                       led_cdev->delayed_set_value);
+       if (ret < 0 &&
+           /* LED HW might have been unplugged, therefore don't warn */
+           !(ret == -ENODEV && (led_cdev->flags & LED_UNREGISTERING) &&
+           (led_cdev->flags & LED_HW_PLUGGABLE)))
                dev_err(led_cdev->dev,
                        "Setting an LED's brightness failed (%d)\n", ret);
 }
@@ -233,10 +253,8 @@ void led_set_brightness_nopm(struct led_classdev *led_cdev,
                              enum led_brightness value)
 {
        /* Use brightness_set op if available, it is guaranteed not to sleep */
-       if (led_cdev->brightness_set) {
-               led_cdev->brightness_set(led_cdev, value);
+       if (!__led_set_brightness(led_cdev, value))
                return;
-       }
 
        /* If brightness setting can sleep, delegate it to a work queue task */
        led_cdev->delayed_set_value = value;
@@ -267,10 +285,7 @@ int led_set_brightness_sync(struct led_classdev *led_cdev,
        if (led_cdev->flags & LED_SUSPENDED)
                return 0;
 
-       if (led_cdev->brightness_set_blocking)
-               return led_cdev->brightness_set_blocking(led_cdev,
-                                                        led_cdev->brightness);
-       return -ENOTSUPP;
+       return __led_set_brightness_blocking(led_cdev, led_cdev->brightness);
 }
 EXPORT_SYMBOL_GPL(led_set_brightness_sync);