leds: flash: Add support for flash/strobe duration
authorRichard Leitner <richard.leitner@linux.dev>
Wed, 7 May 2025 07:51:31 +0000 (09:51 +0200)
committerLee Jones <lee@kernel.org>
Wed, 14 May 2025 08:25:09 +0000 (09:25 +0100)
Add support for the new V4L2_CID_FLASH_DURATION control to the LEDs
driver.

Signed-off-by: Richard Leitner <richard.leitner@linux.dev>
Link: https://lore.kernel.org/r/20250507-ov9282-flash-strobe-v4-2-72b299c1b7c9@linux.dev
Signed-off-by: Lee Jones <lee@kernel.org>
drivers/leds/led-class-flash.c
include/linux/led-class-flash.h

index f4e26ce84862c05092a9598e63ed301967852f13..165035a8826ca7d44a5cd265a5130a76c6e94347 100644 (file)
@@ -440,6 +440,21 @@ int led_update_flash_brightness(struct led_classdev_flash *fled_cdev)
 }
 EXPORT_SYMBOL_GPL(led_update_flash_brightness);
 
+int led_set_flash_duration(struct led_classdev_flash *fled_cdev, u32 duration)
+{
+       struct led_classdev *led_cdev = &fled_cdev->led_cdev;
+       struct led_flash_setting *s = &fled_cdev->duration;
+
+       s->val = duration;
+       led_clamp_align(s);
+
+       if (!(led_cdev->flags & LED_SUSPENDED))
+               return call_flash_op(fled_cdev, duration_set, s->val);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(led_set_flash_duration);
+
 MODULE_AUTHOR("Jacek Anaszewski <j.anaszewski@samsung.com>");
 MODULE_DESCRIPTION("LED Flash class interface");
 MODULE_LICENSE("GPL v2");
index 36df927ec4b7dcaf9074c6ef32ac8ce83a87a79d..21ec856c36bc67decda46aa8ff1c040ffdcf1181 100644 (file)
@@ -45,6 +45,8 @@ struct led_flash_ops {
        int (*timeout_set)(struct led_classdev_flash *fled_cdev, u32 timeout);
        /* get the flash LED fault */
        int (*fault_get)(struct led_classdev_flash *fled_cdev, u32 *fault);
+       /* set flash duration */
+       int (*duration_set)(struct led_classdev_flash *fled_cdev, u32 duration);
 };
 
 /*
@@ -75,6 +77,9 @@ struct led_classdev_flash {
        /* flash timeout value in microseconds along with its constraints */
        struct led_flash_setting timeout;
 
+       /* flash timeout value in microseconds along with its constraints */
+       struct led_flash_setting duration;
+
        /* LED Flash class sysfs groups */
        const struct attribute_group *sysfs_groups[LED_FLASH_SYSFS_GROUPS_SIZE];
 };
@@ -209,4 +214,15 @@ int led_set_flash_timeout(struct led_classdev_flash *fled_cdev, u32 timeout);
  */
 int led_get_flash_fault(struct led_classdev_flash *fled_cdev, u32 *fault);
 
+/**
+ * led_set_flash_duration - set flash LED duration
+ * @fled_cdev: the flash LED to set
+ * @timeout: the flash duration to set it to
+ *
+ * Set the flash strobe duration.
+ *
+ * Returns: 0 on success or negative error value on failure
+ */
+int led_set_flash_duration(struct led_classdev_flash *fled_cdev, u32 duration);
+
 #endif /* __LINUX_FLASH_LEDS_H_INCLUDED */