|
@@ -64,7 +64,16 @@ static ssize_t led_brightness_store(struct device *dev,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static ssize_t led_max_brightness_show(struct device *dev,
|
|
|
+ struct device_attribute *attr, char *buf)
|
|
|
+{
|
|
|
+ struct led_classdev *led_cdev = dev_get_drvdata(dev);
|
|
|
+
|
|
|
+ return sprintf(buf, "%u\n", led_cdev->max_brightness);
|
|
|
+}
|
|
|
+
|
|
|
static DEVICE_ATTR(brightness, 0644, led_brightness_show, led_brightness_store);
|
|
|
+static DEVICE_ATTR(max_brightness, 0444, led_max_brightness_show, NULL);
|
|
|
#ifdef CONFIG_LEDS_TRIGGERS
|
|
|
static DEVICE_ATTR(trigger, 0644, led_trigger_show, led_trigger_store);
|
|
|
#endif
|
|
@@ -138,6 +147,13 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
|
|
|
list_add_tail(&led_cdev->node, &leds_list);
|
|
|
up_write(&leds_list_lock);
|
|
|
|
|
|
+ if (!led_cdev->max_brightness)
|
|
|
+ led_cdev->max_brightness = LED_FULL;
|
|
|
+
|
|
|
+ rc = device_create_file(led_cdev->dev, &dev_attr_max_brightness);
|
|
|
+ if (rc)
|
|
|
+ goto err_out_attr_max;
|
|
|
+
|
|
|
led_update_brightness(led_cdev);
|
|
|
|
|
|
#ifdef CONFIG_LEDS_TRIGGERS
|
|
@@ -155,9 +171,11 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
|
|
|
|
|
|
#ifdef CONFIG_LEDS_TRIGGERS
|
|
|
err_out_led_list:
|
|
|
+ device_remove_file(led_cdev->dev, &dev_attr_max_brightness);
|
|
|
+#endif
|
|
|
+err_out_attr_max:
|
|
|
device_remove_file(led_cdev->dev, &dev_attr_brightness);
|
|
|
list_del(&led_cdev->node);
|
|
|
-#endif
|
|
|
err_out:
|
|
|
device_unregister(led_cdev->dev);
|
|
|
return rc;
|
|
@@ -172,6 +190,7 @@ EXPORT_SYMBOL_GPL(led_classdev_register);
|
|
|
*/
|
|
|
void led_classdev_unregister(struct led_classdev *led_cdev)
|
|
|
{
|
|
|
+ device_remove_file(led_cdev->dev, &dev_attr_max_brightness);
|
|
|
device_remove_file(led_cdev->dev, &dev_attr_brightness);
|
|
|
#ifdef CONFIG_LEDS_TRIGGERS
|
|
|
device_remove_file(led_cdev->dev, &dev_attr_trigger);
|