Lines Matching +full:max +full:- +full:brightness

1 // SPDX-License-Identifier: GPL-2.0-only
9 #include <linux/led-class-flash.h>
14 #include <media/v4l2-flash-led-class.h>
153 struct qcom_flash_data *flash_data = led->flash_data; in set_flash_module_en()
157 for (i = 0; i < led->chan_count; i++) in set_flash_module_en()
158 led_mask |= BIT(led->chan_id[i]); in set_flash_module_en()
160 mutex_lock(&flash_data->lock); in set_flash_module_en()
162 flash_data->chan_en_bits |= led_mask; in set_flash_module_en()
164 flash_data->chan_en_bits &= ~led_mask; in set_flash_module_en()
166 enable = !!flash_data->chan_en_bits; in set_flash_module_en()
167 rc = regmap_field_write(flash_data->r_fields[REG_MODULE_EN], enable); in set_flash_module_en()
169 dev_err(led->flash.led_cdev.dev, "write module_en failed, rc=%d\n", rc); in set_flash_module_en()
170 mutex_unlock(&flash_data->lock); in set_flash_module_en()
177 struct qcom_flash_data *flash_data = led->flash_data; in set_flash_current()
186 itarg_ua = (current_ma * UA_PER_MA) / led->chan_count + 1; in set_flash_current()
189 for (i = 0; i < led->chan_count; i++) { in set_flash_current()
193 itarget = itarg_ua / ires_ua - 1; in set_flash_current()
195 chan_id = led->chan_id[i]; in set_flash_current()
197 rc = regmap_fields_write(flash_data->r_fields[REG_ITARGET], chan_id, itarget); in set_flash_current()
201 if (flash_data->hw_type == QCOM_MVFLASH_3CH) { in set_flash_current()
207 } else if (flash_data->hw_type == QCOM_MVFLASH_4CH) { in set_flash_current()
214 dev_err(led->flash.led_cdev.dev, in set_flash_current()
215 "HW type %d is not supported\n", flash_data->hw_type); in set_flash_current()
216 return -EOPNOTSUPP; in set_flash_current()
220 return regmap_field_update_bits(flash_data->r_fields[REG_IRESOLUTION], ires_mask, ires_val); in set_flash_current()
225 struct qcom_flash_data *flash_data = led->flash_data; in set_flash_timeout()
230 timeout_ms = min_t(u32, timeout_ms, led->max_timeout_ms); in set_flash_timeout()
232 for (i = 0; i < led->chan_count; i++) { in set_flash_timeout()
233 chan_id = led->chan_id[i]; in set_flash_timeout()
241 rc = regmap_fields_write(flash_data->r_fields[REG_CHAN_TIMER], chan_id, timer); in set_flash_timeout()
251 struct qcom_flash_data *flash_data = led->flash_data; in set_flash_strobe()
256 for (i = 0; i < led->chan_count; i++) { in set_flash_strobe()
257 chan_id = led->chan_id[i]; in set_flash_strobe()
269 flash_data->r_fields[REG_CHAN_STROBE], chan_id, strobe_sel); in set_flash_strobe()
278 rc = regmap_field_update_bits(flash_data->r_fields[REG_CHAN_EN], chan_mask, chan_en); in set_flash_strobe()
282 led->enabled = state; in set_flash_strobe()
291 static int qcom_flash_brightness_set(struct led_classdev_flash *fled_cdev, u32 brightness) in qcom_flash_brightness_set() argument
295 led->flash_current_ma = min_t(u32, led->max_flash_current_ma, brightness / UA_PER_MA); in qcom_flash_brightness_set()
303 led->flash_timeout_ms = timeout / USEC_PER_MSEC; in qcom_flash_timeout_set()
316 rc = set_flash_current(led, led->flash_current_ma, FLASH_MODE); in qcom_flash_strobe_set()
320 rc = set_flash_timeout(led, led->flash_timeout_ms); in qcom_flash_strobe_set()
335 *state = led->enabled; in qcom_flash_strobe_get()
342 struct qcom_flash_data *flash_data = led->flash_data; in qcom_flash_fault_get()
348 rc = regmap_field_read(flash_data->r_fields[REG_STATUS1], &val); in qcom_flash_fault_get()
352 for (i = 0; i < led->chan_count; i++) { in qcom_flash_fault_get()
353 chan_id = led->chan_id[i]; in qcom_flash_fault_get()
362 rc = regmap_field_read(flash_data->r_fields[REG_STATUS2], &val); in qcom_flash_fault_get()
366 if (flash_data->hw_type == QCOM_MVFLASH_3CH) { in qcom_flash_fault_get()
375 } else if (flash_data->hw_type == QCOM_MVFLASH_4CH) { in qcom_flash_fault_get()
394 rc = regmap_field_read(flash_data->r_fields[REG_STATUS3], &val); in qcom_flash_fault_get()
398 if (flash_data->hw_type == QCOM_MVFLASH_3CH) { in qcom_flash_fault_get()
401 } else if (flash_data->hw_type == QCOM_MVFLASH_4CH) { in qcom_flash_fault_get()
402 for (i = 0; i < led->chan_count; i++) { in qcom_flash_fault_get()
403 chan_id = led->chan_id[i]; in qcom_flash_fault_get()
416 enum led_brightness brightness) in qcom_flash_led_brightness_set() argument
420 u32 current_ma = brightness * led->max_torch_current_ma / LED_FULL; in qcom_flash_led_brightness_set()
421 bool enable = !!brightness; in qcom_flash_led_brightness_set()
459 struct led_classdev_flash *fled_cdev = v4l2_flash->fled_cdev; in qcom_flash_external_strobe_set()
476 struct led_classdev_flash *fled_cdev = v4l2_flash->fled_cdev; in qcom_flash_intensity_to_led_brightness()
480 current_ma = min_t(u32, current_ma, led->max_torch_current_ma); in qcom_flash_intensity_to_led_brightness()
484 return (current_ma * LED_FULL) / led->max_torch_current_ma; in qcom_flash_intensity_to_led_brightness()
488 enum led_brightness brightness) in qcom_flash_brightness_to_led_intensity() argument
490 struct led_classdev_flash *fled_cdev = v4l2_flash->fled_cdev; in qcom_flash_brightness_to_led_intensity()
493 return (brightness * led->max_torch_current_ma * UA_PER_MA) / LED_FULL; in qcom_flash_brightness_to_led_intensity()
505 struct qcom_flash_data *flash_data = led->flash_data; in qcom_flash_v4l2_init()
509 if (!(led->flash.led_cdev.flags & LED_DEV_CAP_FLASH)) in qcom_flash_v4l2_init()
512 intensity->min = intensity->step = TORCH_IRES_UA * led->chan_count; in qcom_flash_v4l2_init()
513 intensity->max = led->max_torch_current_ma * UA_PER_MA; in qcom_flash_v4l2_init()
514 intensity->val = min_t(u32, intensity->max, TORCH_CURRENT_DEFAULT_UA); in qcom_flash_v4l2_init()
516 strscpy(v4l2_cfg.dev_name, led->flash.led_cdev.dev->kobj.name, in qcom_flash_v4l2_init()
526 flash_data->v4l2_flash[flash_data->leds_count] = in qcom_flash_v4l2_init()
527 v4l2_flash_init(dev, fwnode, &led->flash, &qcom_v4l2_flash_ops, &v4l2_cfg); in qcom_flash_v4l2_init()
528 return PTR_ERR_OR_ZERO(flash_data->v4l2_flash); in qcom_flash_v4l2_init()
541 struct qcom_flash_data *flash_data = led->flash_data; in qcom_flash_register_led_device()
543 struct led_classdev_flash *flash = &led->flash; in qcom_flash_register_led_device()
544 struct led_flash_setting *brightness, *timeout; in qcom_flash_register_led_device() local
549 count = fwnode_property_count_u32(node, "led-sources"); in qcom_flash_register_led_device()
551 dev_err(dev, "No led-sources specified\n"); in qcom_flash_register_led_device()
552 return -ENODEV; in qcom_flash_register_led_device()
555 if (count > flash_data->max_channels) { in qcom_flash_register_led_device()
556 dev_err(dev, "led-sources count %u exceeds maximum channel count %u\n", in qcom_flash_register_led_device()
557 count, flash_data->max_channels); in qcom_flash_register_led_device()
558 return -EINVAL; in qcom_flash_register_led_device()
561 rc = fwnode_property_read_u32_array(node, "led-sources", channels, count); in qcom_flash_register_led_device()
563 dev_err(dev, "Failed to read led-sources property, rc=%d\n", rc); in qcom_flash_register_led_device()
567 led->chan_count = count; in qcom_flash_register_led_device()
568 led->chan_id = devm_kcalloc(dev, count, sizeof(u8), GFP_KERNEL); in qcom_flash_register_led_device()
569 if (!led->chan_id) in qcom_flash_register_led_device()
570 return -ENOMEM; in qcom_flash_register_led_device()
573 if ((channels[i] == 0) || (channels[i] > flash_data->max_channels)) { in qcom_flash_register_led_device()
574 dev_err(dev, "led-source out of HW support range [1-%u]\n", in qcom_flash_register_led_device()
575 flash_data->max_channels); in qcom_flash_register_led_device()
576 return -EINVAL; in qcom_flash_register_led_device()
580 led->chan_id[i] = channels[i] - 1; in qcom_flash_register_led_device()
583 rc = fwnode_property_read_u32(node, "led-max-microamp", &current_ua); in qcom_flash_register_led_device()
585 dev_err(dev, "Failed to read led-max-microamp property, rc=%d\n", rc); in qcom_flash_register_led_device()
590 dev_err(dev, "led-max-microamp shouldn't be 0\n"); in qcom_flash_register_led_device()
591 return -EINVAL; in qcom_flash_register_led_device()
594 current_ua = min_t(u32, current_ua, TORCH_CURRENT_MAX_UA * led->chan_count); in qcom_flash_register_led_device()
595 led->max_torch_current_ma = current_ua / UA_PER_MA; in qcom_flash_register_led_device()
597 if (fwnode_property_present(node, "flash-max-microamp")) { in qcom_flash_register_led_device()
598 flash->led_cdev.flags |= LED_DEV_CAP_FLASH; in qcom_flash_register_led_device()
600 rc = fwnode_property_read_u32(node, "flash-max-microamp", &current_ua); in qcom_flash_register_led_device()
602 dev_err(dev, "Failed to read flash-max-microamp property, rc=%d\n", in qcom_flash_register_led_device()
607 current_ua = min_t(u32, current_ua, FLASH_CURRENT_MAX_UA * led->chan_count); in qcom_flash_register_led_device()
610 /* Initialize flash class LED device brightness settings */ in qcom_flash_register_led_device()
611 brightness = &flash->brightness; in qcom_flash_register_led_device()
612 brightness->min = brightness->step = FLASH_IRES_UA * led->chan_count; in qcom_flash_register_led_device()
613 brightness->max = current_ua; in qcom_flash_register_led_device()
614 brightness->val = min_t(u32, current_ua, FLASH_CURRENT_DEFAULT_UA); in qcom_flash_register_led_device()
616 led->max_flash_current_ma = current_ua / UA_PER_MA; in qcom_flash_register_led_device()
617 led->flash_current_ma = brightness->val / UA_PER_MA; in qcom_flash_register_led_device()
619 rc = fwnode_property_read_u32(node, "flash-max-timeout-us", &timeout_us); in qcom_flash_register_led_device()
621 dev_err(dev, "Failed to read flash-max-timeout-us property, rc=%d\n", in qcom_flash_register_led_device()
629 timeout = &flash->timeout; in qcom_flash_register_led_device()
630 timeout->min = timeout->step = FLASH_TIMEOUT_STEP_US; in qcom_flash_register_led_device()
631 timeout->val = timeout->max = timeout_us; in qcom_flash_register_led_device()
633 led->max_timeout_ms = led->flash_timeout_ms = timeout_us / USEC_PER_MSEC; in qcom_flash_register_led_device()
635 flash->ops = &qcom_flash_ops; in qcom_flash_register_led_device()
638 flash->led_cdev.brightness_set_blocking = qcom_flash_led_brightness_set; in qcom_flash_register_led_device()
659 struct device *dev = &pdev->dev; in qcom_flash_led_probe()
667 return -ENOMEM; in qcom_flash_led_probe()
669 regmap = dev_get_regmap(dev->parent, NULL); in qcom_flash_led_probe()
672 return -EINVAL; in qcom_flash_led_probe()
675 rc = fwnode_property_read_u32(dev->fwnode, "reg", &reg_base); in qcom_flash_led_probe()
689 return -ENODEV; in qcom_flash_led_probe()
699 flash_data->hw_type = QCOM_MVFLASH_3CH; in qcom_flash_led_probe()
700 flash_data->max_channels = 3; in qcom_flash_led_probe()
703 flash_data->hw_type = QCOM_MVFLASH_4CH; in qcom_flash_led_probe()
704 flash_data->max_channels = 4; in qcom_flash_led_probe()
708 return -ENODEV; in qcom_flash_led_probe()
714 rc = devm_regmap_field_bulk_alloc(dev, regmap, flash_data->r_fields, regs, REG_MAX_COUNT); in qcom_flash_led_probe()
721 mutex_init(&flash_data->lock); in qcom_flash_led_probe()
724 if (count == 0 || count > flash_data->max_channels) { in qcom_flash_led_probe()
725 dev_err(dev, "No child or child count exceeds %d\n", flash_data->max_channels); in qcom_flash_led_probe()
726 return -EINVAL; in qcom_flash_led_probe()
729 flash_data->v4l2_flash = devm_kcalloc(dev, count, in qcom_flash_led_probe()
730 sizeof(*flash_data->v4l2_flash), GFP_KERNEL); in qcom_flash_led_probe()
731 if (!flash_data->v4l2_flash) in qcom_flash_led_probe()
732 return -ENOMEM; in qcom_flash_led_probe()
737 rc = -ENOMEM; in qcom_flash_led_probe()
741 led->flash_data = flash_data; in qcom_flash_led_probe()
746 flash_data->leds_count++; in qcom_flash_led_probe()
753 while (flash_data->v4l2_flash[flash_data->leds_count] && flash_data->leds_count) in qcom_flash_led_probe()
754 v4l2_flash_release(flash_data->v4l2_flash[flash_data->leds_count--]); in qcom_flash_led_probe()
762 while (flash_data->v4l2_flash[flash_data->leds_count] && flash_data->leds_count) in qcom_flash_led_remove()
763 v4l2_flash_release(flash_data->v4l2_flash[flash_data->leds_count--]); in qcom_flash_led_remove()
765 mutex_destroy(&flash_data->lock); in qcom_flash_led_remove()
769 { .compatible = "qcom,spmi-flash-led" },
776 .name = "leds-qcom-flash",