Lines Matching refs:dev_vcm

241 static unsigned int gt9760s_move_time(struct gt9760s_device *dev_vcm, unsigned int move_pos)  in gt9760s_move_time()  argument
243 struct i2c_client *client = v4l2_get_subdevdata(&dev_vcm->sd); in gt9760s_move_time()
253 if (dev_vcm->dlc_enable) { in gt9760s_move_time()
254 step_case = dev_vcm->mclk & 0x3; in gt9760s_move_time()
257 if (gt9760s_dlc_time_table[i].t_src == dev_vcm->t_src) in gt9760s_move_time()
261 step_case = dev_vcm->step_mode & 0x3; in gt9760s_move_time()
264 if (gt9760s_lsc_time_table[i].t_src == dev_vcm->t_src) in gt9760s_move_time()
295 codes_per_step = (dev_vcm->step_mode & 0x0c) >> 2; in gt9760s_move_time()
299 if (dev_vcm->dlc_enable) { in gt9760s_move_time()
316 struct gt9760s_device *dev_vcm = sd_to_vcm_dev(sd); in gt9760s_init() local
327 val = dev_vcm->dlc_enable << 3 | dev_vcm->mclk | 0x04; in gt9760s_init()
332 val = dev_vcm->t_src << 3; in gt9760s_init()
348 static int gt9760s_get_pos(struct gt9760s_device *dev_vcm, u32 *cur_pos) in gt9760s_get_pos() argument
350 struct i2c_client *client = v4l2_get_subdevdata(&dev_vcm->sd); in gt9760s_get_pos()
362 if (abs_step <= dev_vcm->start_current) in gt9760s_get_pos()
364 else if ((abs_step > dev_vcm->start_current) && in gt9760s_get_pos()
365 (abs_step <= dev_vcm->rated_current)) in gt9760s_get_pos()
366 abs_step = (dev_vcm->rated_current - abs_step) / dev_vcm->step; in gt9760s_get_pos()
380 static int gt9760s_set_pos(struct gt9760s_device *dev_vcm, u32 dest_pos) in gt9760s_set_pos() argument
386 struct i2c_client *client = v4l2_get_subdevdata(&dev_vcm->sd); in gt9760s_set_pos()
389 position = dev_vcm->start_current; in gt9760s_set_pos()
391 position = dev_vcm->start_current + in gt9760s_set_pos()
392 (dev_vcm->step * (VCMDRV_MAX_LOG - dest_pos)); in gt9760s_set_pos()
397 dev_vcm->current_lens_pos = position; in gt9760s_set_pos()
398 dev_vcm->current_related_pos = dest_pos; in gt9760s_set_pos()
399 msb = (0x00U | ((dev_vcm->current_lens_pos & 0x3F0U) >> 4U)); in gt9760s_set_pos()
400 lsb = (((dev_vcm->current_lens_pos & 0x0FU) << 4U) | in gt9760s_set_pos()
401 dev_vcm->step_mode); in gt9760s_set_pos()
415 struct gt9760s_device *dev_vcm = to_vcm_dev(ctrl); in gt9760s_get_ctrl() local
418 return gt9760s_get_pos(dev_vcm, &ctrl->val); in gt9760s_get_ctrl()
425 struct gt9760s_device *dev_vcm = to_vcm_dev(ctrl); in gt9760s_set_ctrl() local
426 struct i2c_client *client = v4l2_get_subdevdata(&dev_vcm->sd); in gt9760s_set_ctrl()
440 move_pos = dev_vcm->current_related_pos - dest_pos; in gt9760s_set_ctrl()
444 ret = gt9760s_set_pos(dev_vcm, dest_pos); in gt9760s_set_ctrl()
446 if (dev_vcm->dlc_enable) in gt9760s_set_ctrl()
447 dev_vcm->move_ms = dev_vcm->vcm_movefull_t; in gt9760s_set_ctrl()
449 dev_vcm->move_ms = in gt9760s_set_ctrl()
450 ((dev_vcm->vcm_movefull_t * (uint32_t)move_pos) / VCMDRV_MAX_LOG); in gt9760s_set_ctrl()
453 dest_pos, dev_vcm->move_ms); in gt9760s_set_ctrl()
455 dev_vcm->start_move_tv = ns_to_timeval(ktime_get_ns()); in gt9760s_set_ctrl()
456 mv_us = dev_vcm->start_move_tv.tv_usec + in gt9760s_set_ctrl()
457 dev_vcm->move_ms * 1000; in gt9760s_set_ctrl()
459 dev_vcm->end_move_tv.tv_sec = in gt9760s_set_ctrl()
460 dev_vcm->start_move_tv.tv_sec + 1; in gt9760s_set_ctrl()
461 dev_vcm->end_move_tv.tv_usec = mv_us - 1000000; in gt9760s_set_ctrl()
463 dev_vcm->end_move_tv.tv_sec = in gt9760s_set_ctrl()
464 dev_vcm->start_move_tv.tv_sec; in gt9760s_set_ctrl()
465 dev_vcm->end_move_tv.tv_usec = mv_us; in gt9760s_set_ctrl()
502 static void gt9760s_update_vcm_cfg(struct gt9760s_device *dev_vcm) in gt9760s_update_vcm_cfg() argument
504 struct i2c_client *client = v4l2_get_subdevdata(&dev_vcm->sd); in gt9760s_update_vcm_cfg()
507 if (dev_vcm->max_ma == 0) { in gt9760s_update_vcm_cfg()
512 cur_dist = dev_vcm->vcm_cfg.rated_ma - dev_vcm->vcm_cfg.start_ma; in gt9760s_update_vcm_cfg()
513 cur_dist = cur_dist * GT9760S_MAX_REG / dev_vcm->max_ma; in gt9760s_update_vcm_cfg()
514 dev_vcm->step = (cur_dist + (VCMDRV_MAX_LOG - 1)) / VCMDRV_MAX_LOG; in gt9760s_update_vcm_cfg()
515 dev_vcm->start_current = dev_vcm->vcm_cfg.start_ma * in gt9760s_update_vcm_cfg()
516 GT9760S_MAX_REG / dev_vcm->max_ma; in gt9760s_update_vcm_cfg()
517 dev_vcm->rated_current = dev_vcm->start_current + in gt9760s_update_vcm_cfg()
518 VCMDRV_MAX_LOG * dev_vcm->step; in gt9760s_update_vcm_cfg()
519 dev_vcm->step_mode = dev_vcm->vcm_cfg.step_mode; in gt9760s_update_vcm_cfg()
523 dev_vcm->vcm_cfg.start_ma, in gt9760s_update_vcm_cfg()
524 dev_vcm->vcm_cfg.rated_ma, in gt9760s_update_vcm_cfg()
525 dev_vcm->vcm_cfg.step_mode, in gt9760s_update_vcm_cfg()
526 dev_vcm->max_ma); in gt9760s_update_vcm_cfg()
532 struct gt9760s_device *dev_vcm = sd_to_vcm_dev(sd); in gt9760s_ioctl() local
540 vcm_tim->vcm_start_t.tv_sec = dev_vcm->start_move_tv.tv_sec; in gt9760s_ioctl()
541 vcm_tim->vcm_start_t.tv_usec = dev_vcm->start_move_tv.tv_usec; in gt9760s_ioctl()
542 vcm_tim->vcm_end_t.tv_sec = dev_vcm->end_move_tv.tv_sec; in gt9760s_ioctl()
543 vcm_tim->vcm_end_t.tv_usec = dev_vcm->end_move_tv.tv_usec; in gt9760s_ioctl()
554 vcm_cfg->start_ma = dev_vcm->vcm_cfg.start_ma; in gt9760s_ioctl()
555 vcm_cfg->rated_ma = dev_vcm->vcm_cfg.rated_ma; in gt9760s_ioctl()
556 vcm_cfg->step_mode = dev_vcm->vcm_cfg.step_mode; in gt9760s_ioctl()
560 dev_vcm->vcm_cfg.start_ma = vcm_cfg->start_ma; in gt9760s_ioctl()
561 dev_vcm->vcm_cfg.rated_ma = vcm_cfg->rated_ma; in gt9760s_ioctl()
562 dev_vcm->vcm_cfg.step_mode = vcm_cfg->step_mode; in gt9760s_ioctl()
563 gt9760s_update_vcm_cfg(dev_vcm); in gt9760s_ioctl()
615 static void gt9760s_subdev_cleanup(struct gt9760s_device *dev_vcm) in gt9760s_subdev_cleanup() argument
617 v4l2_device_unregister_subdev(&dev_vcm->sd); in gt9760s_subdev_cleanup()
618 v4l2_device_unregister(&dev_vcm->vdev); in gt9760s_subdev_cleanup()
619 v4l2_ctrl_handler_free(&dev_vcm->ctrls_vcm); in gt9760s_subdev_cleanup()
620 media_entity_cleanup(&dev_vcm->sd.entity); in gt9760s_subdev_cleanup()
623 static int gt9760s_init_controls(struct gt9760s_device *dev_vcm) in gt9760s_init_controls() argument
625 struct v4l2_ctrl_handler *hdl = &dev_vcm->ctrls_vcm; in gt9760s_init_controls()
634 dev_err(dev_vcm->sd.dev, "%s fail error: 0x%x\n", in gt9760s_init_controls()
636 dev_vcm->sd.ctrl_handler = hdl; in gt9760s_init_controls()
640 static int gt9760s_read_dts(struct i2c_client *client, struct gt9760s_device *dev_vcm) in gt9760s_read_dts() argument
643 struct rk_cam_vcm_cfg *vcm_cfg = &dev_vcm->vcm_cfg; in gt9760s_read_dts()
648 (unsigned int *)&dev_vcm->max_ma)) { in gt9760s_read_dts()
649 dev_vcm->max_ma = GT9760S_MAX_CURRENT; in gt9760s_read_dts()
654 if (dev_vcm->max_ma == 0) in gt9760s_read_dts()
655 dev_vcm->max_ma = GT9760S_MAX_CURRENT; in gt9760s_read_dts()
683 (unsigned int *)&dev_vcm->dlc_enable)) { in gt9760s_read_dts()
684 dev_vcm->dlc_enable = GT9760S_DEFAULT_DLC_ENABLE; in gt9760s_read_dts()
691 (unsigned int *)&dev_vcm->mclk)) { in gt9760s_read_dts()
692 dev_vcm->mclk = GT9760S_DEFAULT_MCLK; in gt9760s_read_dts()
699 (unsigned int *)&dev_vcm->t_src)) { in gt9760s_read_dts()
700 dev_vcm->t_src = GT9760S_DEFAULT_T_SRC; in gt9760s_read_dts()
707 &dev_vcm->module_index); in gt9760s_read_dts()
709 &dev_vcm->module_facing); in gt9760s_read_dts()
722 struct gt9760s_device *dev_vcm; in gt9760s_probe() local
733 dev_vcm = devm_kzalloc(&client->dev, sizeof(*dev_vcm), in gt9760s_probe()
735 if (!dev_vcm) in gt9760s_probe()
738 ret = gt9760s_read_dts(client, dev_vcm); in gt9760s_probe()
742 v4l2_i2c_subdev_init(&dev_vcm->sd, client, &gt9760s_ops); in gt9760s_probe()
743 dev_vcm->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in gt9760s_probe()
744 dev_vcm->sd.internal_ops = &gt9760s_int_ops; in gt9760s_probe()
746 ret = gt9760s_init_controls(dev_vcm); in gt9760s_probe()
750 ret = media_entity_pads_init(&dev_vcm->sd.entity, 0, NULL); in gt9760s_probe()
754 sd = &dev_vcm->sd; in gt9760s_probe()
758 if (strcmp(dev_vcm->module_facing, "back") == 0) in gt9760s_probe()
764 dev_vcm->module_index, facing, in gt9760s_probe()
770 gt9760s_update_vcm_cfg(dev_vcm); in gt9760s_probe()
772 dev_vcm->move_ms = 0; in gt9760s_probe()
773 dev_vcm->current_related_pos = VCMDRV_MAX_LOG; in gt9760s_probe()
774 dev_vcm->start_move_tv = ns_to_timeval(ktime_get_ns()); in gt9760s_probe()
775 dev_vcm->end_move_tv = ns_to_timeval(ktime_get_ns()); in gt9760s_probe()
776 dev_vcm->vcm_movefull_t = gt9760s_move_time(dev_vcm, GT9760S_MAX_REG); in gt9760s_probe()
787 gt9760s_subdev_cleanup(dev_vcm); in gt9760s_probe()
795 struct gt9760s_device *dev_vcm = sd_to_vcm_dev(sd); in gt9760s_remove() local
798 gt9760s_subdev_cleanup(dev_vcm); in gt9760s_remove()
812 struct gt9760s_device *dev_vcm = sd_to_vcm_dev(sd); in gt9760s_vcm_resume() local
815 gt9760s_set_pos(dev_vcm, dev_vcm->current_related_pos); in gt9760s_vcm_resume()