summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c90
1 files changed, 62 insertions, 28 deletions
diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c
index 644fe397a661..fa94259c2527 100644
--- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c
+++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c
@@ -92,6 +92,14 @@
of_property_read_u32(_dev, _str, &_out); \
}
+#define IS_BATCH_BUFFER_ON_PREVIEW(new_frame) \
+ (((new_frame->batch_info.batch_mode == BATCH_MODE_PREVIEW) && \
+ new_frame->duplicate_output) ? 1 : 0)
+
+#define SWAP_IDENTITY_FOR_BATCH_ON_PREVIEW(new_frame, iden, swap_iden) { \
+ if (IS_BATCH_BUFFER_ON_PREVIEW(new_frame)) \
+ iden = swap_iden; \
+}
static int msm_cpp_buffer_ops(struct cpp_device *cpp_dev,
uint32_t buff_mgr_ops, struct msm_buf_mngr_info *buff_mgr_info);
static int msm_cpp_send_frame_to_hardware(struct cpp_device *cpp_dev,
@@ -1593,12 +1601,16 @@ static int msm_cpp_notify_frame_done(struct cpp_device *cpp_dev,
if (!processed_frame->output_buffer_info[0].processed_divert &&
!processed_frame->output_buffer_info[0].native_buff &&
!processed_frame->we_disable) {
+
+ int32_t iden = processed_frame->identity;
+
+ SWAP_IDENTITY_FOR_BATCH_ON_PREVIEW(processed_frame,
+ iden, processed_frame->duplicate_identity);
+
memset(&buff_mgr_info, 0 ,
sizeof(struct msm_buf_mngr_info));
- buff_mgr_info.session_id =
- ((processed_frame->identity >> 16) & 0xFFFF);
- buff_mgr_info.stream_id =
- (processed_frame->identity & 0xFFFF);
+ buff_mgr_info.session_id = ((iden >> 16) & 0xFFFF);
+ buff_mgr_info.stream_id = (iden & 0xFFFF);
buff_mgr_info.frame_id = processed_frame->frame_id;
buff_mgr_info.timestamp = processed_frame->timestamp;
/*
@@ -1607,7 +1619,9 @@ static int msm_cpp_notify_frame_done(struct cpp_device *cpp_dev,
*/
buff_mgr_info.reserved = processed_frame->reserved;
if (processed_frame->batch_info.batch_mode ==
- BATCH_MODE_VIDEO) {
+ BATCH_MODE_VIDEO ||
+ (IS_BATCH_BUFFER_ON_PREVIEW(
+ processed_frame))) {
buff_mgr_info.index =
processed_frame->batch_info.cont_idx;
} else {
@@ -1637,12 +1651,15 @@ static int msm_cpp_notify_frame_done(struct cpp_device *cpp_dev,
!processed_frame->
duplicate_buffer_info.processed_divert &&
!processed_frame->we_disable) {
+ int32_t iden = processed_frame->duplicate_identity;
+
+ SWAP_IDENTITY_FOR_BATCH_ON_PREVIEW(processed_frame,
+ iden, processed_frame->identity);
+
memset(&buff_mgr_info, 0 ,
sizeof(struct msm_buf_mngr_info));
- buff_mgr_info.session_id =
- ((processed_frame->duplicate_identity >> 16) & 0xFFFF);
- buff_mgr_info.stream_id =
- (processed_frame->duplicate_identity & 0xFFFF);
+ buff_mgr_info.session_id = ((iden >> 16) & 0xFFFF);
+ buff_mgr_info.stream_id = (iden & 0xFFFF);
buff_mgr_info.frame_id = processed_frame->frame_id;
buff_mgr_info.timestamp = processed_frame->timestamp;
buff_mgr_info.index =
@@ -2268,6 +2285,8 @@ static int32_t msm_cpp_set_group_buffer_duplicate(struct cpp_device *cpp_dev,
dup_frame_off, ubwc_enabled, j, i = 0;
do {
+ int iden = new_frame->identity;
+
set_group_buffer_len =
cpp_dev->payload_params.set_group_buffer_len;
if (!set_group_buffer_len) {
@@ -2315,11 +2334,14 @@ static int32_t msm_cpp_set_group_buffer_duplicate(struct cpp_device *cpp_dev,
*ptr++ = 0;
out_phyaddr0 = out_phyaddr;
+ SWAP_IDENTITY_FOR_BATCH_ON_PREVIEW(new_frame,
+ iden, new_frame->duplicate_identity);
+
for (i = 1; i < num_output_bufs; i++) {
out_phyaddr1 = msm_cpp_fetch_buffer_info(cpp_dev,
&new_frame->output_buffer_info[i],
- ((new_frame->identity >> 16) & 0xFFFF),
- (new_frame->identity & 0xFFFF),
+ ((iden >> 16) & 0xFFFF),
+ (iden & 0xFFFF),
&new_frame->output_buffer_info[i].fd);
if (!out_phyaddr1) {
pr_err("%s: error getting o/p phy addr\n",
@@ -2373,10 +2395,16 @@ static int32_t msm_cpp_set_group_buffer(struct cpp_device *cpp_dev,
unsigned long out_phyaddr0, out_phyaddr1, distance;
int32_t rc = 0;
uint32_t set_group_buffer_len_bytes, i = 0;
+ bool batching_valid = false;
+
+ if ((IS_BATCH_BUFFER_ON_PREVIEW(new_frame)) ||
+ new_frame->batch_info.batch_mode == BATCH_MODE_VIDEO)
+ batching_valid = true;
- if (new_frame->batch_info.batch_mode != BATCH_MODE_VIDEO) {
- pr_debug("%s: batch mode not set %d\n", __func__,
- new_frame->batch_info.batch_mode);
+ if (!batching_valid) {
+ pr_debug("%s: batch mode %d, batching valid %d\n",
+ __func__, new_frame->batch_info.batch_mode,
+ batching_valid);
return rc;
}
@@ -2544,18 +2572,21 @@ static int msm_cpp_cfg_frame(struct cpp_device *cpp_dev,
}
if (new_frame->we_disable == 0) {
+ int32_t iden = new_frame->identity;
if ((new_frame->output_buffer_info[0].native_buff == 0) &&
(new_frame->first_payload)) {
memset(&buff_mgr_info, 0,
sizeof(struct msm_buf_mngr_info));
- if (new_frame->batch_info.batch_mode ==
- BATCH_MODE_VIDEO)
+ if ((new_frame->batch_info.batch_mode ==
+ BATCH_MODE_VIDEO) ||
+ (IS_BATCH_BUFFER_ON_PREVIEW(new_frame)))
buf_type = MSM_CAMERA_BUF_MNGR_BUF_USER;
- buff_mgr_info.session_id =
- ((new_frame->identity >> 16) & 0xFFFF);
- buff_mgr_info.stream_id =
- (new_frame->identity & 0xFFFF);
+ SWAP_IDENTITY_FOR_BATCH_ON_PREVIEW(new_frame,
+ iden, new_frame->duplicate_identity);
+
+ buff_mgr_info.session_id = ((iden >> 16) & 0xFFFF);
+ buff_mgr_info.stream_id = (iden & 0xFFFF);
buff_mgr_info.type = buf_type;
rc = msm_cpp_buffer_ops(cpp_dev,
VIDIOC_MSM_BUF_MNGR_GET_BUF,
@@ -2579,8 +2610,8 @@ static int msm_cpp_cfg_frame(struct cpp_device *cpp_dev,
out_phyaddr0 = msm_cpp_fetch_buffer_info(cpp_dev,
&new_frame->output_buffer_info[0],
- ((new_frame->identity >> 16) & 0xFFFF),
- (new_frame->identity & 0xFFFF),
+ ((iden >> 16) & 0xFFFF),
+ (iden & 0xFFFF),
&new_frame->output_buffer_info[0].fd);
if (!out_phyaddr0) {
pr_err("%s: error gettting output physical address\n",
@@ -2593,13 +2624,16 @@ static int msm_cpp_cfg_frame(struct cpp_device *cpp_dev,
/* get buffer for duplicate output */
if (new_frame->duplicate_output) {
+ int32_t iden = new_frame->duplicate_identity;
CPP_DBG("duplication enabled, dup_id=0x%x",
new_frame->duplicate_identity);
+
+ SWAP_IDENTITY_FOR_BATCH_ON_PREVIEW(new_frame,
+ iden, new_frame->identity);
+
memset(&dup_buff_mgr_info, 0, sizeof(struct msm_buf_mngr_info));
- dup_buff_mgr_info.session_id =
- ((new_frame->duplicate_identity >> 16) & 0xFFFF);
- dup_buff_mgr_info.stream_id =
- (new_frame->duplicate_identity & 0xFFFF);
+ dup_buff_mgr_info.session_id = ((iden >> 16) & 0xFFFF);
+ dup_buff_mgr_info.stream_id = (iden & 0xFFFF);
dup_buff_mgr_info.type =
MSM_CAMERA_BUF_MNGR_BUF_PLANAR;
rc = msm_cpp_buffer_ops(cpp_dev, VIDIOC_MSM_BUF_MNGR_GET_BUF,
@@ -2614,8 +2648,8 @@ static int msm_cpp_cfg_frame(struct cpp_device *cpp_dev,
dup_buff_mgr_info.index;
out_phyaddr1 = msm_cpp_fetch_buffer_info(cpp_dev,
&new_frame->duplicate_buffer_info,
- ((new_frame->duplicate_identity >> 16) & 0xFFFF),
- (new_frame->duplicate_identity & 0xFFFF),
+ ((iden >> 16) & 0xFFFF),
+ (iden & 0xFFFF),
&new_frame->duplicate_buffer_info.fd);
if (!out_phyaddr1) {
pr_err("error gettting output physical address\n");