| .. | .. |
|---|
| 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); |
|---|