Lines Matching defs:flash

3  * drivers/leds/leds-as3645a.c - AS3645A and LM3555 flash controllers driver
16 #include <linux/led-class-flash.h>
23 #include <media/v4l2-flash-led-class.h>
156 static int as3645a_write(struct as3645a *flash, u8 addr, u8 val)
158 struct i2c_client *client = flash->client;
170 static int as3645a_read(struct as3645a *flash, u8 addr)
172 struct i2c_client *client = flash->client;
188 * as3645a_set_config - Set flash configuration registers
189 * @flash: The flash
191 * Configure the hardware with flash, assist and indicator currents, as well as
192 * flash timeout.
197 static int as3645a_set_current(struct as3645a *flash)
201 val = (flash->flash_current << AS_CURRENT_FLASH_CURRENT_SHIFT)
202 | (flash->assist_current << AS_CURRENT_ASSIST_LIGHT_SHIFT)
205 return as3645a_write(flash, AS_CURRENT_SET_REG, val);
208 static int as3645a_set_timeout(struct as3645a *flash)
212 val = flash->timeout << AS_INDICATOR_AND_TIMER_TIMEOUT_SHIFT;
214 val |= (flash->cfg.voltage_reference
216 | ((flash->indicator_current ? flash->indicator_current - 1 : 0)
219 return as3645a_write(flash, AS_INDICATOR_AND_TIMER_REG, val);
223 * as3645a_set_control - Set flash control register
224 * @flash: The flash
234 as3645a_set_control(struct as3645a *flash, enum as_mode mode, bool on)
239 reg = (flash->cfg.peak << AS_CONTROL_COIL_PEAK_SHIFT)
244 flash->strobe_source == V4L2_FLASH_STROBE_SOURCE_EXTERNAL)
248 return as3645a_write(flash, AS_CONTROL_REG, reg);
253 struct as3645a *flash = fled_to_as3645a(fled);
257 rval = as3645a_read(flash, AS_FAULT_INFO_REG);
267 dev_dbg(&flash->client->dev, "%u connected LEDs\n",
298 static unsigned int as3645a_current_to_reg(struct as3645a *flash, bool is_flash,
303 flash->cfg.assist_max_ua,
307 flash->cfg.flash_max_ua,
314 struct as3645a *flash = iled_cdev_to_as3645a(iled_cdev);
317 flash->indicator_current = brightness;
319 rval = as3645a_set_timeout(flash);
323 return as3645a_set_control(flash, AS_MODE_INDICATOR, brightness);
330 struct as3645a *flash = fled_to_as3645a(fled);
335 flash->assist_current = brightness - 1;
337 rval = as3645a_set_current(flash);
342 return as3645a_set_control(flash, AS_MODE_ASSIST, brightness);
348 struct as3645a *flash = fled_to_as3645a(fled);
350 flash->flash_current = as3645a_current_to_reg(flash, true,
353 return as3645a_set_current(flash);
359 struct as3645a *flash = fled_to_as3645a(fled);
361 flash->timeout = AS_TIMER_US_TO_CODE(timeout_us);
363 return as3645a_set_timeout(flash);
368 struct as3645a *flash = fled_to_as3645a(fled);
370 return as3645a_set_control(flash, AS_MODE_FLASH, state);
380 static int as3645a_setup(struct as3645a *flash)
382 struct device *dev = &flash->client->dev;
387 rval = as3645a_read(flash, AS_FAULT_INFO_REG);
393 rval = as3645a_set_current(flash);
397 rval = as3645a_set_timeout(flash);
401 rval = as3645a_set_control(flash, AS_MODE_INDICATOR, false);
406 rval = as3645a_get_fault(&flash->fled, &fault);
411 as3645a_read(flash, AS_INDICATOR_AND_TIMER_REG));
413 as3645a_read(flash, AS_CURRENT_SET_REG));
415 as3645a_read(flash, AS_CONTROL_REG));
420 static int as3645a_detect(struct as3645a *flash)
422 struct device *dev = &flash->client->dev;
426 rval = as3645a_read(flash, AS_DESIGN_INFO_REG);
435 rval = as3645a_read(flash, AS_VERSION_CONTROL_REG);
474 rval = as3645a_write(flash, AS_PASSWORD_REG, AS_PASSWORD_UNLOCK_VALUE);
478 return as3645a_write(flash, AS_BOOST_REG, AS_BOOST_CURRENT_DISABLE);
481 static int as3645a_parse_node(struct as3645a *flash,
484 struct as3645a_config *cfg = &flash->cfg;
495 flash->flash_node = child;
499 flash->indicator_node = child;
503 dev_warn(&flash->client->dev,
509 if (!flash->flash_node) {
510 dev_err(&flash->client->dev, "can't find flash node\n");
514 rval = fwnode_property_read_u32(flash->flash_node, "flash-timeout-us",
517 dev_err(&flash->client->dev,
518 "can't read flash-timeout-us property for flash\n");
522 rval = fwnode_property_read_u32(flash->flash_node, "flash-max-microamp",
525 dev_err(&flash->client->dev,
526 "can't read flash-max-microamp property for flash\n");
530 rval = fwnode_property_read_u32(flash->flash_node, "led-max-microamp",
533 dev_err(&flash->client->dev,
534 "can't read led-max-microamp property for flash\n");
538 fwnode_property_read_u32(flash->flash_node, "voltage-reference",
541 fwnode_property_read_u32(flash->flash_node, "ams,input-max-microamp",
545 if (!flash->indicator_node) {
546 dev_warn(&flash->client->dev,
553 rval = fwnode_property_read_u32(flash->indicator_node,
557 dev_err(&flash->client->dev,
565 fwnode_handle_put(flash->flash_node);
566 fwnode_handle_put(flash->indicator_node);
571 static int as3645a_led_class_setup(struct as3645a *flash)
573 struct led_classdev *fled_cdev = &flash->fled.led_cdev;
574 struct led_classdev *iled_cdev = &flash->iled_cdev;
581 flash->cfg.indicator_max_ua / AS_INDICATOR_INTENSITY_STEP;
584 init_data.fwnode = flash->indicator_node;
588 rval = led_classdev_register_ext(&flash->client->dev, iled_cdev,
593 cfg = &flash->fled.brightness;
595 cfg->max = flash->cfg.flash_max_ua;
597 cfg->val = flash->cfg.flash_max_ua;
599 cfg = &flash->fled.timeout;
601 cfg->max = flash->cfg.flash_timeout_us;
603 cfg->val = flash->cfg.flash_timeout_us;
605 flash->fled.ops = &as3645a_led_flash_ops;
610 as3645a_current_to_reg(flash, false,
611 flash->cfg.assist_max_ua) + 1;
614 init_data.fwnode = flash->flash_node;
616 init_data.default_label = "flash";
618 rval = led_classdev_flash_register_ext(&flash->client->dev,
619 &flash->fled, &init_data);
627 dev_err(&flash->client->dev,
633 static int as3645a_v4l2_setup(struct as3645a *flash)
635 struct led_classdev_flash *fled = &flash->fled;
640 .max = flash->cfg.assist_max_ua,
642 .val = flash->cfg.assist_max_ua,
648 .max = flash->cfg.indicator_max_ua,
650 .val = flash->cfg.indicator_max_ua,
655 strlcpy(cfgind.dev_name, flash->iled_cdev.dev->kobj.name,
658 flash->vf = v4l2_flash_init(
659 &flash->client->dev, flash->flash_node, &flash->fled, NULL,
661 if (IS_ERR(flash->vf))
662 return PTR_ERR(flash->vf);
664 flash->vfind = v4l2_flash_indicator_init(
665 &flash->client->dev, flash->indicator_node, &flash->iled_cdev,
667 if (IS_ERR(flash->vfind)) {
668 v4l2_flash_release(flash->vf);
669 return PTR_ERR(flash->vfind);
677 struct as3645a *flash;
683 flash = devm_kzalloc(&client->dev, sizeof(*flash), GFP_KERNEL);
684 if (flash == NULL)
687 flash->client = client;
689 rval = as3645a_parse_node(flash, dev_fwnode(&client->dev));
693 rval = as3645a_detect(flash);
697 mutex_init(&flash->mutex);
698 i2c_set_clientdata(client, flash);
700 rval = as3645a_setup(flash);
704 rval = as3645a_led_class_setup(flash);
708 rval = as3645a_v4l2_setup(flash);
715 led_classdev_flash_unregister(&flash->fled);
718 mutex_destroy(&flash->mutex);
721 fwnode_handle_put(flash->flash_node);
722 fwnode_handle_put(flash->indicator_node);
729 struct as3645a *flash = i2c_get_clientdata(client);
731 as3645a_set_control(flash, AS_MODE_EXT_TORCH, false);
733 v4l2_flash_release(flash->vf);
734 v4l2_flash_release(flash->vfind);
736 led_classdev_flash_unregister(&flash->fled);
737 led_classdev_unregister(&flash->iled_cdev);
739 mutex_destroy(&flash->mutex);
741 fwnode_handle_put(flash->flash_node);
742 fwnode_handle_put(flash->indicator_node);
773 MODULE_DESCRIPTION("LED flash driver for AS3645A, LM3555 and their clones");