Lines Matching full:led
9 #include <linux/led-class-flash.h>
14 #include <media/v4l2-flash-led-class.h>
175 static int set_flash_module_en(struct qcom_flash_led *led, bool en) in set_flash_module_en() argument
177 struct qcom_flash_data *flash_data = led->flash_data; in set_flash_module_en()
181 for (i = 0; i < led->chan_count; i++) in set_flash_module_en()
182 led_mask |= BIT(led->chan_id[i]); in set_flash_module_en()
193 dev_err(led->flash.led_cdev.dev, "write module_en failed, rc=%d\n", rc); in set_flash_module_en()
199 static int update_allowed_flash_current(struct qcom_flash_led *led, u32 *current_ma, bool strobe) in update_allowed_flash_current() argument
201 struct qcom_flash_data *flash_data = led->flash_data; in update_allowed_flash_current()
208 * 1) LED is disabled; in update_allowed_flash_current()
209 * 2) LED is enabled repeatedly in update_allowed_flash_current()
211 if (!strobe || led->current_in_use_ma != 0) { in update_allowed_flash_current()
212 if (flash_data->total_ma >= led->current_in_use_ma) in update_allowed_flash_current()
213 flash_data->total_ma -= led->current_in_use_ma; in update_allowed_flash_current()
217 led->current_in_use_ma = 0; in update_allowed_flash_current()
296 led->current_in_use_ma = *current_ma; in update_allowed_flash_current()
297 flash_data->total_ma += led->current_in_use_ma; in update_allowed_flash_current()
299 dev_dbg(led->flash.led_cdev.dev, "allowed flash current: %dmA, total current: %dmA\n", in update_allowed_flash_current()
300 led->current_in_use_ma, flash_data->total_ma); in update_allowed_flash_current()
320 static int set_flash_current(struct qcom_flash_led *led, u32 current_ma, enum led_mode mode) in set_flash_current() argument
322 struct qcom_flash_data *flash_data = led->flash_data; in set_flash_current()
331 itarg_ua = (current_ma * UA_PER_MA) / led->chan_count + 1; in set_flash_current()
334 for (i = 0; i < led->chan_count; i++) { in set_flash_current()
340 chan_id = led->chan_id[i]; in set_flash_current()
359 dev_err(led->flash.led_cdev.dev, in set_flash_current()
368 static int set_flash_timeout(struct qcom_flash_led *led, u32 timeout_ms) in set_flash_timeout() argument
370 struct qcom_flash_data *flash_data = led->flash_data; in set_flash_timeout()
374 /* set SAFETY_TIMER for all the channels connected to the same LED */ in set_flash_timeout()
375 timeout_ms = min_t(u32, timeout_ms, led->max_timeout_ms); in set_flash_timeout()
377 for (i = 0; i < led->chan_count; i++) { in set_flash_timeout()
378 chan_id = led->chan_id[i]; in set_flash_timeout()
394 static int set_flash_strobe(struct qcom_flash_led *led, enum led_strobe strobe, bool state) in set_flash_strobe() argument
396 struct qcom_flash_data *flash_data = led->flash_data; in set_flash_strobe()
400 /* Set SW strobe config for all channels connected to the LED */ in set_flash_strobe()
401 for (i = 0; i < led->chan_count; i++) { in set_flash_strobe()
402 chan_id = led->chan_id[i]; in set_flash_strobe()
427 led->enabled = state; in set_flash_strobe()
438 struct qcom_flash_led *led = flcdev_to_qcom_fled(fled_cdev); in qcom_flash_brightness_set() local
440 led->flash_current_ma = min_t(u32, led->max_flash_current_ma, brightness / UA_PER_MA); in qcom_flash_brightness_set()
446 struct qcom_flash_led *led = flcdev_to_qcom_fled(fled_cdev); in qcom_flash_timeout_set() local
448 led->flash_timeout_ms = timeout / USEC_PER_MSEC; in qcom_flash_timeout_set()
454 struct qcom_flash_led *led = flcdev_to_qcom_fled(fled_cdev); in qcom_flash_strobe_set() local
457 rc = set_flash_strobe(led, SW_STROBE, false); in qcom_flash_strobe_set()
461 rc = update_allowed_flash_current(led, &led->flash_current_ma, state); in qcom_flash_strobe_set()
465 rc = set_flash_current(led, led->flash_current_ma, FLASH_MODE); in qcom_flash_strobe_set()
469 rc = set_flash_timeout(led, led->flash_timeout_ms); in qcom_flash_strobe_set()
473 rc = set_flash_module_en(led, state); in qcom_flash_strobe_set()
477 return set_flash_strobe(led, SW_STROBE, state); in qcom_flash_strobe_set()
482 struct qcom_flash_led *led = flcdev_to_qcom_fled(fled_cdev); in qcom_flash_strobe_get() local
484 *state = led->enabled; in qcom_flash_strobe_get()
490 struct qcom_flash_led *led = flcdev_to_qcom_fled(fled_cdev); in qcom_flash_fault_get() local
491 struct qcom_flash_data *flash_data = led->flash_data; in qcom_flash_fault_get()
501 for (i = 0; i < led->chan_count; i++) { in qcom_flash_fault_get()
502 chan_id = led->chan_id[i]; in qcom_flash_fault_get()
551 for (i = 0; i < led->chan_count; i++) { in qcom_flash_fault_get()
552 chan_id = led->chan_id[i]; in qcom_flash_fault_get()
568 struct qcom_flash_led *led = flcdev_to_qcom_fled(fled_cdev); in qcom_flash_led_brightness_set() local
569 u32 current_ma = brightness * led->max_torch_current_ma / LED_FULL; in qcom_flash_led_brightness_set()
573 rc = set_flash_strobe(led, SW_STROBE, false); in qcom_flash_led_brightness_set()
577 rc = set_flash_module_en(led, false); in qcom_flash_led_brightness_set()
581 rc = update_allowed_flash_current(led, ¤t_ma, enable); in qcom_flash_led_brightness_set()
585 rc = set_flash_current(led, current_ma, TORCH_MODE); in qcom_flash_led_brightness_set()
589 /* Disable flash timeout for torch LED */ in qcom_flash_led_brightness_set()
590 rc = set_flash_timeout(led, 0); in qcom_flash_led_brightness_set()
594 rc = set_flash_module_en(led, enable); in qcom_flash_led_brightness_set()
598 return set_flash_strobe(led, SW_STROBE, enable); in qcom_flash_led_brightness_set()
613 struct qcom_flash_led *led = flcdev_to_qcom_fled(fled_cdev); in qcom_flash_external_strobe_set() local
616 rc = set_flash_module_en(led, enable); in qcom_flash_external_strobe_set()
621 return set_flash_strobe(led, HW_STROBE, true); in qcom_flash_external_strobe_set()
623 return set_flash_strobe(led, SW_STROBE, false); in qcom_flash_external_strobe_set()
630 struct qcom_flash_led *led = flcdev_to_qcom_fled(fled_cdev); in qcom_flash_intensity_to_led_brightness() local
633 current_ma = min_t(u32, current_ma, led->max_torch_current_ma); in qcom_flash_intensity_to_led_brightness()
637 return (current_ma * LED_FULL) / led->max_torch_current_ma; in qcom_flash_intensity_to_led_brightness()
644 struct qcom_flash_led *led = flcdev_to_qcom_fled(fled_cdev); in qcom_flash_brightness_to_led_intensity() local
646 return (brightness * led->max_torch_current_ma * UA_PER_MA) / LED_FULL; in qcom_flash_brightness_to_led_intensity()
656 qcom_flash_v4l2_init(struct device *dev, struct qcom_flash_led *led, struct fwnode_handle *fwnode) in qcom_flash_v4l2_init() argument
658 struct qcom_flash_data *flash_data = led->flash_data; in qcom_flash_v4l2_init()
663 if (!(led->flash.led_cdev.flags & LED_DEV_CAP_FLASH)) in qcom_flash_v4l2_init()
666 intensity->min = intensity->step = TORCH_IRES_UA * led->chan_count; in qcom_flash_v4l2_init()
667 intensity->max = led->max_torch_current_ma * UA_PER_MA; in qcom_flash_v4l2_init()
670 strscpy(v4l2_cfg.dev_name, led->flash.led_cdev.dev->kobj.name, in qcom_flash_v4l2_init()
680 v4l2_flash = v4l2_flash_init(dev, fwnode, &led->flash, &qcom_v4l2_flash_ops, &v4l2_cfg); in qcom_flash_v4l2_init()
689 qcom_flash_v4l2_init(struct device *dev, struct qcom_flash_led *led, struct fwnode_handle *fwnode) in qcom_flash_v4l2_init() argument
696 struct fwnode_handle *node, struct qcom_flash_led *led) in qcom_flash_register_led_device() argument
698 struct qcom_flash_data *flash_data = led->flash_data; in qcom_flash_register_led_device()
700 struct led_classdev_flash *flash = &led->flash; in qcom_flash_register_led_device()
706 count = fwnode_property_count_u32(node, "led-sources"); in qcom_flash_register_led_device()
708 dev_err(dev, "No led-sources specified\n"); in qcom_flash_register_led_device()
713 dev_err(dev, "led-sources count %u exceeds maximum channel count %u\n", in qcom_flash_register_led_device()
718 rc = fwnode_property_read_u32_array(node, "led-sources", channels, count); in qcom_flash_register_led_device()
720 dev_err(dev, "Failed to read led-sources property, rc=%d\n", rc); in qcom_flash_register_led_device()
724 led->chan_count = count; in qcom_flash_register_led_device()
725 led->chan_id = devm_kcalloc(dev, count, sizeof(u8), GFP_KERNEL); in qcom_flash_register_led_device()
726 if (!led->chan_id) in qcom_flash_register_led_device()
731 dev_err(dev, "led-source out of HW support range [1-%u]\n", in qcom_flash_register_led_device()
737 led->chan_id[i] = channels[i] - 1; in qcom_flash_register_led_device()
740 rc = fwnode_property_read_u32(node, "led-max-microamp", ¤t_ua); in qcom_flash_register_led_device()
742 dev_err(dev, "Failed to read led-max-microamp property, rc=%d\n", rc); in qcom_flash_register_led_device()
747 dev_err(dev, "led-max-microamp shouldn't be 0\n"); in qcom_flash_register_led_device()
751 current_ua = min_t(u32, current_ua, TORCH_CURRENT_MAX_UA * led->chan_count); in qcom_flash_register_led_device()
752 led->max_torch_current_ma = current_ua / UA_PER_MA; in qcom_flash_register_led_device()
764 current_ua = min_t(u32, current_ua, FLASH_CURRENT_MAX_UA * led->chan_count); in qcom_flash_register_led_device()
767 /* Initialize flash class LED device brightness settings */ in qcom_flash_register_led_device()
769 brightness->min = brightness->step = FLASH_IRES_UA * led->chan_count; in qcom_flash_register_led_device()
773 led->max_flash_current_ma = current_ua / UA_PER_MA; in qcom_flash_register_led_device()
774 led->flash_current_ma = brightness->val / UA_PER_MA; in qcom_flash_register_led_device()
785 /* Initialize flash class LED device timeout settings */ in qcom_flash_register_led_device()
790 led->max_timeout_ms = led->flash_timeout_ms = timeout_us / USEC_PER_MSEC; in qcom_flash_register_led_device()
804 dev_err(dev, "Register flash LED classdev failed, rc=%d\n", rc); in qcom_flash_register_led_device()
808 return qcom_flash_v4l2_init(dev, led, node); in qcom_flash_register_led_device()
814 struct qcom_flash_led *led; in qcom_flash_led_probe() local
839 dev_err(dev, "Read flash LED module type failed, rc=%d\n", rc); in qcom_flash_led_probe()
844 dev_err(dev, "type %#x is not a flash LED module\n", val); in qcom_flash_led_probe()
850 dev_err(dev, "Read flash LED module subtype failed, rc=%d\n", rc); in qcom_flash_led_probe()
865 dev_err(dev, "Failed to read flash LED module revision, rc=%d\n", rc); in qcom_flash_led_probe()
871 dev_err(dev, "flash LED subtype %#x is not yet supported\n", val); in qcom_flash_led_probe()
899 led = devm_kzalloc(dev, sizeof(*led), GFP_KERNEL); in qcom_flash_led_probe()
900 if (!led) { in qcom_flash_led_probe()
905 led->flash_data = flash_data; in qcom_flash_led_probe()
906 rc = qcom_flash_register_led_device(dev, child, led); in qcom_flash_led_probe()
932 { .compatible = "qcom,spmi-flash-led" },
948 MODULE_DESCRIPTION("QCOM Flash LED driver");