From a6f81dc47ac7ab328ded31f4157315f486961c7a Mon Sep 17 00:00:00 2001 From: Vladislav Hristov Date: Fri, 23 Aug 2013 16:58:14 +0300 Subject: [PATCH] msm: camera: Add support for multiple SOF events. Multiple SOF events are required, when running multiple HW streams on a single VFE, and the user space needs to distinguish between different SOFs in the different streams. Such situation can occur, when we have one or more RDI streams in parallel with a PIX stream. Change-Id: Id4d03ca8d65d60ccbbb8949311a31607eb7417fe Signed-off-by: Vladislav Hristov --- .../platform/msm/camera_v2/isp/msm_isp32.c | 8 +++---- .../platform/msm/camera_v2/isp/msm_isp40.c | 11 +++++---- .../msm/camera_v2/isp/msm_isp_axi_util.c | 2 +- include/media/msmb_isp.h | 23 +++++++++++++++---- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp32.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp32.c index 044f6f141b3..eb05015ac17 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp32.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp32.c @@ -176,15 +176,15 @@ static void msm_vfe32_process_camif_irq(struct vfe_device *vfe_dev, uint32_t irq_status0, uint32_t irq_status1, struct msm_isp_timestamp *ts) { + uint32_t cnt; if (!(irq_status0 & 0x1F)) return; if (irq_status0 & BIT(0)) { ISP_DBG("%s: SOF IRQ\n", __func__); - if (vfe_dev->axi_data.src_info[VFE_PIX_0].raw_stream_count > 0 - && vfe_dev->axi_data.src_info[VFE_PIX_0]. - pix_stream_count == 0) { - msm_isp_sof_notify(vfe_dev, VFE_PIX_0, ts); + cnt = vfe_dev->axi_data.src_info[VFE_PIX_0].raw_stream_count; + if (cnt > 0) { + msm_isp_sof_notify(vfe_dev, VFE_RAW_0, ts); if (vfe_dev->axi_data.stream_update) msm_isp_axi_stream_update(vfe_dev); msm_isp_update_framedrop_reg(vfe_dev); diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c index d53d7f6a471..e443e9ae13e 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c @@ -1,4 +1,4 @@ -/* 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 @@ -370,15 +370,16 @@ static void msm_vfe40_process_camif_irq(struct vfe_device *vfe_dev, uint32_t irq_status0, uint32_t irq_status1, struct msm_isp_timestamp *ts) { + int cnt; + if (!(irq_status0 & 0xF)) return; if (irq_status0 & (1 << 0)) { ISP_DBG("%s: SOF IRQ\n", __func__); - if (vfe_dev->axi_data.src_info[VFE_PIX_0].raw_stream_count > 0 - && vfe_dev->axi_data.src_info[VFE_PIX_0]. - pix_stream_count == 0) { - msm_isp_sof_notify(vfe_dev, VFE_PIX_0, ts); + cnt = vfe_dev->axi_data.src_info[VFE_PIX_0].raw_stream_count; + if (cnt > 0) { + msm_isp_sof_notify(vfe_dev, VFE_RAW_0, ts); if (vfe_dev->axi_data.stream_update) msm_isp_axi_stream_update(vfe_dev); msm_isp_update_framedrop_reg(vfe_dev); diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index f9088627a50..75adcae87b2 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -452,7 +452,7 @@ void msm_isp_sof_notify(struct vfe_device *vfe_dev, sof_event.frame_id = vfe_dev->axi_data.src_info[frame_src].frame_id; sof_event.timestamp = ts->event_time; sof_event.mono_timestamp = ts->buf_time; - msm_isp_send_event(vfe_dev, ISP_EVENT_SOF, &sof_event); + msm_isp_send_event(vfe_dev, ISP_EVENT_SOF + frame_src, &sof_event); } void msm_isp_calculate_framedrop( diff --git a/include/media/msmb_isp.h b/include/media/msmb_isp.h index 3ba0abed971..3828221d476 100644 --- a/include/media/msmb_isp.h +++ b/include/media/msmb_isp.h @@ -1,3 +1,14 @@ +/* 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 + * 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 __MSMB_ISP__ #define __MSMB_ISP__ @@ -302,15 +313,16 @@ enum msm_isp_event_idx { ISP_WM_BUS_OVERFLOW = 4, ISP_STATS_OVERFLOW = 5, ISP_CAMIF_ERROR = 6, - ISP_SOF = 7, - ISP_EOF = 8, - ISP_EVENT_MAX = 9 + ISP_BUF_DONE = 9, + ISP_EVENT_MAX = 10 }; #define ISP_EVENT_OFFSET 8 #define ISP_EVENT_BASE (V4L2_EVENT_PRIVATE_START) #define ISP_BUF_EVENT_BASE (ISP_EVENT_BASE + (1 << ISP_EVENT_OFFSET)) #define ISP_STATS_EVENT_BASE (ISP_EVENT_BASE + (2 << ISP_EVENT_OFFSET)) +#define ISP_SOF_EVENT_BASE (ISP_EVENT_BASE + (3 << ISP_EVENT_OFFSET)) +#define ISP_EOF_EVENT_BASE (ISP_EVENT_BASE + (4 << ISP_EVENT_OFFSET)) #define ISP_EVENT_REG_UPDATE (ISP_EVENT_BASE + ISP_REG_UPDATE) #define ISP_EVENT_START_ACK (ISP_EVENT_BASE + ISP_START_ACK) #define ISP_EVENT_STOP_ACK (ISP_EVENT_BASE + ISP_STOP_ACK) @@ -318,8 +330,9 @@ enum msm_isp_event_idx { #define ISP_EVENT_WM_BUS_OVERFLOW (ISP_EVENT_BASE + ISP_WM_BUS_OVERFLOW) #define ISP_EVENT_STATS_OVERFLOW (ISP_EVENT_BASE + ISP_STATS_OVERFLOW) #define ISP_EVENT_CAMIF_ERROR (ISP_EVENT_BASE + ISP_CAMIF_ERROR) -#define ISP_EVENT_SOF (ISP_EVENT_BASE + ISP_SOF) -#define ISP_EVENT_EOF (ISP_EVENT_BASE + ISP_EOF) +#define ISP_EVENT_SOF (ISP_SOF_EVENT_BASE) +#define ISP_EVENT_EOF (ISP_EOF_EVENT_BASE) +#define ISP_EVENT_BUF_DONE (ISP_EVENT_BASE + ISP_BUF_DONE) #define ISP_EVENT_BUF_DIVERT (ISP_BUF_EVENT_BASE) #define ISP_EVENT_STATS_NOTIFY (ISP_STATS_EVENT_BASE) #define ISP_EVENT_COMP_STATS_NOTIFY (ISP_EVENT_STATS_NOTIFY + MSM_ISP_STATS_MAX)