Lines Matching +full:max +full:- +full:brightness
1 // SPDX-License-Identifier: GPL-2.0-only
3 * V4L2 flash LED sub-device registration helpers.
9 #include <linux/led-class-flash.h>
15 #include <media/v4l2-flash-led-class.h>
18 (v4l2_flash && v4l2_flash->ops && v4l2_flash->ops->op)
22 v4l2_flash->ops->op(v4l2_flash, arg) : \
23 -EINVAL)
46 intensity -= ctrl->minimum; in __intensity_to_led_brightness()
47 intensity /= (u32) ctrl->step; in __intensity_to_led_brightness()
55 if (ctrl->minimum) in __intensity_to_led_brightness()
62 enum led_brightness brightness) in __led_brightness_to_intensity() argument
67 * Do not decrement brightness read from the LED subsystem for in __led_brightness_to_intensity()
70 * brightness read is guaranteed to be greater than 0. In the mode in __led_brightness_to_intensity()
73 if (ctrl->id != V4L2_CID_FLASH_INDICATOR_INTENSITY) in __led_brightness_to_intensity()
74 --brightness; in __led_brightness_to_intensity()
76 return (brightness * ctrl->step) + ctrl->minimum; in __led_brightness_to_intensity()
82 struct v4l2_ctrl **ctrls = v4l2_flash->ctrls; in v4l2_flash_set_led_brightness()
83 enum led_brightness brightness; in v4l2_flash_set_led_brightness() local
86 brightness = call_flash_op(v4l2_flash, in v4l2_flash_set_led_brightness()
88 ctrl->val); in v4l2_flash_set_led_brightness()
90 brightness = __intensity_to_led_brightness(ctrl, ctrl->val); in v4l2_flash_set_led_brightness()
93 * brightness <-> intensity conversion, it also must have defined in v4l2_flash_set_led_brightness()
95 * from led brightness to v4l2 intensity is required to find out the in v4l2_flash_set_led_brightness()
99 ctrl->val = call_flash_op(v4l2_flash, in v4l2_flash_set_led_brightness()
101 brightness); in v4l2_flash_set_led_brightness()
104 if (ctrls[LED_MODE]->val != V4L2_FLASH_LED_MODE_TORCH) in v4l2_flash_set_led_brightness()
107 led_set_brightness_sync(&v4l2_flash->fled_cdev->led_cdev, in v4l2_flash_set_led_brightness()
108 brightness); in v4l2_flash_set_led_brightness()
110 led_set_brightness_sync(v4l2_flash->iled_cdev, in v4l2_flash_set_led_brightness()
111 brightness); in v4l2_flash_set_led_brightness()
118 struct v4l2_ctrl **ctrls = v4l2_flash->ctrls; in v4l2_flash_update_led_brightness()
124 * Update torch brightness only if in TORCH_MODE. In other modes in v4l2_flash_update_led_brightness()
129 if (ctrls[LED_MODE]->val != V4L2_FLASH_LED_MODE_TORCH) in v4l2_flash_update_led_brightness()
131 led_cdev = &v4l2_flash->fled_cdev->led_cdev; in v4l2_flash_update_led_brightness()
133 led_cdev = v4l2_flash->iled_cdev; in v4l2_flash_update_led_brightness()
141 ctrl->val = call_flash_op(v4l2_flash, in v4l2_flash_update_led_brightness()
143 led_cdev->brightness); in v4l2_flash_update_led_brightness()
145 ctrl->val = __led_brightness_to_intensity(ctrl, in v4l2_flash_update_led_brightness()
146 led_cdev->brightness); in v4l2_flash_update_led_brightness()
154 struct led_classdev_flash *fled_cdev = v4l2_flash->fled_cdev; in v4l2_flash_g_volatile_ctrl()
158 switch (c->id) { in v4l2_flash_g_volatile_ctrl()
170 c->val = fled_cdev->brightness.val; in v4l2_flash_g_volatile_ctrl()
176 c->val = is_strobing; in v4l2_flash_g_volatile_ctrl()
180 return led_get_flash_fault(fled_cdev, &c->val); in v4l2_flash_g_volatile_ctrl()
182 return -EINVAL; in v4l2_flash_g_volatile_ctrl()
188 return ((ctrls[LED_MODE]->val != V4L2_FLASH_LED_MODE_FLASH) || in __software_strobe_mode_inactive()
189 (ctrls[STROBE_SOURCE] && (ctrls[STROBE_SOURCE]->val != in __software_strobe_mode_inactive()
196 struct led_classdev_flash *fled_cdev = v4l2_flash->fled_cdev; in v4l2_flash_s_ctrl()
197 struct led_classdev *led_cdev = fled_cdev ? &fled_cdev->led_cdev : NULL; in v4l2_flash_s_ctrl()
198 struct v4l2_ctrl **ctrls = v4l2_flash->ctrls; in v4l2_flash_s_ctrl()
202 switch (c->id) { in v4l2_flash_s_ctrl()
204 switch (c->val) { in v4l2_flash_s_ctrl()
212 external_strobe = (ctrls[STROBE_SOURCE]->val == in v4l2_flash_s_ctrl()
239 external_strobe = (c->val == V4L2_FLASH_STROBE_SOURCE_EXTERNAL); in v4l2_flash_s_ctrl()
246 if (ctrls[LED_MODE]->val != V4L2_FLASH_LED_MODE_FLASH) in v4l2_flash_s_ctrl()
253 return -EBUSY; in v4l2_flash_s_ctrl()
257 return -EBUSY; in v4l2_flash_s_ctrl()
264 return led_set_flash_timeout(fled_cdev, c->val); in v4l2_flash_s_ctrl()
270 return led_set_flash_brightness(fled_cdev, c->val); in v4l2_flash_s_ctrl()
277 return -EINVAL; in v4l2_flash_s_ctrl()
288 c->min = s->min; in __lfs_to_v4l2_ctrl_config()
289 c->max = s->max; in __lfs_to_v4l2_ctrl_config()
290 c->step = s->step; in __lfs_to_v4l2_ctrl_config()
291 c->def = s->val; in __lfs_to_v4l2_ctrl_config()
298 struct led_classdev_flash *fled_cdev = v4l2_flash->fled_cdev; in __fill_ctrl_init_data()
299 struct led_classdev *led_cdev = fled_cdev ? &fled_cdev->led_cdev : NULL; in __fill_ctrl_init_data()
304 if (v4l2_flash->iled_cdev) { in __fill_ctrl_init_data()
308 __lfs_to_v4l2_ctrl_config(&flash_cfg->intensity, in __fill_ctrl_init_data()
310 ctrl_cfg->id = V4L2_CID_FLASH_INDICATOR_INTENSITY; in __fill_ctrl_init_data()
311 ctrl_cfg->min = 0; in __fill_ctrl_init_data()
312 ctrl_cfg->flags = V4L2_CTRL_FLAG_VOLATILE | in __fill_ctrl_init_data()
316 if (!led_cdev || WARN_ON(!(led_cdev->flags & LED_DEV_CAP_FLASH))) in __fill_ctrl_init_data()
320 if (flash_cfg->flash_faults) { in __fill_ctrl_init_data()
323 ctrl_cfg->id = V4L2_CID_FLASH_FAULT; in __fill_ctrl_init_data()
324 ctrl_cfg->max = flash_cfg->flash_faults; in __fill_ctrl_init_data()
325 ctrl_cfg->flags = V4L2_CTRL_FLAG_VOLATILE | in __fill_ctrl_init_data()
332 if (led_cdev->flags & LED_DEV_CAP_FLASH) in __fill_ctrl_init_data()
337 ctrl_cfg->id = V4L2_CID_FLASH_LED_MODE; in __fill_ctrl_init_data()
338 ctrl_cfg->max = V4L2_FLASH_LED_MODE_TORCH; in __fill_ctrl_init_data()
339 ctrl_cfg->menu_skip_mask = ~mask; in __fill_ctrl_init_data()
340 ctrl_cfg->def = V4L2_FLASH_LED_MODE_NONE; in __fill_ctrl_init_data()
341 ctrl_cfg->flags = 0; in __fill_ctrl_init_data()
346 __lfs_to_v4l2_ctrl_config(&flash_cfg->intensity, ctrl_cfg); in __fill_ctrl_init_data()
347 ctrl_cfg->id = V4L2_CID_FLASH_TORCH_INTENSITY; in __fill_ctrl_init_data()
348 ctrl_cfg->flags = V4L2_CTRL_FLAG_VOLATILE | in __fill_ctrl_init_data()
354 ctrl_cfg->id = V4L2_CID_FLASH_STROBE; in __fill_ctrl_init_data()
359 ctrl_cfg->id = V4L2_CID_FLASH_STROBE_STOP; in __fill_ctrl_init_data()
362 if (flash_cfg->has_external_strobe) { in __fill_ctrl_init_data()
368 ctrl_cfg->id = V4L2_CID_FLASH_STROBE_SOURCE; in __fill_ctrl_init_data()
369 ctrl_cfg->max = V4L2_FLASH_STROBE_SOURCE_EXTERNAL; in __fill_ctrl_init_data()
370 ctrl_cfg->menu_skip_mask = ~mask; in __fill_ctrl_init_data()
371 ctrl_cfg->def = V4L2_FLASH_STROBE_SOURCE_SOFTWARE; in __fill_ctrl_init_data()
379 ctrl_cfg->id = V4L2_CID_FLASH_STROBE_STATUS; in __fill_ctrl_init_data()
380 ctrl_cfg->flags = V4L2_CTRL_FLAG_VOLATILE | in __fill_ctrl_init_data()
388 __lfs_to_v4l2_ctrl_config(&fled_cdev->timeout, ctrl_cfg); in __fill_ctrl_init_data()
389 ctrl_cfg->id = V4L2_CID_FLASH_TIMEOUT; in __fill_ctrl_init_data()
396 __lfs_to_v4l2_ctrl_config(&fled_cdev->brightness, ctrl_cfg); in __fill_ctrl_init_data()
397 ctrl_cfg->id = V4L2_CID_FLASH_INTENSITY; in __fill_ctrl_init_data()
398 ctrl_cfg->flags = V4L2_CTRL_FLAG_VOLATILE | in __fill_ctrl_init_data()
412 v4l2_flash->ctrls = devm_kcalloc(v4l2_flash->sd.dev, in v4l2_flash_init_controls()
414 sizeof(*v4l2_flash->ctrls), in v4l2_flash_init_controls()
416 if (!v4l2_flash->ctrls) in v4l2_flash_init_controls()
417 return -ENOMEM; in v4l2_flash_init_controls()
423 return -ENOMEM; in v4l2_flash_init_controls()
431 v4l2_ctrl_handler_init(&v4l2_flash->hdl, num_ctrls); in v4l2_flash_init_controls()
438 if (ctrl_cfg->id == V4L2_CID_FLASH_LED_MODE || in v4l2_flash_init_controls()
439 ctrl_cfg->id == V4L2_CID_FLASH_STROBE_SOURCE) in v4l2_flash_init_controls()
440 ctrl = v4l2_ctrl_new_std_menu(&v4l2_flash->hdl, in v4l2_flash_init_controls()
442 ctrl_cfg->id, in v4l2_flash_init_controls()
443 ctrl_cfg->max, in v4l2_flash_init_controls()
444 ctrl_cfg->menu_skip_mask, in v4l2_flash_init_controls()
445 ctrl_cfg->def); in v4l2_flash_init_controls()
447 ctrl = v4l2_ctrl_new_std(&v4l2_flash->hdl, in v4l2_flash_init_controls()
449 ctrl_cfg->id, in v4l2_flash_init_controls()
450 ctrl_cfg->min, in v4l2_flash_init_controls()
451 ctrl_cfg->max, in v4l2_flash_init_controls()
452 ctrl_cfg->step, in v4l2_flash_init_controls()
453 ctrl_cfg->def); in v4l2_flash_init_controls()
456 ctrl->flags |= ctrl_cfg->flags; in v4l2_flash_init_controls()
459 v4l2_flash->ctrls[i] = ctrl; in v4l2_flash_init_controls()
464 if (v4l2_flash->hdl.error) { in v4l2_flash_init_controls()
465 ret = v4l2_flash->hdl.error; in v4l2_flash_init_controls()
469 v4l2_ctrl_handler_setup(&v4l2_flash->hdl); in v4l2_flash_init_controls()
471 v4l2_flash->sd.ctrl_handler = &v4l2_flash->hdl; in v4l2_flash_init_controls()
476 v4l2_ctrl_handler_free(&v4l2_flash->hdl); in v4l2_flash_init_controls()
482 struct led_classdev_flash *fled_cdev = v4l2_flash->fled_cdev; in __sync_device_with_v4l2_controls()
483 struct v4l2_ctrl **ctrls = v4l2_flash->ctrls; in __sync_device_with_v4l2_controls()
496 ctrls[FLASH_TIMEOUT]->val); in __sync_device_with_v4l2_controls()
503 ctrls[FLASH_INTENSITY]->val); in __sync_device_with_v4l2_controls()
515 ctrls[LED_MODE]->val != V4L2_FLASH_LED_MODE_TORCH) in __sync_device_with_v4l2_controls()
517 ctrls[STROBE_SOURCE]->val); in __sync_device_with_v4l2_controls()
529 struct led_classdev_flash *fled_cdev = v4l2_flash->fled_cdev; in v4l2_flash_open()
530 struct led_classdev *led_cdev = fled_cdev ? &fled_cdev->led_cdev : NULL; in v4l2_flash_open()
531 struct led_classdev *led_cdev_ind = v4l2_flash->iled_cdev; in v4l2_flash_open()
534 if (!v4l2_fh_is_singular(&fh->vfh)) in v4l2_flash_open()
538 mutex_lock(&led_cdev->led_access); in v4l2_flash_open()
543 mutex_unlock(&led_cdev->led_access); in v4l2_flash_open()
547 mutex_lock(&led_cdev_ind->led_access); in v4l2_flash_open()
552 mutex_unlock(&led_cdev_ind->led_access); in v4l2_flash_open()
562 mutex_lock(&led_cdev->led_access); in v4l2_flash_open()
564 mutex_unlock(&led_cdev->led_access); in v4l2_flash_open()
568 mutex_lock(&led_cdev_ind->led_access); in v4l2_flash_open()
570 mutex_unlock(&led_cdev_ind->led_access); in v4l2_flash_open()
579 struct led_classdev_flash *fled_cdev = v4l2_flash->fled_cdev; in v4l2_flash_close()
580 struct led_classdev *led_cdev = fled_cdev ? &fled_cdev->led_cdev : NULL; in v4l2_flash_close()
581 struct led_classdev *led_cdev_ind = v4l2_flash->iled_cdev; in v4l2_flash_close()
584 if (!v4l2_fh_is_singular(&fh->vfh)) in v4l2_flash_close()
588 mutex_lock(&led_cdev->led_access); in v4l2_flash_close()
590 if (v4l2_flash->ctrls[STROBE_SOURCE]) in v4l2_flash_close()
592 v4l2_flash->ctrls[STROBE_SOURCE], in v4l2_flash_close()
596 mutex_unlock(&led_cdev->led_access); in v4l2_flash_close()
600 mutex_lock(&led_cdev_ind->led_access); in v4l2_flash_close()
602 mutex_unlock(&led_cdev_ind->led_access); in v4l2_flash_close()
625 return ERR_PTR(-EINVAL); in __v4l2_flash_init()
629 return ERR_PTR(-ENOMEM); in __v4l2_flash_init()
631 sd = &v4l2_flash->sd; in __v4l2_flash_init()
632 v4l2_flash->fled_cdev = fled_cdev; in __v4l2_flash_init()
633 v4l2_flash->iled_cdev = iled_cdev; in __v4l2_flash_init()
634 v4l2_flash->ops = ops; in __v4l2_flash_init()
635 sd->dev = dev; in __v4l2_flash_init()
636 sd->fwnode = fwn ? fwn : dev_fwnode(dev); in __v4l2_flash_init()
638 sd->internal_ops = &v4l2_flash_subdev_internal_ops; in __v4l2_flash_init()
639 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in __v4l2_flash_init()
640 strscpy(sd->name, config->dev_name, sizeof(sd->name)); in __v4l2_flash_init()
642 ret = media_entity_pads_init(&sd->entity, 0, NULL); in __v4l2_flash_init()
646 sd->entity.function = MEDIA_ENT_F_FLASH; in __v4l2_flash_init()
652 fwnode_handle_get(sd->fwnode); in __v4l2_flash_init()
661 fwnode_handle_put(sd->fwnode); in __v4l2_flash_init()
662 v4l2_ctrl_handler_free(sd->ctrl_handler); in __v4l2_flash_init()
664 media_entity_cleanup(&sd->entity); in __v4l2_flash_init()
695 sd = &v4l2_flash->sd; in v4l2_flash_release()
699 fwnode_handle_put(sd->fwnode); in v4l2_flash_release()
701 v4l2_ctrl_handler_free(sd->ctrl_handler); in v4l2_flash_release()
702 media_entity_cleanup(&sd->entity); in v4l2_flash_release()
707 MODULE_DESCRIPTION("V4L2 Flash sub-device helpers");