Lines Matching +full:b +full:- +full:facing
1 // SPDX-License-Identifier: GPL-2.0
8 #include <linux/rk-camera-module.h>
10 #include <media/v4l2-ctrls.h>
11 #include <media/v4l2-device.h>
151 return container_of(ctrl->handler, struct gt9760s_device, ctrls_vcm); in to_vcm_dev()
166 if (!client->adapter) { in gt9760s_read_msg()
167 dev_err(&client->dev, "client->adapter NULL\n"); in gt9760s_read_msg()
168 return -ENODEV; in gt9760s_read_msg()
172 msg->addr = client->addr; in gt9760s_read_msg()
173 msg->flags = 1; in gt9760s_read_msg()
174 msg->len = 2; in gt9760s_read_msg()
175 msg->buf = data; in gt9760s_read_msg()
177 ret = i2c_transfer(client->adapter, msg, 1); in gt9760s_read_msg()
179 dev_dbg(&client->dev, in gt9760s_read_msg()
181 __func__, msg->addr, data[0], data[1]); in gt9760s_read_msg()
188 dev_info(&client->dev, in gt9760s_read_msg()
194 dev_err(&client->dev, in gt9760s_read_msg()
206 if (!client->adapter) { in gt9760s_write_msg()
207 dev_err(&client->dev, "client->adapter NULL\n"); in gt9760s_write_msg()
208 return -ENODEV; in gt9760s_write_msg()
212 msg->addr = client->addr; in gt9760s_write_msg()
213 msg->flags = 0; in gt9760s_write_msg()
214 msg->len = 2; in gt9760s_write_msg()
215 msg->buf = data; in gt9760s_write_msg()
220 ret = i2c_transfer(client->adapter, msg, 1); in gt9760s_write_msg()
224 dev_dbg(&client->dev, in gt9760s_write_msg()
226 __func__, msg->addr, data[0], data[1]); in gt9760s_write_msg()
230 dev_info(&client->dev, in gt9760s_write_msg()
236 dev_err(&client->dev, in gt9760s_write_msg()
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()
290 dev_err(&client->dev, in gt9760s_move_time()
295 codes_per_step = (dev_vcm->step_mode & 0x0c) >> 2; in gt9760s_move_time()
297 codes_per_step = 1 << (codes_per_step - 1); in gt9760s_move_time()
299 if (dev_vcm->dlc_enable) { in gt9760s_move_time()
327 val = dev_vcm->dlc_enable << 3 | dev_vcm->mclk | 0x04; in gt9760s_init()
332 val = dev_vcm->t_src << 3; in gt9760s_init()
344 dev_err(&client->dev, "failed with error %d\n", ret); in gt9760s_init()
345 return -1; in gt9760s_init()
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()
371 dev_dbg(&client->dev, "%s: get position %d\n", __func__, *cur_pos); in gt9760s_get_pos()
375 dev_err(&client->dev, in gt9760s_get_pos()
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()
408 dev_err(&client->dev, in gt9760s_set_pos()
417 if (ctrl->id == V4L2_CID_FOCUS_ABSOLUTE) in gt9760s_get_ctrl()
418 return gt9760s_get_pos(dev_vcm, &ctrl->val); in gt9760s_get_ctrl()
420 return -EINVAL; in gt9760s_get_ctrl()
426 struct i2c_client *client = v4l2_get_subdevdata(&dev_vcm->sd); in gt9760s_set_ctrl()
427 unsigned int dest_pos = ctrl->val; in gt9760s_set_ctrl()
432 if (ctrl->id == V4L2_CID_FOCUS_ABSOLUTE) { in gt9760s_set_ctrl()
434 dev_info(&client->dev, in gt9760s_set_ctrl()
437 return -EINVAL; in gt9760s_set_ctrl()
440 move_pos = dev_vcm->current_related_pos - dest_pos; in gt9760s_set_ctrl()
442 move_pos = -move_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()
452 dev_dbg(&client->dev, "dest_pos %d, move_ms %ld\n", 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()
481 rval = pm_runtime_get_sync(sd->dev); in gt9760s_open()
483 pm_runtime_put_noidle(sd->dev); in gt9760s_open()
492 pm_runtime_put(sd->dev); in gt9760s_close()
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()
508 dev_err(&client->dev, "max current is zero"); 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()
521 dev_dbg(&client->dev, 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()
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()
545 dev_dbg(&client->dev, in gt9760s_ioctl()
547 vcm_tim->vcm_start_t.tv_sec, in gt9760s_ioctl()
548 vcm_tim->vcm_start_t.tv_usec, in gt9760s_ioctl()
549 vcm_tim->vcm_end_t.tv_sec, in gt9760s_ioctl()
550 vcm_tim->vcm_end_t.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()
565 dev_err(&client->dev, in gt9760s_ioctl()
567 return -EINVAL; in gt9760s_ioctl()
590 put_user(cmt.vcm_start_t.tv_sec, &p32->vcm_start_t.tv_sec); in gt9760s_compat_ioctl32()
591 put_user(cmt.vcm_start_t.tv_usec, &p32->vcm_start_t.tv_usec); in gt9760s_compat_ioctl32()
592 put_user(cmt.vcm_end_t.tv_sec, &p32->vcm_end_t.tv_sec); in gt9760s_compat_ioctl32()
593 put_user(cmt.vcm_end_t.tv_usec, &p32->vcm_end_t.tv_usec); in gt9760s_compat_ioctl32()
595 dev_err(&client->dev, in gt9760s_compat_ioctl32()
597 return -EINVAL; in gt9760s_compat_ioctl32()
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()
625 struct v4l2_ctrl_handler *hdl = &dev_vcm->ctrls_vcm; in gt9760s_init_controls()
633 if (hdl->error) in gt9760s_init_controls()
634 dev_err(dev_vcm->sd.dev, "%s fail error: 0x%x\n", in gt9760s_init_controls()
635 __func__, hdl->error); in gt9760s_init_controls()
636 dev_vcm->sd.ctrl_handler = hdl; in gt9760s_init_controls()
637 return hdl->error; in gt9760s_init_controls()
642 struct device_node *np = of_node_get(client->dev.of_node); in gt9760s_read_dts()
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()
650 dev_info(&client->dev, 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()
659 (unsigned int *)&vcm_cfg->start_ma)) { in gt9760s_read_dts()
660 vcm_cfg->start_ma = GT9760S_DEFAULT_START_CURRENT; in gt9760s_read_dts()
661 dev_info(&client->dev, in gt9760s_read_dts()
667 (unsigned int *)&vcm_cfg->rated_ma)) { in gt9760s_read_dts()
668 vcm_cfg->rated_ma = GT9760S_DEFAULT_RATED_CURRENT; in gt9760s_read_dts()
669 dev_info(&client->dev, in gt9760s_read_dts()
675 (unsigned int *)&vcm_cfg->step_mode)) { in gt9760s_read_dts()
676 vcm_cfg->step_mode = GT9760S_DEFAULT_STEP_MODE; in gt9760s_read_dts()
677 dev_info(&client->dev, 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()
685 dev_info(&client->dev, 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()
693 dev_info(&client->dev, 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()
701 dev_info(&client->dev, in gt9760s_read_dts()
707 &dev_vcm->module_index); in gt9760s_read_dts()
709 &dev_vcm->module_facing); in gt9760s_read_dts()
711 dev_err(&client->dev, in gt9760s_read_dts()
713 return -EINVAL; in gt9760s_read_dts()
724 char facing[2]; in gt9760s_probe() local
727 dev_info(&client->dev, "probing...\n"); in gt9760s_probe()
728 dev_info(&client->dev, "driver version: %02x.%02x.%02x", in gt9760s_probe()
733 dev_vcm = devm_kzalloc(&client->dev, sizeof(*dev_vcm), in gt9760s_probe()
736 return -ENOMEM; in gt9760s_probe()
742 v4l2_i2c_subdev_init(&dev_vcm->sd, client, >9760s_ops); in gt9760s_probe()
743 dev_vcm->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in gt9760s_probe()
744 dev_vcm->sd.internal_ops = >9760s_int_ops; 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()
755 sd->entity.function = MEDIA_ENT_F_LENS; in gt9760s_probe()
757 memset(facing, 0, sizeof(facing)); in gt9760s_probe()
758 if (strcmp(dev_vcm->module_facing, "back") == 0) in gt9760s_probe()
759 facing[0] = 'b'; in gt9760s_probe()
761 facing[0] = 'f'; in gt9760s_probe()
763 snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s", in gt9760s_probe()
764 dev_vcm->module_index, facing, in gt9760s_probe()
765 GT9760S_NAME, dev_name(sd->dev)); in gt9760s_probe()
768 dev_err(&client->dev, "v4l2 async register subdev failed\n"); 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()
778 pm_runtime_set_active(&client->dev); in gt9760s_probe()
779 pm_runtime_enable(&client->dev); in gt9760s_probe()
780 pm_runtime_idle(&client->dev); in gt9760s_probe()
782 dev_info(&client->dev, "probing successful\n"); in gt9760s_probe()
788 dev_err(&client->dev, "Probe failed: %d\n", ret); in gt9760s_probe()
797 pm_runtime_disable(&client->dev); in gt9760s_remove()
815 gt9760s_set_pos(dev_vcm, dev_vcm->current_related_pos); in gt9760s_vcm_resume()