msm: camera: Configure VFE for two output mode.
Configure upto two outputs of VFE desginated
as primary and secondary. Depending on the irq,
only send message type primary and secondary and
allow MCTL to interpret these messages.
Change-Id: I25568cb6bba5792658b0570383f64ddb58e21421
Signed-off-by: Kiran Kumar H N <hurlisal@codeaurora.org>
Signed-off-by: Ujwal Patel <ujwalp@codeaurora.org>
diff --git a/arch/arm/mach-msm/include/mach/camera.h b/arch/arm/mach-msm/include/mach/camera.h
index 8c61a42..bb33289 100644
--- a/arch/arm/mach-msm/include/mach/camera.h
+++ b/arch/arm/mach-msm/include/mach/camera.h
@@ -75,7 +75,7 @@
VFE_MSG_STATS_AEC,
VFE_MSG_STATS_AF,
VFE_MSG_STATS_AWB,
- VFE_MSG_STATS_RS,
+ VFE_MSG_STATS_RS, /* 10 */
VFE_MSG_STATS_CS,
VFE_MSG_STATS_IHIST,
VFE_MSG_STATS_SKIN,
@@ -85,11 +85,13 @@
VFE_MSG_SYNC_TIMER2,
VFE_MSG_COMMON,
VFE_MSG_V32_START,
- VFE_MSG_V32_START_RECORDING,
+ VFE_MSG_V32_START_RECORDING, /* 20 */
VFE_MSG_V32_CAPTURE,
VFE_MSG_OUTPUT_IRQ,
VFE_MSG_V2X_PREVIEW,
VFE_MSG_V2X_CAPTURE,
+ VFE_MSG_OUTPUT_PRIMARY,
+ VFE_MSG_OUTPUT_SECONDARY,
};
enum vpe_resp_msg {
diff --git a/drivers/media/video/msm/msm.h b/drivers/media/video/msm/msm.h
index cc2e8b4..e216ec0 100644
--- a/drivers/media/video/msm/msm.h
+++ b/drivers/media/video/msm/msm.h
@@ -235,6 +235,10 @@
struct pm_qos_request_list pm_qos_req_list;
struct msm_mctl_pp_info pp_info;
struct ion_client *client;
+ /* VFE output mode.
+ * Used to interpret the Primary/Secondary messages
+ * to preview/video/main/thumbnail image types*/
+ uint32_t vfe_output_mode;
};
/* abstract camera device represents a VFE and connected sensor */
@@ -454,7 +458,7 @@
unsigned int cmd, unsigned long arg);
int msm_mctl_pp_notify(struct msm_cam_media_controller *pmctl,
struct msm_mctl_pp_frame_info *pp_frame_info);
-int msm_mctl_out_type_to_inst_index(struct msm_cam_v4l2_device *pcam,
+int msm_mctl_img_mode_to_inst_index(struct msm_cam_media_controller *pmctl,
int out_type);
struct msm_frame_buffer *msm_mctl_buf_find(
struct msm_cam_media_controller *pmctl,
diff --git a/drivers/media/video/msm/msm_isp.c b/drivers/media/video/msm/msm_isp.c
index 6a9d7c4..5dd80fa 100644
--- a/drivers/media/video/msm/msm_isp.c
+++ b/drivers/media/video/msm/msm_isp.c
@@ -83,9 +83,64 @@
return 0;
}
+int msm_isp_vfe_msg_to_img_mode(struct msm_cam_media_controller *pmctl,
+ int vfe_msg)
+{
+ int image_mode;
+ if (vfe_msg == VFE_MSG_OUTPUT_PRIMARY) {
+ switch (pmctl->vfe_output_mode) {
+ case VFE_OUTPUTS_MAIN_AND_PREVIEW:
+ case VFE_OUTPUTS_MAIN_AND_VIDEO:
+ case VFE_OUTPUTS_MAIN_AND_THUMB:
+ case VFE_OUTPUTS_RAW:
+ image_mode = MSM_V4L2_EXT_CAPTURE_MODE_MAIN;
+ break;
+ case VFE_OUTPUTS_THUMB_AND_MAIN:
+ image_mode = MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL;
+ break;
+ case VFE_OUTPUTS_VIDEO:
+ case VFE_OUTPUTS_VIDEO_AND_PREVIEW:
+ image_mode = MSM_V4L2_EXT_CAPTURE_MODE_VIDEO;
+ break;
+ case VFE_OUTPUTS_PREVIEW:
+ case VFE_OUTPUTS_PREVIEW_AND_VIDEO:
+ image_mode = MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW;
+ break;
+ default:
+ image_mode = -1;
+ break;
+ }
+ } else if (vfe_msg == VFE_MSG_OUTPUT_SECONDARY) {
+ switch (pmctl->vfe_output_mode) {
+ case VFE_OUTPUTS_MAIN_AND_PREVIEW:
+ case VFE_OUTPUTS_VIDEO_AND_PREVIEW:
+ image_mode = MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW;
+ break;
+ case VFE_OUTPUTS_MAIN_AND_VIDEO:
+ case VFE_OUTPUTS_PREVIEW_AND_VIDEO:
+ image_mode = MSM_V4L2_EXT_CAPTURE_MODE_VIDEO;
+ break;
+ case VFE_OUTPUTS_MAIN_AND_THUMB:
+ image_mode = MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL;
+ break;
+ case VFE_OUTPUTS_THUMB_AND_MAIN:
+ image_mode = MSM_V4L2_EXT_CAPTURE_MODE_MAIN;
+ break;
+ default:
+ image_mode = -1;
+ break;
+ }
+ } else
+ image_mode = -1;
+
+ D("%s Selected image mode %d vfe output mode %d, vfe msg %d\n",
+ __func__, image_mode, pmctl->vfe_output_mode, vfe_msg);
+ return image_mode;
+}
+
static int msm_isp_notify_VFE_BUF_EVT(struct v4l2_subdev *sd, void *arg)
{
- int rc = -EINVAL;
+ int rc = -EINVAL, image_mode;
struct msm_vfe_resp *vdata = (struct msm_vfe_resp *)arg;
struct msm_free_buf free_buf;
struct msm_camvfe_params vfe_params;
@@ -100,19 +155,22 @@
msm_isp_sync_free(vdata);
return rc;
}
+ /* Convert the vfe msg to the image mode */
+ image_mode = msm_isp_vfe_msg_to_img_mode(&pcam->mctl, vfe_id);
+ BUG_ON(image_mode < 0);
switch (vdata->type) {
case VFE_MSG_V32_START:
case VFE_MSG_V32_START_RECORDING:
case VFE_MSG_V2X_PREVIEW:
D("%s Got V32_START_*: Getting ping addr id = %d",
__func__, vfe_id);
- msm_mctl_reserve_free_buf(&pcam->mctl, vfe_id, &free_buf);
+ msm_mctl_reserve_free_buf(&pcam->mctl, image_mode, &free_buf);
cfgcmd.cmd_type = CMD_CONFIG_PING_ADDR;
cfgcmd.value = &vfe_id;
vfe_params.vfe_cfg = &cfgcmd;
vfe_params.data = (void *)&free_buf;
rc = v4l2_subdev_call(sd, core, ioctl, 0, &vfe_params);
- msm_mctl_reserve_free_buf(&pcam->mctl, vfe_id, &free_buf);
+ msm_mctl_reserve_free_buf(&pcam->mctl, image_mode, &free_buf);
cfgcmd.cmd_type = CMD_CONFIG_PONG_ADDR;
cfgcmd.value = &vfe_id;
vfe_params.vfe_cfg = &cfgcmd;
@@ -123,7 +181,7 @@
case VFE_MSG_V2X_CAPTURE:
pr_err("%s Got V32_CAPTURE: getting buffer for id = %d",
__func__, vfe_id);
- msm_mctl_reserve_free_buf(&pcam->mctl, vfe_id, &free_buf);
+ msm_mctl_reserve_free_buf(&pcam->mctl, image_mode, &free_buf);
cfgcmd.cmd_type = CMD_CONFIG_PING_ADDR;
cfgcmd.value = &vfe_id;
vfe_params.vfe_cfg = &cfgcmd;
@@ -139,7 +197,7 @@
case VFE_MSG_OUTPUT_IRQ:
D("%s Got OUTPUT_IRQ: Getting free buf id = %d",
__func__, vfe_id);
- msm_mctl_reserve_free_buf(&pcam->mctl, vfe_id, &free_buf);
+ msm_mctl_reserve_free_buf(&pcam->mctl, image_mode, &free_buf);
cfgcmd.cmd_type = CMD_CONFIG_FREE_BUF_ADDR;
cfgcmd.value = &vfe_id;
vfe_params.vfe_cfg = &cfgcmd;
@@ -219,6 +277,12 @@
case MSG_ID_OUTPUT_S:
msgid = VFE_MSG_OUTPUT_S;
break;
+ case MSG_ID_OUTPUT_PRIMARY:
+ msgid = VFE_MSG_OUTPUT_PRIMARY;
+ break;
+ case MSG_ID_OUTPUT_SECONDARY:
+ msgid = VFE_MSG_OUTPUT_SECONDARY;
+ break;
default:
pr_err("%s: Invalid VFE output id: %d\n",
__func__, isp_output->output_id);
@@ -232,6 +296,8 @@
isp_event->isp_data.isp_msg.frame_id =
isp_output->frameCounter;
buf = isp_output->buf;
+ msgid = msm_isp_vfe_msg_to_img_mode(pmctl, msgid);
+ BUG_ON(msgid < 0);
msm_mctl_buf_done(pmctl, msgid,
&buf, isp_output->frameCounter);
}
@@ -561,6 +627,11 @@
case CMD_AXI_CFG_VIDEO_ALL_CHNLS:
case CMD_AXI_CFG_ZSL_ALL_CHNLS:
case CMD_RAW_PICT_AXI_CFG:
+ case CMD_AXI_CFG_PRIM:
+ case CMD_AXI_CFG_PRIM_ALL_CHNLS:
+ case CMD_AXI_CFG_PRIM|CMD_AXI_CFG_SEC:
+ case CMD_AXI_CFG_PRIM|CMD_AXI_CFG_SEC_ALL_CHNLS:
+ case CMD_AXI_CFG_PRIM_ALL_CHNLS|CMD_AXI_CFG_SEC:
/* Dont need to pass buffer information.
* subdev will get the buffer from media
* controller free queue.
diff --git a/drivers/media/video/msm/msm_mctl.c b/drivers/media/video/msm/msm_mctl.c
index e76b1d2..ef76850 100644
--- a/drivers/media/video/msm/msm_mctl.c
+++ b/drivers/media/video/msm/msm_mctl.c
@@ -277,6 +277,19 @@
return rc;
}
+static int msm_mctl_set_vfe_output_mode(struct msm_cam_media_controller
+ *p_mctl, void __user *arg)
+{
+ int rc = 0;
+ if (copy_from_user(&p_mctl->vfe_output_mode,
+ (void __user *)arg, sizeof(p_mctl->vfe_output_mode)))
+ rc = -EFAULT;
+ else
+ pr_info("%s: mctl=0x%p, vfe output mode =0x%x",
+ __func__, p_mctl, p_mctl->vfe_output_mode);
+ return rc;
+}
+
/* called by the server or the config nodes to handle user space
commands*/
static int msm_mctl_cmd(struct msm_cam_media_controller *p_mctl,
@@ -409,6 +422,10 @@
rc = msm_mctl_pp_release_free_frame(p_mctl,
(void __user *)arg);
break;
+ case MSM_CAM_IOCTL_SET_VFE_OUTPUT_TYPE:
+ rc = msm_mctl_set_vfe_output_mode(p_mctl,
+ (void __user *)arg);
+ break;
/* ISFIF config*/
default:
/* ISP config*/
@@ -778,6 +795,7 @@
/* init mctl buf */
msm_mctl_buf_init(pcam);
memset(&pmctl->pp_info, 0, sizeof(pmctl->pp_info));
+ pmctl->vfe_output_mode = 0;
spin_lock_init(&pmctl->pp_info.lock);
/* init sub device*/
v4l2_subdev_init(&(pmctl->mctl_sdev), &mctl_subdev_ops);
diff --git a/drivers/media/video/msm/msm_mctl_buf.c b/drivers/media/video/msm/msm_mctl_buf.c
index 2d25ef0..b86cbe5 100644
--- a/drivers/media/video/msm/msm_mctl_buf.c
+++ b/drivers/media/video/msm/msm_mctl_buf.c
@@ -326,29 +326,13 @@
return 0;
}
-int msm_mctl_out_type_to_inst_index(struct msm_cam_v4l2_device *pcam,
- int out_type)
+int msm_mctl_img_mode_to_inst_index(struct msm_cam_media_controller *pmctl,
+ int image_mode)
{
- int image_mode;
- switch (out_type) {
- case VFE_MSG_OUTPUT_P:
- image_mode = MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW;
- break;
- case VFE_MSG_OUTPUT_V:
- image_mode = MSM_V4L2_EXT_CAPTURE_MODE_VIDEO;
- break;
- case VFE_MSG_OUTPUT_S:
- image_mode = MSM_V4L2_EXT_CAPTURE_MODE_MAIN;
- break;
- case VFE_MSG_OUTPUT_T:
- image_mode = MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL;
- break;
- default:
- image_mode = -1;
- break;
- }
- if ((image_mode >= 0) && pcam->dev_inst_map[image_mode])
- return pcam->dev_inst_map[image_mode]->my_index;
+ if ((image_mode >= 0) &&
+ pmctl->sync.pcam_sync->dev_inst_map[image_mode])
+ return pmctl->sync.pcam_sync->
+ dev_inst_map[image_mode]->my_index;
else
return -EINVAL;
}
@@ -367,7 +351,7 @@
struct msm_frame_buffer *msm_mctl_buf_find(
struct msm_cam_media_controller *pmctl,
struct msm_cam_v4l2_dev_inst *pcam_inst, int del_buf,
- int msg_type, struct msm_free_buf *fbuf)
+ int image_mode, struct msm_free_buf *fbuf)
{
struct msm_frame_buffer *buf = NULL, *tmp;
uint32_t buf_phyaddr = 0;
@@ -408,14 +392,14 @@
int msm_mctl_buf_done_proc(
struct msm_cam_media_controller *pmctl,
struct msm_cam_v4l2_dev_inst *pcam_inst,
- int msg_type, struct msm_free_buf *fbuf,
+ int image_mode, struct msm_free_buf *fbuf,
uint32_t *frame_id, int gen_timestamp)
{
struct msm_frame_buffer *buf = NULL;
int del_buf = 1;
buf = msm_mctl_buf_find(pmctl, pcam_inst, del_buf,
- msg_type, fbuf);
+ image_mode, fbuf);
if (!buf) {
pr_err("%s: buf=0x%x not found\n",
__func__, fbuf->ch_paddr[0]);
@@ -433,22 +417,22 @@
int msm_mctl_buf_done(struct msm_cam_media_controller *p_mctl,
- int msg_type, struct msm_free_buf *fbuf,
+ int image_mode, struct msm_free_buf *fbuf,
uint32_t frame_id)
{
struct msm_cam_v4l2_dev_inst *pcam_inst;
int idx, rc;
int pp_divert_type = 0, pp_type = 0;
- msm_mctl_check_pp(p_mctl, msg_type, &pp_divert_type, &pp_type);
- D("%s: pp_type=%d, pp_divert_type = %d",
- __func__, pp_type, pp_divert_type);
+ msm_mctl_check_pp(p_mctl, image_mode, &pp_divert_type, &pp_type);
+ D("%s: pp_type=%d, pp_divert_type = %d, frame_id = 0x%x",
+ __func__, pp_type, pp_divert_type, frame_id);
if (pp_type || pp_divert_type)
rc = msm_mctl_do_pp_divert(p_mctl,
- msg_type, fbuf, frame_id, pp_type);
+ image_mode, fbuf, frame_id, pp_type);
else {
- idx = msm_mctl_out_type_to_inst_index(
- p_mctl->sync.pcam_sync, msg_type);
+ idx = msm_mctl_img_mode_to_inst_index(
+ p_mctl, image_mode);
if (idx < 0) {
pr_err("%s Invalid instance, dropping buffer\n",
__func__);
@@ -456,7 +440,7 @@
}
pcam_inst = p_mctl->sync.pcam_sync->dev_inst[idx];
rc = msm_mctl_buf_done_proc(p_mctl, pcam_inst,
- msg_type, fbuf,
+ image_mode, fbuf,
&frame_id, 1);
}
return rc;
@@ -470,7 +454,7 @@
int msm_mctl_reserve_free_buf(
struct msm_cam_media_controller *pmctl,
- int msg_type, struct msm_free_buf *free_buf)
+ int image_mode, struct msm_free_buf *free_buf)
{
struct msm_cam_v4l2_dev_inst *pcam_inst;
unsigned long flags = 0;
@@ -484,8 +468,8 @@
return rc;
}
memset(free_buf, 0, sizeof(struct msm_free_buf));
- idx = msm_mctl_out_type_to_inst_index(pmctl->sync.pcam_sync,
- msg_type);
+ idx = msm_mctl_img_mode_to_inst_index(pmctl,
+ image_mode);
if (idx < 0) {
pr_err("%s Invalid instance, returning\n", __func__);
return idx;
@@ -545,7 +529,7 @@
}
int msm_mctl_release_free_buf(struct msm_cam_media_controller *pmctl,
- int msg_type, struct msm_free_buf *free_buf)
+ int image_mode, struct msm_free_buf *free_buf)
{
struct msm_cam_v4l2_dev_inst *pcam_inst;
unsigned long flags = 0;
@@ -555,8 +539,7 @@
if (!free_buf)
return rc;
-
- idx = msm_mctl_out_type_to_inst_index(pmctl->sync.pcam_sync, msg_type);
+ idx = msm_mctl_img_mode_to_inst_index(pmctl, image_mode);
if (idx < 0) {
pr_err("%s Invalid instance, buffer not released\n", __func__);
return idx;
@@ -583,13 +566,13 @@
int msm_mctl_buf_done_pp(
struct msm_cam_media_controller *pmctl,
- int msg_type, struct msm_free_buf *frame, int dirty)
+ int image_mode, struct msm_free_buf *frame, int dirty)
{
struct msm_cam_v4l2_dev_inst *pcam_inst;
int idx, rc = 0;
- idx = msm_mctl_out_type_to_inst_index(
- pmctl->sync.pcam_sync, msg_type);
+ idx = msm_mctl_img_mode_to_inst_index(
+ pmctl, image_mode);
if (idx < 0) {
pr_err("%s Invalid instance, buffer dropped\n", __func__);
return idx;
@@ -599,24 +582,24 @@
__func__, pcam_inst, frame->ch_paddr[0], dirty);
if (dirty)
/* the frame is dirty, not going to disptach to app */
- rc = msm_mctl_release_free_buf(pmctl, msg_type, frame);
+ rc = msm_mctl_release_free_buf(pmctl, image_mode, frame);
else
rc = msm_mctl_buf_done_proc(pmctl, pcam_inst,
- msg_type, frame, NULL, 0);
+ image_mode, frame, NULL, 0);
return rc;
}
struct msm_frame_buffer *msm_mctl_get_free_buf(
struct msm_cam_media_controller *pmctl,
- int msg_type)
+ int image_mode)
{
struct msm_cam_v4l2_dev_inst *pcam_inst;
unsigned long flags = 0;
struct msm_frame_buffer *buf = NULL;
int rc = -EINVAL, idx;
- idx = msm_mctl_out_type_to_inst_index(pmctl->sync.pcam_sync,
- msg_type);
+ idx = msm_mctl_img_mode_to_inst_index(pmctl,
+ image_mode);
if (idx < 0) {
pr_err("%s Invalid instance, cant get buffer\n", __func__);
return NULL;
@@ -647,15 +630,15 @@
int msm_mctl_put_free_buf(
struct msm_cam_media_controller *pmctl,
- int msg_type, struct msm_frame_buffer *my_buf)
+ int image_mode, struct msm_frame_buffer *my_buf)
{
struct msm_cam_v4l2_dev_inst *pcam_inst;
unsigned long flags = 0;
int rc = 0, idx;
struct msm_frame_buffer *buf = NULL;
- idx = msm_mctl_out_type_to_inst_index(pmctl->sync.pcam_sync,
- msg_type);
+ idx = msm_mctl_img_mode_to_inst_index(pmctl,
+ image_mode);
if (idx < 0) {
pr_err("%s Invalid instance, cant put buffer\n", __func__);
return idx;
@@ -681,7 +664,7 @@
}
int msm_mctl_buf_del(struct msm_cam_media_controller *pmctl,
- int msg_type,
+ int image_mode,
struct msm_frame_buffer *my_buf)
{
struct msm_cam_v4l2_dev_inst *pcam_inst;
@@ -689,8 +672,8 @@
unsigned long flags = 0;
int idx;
- idx = msm_mctl_out_type_to_inst_index(pmctl->sync.pcam_sync,
- msg_type);
+ idx = msm_mctl_img_mode_to_inst_index(pmctl,
+ image_mode);
if (idx < 0) {
pr_err("%s Invalid instance, cant delete buffer\n", __func__);
return idx;
diff --git a/drivers/media/video/msm/msm_mctl_pp.c b/drivers/media/video/msm/msm_mctl_pp.c
index a92668e..1f9960a 100644
--- a/drivers/media/video/msm/msm_mctl_pp.c
+++ b/drivers/media/video/msm/msm_mctl_pp.c
@@ -66,39 +66,36 @@
}
int msm_mctl_check_pp(struct msm_cam_media_controller *p_mctl,
- int msg_type, int *pp_divert_type, int *pp_type)
+ int image_mode, int *pp_divert_type, int *pp_type)
{
int rc = 0;
unsigned long flags;
uint32_t pp_key = 0;
- int image_mode = MSM_V4L2_EXT_CAPTURE_MODE_DEFAULT;
*pp_type = 0;
*pp_divert_type = 0;
spin_lock_irqsave(&p_mctl->pp_info.lock, flags);
- switch (msg_type) {
- case VFE_MSG_OUTPUT_P:
+ switch (image_mode) {
+ case MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW:
pp_key = PP_PREV;
- image_mode = MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW;
if (p_mctl->pp_info.pp_key & pp_key)
*pp_divert_type = OUTPUT_TYPE_P;
if (p_mctl->pp_info.pp_ctrl.pp_msg_type & OUTPUT_TYPE_P)
*pp_type = OUTPUT_TYPE_P;
break;
- case VFE_MSG_OUTPUT_S:
+ case MSM_V4L2_EXT_CAPTURE_MODE_MAIN:
pp_key = PP_SNAP;
- image_mode = MSM_V4L2_EXT_CAPTURE_MODE_MAIN;
if (p_mctl->pp_info.pp_key & pp_key)
*pp_divert_type = OUTPUT_TYPE_S;
if (p_mctl->pp_info.pp_ctrl.pp_msg_type & OUTPUT_TYPE_S)
*pp_type = OUTPUT_TYPE_P;
break;
- case VFE_MSG_OUTPUT_V:
- if (p_mctl->pp_info.pp_ctrl.pp_msg_type & OUTPUT_TYPE_V)
+ case MSM_V4L2_EXT_CAPTURE_MODE_VIDEO:
+ if (p_mctl->pp_info.pp_ctrl.pp_msg_type == OUTPUT_TYPE_V)
*pp_type = OUTPUT_TYPE_V;
break;
- case VFE_MSG_OUTPUT_T:
- if (p_mctl->pp_info.pp_ctrl.pp_msg_type & OUTPUT_TYPE_T)
+ case MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL:
+ if (p_mctl->pp_info.pp_ctrl.pp_msg_type == OUTPUT_TYPE_T)
*pp_type = OUTPUT_TYPE_T;
break;
default:
@@ -108,13 +105,13 @@
*pp_divert_type = 0;
spin_unlock_irqrestore(&p_mctl->pp_info.lock, flags);
D("%s: pp_type=%d, pp_divert_type = %d",
- __func__, *pp_type, *pp_divert_type);
+ __func__, *pp_type, *pp_divert_type);
return rc;
}
int msm_mctl_do_pp_divert(
struct msm_cam_media_controller *p_mctl,
- int msg_type, struct msm_free_buf *fbuf,
+ int image_mode, struct msm_free_buf *fbuf,
uint32_t frame_id, int pp_type)
{
struct msm_cam_v4l2_dev_inst *pcam_inst;
@@ -124,20 +121,21 @@
struct msm_frame_buffer *vb = NULL;
struct videobuf2_contig_pmem *mem;
- idx = msm_mctl_out_type_to_inst_index(
- p_mctl->sync.pcam_sync, msg_type);
+ idx = msm_mctl_img_mode_to_inst_index(p_mctl, image_mode);
if (idx < 0) {
pr_err("%s Invalid instance. returning\n", __func__);
return -EINVAL;
}
pcam_inst = p_mctl->sync.pcam_sync->dev_inst[idx];
vb = msm_mctl_buf_find(p_mctl, pcam_inst,
- del_buf, msg_type, fbuf);
+ del_buf, image_mode, fbuf);
if (!vb)
return -EINVAL;
vb->vidbuf.v4l2_buf.sequence = frame_id;
buf_idx = vb->vidbuf.v4l2_buf.index;
+ D("%s Diverting frame %d %x Image mode %d\n", __func__, buf_idx,
+ (uint32_t)vb, pcam_inst->image_mode);
div.image_mode = pcam_inst->image_mode;
div.op_mode = pcam_inst->pcam->op_mode;
div.inst_idx = pcam_inst->my_index;
@@ -181,8 +179,11 @@
mem = vb2_plane_cookie(&vb->vidbuf, i);
div.frame.mp[i].phy_addr =
videobuf2_to_pmem_contig(&vb->vidbuf, i);
- div.frame.mp[i].data_offset =
- pcam_inst->buf_offset[buf_idx][i].data_offset;
+ if (!pcam_inst->buf_offset)
+ div.frame.mp[i].data_offset = 0;
+ else
+ div.frame.mp[i].data_offset =
+ pcam_inst->buf_offset[buf_idx][i].data_offset;
div.frame.mp[i].addr_offset =
mem->addr_offset;
div.frame.mp[i].fd = (int)mem->vaddr;
@@ -528,18 +529,19 @@
return rc;
}
-static int msm_mctl_pp_path_to_msg_type(int path)
+static int msm_mctl_pp_path_to_img_mode(int path)
{
switch (path) {
case OUTPUT_TYPE_P:
- return VFE_MSG_OUTPUT_P;
+ return MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW;
case OUTPUT_TYPE_V:
- return VFE_MSG_OUTPUT_V;
+ return MSM_V4L2_EXT_CAPTURE_MODE_VIDEO;
case OUTPUT_TYPE_S:
- return VFE_MSG_OUTPUT_S;
+ return MSM_V4L2_EXT_CAPTURE_MODE_MAIN;
case OUTPUT_TYPE_T:
+ return MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL;
default:
- return VFE_MSG_OUTPUT_T;
+ return -EINVAL;
}
}
@@ -550,7 +552,7 @@
struct msm_mctl_pp_frame_buffer pp_buffer;
struct msm_frame_buffer *buf = NULL;
void __user *argp = (void __user *)pp_cmd->value;
- int msg_type = VFE_MSG_OUTPUT_V;
+ int img_mode;
unsigned long flags;
switch (pp_cmd->id) {
@@ -558,8 +560,12 @@
if (copy_from_user(&pp_buffer, pp_cmd->value,
sizeof(pp_buffer)))
return -EFAULT;
- msg_type = msm_mctl_pp_path_to_msg_type(pp_buffer.path);
- buf = msm_mctl_get_free_buf(p_mctl, msg_type);
+ img_mode = msm_mctl_pp_path_to_img_mode(pp_buffer.path);
+ if (img_mode < 0) {
+ pr_err("%s Invalid image mode\n", __func__);
+ return img_mode;
+ }
+ buf = msm_mctl_get_free_buf(p_mctl, img_mode);
pp_buffer.buf_handle = (uint32_t)buf;
if (copy_to_user((void *)argp,
&pp_buffer,
@@ -573,9 +579,13 @@
if (copy_from_user(&pp_buffer, pp_cmd->value,
sizeof(pp_buffer)))
return -EFAULT;
- msg_type = msm_mctl_pp_path_to_msg_type(pp_buffer.path);
- buf = (struct msm_frame_buffer *)pp_buffer.buf_handle;
- msm_mctl_put_free_buf(p_mctl, msg_type, buf);
+ img_mode = msm_mctl_pp_path_to_img_mode(pp_buffer.path);
+ if (img_mode < 0) {
+ pr_err("%s Invalid image mode\n", __func__);
+ return img_mode;
+ }
+ buf = (struct msm_frame_buffer *)pp_buffer.buf_handle;
+ msm_mctl_put_free_buf(p_mctl, img_mode, buf);
break;
}
case MCTL_CMD_DIVERT_FRAME_PP_PATH: {
@@ -647,16 +657,19 @@
if ((MSM_MCTL_PP_VPE_FRAME_TO_APP &
pp_frame_cmd->vpe_output_action)) {
struct msm_free_buf done_frame;
- int msg_type =
- msm_mctl_pp_path_to_msg_type(
+ int img_mode =
+ msm_mctl_pp_path_to_img_mode(
pp_frame_cmd->path);
-
+ if (img_mode < 0) {
+ pr_err("%s Invalid image mode\n", __func__);
+ return img_mode;
+ }
done_frame.ch_paddr[0] =
pp_frame_info->dest_frame.sp.phy_addr;
done_frame.vb =
pp_frame_info->dest_frame.handle;
msm_mctl_buf_done_pp(
- p_mctl, msg_type, &done_frame, 0);
+ p_mctl, img_mode, &done_frame, 0);
pr_info("%s: vpe done to app, vb=0x%x, path=%d, phy=0x%x",
__func__, done_frame.vb,
pp_frame_cmd->path, done_frame.ch_paddr[0]);
@@ -702,43 +715,18 @@
void __user *arg)
{
struct msm_cam_evt_divert_frame frame;
- int msg_type, image_mode, rc = 0;
+ int image_mode, rc = 0;
struct msm_free_buf free_buf;
- int idx;
struct msm_cam_v4l2_dev_inst *pcam_inst;
memset(&free_buf, 0, sizeof(struct msm_free_buf));
if (copy_from_user(&frame, arg,
sizeof(struct msm_cam_evt_divert_frame)))
return -EFAULT;
- switch (frame.frame.path) {
- case OUTPUT_TYPE_P:
- msg_type = VFE_MSG_OUTPUT_P;
- image_mode = MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW;
- break;
- case OUTPUT_TYPE_S:
- msg_type = VFE_MSG_OUTPUT_S;
- image_mode = MSM_V4L2_EXT_CAPTURE_MODE_MAIN;
- break;
- case OUTPUT_TYPE_V:
- msg_type = VFE_MSG_OUTPUT_V;
- image_mode = MSM_V4L2_EXT_CAPTURE_MODE_VIDEO;
- break;
- case OUTPUT_TYPE_T:
- default:
- rc = -EFAULT;
- return rc;
- }
- idx = msm_mctl_out_type_to_inst_index(
- p_mctl->sync.pcam_sync, msg_type);
- if (idx < 0) {
- pr_err("%s Invalid instance. returning\n", __func__);
- return -EINVAL;
- }
- pcam_inst = p_mctl->sync.pcam_sync->dev_inst[idx];
-
- rc = msm_mctl_reserve_free_buf(p_mctl, msg_type, &free_buf);
+ image_mode = frame.image_mode;
+ pcam_inst = p_mctl->sync.pcam_sync->dev_inst[image_mode];
+ rc = msm_mctl_reserve_free_buf(p_mctl, image_mode, &free_buf);
if (rc == 0) {
msm_mctl_pp_get_phy_addr(pcam_inst, free_buf.vb, &frame.frame);
if (copy_to_user((void *)arg,
@@ -758,32 +746,19 @@
void __user *arg)
{
struct msm_cam_evt_divert_frame frame;
- int msg_type, image_mode, rc = 0;
+ int image_mode, rc = 0;
struct msm_free_buf free_buf;
if (copy_from_user(&frame, arg,
sizeof(struct msm_cam_evt_divert_frame)))
return -EFAULT;
- switch (frame.frame.path) {
- case OUTPUT_TYPE_P:
- msg_type = VFE_MSG_OUTPUT_P;
- image_mode = MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW;
- break;
- case OUTPUT_TYPE_S:
- msg_type = VFE_MSG_OUTPUT_S;
- image_mode = MSM_V4L2_EXT_CAPTURE_MODE_MAIN;
- break;
- case OUTPUT_TYPE_V:
- msg_type = VFE_MSG_OUTPUT_V;
- image_mode = MSM_V4L2_EXT_CAPTURE_MODE_VIDEO;
- break;
- case OUTPUT_TYPE_T:
- default:
- rc = -EFAULT;
- return rc;
+ image_mode = msm_mctl_pp_path_to_img_mode(frame.frame.path);
+ if (image_mode < 0) {
+ pr_err("%s Invalid image mode\n", __func__);
+ return image_mode;
}
free_buf.ch_paddr[0] = frame.frame.sp.phy_addr;
- rc = msm_mctl_release_free_buf(p_mctl, msg_type, &free_buf);
+ rc = msm_mctl_release_free_buf(p_mctl, image_mode, &free_buf);
D("%s: release free buf, rc = %d, phy = 0x%x",
__func__, rc, free_buf.ch_paddr[0]);
@@ -811,7 +786,7 @@
void __user *arg)
{
struct msm_pp_frame frame;
- int msg_type, image_mode, rc = 0;
+ int image_mode, rc = 0;
int dirty = 0;
struct msm_free_buf buf;
unsigned long flags;
@@ -820,23 +795,10 @@
return -EFAULT;
spin_lock_irqsave(&p_mctl->pp_info.lock, flags);
- switch (frame.path) {
- case OUTPUT_TYPE_P:
- msg_type = VFE_MSG_OUTPUT_P;
- image_mode = MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW;
- break;
- case OUTPUT_TYPE_S:
- msg_type = VFE_MSG_OUTPUT_S;
- image_mode = MSM_V4L2_EXT_CAPTURE_MODE_MAIN;
- break;
- case OUTPUT_TYPE_V:
- msg_type = VFE_MSG_OUTPUT_V;
- image_mode = MSM_V4L2_EXT_CAPTURE_MODE_VIDEO;
- break;
- case OUTPUT_TYPE_T:
- default:
- rc = -EFAULT;
- goto err;
+ image_mode = msm_mctl_pp_path_to_img_mode(frame.path);
+ if (image_mode < 0) {
+ pr_err("%s Invalid image mode\n", __func__);
+ return image_mode;
}
D("%s Returning frame %x id %d to kernel ", __func__,
(int)frame.handle, frame.frame_id);
@@ -860,10 +822,7 @@
}
spin_unlock_irqrestore(&p_mctl->pp_info.lock, flags);
/* here buf.addr is phy_addr */
- rc = msm_mctl_buf_done_pp(p_mctl, msg_type, &buf, dirty);
- return rc;
-err:
- spin_unlock_irqrestore(&p_mctl->pp_info.lock, flags);
+ rc = msm_mctl_buf_done_pp(p_mctl, image_mode, &buf, dirty);
return rc;
}
@@ -909,11 +868,10 @@
spin_unlock_irqrestore(&p_mctl->pp_info.lock, flags);
D("%s Frame done id: %d\n", __func__, frame.frame_id);
- rc = msm_mctl_buf_done_pp(p_mctl, msg_type, &buf, dirty);
+ rc = msm_mctl_buf_done_pp(p_mctl, image_mode, &buf, dirty);
return rc;
err:
spin_unlock_irqrestore(&p_mctl->pp_info.lock, flags);
return rc;
}
-
diff --git a/drivers/media/video/msm/msm_vfe32.c b/drivers/media/video/msm/msm_vfe32.c
index b04f07c..61036b9 100644
--- a/drivers/media/video/msm/msm_vfe32.c
+++ b/drivers/media/video/msm/msm_vfe32.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -460,63 +460,35 @@
vfe32_ctrl->outpath.out2.ch2 = 0x0000FFFF & *ch_info++;
switch (mode) {
-
- case OUTPUT_2:
- vfe32_ctrl->outpath.output_mode |= VFE32_OUTPUT_MODE_PT;
+ case OUTPUT_PRIM:
+ vfe32_ctrl->outpath.output_mode =
+ VFE32_OUTPUT_MODE_PRIMARY;
break;
-
- case OUTPUT_1_AND_2:
- /* use wm0& 4 for thumbnail, wm1&5 for main image.*/
- vfe32_ctrl->outpath.output_mode |=
- VFE32_OUTPUT_MODE_S; /* main image.*/
- vfe32_ctrl->outpath.output_mode |=
- VFE32_OUTPUT_MODE_PT; /* thumbnail. */
+ case OUTPUT_PRIM_ALL_CHNLS:
+ vfe32_ctrl->outpath.output_mode =
+ VFE32_OUTPUT_MODE_PRIMARY_ALL_CHNLS;
break;
-
- case OUTPUT_1_2_AND_3:
- CDBG("%s: OUTPUT_ZSL", __func__);
- /* use wm0& 4 for postview, wm1&5 for preview.*/
- /* use wm2& 6 for main img */
+ case OUTPUT_PRIM|OUTPUT_SEC:
+ vfe32_ctrl->outpath.output_mode =
+ VFE32_OUTPUT_MODE_PRIMARY;
vfe32_ctrl->outpath.output_mode |=
- VFE32_OUTPUT_MODE_S; /* main image.*/
- vfe32_ctrl->outpath.output_mode |=
- VFE32_OUTPUT_MODE_P; /* preview. */
- vfe32_ctrl->outpath.output_mode |=
- VFE32_OUTPUT_MODE_T; /* thumbnail. */
+ VFE32_OUTPUT_MODE_SECONDARY;
break;
-
- case OUTPUT_1_AND_3:
- /* use wm0& 4 for preview, wm1&5 for video.*/
+ case OUTPUT_PRIM|OUTPUT_SEC_ALL_CHNLS:
+ vfe32_ctrl->outpath.output_mode =
+ VFE32_OUTPUT_MODE_PRIMARY;
vfe32_ctrl->outpath.output_mode |=
- VFE32_OUTPUT_MODE_V; /* video*/
- vfe32_ctrl->outpath.output_mode |=
- VFE32_OUTPUT_MODE_PT; /* preview */
+ VFE32_OUTPUT_MODE_SECONDARY_ALL_CHNLS;
break;
- case CAMIF_TO_AXI_VIA_OUTPUT_2:
- /* use wm0 only */
- CDBG("config axi for raw snapshot.\n");
- vfe32_ctrl->outpath.out1.ch0 = 0; /* raw */
- vfe32_ctrl->outpath.output_mode |= VFE32_OUTPUT_MODE_S;
- break;
- case OUTPUT_ALL_CHNLS:
- /* YV12 preview */
+ case OUTPUT_PRIM_ALL_CHNLS|OUTPUT_SEC:
+ vfe32_ctrl->outpath.output_mode =
+ VFE32_OUTPUT_MODE_PRIMARY_ALL_CHNLS;
vfe32_ctrl->outpath.output_mode |=
- VFE32_OUTPUT_MODE_P_ALL_CHNLS;
- /* video */
- vfe32_ctrl->outpath.output_mode |=
- VFE32_OUTPUT_MODE_V;
- break;
- case OUTPUT_ZSL_ALL_CHNLS:
- CDBG("%s: OUTPUT_ZSL_ALL_CHNLS", __func__);
- vfe32_ctrl->outpath.output_mode |=
- VFE32_OUTPUT_MODE_S; /* main image.*/
- vfe32_ctrl->outpath.output_mode |=
- VFE32_OUTPUT_MODE_P_ALL_CHNLS; /* preview. */
- vfe32_ctrl->outpath.output_mode |=
- VFE32_OUTPUT_MODE_T; /* thumbnail. */
+ VFE32_OUTPUT_MODE_SECONDARY;
break;
default:
- break;
+ pr_err("%s Invalid AXI mode %d ", __func__, mode);
+ return -EINVAL;
}
msm_io_w(*ao, vfe32_ctrl->vfebase +
VFE_BUS_IO_FORMAT_CFG);
@@ -545,7 +517,8 @@
vfe32_ctrl->update_ack_pending = FALSE;
spin_unlock_irqrestore(&vfe32_ctrl->update_ack_lock, flags);
- vfe32_ctrl->recording_state = VFE_REC_STATE_IDLE;
+ vfe32_ctrl->recording_state = VFE_STATE_IDLE;
+ vfe32_ctrl->liveshot_state = VFE_STATE_IDLE;
atomic_set(&vfe32_ctrl->vstate, 0);
@@ -734,7 +707,7 @@
struct msm_sync *sync = vfe_syncdata;
msm_camio_bus_scale_cfg(
sync->sdata->pdata->cam_bus_scale_table, S_VIDEO);
- vfe32_ctrl->recording_state = VFE_REC_STATE_START_REQUESTED;
+ vfe32_ctrl->recording_state = VFE_STATE_START_REQUESTED;
msm_io_w_mb(1, vfe32_ctrl->vfebase + VFE_REG_UPDATE_CMD);
return 0;
}
@@ -742,17 +715,30 @@
static int vfe32_stop_recording(void)
{
struct msm_sync *sync = vfe_syncdata;
- vfe32_ctrl->recording_state = VFE_REC_STATE_STOP_REQUESTED;
+ vfe32_ctrl->recording_state = VFE_STATE_STOP_REQUESTED;
msm_io_w_mb(1, vfe32_ctrl->vfebase + VFE_REG_UPDATE_CMD);
msm_camio_bus_scale_cfg(
sync->sdata->pdata->cam_bus_scale_table, S_PREVIEW);
return 0;
}
-static void vfe32_liveshot(void){
+static void vfe32_start_liveshot(void){
struct msm_sync* p_sync = (struct msm_sync *)vfe_syncdata;
if (p_sync)
p_sync->liveshot_enabled = true;
+
+ /* Hardcode 1 live snapshot for now. */
+ vfe32_ctrl->outpath.out0.capture_cnt = 1;
+ vfe32_ctrl->vfe_capture_count = vfe32_ctrl->outpath.out0.capture_cnt;
+
+ vfe32_ctrl->liveshot_state = VFE_STATE_START_REQUESTED;
+ msm_io_w_mb(1, vfe32_ctrl->vfebase + VFE_REG_UPDATE_CMD);
+}
+
+static void vfe32_stop_liveshot(void)
+{
+ vfe32_ctrl->liveshot_state = VFE_STATE_STOP_REQUESTED;
+ msm_io_w_mb(1, vfe32_ctrl->vfebase + VFE_REG_UPDATE_CMD);
}
static int vfe32_zsl(void)
@@ -765,55 +751,57 @@
CDBG("%s:op mode %d O/P Mode %d\n", __func__,
vfe32_ctrl->operation_mode, vfe32_ctrl->outpath.output_mode);
- if ((vfe32_ctrl->operation_mode == VFE_MODE_OF_OPERATION_ZSL)) {
- if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_P) {
- irq_comp_mask |=
- ((0x1 << (vfe32_ctrl->outpath.out0.ch0)) |
+
+ if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_PRIMARY) {
+ irq_comp_mask |= ((0x1 << (vfe32_ctrl->outpath.out0.ch0)) |
(0x1 << (vfe32_ctrl->outpath.out0.ch1)));
- } else if (vfe32_ctrl->outpath.output_mode &
- VFE32_OUTPUT_MODE_P_ALL_CHNLS) {
- pr_debug("%s Enabling all channels ", __func__);
- irq_comp_mask |= (0x1 << vfe32_ctrl->outpath.out0.ch0 |
- 0x1 << vfe32_ctrl->outpath.out0.ch1 |
- 0x1 << vfe32_ctrl->outpath.out0.ch2);
- }
- if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_T) {
- irq_comp_mask |=
- ((0x1 << (vfe32_ctrl->outpath.out1.ch0 + 8)) |
- (0x1 << (vfe32_ctrl->outpath.out1.ch1 + 8)));
- }
- if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_S) {
- irq_comp_mask |=
- ((0x1 << (vfe32_ctrl->outpath.out2.ch0 + 8)) |
- (0x1 << (vfe32_ctrl->outpath.out2.ch1 + 8)));
- }
- if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_P) {
- msm_io_w(1, vfe32_ctrl->vfebase +
- vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch0]);
- msm_io_w(1, vfe32_ctrl->vfebase +
- vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch1]);
- } else if (vfe32_ctrl->outpath.output_mode &
- VFE32_OUTPUT_MODE_P_ALL_CHNLS) {
- msm_io_w(1, vfe32_ctrl->vfebase +
- vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch0]);
- msm_io_w(1, vfe32_ctrl->vfebase +
- vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch1]);
- msm_io_w(1, vfe32_ctrl->vfebase +
- vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch2]);
- }
- if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_T) {
- msm_io_w(1, vfe32_ctrl->vfebase +
- vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch0]);
- msm_io_w(1, vfe32_ctrl->vfebase +
- vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch1]);
- }
- if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_S) {
- msm_io_w(1, vfe32_ctrl->vfebase +
- vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out2.ch0]);
- msm_io_w(1, vfe32_ctrl->vfebase +
- vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out2.ch1]);
- }
+ } else if (vfe32_ctrl->outpath.output_mode &
+ VFE32_OUTPUT_MODE_PRIMARY_ALL_CHNLS) {
+ irq_comp_mask |= ((0x1 << (vfe32_ctrl->outpath.out0.ch0)) |
+ (0x1 << (vfe32_ctrl->outpath.out0.ch1)) |
+ (0x1 << (vfe32_ctrl->outpath.out0.ch2)));
}
+
+ if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_SECONDARY) {
+ irq_comp_mask |= ((0x1 << (vfe32_ctrl->outpath.out1.ch0 + 8)) |
+ (0x1 << (vfe32_ctrl->outpath.out1.ch1 + 8)));
+ } else if (vfe32_ctrl->outpath.output_mode &
+ VFE32_OUTPUT_MODE_SECONDARY_ALL_CHNLS) {
+ irq_comp_mask |= ((0x1 << (vfe32_ctrl->outpath.out1.ch0 + 8)) |
+ (0x1 << (vfe32_ctrl->outpath.out1.ch1 + 8)) |
+ (0x1 << (vfe32_ctrl->outpath.out1.ch2 + 8)));
+ }
+
+ if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_PRIMARY) {
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch0]);
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch1]);
+ } else if (vfe32_ctrl->outpath.output_mode &
+ VFE32_OUTPUT_MODE_PRIMARY_ALL_CHNLS) {
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch0]);
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch1]);
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch2]);
+ }
+
+ if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_SECONDARY) {
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch0]);
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch1]);
+ } else if (vfe32_ctrl->outpath.output_mode &
+ VFE32_OUTPUT_MODE_SECONDARY_ALL_CHNLS) {
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch0]);
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch1]);
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch2]);
+ }
+
msm_io_w(irq_comp_mask, vfe32_ctrl->vfebase + VFE_IRQ_COMP_MASK);
vfe32_start_common();
msm_camio_bus_scale_cfg(
@@ -823,6 +811,29 @@
msm_io_w(1, vfe32_ctrl->vfebase + 0x188);
return 0;
}
+static int vfe32_capture_raw(uint32_t num_frames_capture)
+{
+ uint32_t irq_comp_mask = 0;
+ struct msm_sync* p_sync = (struct msm_sync *)vfe_syncdata;
+
+ vfe32_ctrl->outpath.out0.capture_cnt = num_frames_capture;
+ vfe32_ctrl->vfe_capture_count = num_frames_capture;
+
+ irq_comp_mask =
+ msm_io_r(vfe32_ctrl->vfebase + VFE_IRQ_COMP_MASK);
+
+ if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_PRIMARY) {
+ irq_comp_mask |= (0x1 << (vfe32_ctrl->outpath.out0.ch0));
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch0]);
+ }
+
+ msm_io_w(irq_comp_mask, vfe32_ctrl->vfebase + VFE_IRQ_COMP_MASK);
+ msm_camio_bus_scale_cfg(
+ p_sync->sdata->pdata->cam_bus_scale_table, S_CAPTURE);
+ vfe32_start_common();
+ return 0;
+}
static int vfe32_capture(uint32_t num_frames_capture)
{
@@ -834,51 +845,49 @@
}
/* capture command is valid for both idle and active state. */
vfe32_ctrl->outpath.out1.capture_cnt = num_frames_capture;
- if (vfe32_ctrl->operation_mode == VFE_MODE_OF_OPERATION_SNAPSHOT) {
+ if (vfe32_ctrl->operation_mode == VFE_OUTPUTS_MAIN_AND_THUMB ||
+ vfe32_ctrl->operation_mode == VFE_OUTPUTS_THUMB_AND_MAIN) {
vfe32_ctrl->outpath.out0.capture_cnt =
- num_frames_capture;
+ num_frames_capture;
}
vfe32_ctrl->vfe_capture_count = num_frames_capture;
- irq_comp_mask =
- msm_io_r(vfe32_ctrl->vfebase + VFE_IRQ_COMP_MASK);
+ irq_comp_mask = msm_io_r(vfe32_ctrl->vfebase + VFE_IRQ_COMP_MASK);
- if (vfe32_ctrl->operation_mode == VFE_MODE_OF_OPERATION_SNAPSHOT) {
- if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_PT) {
+ if (vfe32_ctrl->operation_mode == VFE_OUTPUTS_MAIN_AND_THUMB ||
+ vfe32_ctrl->operation_mode == VFE_OUTPUTS_THUMB_AND_MAIN) {
+ if (vfe32_ctrl->outpath.output_mode &
+ VFE32_OUTPUT_MODE_PRIMARY) {
irq_comp_mask |= (0x1 << vfe32_ctrl->outpath.out0.ch0 |
0x1 << vfe32_ctrl->outpath.out0.ch1);
}
- if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_S) {
+ if (vfe32_ctrl->outpath.output_mode &
+ VFE32_OUTPUT_MODE_SECONDARY) {
irq_comp_mask |=
- (0x1 << (vfe32_ctrl->outpath.out1.ch0 + 8) |
- 0x1 << (vfe32_ctrl->outpath.out1.ch1 + 8));
+ (0x1 << (vfe32_ctrl->outpath.out1.ch0 + 8) |
+ 0x1 << (vfe32_ctrl->outpath.out1.ch1 + 8));
}
- if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_PT) {
+ if (vfe32_ctrl->outpath.output_mode &
+ VFE32_OUTPUT_MODE_PRIMARY) {
msm_io_w(1, vfe32_ctrl->vfebase +
vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch0]);
msm_io_w(1, vfe32_ctrl->vfebase +
vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch1]);
}
- if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_S) {
+ if (vfe32_ctrl->outpath.output_mode &
+ VFE32_OUTPUT_MODE_SECONDARY) {
msm_io_w(1, vfe32_ctrl->vfebase +
vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch0]);
msm_io_w(1, vfe32_ctrl->vfebase +
vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch1]);
}
- } else { /* this is raw snapshot mode. */
- if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_S) {
- irq_comp_mask |=
- (0x1 << (vfe32_ctrl->outpath.out1.ch0 + 8));
- msm_io_w(1, vfe32_ctrl->vfebase +
- vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch0]);
- }
}
msm_io_w(irq_comp_mask, vfe32_ctrl->vfebase + VFE_IRQ_COMP_MASK);
msm_io_r(vfe32_ctrl->vfebase + VFE_IRQ_COMP_MASK);
msm_camio_bus_scale_cfg(
p_sync->sdata->pdata->cam_bus_scale_table, S_CAPTURE);
+
vfe32_start_common();
- msm_io_r(vfe32_ctrl->vfebase + VFE_IRQ_COMP_MASK);
/* for debug */
msm_io_w(1, vfe32_ctrl->vfebase + 0x18C);
msm_io_w(1, vfe32_ctrl->vfebase + 0x188);
@@ -889,44 +898,62 @@
{
uint32_t irq_comp_mask = 0;
struct msm_sync *sync = vfe_syncdata;
- /* start command now is only good for continuous mode. */
- if ((vfe32_ctrl->operation_mode != VFE_MODE_OF_OPERATION_CONTINUOUS) &&
- (vfe32_ctrl->operation_mode != VFE_MODE_OF_OPERATION_VIDEO))
- return 0;
+
irq_comp_mask =
msm_io_r(vfe32_ctrl->vfebase + VFE_IRQ_COMP_MASK);
- if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_PT) {
+ if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_PRIMARY) {
irq_comp_mask |= (0x1 << vfe32_ctrl->outpath.out0.ch0 |
0x1 << vfe32_ctrl->outpath.out0.ch1);
} else if (vfe32_ctrl->outpath.output_mode &
- VFE32_OUTPUT_MODE_P_ALL_CHNLS) {
- pr_debug("%s Enabling all channels ", __func__);
+ VFE32_OUTPUT_MODE_PRIMARY_ALL_CHNLS) {
irq_comp_mask |= (0x1 << vfe32_ctrl->outpath.out0.ch0 |
0x1 << vfe32_ctrl->outpath.out0.ch1 |
0x1 << vfe32_ctrl->outpath.out0.ch2);
}
-
- if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_V) {
- irq_comp_mask |= (0x1 << (vfe32_ctrl->outpath.out2.ch0 + 16)|
- 0x1 << (vfe32_ctrl->outpath.out2.ch1 + 16));
+ if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_SECONDARY) {
+ irq_comp_mask |= (0x1 << (vfe32_ctrl->outpath.out1.ch0 + 8) |
+ 0x1 << (vfe32_ctrl->outpath.out1.ch1 + 8));
+ } else if (vfe32_ctrl->outpath.output_mode &
+ VFE32_OUTPUT_MODE_SECONDARY_ALL_CHNLS) {
+ irq_comp_mask |= (0x1 << (vfe32_ctrl->outpath.out1.ch0 + 8) |
+ 0x1 << (vfe32_ctrl->outpath.out1.ch1 + 8) |
+ 0x1 << (vfe32_ctrl->outpath.out1.ch2 + 8));
}
-
msm_io_w(irq_comp_mask, vfe32_ctrl->vfebase + VFE_IRQ_COMP_MASK);
- if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_PT) {
- msm_io_w(1, vfe32_ctrl->vfebase +
+ if (vfe32_ctrl->operation_mode == VFE_OUTPUTS_PREVIEW_AND_VIDEO) {
+ if (vfe32_ctrl->outpath.output_mode &
+ VFE32_OUTPUT_MODE_PRIMARY) {
+ msm_io_w(1, vfe32_ctrl->vfebase +
vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch0]);
- msm_io_w(1, vfe32_ctrl->vfebase +
+ msm_io_w(1, vfe32_ctrl->vfebase +
vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch1]);
- } else if (vfe32_ctrl->outpath.output_mode &
- VFE32_OUTPUT_MODE_P_ALL_CHNLS) {
- msm_io_w(1, vfe32_ctrl->vfebase +
+ } else if (vfe32_ctrl->outpath.output_mode &
+ VFE32_OUTPUT_MODE_PRIMARY_ALL_CHNLS) {
+ msm_io_w(1, vfe32_ctrl->vfebase +
vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch0]);
- msm_io_w(1, vfe32_ctrl->vfebase +
+ msm_io_w(1, vfe32_ctrl->vfebase +
vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch1]);
- msm_io_w(1, vfe32_ctrl->vfebase +
+ msm_io_w(1, vfe32_ctrl->vfebase +
vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch2]);
+ }
+ } else {
+ if (vfe32_ctrl->outpath.output_mode &
+ VFE32_OUTPUT_MODE_SECONDARY) {
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch0]);
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch1]);
+ } else if (vfe32_ctrl->outpath.output_mode &
+ VFE32_OUTPUT_MODE_SECONDARY_ALL_CHNLS) {
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch0]);
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch1]);
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch2]);
+ }
}
msm_camio_bus_scale_cfg(
sync->sdata->pdata->cam_bus_scale_table, S_PREVIEW);
@@ -1107,39 +1134,13 @@
{
struct vfe32_output_ch *ch = NULL;
- switch (vfe32_ctrl->operation_mode) {
- case VFE_MODE_OF_OPERATION_CONTINUOUS:
- if (path == VFE_MSG_OUTPUT_P)
- ch = &vfe32_ctrl->outpath.out0;
- break;
- case VFE_MODE_OF_OPERATION_SNAPSHOT:
- if (path == VFE_MSG_OUTPUT_T)
- ch = &vfe32_ctrl->outpath.out0;
- else if (path == VFE_MSG_OUTPUT_S)
- ch = &vfe32_ctrl->outpath.out1;
- break;
- case VFE_MODE_OF_OPERATION_VIDEO:
- if (path == VFE_MSG_OUTPUT_P)
- ch = &vfe32_ctrl->outpath.out0;
- else if (path == VFE_MSG_OUTPUT_V)
- ch = &vfe32_ctrl->outpath.out2;
- break;
- case VFE_MODE_OF_OPERATION_RAW_SNAPSHOT:
- if (path == VFE_MSG_OUTPUT_S)
- ch = &vfe32_ctrl->outpath.out0;
- break;
- case VFE_MODE_OF_OPERATION_ZSL:
- if (path == VFE_MSG_OUTPUT_P)
- ch = &vfe32_ctrl->outpath.out0;
- else if (path == VFE_MSG_OUTPUT_T)
- ch = &vfe32_ctrl->outpath.out1;
- else if (path == VFE_MSG_OUTPUT_S)
- ch = &vfe32_ctrl->outpath.out2;
- break;
- default:
- pr_err("%s: Unsupported operation mode %d\n", __func__,
- vfe32_ctrl->operation_mode);
- }
+ if (path == VFE_MSG_OUTPUT_PRIMARY)
+ ch = &vfe32_ctrl->outpath.out0;
+ else if (path == VFE_MSG_OUTPUT_SECONDARY)
+ ch = &vfe32_ctrl->outpath.out1;
+ else
+ pr_err("%s: Invalid path %d\n", __func__,
+ path);
BUG_ON(ch == NULL);
return ch;
@@ -1170,7 +1171,7 @@
outch->pong.ch_paddr[0]);
if (vfe32_ctrl->operation_mode !=
- VFE_MODE_OF_OPERATION_RAW_SNAPSHOT) {
+ VFE_OUTPUTS_RAW) {
vfe32_put_ch_ping_addr(outch->ch1,
outch->ping.ch_paddr[1]);
vfe32_put_ch_pong_addr(outch->ch1,
@@ -1242,11 +1243,18 @@
case VFE_CMD_START:
pr_info("vfe32_proc_general: cmdID = %s\n",
vfe32_general_cmd[cmd->id]);
- rc = vfe32_configure_pingpong_buffers(VFE_MSG_V32_START,
- VFE_MSG_OUTPUT_P);
+ if (vfe32_ctrl->operation_mode ==
+ VFE_OUTPUTS_PREVIEW_AND_VIDEO)
+ /* Configure primary channel */
+ rc = vfe32_configure_pingpong_buffers(
+ VFE_MSG_V32_START, VFE_MSG_OUTPUT_PRIMARY);
+ else
+ /* Configure secondary channel */
+ rc = vfe32_configure_pingpong_buffers(
+ VFE_MSG_V32_START, VFE_MSG_OUTPUT_SECONDARY);
if (rc < 0) {
pr_err("%s error configuring pingpong buffers"
- " for preview", __func__);
+ " for preview", __func__);
rc = -EINVAL;
goto proc_general_done;
}
@@ -1255,6 +1263,23 @@
case VFE_CMD_UPDATE:
vfe32_update();
break;
+ case VFE_CMD_CAPTURE_RAW:
+ pr_info("%s: cmdID = VFE_CMD_CAPTURE_RAW\n", __func__);
+ if (copy_from_user(&snapshot_cnt, (void __user *)(cmd->value),
+ sizeof(uint32_t))) {
+ rc = -EFAULT;
+ goto proc_general_done;
+ }
+ rc = vfe32_configure_pingpong_buffers(VFE_MSG_V32_CAPTURE,
+ VFE_MSG_OUTPUT_PRIMARY);
+ if (rc < 0) {
+ pr_err("%s error configuring pingpong buffers"
+ " for snapshot", __func__);
+ rc = -EINVAL;
+ goto proc_general_done;
+ }
+ rc = vfe32_capture_raw(snapshot_cnt);
+ break;
case VFE_CMD_CAPTURE:
pr_info("vfe32_proc_general: cmdID = %s\n",
vfe32_general_cmd[cmd->id]);
@@ -1263,32 +1288,39 @@
rc = -EFAULT;
goto proc_general_done;
}
+ /* Configure primary channel */
rc = vfe32_configure_pingpong_buffers(VFE_MSG_V32_CAPTURE,
- VFE_MSG_OUTPUT_S);
+ VFE_MSG_OUTPUT_PRIMARY);
if (rc < 0) {
pr_err("%s error configuring pingpong buffers"
- " for snapshot", __func__);
+ " for primary output", __func__);
rc = -EINVAL;
goto proc_general_done;
}
- if (vfe32_ctrl->operation_mode !=
- VFE_MODE_OF_OPERATION_RAW_SNAPSHOT) {
- rc = vfe32_configure_pingpong_buffers(
- VFE_MSG_V32_CAPTURE, VFE_MSG_OUTPUT_T);
- if (rc < 0) {
- pr_err("%s error configuring pingpong buffers"
- " for thumbnail", __func__);
- rc = -EINVAL;
- goto proc_general_done;
- }
+ /* Configure secondary channel */
+ rc = vfe32_configure_pingpong_buffers(VFE_MSG_V32_CAPTURE,
+ VFE_MSG_OUTPUT_SECONDARY);
+ if (rc < 0) {
+ pr_err("%s error configuring pingpong buffers"
+ " for secondary output", __func__);
+ rc = -EINVAL;
+ goto proc_general_done;
}
rc = vfe32_capture(snapshot_cnt);
break;
case VFE_CMD_START_RECORDING:
pr_info("vfe32_proc_general: cmdID = %s\n",
vfe32_general_cmd[cmd->id]);
- rc = vfe32_configure_pingpong_buffers(
- VFE_MSG_V32_START_RECORDING, VFE_MSG_OUTPUT_V);
+ if (vfe32_ctrl->operation_mode ==
+ VFE_OUTPUTS_PREVIEW_AND_VIDEO)
+ rc = vfe32_configure_pingpong_buffers(
+ VFE_MSG_V32_START_RECORDING,
+ VFE_MSG_OUTPUT_SECONDARY);
+ else if (vfe32_ctrl->operation_mode ==
+ VFE_OUTPUTS_VIDEO_AND_PREVIEW)
+ rc = vfe32_configure_pingpong_buffers(
+ VFE_MSG_V32_START_RECORDING,
+ VFE_MSG_OUTPUT_PRIMARY);
if (rc < 0) {
pr_err("%s error configuring pingpong buffers"
" for video", __func__);
@@ -1685,7 +1717,20 @@
break;
case VFE_CMD_LIVESHOT:
- vfe32_liveshot();
+ /* Configure primary channel */
+ rc = vfe32_configure_pingpong_buffers(VFE_MSG_V32_CAPTURE,
+ VFE_MSG_OUTPUT_PRIMARY);
+ if (rc < 0) {
+ pr_err("%s error configuring pingpong buffers"
+ " for primary output", __func__);
+ rc = -EINVAL;
+ goto proc_general_done;
+ }
+ vfe32_start_liveshot();
+ break;
+ case VFE_CMD_STOP_LIVESHOT:
+ pr_info("%s Stopping liveshot ", __func__);
+ vfe32_stop_liveshot();
break;
case VFE_CMD_LINEARIZATION_CFG:
@@ -2113,15 +2158,11 @@
case VFE_CMD_ZSL:
rc = vfe32_configure_pingpong_buffers(VFE_MSG_V32_START,
- VFE_MSG_OUTPUT_P);
+ VFE_MSG_OUTPUT_PRIMARY);
if (rc < 0)
goto proc_general_done;
rc = vfe32_configure_pingpong_buffers(VFE_MSG_V32_START,
- VFE_MSG_OUTPUT_T);
- if (rc < 0)
- goto proc_general_done;
- rc = vfe32_configure_pingpong_buffers(VFE_MSG_V32_START,
- VFE_MSG_OUTPUT_S);
+ VFE_MSG_OUTPUT_SECONDARY);
if (rc < 0)
goto proc_general_done;
@@ -2425,50 +2466,64 @@
static void vfe32_process_reg_update_irq(void)
{
- uint32_t old_val;
unsigned long flags;
- if (vfe32_ctrl->recording_state == VFE_REC_STATE_START_REQUESTED) {
- if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_V) {
+ uint32_t old_val;
+
+ if (vfe32_ctrl->recording_state == VFE_STATE_START_REQUESTED) {
+ if (vfe32_ctrl->operation_mode ==
+ VFE_OUTPUTS_VIDEO_AND_PREVIEW) {
msm_io_w(1, vfe32_ctrl->vfebase +
- vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out2.ch0]);
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch0]);
msm_io_w(1, vfe32_ctrl->vfebase +
- vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out2.ch1]);
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch1]);
+ } else if (vfe32_ctrl->operation_mode ==
+ VFE_OUTPUTS_PREVIEW_AND_VIDEO) {
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch0]);
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch1]);
}
- vfe32_ctrl->recording_state = VFE_REC_STATE_STARTED;
+ vfe32_ctrl->recording_state = VFE_STATE_STARTED;
msm_io_w_mb(1, vfe32_ctrl->vfebase + VFE_REG_UPDATE_CMD);
CDBG("start video triggered .\n");
} else if (vfe32_ctrl->recording_state ==
- VFE_REC_STATE_STOP_REQUESTED) {
- if (vfe32_ctrl->outpath.output_mode & VFE32_OUTPUT_MODE_V) {
- msm_io_w_mb(0, vfe32_ctrl->vfebase +
- vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out2.ch0]);
- msm_io_w_mb(0, vfe32_ctrl->vfebase +
- vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out2.ch1]);
+ VFE_STATE_STOP_REQUESTED) {
+ if (vfe32_ctrl->operation_mode ==
+ VFE_OUTPUTS_VIDEO_AND_PREVIEW) {
+ msm_io_w(0, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch0]);
+ msm_io_w(0, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch1]);
+ } else if (vfe32_ctrl->operation_mode ==
+ VFE_OUTPUTS_PREVIEW_AND_VIDEO) {
+ msm_io_w(0, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch0]);
+ msm_io_w(0, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch1]);
}
-
- /*disable rs& cs when stop recording. */
+ /* Disable rs& cs when stop recording. */
old_val = msm_io_r(vfe32_ctrl->vfebase + VFE_MODULE_CFG);
old_val &= (~RS_CS_ENABLE_MASK);
msm_io_w(old_val, vfe32_ctrl->vfebase + VFE_MODULE_CFG);
-
CDBG("stop video triggered .\n");
}
+
if (vfe32_ctrl->start_ack_pending == TRUE) {
vfe32_send_isp_msg(vfe32_ctrl, MSG_ID_START_ACK);
vfe32_ctrl->start_ack_pending = FALSE;
} else {
if (vfe32_ctrl->recording_state ==
- VFE_REC_STATE_STOP_REQUESTED) {
- vfe32_ctrl->recording_state = VFE_REC_STATE_STOPPED;
+ VFE_STATE_STOP_REQUESTED) {
+ vfe32_ctrl->recording_state = VFE_STATE_STOPPED;
/* request a reg update and send STOP_REC_ACK
* when we process the next reg update irq.
*/
msm_io_w_mb(1,
vfe32_ctrl->vfebase + VFE_REG_UPDATE_CMD);
} else if (vfe32_ctrl->recording_state ==
- VFE_REC_STATE_STOPPED) {
+ VFE_STATE_STOPPED) {
vfe32_send_isp_msg(vfe32_ctrl, MSG_ID_STOP_REC_ACK);
- vfe32_ctrl->recording_state = VFE_REC_STATE_IDLE;
+ vfe32_ctrl->recording_state = VFE_STATE_IDLE;
}
spin_lock_irqsave(&vfe32_ctrl->update_ack_lock, flags);
if (vfe32_ctrl->update_ack_pending == TRUE) {
@@ -2481,30 +2536,55 @@
&vfe32_ctrl->update_ack_lock, flags);
}
}
- if (vfe32_ctrl->operation_mode ==
- VFE_MODE_OF_OPERATION_SNAPSHOT) { /* in snapshot mode */
+
+ if (vfe32_ctrl->liveshot_state == VFE_STATE_START_REQUESTED) {
+ pr_info("%s enabling liveshot output\n", __func__);
+ if (vfe32_ctrl->outpath.output_mode &
+ VFE32_OUTPUT_MODE_PRIMARY) {
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch0]);
+ msm_io_w(1, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch1]);
+ vfe32_ctrl->liveshot_state = VFE_STATE_STARTED;
+ }
+ } else if (vfe32_ctrl->liveshot_state == VFE_STATE_STOP_REQUESTED) {
+ vfe32_ctrl->vfe_capture_count--;
+ if (vfe32_ctrl->vfe_capture_count == 0) {
+ pr_info("%s disabling liveshot output\n", __func__);
+ if (vfe32_ctrl->outpath.output_mode &
+ VFE32_OUTPUT_MODE_PRIMARY) {
+ msm_io_w(0, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch0]);
+ msm_io_w(0, vfe32_ctrl->vfebase +
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch1]);
+ vfe32_ctrl->liveshot_state = VFE_STATE_STOPPED;
+ }
+ }
+ } else if (vfe32_ctrl->liveshot_state == VFE_STATE_STOPPED) {
+ vfe32_send_isp_msg(vfe32_ctrl, MSG_ID_STOP_REC_ACK);
+ vfe32_ctrl->liveshot_state = VFE_STATE_IDLE;
+ }
+
+ if ((vfe32_ctrl->operation_mode == VFE_OUTPUTS_THUMB_AND_MAIN) ||
+ (vfe32_ctrl->operation_mode == VFE_OUTPUTS_MAIN_AND_THUMB)) {
+ /* in snapshot mode */
/* later we need to add check for live snapshot mode. */
vfe32_ctrl->vfe_capture_count--;
/* if last frame to be captured: */
if (vfe32_ctrl->vfe_capture_count == 0) {
- /* stop the bus output: write master enable = 0*/
if (vfe32_ctrl->outpath.output_mode &
- VFE32_OUTPUT_MODE_PT) {
+ VFE32_OUTPUT_MODE_PRIMARY) {
msm_io_w(0, vfe32_ctrl->vfebase +
- vfe32_AXI_WM_CFG[vfe32_ctrl->
- outpath.out0.ch0]);
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch0]);
msm_io_w(0, vfe32_ctrl->vfebase +
- vfe32_AXI_WM_CFG[vfe32_ctrl->
- outpath.out0.ch1]);
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out0.ch1]);
}
if (vfe32_ctrl->outpath.output_mode &
- VFE32_OUTPUT_MODE_S) {
+ VFE32_OUTPUT_MODE_SECONDARY) {
msm_io_w(0, vfe32_ctrl->vfebase +
- vfe32_AXI_WM_CFG[vfe32_ctrl->
- outpath.out1.ch0]);
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch0]);
msm_io_w(0, vfe32_ctrl->vfebase +
- vfe32_AXI_WM_CFG[vfe32_ctrl->
- outpath.out1.ch1]);
+ vfe32_AXI_WM_CFG[vfe32_ctrl->outpath.out1.ch1]);
}
msm_io_w_mb(CAMIF_COMMAND_STOP_AT_FRAME_BOUNDARY,
vfe32_ctrl->vfebase + VFE_CAMIF_COMMAND);
@@ -2512,7 +2592,7 @@
/* then do reg_update. */
msm_io_w(1, vfe32_ctrl->vfebase + VFE_REG_UPDATE_CMD);
}
- } /* if snapshot mode. */
+ } /* in snapshot mode. */
}
static void vfe32_set_default_reg_values(void)
@@ -2572,7 +2652,7 @@
{
/* in raw snapshot mode */
if (vfe32_ctrl->operation_mode ==
- VFE_MODE_OF_OPERATION_RAW_SNAPSHOT) {
+ VFE_OUTPUTS_RAW) {
if (vfe32_ctrl->start_ack_pending) {
vfe32_send_isp_msg(vfe32_ctrl, MSG_ID_START_ACK);
vfe32_ctrl->start_ack_pending = FALSE;
@@ -2703,26 +2783,24 @@
uint32_t ch0_paddr, ch1_paddr, ch2_paddr;
uint8_t out_bool = 0;
struct msm_free_buf *free_buf = NULL;
- if (vfe32_ctrl->operation_mode ==
- VFE_MODE_OF_OPERATION_SNAPSHOT)
- free_buf = vfe32_check_free_buffer(VFE_MSG_OUTPUT_IRQ,
- VFE_MSG_OUTPUT_T);
- else
- free_buf = vfe32_check_free_buffer(VFE_MSG_OUTPUT_IRQ,
- VFE_MSG_OUTPUT_P);
+
+ free_buf = vfe32_check_free_buffer(VFE_MSG_OUTPUT_IRQ,
+ VFE_MSG_OUTPUT_PRIMARY);
+
/* we render frames in the following conditions:
1. Continuous mode and the free buffer is avaialable.
2. In snapshot shot mode, free buffer is not always available.
when pending snapshot count is <=1, then no need to use
free buffer.
*/
- out_bool =
- ((vfe32_ctrl->operation_mode ==
- VFE_MODE_OF_OPERATION_SNAPSHOT ||
- vfe32_ctrl->operation_mode ==
- VFE_MODE_OF_OPERATION_RAW_SNAPSHOT) &&
- (vfe32_ctrl->vfe_capture_count <= 1)) ||
- free_buf;
+ out_bool = ((vfe32_ctrl->operation_mode ==
+ VFE_OUTPUTS_THUMB_AND_MAIN ||
+ vfe32_ctrl->operation_mode ==
+ VFE_OUTPUTS_MAIN_AND_THUMB ||
+ vfe32_ctrl->operation_mode ==
+ VFE_OUTPUTS_RAW) &&
+ (vfe32_ctrl->vfe_capture_count <= 1)) ||
+ free_buf;
if (out_bool) {
ping_pong = msm_io_r(vfe32_ctrl->vfebase +
VFE_BUS_PING_PONG_STATUS);
@@ -2754,87 +2832,23 @@
free_buf->ch_paddr[2]);
}
if (vfe32_ctrl->operation_mode ==
- VFE_MODE_OF_OPERATION_SNAPSHOT) {
- /* will add message for multi-shot. */
+ VFE_OUTPUTS_THUMB_AND_MAIN ||
+ vfe32_ctrl->operation_mode ==
+ VFE_OUTPUTS_MAIN_AND_THUMB ||
+ vfe32_ctrl->operation_mode ==
+ VFE_OUTPUTS_RAW ||
+ vfe32_ctrl->liveshot_state == VFE_STATE_STARTED)
vfe32_ctrl->outpath.out0.capture_cnt--;
- vfe_send_outmsg(&vfe32_ctrl->subdev,
- MSG_ID_OUTPUT_T, ch0_paddr,
- ch1_paddr, ch2_paddr);
- } else {
- /* always send message for continous mode. */
- /* if continuous mode, for display. (preview) */
- vfe_send_outmsg(&vfe32_ctrl->subdev,
- MSG_ID_OUTPUT_P, ch0_paddr,
- ch1_paddr, ch2_paddr);
- }
+
+ vfe_send_outmsg(&vfe32_ctrl->subdev,
+ MSG_ID_OUTPUT_PRIMARY, ch0_paddr,
+ ch1_paddr, ch2_paddr);
} else {
vfe32_ctrl->outpath.out0.frame_drop_cnt++;
CDBG("path_irq_0 - no free buffer!\n");
}
}
-static void vfe32_process_zsl_frame(void)
-{
- uint32_t ping_pong;
- uint32_t ch0_paddr, ch1_paddr, ch2_paddr;
- struct msm_free_buf *free_buf = NULL;
-
- ping_pong = msm_io_r(vfe32_ctrl->vfebase +
- VFE_BUS_PING_PONG_STATUS);
-
- /* Thumbnail */
- free_buf = vfe32_check_free_buffer(VFE_MSG_OUTPUT_IRQ,
- VFE_MSG_OUTPUT_T);
- if (free_buf) {
- ch0_paddr = vfe32_get_ch_addr(ping_pong,
- vfe32_ctrl->outpath.out1.ch0);
- ch1_paddr = vfe32_get_ch_addr(ping_pong,
- vfe32_ctrl->outpath.out1.ch1);
- ch2_paddr = vfe32_get_ch_addr(ping_pong,
- vfe32_ctrl->outpath.out1.ch2);
-
- vfe32_put_ch_addr(ping_pong,
- vfe32_ctrl->outpath.out1.ch0,
- free_buf->ch_paddr[0]);
- vfe32_put_ch_addr(ping_pong,
- vfe32_ctrl->outpath.out1.ch1,
- free_buf->ch_paddr[1]);
- if (free_buf->num_planes > 2)
- vfe32_put_ch_addr(ping_pong,
- vfe32_ctrl->outpath.out1.ch2,
- free_buf->ch_paddr[2]);
- vfe_send_outmsg(&vfe32_ctrl->subdev,
- MSG_ID_OUTPUT_T, ch0_paddr,
- ch1_paddr, ch2_paddr);
- }
-
- /* Mainimg */
- free_buf = vfe32_check_free_buffer(VFE_MSG_OUTPUT_IRQ,
- VFE_MSG_OUTPUT_S);
- if (free_buf) {
- ch0_paddr = vfe32_get_ch_addr(ping_pong,
- vfe32_ctrl->outpath.out2.ch0);
- ch1_paddr = vfe32_get_ch_addr(ping_pong,
- vfe32_ctrl->outpath.out2.ch1);
- ch2_paddr = vfe32_get_ch_addr(ping_pong,
- vfe32_ctrl->outpath.out2.ch2);
- if (free_buf->num_planes > 2)
- vfe32_put_ch_addr(ping_pong,
- vfe32_ctrl->outpath.out2.ch2,
- free_buf->ch_paddr[2]);
-
- vfe32_put_ch_addr(ping_pong,
- vfe32_ctrl->outpath.out2.ch0,
- free_buf->ch_paddr[0]);
- vfe32_put_ch_addr(ping_pong,
- vfe32_ctrl->outpath.out2.ch1,
- free_buf->ch_paddr[1]);
- vfe_send_outmsg(&vfe32_ctrl->subdev,
- MSG_ID_OUTPUT_S, ch0_paddr,
- ch1_paddr, ch2_paddr);
- }
-}
-
static void vfe32_process_output_path_irq_1(void)
{
uint32_t ping_pong;
@@ -2843,26 +2857,17 @@
uint8_t out_bool = 0;
struct msm_free_buf *free_buf = NULL;
- if (vfe32_ctrl->operation_mode == VFE_MODE_OF_OPERATION_ZSL) {
- vfe32_process_zsl_frame();
- return;
- }
-
free_buf = vfe32_check_free_buffer(VFE_MSG_OUTPUT_IRQ,
- VFE_MSG_OUTPUT_S);
+ VFE_MSG_OUTPUT_SECONDARY);
- /* we render frames in the following conditions:
- 1. Continuous mode and the free buffer is avaialable.
- 2. In snapshot shot mode, free buffer is not always available.
- -- when pending snapshot count is <=1, then no need to use
- free buffer.
- */
- out_bool =
- ((vfe32_ctrl->operation_mode ==
- VFE_MODE_OF_OPERATION_SNAPSHOT ||
+ out_bool = ((vfe32_ctrl->operation_mode ==
+ VFE_OUTPUTS_THUMB_AND_MAIN ||
vfe32_ctrl->operation_mode ==
- VFE_MODE_OF_OPERATION_RAW_SNAPSHOT) &&
- (vfe32_ctrl->vfe_capture_count <= 1)) || free_buf;
+ VFE_OUTPUTS_MAIN_AND_THUMB ||
+ vfe32_ctrl->operation_mode ==
+ VFE_OUTPUTS_RAW) &&
+ (vfe32_ctrl->vfe_capture_count <= 1)) || free_buf;
+
if (out_bool) {
ping_pong = msm_io_r(vfe32_ctrl->vfebase +
VFE_BUS_PING_PONG_STATUS);
@@ -2876,8 +2881,8 @@
ch2_paddr = vfe32_get_ch_addr(ping_pong,
vfe32_ctrl->outpath.out1.ch2);
- CDBG("snapshot main, ch0 = 0x%x, ch1 = 0x%x, ch2 = 0x%x\n",
- ch0_paddr, ch1_paddr, ch2_paddr);
+ pr_debug("%s ch0 = 0x%x, ch1 = 0x%x, ch2 = 0x%x\n",
+ __func__, ch0_paddr, ch1_paddr, ch2_paddr);
if (free_buf) {
/* Y channel */
vfe32_put_ch_addr(ping_pong,
@@ -2892,85 +2897,23 @@
vfe32_ctrl->outpath.out1.ch2,
free_buf->ch_paddr[2]);
}
-
if (vfe32_ctrl->operation_mode ==
- VFE_MODE_OF_OPERATION_SNAPSHOT ||
+ VFE_OUTPUTS_THUMB_AND_MAIN ||
vfe32_ctrl->operation_mode ==
- VFE_MODE_OF_OPERATION_RAW_SNAPSHOT) {
+ VFE_OUTPUTS_MAIN_AND_THUMB ||
+ vfe32_ctrl->operation_mode ==
+ VFE_OUTPUTS_RAW)
vfe32_ctrl->outpath.out1.capture_cnt--;
- vfe_send_outmsg(&vfe32_ctrl->subdev,
- MSG_ID_OUTPUT_S, ch0_paddr,
- ch1_paddr, ch2_paddr);
- }
+
+ vfe_send_outmsg(&vfe32_ctrl->subdev,
+ MSG_ID_OUTPUT_SECONDARY, ch0_paddr,
+ ch1_paddr, ch2_paddr);
} else {
vfe32_ctrl->outpath.out1.frame_drop_cnt++;
CDBG("path_irq_1 - no free buffer!\n");
}
}
-static void vfe32_process_output_path_irq_2(void)
-{
- uint32_t ping_pong;
- uint32_t ch0_paddr, ch1_paddr, ch2_paddr;
- struct msm_free_buf *free_buf = NULL;
-
- if (vfe32_ctrl->recording_state == VFE_REC_STATE_STOP_REQUESTED) {
- vfe32_ctrl->outpath.out2.frame_drop_cnt++;
- CDBG("%s: path_irq_2 - recording stop requested ", __func__);
- return;
- }
-
- free_buf = vfe32_check_free_buffer(VFE_MSG_OUTPUT_IRQ,
- VFE_MSG_OUTPUT_V);
- /* we render frames in the following conditions:
- 1. Continuous mode and the free buffer is avaialable.
- 2. In snapshot shot mode, free buffer is not always available.
- -- when pending snapshot count is <=1, then no need to use
- free buffer.
- */
-
- CDBG("%s: op mode = %d, capture_cnt = %d\n", __func__,
- vfe32_ctrl->operation_mode, vfe32_ctrl->vfe_capture_count);
-
- if (free_buf) {
- ping_pong = msm_io_r(vfe32_ctrl->vfebase +
- VFE_BUS_PING_PONG_STATUS);
-
- /* Y channel */
- ch0_paddr = vfe32_get_ch_addr(ping_pong,
- vfe32_ctrl->outpath.out2.ch0);
- /* Chroma channel */
- ch1_paddr = vfe32_get_ch_addr(ping_pong,
- vfe32_ctrl->outpath.out2.ch1);
- ch2_paddr = vfe32_get_ch_addr(ping_pong,
- vfe32_ctrl->outpath.out2.ch2);
-
- CDBG("video output, ch0 = 0x%x, ch1 = 0x%x, ch2 = 0x%x\n",
- ch0_paddr, ch1_paddr, ch2_paddr);
-
- /* Y channel */
- vfe32_put_ch_addr(ping_pong,
- vfe32_ctrl->outpath.out2.ch0,
- free_buf->ch_paddr[0]);
- /* Chroma channel */
- vfe32_put_ch_addr(ping_pong,
- vfe32_ctrl->outpath.out2.ch1,
- free_buf->ch_paddr[1]);
- if (free_buf->num_planes > 2)
- vfe32_put_ch_addr(ping_pong,
- vfe32_ctrl->outpath.out2.ch2,
- free_buf->ch_paddr[2]);
-
- vfe_send_outmsg(&vfe32_ctrl->subdev,
- MSG_ID_OUTPUT_V, ch0_paddr,
- ch1_paddr, ch2_paddr);
-
- } else {
- vfe32_ctrl->outpath.out2.frame_drop_cnt++;
- CDBG("path_irq_2 - no free buffer!\n");
- }
-}
-
static void vfe32_process_stats_comb_irq(uint32_t *irqstatus)
{
return;
@@ -3215,17 +3158,14 @@
CDBG("Image composite done 1 irq occured.\n");
vfe32_process_output_path_irq_1();
}
- if (qcmd->vfeInterruptStatus0 &
- VFE_IRQ_STATUS0_IMAGE_COMPOSIT_DONE2_MASK) {
- CDBG("Image composite done 2 irq occured.\n");
- vfe32_process_output_path_irq_2();
- }
/* in snapshot mode if done then send
snapshot done message */
if (vfe32_ctrl->operation_mode ==
- VFE_MODE_OF_OPERATION_SNAPSHOT ||
+ VFE_OUTPUTS_THUMB_AND_MAIN ||
vfe32_ctrl->operation_mode ==
- VFE_MODE_OF_OPERATION_RAW_SNAPSHOT) {
+ VFE_OUTPUTS_MAIN_AND_THUMB ||
+ vfe32_ctrl->operation_mode ==
+ VFE_OUTPUTS_RAW) {
if ((vfe32_ctrl->outpath.out0.capture_cnt == 0)
&& (vfe32_ctrl->outpath.out1.
capture_cnt == 0)) {
@@ -3446,7 +3386,12 @@
case CMD_STATS_CS_ENABLE:
rc = vfe_stats_cs_buf_init(scfg);
break;
+ default:
+ pr_err("%s Unsupported cmd type %d",
+ __func__, cmd->cmd_type);
+ break;
}
+ goto vfe32_config_done;
}
switch (cmd->cmd_type) {
case CMD_GENERAL:
@@ -3496,7 +3441,7 @@
vfe32_stats_cs_ack(sack);
break;
- case CMD_AXI_CFG_PREVIEW: {
+ case CMD_AXI_CFG_PRIM: {
uint32_t *axio = NULL;
axio = kmalloc(vfe32_cmd[VFE_CMD_AXI_OUT_CFG].length,
GFP_ATOMIC);
@@ -3511,12 +3456,11 @@
rc = -EFAULT;
break;
}
- vfe32_config_axi(OUTPUT_2, axio);
+ vfe32_config_axi(OUTPUT_PRIM, axio);
kfree(axio);
}
break;
-
- case CMD_RAW_PICT_AXI_CFG: {
+ case CMD_AXI_CFG_PRIM_ALL_CHNLS: {
uint32_t *axio = NULL;
axio = kmalloc(vfe32_cmd[VFE_CMD_AXI_OUT_CFG].length,
GFP_ATOMIC);
@@ -3531,12 +3475,11 @@
rc = -EFAULT;
break;
}
- vfe32_config_axi(CAMIF_TO_AXI_VIA_OUTPUT_2, axio);
+ vfe32_config_axi(OUTPUT_PRIM_ALL_CHNLS, axio);
kfree(axio);
}
break;
-
- case CMD_AXI_CFG_SNAP: {
+ case CMD_AXI_CFG_PRIM|CMD_AXI_CFG_SEC: {
uint32_t *axio = NULL;
axio = kmalloc(vfe32_cmd[VFE_CMD_AXI_OUT_CFG].length,
GFP_ATOMIC);
@@ -3551,14 +3494,12 @@
rc = -EFAULT;
break;
}
- vfe32_config_axi(OUTPUT_1_AND_2, axio);
+ vfe32_config_axi(OUTPUT_PRIM|OUTPUT_SEC, axio);
kfree(axio);
}
break;
-
- case CMD_AXI_CFG_ZSL: {
+ case CMD_AXI_CFG_PRIM|CMD_AXI_CFG_SEC_ALL_CHNLS: {
uint32_t *axio = NULL;
- CDBG("%s, CMD_AXI_CFG_ZSL\n", __func__);
axio = kmalloc(vfe32_cmd[VFE_CMD_AXI_OUT_CFG].length,
GFP_ATOMIC);
if (!axio) {
@@ -3572,14 +3513,12 @@
rc = -EFAULT;
break;
}
- vfe32_config_axi(OUTPUT_1_2_AND_3, axio);
+ vfe32_config_axi(OUTPUT_PRIM|OUTPUT_SEC_ALL_CHNLS, axio);
kfree(axio);
}
break;
-
- case CMD_AXI_CFG_ZSL_ALL_CHNLS: {
+ case CMD_AXI_CFG_PRIM_ALL_CHNLS|CMD_AXI_CFG_SEC: {
uint32_t *axio = NULL;
- CDBG("%s, CMD_AXI_CFG_ZSL\n", __func__);
axio = kmalloc(vfe32_cmd[VFE_CMD_AXI_OUT_CFG].length,
GFP_ATOMIC);
if (!axio) {
@@ -3593,51 +3532,17 @@
rc = -EFAULT;
break;
}
- vfe32_config_axi(OUTPUT_ZSL_ALL_CHNLS, axio);
+ vfe32_config_axi(OUTPUT_PRIM_ALL_CHNLS|OUTPUT_SEC, axio);
kfree(axio);
}
break;
-
- case CMD_AXI_CFG_VIDEO: {
- uint32_t *axio = NULL;
- axio = kmalloc(vfe32_cmd[VFE_CMD_AXI_OUT_CFG].length,
- GFP_ATOMIC);
- if (!axio) {
- rc = -ENOMEM;
- break;
- }
-
- if (copy_from_user(axio, (void __user *)(vfecmd.value),
- vfe32_cmd[VFE_CMD_AXI_OUT_CFG].length)) {
- kfree(axio);
- rc = -EFAULT;
- break;
- }
- vfe32_config_axi(OUTPUT_1_AND_3, axio);
- kfree(axio);
- }
- break;
-
- case CMD_AXI_CFG_VIDEO_ALL_CHNLS: {
- uint32_t *axio = NULL;
- axio = kmalloc(vfe32_cmd[VFE_CMD_AXI_OUT_CFG].length,
- GFP_ATOMIC);
- if (!axio) {
- rc = -ENOMEM;
- break;
- }
-
- if (copy_from_user(axio, (void __user *)(vfecmd.value),
- vfe32_cmd[VFE_CMD_AXI_OUT_CFG].length)) {
- kfree(axio);
- rc = -EFAULT;
- break;
- }
- vfe32_config_axi(OUTPUT_ALL_CHNLS, axio);
- kfree(axio);
- }
+ case CMD_AXI_CFG_PRIM_ALL_CHNLS|CMD_AXI_CFG_SEC_ALL_CHNLS:
+ pr_err("%s Invalid/Unsupported AXI configuration %x",
+ __func__, cmd->cmd_type);
break;
default:
+ pr_err("%s Unsupported AXI configuration %x ", __func__,
+ cmd->cmd_type);
break;
}
vfe32_config_done:
diff --git a/drivers/media/video/msm/msm_vfe32.h b/drivers/media/video/msm/msm_vfe32.h
index ff42c28..4eec96a 100644
--- a/drivers/media/video/msm/msm_vfe32.h
+++ b/drivers/media/video/msm/msm_vfe32.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -13,6 +13,8 @@
#ifndef __MSM_VFE32_H__
#define __MSM_VFE32_H__
+#include <linux/bitops.h>
+
#define TRUE 1
#define FALSE 0
@@ -191,17 +193,12 @@
ROLLOFF_RAM1_BANK1 = 0x15,
};
-enum VFE_STATE {
+enum vfe_output_state {
VFE_STATE_IDLE,
- VFE_STATE_ACTIVE
-};
-
-enum vfe_recording_state {
- VFE_REC_STATE_IDLE,
- VFE_REC_STATE_START_REQUESTED,
- VFE_REC_STATE_STARTED,
- VFE_REC_STATE_STOP_REQUESTED,
- VFE_REC_STATE_STOPPED,
+ VFE_STATE_START_REQUESTED,
+ VFE_STATE_STARTED,
+ VFE_STATE_STOP_REQUESTED,
+ VFE_STATE_STOPPED,
};
#define V32_CAMIF_OFF 0x000001E4
@@ -876,12 +873,16 @@
#define VFE33_DMI_DATA_HI 0x000005A0
#define VFE33_DMI_DATA_LO 0x000005A4
-#define VFE32_OUTPUT_MODE_PT (0x1 << 0)
-#define VFE32_OUTPUT_MODE_S (0x1 << 1)
-#define VFE32_OUTPUT_MODE_V (0x1 << 2)
-#define VFE32_OUTPUT_MODE_P (0x1 << 3)
-#define VFE32_OUTPUT_MODE_T (0x1 << 4)
-#define VFE32_OUTPUT_MODE_P_ALL_CHNLS (0x1 << 5)
+#define VFE32_OUTPUT_MODE_PT BIT(0)
+#define VFE32_OUTPUT_MODE_S BIT(1)
+#define VFE32_OUTPUT_MODE_V BIT(2)
+#define VFE32_OUTPUT_MODE_P BIT(3)
+#define VFE32_OUTPUT_MODE_T BIT(4)
+#define VFE32_OUTPUT_MODE_P_ALL_CHNLS BIT(5)
+#define VFE32_OUTPUT_MODE_PRIMARY BIT(6)
+#define VFE32_OUTPUT_MODE_PRIMARY_ALL_CHNLS BIT(7)
+#define VFE32_OUTPUT_MODE_SECONDARY BIT(8)
+#define VFE32_OUTPUT_MODE_SECONDARY_ALL_CHNLS BIT(9)
struct vfe_stats_control {
uint8_t ackPending;
@@ -912,11 +913,12 @@
int8_t stop_ack_pending;
int8_t reset_ack_pending;
int8_t update_ack_pending;
- enum vfe_recording_state recording_state;
+ enum vfe_output_state recording_state;
int8_t update_linear;
int8_t update_rolloff;
int8_t update_la;
int8_t update_gamma;
+ enum vfe_output_state liveshot_state;
spinlock_t tasklet_lock;
struct list_head tasklet_q;
diff --git a/include/media/msm_camera.h b/include/media/msm_camera.h
index 58129bb..dcafa59 100644
--- a/include/media/msm_camera.h
+++ b/include/media/msm_camera.h
@@ -1,3 +1,15 @@
+/* Copyright (c) 2009-2012, Code Aurora Forum. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
#ifndef __LINUX_MSM_CAMERA_H
#define __LINUX_MSM_CAMERA_H
@@ -168,6 +180,9 @@
#define MSM_CAM_IOCTL_GET_KERNEL_SYSTEM_TIME \
_IOW(MSM_CAM_IOCTL_MAGIC, 50, struct timeval *)
+#define MSM_CAM_IOCTL_SET_VFE_OUTPUT_TYPE \
+ _IOW(MSM_CAM_IOCTL_MAGIC, 51, uint32_t *)
+
struct msm_mctl_pp_cmd {
int32_t id;
uint16_t length;
@@ -404,6 +419,11 @@
#define CMD_AXI_CFG_VIDEO_ALL_CHNLS 50
#define CMD_VFE_BUFFER_RELEASE 51
+#define CMD_AXI_CFG_PRIM 0xF1
+#define CMD_AXI_CFG_PRIM_ALL_CHNLS 0xF2
+#define CMD_AXI_CFG_SEC 0xF4
+#define CMD_AXI_CFG_SEC_ALL_CHNLS 0xF8
+
/* vfe config command: config command(from config thread)*/
struct msm_vfe_cfg_cmd {
int cmd_type;
@@ -496,6 +516,12 @@
#define OUTPUT_ZSL_ALL_CHNLS 10
#define LAST_AXI_OUTPUT_MODE_ENUM = OUTPUT_ZSL_ALL_CHNLS
+#define OUTPUT_PRIM 0xF1
+#define OUTPUT_PRIM_ALL_CHNLS 0xF2
+#define OUTPUT_SEC 0xF4
+#define OUTPUT_SEC_ALL_CHNLS 0xF8
+
+
#define MSM_FRAME_PREV_1 0
#define MSM_FRAME_PREV_2 1
#define MSM_FRAME_ENC 2
diff --git a/include/media/msm_isp.h b/include/media/msm_isp.h
index 12d3220..2bb5b7b 100644
--- a/include/media/msm_isp.h
+++ b/include/media/msm_isp.h
@@ -1,6 +1,20 @@
+/* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
#ifndef __MSM_ISP_H__
#define __MSM_ISP_H__
+#define BIT(nr) (1UL << (nr))
+
/* ISP message IDs */
#define MSG_ID_RESET_ACK 0
#define MSG_ID_START_ACK 1
@@ -42,6 +56,8 @@
#define MSG_ID_SOF_ACK 37
#define MSG_ID_STOP_REC_ACK 38
#define MSG_ID_STATS_AWB_AEC 39
+#define MSG_ID_OUTPUT_PRIMARY 40
+#define MSG_ID_OUTPUT_SECONDARY 41
/* ISP command IDs */
#define VFE_CMD_DUMMY_0 0
@@ -180,6 +196,8 @@
#define VFE_CMD_Y_GAMMA_CONFIG 133
#define VFE_CMD_SCALE_OUTPUT1_CONFIG 134
#define VFE_CMD_SCALE_OUTPUT2_CONFIG 135
+#define VFE_CMD_CAPTURE_RAW 136
+#define VFE_CMD_STOP_LIVESHOT 137
struct msm_isp_cmd {
int32_t id;
@@ -288,5 +306,15 @@
/* TBD: 3D related */
};
+#define VFE_OUTPUTS_MAIN_AND_PREVIEW BIT(0)
+#define VFE_OUTPUTS_MAIN_AND_VIDEO BIT(1)
+#define VFE_OUTPUTS_MAIN_AND_THUMB BIT(2)
+#define VFE_OUTPUTS_THUMB_AND_MAIN BIT(3)
+#define VFE_OUTPUTS_PREVIEW_AND_VIDEO BIT(4)
+#define VFE_OUTPUTS_VIDEO_AND_PREVIEW BIT(5)
+#define VFE_OUTPUTS_PREVIEW BIT(6)
+#define VFE_OUTPUTS_VIDEO BIT(7)
+#define VFE_OUTPUTS_RAW BIT(8)
+
#endif /*__MSM_ISP_H__*/