mirror of
https://github.com/commaai/agnos-kernel-sdm845.git
synced 2026-06-08 11:24:51 +08:00
msm: camera: disable power collapse when camera is working
To avoid CPU goes into power collapse mode, set PM QOS latency to 100 when opening camera, and reset it to -1 when closing camera. Change-Id: I4472f64ac853d822a77367b843287a9a7c9d83d9 Signed-off-by: Haizhou Fan <haizhoufan@codeaurora.org>
This commit is contained in:
54
drivers/media/platform/msm/camera/cam_req_mgr/cam_req_mgr_dev.c
Normal file → Executable file
54
drivers/media/platform/msm/camera/cam_req_mgr/cam_req_mgr_dev.c
Normal file → Executable file
@@ -26,11 +26,15 @@
|
||||
#include "cam_mem_mgr.h"
|
||||
#include "cam_debug_util.h"
|
||||
#include <linux/slub_def.h>
|
||||
#include <linux/pm_qos.h>
|
||||
|
||||
#define CAM_REQ_MGR_EVENT_MAX 30
|
||||
#define CAMERA_DISABLE_PC_LATENCY 100
|
||||
#define CAMERA_ENABLE_PC_LATENCY PM_QOS_DEFAULT_VALUE
|
||||
|
||||
static struct cam_req_mgr_device g_dev;
|
||||
struct kmem_cache *g_cam_req_mgr_timer_cachep;
|
||||
static struct pm_qos_request cam_pm_qos_request;
|
||||
|
||||
static int cam_media_device_setup(struct device *dev)
|
||||
{
|
||||
@@ -97,12 +101,39 @@ static void cam_v4l2_device_cleanup(void)
|
||||
g_dev.v4l2_dev = NULL;
|
||||
}
|
||||
|
||||
static void cam_pm_qos_add_request(void)
|
||||
{
|
||||
pm_qos_add_request(&cam_pm_qos_request, PM_QOS_CPU_DMA_LATENCY,
|
||||
PM_QOS_DEFAULT_VALUE);
|
||||
}
|
||||
|
||||
static void cam_pm_qos_remove_request(void)
|
||||
{
|
||||
CAM_INFO(CAM_SENSOR, "%s: remove request", __func__);
|
||||
pm_qos_remove_request(&cam_pm_qos_request);
|
||||
}
|
||||
|
||||
static void cam_pm_qos_update_request(int val) {
|
||||
CAM_INFO(CAM_SENSOR, "%s: update request %d", __func__, val);
|
||||
pm_qos_update_request(&cam_pm_qos_request, val);
|
||||
}
|
||||
|
||||
static int cam_req_mgr_open(struct file *filep)
|
||||
{
|
||||
int rc;
|
||||
|
||||
mutex_lock(&g_dev.cam_lock);
|
||||
if (g_dev.open_cnt >= 1) {
|
||||
|
||||
g_dev.open_cnt++;
|
||||
|
||||
if (g_dev.open_cnt == 1) {
|
||||
CAM_INFO(CAM_CRM, "%s:%d disalbe lpm", __func__, __LINE__);
|
||||
/* register msm_v4l2_pm_qos_request */
|
||||
cam_pm_qos_add_request();
|
||||
cam_pm_qos_update_request(CAMERA_DISABLE_PC_LATENCY);
|
||||
}
|
||||
|
||||
if (g_dev.open_cnt > 1) {
|
||||
rc = -EALREADY;
|
||||
goto end;
|
||||
}
|
||||
@@ -117,10 +148,8 @@ static int cam_req_mgr_open(struct file *filep)
|
||||
g_dev.cam_eventq = filep->private_data;
|
||||
spin_unlock_bh(&g_dev.cam_eventq_lock);
|
||||
|
||||
g_dev.open_cnt++;
|
||||
rc = cam_mem_mgr_init();
|
||||
if (rc) {
|
||||
g_dev.open_cnt--;
|
||||
CAM_ERR(CAM_CRM, "mem mgr init failed");
|
||||
goto mem_mgr_init_fail;
|
||||
}
|
||||
@@ -131,6 +160,12 @@ static int cam_req_mgr_open(struct file *filep)
|
||||
mem_mgr_init_fail:
|
||||
v4l2_fh_release(filep);
|
||||
end:
|
||||
if (g_dev.open_cnt <= 1) {
|
||||
/* remove msm_v4l2_pm_qos_request */
|
||||
cam_pm_qos_update_request(CAMERA_ENABLE_PC_LATENCY);
|
||||
cam_pm_qos_remove_request();
|
||||
}
|
||||
g_dev.open_cnt--;
|
||||
mutex_unlock(&g_dev.cam_lock);
|
||||
return rc;
|
||||
}
|
||||
@@ -164,8 +199,13 @@ static int cam_req_mgr_close(struct file *filep)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
g_dev.open_cnt--;
|
||||
if (g_dev.open_cnt > 0) {
|
||||
CAM_ERR(CAM_CRM, "%s:%d open_cnt %d", __func__, __LINE__, g_dev.open_cnt);
|
||||
mutex_unlock(&g_dev.cam_lock);
|
||||
return 0;
|
||||
}
|
||||
cam_req_mgr_handle_core_shutdown();
|
||||
|
||||
list_for_each_entry(sd, &g_dev.v4l2_dev->subdevs, list) {
|
||||
if (!(sd->flags & V4L2_SUBDEV_FL_HAS_DEVNODE))
|
||||
continue;
|
||||
@@ -176,7 +216,6 @@ static int cam_req_mgr_close(struct file *filep)
|
||||
}
|
||||
}
|
||||
|
||||
g_dev.open_cnt--;
|
||||
v4l2_fh_release(filep);
|
||||
|
||||
spin_lock_bh(&g_dev.cam_eventq_lock);
|
||||
@@ -185,6 +224,11 @@ static int cam_req_mgr_close(struct file *filep)
|
||||
|
||||
cam_req_mgr_util_free_hdls();
|
||||
cam_mem_mgr_deinit();
|
||||
|
||||
CAM_INFO(CAM_CRM, "%s:%d enable lpm", __func__, __LINE__);
|
||||
cam_pm_qos_update_request(CAMERA_ENABLE_PC_LATENCY);
|
||||
/* remove msm_v4l2_pm_qos_request */
|
||||
cam_pm_qos_remove_request();
|
||||
mutex_unlock(&g_dev.cam_lock);
|
||||
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user