media: dw9807-vcm: Smooth the first user movement of the lens 29/293329/1
authorDave Stevenson <dave.stevenson@raspberrypi.com>
Tue, 3 Jan 2023 16:53:37 +0000 (16:53 +0000)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Mon, 22 May 2023 08:02:30 +0000 (17:02 +0900)
The power up/down sequence is already ramped. Extend this to
the first user movement as well, as this will generally avoid
the "tick" noises due to rapid movements and overshooting.
Subsequent movements are generally smaller and so don't cause
issues.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
[sw0312.kim: cherry-pick raspberry pi kernel upstream to support rpi camera module v3]
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Change-Id: I96f63baa59ecbac8f873953701b90e3c35f18d60

drivers/media/i2c/dw9807-vcm.c

index d5a1841..3589d0b 100644 (file)
@@ -62,6 +62,7 @@ struct dw9807_device {
        u16 idle_pos;
        struct regulator *vdd;
        struct notifier_block notifier;
+       bool first;
 };
 
 static inline struct dw9807_device *sd_to_dw9807_vcm(
@@ -176,6 +177,8 @@ static int dw9807_active(struct dw9807_device *dw9807_dev)
                return ret;
        }
 
+       dw9807_dev->first = true;
+
        return dw9807_ramp(client, dw9807_dev->idle_pos, dw9807_dev->current_val);
 }
 
@@ -230,9 +233,11 @@ static int dw9807_set_ctrl(struct v4l2_ctrl *ctrl)
 
        if (ctrl->id == V4L2_CID_FOCUS_ABSOLUTE) {
                struct i2c_client *client = v4l2_get_subdevdata(&dev_vcm->sd);
+               int start = (dev_vcm->first) ? dev_vcm->current_val : ctrl->val;
 
+               dev_vcm->first = false;
                dev_vcm->current_val = ctrl->val;
-               return dw9807_ramp(client, ctrl->val, ctrl->val);
+               return dw9807_ramp(client, start, ctrl->val);
        }
 
        return -EINVAL;