.. | .. |
---|
15 | 15 | #include <media/v4l2-device.h> |
---|
16 | 16 | #include <linux/rk_vcm_head.h> |
---|
17 | 17 | #include <linux/gpio/consumer.h> |
---|
| 18 | +#include <linux/compat.h> |
---|
18 | 19 | |
---|
19 | 20 | #define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x0) |
---|
20 | 21 | #define FP5510_NAME "fp5510" |
---|
21 | 22 | |
---|
22 | | -#define FP5510_MAX_CURRENT 100U |
---|
| 23 | +#define FP5510_MAX_CURRENT 120U |
---|
23 | 24 | #define FP5510_MAX_REG 1023U |
---|
24 | 25 | |
---|
25 | 26 | #define FP5510_DEFAULT_START_CURRENT 0 |
---|
.. | .. |
---|
48 | 49 | unsigned int t_src; |
---|
49 | 50 | unsigned int mclk; |
---|
50 | 51 | |
---|
51 | | - struct timeval start_move_tv; |
---|
52 | | - struct timeval end_move_tv; |
---|
| 52 | + struct __kernel_old_timeval start_move_tv; |
---|
| 53 | + struct __kernel_old_timeval end_move_tv; |
---|
53 | 54 | unsigned long move_ms; |
---|
54 | 55 | |
---|
55 | 56 | u32 module_index; |
---|
.. | .. |
---|
383 | 384 | if (position > FP5510_MAX_REG) |
---|
384 | 385 | position = FP5510_MAX_REG; |
---|
385 | 386 | |
---|
| 387 | + dev_info(&client->dev, "%s: set dest_pos %d, position %d\n", __func__, dest_pos, position); |
---|
| 388 | + |
---|
386 | 389 | dev_vcm->current_lens_pos = position; |
---|
387 | 390 | dev_vcm->current_related_pos = dest_pos; |
---|
388 | 391 | msb = (0x00U | ((dev_vcm->current_lens_pos & 0x3F0U) >> 4U)); |
---|
.. | .. |
---|
437 | 440 | (uint32_t)move_pos) / |
---|
438 | 441 | VCMDRV_MAX_LOG); |
---|
439 | 442 | |
---|
440 | | - dev_vcm->start_move_tv = ns_to_timeval(ktime_get_ns()); |
---|
| 443 | + dev_vcm->start_move_tv = ns_to_kernel_old_timeval(ktime_get_ns()); |
---|
441 | 444 | mv_us = dev_vcm->start_move_tv.tv_usec + |
---|
442 | 445 | dev_vcm->move_ms * 1000; |
---|
443 | 446 | if (mv_us >= 1000000) { |
---|
.. | .. |
---|
503 | 506 | VCMDRV_MAX_LOG * dev_vcm->step; |
---|
504 | 507 | dev_vcm->step_mode = dev_vcm->vcm_cfg.step_mode; |
---|
505 | 508 | |
---|
506 | | - dev_dbg(&client->dev, |
---|
| 509 | + dev_info(&client->dev, |
---|
507 | 510 | "vcm_cfg: %d, %d, %d, max_ma %d\n", |
---|
508 | 511 | dev_vcm->vcm_cfg.start_ma, |
---|
509 | 512 | dev_vcm->vcm_cfg.rated_ma, |
---|
.. | .. |
---|
560 | 563 | unsigned int cmd, unsigned long arg) |
---|
561 | 564 | { |
---|
562 | 565 | struct i2c_client *client = v4l2_get_subdevdata(sd); |
---|
563 | | - struct rk_cam_compat_vcm_tim __user *p32 = compat_ptr(arg); |
---|
| 566 | + void __user *up = compat_ptr(arg); |
---|
564 | 567 | struct rk_cam_compat_vcm_tim compat_vcm_tim; |
---|
565 | 568 | struct rk_cam_vcm_tim vcm_tim; |
---|
566 | 569 | struct rk_cam_vcm_cfg vcm_cfg; |
---|
567 | 570 | long ret; |
---|
568 | 571 | |
---|
569 | 572 | if (cmd == RK_VIDIOC_COMPAT_VCM_TIMEINFO) { |
---|
| 573 | + struct rk_cam_compat_vcm_tim __user *p32 = up; |
---|
| 574 | + |
---|
570 | 575 | ret = fp5510_ioctl(sd, RK_VIDIOC_VCM_TIMEINFO, &vcm_tim); |
---|
571 | 576 | compat_vcm_tim.vcm_start_t.tv_sec = vcm_tim.vcm_start_t.tv_sec; |
---|
572 | 577 | compat_vcm_tim.vcm_start_t.tv_usec = |
---|
.. | .. |
---|
584 | 589 | &p32->vcm_end_t.tv_usec); |
---|
585 | 590 | } else if (cmd == RK_VIDIOC_GET_VCM_CFG) { |
---|
586 | 591 | ret = fp5510_ioctl(sd, RK_VIDIOC_GET_VCM_CFG, &vcm_cfg); |
---|
587 | | - if (!ret) |
---|
| 592 | + if (!ret) { |
---|
588 | 593 | ret = copy_to_user(up, &vcm_cfg, sizeof(vcm_cfg)); |
---|
| 594 | + if (ret) |
---|
| 595 | + ret = -EFAULT; |
---|
| 596 | + } |
---|
589 | 597 | } else if (cmd == RK_VIDIOC_SET_VCM_CFG) { |
---|
590 | 598 | ret = copy_from_user(&vcm_cfg, up, sizeof(vcm_cfg)); |
---|
591 | 599 | if (!ret) |
---|
592 | 600 | ret = fp5510_ioctl(sd, cmd, &vcm_cfg); |
---|
| 601 | + else |
---|
| 602 | + ret = -EFAULT; |
---|
593 | 603 | } else { |
---|
594 | 604 | dev_err(&client->dev, |
---|
595 | 605 | "cmd 0x%x not supported\n", cmd); |
---|
.. | .. |
---|
742 | 752 | fp5510_update_vcm_cfg(fp5510_dev); |
---|
743 | 753 | fp5510_dev->move_ms = 0; |
---|
744 | 754 | fp5510_dev->current_related_pos = VCMDRV_MAX_LOG; |
---|
745 | | - fp5510_dev->start_move_tv = ns_to_timeval(ktime_get_ns()); |
---|
746 | | - fp5510_dev->end_move_tv = ns_to_timeval(ktime_get_ns()); |
---|
| 755 | + fp5510_dev->start_move_tv = ns_to_kernel_old_timeval(ktime_get_ns()); |
---|
| 756 | + fp5510_dev->end_move_tv = ns_to_kernel_old_timeval(ktime_get_ns()); |
---|
747 | 757 | /* |
---|
748 | 758 | * Note: |
---|
749 | 759 | * 1. At ESC mode, ESC code=1 and TSC must be equal 0. |
---|
.. | .. |
---|
808 | 818 | return 0; |
---|
809 | 819 | } |
---|
810 | 820 | |
---|
811 | | -static int fp5510_vcm_resume(struct device *dev) |
---|
| 821 | +static int __maybe_unused fp5510_vcm_resume(struct device *dev) |
---|
812 | 822 | { |
---|
813 | 823 | struct i2c_client *client = to_i2c_client(dev); |
---|
814 | 824 | struct v4l2_subdev *sd = i2c_get_clientdata(client); |
---|
.. | .. |
---|
820 | 830 | return 0; |
---|
821 | 831 | } |
---|
822 | 832 | |
---|
823 | | -static int fp5510_vcm_suspend(struct device *dev) |
---|
| 833 | +static int __maybe_unused fp5510_vcm_suspend(struct device *dev) |
---|
824 | 834 | { |
---|
825 | 835 | struct i2c_client *client = to_i2c_client(dev); |
---|
826 | 836 | struct v4l2_subdev *sd = i2c_get_clientdata(client); |
---|