Lines Matching +full:flash +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0-only
4 * General device driver for TI lm3559, lm3560, FLASH LED Driver
9 * Ldd-Mlp <ldd-mlp@list.ti.com>
20 #include <media/v4l2-ctrls.h>
21 #include <media/v4l2-device.h>
49 * @led_mode: V4L2 LED mode
65 container_of(_ctrl->handler, struct lm3560_flash, ctrls_led[_no])
67 /* enable mode control */
68 static int lm3560_mode_ctrl(struct lm3560_flash *flash) in lm3560_mode_ctrl() argument
70 int rval = -EINVAL; in lm3560_mode_ctrl()
72 switch (flash->led_mode) { in lm3560_mode_ctrl()
74 rval = regmap_update_bits(flash->regmap, in lm3560_mode_ctrl()
78 rval = regmap_update_bits(flash->regmap, in lm3560_mode_ctrl()
82 rval = regmap_update_bits(flash->regmap, in lm3560_mode_ctrl()
90 static int lm3560_enable_ctrl(struct lm3560_flash *flash, in lm3560_enable_ctrl() argument
97 rval = regmap_update_bits(flash->regmap, in lm3560_enable_ctrl()
100 rval = regmap_update_bits(flash->regmap, in lm3560_enable_ctrl()
104 rval = regmap_update_bits(flash->regmap, in lm3560_enable_ctrl()
107 rval = regmap_update_bits(flash->regmap, in lm3560_enable_ctrl()
114 static int lm3560_torch_brt_ctrl(struct lm3560_flash *flash, in lm3560_torch_brt_ctrl() argument
121 return lm3560_enable_ctrl(flash, led_no, false); in lm3560_torch_brt_ctrl()
123 rval = lm3560_enable_ctrl(flash, led_no, true); in lm3560_torch_brt_ctrl()
127 rval = regmap_update_bits(flash->regmap, in lm3560_torch_brt_ctrl()
130 rval = regmap_update_bits(flash->regmap, in lm3560_torch_brt_ctrl()
137 static int lm3560_flash_brt_ctrl(struct lm3560_flash *flash, in lm3560_flash_brt_ctrl() argument
144 return lm3560_enable_ctrl(flash, led_no, false); in lm3560_flash_brt_ctrl()
146 rval = lm3560_enable_ctrl(flash, led_no, true); in lm3560_flash_brt_ctrl()
150 rval = regmap_update_bits(flash->regmap, in lm3560_flash_brt_ctrl()
153 rval = regmap_update_bits(flash->regmap, in lm3560_flash_brt_ctrl()
162 struct lm3560_flash *flash = to_lm3560_flash(ctrl, led_no); in lm3560_get_ctrl() local
163 int rval = -EINVAL; in lm3560_get_ctrl()
165 mutex_lock(&flash->lock); in lm3560_get_ctrl()
167 if (ctrl->id == V4L2_CID_FLASH_FAULT) { in lm3560_get_ctrl()
170 rval = regmap_read(flash->regmap, REG_FLAG, ®_val); in lm3560_get_ctrl()
179 ctrl->cur.val = fault; in lm3560_get_ctrl()
183 mutex_unlock(&flash->lock); in lm3560_get_ctrl()
189 struct lm3560_flash *flash = to_lm3560_flash(ctrl, led_no); in lm3560_set_ctrl() local
191 int rval = -EINVAL; in lm3560_set_ctrl()
193 mutex_lock(&flash->lock); in lm3560_set_ctrl()
195 switch (ctrl->id) { in lm3560_set_ctrl()
197 flash->led_mode = ctrl->val; in lm3560_set_ctrl()
198 if (flash->led_mode != V4L2_FLASH_LED_MODE_FLASH) in lm3560_set_ctrl()
199 rval = lm3560_mode_ctrl(flash); in lm3560_set_ctrl()
203 rval = regmap_update_bits(flash->regmap, in lm3560_set_ctrl()
204 REG_CONFIG1, 0x04, (ctrl->val) << 2); in lm3560_set_ctrl()
210 if (flash->led_mode != V4L2_FLASH_LED_MODE_FLASH) { in lm3560_set_ctrl()
211 rval = -EBUSY; in lm3560_set_ctrl()
214 flash->led_mode = V4L2_FLASH_LED_MODE_FLASH; in lm3560_set_ctrl()
215 rval = lm3560_mode_ctrl(flash); in lm3560_set_ctrl()
219 if (flash->led_mode != V4L2_FLASH_LED_MODE_FLASH) { in lm3560_set_ctrl()
220 rval = -EBUSY; in lm3560_set_ctrl()
223 flash->led_mode = V4L2_FLASH_LED_MODE_NONE; in lm3560_set_ctrl()
224 rval = lm3560_mode_ctrl(flash); in lm3560_set_ctrl()
228 tout_bits = LM3560_FLASH_TOUT_ms_TO_REG(ctrl->val); in lm3560_set_ctrl()
229 rval = regmap_update_bits(flash->regmap, in lm3560_set_ctrl()
234 rval = lm3560_flash_brt_ctrl(flash, led_no, ctrl->val); in lm3560_set_ctrl()
238 rval = lm3560_torch_brt_ctrl(flash, led_no, ctrl->val); in lm3560_set_ctrl()
243 mutex_unlock(&flash->lock); in lm3560_set_ctrl()
278 static int lm3560_init_controls(struct lm3560_flash *flash, in lm3560_init_controls() argument
282 u32 max_flash_brt = flash->pdata->max_flash_brt[led_no]; in lm3560_init_controls()
283 u32 max_torch_brt = flash->pdata->max_torch_brt[led_no]; in lm3560_init_controls()
284 struct v4l2_ctrl_handler *hdl = &flash->ctrls_led[led_no]; in lm3560_init_controls()
289 /* flash mode */ in lm3560_init_controls()
293 flash->led_mode = V4L2_FLASH_LED_MODE_NONE; in lm3560_init_controls()
295 /* flash source */ in lm3560_init_controls()
299 /* flash strobe */ in lm3560_init_controls()
302 /* flash strobe stop */ in lm3560_init_controls()
305 /* flash strobe timeout */ in lm3560_init_controls()
308 flash->pdata->max_flash_timeout, in lm3560_init_controls()
310 flash->pdata->max_flash_timeout); in lm3560_init_controls()
312 /* flash brt */ in lm3560_init_controls()
329 fault->flags |= V4L2_CTRL_FLAG_VOLATILE; in lm3560_init_controls()
331 if (hdl->error) in lm3560_init_controls()
332 return hdl->error; in lm3560_init_controls()
334 flash->subdev_led[led_no].ctrl_handler = hdl; in lm3560_init_controls()
349 static int lm3560_subdev_init(struct lm3560_flash *flash, in lm3560_subdev_init() argument
352 struct i2c_client *client = to_i2c_client(flash->dev); in lm3560_subdev_init()
355 v4l2_i2c_subdev_init(&flash->subdev_led[led_no], client, &lm3560_ops); in lm3560_subdev_init()
356 flash->subdev_led[led_no].flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in lm3560_subdev_init()
357 strscpy(flash->subdev_led[led_no].name, led_name, in lm3560_subdev_init()
358 sizeof(flash->subdev_led[led_no].name)); in lm3560_subdev_init()
359 rval = lm3560_init_controls(flash, led_no); in lm3560_subdev_init()
362 rval = media_entity_pads_init(&flash->subdev_led[led_no].entity, 0, NULL); in lm3560_subdev_init()
365 flash->subdev_led[led_no].entity.function = MEDIA_ENT_F_FLASH; in lm3560_subdev_init()
370 v4l2_ctrl_handler_free(&flash->ctrls_led[led_no]); in lm3560_subdev_init()
374 static int lm3560_init_device(struct lm3560_flash *flash) in lm3560_init_device() argument
380 rval = regmap_update_bits(flash->regmap, in lm3560_init_device()
381 REG_FLASH_TOUT, 0x60, flash->pdata->peak); in lm3560_init_device()
385 flash->led_mode = V4L2_FLASH_LED_MODE_NONE; in lm3560_init_device()
386 rval = lm3560_mode_ctrl(flash); in lm3560_init_device()
390 rval = regmap_read(flash->regmap, REG_FLAG, ®_val); in lm3560_init_device()
396 struct lm3560_flash *flash; in lm3560_probe() local
397 struct lm3560_platform_data *pdata = dev_get_platdata(&client->dev); in lm3560_probe()
400 flash = devm_kzalloc(&client->dev, sizeof(*flash), GFP_KERNEL); in lm3560_probe()
401 if (flash == NULL) in lm3560_probe()
402 return -ENOMEM; in lm3560_probe()
404 flash->regmap = devm_regmap_init_i2c(client, &lm3560_regmap); in lm3560_probe()
405 if (IS_ERR(flash->regmap)) { in lm3560_probe()
406 rval = PTR_ERR(flash->regmap); in lm3560_probe()
412 pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL); in lm3560_probe()
414 return -ENODEV; in lm3560_probe()
415 pdata->peak = LM3560_PEAK_3600mA; in lm3560_probe()
416 pdata->max_flash_timeout = LM3560_FLASH_TOUT_MAX; in lm3560_probe()
418 pdata->max_flash_brt[LM3560_LED0] = LM3560_FLASH_BRT_MAX; in lm3560_probe()
419 pdata->max_torch_brt[LM3560_LED0] = LM3560_TORCH_BRT_MAX; in lm3560_probe()
421 pdata->max_flash_brt[LM3560_LED1] = LM3560_FLASH_BRT_MAX; in lm3560_probe()
422 pdata->max_torch_brt[LM3560_LED1] = LM3560_TORCH_BRT_MAX; in lm3560_probe()
424 flash->pdata = pdata; in lm3560_probe()
425 flash->dev = &client->dev; in lm3560_probe()
426 mutex_init(&flash->lock); in lm3560_probe()
428 rval = lm3560_subdev_init(flash, LM3560_LED0, "lm3560-led0"); in lm3560_probe()
432 rval = lm3560_subdev_init(flash, LM3560_LED1, "lm3560-led1"); in lm3560_probe()
436 rval = lm3560_init_device(flash); in lm3560_probe()
440 i2c_set_clientdata(client, flash); in lm3560_probe()
447 struct lm3560_flash *flash = i2c_get_clientdata(client); in lm3560_remove() local
451 v4l2_device_unregister_subdev(&flash->subdev_led[i]); in lm3560_remove()
452 v4l2_ctrl_handler_free(&flash->ctrls_led[i]); in lm3560_remove()
453 media_entity_cleanup(&flash->subdev_led[i].entity); in lm3560_remove()
478 MODULE_AUTHOR("Ldd Mlp <ldd-mlp@list.ti.com>");
479 MODULE_DESCRIPTION("Texas Instruments LM3560 LED flash driver");