summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/media/platform/msm/camera_v2/isp/msm_isp.h19
-rw-r--r--drivers/media/platform/msm/camera_v2/isp/msm_isp40.c178
-rw-r--r--drivers/media/platform/msm/camera_v2/isp/msm_isp44.c171
-rw-r--r--drivers/media/platform/msm/camera_v2/isp/msm_isp46.c176
-rw-r--r--drivers/media/platform/msm/camera_v2/isp/msm_isp47.c187
-rw-r--r--drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c22
-rw-r--r--drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c3
7 files changed, 403 insertions, 353 deletions
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h
index ed533f49a782..8a9a4f2a1c30 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h
@@ -71,6 +71,16 @@ struct msm_vfe_stats_stream;
#define VFE_SD_HW_MAX VFE_SD_COMMON
+/* Irq operations to perform on the irq mask register */
+enum msm_isp_irq_operation {
+ /* enable the irq bits in given parameters */
+ MSM_ISP_IRQ_ENABLE = 1,
+ /* disable the irq bits in the given parameters */
+ MSM_ISP_IRQ_DISABLE = 2,
+ /* set the irq bits to the given parameters */
+ MSM_ISP_IRQ_SET = 3,
+};
+
/* This struct is used to save/track SOF info for some INTF.
* e.g. used in Master-Slave mode */
struct msm_vfe_sof_info {
@@ -144,7 +154,6 @@ struct msm_vfe_irq_ops {
void (*process_stats_irq)(struct vfe_device *vfe_dev,
uint32_t irq_status0, uint32_t irq_status1,
struct msm_isp_timestamp *ts);
- void (*enable_camif_err)(struct vfe_device *vfe_dev, int enable);
};
struct msm_vfe_axi_ops {
@@ -223,7 +232,6 @@ struct msm_vfe_core_ops {
void (*get_overflow_mask)(uint32_t *overflow_mask);
void (*get_irq_mask)(struct vfe_device *vfe_dev,
uint32_t *irq0_mask, uint32_t *irq1_mask);
- void (*restore_irq_mask)(struct vfe_device *vfe_dev);
void (*get_halt_restart_mask)(uint32_t *irq0_mask,
uint32_t *irq1_mask);
void (*get_rdi_wm_mask)(struct vfe_device *vfe_dev,
@@ -516,8 +524,6 @@ enum msm_vfe_overflow_state {
struct msm_vfe_error_info {
atomic_t overflow_state;
- uint32_t overflow_recover_irq_mask0;
- uint32_t overflow_recover_irq_mask1;
uint32_t error_mask0;
uint32_t error_mask1;
uint32_t violation_status;
@@ -696,7 +702,6 @@ struct vfe_device {
int vfe_clk_idx;
uint32_t vfe_open_cnt;
uint8_t vt_enable;
- uint8_t ignore_error;
uint32_t vfe_ub_policy;
uint8_t reset_pending;
uint8_t reg_update_requested;
@@ -717,6 +722,10 @@ struct vfe_device {
uint32_t isp_raw1_debug;
uint32_t isp_raw2_debug;
uint8_t is_camif_raw_crop_supported;
+
+ /* irq info */
+ uint32_t irq0_mask;
+ uint32_t irq1_mask;
};
struct vfe_parent_device {
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 51f8e9aa8195..337ae59f88e8 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c
@@ -96,6 +96,35 @@ static uint8_t stats_pingpong_offset_map[] = {
#define VFE40_CLK_IDX 2
static struct msm_cam_clk_info msm_vfe40_clk_info[VFE_CLK_INFO_MAX];
+static void msm_vfe40_config_irq(struct vfe_device *vfe_dev,
+ uint32_t irq0_mask, uint32_t irq1_mask,
+ enum msm_isp_irq_operation oper)
+{
+ uint32_t val;
+
+ switch (oper) {
+ case MSM_ISP_IRQ_ENABLE:
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
+ val |= irq0_mask;
+ msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x28);
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0x2C);
+ val |= irq1_mask;
+ msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x2C);
+ break;
+ case MSM_ISP_IRQ_DISABLE:
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
+ val &= ~irq0_mask;
+ msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x28);
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0x2C);
+ val &= ~irq1_mask;
+ msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x2C);
+ break;
+ case MSM_ISP_IRQ_SET:
+ msm_camera_io_w_mb(irq0_mask, vfe_dev->vfe_base + 0x28);
+ msm_camera_io_w_mb(irq1_mask, vfe_dev->vfe_base + 0x2C);
+ }
+}
+
static int32_t msm_vfe40_init_qos_parms(struct vfe_device *vfe_dev,
struct msm_vfe_hw_init_parms *qos_parms,
struct msm_vfe_hw_init_parms *ds_parms)
@@ -346,8 +375,10 @@ bus_scale_register_failed:
static void msm_vfe40_release_hardware(struct vfe_device *vfe_dev)
{
/* disable all mask before tasklet kill */
- msm_camera_io_w_mb(0x0, vfe_dev->vfe_base + 0x28);
- msm_camera_io_w_mb(0x0, vfe_dev->vfe_base + 0x2C);
+ vfe_dev->irq0_mask = 0;
+ vfe_dev->irq1_mask = 0;
+ msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
disable_irq(vfe_dev->vfe_irq->start);
free_irq(vfe_dev->vfe_irq->start, vfe_dev);
@@ -412,20 +443,27 @@ static void msm_vfe40_init_hardware_reg(struct vfe_device *vfe_dev)
msm_vfe40_init_vbif_parms(vfe_dev, &vbif_parms);
/* BUS_CFG */
msm_camera_io_w(0x10000001, vfe_dev->vfe_base + 0x50);
- msm_camera_io_w(0xE00000F1, vfe_dev->vfe_base + 0x28);
- msm_camera_io_w_mb(0xFEFFFFFF, vfe_dev->vfe_base + 0x2C);
+ vfe_dev->irq0_mask = 0xE00000F1;
+ vfe_dev->irq1_mask = 0xFEFFFFFF;
+ msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x30);
msm_camera_io_w_mb(0xFEFFFFFF, vfe_dev->vfe_base + 0x34);
msm_camera_io_w(1, vfe_dev->vfe_base + 0x24);
+
msm_camera_io_w(0, vfe_dev->vfe_base + 0x30);
msm_camera_io_w_mb(0, vfe_dev->vfe_base + 0x34);
msm_camera_io_w(1, vfe_dev->vfe_base + 0x24);
+ msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe40_clear_status_reg(struct vfe_device *vfe_dev)
{
- msm_camera_io_w((1 << 31), vfe_dev->vfe_base + 0x28);
- msm_camera_io_w_mb(0x0, vfe_dev->vfe_base + 0x2C);
+ vfe_dev->irq0_mask = (1 << 31);
+ vfe_dev->irq1_mask = 0;
+ msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x30);
msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x34);
msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x24);
@@ -635,23 +673,9 @@ static void msm_vfe40_process_error_status(struct vfe_device *vfe_dev)
msm_isp_util_update_last_overflow_ab_ib(vfe_dev);
}
-static void msm_vfe40_enable_camif_error(struct vfe_device *vfe_dev,
- int enable)
-{
- uint32_t val;
-
- val = msm_camera_io_r(vfe_dev->vfe_base + 0x2C);
- if (enable)
- msm_camera_io_w_mb(val | BIT(0), vfe_dev->vfe_base + 0x2C);
- else
- msm_camera_io_w_mb(val & ~(BIT(0)), vfe_dev->vfe_base + 0x2C);
-}
-
static void msm_vfe40_read_irq_status(struct vfe_device *vfe_dev,
uint32_t *irq_status0, uint32_t *irq_status1)
{
- uint32_t irq_mask0, irq_mask1;
-
*irq_status0 = msm_camera_io_r(vfe_dev->vfe_base + 0x38);
*irq_status1 = msm_camera_io_r(vfe_dev->vfe_base + 0x3C);
/*
@@ -667,15 +691,14 @@ static void msm_vfe40_read_irq_status(struct vfe_device *vfe_dev,
*irq_status0 &= ~(0x18000000);
}
- irq_mask0 = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- irq_mask1 = msm_camera_io_r(vfe_dev->vfe_base + 0x2C);
- *irq_status0 &= irq_mask0;
- *irq_status1 &= irq_mask1;
+ *irq_status0 &= vfe_dev->irq0_mask;
+ *irq_status1 &= vfe_dev->irq1_mask;
if (*irq_status1 & (1 << 0)) {
vfe_dev->error_info.camif_status =
msm_camera_io_r(vfe_dev->vfe_base + 0x31C);
- msm_vfe40_enable_camif_error(vfe_dev, 0);
+ vfe_dev->irq1_mask &= ~(1 << 0);
+ msm_vfe40_config_irq(vfe_dev, 0, (1 << 0), MSM_ISP_IRQ_DISABLE);
}
if (*irq_status1 & (1 << 7))
@@ -891,52 +914,49 @@ static void msm_vfe40_axi_cfg_comp_mask(struct vfe_device *vfe_dev,
struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data;
uint32_t comp_mask, comp_mask_index =
stream_info->comp_mask_index;
- uint32_t irq_mask;
comp_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x40);
comp_mask &= ~(0x7F << (comp_mask_index * 8));
comp_mask |= (axi_data->composite_info[comp_mask_index].
stream_composite_mask << (comp_mask_index * 8));
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- irq_mask |= 1 << (comp_mask_index + 25);
+ vfe_dev->irq0_mask |= 1 << (comp_mask_index + 25);
msm_camera_io_w(comp_mask, vfe_dev->vfe_base + 0x40);
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x28);
+ msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe40_axi_clear_comp_mask(struct vfe_device *vfe_dev,
struct msm_vfe_axi_stream *stream_info)
{
uint32_t comp_mask, comp_mask_index = stream_info->comp_mask_index;
- uint32_t irq_mask;
+ vfe_dev->irq0_mask &= ~BIT(27);
comp_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x40);
comp_mask &= ~(0x7F << (comp_mask_index * 8));
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- irq_mask &= ~(1 << (comp_mask_index + 25));
+ vfe_dev->irq0_mask &= ~(1 << (comp_mask_index + 25));
msm_camera_io_w(comp_mask, vfe_dev->vfe_base + 0x40);
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x28);
+ msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe40_axi_cfg_wm_irq_mask(struct vfe_device *vfe_dev,
struct msm_vfe_axi_stream *stream_info)
{
- uint32_t irq_mask;
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- irq_mask |= 1 << (stream_info->wm[0] + 8);
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x28);
+ vfe_dev->irq0_mask |= 1 << (stream_info->wm[0] + 8);
+ msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe40_axi_clear_wm_irq_mask(struct vfe_device *vfe_dev,
struct msm_vfe_axi_stream *stream_info)
{
- uint32_t irq_mask;
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- irq_mask &= ~(1 << (stream_info->wm[0] + 8));
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x28);
+ vfe_dev->irq0_mask &= ~(1 << (stream_info->wm[0] + 8));
+ msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe40_cfg_framedrop(void __iomem *vfe_base,
@@ -1176,10 +1196,10 @@ static void msm_vfe40_cfg_fetch_engine(struct vfe_device *vfe_dev,
temp |= (1 << 1);
msm_camera_io_w(temp, vfe_dev->vfe_base + 0x50);
- temp = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- temp &= 0xFEFFFFFF;
- temp |= (1 << 24);
- msm_camera_io_w(temp, vfe_dev->vfe_base + 0x28);
+ vfe_dev->irq0_mask &= 0xFEFFFFFF;
+ vfe_dev->irq0_mask |= (1 << 24);
+ msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
msm_camera_io_w((fe_cfg->fetch_height - 1),
vfe_dev->vfe_base + 0x238);
@@ -1473,9 +1493,10 @@ static void msm_vfe40_update_camif_state(struct vfe_device *vfe_dev,
msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x30);
msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x34);
msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x24);
- val = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- val |= 0xF7;
- msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x28);
+ vfe_dev->irq0_mask |= 0xF7;
+ msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask,
+ vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
msm_camera_io_w_mb(0x140000, vfe_dev->vfe_base + 0x318);
bus_en =
@@ -1494,17 +1515,25 @@ static void msm_vfe40_update_camif_state(struct vfe_device *vfe_dev,
msm_camera_io_w_mb(0x4, vfe_dev->vfe_base + 0x2F4);
msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x2F4);
vfe_dev->axi_data.src_info[VFE_PIX_0].active = 1;
- } else if (update_state == DISABLE_CAMIF) {
- msm_camera_io_w_mb(0x0, vfe_dev->vfe_base + 0x2F4);
+ } else if (update_state == DISABLE_CAMIF ||
+ DISABLE_CAMIF_IMMEDIATELY == update_state) {
+ msm_vfe40_config_irq(vfe_dev, 0, 0,
+ MSM_ISP_IRQ_SET);
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0x464);
+ /* disable danger signal */
+ msm_camera_io_w_mb(val & ~(1 << 8), vfe_dev->vfe_base + 0x464);
+ msm_camera_io_w_mb((update_state == DISABLE_CAMIF ? 0x0 : 0x6),
+ vfe_dev->vfe_base + 0x2F4);
vfe_dev->axi_data.src_info[VFE_PIX_0].active = 0;
/* testgen OFF*/
if (vfe_dev->axi_data.src_info[VFE_PIX_0].input_mux == TESTGEN)
msm_camera_io_w(1 << 1, vfe_dev->vfe_base + 0x93C);
- } else if (update_state == DISABLE_CAMIF_IMMEDIATELY) {
- msm_camera_io_w_mb(0x6, vfe_dev->vfe_base + 0x2F4);
- vfe_dev->axi_data.src_info[VFE_PIX_0].active = 0;
- if (vfe_dev->axi_data.src_info[VFE_PIX_0].input_mux == TESTGEN)
- msm_camera_io_w(1 << 1, vfe_dev->vfe_base + 0x93C);
+ msm_camera_io_w(0, vfe_dev->vfe_base + 0x30);
+ msm_camera_io_w((1 << 0), vfe_dev->vfe_base + 0x34);
+ msm_camera_io_w_mb(1, vfe_dev->vfe_base + 0x24);
+ msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask,
+ vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
}
@@ -1808,8 +1837,8 @@ static int msm_vfe40_axi_halt(struct vfe_device *vfe_dev,
enum msm_vfe_input_src i;
/* Keep only halt and restart mask */
- msm_camera_io_w(BIT(31), vfe_dev->vfe_base + 0x28);
- msm_camera_io_w(BIT(8), vfe_dev->vfe_base + 0x2C);
+ msm_vfe40_config_irq(vfe_dev, (1 << 31), (1 << 8),
+ MSM_ISP_IRQ_SET);
/*Clear IRQ Status */
msm_camera_io_w(0x7FFFFFFF, vfe_dev->vfe_base + 0x30);
msm_camera_io_w(0xFEFFFEFF, vfe_dev->vfe_base + 0x34);
@@ -1859,7 +1888,8 @@ static int msm_vfe40_axi_halt(struct vfe_device *vfe_dev,
static int msm_vfe40_axi_restart(struct vfe_device *vfe_dev,
uint32_t blocking, uint32_t enable_camif)
{
- vfe_dev->hw_info->vfe_ops.core_ops.restore_irq_mask(vfe_dev);
+ msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
/* Clear IRQ Status */
msm_camera_io_w(0x7FFFFFFF, vfe_dev->vfe_base + 0x30);
msm_camera_io_w(0xFEFFFEFF, vfe_dev->vfe_base + 0x34);
@@ -1988,20 +2018,20 @@ static void msm_vfe40_stats_cfg_wm_irq_mask(
struct vfe_device *vfe_dev,
struct msm_vfe_stats_stream *stream_info)
{
- uint32_t irq_mask;
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- irq_mask |= 1 << (STATS_IDX(stream_info->stream_handle) + 16);
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x28);
+ vfe_dev->irq0_mask |=
+ 1 << (STATS_IDX(stream_info->stream_handle) + 16);
+ msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe40_stats_clear_wm_irq_mask(
struct vfe_device *vfe_dev,
struct msm_vfe_stats_stream *stream_info)
{
- uint32_t irq_mask;
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- irq_mask &= ~(1 << (STATS_IDX(stream_info->stream_handle) + 16));
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x28);
+ vfe_dev->irq0_mask &=
+ ~(1 << (STATS_IDX(stream_info->stream_handle) + 16));
+ msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe40_stats_cfg_wm_reg(
@@ -2270,20 +2300,10 @@ static void msm_vfe40_get_rdi_wm_mask(struct vfe_device *vfe_dev,
static void msm_vfe40_get_irq_mask(struct vfe_device *vfe_dev,
uint32_t *irq0_mask, uint32_t *irq1_mask)
{
- *irq0_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- *irq1_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x2C);
+ *irq0_mask = vfe_dev->irq0_mask;
+ *irq1_mask = vfe_dev->irq1_mask;
}
-
-static void msm_vfe40_restore_irq_mask(struct vfe_device *vfe_dev)
-{
- msm_camera_io_w(vfe_dev->error_info.overflow_recover_irq_mask0,
- vfe_dev->vfe_base + 0x28);
- msm_camera_io_w(vfe_dev->error_info.overflow_recover_irq_mask1,
- vfe_dev->vfe_base + 0x2C);
-}
-
-
static void msm_vfe40_get_halt_restart_mask(uint32_t *irq0_mask,
uint32_t *irq1_mask)
{
@@ -2329,7 +2349,6 @@ struct msm_vfe_hardware_info vfe40_hw_info = {
.process_axi_irq = msm_isp_process_axi_irq,
.process_stats_irq = msm_isp_process_stats_irq,
.process_epoch_irq = msm_vfe40_process_epoch_irq,
- .enable_camif_err = msm_vfe40_enable_camif_error,
},
.axi_ops = {
.reload_wm = msm_vfe40_axi_reload_wm,
@@ -2374,7 +2393,6 @@ struct msm_vfe_hardware_info vfe40_hw_info = {
.get_overflow_mask = msm_vfe40_get_overflow_mask,
.get_rdi_wm_mask = msm_vfe40_get_rdi_wm_mask,
.get_irq_mask = msm_vfe40_get_irq_mask,
- .restore_irq_mask = msm_vfe40_restore_irq_mask,
.get_halt_restart_mask =
msm_vfe40_get_halt_restart_mask,
.process_error_status = msm_vfe40_process_error_status,
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c
index 195e595a4ffc..97d5fa7becba 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c
@@ -65,6 +65,36 @@ static uint8_t stats_pingpong_offset_map[] = {
#define VFE44_CLK_IDX 2
static struct msm_cam_clk_info msm_vfe44_clk_info[VFE_CLK_INFO_MAX];
+static void msm_vfe44_config_irq(struct vfe_device *vfe_dev,
+ uint32_t irq0_mask, uint32_t irq1_mask,
+ enum msm_isp_irq_operation oper)
+{
+ uint32_t val;
+
+ switch (oper) {
+ case MSM_ISP_IRQ_ENABLE:
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
+ val |= irq0_mask;
+ msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x28);
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0x2C);
+ val |= irq1_mask;
+ msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x2C);
+ break;
+ case MSM_ISP_IRQ_DISABLE:
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
+ val &= ~irq0_mask;
+ msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x28);
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0x2C);
+ val &= ~irq1_mask;
+ msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x2C);
+ break;
+ case MSM_ISP_IRQ_SET:
+ msm_camera_io_w_mb(irq0_mask, vfe_dev->vfe_base + 0x28);
+ msm_camera_io_w_mb(irq1_mask, vfe_dev->vfe_base + 0x2C);
+ break;
+ }
+}
+
static int32_t msm_vfe44_init_dt_parms(struct vfe_device *vfe_dev,
struct msm_vfe_hw_init_parms *dt_parms)
{
@@ -213,8 +243,10 @@ bus_scale_register_failed:
static void msm_vfe44_release_hardware(struct vfe_device *vfe_dev)
{
- msm_camera_io_w_mb(0x0, vfe_dev->vfe_base + 0x28);
- msm_camera_io_w_mb(0x0, vfe_dev->vfe_base + 0x2C);
+ vfe_dev->irq0_mask = 0;
+ vfe_dev->irq1_mask = 0;
+ msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
disable_irq(vfe_dev->vfe_irq->start);
free_irq(vfe_dev->vfe_irq->start, vfe_dev);
tasklet_kill(&vfe_dev->vfe_tasklet);
@@ -253,8 +285,10 @@ static void msm_vfe44_init_hardware_reg(struct vfe_device *vfe_dev)
/* BUS_CFG */
msm_camera_io_w(0x10000001, vfe_dev->vfe_base + 0x50);
- msm_camera_io_w(0xE00000F1, vfe_dev->vfe_base + 0x28);
- msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x2C);
+ vfe_dev->irq0_mask = 0xE00000F1;
+ vfe_dev->irq1_mask = 0xFFFFFFFF;
+ msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x30);
msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x34);
msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x24);
@@ -263,8 +297,10 @@ static void msm_vfe44_init_hardware_reg(struct vfe_device *vfe_dev)
static void msm_vfe44_clear_status_reg(struct vfe_device *vfe_dev)
{
- msm_camera_io_w(0x80000000, vfe_dev->vfe_base + 0x28);
- msm_camera_io_w_mb(0x0, vfe_dev->vfe_base + 0x2C);
+ vfe_dev->irq0_mask = 0x80000000;
+ vfe_dev->irq1_mask = 0;
+ msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x30);
msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x34);
msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x24);
@@ -468,33 +504,17 @@ static void msm_vfe44_process_error_status(struct vfe_device *vfe_dev)
}
}
-static void msm_vfe44_enable_camif_error(struct vfe_device *vfe_dev,
- int enable)
-{
- uint32_t val;
-
- val = msm_camera_io_r(vfe_dev->vfe_base + 0x2C);
- if (enable)
- msm_camera_io_w_mb(val | BIT(0), vfe_dev->vfe_base + 0x2C);
- else
- msm_camera_io_w_mb(val & ~(BIT(0)), vfe_dev->vfe_base + 0x2C);
-}
-
static void msm_vfe44_read_irq_status(struct vfe_device *vfe_dev,
uint32_t *irq_status0, uint32_t *irq_status1)
{
- uint32_t irq_mask0 = 0, irq_mask1 = 0;
- irq_mask0 = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- irq_mask1 = msm_camera_io_r(vfe_dev->vfe_base + 0x2C);
-
*irq_status0 = msm_camera_io_r(vfe_dev->vfe_base + 0x38);
*irq_status1 = msm_camera_io_r(vfe_dev->vfe_base + 0x3C);
msm_camera_io_w(*irq_status0, vfe_dev->vfe_base + 0x30);
msm_camera_io_w(*irq_status1, vfe_dev->vfe_base + 0x34);
msm_camera_io_w_mb(1, vfe_dev->vfe_base + 0x24);
- *irq_status0 &= irq_mask0;
- *irq_status1 &= irq_mask1;
+ *irq_status0 &= vfe_dev->irq0_mask;
+ *irq_status1 &= vfe_dev->irq1_mask;
if (*irq_status0 & 0x10000000) {
pr_err_ratelimited("%s: Protection triggered\n", __func__);
*irq_status0 &= ~(0x10000000);
@@ -503,7 +523,8 @@ static void msm_vfe44_read_irq_status(struct vfe_device *vfe_dev,
if (*irq_status1 & (1 << 0)) {
vfe_dev->error_info.camif_status =
msm_camera_io_r(vfe_dev->vfe_base + 0x31C);
- msm_vfe44_enable_camif_error(vfe_dev, 0);
+ vfe_dev->irq1_mask &= ~(1 << 0);
+ msm_vfe44_config_irq(vfe_dev, 0, (1 << 0), MSM_ISP_IRQ_DISABLE);
}
if (*irq_status1 & (1 << 7))
@@ -726,7 +747,6 @@ static void msm_vfe44_axi_cfg_comp_mask(struct vfe_device *vfe_dev,
struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data;
uint32_t comp_mask, comp_mask_index =
stream_info->comp_mask_index;
- uint32_t irq_mask;
comp_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x40);
comp_mask &= ~(0x7F << (comp_mask_index * 8));
@@ -734,42 +754,39 @@ static void msm_vfe44_axi_cfg_comp_mask(struct vfe_device *vfe_dev,
stream_composite_mask << (comp_mask_index * 8));
msm_camera_io_w(comp_mask, vfe_dev->vfe_base + 0x40);
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- irq_mask |= 1 << (comp_mask_index + 25);
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x28);
+ vfe_dev->irq0_mask |= 1 << (comp_mask_index + 25);
+ msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe44_axi_clear_comp_mask(struct vfe_device *vfe_dev,
struct msm_vfe_axi_stream *stream_info)
{
uint32_t comp_mask, comp_mask_index = stream_info->comp_mask_index;
- uint32_t irq_mask;
comp_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x40);
comp_mask &= ~(0x7F << (comp_mask_index * 8));
msm_camera_io_w(comp_mask, vfe_dev->vfe_base + 0x40);
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- irq_mask &= ~(1 << (comp_mask_index + 25));
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x28);
+ vfe_dev->irq0_mask &= ~(1 << (comp_mask_index + 25));
+ msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe44_axi_cfg_wm_irq_mask(struct vfe_device *vfe_dev,
struct msm_vfe_axi_stream *stream_info)
{
- uint32_t irq_mask;
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- irq_mask |= 1 << (stream_info->wm[0] + 8);
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x28);
+ vfe_dev->irq0_mask |= 1 << (stream_info->wm[0] + 8);
+ msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe44_axi_clear_wm_irq_mask(struct vfe_device *vfe_dev,
struct msm_vfe_axi_stream *stream_info)
{
- uint32_t irq_mask;
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- irq_mask &= ~(1 << (stream_info->wm[0] + 8));
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x28);
+ vfe_dev->irq0_mask &= ~(1 << (stream_info->wm[0] + 8));
+ msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe44_cfg_framedrop(void __iomem *vfe_base,
@@ -1005,10 +1022,10 @@ static void msm_vfe44_cfg_fetch_engine(struct vfe_device *vfe_dev,
temp |= (1 << 1);
msm_camera_io_w(temp, vfe_dev->vfe_base + 0x50);
- temp = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- temp &= 0xFEFFFFFF;
- temp |= (1 << 24);
- msm_camera_io_w(temp, vfe_dev->vfe_base + 0x28);
+ vfe_dev->irq0_mask &= 0xFEFFFFFF;
+ vfe_dev->irq0_mask |= (1 << 24);
+ msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask,
+ vfe_dev->irq1_mask, MSM_ISP_IRQ_SET);
msm_camera_io_w((fe_cfg->fetch_height - 1) & 0xFFF,
vfe_dev->vfe_base + 0x238);
@@ -1136,9 +1153,9 @@ static void msm_vfe44_update_camif_state(struct vfe_device *vfe_dev,
msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x34);
msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x24);
- val = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- val |= 0xF7;
- msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x28);
+ vfe_dev->irq0_mask |= 0xF7;
+ msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask,
+ vfe_dev->irq1_mask, MSM_ISP_IRQ_SET);
msm_camera_io_w_mb(0x140000, vfe_dev->vfe_base + 0x318);
bus_en =
@@ -1155,12 +1172,21 @@ static void msm_vfe44_update_camif_state(struct vfe_device *vfe_dev,
msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x2F4);
vfe_dev->axi_data.src_info[VFE_PIX_0].active = 1;
- } else if (update_state == DISABLE_CAMIF) {
- msm_camera_io_w_mb(0x0, vfe_dev->vfe_base + 0x2F4);
- vfe_dev->axi_data.src_info[VFE_PIX_0].active = 0;
- } else if (update_state == DISABLE_CAMIF_IMMEDIATELY) {
- msm_camera_io_w_mb(0x6, vfe_dev->vfe_base + 0x2F4);
+ } else if (update_state == DISABLE_CAMIF ||
+ DISABLE_CAMIF_IMMEDIATELY == update_state) {
+ msm_vfe44_config_irq(vfe_dev, 0,
+ 0, MSM_ISP_IRQ_SET);
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0xC18);
+ /* disable danger signal */
+ msm_camera_io_w_mb(val & ~(1 << 8), vfe_dev->vfe_base + 0xC18);
+ msm_camera_io_w_mb((update_state == DISABLE_CAMIF ? 0x0 : 0x6),
+ vfe_dev->vfe_base + 0x2F4);
vfe_dev->axi_data.src_info[VFE_PIX_0].active = 0;
+ msm_camera_io_w(0, vfe_dev->vfe_base + 0x30);
+ msm_camera_io_w((1 << 0), vfe_dev->vfe_base + 0x34);
+ msm_camera_io_w_mb(1, vfe_dev->vfe_base + 0x24);
+ msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask,
+ vfe_dev->irq1_mask, MSM_ISP_IRQ_SET);
}
}
@@ -1408,8 +1434,8 @@ static int msm_vfe44_axi_halt(struct vfe_device *vfe_dev,
enum msm_vfe_input_src i;
/* Keep only halt and restart mask */
- msm_camera_io_w(BIT(31), vfe_dev->vfe_base + 0x28);
- msm_camera_io_w(BIT(8), vfe_dev->vfe_base + 0x2C);
+ msm_vfe44_config_irq(vfe_dev, (1 << 31), (1 << 8),
+ MSM_ISP_IRQ_SET);
/*Clear IRQ Status0, only leave reset irq mask*/
msm_camera_io_w(0x7FFFFFFF, vfe_dev->vfe_base + 0x30);
@@ -1469,7 +1495,8 @@ static int msm_vfe44_axi_halt(struct vfe_device *vfe_dev,
static int msm_vfe44_axi_restart(struct vfe_device *vfe_dev,
uint32_t blocking, uint32_t enable_camif)
{
- vfe_dev->hw_info->vfe_ops.core_ops.restore_irq_mask(vfe_dev);
+ msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
msm_camera_io_w(0x7FFFFFFF, vfe_dev->vfe_base + 0x30);
msm_camera_io_w(0xFEFFFEFF, vfe_dev->vfe_base + 0x34);
msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x24);
@@ -1624,20 +1651,20 @@ static void msm_vfe44_stats_cfg_wm_irq_mask(
struct vfe_device *vfe_dev,
struct msm_vfe_stats_stream *stream_info)
{
- uint32_t irq_mask;
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- irq_mask |= 1 << (STATS_IDX(stream_info->stream_handle) + 15);
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x28);
+ vfe_dev->irq0_mask |=
+ 1 << (STATS_IDX(stream_info->stream_handle) + 15);
+ msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe44_stats_clear_wm_irq_mask(
struct vfe_device *vfe_dev,
struct msm_vfe_stats_stream *stream_info)
{
- uint32_t irq_mask;
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- irq_mask &= ~(1 << (STATS_IDX(stream_info->stream_handle) + 15));
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x28);
+ vfe_dev->irq0_mask &=
+ ~(1 << (STATS_IDX(stream_info->stream_handle) + 15));
+ msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe44_stats_cfg_wm_reg(
@@ -1917,20 +1944,10 @@ static void msm_vfe44_get_rdi_wm_mask(struct vfe_device *vfe_dev,
static void msm_vfe44_get_irq_mask(struct vfe_device *vfe_dev,
uint32_t *irq0_mask, uint32_t *irq1_mask)
{
- *irq0_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
- *irq1_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x2C);
+ *irq0_mask = vfe_dev->irq0_mask;
+ *irq1_mask = vfe_dev->irq1_mask;
}
-
-static void msm_vfe44_restore_irq_mask(struct vfe_device *vfe_dev)
-{
- msm_camera_io_w(vfe_dev->error_info.overflow_recover_irq_mask0,
- vfe_dev->vfe_base + 0x28);
- msm_camera_io_w(vfe_dev->error_info.overflow_recover_irq_mask1,
- vfe_dev->vfe_base + 0x2C);
-}
-
-
static void msm_vfe44_get_halt_restart_mask(uint32_t *irq0_mask,
uint32_t *irq1_mask)
{
@@ -1977,7 +1994,6 @@ struct msm_vfe_hardware_info vfe44_hw_info = {
.process_axi_irq = msm_isp_process_axi_irq,
.process_stats_irq = msm_isp_process_stats_irq,
.process_epoch_irq = msm_vfe44_process_epoch_irq,
- .enable_camif_err = msm_vfe44_enable_camif_error,
},
.axi_ops = {
.reload_wm = msm_vfe44_axi_reload_wm,
@@ -2022,7 +2038,6 @@ struct msm_vfe_hardware_info vfe44_hw_info = {
.get_overflow_mask = msm_vfe44_get_overflow_mask,
.get_rdi_wm_mask = msm_vfe44_get_rdi_wm_mask,
.get_irq_mask = msm_vfe44_get_irq_mask,
- .restore_irq_mask = msm_vfe44_restore_irq_mask,
.get_halt_restart_mask =
msm_vfe44_get_halt_restart_mask,
.process_error_status = msm_vfe44_process_error_status,
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c
index 582c65ec12fd..e1e579bc292c 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c
@@ -86,6 +86,37 @@ static uint8_t stats_pingpong_offset_map[] = {
#define VFE46_CLK_IDX 2
static struct msm_cam_clk_info msm_vfe46_clk_info[VFE_CLK_INFO_MAX];
+
+static void msm_vfe46_config_irq(struct vfe_device *vfe_dev,
+ uint32_t irq0_mask, uint32_t irq1_mask,
+ enum msm_isp_irq_operation oper)
+{
+ uint32_t val;
+
+ switch (oper) {
+ case MSM_ISP_IRQ_ENABLE:
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
+ val |= irq0_mask;
+ msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x5C);
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0x60);
+ val |= irq1_mask;
+ msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x60);
+ break;
+ case MSM_ISP_IRQ_DISABLE:
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
+ val &= ~irq0_mask;
+ msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x5C);
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0x60);
+ val &= ~irq1_mask;
+ msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x60);
+ break;
+ case MSM_ISP_IRQ_SET:
+ msm_camera_io_w_mb(irq0_mask, vfe_dev->vfe_base + 0x5C);
+ msm_camera_io_w_mb(irq1_mask, vfe_dev->vfe_base + 0x60);
+ break;
+ }
+}
+
static int32_t msm_vfe46_init_dt_parms(struct vfe_device *vfe_dev,
struct msm_vfe_hw_init_parms *dt_parms, void __iomem *dev_mem_base)
{
@@ -236,8 +267,10 @@ bus_scale_register_failed:
static void msm_vfe46_release_hardware(struct vfe_device *vfe_dev)
{
/* when closing node, disable all irq */
- msm_camera_io_w_mb(0x0, vfe_dev->vfe_base + 0x5C);
- msm_camera_io_w_mb(0x0, vfe_dev->vfe_base + 0x60);
+ vfe_dev->irq0_mask = 0;
+ vfe_dev->irq1_mask = 0;
+ msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
disable_irq(vfe_dev->vfe_irq->start);
free_irq(vfe_dev->vfe_irq->start, vfe_dev);
@@ -282,16 +315,20 @@ static void msm_vfe46_init_hardware_reg(struct vfe_device *vfe_dev)
/* BUS_CFG */
msm_camera_io_w(0x00000001, vfe_dev->vfe_base + 0x84);
/* IRQ_MASK/CLEAR */
- msm_camera_io_w(0xE00000F1, vfe_dev->vfe_base + 0x5C);
- msm_camera_io_w_mb(0xE1FFFFFF, vfe_dev->vfe_base + 0x60);
+ vfe_dev->irq0_mask = 0xE00000F1;
+ vfe_dev->irq1_mask = 0xE1FFFFFF;
+ msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x64);
msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x68);
}
static void msm_vfe46_clear_status_reg(struct vfe_device *vfe_dev)
{
- msm_camera_io_w(0x80000000, vfe_dev->vfe_base + 0x5C);
- msm_camera_io_w_mb(0x0, vfe_dev->vfe_base + 0x60);
+ vfe_dev->irq0_mask = 0x80000000;
+ vfe_dev->irq1_mask = 0x0;
+ msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x64);
msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x68);
msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x58);
@@ -410,38 +447,23 @@ static void msm_vfe46_process_error_status(struct vfe_device *vfe_dev)
pr_err("%s: status bf scale bus overflow\n", __func__);
}
-static void msm_vfe46_enable_camif_error(struct vfe_device *vfe_dev,
- int enable)
-{
- uint32_t val;
-
- val = msm_camera_io_r(vfe_dev->vfe_base + 0x60);
- if (enable)
- msm_camera_io_w_mb(val | BIT(0), vfe_dev->vfe_base + 0x60);
- else
- msm_camera_io_w_mb(val & ~(BIT(0)), vfe_dev->vfe_base + 0x60);
-}
-
static void msm_vfe46_read_irq_status(struct vfe_device *vfe_dev,
uint32_t *irq_status0, uint32_t *irq_status1)
{
- uint32_t irq_mask0, irq_mask1;
-
*irq_status0 = msm_camera_io_r(vfe_dev->vfe_base + 0x6C);
*irq_status1 = msm_camera_io_r(vfe_dev->vfe_base + 0x70);
msm_camera_io_w(*irq_status0, vfe_dev->vfe_base + 0x64);
msm_camera_io_w(*irq_status1, vfe_dev->vfe_base + 0x68);
msm_camera_io_w_mb(1, vfe_dev->vfe_base + 0x58);
- irq_mask0 = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- irq_mask1 = msm_camera_io_r(vfe_dev->vfe_base + 0x60);
- *irq_status0 &= irq_mask0;
- *irq_status1 &= irq_mask1;
+ *irq_status0 &= vfe_dev->irq0_mask;
+ *irq_status1 &= vfe_dev->irq1_mask;
if (*irq_status1 & (1 << 0)) {
vfe_dev->error_info.camif_status =
msm_camera_io_r(vfe_dev->vfe_base + 0x3D0);
- msm_vfe46_enable_camif_error(vfe_dev, 0);
+ vfe_dev->irq1_mask &= ~(1 << 0);
+ msm_vfe46_config_irq(vfe_dev, 0, (1 << 0), MSM_ISP_IRQ_DISABLE);
}
if (*irq_status1 & (1 << 7))
@@ -665,7 +687,6 @@ static void msm_vfe46_axi_cfg_comp_mask(struct vfe_device *vfe_dev,
struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data;
uint32_t comp_mask, comp_mask_index =
stream_info->comp_mask_index;
- uint32_t irq_mask;
comp_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x74);
comp_mask &= ~(0x7F << (comp_mask_index * 8));
@@ -673,44 +694,39 @@ static void msm_vfe46_axi_cfg_comp_mask(struct vfe_device *vfe_dev,
stream_composite_mask << (comp_mask_index * 8));
msm_camera_io_w(comp_mask, vfe_dev->vfe_base + 0x74);
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- irq_mask |= 1 << (comp_mask_index + 25);
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x5C);
+ vfe_dev->irq0_mask |= 1 << (comp_mask_index + 25);
+ msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe46_axi_clear_comp_mask(struct vfe_device *vfe_dev,
struct msm_vfe_axi_stream *stream_info)
{
uint32_t comp_mask, comp_mask_index = stream_info->comp_mask_index;
- uint32_t irq_mask;
comp_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x74);
comp_mask &= ~(0x7F << (comp_mask_index * 8));
msm_camera_io_w(comp_mask, vfe_dev->vfe_base + 0x74);
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- irq_mask &= ~(1 << (comp_mask_index + 25));
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x5C);
+ vfe_dev->irq0_mask |= 1 << (comp_mask_index + 25);
+ msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe46_axi_cfg_wm_irq_mask(struct vfe_device *vfe_dev,
struct msm_vfe_axi_stream *stream_info)
{
- uint32_t irq_mask;
-
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- irq_mask |= 1 << (stream_info->wm[0] + 8);
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x5C);
+ vfe_dev->irq0_mask |= 1 << (stream_info->wm[0] + 8);
+ msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe46_axi_clear_wm_irq_mask(struct vfe_device *vfe_dev,
struct msm_vfe_axi_stream *stream_info)
{
- uint32_t irq_mask;
-
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- irq_mask &= ~(1 << (stream_info->wm[0] + 8));
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x5C);
+ vfe_dev->irq0_mask &= ~(1 << (stream_info->wm[0] + 8));
+ msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe46_cfg_framedrop(void __iomem *vfe_base,
@@ -948,10 +964,10 @@ static void msm_vfe46_cfg_fetch_engine(struct vfe_device *vfe_dev,
temp |= (1 << 1);
msm_camera_io_w(temp, vfe_dev->vfe_base + 0x84);
- temp = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- temp &= 0xFEFFFFFF;
- temp |= (1 << 24);
- msm_camera_io_w(temp, vfe_dev->vfe_base + 0x5C);
+ vfe_dev->irq0_mask &= 0xFEFFFFFF;
+ vfe_dev->irq0_mask |= (1 << 24);
+ msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask,
+ vfe_dev->irq1_mask, MSM_ISP_IRQ_SET);
temp = fe_cfg->fetch_height - 1;
msm_camera_io_w(temp & 0x3FFF, vfe_dev->vfe_base + 0x278);
@@ -1211,9 +1227,9 @@ static void msm_vfe46_update_camif_state(struct vfe_device *vfe_dev,
return;
if (update_state == ENABLE_CAMIF) {
- val = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- val |= 0xF5;
- msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x5C);
+ vfe_dev->irq0_mask |= 0xF5;
+ msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask,
+ vfe_dev->irq1_mask, MSM_ISP_IRQ_SET);
bus_en =
((vfe_dev->axi_data.
@@ -1233,17 +1249,24 @@ static void msm_vfe46_update_camif_state(struct vfe_device *vfe_dev,
/* testgen GO*/
if (vfe_dev->axi_data.src_info[VFE_PIX_0].input_mux == TESTGEN)
msm_camera_io_w(1, vfe_dev->vfe_base + 0xAF4);
- } else if (update_state == DISABLE_CAMIF) {
- msm_camera_io_w_mb(0x0, vfe_dev->vfe_base + 0x3A8);
+ } else if (update_state == DISABLE_CAMIF ||
+ DISABLE_CAMIF_IMMEDIATELY == update_state) {
+ msm_vfe46_config_irq(vfe_dev, 0, 0, MSM_ISP_IRQ_SET);
+ /* disable danger signal */
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0xC18);
+ val &= ~(1 << 8);
+ msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0xC18);
+ msm_camera_io_w_mb((update_state == DISABLE_CAMIF ? 0x0 : 0x6),
+ vfe_dev->vfe_base + 0x3A8);
vfe_dev->axi_data.src_info[VFE_PIX_0].active = 0;
/* testgen OFF*/
if (vfe_dev->axi_data.src_info[VFE_PIX_0].input_mux == TESTGEN)
msm_camera_io_w(1 << 1, vfe_dev->vfe_base + 0xAF4);
- } else if (update_state == DISABLE_CAMIF_IMMEDIATELY) {
- msm_camera_io_w_mb(0x6, vfe_dev->vfe_base + 0x3A8);
- vfe_dev->axi_data.src_info[VFE_PIX_0].active = 0;
- if (vfe_dev->axi_data.src_info[VFE_PIX_0].input_mux == TESTGEN)
- msm_camera_io_w(1 << 1, vfe_dev->vfe_base + 0xAF4);
+ msm_camera_io_w(0, vfe_dev->vfe_base + 0x64);
+ msm_camera_io_w((1 << 0), vfe_dev->vfe_base + 0x68);
+ msm_camera_io_w_mb(1, vfe_dev->vfe_base + 0x58);
+ msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask,
+ vfe_dev->irq1_mask, MSM_ISP_IRQ_SET);
}
}
@@ -1499,8 +1522,8 @@ static int msm_vfe46_axi_halt(struct vfe_device *vfe_dev,
enum msm_vfe_input_src i;
/* Keep only halt and restart mask */
- msm_camera_io_w(BIT(31), vfe_dev->vfe_base + 0x5C);
- msm_camera_io_w(BIT(8), vfe_dev->vfe_base + 0x60);
+ msm_vfe46_config_irq(vfe_dev, (1 << 31), (1 << 8),
+ MSM_ISP_IRQ_SET);
/*Clear IRQ Status0, only leave reset irq mask*/
msm_camera_io_w(0x7FFFFFFF, vfe_dev->vfe_base + 0x64);
@@ -1560,7 +1583,8 @@ static int msm_vfe46_axi_halt(struct vfe_device *vfe_dev,
static int msm_vfe46_axi_restart(struct vfe_device *vfe_dev,
uint32_t blocking, uint32_t enable_camif)
{
- vfe_dev->hw_info->vfe_ops.core_ops.restore_irq_mask(vfe_dev);
+ msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
msm_camera_io_w(0x7FFFFFFF, vfe_dev->vfe_base + 0x64);
msm_camera_io_w(0xFFFFFEFF, vfe_dev->vfe_base + 0x68);
msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x58);
@@ -1715,22 +1739,19 @@ static void msm_vfe46_stats_cfg_wm_irq_mask(
struct vfe_device *vfe_dev,
struct msm_vfe_stats_stream *stream_info)
{
- uint32_t irq_mask;
-
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- irq_mask |= 1 << (STATS_IDX(stream_info->stream_handle) + 15);
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x5C);
+ vfe_dev->irq0_mask |= 1 << (STATS_IDX(stream_info->stream_handle) + 15);
+ msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe46_stats_clear_wm_irq_mask(
struct vfe_device *vfe_dev,
struct msm_vfe_stats_stream *stream_info)
{
- uint32_t irq_mask;
-
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- irq_mask &= ~(1 << (STATS_IDX(stream_info->stream_handle) + 15));
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x5C);
+ vfe_dev->irq0_mask &=
+ ~(1 << (STATS_IDX(stream_info->stream_handle) + 15));
+ msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe46_stats_cfg_wm_reg(
@@ -2023,19 +2044,10 @@ static void msm_vfe46_get_rdi_wm_mask(struct vfe_device *vfe_dev,
static void msm_vfe46_get_irq_mask(struct vfe_device *vfe_dev,
uint32_t *irq0_mask, uint32_t *irq1_mask)
{
- *irq0_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- *irq1_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x60);
+ *irq0_mask = vfe_dev->irq0_mask;
+ *irq1_mask = vfe_dev->irq1_mask;
}
-static void msm_vfe46_restore_irq_mask(struct vfe_device *vfe_dev)
-{
- msm_camera_io_w(vfe_dev->error_info.overflow_recover_irq_mask0,
- vfe_dev->vfe_base + 0x5C);
- msm_camera_io_w(vfe_dev->error_info.overflow_recover_irq_mask1,
- vfe_dev->vfe_base + 0x60);
-}
-
-
static void msm_vfe46_get_halt_restart_mask(uint32_t *irq0_mask,
uint32_t *irq1_mask)
{
@@ -2081,7 +2093,6 @@ struct msm_vfe_hardware_info vfe46_hw_info = {
.process_axi_irq = msm_isp_process_axi_irq,
.process_stats_irq = msm_isp_process_stats_irq,
.process_epoch_irq = msm_vfe46_process_epoch_irq,
- .enable_camif_err = msm_vfe46_enable_camif_error,
},
.axi_ops = {
.reload_wm = msm_vfe46_axi_reload_wm,
@@ -2126,7 +2137,6 @@ struct msm_vfe_hardware_info vfe46_hw_info = {
.get_overflow_mask = msm_vfe46_get_overflow_mask,
.get_rdi_wm_mask = msm_vfe46_get_rdi_wm_mask,
.get_irq_mask = msm_vfe46_get_irq_mask,
- .restore_irq_mask = msm_vfe46_restore_irq_mask,
.get_halt_restart_mask =
msm_vfe46_get_halt_restart_mask,
.process_error_status = msm_vfe46_process_error_status,
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c
index c7ca98798e30..054d736a2dc3 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c
@@ -102,7 +102,39 @@ static uint8_t stats_irq_map_comp_mask[] = {
(~(ping_pong >> (stats_pingpong_offset_map[idx])) & 0x1) * 2)
#define VFE47_SRC_CLK_DTSI_IDX 5
+
static struct msm_cam_clk_info msm_vfe47_clk_info[VFE_CLK_INFO_MAX];
+
+static void msm_vfe47_config_irq(struct vfe_device *vfe_dev,
+ uint32_t irq0_mask, uint32_t irq1_mask,
+ enum msm_isp_irq_operation oper)
+{
+ uint32_t val;
+
+ switch (oper) {
+ case MSM_ISP_IRQ_ENABLE:
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
+ val |= irq0_mask;
+ msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x5C);
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0x60);
+ val |= irq1_mask;
+ msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x60);
+ break;
+ case MSM_ISP_IRQ_DISABLE:
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
+ val &= ~irq0_mask;
+ msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x5C);
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0x60);
+ val &= ~irq1_mask;
+ msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x60);
+ break;
+ case MSM_ISP_IRQ_SET:
+ msm_camera_io_w_mb(irq0_mask, vfe_dev->vfe_base + 0x5C);
+ msm_camera_io_w_mb(irq1_mask, vfe_dev->vfe_base + 0x60);
+ break;
+ }
+}
+
static int32_t msm_vfe47_init_dt_parms(struct vfe_device *vfe_dev,
struct msm_vfe_hw_init_parms *dt_parms, void __iomem *dev_mem_base)
{
@@ -334,8 +366,10 @@ static void msm_vfe47_release_hardware(struct vfe_device *vfe_dev)
enum cam_ahb_clk_client id;
/* when closing node, disable all irq */
- msm_camera_io_w_mb(0x0, vfe_dev->vfe_base + 0x5C);
- msm_camera_io_w_mb(0x0, vfe_dev->vfe_base + 0x60);
+ vfe_dev->irq0_mask = 0;
+ vfe_dev->irq1_mask = 0;
+ msm_vfe47_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
disable_irq(vfe_dev->vfe_irq->start);
free_irq(vfe_dev->vfe_irq->start, vfe_dev);
@@ -403,16 +437,20 @@ static void msm_vfe47_init_hardware_reg(struct vfe_device *vfe_dev)
/* BUS_CFG */
msm_camera_io_w(0x00000101, vfe_dev->vfe_base + 0x84);
/* IRQ_MASK/CLEAR */
- msm_camera_io_w(0xE00000F3, vfe_dev->vfe_base + 0x5C);
- msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x60);
+ vfe_dev->irq0_mask = 0xE00000F3;
+ vfe_dev->irq1_mask = 0xFFFFFFFF;
+ msm_vfe47_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x64);
msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x68);
}
static void msm_vfe47_clear_status_reg(struct vfe_device *vfe_dev)
{
- msm_camera_io_w(0x80000000, vfe_dev->vfe_base + 0x5C);
- msm_camera_io_w_mb(0x0, vfe_dev->vfe_base + 0x60);
+ vfe_dev->irq0_mask = 0x80000000;
+ vfe_dev->irq1_mask = 0x0;
+ msm_vfe47_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x64);
msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x68);
msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x58);
@@ -541,39 +579,24 @@ static void msm_vfe47_process_error_status(struct vfe_device *vfe_dev)
pr_err("%s: status dsp error\n", __func__);
}
-static void msm_vfe47_enable_camif_error(struct vfe_device *vfe_dev,
- int enable)
-{
- uint32_t val;
-
- val = msm_camera_io_r(vfe_dev->vfe_base + 0x60);
- if (enable)
- msm_camera_io_w_mb(val | BIT(0), vfe_dev->vfe_base + 0x60);
- else
- msm_camera_io_w_mb(val & ~(BIT(0)), vfe_dev->vfe_base + 0x60);
-}
-
static void msm_vfe47_read_irq_status(struct vfe_device *vfe_dev,
uint32_t *irq_status0, uint32_t *irq_status1)
{
- uint32_t irq_mask0, irq_mask1;
-
*irq_status0 = msm_camera_io_r(vfe_dev->vfe_base + 0x6C);
*irq_status1 = msm_camera_io_r(vfe_dev->vfe_base + 0x70);
/* Mask off bits that are not enabled */
msm_camera_io_w(*irq_status0, vfe_dev->vfe_base + 0x64);
msm_camera_io_w(*irq_status1, vfe_dev->vfe_base + 0x68);
msm_camera_io_w_mb(1, vfe_dev->vfe_base + 0x58);
- irq_mask0 = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- irq_mask1 = msm_camera_io_r(vfe_dev->vfe_base + 0x60);
- *irq_status0 &= irq_mask0;
- *irq_status1 &= irq_mask1;
+ *irq_status0 &= vfe_dev->irq0_mask;
+ *irq_status1 &= vfe_dev->irq1_mask;
if (*irq_status1 & (1 << 0)) {
vfe_dev->error_info.camif_status =
msm_camera_io_r(vfe_dev->vfe_base + 0x4A4);
/* mask off camif error after first occurrance */
- msm_vfe47_enable_camif_error(vfe_dev, 0);
+ vfe_dev->irq1_mask &= ~(1 << 0);
+ msm_vfe47_config_irq(vfe_dev, 0, (1 << 0), MSM_ISP_IRQ_DISABLE);
}
if (*irq_status1 & (1 << 7))
@@ -798,7 +821,6 @@ static void msm_vfe47_axi_cfg_comp_mask(struct vfe_device *vfe_dev,
struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data;
uint32_t comp_mask, comp_mask_index =
stream_info->comp_mask_index;
- uint32_t irq_mask;
comp_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x74);
comp_mask &= ~(0x7F << (comp_mask_index * 8));
@@ -806,44 +828,39 @@ static void msm_vfe47_axi_cfg_comp_mask(struct vfe_device *vfe_dev,
stream_composite_mask << (comp_mask_index * 8));
msm_camera_io_w(comp_mask, vfe_dev->vfe_base + 0x74);
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- irq_mask |= 1 << (comp_mask_index + 25);
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x5C);
+ vfe_dev->irq0_mask |= 1 << (comp_mask_index + 25);
+ msm_vfe47_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe47_axi_clear_comp_mask(struct vfe_device *vfe_dev,
struct msm_vfe_axi_stream *stream_info)
{
uint32_t comp_mask, comp_mask_index = stream_info->comp_mask_index;
- uint32_t irq_mask;
comp_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x74);
comp_mask &= ~(0x7F << (comp_mask_index * 8));
msm_camera_io_w(comp_mask, vfe_dev->vfe_base + 0x74);
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- irq_mask &= ~(1 << (comp_mask_index + 25));
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x5C);
+ vfe_dev->irq0_mask &= ~(1 << (comp_mask_index + 25));
+ msm_vfe47_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe47_axi_cfg_wm_irq_mask(struct vfe_device *vfe_dev,
struct msm_vfe_axi_stream *stream_info)
{
- uint32_t irq_mask;
-
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- irq_mask |= 1 << (stream_info->wm[0] + 8);
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x5C);
+ vfe_dev->irq0_mask |= 1 << (stream_info->wm[0] + 8);
+ msm_vfe47_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe47_axi_clear_wm_irq_mask(struct vfe_device *vfe_dev,
struct msm_vfe_axi_stream *stream_info)
{
- uint32_t irq_mask;
-
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- irq_mask &= ~(1 << (stream_info->wm[0] + 8));
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x5C);
+ vfe_dev->irq0_mask &= ~(1 << (stream_info->wm[0] + 8));
+ msm_vfe47_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
}
static void msm_vfe47_cfg_framedrop(void __iomem *vfe_base,
@@ -1090,10 +1107,10 @@ static void msm_vfe47_cfg_fetch_engine(struct vfe_device *vfe_dev,
temp |= (1 << 1);
msm_camera_io_w(temp, vfe_dev->vfe_base + 0x84);
- temp = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- temp &= 0xFEFFFFFF;
- temp |= (1 << 24);
- msm_camera_io_w(temp, vfe_dev->vfe_base + 0x5C);
+ vfe_dev->irq0_mask &= 0xFEFFFFFF;
+ vfe_dev->irq0_mask |= (1 << 24);
+ msm_vfe47_config_irq(vfe_dev, vfe_dev->irq0_mask,
+ vfe_dev->irq1_mask, MSM_ISP_IRQ_SET);
temp = fe_cfg->fetch_height - 1;
msm_camera_io_w(temp & 0x3FFF, vfe_dev->vfe_base + 0x308);
@@ -1377,9 +1394,9 @@ static void msm_vfe47_update_camif_state(struct vfe_device *vfe_dev,
val = msm_camera_io_r(vfe_dev->vfe_base + 0x47C);
if (update_state == ENABLE_CAMIF) {
- val = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- val |= 0xF5;
- msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x5C);
+ vfe_dev->irq0_mask |= 0xF5;
+ msm_vfe47_config_irq(vfe_dev, vfe_dev->irq0_mask,
+ vfe_dev->irq1_mask, MSM_ISP_IRQ_SET);
if ((vfe_dev->hvx_cmd > HVX_DISABLE) &&
(vfe_dev->hvx_cmd <= HVX_ROUND_TRIP))
@@ -1403,8 +1420,15 @@ static void msm_vfe47_update_camif_state(struct vfe_device *vfe_dev,
/* testgen GO*/
if (vfe_dev->axi_data.src_info[VFE_PIX_0].input_mux == TESTGEN)
msm_camera_io_w(1, vfe_dev->vfe_base + 0xC58);
- } else if (update_state == DISABLE_CAMIF) {
- msm_camera_io_w_mb(0x0, vfe_dev->vfe_base + 0x478);
+ } else if (update_state == DISABLE_CAMIF ||
+ update_state == DISABLE_CAMIF_IMMEDIATELY) {
+ /* turn off all irq before camif disable */
+ msm_vfe47_config_irq(vfe_dev, 0, 0, MSM_ISP_IRQ_SET);
+ val = msm_camera_io_r(vfe_dev->vfe_base + 0x464);
+ /* disable danger signal */
+ msm_camera_io_w_mb(val & ~(1 << 8), vfe_dev->vfe_base + 0x464);
+ msm_camera_io_w_mb((update_state == DISABLE_CAMIF ? 0x0 : 0x6),
+ vfe_dev->vfe_base + 0x478);
vfe_dev->axi_data.src_info[VFE_PIX_0].active = 0;
/* testgen OFF*/
if (vfe_dev->axi_data.src_info[VFE_PIX_0].input_mux == TESTGEN)
@@ -1413,16 +1437,15 @@ static void msm_vfe47_update_camif_state(struct vfe_device *vfe_dev,
if ((vfe_dev->hvx_cmd > HVX_DISABLE) &&
(vfe_dev->hvx_cmd <= HVX_ROUND_TRIP))
msm_vfe47_configure_hvx(vfe_dev, 0);
-
- } else if (update_state == DISABLE_CAMIF_IMMEDIATELY) {
- msm_camera_io_w_mb(0x6, vfe_dev->vfe_base + 0x478);
- vfe_dev->axi_data.src_info[VFE_PIX_0].active = 0;
- if (vfe_dev->axi_data.src_info[VFE_PIX_0].input_mux == TESTGEN)
- msm_camera_io_w(1 << 1, vfe_dev->vfe_base + 0xC58);
-
- if ((vfe_dev->hvx_cmd > HVX_DISABLE) &&
- (vfe_dev->hvx_cmd <= HVX_ROUND_TRIP))
- msm_vfe47_configure_hvx(vfe_dev, 0);
+ /*
+ * restore the irq that were disabled for camif stop and clear
+ * the camif error interrupts if generated during that period
+ */
+ msm_camera_io_w(0, vfe_dev->vfe_base + 0x64);
+ msm_camera_io_w(1 << 0, vfe_dev->vfe_base + 0x68);
+ msm_camera_io_w_mb(1, vfe_dev->vfe_base + 0x58);
+ msm_vfe47_config_irq(vfe_dev, vfe_dev->irq0_mask,
+ vfe_dev->irq1_mask, MSM_ISP_IRQ_SET);
}
}
@@ -1692,8 +1715,8 @@ static int msm_vfe47_axi_halt(struct vfe_device *vfe_dev,
msm_camera_io_w(val, vfe_dev->vfe_vbif_base + VFE47_VBIF_CLK_OFFSET);
/* Keep only halt and reset mask */
- msm_camera_io_w(BIT(31), vfe_dev->vfe_base + 0x5C);
- msm_camera_io_w(BIT(8), vfe_dev->vfe_base + 0x60);
+ msm_vfe47_config_irq(vfe_dev, (1 << 31), (1 << 8),
+ MSM_ISP_IRQ_SET);
/*Clear IRQ Status0, only leave reset irq mask*/
msm_camera_io_w(0x7FFFFFFF, vfe_dev->vfe_base + 0x64);
@@ -1755,7 +1778,8 @@ static int msm_vfe47_axi_halt(struct vfe_device *vfe_dev,
static int msm_vfe47_axi_restart(struct vfe_device *vfe_dev,
uint32_t blocking, uint32_t enable_camif)
{
- vfe_dev->hw_info->vfe_ops.core_ops.restore_irq_mask(vfe_dev);
+ msm_vfe47_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
+ MSM_ISP_IRQ_SET);
msm_camera_io_w(0x7FFFFFFF, vfe_dev->vfe_base + 0x64);
msm_camera_io_w(0xFFFFFEFF, vfe_dev->vfe_base + 0x68);
msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x58);
@@ -1889,8 +1913,8 @@ static void msm_vfe47_stats_cfg_wm_irq_mask(
uint32_t irq_mask;
uint32_t irq_mask_1;
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- irq_mask_1 = msm_camera_io_r(vfe_dev->vfe_base + 0x60);
+ irq_mask = vfe_dev->irq0_mask;
+ irq_mask_1 = vfe_dev->irq1_mask;
switch (STATS_IDX(stream_info->stream_handle)) {
case STATS_COMP_IDX_AEC_BG:
@@ -1926,8 +1950,9 @@ static void msm_vfe47_stats_cfg_wm_irq_mask(
STATS_IDX(stream_info->stream_handle));
}
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x5C);
- msm_camera_io_w(irq_mask_1, vfe_dev->vfe_base + 0x60);
+ msm_vfe47_config_irq(vfe_dev, irq_mask, irq_mask_1, MSM_ISP_IRQ_SET);
+ vfe_dev->irq0_mask = irq_mask;
+ vfe_dev->irq1_mask = irq_mask_1;
}
static void msm_vfe47_stats_clear_wm_irq_mask(
@@ -1936,8 +1961,8 @@ static void msm_vfe47_stats_clear_wm_irq_mask(
{
uint32_t irq_mask, irq_mask_1;
- irq_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- irq_mask_1 = msm_camera_io_r(vfe_dev->vfe_base + 0x60);
+ irq_mask = vfe_dev->irq0_mask;
+ irq_mask_1 = vfe_dev->irq1_mask;
switch (STATS_IDX(stream_info->stream_handle)) {
case STATS_COMP_IDX_AEC_BG:
@@ -1973,8 +1998,9 @@ static void msm_vfe47_stats_clear_wm_irq_mask(
STATS_IDX(stream_info->stream_handle));
}
- msm_camera_io_w(irq_mask, vfe_dev->vfe_base + 0x5C);
- msm_camera_io_w(irq_mask_1, vfe_dev->vfe_base + 0x60);
+ msm_vfe47_config_irq(vfe_dev, irq_mask, irq_mask_1, MSM_ISP_IRQ_SET);
+ vfe_dev->irq0_mask = irq_mask;
+ vfe_dev->irq1_mask = irq_mask_1;
}
static void msm_vfe47_stats_cfg_wm_reg(
@@ -2262,19 +2288,10 @@ static void msm_vfe47_get_rdi_wm_mask(struct vfe_device *vfe_dev,
static void msm_vfe47_get_irq_mask(struct vfe_device *vfe_dev,
uint32_t *irq0_mask, uint32_t *irq1_mask)
{
- *irq0_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
- *irq1_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x60);
+ *irq0_mask = vfe_dev->irq0_mask;
+ *irq1_mask = vfe_dev->irq1_mask;
}
-static void msm_vfe47_restore_irq_mask(struct vfe_device *vfe_dev)
-{
- msm_camera_io_w(vfe_dev->error_info.overflow_recover_irq_mask0,
- vfe_dev->vfe_base + 0x5C);
- msm_camera_io_w(vfe_dev->error_info.overflow_recover_irq_mask1,
- vfe_dev->vfe_base + 0x60);
-}
-
-
static void msm_vfe47_get_halt_restart_mask(uint32_t *irq0_mask,
uint32_t *irq1_mask)
{
@@ -2321,7 +2338,6 @@ struct msm_vfe_hardware_info vfe47_hw_info = {
.process_axi_irq = msm_isp_process_axi_irq,
.process_stats_irq = msm_isp_process_stats_irq,
.process_epoch_irq = msm_vfe47_process_epoch_irq,
- .enable_camif_err = msm_vfe47_enable_camif_error,
},
.axi_ops = {
.reload_wm = msm_vfe47_axi_reload_wm,
@@ -2366,7 +2382,6 @@ struct msm_vfe_hardware_info vfe47_hw_info = {
.get_overflow_mask = msm_vfe47_get_overflow_mask,
.get_rdi_wm_mask = msm_vfe47_get_rdi_wm_mask,
.get_irq_mask = msm_vfe47_get_irq_mask,
- .restore_irq_mask = msm_vfe47_restore_irq_mask,
.get_halt_restart_mask =
msm_vfe47_get_halt_restart_mask,
.process_error_status = msm_vfe47_process_error_status,
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 5dbe87f5ba8a..9db6d154f26f 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
@@ -16,7 +16,7 @@
#include "msm_isp_axi_util.h"
#define HANDLE_TO_IDX(handle) (handle & 0xFF)
-#define ISP_SOF_DEBUG_COUNT 5
+#define ISP_SOF_DEBUG_COUNT 0
static int msm_isp_update_dual_HW_ms_info_at_start(
struct vfe_device *vfe_dev,
@@ -2105,26 +2105,18 @@ int msm_isp_axi_halt(struct vfe_device *vfe_dev,
}
if (halt_cmd->overflow_detected) {
- /*Store current IRQ mask*/
- if (vfe_dev->error_info.overflow_recover_irq_mask0 == 0) {
- vfe_dev->hw_info->vfe_ops.core_ops.get_irq_mask(vfe_dev,
- &vfe_dev->error_info.overflow_recover_irq_mask0,
- &vfe_dev->error_info.overflow_recover_irq_mask1);
- }
-
atomic_cmpxchg(&vfe_dev->error_info.overflow_state,
NO_OVERFLOW, OVERFLOW_DETECTED);
pr_err("%s: VFE%d Bus overflow detected: start recovery!\n",
__func__, vfe_dev->pdev->id);
}
- rc = vfe_dev->hw_info->vfe_ops.axi_ops.halt(vfe_dev,
- halt_cmd->blocking_halt);
-
if (halt_cmd->stop_camif) {
vfe_dev->hw_info->vfe_ops.core_ops.
update_camif_state(vfe_dev, DISABLE_CAMIF_IMMEDIATELY);
}
+ rc = vfe_dev->hw_info->vfe_ops.axi_ops.halt(vfe_dev,
+ halt_cmd->blocking_halt);
return rc;
}
@@ -2552,7 +2544,6 @@ static int msm_isp_start_axi_stream(struct vfe_device *vfe_dev,
vfe_dev->hw_info->vfe_ops.core_ops.
update_camif_state(vfe_dev, camif_update);
vfe_dev->axi_data.camif_state = CAMIF_ENABLE;
- vfe_dev->hw_info->vfe_ops.irq_ops.enable_camif_err(vfe_dev, 1);
}
if (wait_for_complete) {
@@ -2714,24 +2705,17 @@ static int msm_isp_stop_axi_stream(struct vfe_device *vfe_dev,
vfe_dev->axi_data.camif_state = CAMIF_DISABLE;
} else if ((camif_update == DISABLE_CAMIF_IMMEDIATELY) ||
(ext_read)) {
- vfe_dev->hw_info->vfe_ops.irq_ops.enable_camif_err(vfe_dev, 0);
-
- vfe_dev->ignore_error = 1;
if (!ext_read)
vfe_dev->hw_info->vfe_ops.core_ops.
update_camif_state(vfe_dev,
DISABLE_CAMIF_IMMEDIATELY);
vfe_dev->axi_data.camif_state = CAMIF_STOPPED;
- vfe_dev->hw_info->vfe_ops.irq_ops.enable_camif_err(vfe_dev, 1);
- vfe_dev->ignore_error = 0;
}
if (halt) {
/*during stop immediately, stop output then stop input*/
- vfe_dev->ignore_error = 1;
vfe_dev->hw_info->vfe_ops.axi_ops.halt(vfe_dev, 1);
vfe_dev->hw_info->vfe_ops.core_ops.reset_hw(vfe_dev, 0, 1);
vfe_dev->hw_info->vfe_ops.core_ops.init_hw_reg(vfe_dev);
- vfe_dev->ignore_error = 0;
}
msm_isp_update_camif_output_count(vfe_dev, stream_cfg_cmd);
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c
index e6f049261166..1cd1f4875f88 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c
@@ -1990,8 +1990,7 @@ irqreturn_t msm_isp_process_irq(int irq_num, void *data)
error_mask1 &= irq_status1;
irq_status0 &= ~error_mask0;
irq_status1 &= ~error_mask1;
- if (!vfe_dev->ignore_error &&
- ((error_mask0 != 0) || (error_mask1 != 0)))
+ if ((error_mask0 != 0) || (error_mask1 != 0))
msm_isp_update_error_info(vfe_dev, error_mask0, error_mask1);
if ((irq_status0 == 0) && (irq_status1 == 0) &&