From 1a779204ec03bc391165390372ba8e17d73b3483 Mon Sep 17 00:00:00 2001 From: huangdra Date: Sat, 19 Jun 2021 10:06:45 +0800 Subject: [PATCH] Caprip: add wakelock for the actuator noise reduction. Sometimes system will suspend during the delaywork. so add wakelock to ensure system is awake. Change-Id: I7e4db27bf2cebb96faee219ba161b10fdc14ccc9 Signed-off-by: huangdra Reviewed-on: https://gerrit.mot.com/1984717 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Zhilong Wang Reviewed-by: Wang Wang Submit-Approved: Jira Key --- drivers/cam_sensor_module/cam_actuator/mot_actuator.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/cam_sensor_module/cam_actuator/mot_actuator.c b/drivers/cam_sensor_module/cam_actuator/mot_actuator.c index 9b85d2619bc5..507725791020 100644 --- a/drivers/cam_sensor_module/cam_actuator/mot_actuator.c +++ b/drivers/cam_sensor_module/cam_actuator/mot_actuator.c @@ -26,6 +26,7 @@ #include "cam_cci_dev.h" #include "mot_actuator.h" #include "mot_actuator_policy.h" +#include "linux/pm_wakeup.h" /*=================ACTUATOR HW INFO====================*/ #define DEVICE_NAME_LEN 32 @@ -206,6 +207,7 @@ struct mot_actuator_ctrl_t { struct workqueue_struct *mot_actuator_wq; struct delayed_work delay_work; struct mutex actuator_lock; + struct wakeup_source actuator_wakelock; }; enum mot_actuator_state_e { @@ -494,6 +496,7 @@ int mot_actuator_on_vibrate_start(void) { ktime_t start,end,duration; start = ktime_get(); + __pm_stay_awake(&mot_actuator_fctrl.actuator_wakelock); cancel_delayed_work(&mot_actuator_fctrl.delay_work); mutex_lock(&mot_actuator_fctrl.actuator_lock); mot_actuator_vib_move_lens(0); @@ -525,7 +528,6 @@ static int32_t mot_actuator_handle_exit(uint32_t arg) return rc; } - static int32_t mot_actuator_handle_write(uint32_t arg) { int rc = 0; @@ -708,6 +710,7 @@ static void mot_actuator_delayed_process(struct work_struct *work) } mot_actuator_state = MOT_ACTUATOR_RELEASED; mutex_unlock(&actuator_fctrl->actuator_lock); + __pm_relax(&actuator_fctrl->actuator_wakelock); } static inline ssize_t msm_actuator_show(struct device *dev, @@ -898,6 +901,9 @@ static int mot_actuator_init_subdev(struct mot_actuator_ctrl_t *f_ctrl) INIT_DELAYED_WORK(&f_ctrl->delay_work, mot_actuator_delayed_process); mutex_init(&f_ctrl->actuator_lock); + memset(&f_ctrl->actuator_wakelock, 0, sizeof(f_ctrl->actuator_wakelock)); + f_ctrl->actuator_wakelock.name = "actuator_hold_wl"; + wakeup_source_add(&f_ctrl->actuator_wakelock); {//Debug/tuning interfaces int i; @@ -934,6 +940,8 @@ static void __exit mot_actuator_exit(void) mot_actuator_fctrl.mot_actuator_wq = NULL; } cam_unregister_subdev(&mot_actuator_fctrl.v4l2_dev_str); + __pm_relax(&mot_actuator_fctrl.actuator_wakelock); + wakeup_source_remove(&mot_actuator_fctrl.actuator_wakelock); } module_init(mot_actuator_init);