• Home
  • Raw
  • Download

Lines Matching full:flash

2  * drivers/leds/leds-as3645a.c - AS3645A and LM3555 flash controllers driver
24 #include <linux/led-class-flash.h>
31 #include <media/v4l2-flash-led-class.h>
136 char flash[32]; member
169 static int as3645a_write(struct as3645a *flash, u8 addr, u8 val) in as3645a_write() argument
171 struct i2c_client *client = flash->client; in as3645a_write()
183 static int as3645a_read(struct as3645a *flash, u8 addr) in as3645a_read() argument
185 struct i2c_client *client = flash->client; in as3645a_read()
201 * as3645a_set_config - Set flash configuration registers
202 * @flash: The flash
204 * Configure the hardware with flash, assist and indicator currents, as well as
205 * flash timeout.
210 static int as3645a_set_current(struct as3645a *flash) in as3645a_set_current() argument
214 val = (flash->flash_current << AS_CURRENT_FLASH_CURRENT_SHIFT) in as3645a_set_current()
215 | (flash->assist_current << AS_CURRENT_ASSIST_LIGHT_SHIFT) in as3645a_set_current()
218 return as3645a_write(flash, AS_CURRENT_SET_REG, val); in as3645a_set_current()
221 static int as3645a_set_timeout(struct as3645a *flash) in as3645a_set_timeout() argument
225 val = flash->timeout << AS_INDICATOR_AND_TIMER_TIMEOUT_SHIFT; in as3645a_set_timeout()
227 val |= (flash->cfg.voltage_reference in as3645a_set_timeout()
229 | ((flash->indicator_current ? flash->indicator_current - 1 : 0) in as3645a_set_timeout()
232 return as3645a_write(flash, AS_INDICATOR_AND_TIMER_REG, val); in as3645a_set_timeout()
236 * as3645a_set_control - Set flash control register
237 * @flash: The flash
247 as3645a_set_control(struct as3645a *flash, enum as_mode mode, bool on) in as3645a_set_control() argument
252 reg = (flash->cfg.peak << AS_CONTROL_COIL_PEAK_SHIFT) in as3645a_set_control()
257 flash->strobe_source == V4L2_FLASH_STROBE_SOURCE_EXTERNAL) in as3645a_set_control()
261 return as3645a_write(flash, AS_CONTROL_REG, reg); in as3645a_set_control()
266 struct as3645a *flash = fled_to_as3645a(fled); in as3645a_get_fault() local
270 rval = as3645a_read(flash, AS_FAULT_INFO_REG); in as3645a_get_fault()
280 dev_dbg(&flash->client->dev, "%u connected LEDs\n", in as3645a_get_fault()
311 static unsigned int as3645a_current_to_reg(struct as3645a *flash, bool is_flash, in as3645a_current_to_reg() argument
316 flash->cfg.assist_max_ua, in as3645a_current_to_reg()
320 flash->cfg.flash_max_ua, in as3645a_current_to_reg()
327 struct as3645a *flash = iled_cdev_to_as3645a(iled_cdev); in as3645a_set_indicator_brightness() local
330 flash->indicator_current = brightness; in as3645a_set_indicator_brightness()
332 rval = as3645a_set_timeout(flash); in as3645a_set_indicator_brightness()
336 return as3645a_set_control(flash, AS_MODE_INDICATOR, brightness); in as3645a_set_indicator_brightness()
343 struct as3645a *flash = fled_to_as3645a(fled); in as3645a_set_assist_brightness() local
348 flash->assist_current = brightness - 1; in as3645a_set_assist_brightness()
350 rval = as3645a_set_current(flash); in as3645a_set_assist_brightness()
355 return as3645a_set_control(flash, AS_MODE_ASSIST, brightness); in as3645a_set_assist_brightness()
361 struct as3645a *flash = fled_to_as3645a(fled); in as3645a_set_flash_brightness() local
363 flash->flash_current = as3645a_current_to_reg(flash, true, in as3645a_set_flash_brightness()
366 return as3645a_set_current(flash); in as3645a_set_flash_brightness()
372 struct as3645a *flash = fled_to_as3645a(fled); in as3645a_set_flash_timeout() local
374 flash->timeout = AS_TIMER_US_TO_CODE(timeout_us); in as3645a_set_flash_timeout()
376 return as3645a_set_timeout(flash); in as3645a_set_flash_timeout()
381 struct as3645a *flash = fled_to_as3645a(fled); in as3645a_set_strobe() local
383 return as3645a_set_control(flash, AS_MODE_FLASH, state); in as3645a_set_strobe()
393 static int as3645a_setup(struct as3645a *flash) in as3645a_setup() argument
395 struct device *dev = &flash->client->dev; in as3645a_setup()
400 rval = as3645a_read(flash, AS_FAULT_INFO_REG); in as3645a_setup()
406 rval = as3645a_set_current(flash); in as3645a_setup()
410 rval = as3645a_set_timeout(flash); in as3645a_setup()
414 rval = as3645a_set_control(flash, AS_MODE_INDICATOR, false); in as3645a_setup()
419 rval = as3645a_get_fault(&flash->fled, &fault); in as3645a_setup()
424 as3645a_read(flash, AS_INDICATOR_AND_TIMER_REG)); in as3645a_setup()
426 as3645a_read(flash, AS_CURRENT_SET_REG)); in as3645a_setup()
428 as3645a_read(flash, AS_CONTROL_REG)); in as3645a_setup()
433 static int as3645a_detect(struct as3645a *flash) in as3645a_detect() argument
435 struct device *dev = &flash->client->dev; in as3645a_detect()
439 rval = as3645a_read(flash, AS_DESIGN_INFO_REG); in as3645a_detect()
448 rval = as3645a_read(flash, AS_VERSION_CONTROL_REG); in as3645a_detect()
487 rval = as3645a_write(flash, AS_PASSWORD_REG, AS_PASSWORD_UNLOCK_VALUE); in as3645a_detect()
491 return as3645a_write(flash, AS_BOOST_REG, AS_BOOST_CURRENT_DISABLE); in as3645a_detect()
494 static int as3645a_parse_node(struct as3645a *flash, in as3645a_parse_node() argument
498 struct as3645a_config *cfg = &flash->cfg; in as3645a_parse_node()
510 flash->flash_node = of_node_get(child); in as3645a_parse_node()
513 flash->indicator_node = of_node_get(child); in as3645a_parse_node()
516 dev_warn(&flash->client->dev, in as3645a_parse_node()
522 if (!flash->flash_node) { in as3645a_parse_node()
523 dev_err(&flash->client->dev, "can't find flash node\n"); in as3645a_parse_node()
527 rval = of_property_read_string(flash->flash_node, "label", &name); in as3645a_parse_node()
529 strlcpy(names->flash, name, sizeof(names->flash)); in as3645a_parse_node()
531 snprintf(names->flash, sizeof(names->flash), in as3645a_parse_node()
532 "%s:flash", node->name); in as3645a_parse_node()
534 rval = of_property_read_u32(flash->flash_node, "flash-timeout-us", in as3645a_parse_node()
537 dev_err(&flash->client->dev, in as3645a_parse_node()
538 "can't read flash-timeout-us property for flash\n"); in as3645a_parse_node()
542 rval = of_property_read_u32(flash->flash_node, "flash-max-microamp", in as3645a_parse_node()
545 dev_err(&flash->client->dev, in as3645a_parse_node()
546 "can't read flash-max-microamp property for flash\n"); in as3645a_parse_node()
550 rval = of_property_read_u32(flash->flash_node, "led-max-microamp", in as3645a_parse_node()
553 dev_err(&flash->client->dev, in as3645a_parse_node()
554 "can't read led-max-microamp property for flash\n"); in as3645a_parse_node()
558 of_property_read_u32(flash->flash_node, "voltage-reference", in as3645a_parse_node()
561 of_property_read_u32(flash->flash_node, "ams,input-max-microamp", in as3645a_parse_node()
565 if (!flash->indicator_node) { in as3645a_parse_node()
566 dev_warn(&flash->client->dev, in as3645a_parse_node()
571 rval = of_property_read_string(flash->indicator_node, "label", &name); in as3645a_parse_node()
578 rval = of_property_read_u32(flash->indicator_node, "led-max-microamp", in as3645a_parse_node()
581 dev_err(&flash->client->dev, in as3645a_parse_node()
589 of_node_put(flash->flash_node); in as3645a_parse_node()
590 of_node_put(flash->indicator_node); in as3645a_parse_node()
595 static int as3645a_led_class_setup(struct as3645a *flash, in as3645a_led_class_setup() argument
598 struct led_classdev *fled_cdev = &flash->fled.led_cdev; in as3645a_led_class_setup()
599 struct led_classdev *iled_cdev = &flash->iled_cdev; in as3645a_led_class_setup()
606 flash->cfg.indicator_max_ua / AS_INDICATOR_INTENSITY_STEP; in as3645a_led_class_setup()
609 rval = led_classdev_register(&flash->client->dev, iled_cdev); in as3645a_led_class_setup()
613 cfg = &flash->fled.brightness; in as3645a_led_class_setup()
615 cfg->max = flash->cfg.flash_max_ua; in as3645a_led_class_setup()
617 cfg->val = flash->cfg.flash_max_ua; in as3645a_led_class_setup()
619 cfg = &flash->fled.timeout; in as3645a_led_class_setup()
621 cfg->max = flash->cfg.flash_timeout_us; in as3645a_led_class_setup()
623 cfg->val = flash->cfg.flash_timeout_us; in as3645a_led_class_setup()
625 flash->fled.ops = &as3645a_led_flash_ops; in as3645a_led_class_setup()
627 fled_cdev->name = names->flash; in as3645a_led_class_setup()
631 as3645a_current_to_reg(flash, false, in as3645a_led_class_setup()
632 flash->cfg.assist_max_ua) + 1; in as3645a_led_class_setup()
635 rval = led_classdev_flash_register(&flash->client->dev, &flash->fled); in as3645a_led_class_setup()
638 dev_err(&flash->client->dev, in as3645a_led_class_setup()
646 static int as3645a_v4l2_setup(struct as3645a *flash) in as3645a_v4l2_setup() argument
648 struct led_classdev_flash *fled = &flash->fled; in as3645a_v4l2_setup()
653 .max = flash->cfg.assist_max_ua, in as3645a_v4l2_setup()
655 .val = flash->cfg.assist_max_ua, in as3645a_v4l2_setup()
661 .max = flash->cfg.indicator_max_ua, in as3645a_v4l2_setup()
663 .val = flash->cfg.indicator_max_ua, in as3645a_v4l2_setup()
668 strlcpy(cfgind.dev_name, flash->iled_cdev.name, sizeof(cfg.dev_name)); in as3645a_v4l2_setup()
670 flash->vf = v4l2_flash_init( in as3645a_v4l2_setup()
671 &flash->client->dev, of_fwnode_handle(flash->flash_node), in as3645a_v4l2_setup()
672 &flash->fled, NULL, &cfg); in as3645a_v4l2_setup()
673 if (IS_ERR(flash->vf)) in as3645a_v4l2_setup()
674 return PTR_ERR(flash->vf); in as3645a_v4l2_setup()
676 flash->vfind = v4l2_flash_indicator_init( in as3645a_v4l2_setup()
677 &flash->client->dev, of_fwnode_handle(flash->indicator_node), in as3645a_v4l2_setup()
678 &flash->iled_cdev, &cfgind); in as3645a_v4l2_setup()
679 if (IS_ERR(flash->vfind)) { in as3645a_v4l2_setup()
680 v4l2_flash_release(flash->vf); in as3645a_v4l2_setup()
681 return PTR_ERR(flash->vfind); in as3645a_v4l2_setup()
690 struct as3645a *flash; in as3645a_probe() local
696 flash = devm_kzalloc(&client->dev, sizeof(*flash), GFP_KERNEL); in as3645a_probe()
697 if (flash == NULL) in as3645a_probe()
700 flash->client = client; in as3645a_probe()
702 rval = as3645a_parse_node(flash, &names, client->dev.of_node); in as3645a_probe()
706 rval = as3645a_detect(flash); in as3645a_probe()
710 mutex_init(&flash->mutex); in as3645a_probe()
711 i2c_set_clientdata(client, flash); in as3645a_probe()
713 rval = as3645a_setup(flash); in as3645a_probe()
717 rval = as3645a_led_class_setup(flash, &names); in as3645a_probe()
721 rval = as3645a_v4l2_setup(flash); in as3645a_probe()
728 led_classdev_flash_unregister(&flash->fled); in as3645a_probe()
731 mutex_destroy(&flash->mutex); in as3645a_probe()
734 of_node_put(flash->flash_node); in as3645a_probe()
735 of_node_put(flash->indicator_node); in as3645a_probe()
742 struct as3645a *flash = i2c_get_clientdata(client); in as3645a_remove() local
744 as3645a_set_control(flash, AS_MODE_EXT_TORCH, false); in as3645a_remove()
746 v4l2_flash_release(flash->vf); in as3645a_remove()
747 v4l2_flash_release(flash->vfind); in as3645a_remove()
749 led_classdev_flash_unregister(&flash->fled); in as3645a_remove()
750 led_classdev_unregister(&flash->iled_cdev); in as3645a_remove()
752 mutex_destroy(&flash->mutex); in as3645a_remove()
754 of_node_put(flash->flash_node); in as3645a_remove()
755 of_node_put(flash->indicator_node); in as3645a_remove()
786 MODULE_DESCRIPTION("LED flash driver for AS3645A, LM3555 and their clones");