Loading drivers/media/platform/msm/camera_v2/isp/msm_isp.h +1 −0 Original line number Diff line number Diff line Loading @@ -381,6 +381,7 @@ struct msm_vfe_stats_stream { uint32_t framedrop_pattern; uint32_t framedrop_period; uint32_t irq_subsample_pattern; uint32_t init_stats_frame_drop; uint32_t buffer_offset; struct msm_isp_buffer *buf[2]; Loading drivers/media/platform/msm/camera_v2/isp/msm_isp44.c +2 −0 Original line number Diff line number Diff line Loading @@ -482,7 +482,9 @@ static void msm_vfe44_process_reg_update(struct vfe_device *vfe_dev, msm_isp_stats_stream_update(vfe_dev); if (atomic_read(&vfe_dev->axi_data.axi_cfg_update)) msm_isp_axi_cfg_update(vfe_dev); msm_isp_update_framedrop_reg(vfe_dev); msm_isp_update_stats_framedrop_reg(vfe_dev); msm_isp_update_error_frame_count(vfe_dev); vfe_dev->hw_info->vfe_ops.core_ops.reg_update(vfe_dev); Loading drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c +82 −1 Original line number Diff line number Diff line Loading @@ -216,6 +216,7 @@ int msm_isp_stats_create_stream(struct vfe_device *vfe_dev, stream_info->stats_type = stream_req_cmd->stats_type; stream_info->buffer_offset = stream_req_cmd->buffer_offset; stream_info->framedrop_pattern = stream_req_cmd->framedrop_pattern; stream_info->init_stats_frame_drop = stream_req_cmd->init_frame_drop; stream_info->irq_subsample_pattern = stream_req_cmd->irq_subsample_pattern; stream_info->state = STATS_INACTIVE; Loading Loading @@ -267,7 +268,10 @@ int msm_isp_request_stats_stream(struct vfe_device *vfe_dev, void *arg) vfe_dev->hw_info->vfe_ops.stats_ops. cfg_wm_irq_mask(vfe_dev, stream_info); vfe_dev->hw_info->vfe_ops.stats_ops.cfg_wm_reg(vfe_dev, stream_info); if (stream_info->init_stats_frame_drop == 0) vfe_dev->hw_info->vfe_ops.stats_ops.cfg_wm_reg(vfe_dev, stream_info); return rc; } Loading Loading @@ -350,6 +354,27 @@ static void msm_isp_deinit_stats_ping_pong_reg( } } void msm_isp_update_stats_framedrop_reg(struct vfe_device *vfe_dev) { int i; struct msm_vfe_stats_shared_data *stats_data = &vfe_dev->stats_data; struct msm_vfe_stats_stream *stream_info = NULL; for (i = 0; i < vfe_dev->hw_info->stats_hw_info->num_stats_type; i++) { stream_info = &stats_data->stream_info[i]; if (stream_info->state != STATS_ACTIVE) continue; if (stream_info->init_stats_frame_drop) { stream_info->init_stats_frame_drop--; if (stream_info->init_stats_frame_drop == 0) { vfe_dev->hw_info->vfe_ops.stats_ops.cfg_wm_reg( vfe_dev, stream_info); } } } } void msm_isp_stats_stream_update(struct vfe_device *vfe_dev) { int i; Loading Loading @@ -571,3 +596,59 @@ int msm_isp_cfg_stats_stream(struct vfe_device *vfe_dev, void *arg) return rc; } int msm_isp_update_stats_stream(struct vfe_device *vfe_dev, void *arg) { int rc = 0, i; struct msm_vfe_stats_stream *stream_info; struct msm_vfe_stats_shared_data *stats_data = &vfe_dev->stats_data; struct msm_vfe_axi_stream_update_cmd *update_cmd = arg; struct msm_vfe_axi_stream_cfg_update_info *update_info = NULL; /*validate request*/ for (i = 0; i < update_cmd->num_streams; i++) { update_info = &update_cmd->update_info[i]; /*check array reference bounds*/ if (STATS_IDX(update_info->stream_handle) > vfe_dev->hw_info->stats_hw_info->num_stats_type) { pr_err("%s: stats idx %d out of bound!", __func__, STATS_IDX(update_info->stream_handle)); return -EINVAL; } } for (i = 0; i < update_cmd->num_streams; i++) { update_info = &update_cmd->update_info[i]; stream_info = &stats_data->stream_info[ STATS_IDX(update_info->stream_handle)]; if (stream_info->stream_handle != update_info->stream_handle) { pr_err("%s: stats stream handle %x %x mismatch!\n", __func__, stream_info->stream_handle, update_info->stream_handle); continue; } switch (update_cmd->update_type) { case UPDATE_STREAM_STATS_FRAMEDROP_PATTERN: { uint32_t framedrop_period = msm_isp_get_framedrop_period( update_info->skip_pattern); if (update_info->skip_pattern == SKIP_ALL) stream_info->framedrop_pattern = 0x0; else stream_info->framedrop_pattern = 0x1; stream_info->framedrop_period = framedrop_period - 1; if (stream_info->init_stats_frame_drop == 0) vfe_dev->hw_info->vfe_ops.stats_ops.cfg_wm_reg( vfe_dev, stream_info); break; } default: pr_err("%s: Invalid update type\n", __func__); return -EINVAL; } } return rc; } drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.h +3 −1 Original line number Diff line number Diff line /* Copyright (c) 2013, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2014, The Linux Foundation. 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 Loading @@ -20,6 +20,8 @@ void msm_isp_process_stats_irq(struct vfe_device *vfe_dev, struct msm_isp_timestamp *ts); void msm_isp_stats_stream_update(struct vfe_device *vfe_dev); int msm_isp_cfg_stats_stream(struct vfe_device *vfe_dev, void *arg); int msm_isp_update_stats_stream(struct vfe_device *vfe_dev, void *arg); int msm_isp_release_stats_stream(struct vfe_device *vfe_dev, void *arg); int msm_isp_request_stats_stream(struct vfe_device *vfe_dev, void *arg); void msm_isp_update_stats_framedrop_reg(struct vfe_device *vfe_dev); #endif /* __MSM_ISP_STATS_UTIL_H__ */ drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c +5 −0 Original line number Diff line number Diff line Loading @@ -653,6 +653,11 @@ static long msm_isp_ioctl_unlocked(struct v4l2_subdev *sd, rc = msm_isp_cfg_stats_stream(vfe_dev, arg); mutex_unlock(&vfe_dev->core_mutex); break; case VIDIOC_MSM_ISP_UPDATE_STATS_STREAM: mutex_lock(&vfe_dev->core_mutex); rc = msm_isp_update_stats_stream(vfe_dev, arg); mutex_unlock(&vfe_dev->core_mutex); break; case VIDIOC_MSM_ISP_UPDATE_STREAM: mutex_lock(&vfe_dev->core_mutex); rc = msm_isp_update_axi_stream(vfe_dev, arg); Loading Loading
drivers/media/platform/msm/camera_v2/isp/msm_isp.h +1 −0 Original line number Diff line number Diff line Loading @@ -381,6 +381,7 @@ struct msm_vfe_stats_stream { uint32_t framedrop_pattern; uint32_t framedrop_period; uint32_t irq_subsample_pattern; uint32_t init_stats_frame_drop; uint32_t buffer_offset; struct msm_isp_buffer *buf[2]; Loading
drivers/media/platform/msm/camera_v2/isp/msm_isp44.c +2 −0 Original line number Diff line number Diff line Loading @@ -482,7 +482,9 @@ static void msm_vfe44_process_reg_update(struct vfe_device *vfe_dev, msm_isp_stats_stream_update(vfe_dev); if (atomic_read(&vfe_dev->axi_data.axi_cfg_update)) msm_isp_axi_cfg_update(vfe_dev); msm_isp_update_framedrop_reg(vfe_dev); msm_isp_update_stats_framedrop_reg(vfe_dev); msm_isp_update_error_frame_count(vfe_dev); vfe_dev->hw_info->vfe_ops.core_ops.reg_update(vfe_dev); Loading
drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c +82 −1 Original line number Diff line number Diff line Loading @@ -216,6 +216,7 @@ int msm_isp_stats_create_stream(struct vfe_device *vfe_dev, stream_info->stats_type = stream_req_cmd->stats_type; stream_info->buffer_offset = stream_req_cmd->buffer_offset; stream_info->framedrop_pattern = stream_req_cmd->framedrop_pattern; stream_info->init_stats_frame_drop = stream_req_cmd->init_frame_drop; stream_info->irq_subsample_pattern = stream_req_cmd->irq_subsample_pattern; stream_info->state = STATS_INACTIVE; Loading Loading @@ -267,7 +268,10 @@ int msm_isp_request_stats_stream(struct vfe_device *vfe_dev, void *arg) vfe_dev->hw_info->vfe_ops.stats_ops. cfg_wm_irq_mask(vfe_dev, stream_info); vfe_dev->hw_info->vfe_ops.stats_ops.cfg_wm_reg(vfe_dev, stream_info); if (stream_info->init_stats_frame_drop == 0) vfe_dev->hw_info->vfe_ops.stats_ops.cfg_wm_reg(vfe_dev, stream_info); return rc; } Loading Loading @@ -350,6 +354,27 @@ static void msm_isp_deinit_stats_ping_pong_reg( } } void msm_isp_update_stats_framedrop_reg(struct vfe_device *vfe_dev) { int i; struct msm_vfe_stats_shared_data *stats_data = &vfe_dev->stats_data; struct msm_vfe_stats_stream *stream_info = NULL; for (i = 0; i < vfe_dev->hw_info->stats_hw_info->num_stats_type; i++) { stream_info = &stats_data->stream_info[i]; if (stream_info->state != STATS_ACTIVE) continue; if (stream_info->init_stats_frame_drop) { stream_info->init_stats_frame_drop--; if (stream_info->init_stats_frame_drop == 0) { vfe_dev->hw_info->vfe_ops.stats_ops.cfg_wm_reg( vfe_dev, stream_info); } } } } void msm_isp_stats_stream_update(struct vfe_device *vfe_dev) { int i; Loading Loading @@ -571,3 +596,59 @@ int msm_isp_cfg_stats_stream(struct vfe_device *vfe_dev, void *arg) return rc; } int msm_isp_update_stats_stream(struct vfe_device *vfe_dev, void *arg) { int rc = 0, i; struct msm_vfe_stats_stream *stream_info; struct msm_vfe_stats_shared_data *stats_data = &vfe_dev->stats_data; struct msm_vfe_axi_stream_update_cmd *update_cmd = arg; struct msm_vfe_axi_stream_cfg_update_info *update_info = NULL; /*validate request*/ for (i = 0; i < update_cmd->num_streams; i++) { update_info = &update_cmd->update_info[i]; /*check array reference bounds*/ if (STATS_IDX(update_info->stream_handle) > vfe_dev->hw_info->stats_hw_info->num_stats_type) { pr_err("%s: stats idx %d out of bound!", __func__, STATS_IDX(update_info->stream_handle)); return -EINVAL; } } for (i = 0; i < update_cmd->num_streams; i++) { update_info = &update_cmd->update_info[i]; stream_info = &stats_data->stream_info[ STATS_IDX(update_info->stream_handle)]; if (stream_info->stream_handle != update_info->stream_handle) { pr_err("%s: stats stream handle %x %x mismatch!\n", __func__, stream_info->stream_handle, update_info->stream_handle); continue; } switch (update_cmd->update_type) { case UPDATE_STREAM_STATS_FRAMEDROP_PATTERN: { uint32_t framedrop_period = msm_isp_get_framedrop_period( update_info->skip_pattern); if (update_info->skip_pattern == SKIP_ALL) stream_info->framedrop_pattern = 0x0; else stream_info->framedrop_pattern = 0x1; stream_info->framedrop_period = framedrop_period - 1; if (stream_info->init_stats_frame_drop == 0) vfe_dev->hw_info->vfe_ops.stats_ops.cfg_wm_reg( vfe_dev, stream_info); break; } default: pr_err("%s: Invalid update type\n", __func__); return -EINVAL; } } return rc; }
drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.h +3 −1 Original line number Diff line number Diff line /* Copyright (c) 2013, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2014, The Linux Foundation. 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 Loading @@ -20,6 +20,8 @@ void msm_isp_process_stats_irq(struct vfe_device *vfe_dev, struct msm_isp_timestamp *ts); void msm_isp_stats_stream_update(struct vfe_device *vfe_dev); int msm_isp_cfg_stats_stream(struct vfe_device *vfe_dev, void *arg); int msm_isp_update_stats_stream(struct vfe_device *vfe_dev, void *arg); int msm_isp_release_stats_stream(struct vfe_device *vfe_dev, void *arg); int msm_isp_request_stats_stream(struct vfe_device *vfe_dev, void *arg); void msm_isp_update_stats_framedrop_reg(struct vfe_device *vfe_dev); #endif /* __MSM_ISP_STATS_UTIL_H__ */
drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c +5 −0 Original line number Diff line number Diff line Loading @@ -653,6 +653,11 @@ static long msm_isp_ioctl_unlocked(struct v4l2_subdev *sd, rc = msm_isp_cfg_stats_stream(vfe_dev, arg); mutex_unlock(&vfe_dev->core_mutex); break; case VIDIOC_MSM_ISP_UPDATE_STATS_STREAM: mutex_lock(&vfe_dev->core_mutex); rc = msm_isp_update_stats_stream(vfe_dev, arg); mutex_unlock(&vfe_dev->core_mutex); break; case VIDIOC_MSM_ISP_UPDATE_STREAM: mutex_lock(&vfe_dev->core_mutex); rc = msm_isp_update_axi_stream(vfe_dev, arg); Loading