static int msm_ispif_start_frame_boundary(struct ispif_device *ispif, struct msm_ispif_param_data *params) { int rc = 0; if (ispif->ispif_state != ISPIF_POWER_UP) { pr_err("%s: ispif invalid state %d\n", __func__, ispif->ispif_state); rc = -EPERM; return rc; } msm_ispif_intf_cmd(ispif, ISPIF_INTF_CMD_ENABLE_FRAME_BOUNDARY, params); return rc; }
static int msm_ispif_start_frame_boundary(struct ispif_device *ispif, struct msm_ispif_param_data *params) { int rc = 0; printk("%s: overflow_dbg \n", __func__); if (ispif->ispif_state != ISPIF_POWER_UP) { rc = -EPERM; pr_err("%s:error! ispif invalid state %d rc = %d\n", __func__, ispif->ispif_state, rc ); return rc; } msm_ispif_intf_cmd(ispif, ISPIF_INTF_CMD_ENABLE_FRAME_BOUNDARY, params); return rc; }
static int msm_ispif_stop_frame_boundary(struct ispif_device *ispif, struct msm_ispif_param_data *params) { int i, rc = 0; uint16_t cid_mask = 0; uint32_t intf_addr; enum msm_ispif_vfe_intf vfe_intf; uint32_t stop_flag = 0; BUG_ON(!ispif); BUG_ON(!params); if (ispif->ispif_state != ISPIF_POWER_UP) { pr_err("%s: ispif invalid state %d\n", __func__, ispif->ispif_state); rc = -EPERM; return rc; } if (params->num > MAX_PARAM_ENTRIES) { pr_err("%s: invalid param entries %d\n", __func__, params->num); rc = -EINVAL; return rc; } for (i = 0; i < params->num; i++) { if (!msm_ispif_is_intf_valid(ispif->csid_version, params->entries[i].vfe_intf)) { pr_err("%s: invalid interface type\n", __func__); rc = -EINVAL; goto end; } } msm_ispif_intf_cmd(ispif, ISPIF_INTF_CMD_DISABLE_FRAME_BOUNDARY, params); for (i = 0; i < params->num; i++) { cid_mask = msm_ispif_get_cids_mask_from_cfg(¶ms->entries[i]); vfe_intf = params->entries[i].vfe_intf; switch (params->entries[i].intftype) { case PIX0: intf_addr = ISPIF_VFE_m_PIX_INTF_n_STATUS(vfe_intf, 0); break; case RDI0: intf_addr = ISPIF_VFE_m_RDI_INTF_n_STATUS(vfe_intf, 0); break; case PIX1: intf_addr = ISPIF_VFE_m_PIX_INTF_n_STATUS(vfe_intf, 1); break; case RDI1: intf_addr = ISPIF_VFE_m_RDI_INTF_n_STATUS(vfe_intf, 1); break; case RDI2: intf_addr = ISPIF_VFE_m_RDI_INTF_n_STATUS(vfe_intf, 2); break; default: pr_err("%s: invalid intftype=%d\n", __func__, params->entries[i].intftype); rc = -EPERM; goto end; } rc = readl_poll_timeout(ispif->base + intf_addr, stop_flag, (stop_flag & 0xF) == 0xF, ISPIF_TIMEOUT_SLEEP_US, ISPIF_TIMEOUT_ALL_US); if (rc < 0) goto end; /* disable CIDs in CID_MASK register */ msm_ispif_enable_intf_cids(ispif, params->entries[i].intftype, cid_mask, vfe_intf, 0); } end: return rc; }
static int msm_ispif_restart_frame_boundary(struct ispif_device *ispif, struct msm_ispif_param_data *params) { int rc = 0, i; long timeout = 0; uint16_t cid_mask; enum msm_ispif_intftype intftype; enum msm_ispif_vfe_intf vfe_intf; uint32_t vfe_mask = 0; uint32_t intf_addr; struct clk *reset_clk[ARRAY_SIZE(ispif_8974_reset_clk_info)]; if (ispif->ispif_state != ISPIF_POWER_UP) { pr_err("%s: ispif invalid state %d\n", __func__, ispif->ispif_state); rc = -EPERM; return rc; } if (params->num > MAX_PARAM_ENTRIES) { pr_err("%s: invalid param entries %d\n", __func__, params->num); rc = -EINVAL; return rc; } for (i = 0; i < params->num; i++) { vfe_intf = params->entries[i].vfe_intf; if (vfe_intf >= VFE_MAX) { pr_err("%s: %d invalid i %d vfe_intf %d\n", __func__, __LINE__, i, vfe_intf); return -EINVAL; } vfe_mask |= (1 << vfe_intf); } rc = msm_cam_clk_enable(&ispif->pdev->dev, ispif_8974_reset_clk_info, reset_clk, ARRAY_SIZE(ispif_8974_reset_clk_info), 1); if (rc < 0) { pr_err("%s: cannot enable clock, error = %d", __func__, rc); goto end; } if (vfe_mask & (1 << VFE0)) { init_completion(&ispif->reset_complete[VFE0]); pr_err("%s Init completion VFE0\n", __func__); /* initiate reset of ISPIF */ msm_camera_io_w(0x00001FF9, ispif->base + ISPIF_RST_CMD_ADDR); } if (ispif->hw_num_isps > 1 && (vfe_mask & (1 << VFE1))) { init_completion(&ispif->reset_complete[VFE1]); pr_err("%s Init completion VFE1\n", __func__); msm_camera_io_w(0x00001FF9, ispif->base + ISPIF_RST_CMD_1_ADDR); } if (vfe_mask & (1 << VFE0)) { timeout = wait_for_completion_interruptible_timeout( &ispif->reset_complete[VFE0], msecs_to_jiffies(500)); if (timeout <= 0) { pr_err("%s: VFE0 reset wait timeout\n", __func__); rc = -ETIMEDOUT; goto disable_clk; } } if (ispif->hw_num_isps > 1 && (vfe_mask & (1 << VFE1))) { timeout = wait_for_completion_interruptible_timeout( &ispif->reset_complete[VFE1], msecs_to_jiffies(500)); if (timeout <= 0) { pr_err("%s: VFE1 reset wait timeout\n", __func__); rc = -ETIMEDOUT; goto disable_clk; } } pr_info("%s: ISPIF reset hw done", __func__); rc = msm_cam_clk_enable(&ispif->pdev->dev, ispif_8974_reset_clk_info, reset_clk, ARRAY_SIZE(ispif_8974_reset_clk_info), 0); if (rc < 0) { pr_err("%s: cannot enable clock, error = %d", __func__, rc); goto end; } for (i = 0; i < params->num; i++) { intftype = params->entries[i].intftype; vfe_intf = params->entries[i].vfe_intf; switch (params->entries[0].intftype) { case PIX0: intf_addr = ISPIF_VFE_m_PIX_INTF_n_STATUS(vfe_intf, 0); break; case RDI0: intf_addr = ISPIF_VFE_m_RDI_INTF_n_STATUS(vfe_intf, 0); break; case PIX1: intf_addr = ISPIF_VFE_m_PIX_INTF_n_STATUS(vfe_intf, 1); break; case RDI1: intf_addr = ISPIF_VFE_m_RDI_INTF_n_STATUS(vfe_intf, 1); break; case RDI2: intf_addr = ISPIF_VFE_m_RDI_INTF_n_STATUS(vfe_intf, 2); break; default: pr_err("%s: invalid intftype=%d\n", __func__, params->entries[i].intftype); rc = -EPERM; goto end; } msm_ispif_intf_cmd(ispif, ISPIF_INTF_CMD_ENABLE_FRAME_BOUNDARY, params); } for (i = 0; i < params->num; i++) { intftype = params->entries[i].intftype; vfe_intf = params->entries[i].vfe_intf; cid_mask = msm_ispif_get_cids_mask_from_cfg( ¶ms->entries[i]); msm_ispif_enable_intf_cids(ispif, intftype, cid_mask, vfe_intf, 1); } end: return rc; disable_clk: rc = msm_cam_clk_enable(&ispif->pdev->dev, ispif_8974_reset_clk_info, reset_clk, ARRAY_SIZE(ispif_8974_reset_clk_info), 0); if (rc < 0) pr_err("%s: cannot enable clock, error = %d", __func__, rc); return -ETIMEDOUT; }
static int msm_ispif_stop_frame_boundary(struct ispif_device *ispif, struct msm_ispif_param_data *params) { int i, rc = 0; uint16_t cid_mask = 0; uint32_t intf_addr; enum msm_ispif_vfe_intf vfe_intf; BUG_ON(!ispif); BUG_ON(!params); if (ispif->ispif_state != ISPIF_POWER_UP) { pr_err("%s: ispif invalid state %d\n", __func__, ispif->ispif_state); rc = -EPERM; return rc; } for (i = 0; i < params->num; i++) { if (!msm_ispif_is_intf_valid(ispif->csid_version, params->entries[i].vfe_intf)) { pr_err("%s: invalid interface type\n", __func__); rc = -EINVAL; goto end; } } msm_ispif_intf_cmd(ispif, ISPIF_INTF_CMD_DISABLE_FRAME_BOUNDARY, params); for (i = 0; i < params->num; i++) { cid_mask = msm_ispif_get_cids_mask_from_cfg(¶ms->entries[i]); vfe_intf = params->entries[i].vfe_intf; switch (params->entries[i].intftype) { case PIX0: intf_addr = ISPIF_VFE_m_PIX_INTF_n_STATUS(vfe_intf, 0); break; case RDI0: intf_addr = ISPIF_VFE_m_RDI_INTF_n_STATUS(vfe_intf, 0); break; case PIX1: intf_addr = ISPIF_VFE_m_PIX_INTF_n_STATUS(vfe_intf, 1); break; case RDI1: intf_addr = ISPIF_VFE_m_RDI_INTF_n_STATUS(vfe_intf, 1); break; case RDI2: intf_addr = ISPIF_VFE_m_RDI_INTF_n_STATUS(vfe_intf, 2); break; default: pr_err("%s: invalid intftype=%d\n", __func__, params->entries[i].intftype); rc = -EPERM; goto end; } /* todo_bug_fix? very bad. use readl_poll_timeout */ while ((msm_camera_io_r(ispif->base + intf_addr) & 0xF) != 0xF) CDBG("%s: Wait for %d Idle\n", __func__, params->entries[i].intftype); /* disable CIDs in CID_MASK register */ msm_ispif_enable_intf_cids(ispif, params->entries[i].intftype, cid_mask, vfe_intf, 0); } end: return rc; }
static int msm_ispif_restart_frame_boundary(struct ispif_device *ispif, struct msm_ispif_param_data *params) { int rc = 0, i; long timeout = 0; uint16_t cid_mask; enum msm_ispif_intftype intftype; enum msm_ispif_vfe_intf vfe_intf; uint32_t vfe_mask =0; uint32_t intf_addr; struct clk *reset_clk[ARRAY_SIZE(ispif_8974_reset_clk_info)]; // uint32_t stop_flag = 1; printk("%s: overflow_dbg \n", __func__); if (ispif->ispif_state != ISPIF_POWER_UP) { pr_err("%s: ispif invalid state %d\n", __func__, ispif->ispif_state); rc = -EPERM; return rc; } for (i = 0; i < params->num; i++) { vfe_intf = params->entries[i].vfe_intf; vfe_mask |= (1 << vfe_intf); } #if 1 rc = msm_cam_clk_enable(&ispif->pdev->dev, ispif_8974_reset_clk_info, reset_clk, ARRAY_SIZE(ispif_8974_reset_clk_info), 1); if (rc < 0) { pr_err("%s: cannot enable clock, error = %d", __func__, rc); goto end; } if (vfe_mask & (1 << VFE0)) { init_completion(&ispif->reset_complete[VFE0]); pr_err("%s Init completion VFE0\n", __func__); /* initiate reset of ISPIF */ msm_camera_io_w(0x00001FF9, ispif->base + ISPIF_RST_CMD_ADDR); } if (ispif->hw_num_isps > 1 && (vfe_mask & (1 << VFE1))) { init_completion(&ispif->reset_complete[VFE1]); pr_err("%s Init completion VFE1\n", __func__); msm_camera_io_w(0x00001FF9, ispif->base + ISPIF_RST_CMD_1_ADDR); } /* msm_camera_io_w(0x00000000, ispif->base + ISPIF_RST_CMD_ADDR); if (ispif->hw_num_isps > 1) msm_camera_io_w(0x00000000, ispif->base + ISPIF_RST_CMD_1_ADDR); */ if (vfe_mask & (1 << VFE0)) { timeout = wait_for_completion_interruptible_timeout( &ispif->reset_complete[VFE0], msecs_to_jiffies(500)); pr_err("%s: overflow_dbg VFE0 done\n", __func__); if (timeout <= 0) { pr_err("%s: VFE0 reset wait timeout\n", __func__); rc = -ETIMEDOUT; goto disable_clk; } } if (ispif->hw_num_isps > 1 && (vfe_mask & (1 << VFE1))) { timeout = wait_for_completion_interruptible_timeout( &ispif->reset_complete[VFE1], msecs_to_jiffies(500)); pr_err("%s: overflow_dbg VFE1 done\n", __func__); if (timeout <= 0) { pr_err("%s: VFE1 reset wait timeout\n", __func__); rc = -ETIMEDOUT; goto disable_clk; } } pr_info("%s: ISPIF reset hw done", __func__); #endif pr_err("%s: <overflow_dbg> ISPIF disable clk fter reset hw is done", __func__); rc = msm_cam_clk_enable(&ispif->pdev->dev, ispif_8974_reset_clk_info, reset_clk, ARRAY_SIZE(ispif_8974_reset_clk_info), 0); if (rc < 0) { pr_err("%s: cannot enable clock, error = %d", __func__, rc); goto end; } for (i = 0; i < params->num; i++) { intftype = params->entries[i].intftype; vfe_intf = params->entries[i].vfe_intf; switch (params->entries[0].intftype) { case PIX0: intf_addr = ISPIF_VFE_m_PIX_INTF_n_STATUS(vfe_intf, 0); break; case RDI0: intf_addr = ISPIF_VFE_m_RDI_INTF_n_STATUS(vfe_intf, 0); break; case PIX1: intf_addr = ISPIF_VFE_m_PIX_INTF_n_STATUS(vfe_intf, 1); break; case RDI1: intf_addr = ISPIF_VFE_m_RDI_INTF_n_STATUS(vfe_intf, 1); break; case RDI2: intf_addr = ISPIF_VFE_m_RDI_INTF_n_STATUS(vfe_intf, 2); break; default: pr_err("%s: invalid intftype=%d\n", __func__, params->entries[i].intftype); rc = -EPERM; goto end; } /* rc = readl_poll_timeout(ispif->base + intf_addr, stop_flag, (stop_flag & 0xF) == stop_flag, ISPIF_TIMEOUT_SLEEP_US, ISPIF_TIMEOUT_ALL_US); if (rc < 0) goto end; */ msm_ispif_intf_cmd(ispif, ISPIF_INTF_CMD_ENABLE_FRAME_BOUNDARY, params); pr_err("%s overflow_dbg intftype %x, vfe_intf %d\n", __func__, intftype, vfe_intf); } for (i = 0; i < params->num; i++) { intftype = params->entries[i].intftype; vfe_intf = params->entries[i].vfe_intf; cid_mask = msm_ispif_get_cids_mask_from_cfg( ¶ms->entries[i]); msm_ispif_enable_intf_cids(ispif, intftype, cid_mask, vfe_intf, 1); } // msm_camera_io_dump_3(ispif->base, 0x270); end: return rc; disable_clk: pr_err("%s: <DBG01> ISPIF disable clk error case", __func__); rc = msm_cam_clk_enable(&ispif->pdev->dev, ispif_8974_reset_clk_info, reset_clk, ARRAY_SIZE(ispif_8974_reset_clk_info), 0); if (rc < 0) { pr_err("%s: cannot enable clock, error = %d", __func__, rc); } return -ETIMEDOUT; }